Files
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

275 lines
8.7 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.

/********************************
*
* 作者:徐高庆
* 创建时间: 2024年5月27日15:05:28
*
********************************/
using GameData;
using MrWu.Debug;
using PdkFriendServer.Logic;
using Server;
using Server.Pack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MessagePack;
using GameMessage.PaoDeKuaiF;
using Server.Core;
using Server.Data;
using MessageHelper = Server.MessageHelper;
namespace PdkFriendServer.GlobalManager
{
public class PdkGameDo : GameDo
{
/// <summary>
/// 跑得快朋友房主要逻辑
/// </summary>
PdkGameMain Main;
/// <summary>
/// 计时器
/// </summary>
int timeNum;
public Desk desk = null;
public PdkGameDo(Desk desk) : base(desk)
{
Main = new PdkGameMain(this);
this.desk = desk;
}
public override void DoZyxPack(GamePack data)
{
PdkLogicInfo logicInfo;
if (data.IsBinary)
{
logicInfo = MessagePackHelper.Deserialize<PdkLogicInfo>(data.Data);
}
else
{
if (data.JsonData.Length < 10)
{ //托管包
byte[] tgData = JsonPack.GetData<byte[]>(data.JsonData);
Debug.Info("收到托管包" + data.JsonData.Length);
if (tgData[1] == 0)
{
Main.GamePack.Info.PlayTuoGauan[tgData[0]] = tgData[1];
desk[tgData[0]].SetDeposit( tgData[1] == 1 ? true : false);
}
return;
}
logicInfo = JsonPack.GetData<PdkLogicInfo>(data.JsonData);
}
var b = Main.CheckPack(logicInfo);
if (!b)
{
Debug.Warning("客户端包内容检查不过。收包错误");
return;
}
//正式连客户端以后要屏蔽这些代码。return
switch (Main.GamePack.Info.GameZT) //只要客户端输入的值
{
case 3://包庄
Main.GamePack.Info.BaoZhuang[logicInfo.WhoPlay - 1] = logicInfo.BaoZhuang[logicInfo.WhoPlay - 1];
break;
case 4: //打牌
Main.GamePack.Info.ActivePlayCard = logicInfo.ActivePlayCard;
Main.TimeNum = 0; //重置time计时器
break;
}
Debug.Info("收到子游戏包GameDo!");
this.Main.GameDo();
}
public override void StartWar()
{
timeNum = 0;
base.StartWar();
Main.GameStart();
}
public void SendGamePack()
{
var str = JsonPack.GetJson(Main.GamePack);
int len = desk.Count;
PlayerDataAsyc tmppl;
byte[] data = MessageHelper.MessagePackSerialize(this.Main.GamePack);
for (int i = 0; i < Main.GamePack.Info.PlayNum; i++)
{
tmppl = desk[i];
if (tmppl==null||tmppl.isRobot)continue;
if (tmppl.ClientVer > 46)
{
ClearOtherCard(tmppl.seat, data,false);
}
else
{
byte[] datastr= Encoding.UTF8.GetBytes(str);
ClearOtherCard(tmppl.seat, datastr,true);
}
}
SaveGameData(data);
SaveHuiFang(0, str);
}
/// <summary>
/// 发包前清空不是自己手里的牌
/// </summary>
/// <param name="pos"></param>
/// <param name="packData"></param>
void ClearOtherCard(int pos, byte[] packData,bool isOld)
{
try
{
if (Main.GamePack.Info.OverPos > 0)
{//如果是游戏结束的话就不清空玩家牌了,因为最后要亮玩家手牌
SendPack(pos, packData);
return;
}
var pack = isOld ? JsonPack.GetData<PdkGamePack>(Encoding.UTF8.GetString(packData))
: MessagePackHelper.Deserialize<PdkGamePack>(packData);
for (int i = 0; i < Main.GamePack.Info.PlayNum; i++)
{
if (i == pos) continue;
for (int j = 0; j < pack.CardPack.Cards[i].CardInfos.Length; j++)
{
if (pack.CardPack.Cards[i].CardInfos[j].GameState == 0) continue; //打下去的牌不清空
pack.CardPack.Cards[i].CardInfos[j] = new TCardInfoPdkF();
}
}
//var str = JsonPack.GetJson(pack);
SendPack(pos, packData);
}
catch (Exception e)
{
Debug.Error($"发包前清空不是自己手里的牌,msg:{e.Message} code:{e.StackTrace}");
SendPack(pos, packData);
}
}
public void SaveGameData(byte[] data)
{
SaveData(data);
}
public override void LoadMem(byte[] data,bool isOld)
{
Main.SetFriendGz();
if (isOld)
{
Main.GamePack = JsonPack.GetData<PdkGamePack>(Encoding.UTF8.GetString(data));
}
else
{
Main.GamePack = MessageHelper.MessagePackDeserialize<PdkGamePack>(data);
}
Main.LoadInit();
}
public override void LoadMemSuccess()
{
Main.SetOperation();
}
public void GameOver()
{
for (int i = 0; i < Main.GamePack.Info.PlayNum; i++)
{
var num = Main.GamePack.Info.Score[i];
SetPlayer(i, 8, num, string.Empty);
}
SendGamePack();
WarOver();
}
public override void Reconnect(int seat)
{
if (seat < 0)
{
int len = desk.Count;
PlayerDataAsyc tmppl;
byte[] data = MessagePackHelper.Serialize(this.Main.GamePack);
for (int i = 0; i < len; i++)
{
tmppl= desk[i];
if(tmppl==null||tmppl.isRobot)continue;
if (desk[seat].ClientVer > 46)
{
// 新客户端 MessagePack
ClearOtherCard(seat, data,false);
}
else
{
// 老的客户端 Encding
byte[] datastr= Encoding.UTF8.GetBytes(JsonPack.GetJson(this.Main.GamePack));
ClearOtherCard(seat, datastr,true);
}
}
}else if(seat < desk.PlayerCnt)
{
if (desk[seat] == null)
{
Debug.Error("逻辑错误!------{0},PlayerCnt:{1}", seat, desk.PlayerCnt);
return;
}
byte[] data = MessagePackHelper.Serialize(this.Main.GamePack);
if (!desk[seat].isRobot)
{
if (desk[seat].ClientVer > 46)
{
// 新客户端 MessagePack
ClearOtherCard(seat, data,false);
}
else
{
// 老的客户端 Encding
byte[] datastr= Encoding.UTF8.GetBytes(JsonPack.GetJson(this.Main.GamePack));
ClearOtherCard(seat, datastr,true);
}
}
}
else
{
Debug.Warning("发包位置大于桌子人数!" + seat + "," + desk.PlayerCnt);
}
}
public override void OnTime(int interval)
{
//200毫秒一次一秒执行5次
timeNum++;
if (timeNum >= 5)
{
timeNum = 0;
this.Main.DoTime();
}
}
public override void WarOver()
{
desk.WarOver();
isFighting = false;
}
public Desk GetDesk()
{
return this.desk;
}
}
}