/********************************
*
* 作者:徐高庆
* 创建时间: 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
{
///
/// 跑得快朋友房主要逻辑
///
PdkGameMain Main;
///
/// 计时器
///
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(data.Data);
}
else
{
if (data.JsonData.Length < 10)
{ //托管包
byte[] tgData = JsonPack.GetData(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(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);
}
///
/// 发包前清空不是自己手里的牌
///
///
///
void ClearOtherCard(int pos, byte[] packData,bool isOld)
{
try
{
if (Main.GamePack.Info.OverPos > 0)
{//如果是游戏结束的话就不清空玩家牌了,因为最后要亮玩家手牌
SendPack(pos, packData);
return;
}
var pack = isOld ? JsonPack.GetData(Encoding.UTF8.GetString(packData))
: MessagePackHelper.Deserialize(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(Encoding.UTF8.GetString(data));
}
else
{
Main.GamePack = MessageHelper.MessagePackDeserialize(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;
}
}
}