Files
hjha-server/NetWorkMessage/GameData/Common/DeskInfo.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

709 lines
20 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using Newtonsoft.Json;
namespace GameData
{
// 如果房间半个小时未开战,如果房间开战12小时未打完,自动解散
/// <summary>
/// 房间数据
/// </summary>
public class DeskInfo
{
/// <summary>
/// 唯一码 其他模块应持有这个
/// </summary>
public string weiyima;
/// <summary>
/// 房间号 不是唯一的,同一时间运算的是唯一的 6为数房间码
/// </summary>
public string roomNum;
/// <summary>
/// 房间规则
/// </summary>
public DeskRule rule;
/// <summary>
/// 当前数量的场数 1开始
/// </summary>
public int nowCnt;
/// <summary>
/// 结束的数量
/// </summary>
public int overCnt;
/// <summary>
/// 游戏服务器的版本
/// </summary>
public int serverVer;
/// <summary>
/// 创建房间的类型 0普通开 1代开房间 5竞技比赛创建房间
/// </summary>
public int creatStyle;
/// <summary>
/// 创建房间的id 如果是普通创建的房间 则此id为玩家的userid 竞技比赛创建则为竞技比赛id
/// </summary>
public int creatUserid;
/// <summary>
/// 玩法的id
/// </summary>
public string wayid;
/// <summary>
/// 创建房间的房卡数量
/// </summary>
public int fangka;
/// <summary>
/// 玩家数据
/// </summary>
public PlayerData[] pls;
/// <summary>
/// 当前的玩家数量
/// </summary>
public int nowPlayerCnt
{
get
{
if (pls == null)
return 0;
int cnt = 0;
int len = pls.Length;
for (int i = 0; i < len; i++)
{
if (pls[i] != null)
cnt++;
}
return cnt;
}
}
/// <summary>
/// 请求解散的次数 可以补存数据库,因为不是很重要
/// </summary>
public int RequestDissolveCnt;
/// <summary>
/// 玩家座位 当前的座位编号 --里面存储的座位
/// </summary>
public int[] seat;
/// <summary>
/// 是否请求解散中
/// </summary>
public bool isDising = false;
/// <summary>
/// 解散超时时间
/// </summary>
public const int DisTimeOut = 60;
/// <summary>
/// 解散倒计时
/// </summary>
public int DisCount;
/// <summary>
/// 0表示没投票 1表示同意 -1表示拒绝->与pls 顺序一致
/// </summary>
public int[] plsDis;
/// <summary>
/// 立即开战
/// </summary>
public int[] OnceFight;
/// <summary>
/// 用来存储额外的内容
/// </summary>
public int[] Ex;
/// <summary>
/// 每局明细
/// </summary>
public List<Bureau> burs = new List<Bureau>();
/// <summary>
/// 一局打完总的结算,如果有封顶的话,里面计算好了封顶之后的分值
/// </summary>
public List<SummaryBureau> SumBurs = new List<SummaryBureau>();
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime;
/// <summary>
/// 是否关闭
/// </summary>
public int isClose;
/// <summary>
/// 关闭时间
/// </summary>
public DateTime closeTime;
/// <summary>
/// 解散的ID
/// </summary>
public int DisUserId = 0;
/// <summary>
/// 子游戏服务器使用,服务器数据! --此处可优化,发给客户端的数据中,可以不带此数据
/// </summary>
[JsonIgnore] public string otherdata;
/// <summary>
/// 是否未开战过
/// </summary>
public bool noWar
{
get { return overCnt == 0 && nowCnt == 0; }
}
/// <summary>
/// 是不是所有的场次都结束了
/// </summary>
public bool isAllOver
{
get
{
if (rule == null)
{
return true;
}
return rule.warCnt <= overCnt;
}
}
/// <summary>
///
/// </summary>
public DeskInfo()
{
}
/// <summary>
///
/// </summary>
/// <param name="maxCnt"></param>
public DeskInfo(int maxCnt)
{
this.rule = new DeskRule(maxCnt);
}
/// <summary>
/// 房间信息初始化创建时调用
/// </summary>s
public void Init(int ver)
{
nowCnt = 0;
overCnt = 0;
serverVer = ver;
pls = new PlayerData[rule.maxCnt];
seat = new int[rule.maxCnt];
plsDis = new int[rule.maxCnt];
OnceFight = new int[rule.maxCnt];
for (int i = 0; i < rule.maxCnt; i++)
{
seat[i] = -1;
}
CreateTime = DateTime.Now;
isClose = 0;
//年月日时分秒毫秒房间号
int rmNum = int.Parse(roomNum);
string str = "000000" + rmNum;
int len = str.Length;
str = str.Substring(len - 6);
weiyima = CreateTime.ToString("yyyyMMddHHmmssffff") + str;
}
/// <summary>
/// 开战-未战斗完毕的时间
/// </summary>
public DateTime wartimeOutDis;
/// <summary>
/// 为开战超时时间
/// </summary>
public DateTime jointimeOutDis;
#if UNITY_5_3_OR_NEWER
[JsonIgnore]
public string roomNumStr
{
get { return GetFullRoomNum(roomNum); }
}
public static string GetFullRoomNum(string roomNum)
{
if (roomNum == null)
{
roomNum = string.Empty;
}
string str = "000000" + roomNum;
return str.Substring(str.Length - 6);
}
#endif
/// <summary>
/// 检查是否需要自动解散
/// </summary>
/// <returns></returns>
public int CheckDisBank()
{
DateTime time = DateTime.Now;
if (time > wartimeOutDis)
{
//最多保留24小时
return 1; //超时未打完
}
if (noWar && time > jointimeOutDis)
{
//未开战超时
return 2; //超时未满员
}
return 0;
}
/// <summary>
/// 添加玩家
/// </summary>
/// <param name="pl"></param>
public int AddPlayer(playerData pl)
{
bool isManager = creatUserid == pl.userid && (creatStyle == 0 || creatStyle == 1);
PlayerData rpl = new PlayerData(pl, isManager);
int len = pls.Length;
for (int i = 0; i < len; i++)
{
if (pls[pl.seat] == null)
{
pls[pl.seat] = rpl;
seat[pl.seat] = pl.seat;
OnceFight[pl.seat] = 0;
return pl.seat;
}
}
for (int i = 0; i < len; i++)
{
OnceFight[i] = 0;
}
return -1;
}
/// <summary>
/// 移除玩家
/// </summary>
/// <param name="userid">userid</param>
/// <param name="pl">用户</param>
public int RemovePlayer(int userid, ref PlayerData pl)
{
int len = pls.Length;
int result = -1;
//这个len 不能改
for (int i = 0; i < len; i++)
{
if (pls[i] != null && pls[i].userid == userid)
{
//Debug.Log("移除玩家 fangzhu:" + pls[i].fangzhu);
if (pls[i].fangzhu == 0)
{
pls[i] = null;
seat[i] = -1;
pl = pls[i];
result = i;
break;
}
}
}
if (result > -1)
{
for (int i = 0; i < OnceFight.Length; i++)
{
OnceFight[i] = 0;
}
}
return result;
}
public long GetTotalScore(int seat)
{
long totalScore = 0;
foreach (var bur in burs)
{
if (bur.seat == null || bur.playScore == null) return totalScore;
for (int i = 0; i < bur.seat.Length; i++)
{
if (seat == bur.seat[i])
{
totalScore += bur.playScore[i];
}
}
}
return totalScore;
}
/// <summary>
/// 获取朋友房打完玩家最终成绩,如果有封顶,则该结果已经计算完了封顶逻辑
/// </summary>
/// <param name="seat"></param>
/// <returns></returns>
public decimal GetOverScore(int seat)
{
//Log.Debug("朋友房:" + SumBurs.Count);
if (SumBurs == null || SumBurs.Count <= 0) return 0;
var ps = SumBurs.Find(x => x.seat == seat);
if (ps == null) return 0;
return ps.Score;
}
/// <summary>
/// 创建局明细
/// </summary>
/// <returns></returns>
public Bureau CreateBureau(int idx)
{
return new Bureau(idx, new long[rule.maxCnt], seat);
}
/// <summary>
/// 压缩人数
/// </summary>
public bool CompressionPlayer()
{
int nowplcnt = nowPlayerCnt;
if (nowplcnt < 1 || nowplcnt >= rule.maxCnt)
return false;
rule.minCnt = nowplcnt;
rule.maxCnt = nowplcnt;
var oldpls = pls;
pls = new PlayerData[nowplcnt];
plsDis = new int[nowplcnt];
seat = new int[nowplcnt];
OnceFight = new int[nowplcnt];
//这里座位重新编排 数据库没有重新编排
for (int i = 0; i < nowplcnt; i++)
{
for (int j = 0; j < oldpls.Length; j++)
{
if (oldpls[j] != null)
{
pls[i] = oldpls[j];
seat[i] = i;
oldpls[j] = null;
break;
}
}
}
return true;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public override string ToString()
{
string str = "";
str += "唯一吗:" + weiyima + Environment.NewLine;
str += "房间号:" + roomNum + Environment.NewLine;
str += "服务器版本:" + serverVer + Environment.NewLine;
str += "创建类型:" + creatStyle + Environment.NewLine;
str += "创建者id:" + creatUserid + Environment.NewLine;
str += "房卡:" + fangka + Environment.NewLine;
str += "创建时间:" + CreateTime + Environment.NewLine;
str += "房间规则:" + Environment.NewLine;
str += rule.ToString() + Environment.NewLine;
int len = 0;
if (seat != null)
{
str += "玩家座位:";
len = seat.Length;
for (int i = 0; i < len; i++)
{
str += string.Format("{0}:{1} ", i, seat[i]);
}
}
str += Environment.NewLine;
len = pls.Length;
for (int i = 0; i < len; i++)
{
str += "玩家:" + i + Environment.NewLine;
if (pls[i] == null)
{
str += "该位置没有人!" + Environment.NewLine;
continue;
}
str += Environment.NewLine;
if (pls == null) continue;
str += pls[i].ToString();
}
if (burs != null && burs.Count > 0)
{
len = burs.Count;
for (int i = 0; i < len; i++)
{
str += Environment.NewLine;
str += "局数详情" + i + ":" + Environment.NewLine;
str += burs[i].ToString();
}
}
return str;
}
/// <summary>
/// 查找玩家所在的位置
/// </summary>
/// <param name="userid"></param>
/// <returns></returns>
public int FindPlayer(int userid)
{
int seat = -1;
int len = pls.Length;
for (int i = 0; i < len; i++)
{
if (pls[i] != null && pls[i].userid == userid)
{
seat = this.seat[i];
break;
}
}
return seat;
}
/// <summary>
/// 朋友房中的玩家
/// </summary>
public class PlayerData
{
/// <summary>
/// 玩家的userid
/// </summary>
public int userid;
/// <summary>
/// 玩家的昵称
/// </summary>
public string nickName;
/// <summary>
/// 玩家的性别
/// </summary>
public int sex;
/// <summary>
/// 玩家的头像
/// </summary>
public string photo;
/// <summary>
/// 玩家是否是房主
/// </summary>
public int fangzhu;
/// <summary>
/// ip
/// </summary>
public string ip;
/// <summary>
/// 玩家在哪个俱乐部,联赛用
/// </summary>
public int ClubId;
/// <summary>
///
/// </summary>
public PlayerData()
{
}
/// <summary>
///
/// </summary>
/// <param name="pl"></param>
/// <param name="isManager"></param>
public PlayerData(GameData.playerData pl, bool isManager)
{
userid = pl.userid;
nickName = pl.nickname;
sex = pl.sex;
fangzhu = isManager ? 1 : 0;
ip = pl.ip;
ClubId = pl.ClubId;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public override string ToString()
{
string str = "";
str += "玩家userid:" + userid + Environment.NewLine;
str += "昵称:" + nickName + Environment.NewLine;
str += "玩家性别:" + sex + Environment.NewLine;
str += "是否是房主:" + fangzhu + Environment.NewLine;
str += "玩家ip:" + ip + Environment.NewLine;
return str;
}
}
/// <summary>
/// 朋友房的总结算
/// </summary>
public class SummaryBureau
{
public int seat;
public decimal Score;
}
/// <summary>
/// 局明细
/// </summary>
public class Bureau
{
/// <summary>
/// 当前局
/// </summary>
public int id;
/// <summary>
/// 玩家分数
/// </summary>
public long[] playScore;
/// <summary>
/// 玩家的座位
/// </summary>
public int[] seat;
/// <summary>
///
/// </summary>
/// <param name="id">当前局的id 索引</param>
/// <param name="playScore">这一局玩家的分数</param>
/// <param name="seat">玩家的座位</param>
public Bureau(int id, long[] playScore, int[] seat)
{
this.id = id;
this.playScore = playScore;
this.seat = seat;
}
/// <summary>
///
/// </summary>
public Bureau()
{
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public override string ToString()
{
string str = "";
str += "id:" + id + Environment.NewLine;
str += "score:";
int len = playScore.Length;
for (int i = 0; i < len; i++)
{
str += playScore[i] + ",";
}
str += Environment.NewLine;
str += "seat:";
for (int i = 0; i < len; i++)
{
str += seat[i] + ",";
}
return str;
}
}
/// <summary>
/// 根据解散类型获取解散备注
/// </summary>
/// <param name="style">解散类型</param>
/// <returns></returns>
public static string GetDisBankMemo(int style)
{
if(style >= 100000)
{
return "玩家解散";
}
switch (style)
{
case 0: //正常打完
return "正常打完结束";
case 1: //正常打完
return "全部打完结束";
//下面都是异常
case 2:
return "玩家解散";
case 3:
return "超时解散";
case 4:
return "超时解散";
case 5:
return "房主解散";
case 6:
return "玩法删除解散";
case 7:
return "管理员解散";
case 8:
return "积分不够解散";
case 9:
return "托管解散";
default:
return string.Empty;
}
}
}
}