Files
hjha-server/GameModule/FriendRoom/CreateRoom.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

481 lines
22 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using Server.Pack;
using MrWu.Debug;
using GameData;
using System.Collections;
using System.Threading.Tasks;
using GameDAL.FriendRoom;
using Game.Player;
using GameMessage;
using Server.Config;
using Server.Core;
using Server.Data;
using Server.MQ;
namespace Server
{
/// <summary>
/// 朋友房管理
/// </summary>
public partial class FriendRoomManager
{
/// <summary>
/// 创建朋友房
/// </summary>
public class CreateRoom
{
/// <summary>
/// 包头
/// </summary>
public readonly PackHead head;
public readonly bool isClub;
/// <summary>
/// 创建id
/// </summary>
public readonly int createid;
/// <summary>
/// 创建房间包
/// </summary>
public readonly CreateRoomPack crp;
/// <summary>
/// 是否检测正在处理
/// </summary>
public readonly bool isCheckDoing;
/// <summary>
/// 游戏配置
/// </summary>
public Server.Config.GameConfig config
{
get { return GameManager.instance.config; }
}
/// <summary>
///
/// </summary>
/// <param name="head"></param>
/// <param name="createid"></param>
/// <param name="crp"></param>
/// <param name="isCheckDoing"></param>
public CreateRoom(PackHead head, int createid, CreateRoomPack crp, bool isClub,bool isCheckDoing)
{
this.head = head;
this.createid = createid;
this.crp = crp;
this.isClub = isClub;
this.isCheckDoing = isCheckDoing;
}
///
public async Task Start()
{
/*
* 创建房间要满足的条件
* 1.没在游戏中,
* (被锁信息,房间号信息,)
* 2.房间号足够,房卡足够。
* 3.规则正确
* 4.本游戏开启了朋友房的设置
* 5.服务器支持到的客户端版本。
* */
int userid = head.userid;
if (isCheckDoing && DoingUserIds.Contains(userid))
{
Debug.Error($"正在处理别的事务:{head.userid}");
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.ClubJoinDeskDoing);
return;
}
try
{
if (isCheckDoing)
{
DoingUserIds.Add(userid);
}
//房间数据
var data = crp.deskinfo;
//得到房间号
int roomnum = int.Parse(data.roomNum);
if (roomnum <= 0 || roomnum > Room.MaxCnt)
{
Debug.Error("房间号越界,不应该出现的情况!!!");
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.ClubJoinDeskUnknow);
return;
}
Debug.Log("创建房间:" + crp.deskinfo.rule.interceptpos);
//赋值强制解散时间
data.wartimeOutDis = DateTime.Now.AddHours(config.FriendDeskWarTimeOut);
data.jointimeOutDis = DateTime.Now.AddMinutes(config.FriendStarWarTimeOut);
if (!instance.ting.CheckFriendGz(data.rule.roomrule))
{
//检查规则是否可以创建
Debug.Error("创建朋友房规则错误!");
if (!isClub)
GeneralSendPack.SendErrorInfo_Socket(createid, 2, 20, head.GetUtil());
else
SendManager.SendErrotInfo_Http(head, 2, 20);
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.ClubJoinDeskWayRuleError);
return;
}
Debug.Info("创建房间:" + roomnum);
//如果是玩家开房间
//1.普通开房间 需先登录
// Debug.Info("普通开房间!");
/* 这个ip 不准,先不处理
if (string.IsNullOrEmpty(head.ip))
{
Debug.Error("玩家创建房间时玩家的ip 是空!!!");
}
*/
//玩家登录,
bool isCreate = crp.isAuto == 1;
Debug.Info($"isCreate:{isCreate}");
if (!isCreate)
{
PlayerDataAsyc pl = PlayerCollection.Instance.FindPlayerByUserId(head.userid);
if (pl == null)
{
Debug.Info("Create Pl null!");
LoginInfo loginInfo = LoginInfo.Create(head.userid, true, head.GetUtil(), head.ip,
crp.deviceInfo, head.clientVer, head);
await LoginManager.Instance.Start(loginInfo);
isCreate = loginInfo.Result;
loginInfo.Dispose();
}
else
{
Debug.Info("Create Pl is not null!");
//把锁纠正
if (pl.state != (int)PlayerState.INGame)
{
Debug.Error("状态不是在游戏中,不能创建朋友房!");
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.ClubJoinDeskUnknow);
return;
}
PlayerLockInfo lockInfo = PlayerFun.GetPlayerLockInfo(pl.userid);
if (!GameBase.instance.myUtil.Equals(lockInfo.util)) //不是锁在本模块
{
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.ClubJoinDeskInOtherGame);
return;
}
//不是锁在朋友房,要改成朋友房
if (!lockInfo.isFriend)
{
lockInfo.isFriend = true;
if (!PlayerFun.EditorLockPlayer(pl.userid,lockInfo))
{
Debug.Error("修改锁失败!");
//没有修改成功,那么这个用户可能已经下线了,不处理
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.ClubJoinDeskUnknow);
return;
}
Debug.Error("修改锁成功,继续创建朋友房!");
}
isCreate = true;
}
//Debug.Log($"是否登录成功:{isCreate}");
}
//Debug.Log($"-isCreate:{isCreate}");
if (isCreate)
{
Debug.Info("开始创建!");
PlayerDataAsyc pl = PlayerCollection.Instance.FindPlayerByUserId(head.userid);
if (pl == null)
{
Debug.Error("登陆成功却未获得玩家数据!" + head.userid);
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.ClubJoinDeskUnknow);
return;
}
if (pl.friendRoomNum > 0)
{
Debug.Error($"已经在朋友房,怎么还来创建桌子!{head.userid},{pl.friendRoomNum}");
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.ClubJoinDeskUnknow);
return;
}
pl.ClubId = this.crp.ClubId;
pl.ClubScore = this.crp.Score;
#if DEBUG
pl.IsTest = this.crp.IsTestPack;
#endif
if (data.rule.RuleEx == null)
{
data.rule.RuleEx = new DeskRuleEx();
}
//登陆成功
data.fangka =
data.rule.RuleEx
.CreateRoomCardNum; // data.rule.warCnt / GameManager.instance.config.cardPan;
bool r = true;
int checkResult = instance.ting.CheckDeskInfo(pl, data);
//Debug.Log("555555");
Debug.Info($"检查结果:{checkResult}");
if (checkResult == 1)
{
//可以创建
data.Init(ServerConfigManager.Instance.MaxVer);
Debug.Info("毫秒值:" + data.CreateTime.Millisecond);
Debug.Log("可以创建!");
if (data.creatStyle != 5)
data.creatUserid = pl.userid;
if (Room.CreateRoom(data, GameBase.instance.myUtil))
{
//先处理redis数据
Debug.Info("redis数据处理成功!");
//纠正被锁信息
if (data.creatStyle == 5)
{
if (string.IsNullOrEmpty(data.weiyima))
Debug.Error("创建的玩法唯一码竟然是空!!!");
//保存桌子信息
WayManager.instance.SaveWayDesk(data.creatUserid, data.wayid, data.weiyima);
Debug.Log("--------新增桌子!");
WayManager.instance.WayDeskChangeSend(data.creatUserid, data.wayid, data.weiyima,
0);
//WayRoom.instance.Add(data.creatUserid, data.wayid, data.weiyima.ToString());
}
Debug.Info($"创建房间之前的房卡数据:{pl.fangka} cccddd:{pl.ClubId}");
string errinfo = string.Empty;
int errorCode = 0; //错误码
if (instance.CreateDesk(pl, data, ref errinfo,ref errorCode) == 1)
{
//处理内存
r = true; //扣除房卡
if (isClub)
{
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.Success);
if (crp.TaskId <= 0)
{
head.transfer = ServerPackAgreement.ReConnection;
head.packlx = ServerPackAgreement.TransFerHttp;
head.otherInt = new int[] { ServerConfigManager.Instance.ClientId };
GlobalMQ.instance.DeliveryOne(head.GetUtil(),
GlobalMQ.CreateMessage(head, null), true);
}
}
}
else
{
//创建出错!
Debug.Error("创建房间出现问题....房卡数据....");
//清空被占用的数据
Room.DeleteRoom(data);
//没成功就要把桌子信息删除
Debug.Error("桌子删除!!!");
if (isClub)
{
WayManager.instance.DelDeskInfo(data.creatUserid, data.wayid, data.weiyima);
WayManager.instance.WayDeskChangeSend(data.creatUserid, data.wayid,
data.weiyima, 1);
}
if (crp.isAuto != 1)
{
if (crp.TaskId <= 0)
{
if (string.IsNullOrEmpty(errinfo))
{
if (!isClub)
GeneralSendPack.SendErrorInfo_Socket(pl.userid, 2, 24, pl.socketUtil);
else
SendManager.SendErrotInfo_Http(head, 2, 24);
}
else
{
if (!isClub)
GeneralSendPack.SendErrorInfo_Socket(pl.userid, 2, errinfo, pl.socketUtil);
else
SendManager.SendErrotInfo_Http(head, 2, errinfo);
}
}
else
{
GeneralSendPack.SendJoinDeskResult(crp.TaskId,errorCode);
}
}
r = false;
//玩家 进入失败,清空房间数据
//房卡返还
}
}
else
{
if (crp.isAuto != 1)
{
if (crp.TaskId <= 0)
{
if (!isClub)
GeneralSendPack.SendErrorInfo_Socket(pl.userid, 2, 24, pl.socketUtil);
else
SendManager.SendErrotInfo_Http(head, 2, 24);
}
else
{
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.ClubJoinDeskUnknow);
}
}
r = false;
}
}
else
{
SendTip(pl.userid, pl.socketUtil, crp.isAuto != 1, checkResult);
r = false;
}
if (!r)
{
// 创建失败 退出游戏
GameManager.instance.QuitGame(pl, "CreateFail", false);
}
}
}
finally
{
if(isCheckDoing)
{
DoingUserIds.Remove(userid);
}
}
}
/// <summary>
/// 发送提示
/// </summary>
private void SendTip(int userid, ServerNode socket, bool isError, int type)
{
//if (isError) {
// SendManager.SendErrorInfo_Socket(userid, 2, 60, socket);
//} else {
//-4,-5逻辑问题 - 6房卡不足创建失败 - 7未检测到ip - 8必须微信登录或绑定 - 9 必须微信绑定 - 10没有定位信息 - 11没有设备信息
switch (type)
{
case -4:
case -5:
if (crp.TaskId <= 0)
{
if (!isClub)
//创建失败,请稍后再试!
GeneralSendPack.SendErrorInfo_Socket(userid, 2, 24, socket);
else
SendManager.SendErrotInfo_Http(head, 2, 24);
}
else
{
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.ClubJoinDeskUnknow);
}
break;
case -6:
if (crp.TaskId <= 0)
{
if (!isClub)
//房卡不足
GeneralSendPack.SendErrorInfo_Socket(userid, 2, 21, socket);
else
SendManager.SendErrotInfo_Http(head, 2, 24);
}
else
{
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.ClubJoinDeskCardNotEnough);
}
break;
case -7:
if (crp.TaskId <= 0)
{
if (!isClub)
//未检测到ip
GeneralSendPack.SendErrorInfo_Socket(userid, 2, 56, socket);
else
SendManager.SendErrotInfo_Http(head, 2, 56);
}
else
{
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.ClubJoinDeskIpEmpty);
}
break;
case -8:
case -9:
if (crp.TaskId <= 0)
{
if (!isClub)
//微信用户才可创建!
GeneralSendPack.SendErrorInfo_Socket(userid, 2, 57, socket);
else
SendManager.SendErrotInfo_Http(head, 2, 57);
}
else
{
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.ClubJoinDeskNotWeChatAccount);
}
break;
case -10: //没有定位信息
if (crp.TaskId <= 0)
{
if (!isClub)
GeneralSendPack.SendErrorInfo_Socket(userid, 2, 58, socket);
else
SendManager.SendErrotInfo_Http(head, 2, 58);
}
else
{
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.ClubJoinDeskNotPosition);
}
break;
case -11: //没有设备信息
if (crp.TaskId<= 0)
{
if (!isClub)
GeneralSendPack.SendErrorInfo_Socket(userid, 2, 59, socket);
else
SendManager.SendErrotInfo_Http(head, 2, 59);
}
else
{
GeneralSendPack.SendJoinDeskResult(crp.TaskId,MessageErrCode.ClubJoinDeskImeiEmpty);
}
break;
default:
Debug.ImportantLog($"创建房间失败,未解析的错误码:{type}");
break;
}
//}
}
}
}
}