import { ApiCall } from "tsrpc"; import { ReqMove, ResMove } from "../shared/protocols/PtlMove"; import { playerManager } from "../managers/PlayerManager"; import { broadcastToAll } from "../utils/broadcast"; import { MsgPlayerMove } from "../shared/protocols/MsgPlayerMove"; /** * 移动API * 处理玩家移动请求,验证位置合法性,更新玩家位置并广播给其他玩家 */ export default async function (call: ApiCall) { const { x, y } = call.req; // 从连接中获取玩家ID(需要在登录时保存) const playerId = (call.conn as any).playerId; if (!playerId) { call.error('未登录,请先登录'); return; } // 获取玩家信息 const player = playerManager.getPlayer(playerId); if (!player) { call.error('玩家不存在'); return; } // 检查玩家是否存活 if (!player.isAlive) { call.error('玩家已死亡,无法移动'); return; } // 验证坐标是否为数字 if (typeof x !== 'number' || typeof y !== 'number') { call.error('坐标格式错误'); return; } // 验证坐标是否为整数 if (!Number.isInteger(x) || !Number.isInteger(y)) { call.error('坐标必须为整数'); return; } try { // 尝试更新玩家位置 const success = playerManager.updatePlayerPosition(playerId, x, y); if (!success) { call.succ({ success: false, message: '移动失败,位置无效或超出世界边界' }); return; } // 获取更新后的位置 const newPosition = { x, y }; // 广播移动消息给所有其他玩家 const moveMsg: MsgPlayerMove = { playerId: player.id, playerName: player.name, position: newPosition, timestamp: Date.now() }; broadcastToAll('MsgPlayerMove', moveMsg, call.conn.id); // 返回成功结果 call.succ({ success: true, message: '移动成功', position: newPosition }); console.log(`玩家 ${player.name} 移动到 (${x}, ${y})`); } catch (error) { console.error('移动失败:', error); call.error(`移动失败: ${error instanceof Error ? error.message : '未知错误'}`); } }