using Dof; using dotNetty_kcp; using DotNetty.Buffers; using UnityEngine; using System.IO; using base_kcp; using Guru; namespace DofLibrary { /// /// 游戏消息发送接口实现类 /// internal class MessageSender : IMessageSender { private long _cid; private Ukcp _client; private MemoryStream _localSendMs = new MemoryStream(1024 * 1024 * 1); /// /// 设置 kcp 客户端,用于发送消息 /// public Ukcp Client { set => _client = value; } /// /// 当收到服务端发来的 PlayerEntered 事件时,设置房间中的玩家编号 /// 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(); } } }