初始化仓库:友乐/gameabc 房卡游戏平台脚手架(client + server + docs)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,225 @@
|
||||
/**
|
||||
* 网络收发包工具类
|
||||
* 自动处理平台框架提供的基础数据字段,简化子游戏的网络通信
|
||||
*
|
||||
* 功能特性:
|
||||
* - 自动注入平台数据:agentid、gameid、playerid、roomcode
|
||||
* - 统一的RPC发送接口
|
||||
* - 支持调试模式输出
|
||||
* - 遵循数据包协议规范
|
||||
*
|
||||
* @author GameABC Framework
|
||||
* @version 1.0.0
|
||||
*/
|
||||
|
||||
var RpcHelper = {
|
||||
|
||||
/**
|
||||
* 发送RPC请求
|
||||
* 自动注入平台框架提供的基础验证字段
|
||||
*
|
||||
* @param {string} app - 应用名称,通常为 "youle"
|
||||
* @param {string} route - 路由名称,如 "room"
|
||||
* @param {string} rpc - RPC方法名,如 "play_card"
|
||||
* @param {Object} gameData - 子游戏业务数据
|
||||
* @param {Object} options - 可选配置参数
|
||||
* @param {boolean} options.debug - 是否输出调试信息,默认false
|
||||
* @param {Object} options.customData - 自定义的额外数据字段
|
||||
*/
|
||||
sendRpc: function(app, route, rpc, gameData, options) {
|
||||
// 参数验证
|
||||
if (!app || typeof app !== 'string') {
|
||||
console.error('RpcHelper.sendRpc: app参数必须是非空字符串');
|
||||
return;
|
||||
}
|
||||
if (!route || typeof route !== 'string') {
|
||||
console.error('RpcHelper.sendRpc: route参数必须是非空字符串');
|
||||
return;
|
||||
}
|
||||
if (!rpc || typeof rpc !== 'string') {
|
||||
console.error('RpcHelper.sendRpc: rpc参数必须是非空字符串');
|
||||
return;
|
||||
}
|
||||
|
||||
// 默认选项
|
||||
options = options || {};
|
||||
var debug = options.debug || false;
|
||||
var customData = options.customData || {};
|
||||
|
||||
// 构建完整的数据包
|
||||
var data = {};
|
||||
|
||||
// 1. 自动注入平台框架提供的基础验证字段
|
||||
try {
|
||||
data.agentid = GameData.AgentId; // 运营商ID(String类型)
|
||||
data.gameid = GameData.GameId; // 游戏类型标识(String类型)
|
||||
data.playerid = C_Player.playerid; // 玩家唯一标识(Number类型)
|
||||
data.roomcode = Utl.getRoomcode(); // 房间号(String类型)
|
||||
} catch (e) {
|
||||
console.error('RpcHelper.sendRpc: 获取平台基础数据失败', e);
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. 验证必需的平台数据
|
||||
if (!data.agentid) {
|
||||
console.error('RpcHelper.sendRpc: agentid未设置,请确保平台框架已初始化');
|
||||
return;
|
||||
}
|
||||
if (!data.gameid) {
|
||||
console.error('RpcHelper.sendRpc: gameid未设置,请确保平台框架已初始化');
|
||||
return;
|
||||
}
|
||||
if (!data.playerid) {
|
||||
console.error('RpcHelper.sendRpc: playerid未设置,请确保玩家已登录');
|
||||
return;
|
||||
}
|
||||
if (!data.roomcode) {
|
||||
console.error('RpcHelper.sendRpc: roomcode未设置,请确保已进入房间');
|
||||
return;
|
||||
}
|
||||
|
||||
// 3. 合并子游戏业务数据
|
||||
if (gameData && typeof gameData === 'object') {
|
||||
for (var key in gameData) {
|
||||
if (gameData.hasOwnProperty(key)) {
|
||||
data[key] = gameData[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 合并自定义数据
|
||||
for (var key in customData) {
|
||||
if (customData.hasOwnProperty(key)) {
|
||||
data[key] = customData[key];
|
||||
}
|
||||
}
|
||||
|
||||
// 5. 调试信息输出
|
||||
if (debug || Game_Config.Debugger.isDebugger) {
|
||||
console.log('RpcHelper发送RPC:', {
|
||||
app: app,
|
||||
route: route,
|
||||
rpc: rpc,
|
||||
platform_data: {
|
||||
agentid: data.agentid,
|
||||
gameid: data.gameid,
|
||||
playerid: data.playerid,
|
||||
roomcode: data.roomcode
|
||||
},
|
||||
game_data: gameData,
|
||||
custom_data: customData
|
||||
});
|
||||
}
|
||||
|
||||
// 6. 通过框架发送RPC请求
|
||||
Utl.sendData(app, route, rpc, data);
|
||||
},
|
||||
|
||||
/**
|
||||
* 发送游戏房间RPC
|
||||
* 专门用于游戏房间相关的RPC调用,预设app="youle", route="room"
|
||||
*
|
||||
* @param {string} rpc - RPC方法名
|
||||
* @param {Object} gameData - 子游戏业务数据
|
||||
* @param {Object} options - 可选配置参数
|
||||
*/
|
||||
sendGameRpc: function(rpc, gameData, options) {
|
||||
this.sendRpc("youle", "room", rpc, gameData, options);
|
||||
},
|
||||
|
||||
/**
|
||||
* 发送代理商RPC
|
||||
* 专门用于代理商相关的RPC调用,预设app="youle", route="agent"
|
||||
*
|
||||
* @param {string} rpc - RPC方法名
|
||||
* @param {Object} gameData - 子游戏业务数据
|
||||
* @param {Object} options - 可选配置参数
|
||||
*/
|
||||
sendAgentRpc: function(rpc, gameData, options) {
|
||||
this.sendRpc("youle", "agent", rpc, gameData, options);
|
||||
},
|
||||
|
||||
/**
|
||||
* 发送平台RPC
|
||||
* 专门用于平台相关的RPC调用,预设app="youle", route="platform"
|
||||
*
|
||||
* @param {string} rpc - RPC方法名
|
||||
* @param {Object} gameData - 子游戏业务数据
|
||||
* @param {Object} options - 可选配置参数
|
||||
*/
|
||||
sendPlatformRpc: function(rpc, gameData, options) {
|
||||
this.sendRpc("youle", "platform", rpc, gameData, options);
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取当前平台数据快照
|
||||
* 用于调试和信息查看
|
||||
*
|
||||
* @returns {Object} 包含当前平台数据的对象
|
||||
*/
|
||||
getPlatformData: function() {
|
||||
try {
|
||||
return {
|
||||
agentid: GameData.AgentId,
|
||||
gameid: GameData.GameId,
|
||||
playerid: C_Player.playerid,
|
||||
roomcode: Utl.getRoomcode(),
|
||||
timestamp: new Date().getTime()
|
||||
};
|
||||
} catch (e) {
|
||||
console.error('RpcHelper.getPlatformData: 获取平台数据失败', e);
|
||||
return null;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 验证平台数据完整性
|
||||
* 检查所有必需的平台数据是否已正确设置
|
||||
*
|
||||
* @returns {Object} 验证结果对象 {valid: boolean, missing: Array}
|
||||
*/
|
||||
validatePlatformData: function() {
|
||||
var result = {
|
||||
valid: true,
|
||||
missing: []
|
||||
};
|
||||
|
||||
try {
|
||||
if (!GameData.AgentId) {
|
||||
result.valid = false;
|
||||
result.missing.push('agentid');
|
||||
}
|
||||
if (!GameData.GameId) {
|
||||
result.valid = false;
|
||||
result.missing.push('gameid');
|
||||
}
|
||||
if (!C_Player.playerid) {
|
||||
result.valid = false;
|
||||
result.missing.push('playerid');
|
||||
}
|
||||
if (!Utl.getRoomcode()) {
|
||||
result.valid = false;
|
||||
result.missing.push('roomcode');
|
||||
}
|
||||
} catch (e) {
|
||||
result.valid = false;
|
||||
result.missing.push('platform_error');
|
||||
console.error('RpcHelper.validatePlatformData: 验证过程出错', e);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
// ES5兼容性:确保在旧版本浏览器中也能正常工作
|
||||
if (typeof Object.defineProperty === 'function') {
|
||||
// 防止意外修改工具类
|
||||
Object.defineProperty(window, 'RpcHelper', {
|
||||
value: RpcHelper,
|
||||
writable: false,
|
||||
configurable: false
|
||||
});
|
||||
} else {
|
||||
// 旧版本浏览器的兼容处理
|
||||
window.RpcHelper = RpcHelper;
|
||||
}
|
||||
Reference in New Issue
Block a user