upm_guru_dof_lib/Runtime/MessageSender.cs

152 lines
4.0 KiB
C#

using Dof;
using dotNetty_kcp;
using DotNetty.Buffers;
using UnityEngine;
using System.IO;
using base_kcp;
using Guru;
namespace DofLibrary
{
/// <summary>
/// 游戏消息发送接口实现类
/// </summary>
internal class MessageSender : IMessageSender
{
private long _cid;
private Ukcp _client;
private MemoryStream _localSendMs = new MemoryStream(1024 * 1024 * 1);
/// <summary>
/// 设置 kcp 客户端,用于发送消息
/// </summary>
public Ukcp Client
{
set => _client = value;
}
/// <summary>
/// 当收到服务端发来的 PlayerEntered 事件时,设置房间中的玩家编号
/// </summary>
public long Cid
{
set => _cid = value;
}
public void PlayerEnter(string roomId, string uid, string nickName, string country, string appId, string token)
{
var playerEnter = new ClientMessage
{
PlayerEnter = new PlayerEnter
{
RoomId = roomId,
Uid = uid,
NickName = nickName,
Country = country,
AppId = appId,
Token = token
}
};
Send(playerEnter);
Debug.Log("PlayerEnter message sent");
}
public void LevelPrepared(string levelId)
{
var message = new ClientMessage
{
LevelPrepared = new LevelPrepared
{
Cid = _cid,
Level = levelId
}
};
Send(message);
Debug.Log("LevelPrepared message sent");
}
public void PointFound(string levelId, int pointId, float combo)
{
var message = new ClientMessage
{
PointFound = new PointFound
{
Cid = _cid,
Level = levelId,
PointId = pointId,
Combo = combo
}
};
Send(message);
Debug.Log("PointFound message sent");
}
public void LevelEnd(string levelId)
{
var message = new ClientMessage
{
LevelEnd = new LevelEnd
{
Cid = _cid,
Level = levelId
}
};
Send(message);
Debug.Log("LevelEnd message sent");
}
public void AllLevelEnd(float timeSpent)
{
var message = new ClientMessage
{
AllLevelEnd = new AllLevelEnd
{
Cid = _cid,
TimeSpent = timeSpent
}
};
Send(message);
Debug.Log("AllLevelEnd message sent");
}
public void PlayerLeave()
{
var message = new ClientMessage
{
PlayerLeave = new PlayerLeave
{
Cid = _cid
}
};
Send(message);
Debug.Log("PlayerLeave message sent");
}
public void Heartbeat(long timestamp)
{
var message = new ClientMessage
{
Heartbeat = new Heartbeat
{
Timestamp = timestamp
}
};
Send(message);
Debug.Log("Heartbeat message sent");
}
private void Send(ClientMessage message)
{
_localSendMs.SetLength(0);
_localSendMs.Position = 0;
ProtobufHelper.ToStream(message, _localSendMs);
var dataBuf = Unpooled.DirectBuffer(1024 * 1024 * 1);
dataBuf.WriteBytes(_localSendMs.GetBuffer(), 0, (int)_localSendMs.Length);
_client.write(dataBuf);
dataBuf.Release();
}
}
}