From 49f8c94974217d4a77281ac754f832bc2e75ca82 Mon Sep 17 00:00:00 2001 From: k8w Date: Thu, 2 Dec 2021 00:38:28 +0800 Subject: [PATCH] cocos multiplayer --- .../backend/.gitignore | 3 +- .../backend/package.json | 4 +- .../backend/src/api/ApiJoinRoom.ts | 12 + .../backend/src/api/ApiSend.ts | 26 - .../backend/src/index.ts | 5 + .../backend/src/models/Room.ts | 102 ++ .../backend/src/shared/protocols/MsgChat.ts | 7 - .../src/shared/protocols/PtlJoinRoom.ts | 14 + .../backend/src/shared/protocols/PtlSend.ts | 10 - .../backend/src/shared/protocols/base.ts | 15 - .../shared/protocols/clientMsgs/MsgInput.ts | 3 + .../shared/protocols/serverMsgs/MsgFrame.ts | 8 + .../shared/protocols/serverMsgs/MsgJoin.ts | 5 + .../shared/protocols/serverMsgs/MsgLeave.ts | 3 + .../src/shared/protocols/serviceProto.ts | 248 +++- .../backend/src/shared/states/Player.ts | 30 + .../backend/src/shared/states/RoomState.ts | 5 + .../backend/tsrpc.config.ts | 14 +- .../backend/yarn.lock | 1302 ----------------- .../frontend/assets/3d.meta | 12 + .../frontend/assets/3d/map.meta | 12 + .../frontend/assets/3d/map/newMap01.FBX | Bin 0 -> 54240 bytes .../frontend/assets/3d/map/newMap01.FBX.meta | 124 ++ .../frontend/assets/3d/map/newMap01.jpg | Bin 0 -> 63465 bytes .../frontend/assets/3d/map/newMap01.jpg.meta | 41 + .../frontend/assets/3d/map/newMap01.mtl | 55 + .../frontend/assets/3d/map/newMap01.mtl.meta | 11 + .../frontend/assets/3d/soldier.meta | 12 + .../frontend/assets/3d/soldier/blue.mtl | 48 + .../frontend/assets/3d/soldier/blue.mtl.meta | 11 + .../frontend/assets/3d/soldier/red.mtl | 48 + .../frontend/assets/3d/soldier/red.mtl.meta | 11 + .../frontend/assets/3d/soldier/soldier01.FBX | Bin 0 -> 173376 bytes .../assets/3d/soldier/soldier01.FBX.meta | 312 ++++ .../frontend/assets/3d/soldier/soldier01.jpg | Bin 0 -> 7048 bytes .../assets/3d/soldier/soldier01.jpg.meta | 41 + .../frontend/assets/3d/soldier/soldier02.jpg | Bin 0 -> 6145 bytes .../assets/3d/soldier/soldier02.jpg.meta | 41 + .../frontend/assets/3d/soldier/soldier03.jpg | Bin 0 -> 6534 bytes .../assets/3d/soldier/soldier03.jpg.meta | 41 + .../frontend/assets/3d/soldier/yellow.mtl | 37 + .../assets/3d/soldier/yellow.mtl.meta | 11 + .../frontend/assets/env.ts | 1 + .../frontend/assets/env.ts.meta | 9 + .../frontend/assets/migrate-canvas.ts | 88 ++ .../frontend/assets/migrate-canvas.ts.meta | 9 + .../frontend/assets/prefabs.meta | 12 + .../frontend/assets/prefabs/Joystick.meta | 12 + .../assets/prefabs/Joystick/Joystick.prefab | 511 +++++++ .../prefabs/Joystick/Joystick.prefab.meta | 13 + .../assets/prefabs/Joystick/Joystick.ts | 90 ++ .../assets/prefabs/Joystick/Joystick.ts.meta | 13 + .../frontend/assets/prefabs/Soldier.meta | 12 + .../frontend/assets/scenes.meta | 12 + .../frontend/assets/scenes/GameScene.meta | 12 + .../assets/scenes/GameScene/GameScene.scene | 1128 ++++++++++++++ .../scenes/GameScene/GameScene.scene.meta | 11 + .../frontend/assets/scripts.meta | 12 + .../frontend/assets/scripts/Room.ts | 101 ++ .../frontend/assets/scripts/Room.ts.meta | 9 + .../frontend/assets/scripts/shared | 1 + .../frontend/assets/scripts/shared.meta | 12 + .../frontend/assets/spriteFrames.meta | 12 + .../assets/spriteFrames/circle256.png | Bin 0 -> 5280 bytes .../assets/spriteFrames/circle256.png.meta | 75 + .../frontend/package.json | 3 + .../settings/v2/packages/project.json | 8 +- .../frontend/tsconfig.json | 7 +- 68 files changed, 3459 insertions(+), 1398 deletions(-) create mode 100644 examples/cocos-creator-multiplayer/backend/src/api/ApiJoinRoom.ts delete mode 100644 examples/cocos-creator-multiplayer/backend/src/api/ApiSend.ts create mode 100644 examples/cocos-creator-multiplayer/backend/src/models/Room.ts delete mode 100644 examples/cocos-creator-multiplayer/backend/src/shared/protocols/MsgChat.ts create mode 100644 examples/cocos-creator-multiplayer/backend/src/shared/protocols/PtlJoinRoom.ts delete mode 100644 examples/cocos-creator-multiplayer/backend/src/shared/protocols/PtlSend.ts delete mode 100644 examples/cocos-creator-multiplayer/backend/src/shared/protocols/base.ts create mode 100644 examples/cocos-creator-multiplayer/backend/src/shared/protocols/clientMsgs/MsgInput.ts create mode 100644 examples/cocos-creator-multiplayer/backend/src/shared/protocols/serverMsgs/MsgFrame.ts create mode 100644 examples/cocos-creator-multiplayer/backend/src/shared/protocols/serverMsgs/MsgJoin.ts create mode 100644 examples/cocos-creator-multiplayer/backend/src/shared/protocols/serverMsgs/MsgLeave.ts create mode 100644 examples/cocos-creator-multiplayer/backend/src/shared/states/Player.ts create mode 100644 examples/cocos-creator-multiplayer/backend/src/shared/states/RoomState.ts delete mode 100644 examples/cocos-creator-multiplayer/backend/yarn.lock create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/map.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.FBX create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.FBX.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.jpg create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.jpg.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.mtl create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.mtl.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/soldier.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/blue.mtl create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/blue.mtl.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/red.mtl create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/red.mtl.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier01.FBX create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier01.FBX.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier01.jpg create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier01.jpg.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier02.jpg create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier02.jpg.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier03.jpg create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier03.jpg.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/yellow.mtl create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/yellow.mtl.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/env.ts create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/env.ts.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/migrate-canvas.ts create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/migrate-canvas.ts.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/prefabs.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.prefab create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.prefab.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.ts create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.ts.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/prefabs/Soldier.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/scenes.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/scenes/GameScene.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/scenes/GameScene/GameScene.scene create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/scenes/GameScene/GameScene.scene.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/scripts.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/scripts/Room.ts create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/scripts/Room.ts.meta create mode 120000 examples/cocos-creator-multiplayer/frontend/assets/scripts/shared create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/scripts/shared.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/spriteFrames.meta create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/spriteFrames/circle256.png create mode 100644 examples/cocos-creator-multiplayer/frontend/assets/spriteFrames/circle256.png.meta diff --git a/examples/cocos-creator-multiplayer/backend/.gitignore b/examples/cocos-creator-multiplayer/backend/.gitignore index d84f0da..7c591ed 100644 --- a/examples/cocos-creator-multiplayer/backend/.gitignore +++ b/examples/cocos-creator-multiplayer/backend/.gitignore @@ -1,3 +1,4 @@ node_modules dist -.DS_STORE \ No newline at end of file +.DS_STORE +*.meta \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/backend/package.json b/examples/cocos-creator-multiplayer/backend/package.json index 6beae18..25c5e18 100644 --- a/examples/cocos-creator-multiplayer/backend/package.json +++ b/examples/cocos-creator-multiplayer/backend/package.json @@ -22,6 +22,6 @@ "typescript": "^4.5.2" }, "dependencies": { - "tsrpc": "^3.1.2" + "tsrpc": "^3.1.3-dev.1" } -} \ No newline at end of file +} diff --git a/examples/cocos-creator-multiplayer/backend/src/api/ApiJoinRoom.ts b/examples/cocos-creator-multiplayer/backend/src/api/ApiJoinRoom.ts new file mode 100644 index 0000000..e64e371 --- /dev/null +++ b/examples/cocos-creator-multiplayer/backend/src/api/ApiJoinRoom.ts @@ -0,0 +1,12 @@ +import { ApiCallWs } from "tsrpc"; +import { roomInstance } from ".."; +import { ReqJoinRoom, ResJoinRoom } from "../shared/protocols/PtlJoinRoom"; + +export async function ApiJoinRoom(call: ApiCallWs) { + let uid = roomInstance.join(call.req, call.conn); + + call.succ({ + uid: uid, + roomState: roomInstance.state + }) +} \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/backend/src/api/ApiSend.ts b/examples/cocos-creator-multiplayer/backend/src/api/ApiSend.ts deleted file mode 100644 index e8943fa..0000000 --- a/examples/cocos-creator-multiplayer/backend/src/api/ApiSend.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ApiCall } from "tsrpc"; -import { server } from ".."; -import { ReqSend, ResSend } from "../shared/protocols/PtlSend"; - -// This is a demo code file -// Feel free to delete it - -export async function ApiSend(call: ApiCall) { - // Error - if (call.req.content.length === 0) { - call.error('Content is empty') - return; - } - - // Success - let time = new Date(); - call.succ({ - time: time - }); - - // Broadcast - server.broadcastMsg('Chat', { - content: call.req.content, - time: time - }) -} \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/backend/src/index.ts b/examples/cocos-creator-multiplayer/backend/src/index.ts index 71d481a..9b7d41a 100644 --- a/examples/cocos-creator-multiplayer/backend/src/index.ts +++ b/examples/cocos-creator-multiplayer/backend/src/index.ts @@ -1,5 +1,7 @@ +import 'k8w-extend-native'; import * as path from "path"; import { WsServer } from "tsrpc"; +import { Room } from './models/Room'; import { serviceProto } from './shared/protocols/serviceProto'; // Create the Server @@ -9,6 +11,9 @@ export const server = new WsServer(serviceProto, { json: true }); +// 测试,只有一个房间 +export const roomInstance = new Room(server); + // Initialize before server start async function init() { await server.autoImplementApi(path.resolve(__dirname, 'api')); diff --git a/examples/cocos-creator-multiplayer/backend/src/models/Room.ts b/examples/cocos-creator-multiplayer/backend/src/models/Room.ts new file mode 100644 index 0000000..3dd5783 --- /dev/null +++ b/examples/cocos-creator-multiplayer/backend/src/models/Room.ts @@ -0,0 +1,102 @@ +import { WsConnection, WsServer } from "tsrpc"; +import { ReqJoinRoom } from "../shared/protocols/PtlJoinRoom"; +import { MsgFrame } from "../shared/protocols/serverMsgs/MsgFrame"; +import { ServiceType } from "../shared/protocols/serviceProto"; +import { applyPlayerInput, PlayerInput, PlayerState } from "../shared/states/Player"; +import { RoomState } from "../shared/states/RoomState"; + +/** + * 服务端 - 房间 - 逻辑系统 + */ +export class Room { + + state: RoomState = { + players: [] + } + + // 次数/秒 + syncRate = 10; + lastUid = 0; + + server: WsServer; + conns: WsConnection[] = []; + + pendingInputs: MsgFrame['inputs'] = []; + + constructor(server: WsServer) { + this.server = server; + setInterval(() => { this.sendSyncFrame() }, 1000 / this.syncRate); + } + + sendSyncFrame() { + // 发送同步帧 + this.server.broadcastMsg('serverMsgs/Frame', { + inputs: this.pendingInputs + }, this.conns); + this.pendingInputs = []; + } + + /** 加入房间 */ + join(req: ReqJoinRoom, conn: WsConnection) { + let player: PlayerState = { + ...req, + uid: ++this.lastUid, + // 初始位置随机 + pos: { + x: Math.random() * 10, + y: Math.random() * 10 + } + } + this.conns.push(conn); + this.state.players.push(player); + + conn.uid = player.uid; + conn.listenMsg('clientMsgs/Input', call => { + this.pendingInputs.push({ + uid: player.uid, + msgInput: call.msg + }); + this.applyInput({ + uid: player.uid, + input: call.msg + }); + }); + + this.server.broadcastMsg('serverMsgs/Join', { + player: player + }, this.conns); + + return player.uid; + } + + /** 离开房间 */ + leave(uid: number, conn: WsConnection) { + this.conns.removeOne(v => v.uid === uid); + this.state.players.removeOne(v => v.uid === uid); + + conn.unlistenMsgAll('clientMsgs/Input'); + + this.server.broadcastMsg('serverMsgs/Leave', { + uid: uid + }, this.conns); + } + + applyInput(input: RoomInput) { + let playerIndex = this.state.players.findIndex(v => v.uid === input.uid); + if (playerIndex > -1) { + this.state.players[playerIndex] = applyPlayerInput(this.state.players[playerIndex], input.input); + } + } + +} + +export interface RoomInput { + uid: number, + input: PlayerInput +} + +declare module 'tsrpc' { + export interface WsConnection { + uid?: number; + } +} \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/backend/src/shared/protocols/MsgChat.ts b/examples/cocos-creator-multiplayer/backend/src/shared/protocols/MsgChat.ts deleted file mode 100644 index b18ed7b..0000000 --- a/examples/cocos-creator-multiplayer/backend/src/shared/protocols/MsgChat.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This is a demo code file -// Feel free to delete it - -export interface MsgChat { - content: string, - time: Date -} \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/backend/src/shared/protocols/PtlJoinRoom.ts b/examples/cocos-creator-multiplayer/backend/src/shared/protocols/PtlJoinRoom.ts new file mode 100644 index 0000000..46b96b0 --- /dev/null +++ b/examples/cocos-creator-multiplayer/backend/src/shared/protocols/PtlJoinRoom.ts @@ -0,0 +1,14 @@ +import { PlayerState } from "../states/Player"; +import { RoomState } from "../states/RoomState"; + +export interface ReqJoinRoom { + nickname: string; + skinId: number; +} + +export interface ResJoinRoom { + uid: number, + roomState: RoomState +} + +// export const conf = {} \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/backend/src/shared/protocols/PtlSend.ts b/examples/cocos-creator-multiplayer/backend/src/shared/protocols/PtlSend.ts deleted file mode 100644 index a732699..0000000 --- a/examples/cocos-creator-multiplayer/backend/src/shared/protocols/PtlSend.ts +++ /dev/null @@ -1,10 +0,0 @@ -// This is a demo code file -// Feel free to delete it - -export interface ReqSend { - content: string -} - -export interface ResSend { - time: Date -} \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/backend/src/shared/protocols/base.ts b/examples/cocos-creator-multiplayer/backend/src/shared/protocols/base.ts deleted file mode 100644 index 4626ca8..0000000 --- a/examples/cocos-creator-multiplayer/backend/src/shared/protocols/base.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface BaseRequest { - -} - -export interface BaseResponse { - -} - -export interface BaseConf { - -} - -export interface BaseMessage { - -} \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/backend/src/shared/protocols/clientMsgs/MsgInput.ts b/examples/cocos-creator-multiplayer/backend/src/shared/protocols/clientMsgs/MsgInput.ts new file mode 100644 index 0000000..ae0ae07 --- /dev/null +++ b/examples/cocos-creator-multiplayer/backend/src/shared/protocols/clientMsgs/MsgInput.ts @@ -0,0 +1,3 @@ +import { PlayerInput } from "../../states/Player"; + +export type MsgInput = { sn: number } & PlayerInput; \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/backend/src/shared/protocols/serverMsgs/MsgFrame.ts b/examples/cocos-creator-multiplayer/backend/src/shared/protocols/serverMsgs/MsgFrame.ts new file mode 100644 index 0000000..b7716b2 --- /dev/null +++ b/examples/cocos-creator-multiplayer/backend/src/shared/protocols/serverMsgs/MsgFrame.ts @@ -0,0 +1,8 @@ +import { MsgInput } from "../clientMsgs/MsgInput"; + +export interface MsgFrame { + inputs: { + uid: number, + msgInput: MsgInput + }[] +} \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/backend/src/shared/protocols/serverMsgs/MsgJoin.ts b/examples/cocos-creator-multiplayer/backend/src/shared/protocols/serverMsgs/MsgJoin.ts new file mode 100644 index 0000000..34429ae --- /dev/null +++ b/examples/cocos-creator-multiplayer/backend/src/shared/protocols/serverMsgs/MsgJoin.ts @@ -0,0 +1,5 @@ +import { PlayerState } from "../../states/Player"; + +export interface MsgJoin { + player: PlayerState; +} \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/backend/src/shared/protocols/serverMsgs/MsgLeave.ts b/examples/cocos-creator-multiplayer/backend/src/shared/protocols/serverMsgs/MsgLeave.ts new file mode 100644 index 0000000..adf0df5 --- /dev/null +++ b/examples/cocos-creator-multiplayer/backend/src/shared/protocols/serverMsgs/MsgLeave.ts @@ -0,0 +1,3 @@ +export interface MsgLeave { + uid: number; +} \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/backend/src/shared/protocols/serviceProto.ts b/examples/cocos-creator-multiplayer/backend/src/shared/protocols/serviceProto.ts index 5e615d5..5e2448c 100644 --- a/examples/cocos-creator-multiplayer/backend/src/shared/protocols/serviceProto.ts +++ b/examples/cocos-creator-multiplayer/backend/src/shared/protocols/serviceProto.ts @@ -1,75 +1,279 @@ import { ServiceProto } from 'tsrpc-proto'; -import { MsgChat } from './MsgChat'; -import { ReqSend, ResSend } from './PtlSend'; - -// This is a demo service proto file (auto generated) -// Feel free to delete it +import { MsgInput } from './clientMsgs/MsgInput'; +import { ReqJoinRoom, ResJoinRoom } from './PtlJoinRoom'; +import { MsgFrame } from './serverMsgs/MsgFrame'; +import { MsgJoin } from './serverMsgs/MsgJoin'; +import { MsgLeave } from './serverMsgs/MsgLeave'; export interface ServiceType { api: { - "Send": { - req: ReqSend, - res: ResSend + "JoinRoom": { + req: ReqJoinRoom, + res: ResJoinRoom } }, msg: { - "Chat": MsgChat + "clientMsgs/Input": MsgInput, + "serverMsgs/Frame": MsgFrame, + "serverMsgs/Join": MsgJoin, + "serverMsgs/Leave": MsgLeave } } export const serviceProto: ServiceProto = { + "version": 3, "services": [ { - "id": 0, - "name": "Chat", + "id": 2, + "name": "clientMsgs/Input", "type": "msg" }, { - "id": 1, - "name": "Send", + "id": 3, + "name": "JoinRoom", "type": "api" + }, + { + "id": 7, + "name": "serverMsgs/Frame", + "type": "msg" + }, + { + "id": 4, + "name": "serverMsgs/Join", + "type": "msg" + }, + { + "id": 5, + "name": "serverMsgs/Leave", + "type": "msg" } ], "types": { - "MsgChat/MsgChat": { + "clientMsgs/MsgInput/MsgInput": { + "type": "Intersection", + "members": [ + { + "id": 0, + "type": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "sn", + "type": { + "type": "Number" + } + } + ] + } + }, + { + "id": 1, + "type": { + "type": "Reference", + "target": "../states/Player/PlayerInput" + } + } + ] + }, + "../states/Player/PlayerInput": { + "type": "Reference", + "target": "../states/Player/PlayerMove" + }, + "../states/Player/PlayerMove": { "type": "Interface", "properties": [ { "id": 0, - "name": "content", + "name": "type", + "type": { + "type": "Literal", + "literal": "move" + } + }, + { + "id": 1, + "name": "offset", + "type": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "x", + "type": { + "type": "Number" + } + }, + { + "id": 1, + "name": "y", + "type": { + "type": "Number" + } + } + ] + } + } + ] + }, + "PtlJoinRoom/ReqJoinRoom": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "nickname", "type": { "type": "String" } }, { "id": 1, - "name": "time", + "name": "skinId", "type": { - "type": "Date" + "type": "Number" } } ] }, - "PtlSend/ReqSend": { + "PtlJoinRoom/ResJoinRoom": { "type": "Interface", "properties": [ { "id": 0, - "name": "content", + "name": "uid", + "type": { + "type": "Number" + } + }, + { + "id": 3, + "name": "roomState", + "type": { + "type": "Reference", + "target": "../states/RoomState/RoomState" + } + } + ] + }, + "../states/RoomState/RoomState": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "players", + "type": { + "type": "Array", + "elementType": { + "type": "Reference", + "target": "../states/Player/PlayerState" + } + } + } + ] + }, + "../states/Player/PlayerState": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "uid", + "type": { + "type": "Number" + } + }, + { + "id": 1, + "name": "nickname", "type": { "type": "String" } + }, + { + "id": 2, + "name": "skinId", + "type": { + "type": "Number" + } + }, + { + "id": 3, + "name": "pos", + "type": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "x", + "type": { + "type": "Number" + } + }, + { + "id": 1, + "name": "y", + "type": { + "type": "Number" + } + } + ] + } } ] }, - "PtlSend/ResSend": { + "serverMsgs/MsgFrame/MsgFrame": { "type": "Interface", "properties": [ { "id": 0, - "name": "time", + "name": "inputs", "type": { - "type": "Date" + "type": "Array", + "elementType": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "uid", + "type": { + "type": "Number" + } + }, + { + "id": 1, + "name": "msgInput", + "type": { + "type": "Reference", + "target": "clientMsgs/MsgInput/MsgInput" + } + } + ] + } + } + } + ] + }, + "serverMsgs/MsgJoin/MsgJoin": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "player", + "type": { + "type": "Reference", + "target": "../states/Player/PlayerState" + } + } + ] + }, + "serverMsgs/MsgLeave/MsgLeave": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "uid", + "type": { + "type": "Number" } } ] diff --git a/examples/cocos-creator-multiplayer/backend/src/shared/states/Player.ts b/examples/cocos-creator-multiplayer/backend/src/shared/states/Player.ts new file mode 100644 index 0000000..a152d3d --- /dev/null +++ b/examples/cocos-creator-multiplayer/backend/src/shared/states/Player.ts @@ -0,0 +1,30 @@ +export interface PlayerState { + uid: number, + nickname: string, + skinId: number, + + // 可变状态 + pos: { + x: number, + y: number + } +} + +export interface PlayerMove { + type: 'move', + // 位移距离 + offset: { + x: number, + y: number + } +} +export type PlayerInput = PlayerMove; + +export function applyPlayerInput(state: PlayerState, input: PlayerInput): PlayerState { + if (input.type === 'move') { + state.pos.x += input.offset.x; + state.pos.y += input.offset.y; + } + + return state; +} \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/backend/src/shared/states/RoomState.ts b/examples/cocos-creator-multiplayer/backend/src/shared/states/RoomState.ts new file mode 100644 index 0000000..b89f35c --- /dev/null +++ b/examples/cocos-creator-multiplayer/backend/src/shared/states/RoomState.ts @@ -0,0 +1,5 @@ +import { PlayerState } from "./Player"; + +export interface RoomState { + players: PlayerState[] +} \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/backend/tsrpc.config.ts b/examples/cocos-creator-multiplayer/backend/tsrpc.config.ts index 0bbf318..3fb40fa 100644 --- a/examples/cocos-creator-multiplayer/backend/tsrpc.config.ts +++ b/examples/cocos-creator-multiplayer/backend/tsrpc.config.ts @@ -1,4 +1,4 @@ -import { CodeTemplate, TsrpcConfig } from 'tsrpc-cli'; +import { TsrpcConfig } from 'tsrpc-cli'; const tsrpcConf: TsrpcConfig = { // Generate ServiceProto @@ -8,17 +8,17 @@ const tsrpcConf: TsrpcConfig = { output: 'src/shared/protocols/serviceProto.ts', // Path for generated ServiceProto apiDir: 'src/api', // API dir docDir: 'docs', // API documents dir - ptlTemplate: CodeTemplate.getExtendedPtl(), + // ptlTemplate: CodeTemplate.getExtendedPtl(), // msgTemplate: CodeTemplate.getExtendedMsg(), } ], // Sync shared code sync: [ - // { - // from: 'src/shared', - // to: '../frontend/src/shared', - // type: 'symlink' // Change this to 'copy' if your environment not support symlink - // } + { + from: 'src/shared', + to: '../frontend/assets/scripts/shared', + type: 'symlink' // Change this to 'copy' if your environment not support symlink + } ], // Dev server dev: { diff --git a/examples/cocos-creator-multiplayer/backend/yarn.lock b/examples/cocos-creator-multiplayer/backend/yarn.lock deleted file mode 100644 index 94d8997..0000000 --- a/examples/cocos-creator-multiplayer/backend/yarn.lock +++ /dev/null @@ -1,1302 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@blakeembrey/deque@^1.0.5": - version "1.0.5" - resolved "https://registry.npmmirror.com/@blakeembrey/deque/download/@blakeembrey/deque-1.0.5.tgz#f4fa17fc5ee18317ec01a763d355782c7b395eaf" - integrity sha1-9PoX/F7hgxfsAadj01V4LHs5Xq8= - -"@blakeembrey/template@^1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@blakeembrey/template/download/@blakeembrey/template-1.0.0.tgz#bf8828bc3ae8004d97904d78f64e3cc2cd216438" - integrity sha1-v4govDroAE2XkE149k48ws0hZDg= - -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.npmmirror.com/@cspotcode/source-map-consumer/download/@cspotcode/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" - integrity sha1-M79LeznBeIIWBvZpu8RHpqYpeGs= - -"@cspotcode/source-map-support@0.7.0": - version "0.7.0" - resolved "https://registry.npmmirror.com/@cspotcode/source-map-support/download/@cspotcode/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" - integrity sha1-R4mECqhZ5G0vMXNyercHxmvzRPU= - dependencies: - "@cspotcode/source-map-consumer" "0.8.0" - -"@tsconfig/node10@^1.0.7": - version "1.0.8" - resolved "https://registry.npmmirror.com/@tsconfig/node10/download/@tsconfig/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" - integrity sha1-weToDW+WT77LM1nEO9SLQPfK2tk= - -"@tsconfig/node12@^1.0.7": - version "1.0.9" - resolved "https://registry.npmmirror.com/@tsconfig/node12/download/@tsconfig/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" - integrity sha1-YsH23uLr2a6tgNw6+laBDljhoEw= - -"@tsconfig/node14@^1.0.0": - version "1.0.1" - resolved "https://registry.npmmirror.com/@tsconfig/node14/download/@tsconfig/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" - integrity sha1-lfLRZ/+5uNIGiwsjUwL6/U33EfI= - -"@tsconfig/node16@^1.0.2": - version "1.0.2" - resolved "https://registry.npmmirror.com/@tsconfig/node16/download/@tsconfig/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" - integrity sha1-Qjx3h30Fadsg4fyAiFrEEYMUAQ4= - -"@types/mocha@^8.2.3": - version "8.2.3" - resolved "https://registry.npmmirror.com/@types/mocha/download/@types/mocha-8.2.3.tgz?cache=0&sync_timestamp=1637283988208&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fmocha%2Fdownload%2F%40types%2Fmocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323" - integrity sha1-u+tV+8c/KOpt5gH7+kYT9Y14UyM= - -"@types/node@^15.14.9": - version "15.14.9" - resolved "https://registry.npmmirror.com/@types/node/download/@types/node-15.14.9.tgz#bc43c990c3c9be7281868bbc7b8fdd6e2b57adfa" - integrity sha1-vEPJkMPJvnKBhou8e4/dbitXrfo= - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.npmmirror.com/@ungap/promise-all-settled/download/@ungap/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha1-qlgEJxHW4ydd033Fl+XTHowpCkQ= - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.npmmirror.com/acorn-walk/download/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha1-dBIQ8uJCZFRQiFOi9E0KuDt/acE= - -acorn@^8.4.1: - version "8.6.0" - resolved "https://registry.npmmirror.com/acorn/download/acorn-8.6.0.tgz?cache=0&sync_timestamp=1637225522161&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Facorn%2Fdownload%2Facorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" - integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.npmmirror.com/ansi-colors/download/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha1-y7muJWv3UK8eqzRPIpqif+lLo0g= - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.npmmirror.com/ansi-escapes/download/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4= - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/ansi-regex/download/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ= - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha1-7dgDYornHATIWuegkG7a00tkiTc= - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/anymatch/download/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha1-wFV8CWrzLxBhmPT04qODU343hxY= - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0, arg@^4.1.3: - version "4.1.3" - resolved "https://registry.npmmirror.com/arg/download/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha1-Jp/HrVuOQstjyJbVZmAXJhwUQIk= - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/argparse/download/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg= - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/balanced-match/download/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4= - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmmirror.com/base64-js/download/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha1-GxtEAWClv3rUC2UPCVljSBkDkwo= - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/binary-extensions/download/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0= - -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/bl/download/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha1-RRU1JkGCvsL7vIOmKrmM8R2fezo= - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmmirror.com/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/braces/download/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc= - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.npmmirror.com/browser-stdout/download/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA= - -bson@*: - version "4.6.0" - resolved "https://registry.npmmirror.com/bson/download/bson-4.6.0.tgz#15c3b39ba3940c3d915a0c44d51459f4b4fbf1b2" - integrity sha512-8jw1NU1hglS+Da1jDOUYuNcBJ4cNHCFIqzlwoFNnsTOg2R/ox0aTYcTiBN4dzRa9q7Cvy6XErh3L8ReTEb9AQQ== - dependencies: - buffer "^5.6.0" - -buffer@^5.5.0, buffer@^5.6.0: - version "5.7.1" - resolved "https://registry.npmmirror.com/buffer/download/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha1-umLnwTEzBTWCGXFghRqPZI6Z7tA= - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -camelcase@^6.0.0: - version "6.2.1" - resolved "https://registry.npmmirror.com/camelcase/download/camelcase-6.2.1.tgz?cache=0&sync_timestamp=1636945190375&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcamelcase%2Fdownload%2Fcamelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" - integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== - -chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmmirror.com/chalk/download/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha1-qsTit3NKdAhnrrFr8CqtVWoeegE= - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.npmmirror.com/chardet/download/chardet-0.7.0.tgz?cache=0&sync_timestamp=1634639163489&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fchardet%2Fdownload%2Fchardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha1-kAlISfCTfy7twkJdDSip5fDLrZ4= - -chokidar@3.5.2, chokidar@^3.3.1, chokidar@^3.5.2: - version "3.5.2" - resolved "https://registry.npmmirror.com/chokidar/download/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha1-26OXb8rbAW9m/TZQIdkWANAcHnU= - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/cli-cursor/download/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha1-JkMFp65JDR0Dvwybp8kl0XU68wc= - dependencies: - restore-cursor "^3.1.0" - -cli-spinners@^2.5.0: - version "2.6.1" - resolved "https://registry.npmmirror.com/cli-spinners/download/cli-spinners-2.6.1.tgz?cache=0&sync_timestamp=1633109592807&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcli-spinners%2Fdownload%2Fcli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" - integrity sha1-rclU6+KBw3pjGb+kAebdJIj/tw0= - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/cli-width/download/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha1-ovSEN6LKqaIkNueUvwceyeYc7fY= - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmmirror.com/cliui/download/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08= - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.npmmirror.com/clone/download/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/color-convert/download/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM= - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/color-name/download/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha1-wqCah6y95pVD3m9j+jmVyCbFNqI= - -colors@^1.1.2: - version "1.4.0" - resolved "https://registry.npmmirror.com/colors/download/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha1-xQSRR51MG9rtLJztMs98fcI2D3g= - -commander@^2.19.0: - version "2.20.3" - resolved "https://registry.npmmirror.com/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1634886396986&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha1-/UhehMA+tIgcIHIrpIA16FMa6zM= - -commandpost@^1.0.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/commandpost/download/commandpost-1.4.0.tgz#89218012089dfc9b67a337ba162f15c88e0f1048" - integrity sha1-iSGAEgid/Jtnoze6Fi8VyI4PEEg= - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmmirror.com/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.npmmirror.com/create-require/download/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha1-wdfo8eX2z8n/ZfnNNS03NIdWwzM= - -cross-spawn@^7.0.0, cross-spawn@^7.0.1: - version "7.0.3" - resolved "https://registry.npmmirror.com/cross-spawn/download/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha1-9zqFudXUHQRVUcF34ogtSshXKKY= - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@4.3.2: - version "4.3.2" - resolved "https://registry.npmmirror.com/debug/download/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha1-8KScGKyHeeMdSgxgKd+3aHPHQos= - dependencies: - ms "2.1.2" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/decamelize/download/decamelize-4.0.0.tgz?cache=0&sync_timestamp=1633055713394&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fdecamelize%2Fdownload%2Fdecamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha1-qkcte/Zg6xXzSU79UxyrfypwmDc= - -defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/defaults/download/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= - dependencies: - clone "^1.0.2" - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/diff/download/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha1-ftatdthZ0DB4fsNYVfWx2vMdhSs= - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.npmmirror.com/diff/download/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha1-YPOuy4nV+uUgwRqhnvwruYKq3n0= - -editorconfig@^0.15.0: - version "0.15.3" - resolved "https://registry.npmmirror.com/editorconfig/download/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" - integrity sha1-vvhMTnX7jcsM5c7o79UcFZmb78U= - dependencies: - commander "^2.19.0" - lru-cache "^4.1.5" - semver "^5.6.0" - sigmund "^1.0.1" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-8.0.0.tgz?cache=0&sync_timestamp=1632752198735&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Femoji-regex%2Fdownload%2Femoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc= - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.npmmirror.com/end-of-stream/download/end-of-stream-1.4.4.tgz?cache=0&sync_timestamp=1632469585035&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fend-of-stream%2Fdownload%2Fend-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha1-WuZKX0UFe682JuwU2gyl5LJDHrA= - dependencies: - once "^1.4.0" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/escalade/download/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA= - -escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/escape-string-regexp/download/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ= - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -execa@^4.0.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/execa/download/execa-4.1.0.tgz?cache=0&sync_timestamp=1637147236741&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fexeca%2Fdownload%2Fexeca-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha1-TlSRrRVy8vF6d9OIxshXE1sihHo= - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.npmmirror.com/external-editor/download/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha1-ywP3QL764D6k0oPK7SdBqD8zVJU= - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/figures/download/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha1-YlwYvSk8YE3EqN2y/r8MiDQXRq8= - dependencies: - escape-string-regexp "^1.0.5" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmmirror.com/fill-range/download/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha1-GRmmp8df44ssfHflGYU12prN2kA= - dependencies: - to-regex-range "^5.0.1" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/find-up/download/find-up-5.0.0.tgz?cache=0&sync_timestamp=1633618659233&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffind-up%2Fdownload%2Ffind-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha1-TJKBnstwg1YeT0okCoa+UZj1Nvw= - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.npmmirror.com/flat/download/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha1-jKb+MyBp/6nTJMMnGYxZglnOskE= - -fs-extra@^10.0.0: - version "10.0.0" - resolved "https://registry.npmmirror.com/fs-extra/download/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" - integrity sha1-n/YbZV3eU/s0qC34S7IUzoAuF8E= - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmmirror.com/fsevents/download/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro= - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmmirror.com/get-caller-file/download/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha1-T5RBKoLbMvNuOwuXQfipf+sDH34= - -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/get-stream/download/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha1-SWaheV7lrOZecGxLe+txJX1uItM= - dependencies: - pump "^3.0.0" - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/glob-parent/download/glob-parent-5.1.2.tgz?cache=0&sync_timestamp=1632953971963&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ= - dependencies: - is-glob "^4.0.1" - -glob@7.1.7: - version "7.1.7" - resolved "https://registry.npmmirror.com/glob/download/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha1-Oxk+kjPwHULQs/eClLvutBj5SpA= - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.2.0: - version "7.2.0" - resolved "https://registry.npmmirror.com/glob/download/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha1-0VU1r3cy4C6Uj0xBYovZECk/YCM= - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.8" - resolved "https://registry.npmmirror.com/graceful-fs/download/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha1-5BK40z9eAGWTy9PO5t+fLOu+gCo= - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.npmmirror.com/growl/download/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/has-flag/download/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s= - -he@1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/he/download/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha1-hK5l+n6vsWX922FWauFLrwVmTw8= - -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/human-signals/download/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha1-xbHNFPUK6uCatsWf5jujOV/k36M= - -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.npmmirror.com/iconv-lite/download/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.npmmirror.com/ieee754/download/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I= - -ignore@^5.1.4: - version "5.1.9" - resolved "https://registry.npmmirror.com/ignore/download/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" - integrity sha1-nsGly+jhRG7GDUQgBg1Dqm5zgvs= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmmirror.com/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.npmmirror.com/inherits/download/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w= - -inquirer@^8.2.0: - version "8.2.0" - resolved "https://registry.npmmirror.com/inquirer/download/inquirer-8.2.0.tgz#f44f008dd344bbfc4b30031f45d984e034a3ac3a" - integrity sha1-9E8AjdNEu/xLMAMfRdmE4DSjrDo= - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.2.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -invert-kv@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/invert-kv/download/invert-kv-3.0.1.tgz#a93c7a3d4386a1dc8325b97da9bb1620c0282523" - integrity sha1-qTx6PUOGodyDJbl9qbsWIMAoJSM= - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-binary-path/download/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk= - dependencies: - binary-extensions "^2.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/is-extglob/download/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0= - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmmirror.com/is-glob/download/is-glob-4.0.3.tgz?cache=0&sync_timestamp=1632934382080&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-glob%2Fdownload%2Fis-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ= - dependencies: - is-extglob "^2.1.1" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/is-interactive/download/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha1-zqbmrlyHCnsKAAQHC3tYfgJSkS4= - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmmirror.com/is-number/download/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss= - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-plain-obj/download/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha1-ReQuN/zPH0Dajl927iFRWEDAkoc= - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/is-stream/download/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha1-+sHj1TuXrVqdCunO8jifWBClwHc= - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.npmmirror.com/is-unicode-supported/download/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/js-yaml/download/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha1-wftl+PUBeQHN0slRhkuhhFihBgI= - dependencies: - argparse "^2.0.1" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.npmmirror.com/jsonfile/download/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4= - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -k8w-crypto@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/k8w-crypto/download/k8w-crypto-0.2.0.tgz#00e6f3027832eeade06fd79c9c3a1ebfb76c964f" - integrity sha1-AObzAngy7q3gb9ecnDoev7dslk8= - -k8w-extend-native@^1.4.6: - version "1.4.6" - resolved "https://registry.npmmirror.com/k8w-extend-native/download/k8w-extend-native-1.4.6.tgz#d3008c60f3f85e5b2f2bd8617ff4a5bc9cf743a6" - integrity sha1-0wCMYPP4XlsvK9hhf/SlvJz3Q6Y= - dependencies: - k8w-linq-array "*" - k8w-super-date "*" - k8w-super-object "*" - -k8w-linq-array@*: - version "0.2.8" - resolved "https://registry.npmmirror.com/k8w-linq-array/download/k8w-linq-array-0.2.8.tgz#1ef4d4a2943552cbd5f633a5d9b8e831dc8abd6e" - integrity sha1-HvTUopQ1UsvV9jOl2bjoMdyKvW4= - -k8w-super-date@*: - version "0.1.3" - resolved "https://registry.npmmirror.com/k8w-super-date/download/k8w-super-date-0.1.3.tgz#4f53a39f2b74e21b11268926b710e5a7c27f8848" - integrity sha1-T1Ojnyt04hsRJokmtxDlp8J/iEg= - -k8w-super-object@*: - version "0.3.0" - resolved "https://registry.npmmirror.com/k8w-super-object/download/k8w-super-object-0.3.0.tgz#6430d14956aaf3a936fda7776b0897a04db331dd" - integrity sha1-ZDDRSVaq86k2/ad3awiXoE2zMd0= - -lcid@^3.0.0: - version "3.1.1" - resolved "https://registry.npmmirror.com/lcid/download/lcid-3.1.1.tgz#9030ec479a058fc36b5e8243ebaac8b6ac582fd0" - integrity sha1-kDDsR5oFj8NrXoJD66rItqxYL9A= - dependencies: - invert-kv "^3.0.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/locate-path/download/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha1-VTIeswn+u8WcSAHZMackUqaB0oY= - dependencies: - p-locate "^5.0.0" - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.npmmirror.com/lodash/download/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw= - -log-symbols@4.1.0, log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/log-symbols/download/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha1-P727lbRoOsn8eFER55LlWNSr1QM= - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -lru-cache@^4.1.5: - version "4.1.5" - resolved "https://registry.npmmirror.com/lru-cache/download/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80= - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.npmmirror.com/make-error/download/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha1-LrLjfqm2fEiR9oShOUeZr0hM96I= - -map-age-cleaner@^0.1.3: - version "0.1.3" - resolved "https://registry.npmmirror.com/map-age-cleaner/download/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo= - dependencies: - p-defer "^1.0.0" - -mem@^5.0.0: - version "5.1.1" - resolved "https://registry.npmmirror.com/mem/download/mem-5.1.1.tgz#7059b67bf9ac2c924c9f1cff7155a064394adfb3" - integrity sha1-cFm2e/msLJJMnxz/cVWgZDlK37M= - dependencies: - map-age-cleaner "^0.1.3" - mimic-fn "^2.1.0" - p-is-promise "^2.1.0" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/merge-stream/download/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A= - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/mimic-fn/download/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs= - -minimatch@3.0.4, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.npmmirror.com/minimist/download/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI= - -mocha@^9.1.3: - version "9.1.3" - resolved "https://registry.npmmirror.com/mocha/download/mocha-9.1.3.tgz?cache=0&sync_timestamp=1634283119059&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmocha%2Fdownload%2Fmocha-9.1.3.tgz#8a623be6b323810493d8c8f6f7667440fa469fdb" - integrity sha1-imI75rMjgQST2Mj292Z0QPpGn9s= - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.2" - debug "4.3.2" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.1.7" - growl "1.10.5" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "3.0.4" - ms "2.1.3" - nanoid "3.1.25" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - workerpool "6.1.5" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmmirror.com/ms/download/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk= - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmmirror.com/ms/download/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha1-V0yBOM4dK1hh8LRFedut1gxmFbI= - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.npmmirror.com/mute-stream/download/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha1-FjDEKyJR/4HiooPelqVJfqkuXg0= - -nanoid@3.1.25: - version "3.1.25" - resolved "https://registry.npmmirror.com/nanoid/download/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" - integrity sha1-CcoydHwOVD8OGBS303k0d/nI4VI= - -node-json-color-stringify@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/node-json-color-stringify/download/node-json-color-stringify-1.1.0.tgz#8bb124f913859591058026513121d6609d6ef5b7" - integrity sha1-i7Ek+ROFlZEFgCZRMSHWYJ1u9bc= - dependencies: - colors "^1.1.2" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/normalize-path/download/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= - -npm-run-path@^4.0.0: - version "4.0.1" - resolved "https://registry.npmmirror.com/npm-run-path/download/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha1-t+zR5e1T2o43pV4cImnguX7XSOo= - dependencies: - path-key "^3.0.0" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onchange@^7.1.0: - version "7.1.0" - resolved "https://registry.npmmirror.com/onchange/download/onchange-7.1.0.tgz#a6f0f7733e4d47014b4cd70aa1ad36c2b4cf3804" - integrity sha1-pvD3cz5NRwFLTNcKoa02wrTPOAQ= - dependencies: - "@blakeembrey/deque" "^1.0.5" - "@blakeembrey/template" "^1.0.0" - arg "^4.1.3" - chokidar "^3.3.1" - cross-spawn "^7.0.1" - ignore "^5.1.4" - tree-kill "^1.2.2" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.npmmirror.com/onetime/download/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4= - dependencies: - mimic-fn "^2.1.0" - -ora@^5.4.1: - version "5.4.1" - resolved "https://registry.npmmirror.com/ora/download/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha1-GyZ4Qmr0rEpQkAjl5KyemVnbnhg= - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-locale@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/os-locale/download/os-locale-5.0.0.tgz#6d26c1d95b6597c5d5317bf5fba37eccec3672e0" - integrity sha1-bSbB2Vtll8XVMXv1+6N+zOw2cuA= - dependencies: - execa "^4.0.0" - lcid "^3.0.0" - mem "^5.0.0" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/os-tmpdir/download/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/p-defer/download/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - -p-is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/p-is-promise/download/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha1-kYzrrqJIpiz3/6uOO8qMX4gvxC4= - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmmirror.com/p-limit/download/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs= - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/p-locate/download/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha1-g8gxXGeFAF470CGDlBHJ4RDm2DQ= - dependencies: - p-limit "^3.0.2" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/path-exists/download/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha1-UTvb4tO5XXdi6METfvoZXGxhtbM= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmmirror.com/path-key/download/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U= - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.0" - resolved "https://registry.npmmirror.com/picomatch/download/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha1-8fBh3o9qS/AiiS4tEoI0+5gwKXI= - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/pseudomap/download/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/pump/download/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ= - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/randombytes/download/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo= - dependencies: - safe-buffer "^5.1.0" - -readable-stream@^3.4.0: - version "3.6.0" - resolved "https://registry.npmmirror.com/readable-stream/download/readable-stream-3.6.0.tgz?cache=0&sync_timestamp=1632380409088&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Freadable-stream%2Fdownload%2Freadable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha1-M3u9o63AcGvT4CRCaihtS0sskZg= - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmmirror.com/readdirp/download/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc= - dependencies: - picomatch "^2.2.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/require-directory/download/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/restore-cursor/download/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha1-OfZ8VLOnpYzqUjbZXPADQjljH34= - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.npmmirror.com/run-async/download/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU= - -rxjs@^7.2.0: - version "7.4.0" - resolved "https://registry.npmmirror.com/rxjs/download/rxjs-7.4.0.tgz#a12a44d7eebf016f5ff2441b87f28c9a51cebc68" - integrity sha1-oSpE1+6/AW9f8kQbh/KMmlHOvGg= - dependencies: - tslib "~2.1.0" - -safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmmirror.com/safe-buffer/download/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.npmmirror.com/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= - -semver@^5.6.0: - version "5.7.1" - resolved "https://registry.npmmirror.com/semver/download/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha1-qVT5Ma66UI0we78Gnv8MAclhFvc= - -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/serialize-javascript/download/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha1-765diPRdeSQUHai1w6en5mP+/rg= - dependencies: - randombytes "^2.1.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/shebang-command/download/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo= - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/shebang-regex/download/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI= - -sigmund@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/sigmund/download/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= - -signal-exit@^3.0.2: - version "3.0.6" - resolved "https://registry.npmmirror.com/signal-exit/download/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" - integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA= - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmmirror.com/string_decoder/download/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4= - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk= - dependencies: - ansi-regex "^5.0.1" - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/strip-final-newline/download/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0= - -strip-json-comments@3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/strip-json-comments/download/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY= - -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.npmmirror.com/supports-color/download/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw= - dependencies: - has-flag "^4.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha1-G33NyzK4E4gBs+R4umpRyqiWSNo= - dependencies: - has-flag "^4.0.0" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.npmmirror.com/through/download/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.npmmirror.com/tmp/download/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha1-bTQzWIl2jSGyvNoKonfO07G/rfk= - dependencies: - os-tmpdir "~1.0.2" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/to-regex-range/download/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ= - dependencies: - is-number "^7.0.0" - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.npmmirror.com/tree-kill/download/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha1-TKCakJLIi3OnzcXooBtQeweQoMw= - -ts-node@^10.4.0: - version "10.4.0" - resolved "https://registry.npmmirror.com/ts-node/download/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7" - integrity sha1-aA+IlFiF9ObPRQ5/DWIj3UBIlfc= - dependencies: - "@cspotcode/source-map-support" "0.7.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - yn "3.1.1" - -tsbuffer-proto-generator@^1.6.0-dev.0: - version "1.6.0-dev.0" - resolved "https://registry.npmmirror.com/tsbuffer-proto-generator/download/tsbuffer-proto-generator-1.6.0-dev.0.tgz#1168a69a62a1bad61752e5f0d32ebbe54dc15156" - integrity sha512-z9p9gHDpR+sp+FSV5Qdjlo663ag8Yv6nrTS8BduSlvfU388RJa+JgMGhpdoDt/L0b++AWApfKUWcGW3iA/8Lmg== - dependencies: - k8w-crypto "^0.2.0" - k8w-extend-native "^1.4.6" - tsbuffer-schema "^2.0.8" - tslib "^2.3.1" - typescript "^4.4.4" - -tsbuffer-schema@^2.0.8, tsbuffer-schema@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/tsbuffer-schema/download/tsbuffer-schema-2.1.1.tgz#638a05f728a8ec5c0ed036e126f4f5b350f86cb9" - integrity sha512-c76TmiIJKHTdkByAXsLZ+Oin85y41CBOiGfrrPtBOTxh2pg80bN8wpF79N4teZA/B/u6SF47tsq2XR9Ef8/6kA== - -tsbuffer-validator@^2.0.7: - version "2.0.7" - resolved "https://registry.npmmirror.com/tsbuffer-validator/download/tsbuffer-validator-2.0.7.tgz#733a1d3074437af13acf8c26b6df0c703940d7f5" - integrity sha512-iffKO4LmbZ1l7SZsQB5oRXl58xKqwuGFEUzWzKvwT4ambLaI2jLICVTBmBIYJDrF5hI0ZJm282YmRi4QleR7SA== - dependencies: - k8w-extend-native "^1.4.6" - tsbuffer-schema "^2.0.8" - tslib "^2.3.1" - -tsbuffer@^2.1.4, tsbuffer@^2.1.5: - version "2.1.5" - resolved "https://registry.npmmirror.com/tsbuffer/download/tsbuffer-2.1.5.tgz#1bdb44ece499685a836564b3f087b261c0e2112c" - integrity sha512-xlZjiz7LgteL66orgYKn4FTBadPyEwkUrdSYztGDNcLV9Hlp8tIK3/4vhDYkHqa9n/usX8beCrp6atRwfwVDnw== - dependencies: - k8w-extend-native "^1.4.6" - tsbuffer-validator "^2.0.7" - tslib "^2.3.1" - -tslib@*, tslib@^2.3.1: - version "2.3.1" - resolved "https://registry.npmmirror.com/tslib/download/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha1-6KM1rdXOrlGqJh0ypJAVjvBC7wE= - -tslib@~2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/tslib/download/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" - integrity sha1-2mCGDxwuyqVwOrfTm8Bba/mIuXo= - -tsrpc-base-client@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/tsrpc-base-client/download/tsrpc-base-client-1.2.1.tgz#c1f340e22096ab5c67a5f0f6ebec2efd76272492" - integrity sha512-0ZMa9bJT8jtYQMpBwWP20lAXnDEYDLk0/CSoK8S0i9eoDa6LrMca8x+nUC9zWB4zHbB1dCTATFtyYOt/LW9fYw== - dependencies: - k8w-extend-native "^1.4.6" - tsbuffer "^2.1.4" - tslib "^2.3.1" - tsrpc-proto "^1.3.9" - -tsrpc-cli@^2.2.2: - version "2.2.2" - resolved "https://registry.npmmirror.com/tsrpc-cli/download/tsrpc-cli-2.2.2.tgz#f941bb7f09c125d73f03f80b5362d76a89acf9d7" - integrity sha512-QfjmLZgXMDLBGBuaeiooJTm0L778RGjZHDNsm7z5KPGnHiOgIAZ74vCZFHZFrF+PeVvjgzzQ0dfezv4memBU1g== - dependencies: - chalk "^4.1.2" - chokidar "^3.5.2" - fs-extra "^10.0.0" - glob "^7.2.0" - inquirer "^8.2.0" - k8w-extend-native "^1.4.6" - minimist "^1.2.5" - node-json-color-stringify "^1.1.0" - ora "^5.4.1" - os-locale "^5.0.0" - ts-node "^10.4.0" - tsbuffer "^2.1.5" - tsbuffer-proto-generator "^1.6.0-dev.0" - tsbuffer-schema "^2.1.1" - tsrpc-proto "^1.3.10" - typescript "^4.5.2" - typescript-formatter "^7.2.2" - -tsrpc-proto@^1.3.10, tsrpc-proto@^1.3.9: - version "1.3.10" - resolved "https://registry.npmmirror.com/tsrpc-proto/download/tsrpc-proto-1.3.10.tgz#4a748546a0500362235a1469017e36f3f6a259b2" - integrity sha512-YavKKcOMSs80ev44gqHpSx6Z7UFQYmxItDTuaktiKQmstRbW9D/qK1b0lJltAj4ihPU06OOXePcg0CGEch6kYQ== - dependencies: - tsbuffer-schema "^2.1.1" - tslib "*" - -tsrpc@^3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/tsrpc/download/tsrpc-3.1.2.tgz#c12c015709c5cc141ff979056b2b246b3b7268f0" - integrity sha512-tvxndIc9G3I6GJoe/jcTE5QL6j1Zphmx84Lti+hlrgar31+5ZteJeilILSGEls7uqiV9Fa8s5xHH/3ukOc4gmQ== - dependencies: - bson "*" - chalk "^4.1.2" - tsbuffer "^2.1.4" - tsrpc-base-client "^1.2.1" - tsrpc-proto "^1.3.9" - uuid "^8.3.2" - ws "^7.5.5" - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.npmmirror.com/type-fest/download/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc= - -typescript-formatter@^7.2.2: - version "7.2.2" - resolved "https://registry.npmmirror.com/typescript-formatter/download/typescript-formatter-7.2.2.tgz#a147181839b7bb09c2377b072f20f6336547c00a" - integrity sha1-oUcYGDm3uwnCN3sHLyD2M2VHwAo= - dependencies: - commandpost "^1.0.0" - editorconfig "^0.15.0" - -typescript@^4.4.4, typescript@^4.5.2: - version "4.5.2" - resolved "https://registry.npmmirror.com/typescript/download/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998" - integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/universalify/download/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha1-daSYTv7cSwiXXFrrc/Uw0C3yVxc= - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmmirror.com/uuid/download/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha1-gNW1ztJxu5r2xEXyGhoExgbO++I= - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/wcwidth/download/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= - dependencies: - defaults "^1.0.3" - -which@2.0.2, which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmmirror.com/which/download/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE= - dependencies: - isexe "^2.0.0" - -workerpool@6.1.5: - version "6.1.5" - resolved "https://registry.npmmirror.com/workerpool/download/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" - integrity sha1-D3zwdrYhX9fh2pA/9vIt3RiGtYE= - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmmirror.com/wrap-ansi/download/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM= - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmmirror.com/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -ws@^7.5.5: - version "7.5.6" - resolved "https://registry.npmmirror.com/ws/download/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" - integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmmirror.com/y18n/download/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU= - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.npmmirror.com/yallist/download/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-20.2.4.tgz?cache=0&sync_timestamp=1637031026741&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha1-tCiQ8UVmeW+Fro46JSkNIF8VSlQ= - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-20.2.9.tgz?cache=0&sync_timestamp=1637031026741&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha1-LrfcOwKJcY/ClfNidThFxBoMlO4= - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/yargs-unparser/download/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha1-8TH5ImkRrl2a04xDL+gJNmwjJes= - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.npmmirror.com/yargs/download/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha1-HIK/D2tqZur85+8w43b0mhJHf2Y= - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/yn/download/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha1-HodAGgnXZ8HV6rJqbkwYUYLS61A= - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmmirror.com/yocto-queue/download/yocto-queue-0.1.0.tgz?cache=0&sync_timestamp=1632753523520&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyocto-queue%2Fdownload%2Fyocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha1-ApTrPe4FAo0x7hpfosVWpqrxChs= diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d.meta b/examples/cocos-creator-multiplayer/frontend/assets/3d.meta new file mode 100644 index 0000000..d69ad17 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/3d.meta @@ -0,0 +1,12 @@ +{ + "ver": "1.1.0", + "importer": "directory", + "imported": true, + "uuid": "5ee75bff-6095-4266-a58b-9e215bf1e0a9", + "files": [], + "subMetas": {}, + "userData": { + "compressionType": {}, + "isRemoteBundle": {} + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d/map.meta b/examples/cocos-creator-multiplayer/frontend/assets/3d/map.meta new file mode 100644 index 0000000..04b8f79 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/3d/map.meta @@ -0,0 +1,12 @@ +{ + "ver": "1.1.0", + "importer": "directory", + "imported": true, + "uuid": "b0e73381-3db4-43a8-8dc3-7b6ba4dfcaf5", + "files": [], + "subMetas": {}, + "userData": { + "compressionType": {}, + "isRemoteBundle": {} + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.FBX b/examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.FBX new file mode 100644 index 0000000000000000000000000000000000000000..c4e3b47745bb9c842d151358ee266b05e1fcb0d4 GIT binary patch literal 54240 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

s?G`8^wnu9PYR9zq*MHlce?=8SY*yteb1OId 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 Y|Nlx$w?pp@PdfhD4(H_N;Nk?t?)bvZEgh{r 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�-&S1GgPVXouss2M$%_&rw?;P`(YZBE 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 L`We%cy}|zj!txQS literal 0 HcmV?d00001 diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.jpg.meta b/examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.jpg.meta new file mode 100644 index 0000000..59e0cf5 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.jpg.meta @@ -0,0 +1,41 @@ +{ + "ver": "1.0.21", + "importer": "image", + "imported": true, + "uuid": "27e1fcb7-5016-4252-8c43-ac9c1c97308e", + "files": [ + ".jpg", + ".json" + ], + "subMetas": { + "6c48a": { + "ver": "1.0.21", + "importer": "texture", + "uuid": "27e1fcb7-5016-4252-8c43-ac9c1c97308e@6c48a", + "imported": true, + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "wrapModeS": "repeat", + "wrapModeT": "repeat", + "minfilter": "linear", + "magfilter": "linear", + "mipfilter": "none", + "premultiplyAlpha": false, + "anisotropy": 0, + "isUuid": true, + "imageUuidOrDatabaseUri": "27e1fcb7-5016-4252-8c43-ac9c1c97308e" + }, + "displayName": "newMap01", + "id": "6c48a", + "name": "texture" + } + }, + "userData": { + "type": "texture", + "redirect": "27e1fcb7-5016-4252-8c43-ac9c1c97308e@6c48a", + "hasAlpha": false + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.mtl b/examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.mtl new file mode 100644 index 0000000..a2ea13c --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.mtl @@ -0,0 +1,55 @@ +{ + "__type__": "cc.Material", + "_name": "", + "_objFlags": 0, + "_native": "", + "_effectAsset": { + "__uuid__": "1baf0fc9-befa-459c-8bdd-af1a450a0319" + }, + "_techIdx": 0, + "_defines": [ + { + "USE_ALBEDO_MAP": true, + "ROUGHNESS_CHANNEL": "g", + "METALLIC_CHANNEL": "b", + "OCCLUSION_CHANNEL": "r" + } + ], + "_states": [ + { + "blendState": { + "targets": [ + {} + ] + }, + "depthStencilState": {}, + "rasterizerState": {} + } + ], + "_props": [ + { + "albedoScale": { + "__type__": "cc.Vec4", + "x": 1, + "y": 1, + "z": 1, + "w": 1 + }, + "pbrScale": { + "__type__": "cc.Vec4", + "x": 1, + "y": 0.242535620927811, + "z": 0.400000005960464, + "w": 1 + }, + "alphaThreshold": 1, + "normalStrenth": 1, + "mainTexture": { + "__uuid__": "27e1fcb7-5016-4252-8c43-ac9c1c97308e@6c48a" + }, + "occlusion": 1, + "roughness": 0.242535620927811, + "metallic": 0.400000005960464 + } + ] +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.mtl.meta b/examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.mtl.meta new file mode 100644 index 0000000..36d1e1c --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/3d/map/newMap01.mtl.meta @@ -0,0 +1,11 @@ +{ + "ver": "1.0.9", + "importer": "material", + "imported": true, + "uuid": "b7d6d595-6cd1-43c6-8bc7-3a92644870b9", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": {} +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier.meta b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier.meta new file mode 100644 index 0000000..4058be8 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier.meta @@ -0,0 +1,12 @@ +{ + "ver": "1.1.0", + "importer": "directory", + "imported": true, + "uuid": "b62bf789-093f-4583-8530-86e00cd8a2a6", + "files": [], + "subMetas": {}, + "userData": { + "compressionType": {}, + "isRemoteBundle": {} + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/blue.mtl b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/blue.mtl new file mode 100644 index 0000000..85eb1c6 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/blue.mtl @@ -0,0 +1,48 @@ +{ + "__type__": "cc.Material", + "_name": "", + "_objFlags": 0, + "_native": "", + "_effectAsset": { + "__uuid__": "1baf0fc9-befa-459c-8bdd-af1a450a0319", + "__expectedType__": "cc.EffectAsset" + }, + "_techIdx": 0, + "_defines": [ + { + "USE_INSTANCING": true, + "USE_ALBEDO_MAP": true + }, + {}, + {}, + {} + ], + "_states": [ + { + "rasterizerState": {}, + "depthStencilState": {}, + "blendState": { + "targets": [ + {} + ] + } + }, + {}, + {}, + {} + ], + "_props": [ + { + "alphaThreshold": 0, + "roughness": 0.70710676908493, + "metallic": 0.400000005960464, + "mainTexture": { + "__uuid__": "e90ad74a-b668-4e2c-bf91-51a2a91b02aa@6c48a", + "__expectedType__": "cc.Texture2D" + } + }, + {}, + {}, + {} + ] +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/blue.mtl.meta b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/blue.mtl.meta new file mode 100644 index 0000000..7e4e674 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/blue.mtl.meta @@ -0,0 +1,11 @@ +{ + "ver": "1.0.9", + "importer": "material", + "imported": true, + "uuid": "225b969b-eb6a-4489-a5a5-08efbcf38b0e", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": {} +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/red.mtl b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/red.mtl new file mode 100644 index 0000000..826c11e --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/red.mtl @@ -0,0 +1,48 @@ +{ + "__type__": "cc.Material", + "_name": "", + "_objFlags": 0, + "_native": "", + "_effectAsset": { + "__uuid__": "1baf0fc9-befa-459c-8bdd-af1a450a0319", + "__expectedType__": "cc.EffectAsset" + }, + "_techIdx": 0, + "_defines": [ + { + "USE_INSTANCING": true, + "USE_ALBEDO_MAP": true + }, + {}, + {}, + {} + ], + "_states": [ + { + "rasterizerState": {}, + "depthStencilState": {}, + "blendState": { + "targets": [ + {} + ] + } + }, + {}, + {}, + {} + ], + "_props": [ + { + "alphaThreshold": 0, + "roughness": 0.70710676908493, + "metallic": 0.400000005960464, + "mainTexture": { + "__uuid__": "f35bcb71-cd72-443c-94a9-5482c2d63d66@6c48a", + "__expectedType__": "cc.Texture2D" + } + }, + {}, + {}, + {} + ] +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/red.mtl.meta b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/red.mtl.meta new file mode 100644 index 0000000..9602215 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/red.mtl.meta @@ -0,0 +1,11 @@ +{ + "ver": "1.0.9", + "importer": "material", + "imported": true, + "uuid": "411ae6be-9581-422b-9425-36c8e71651cb", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": {} +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier01.FBX b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier01.FBX new file mode 100644 index 0000000000000000000000000000000000000000..3774d4483d8c4e255f71bd1ad1e9a81355dbac99 GIT binary patch literal 173376 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 z�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 a_&+}P)bEF$NsmsCzJ2r4%Y$Z=&hmfQLSWbc literal 0 HcmV?d00001 diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier01.FBX.meta b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier01.FBX.meta new file mode 100644 index 0000000..6be8c4b --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier01.FBX.meta @@ -0,0 +1,312 @@ +{ + "ver": "2.1.4", + "importer": "fbx", + "imported": true, + "uuid": "57d4c4ef-3199-4596-bf79-7c065964ca9c", + "files": [ + "__original-animation-0.cconb" + ], + "subMetas": { + "95953": { + "importer": "gltf-material", + "uuid": "57d4c4ef-3199-4596-bf79-7c065964ca9c@95953", + "displayName": "", + "id": "95953", + "name": "Material #7.material", + "userData": { + "gltfIndex": 0 + }, + "ver": "1.0.14", + "imported": true, + "files": [ + ".json" + ], + "subMetas": {} + }, + "6868c": { + "importer": "gltf-mesh", + "uuid": "57d4c4ef-3199-4596-bf79-7c065964ca9c@6868c", + "displayName": "", + "id": "6868c", + "name": "soldier01.mesh", + "userData": { + "gltfIndex": 0 + }, + "ver": "1.1.0", + "imported": true, + "files": [ + ".bin", + ".json" + ], + "subMetas": {} + }, + "1f586": { + "importer": "gltf-animation", + "uuid": "57d4c4ef-3199-4596-bf79-7c065964ca9c@1f586", + "displayName": "", + "id": "1f586", + "name": "idle.animation", + "userData": { + "gltfIndex": 0, + "wrapMode": 2, + "sample": 30, + "span": { + "from": 0, + "to": 0.8 + }, + "events": [] + }, + "ver": "1.0.16", + "imported": true, + "files": [ + ".cconb" + ], + "subMetas": {} + }, + "cf5ee": { + "importer": "gltf-animation", + "uuid": "57d4c4ef-3199-4596-bf79-7c065964ca9c@cf5ee", + "displayName": "", + "id": "cf5ee", + "name": "run.animation", + "userData": { + "gltfIndex": 0, + "wrapMode": 2, + "sample": 60, + "span": { + "from": 0.8, + "to": 1.5 + }, + "events": [] + }, + "ver": "1.0.16", + "imported": true, + "files": [ + ".cconb" + ], + "subMetas": {} + }, + "989ed": { + "importer": "gltf-animation", + "uuid": "57d4c4ef-3199-4596-bf79-7c065964ca9c@989ed", + "displayName": "", + "id": "989ed", + "name": "attack.animation", + "userData": { + "gltfIndex": 0, + "wrapMode": 2, + "sample": 60, + "span": { + "from": 1.5333333333333334, + "to": 2.2 + }, + "events": [ + { + "frame": 0.23333333333333334, + "func": "", + "params": [] + }, + { + "frame": 0.23333333333333334, + "func": "triggerEffect", + "params": [] + } + ], + "speed": 1 + }, + "ver": "1.0.16", + "imported": true, + "files": [ + ".cconb" + ], + "subMetas": {} + }, + "ee525": { + "importer": "gltf-animation", + "uuid": "57d4c4ef-3199-4596-bf79-7c065964ca9c@ee525", + "displayName": "", + "id": "ee525", + "name": "win.animation", + "userData": { + "gltfIndex": 0, + "wrapMode": 2, + "sample": 30, + "span": { + "from": 2.2, + "to": 2.8 + }, + "events": [] + }, + "ver": "1.0.16", + "imported": true, + "files": [ + ".cconb" + ], + "subMetas": {} + }, + "5b2e9": { + "importer": "gltf-animation", + "uuid": "57d4c4ef-3199-4596-bf79-7c065964ca9c@5b2e9", + "displayName": "", + "id": "5b2e9", + "name": "died.animation", + "userData": { + "gltfIndex": 0, + "wrapMode": 2, + "sample": 30, + "span": { + "from": 2.8, + "to": 4.333333333333333 + }, + "events": [] + }, + "ver": "1.0.16", + "imported": true, + "files": [ + ".cconb" + ], + "subMetas": {} + }, + "438fe": { + "importer": "gltf-skeleton", + "uuid": "57d4c4ef-3199-4596-bf79-7c065964ca9c@438fe", + "displayName": "", + "id": "438fe", + "name": "UnnamedSkeleton.skeleton", + "userData": { + "gltfIndex": 0, + "jointsLength": 6 + }, + "ver": "1.0.1", + "imported": true, + "files": [ + ".json" + ], + "subMetas": {} + }, + "fa1d4": { + "importer": "gltf-embeded-image", + "uuid": "57d4c4ef-3199-4596-bf79-7c065964ca9c@fa1d4", + "displayName": "", + "id": "fa1d4", + "name": "soldier01.jpg.image", + "userData": { + "gltfIndex": 0 + }, + "ver": "1.0.3", + "imported": true, + "files": [ + ".jpg", + ".json" + ], + "subMetas": {} + }, + "291d4": { + "importer": "texture", + "uuid": "57d4c4ef-3199-4596-bf79-7c065964ca9c@291d4", + "displayName": "", + "id": "291d4", + "name": "贴图 #6.texture", + "userData": { + "wrapModeS": "repeat", + "wrapModeT": "repeat", + "minfilter": "linear", + "magfilter": "linear", + "mipfilter": "none", + "anisotropy": 0, + "isUuid": true, + "imageUuidOrDatabaseUri": "57d4c4ef-3199-4596-bf79-7c065964ca9c@fa1d4" + }, + "ver": "1.0.21", + "imported": true, + "files": [ + ".json" + ], + "subMetas": {} + }, + "33dba": { + "importer": "gltf-scene", + "uuid": "57d4c4ef-3199-4596-bf79-7c065964ca9c@33dba", + "displayName": "", + "id": "33dba", + "name": "soldier01.prefab", + "userData": { + "gltfIndex": 0 + }, + "ver": "1.0.12", + "imported": true, + "files": [ + ".json" + ], + "subMetas": {} + } + }, + "userData": { + "imageMetas": [ + { + "name": "soldier01.jpg", + "uri": "57d4c4ef-3199-4596-bf79-7c065964ca9c@fa1d4" + } + ], + "animationImportSettings": [ + { + "name": "Take 001", + "duration": 4.666666507720947, + "fps": 30, + "splits": [ + { + "name": "idle", + "from": 0, + "to": 0.8, + "wrapMode": 2 + }, + { + "name": "run", + "from": 0.8, + "to": 1.5, + "fps": 60, + "wrapMode": 2 + }, + { + "name": "attack", + "from": 1.5333333333333334, + "to": 2.2, + "fps": 60, + "wrapMode": 2 + }, + { + "name": "win", + "from": 2.2, + "to": 2.8, + "wrapMode": 2 + }, + { + "name": "died", + "from": 2.8, + "to": 4.333333333333333, + "wrapMode": 2 + } + ] + } + ], + "redirect": "57d4c4ef-3199-4596-bf79-7c065964ca9c@33dba", + "assetFinder": { + "meshes": [ + "57d4c4ef-3199-4596-bf79-7c065964ca9c@6868c" + ], + "skeletons": [ + "57d4c4ef-3199-4596-bf79-7c065964ca9c@438fe" + ], + "textures": [ + "57d4c4ef-3199-4596-bf79-7c065964ca9c@291d4" + ], + "materials": [ + "57d4c4ef-3199-4596-bf79-7c065964ca9c@95953" + ], + "scenes": [ + "57d4c4ef-3199-4596-bf79-7c065964ca9c@33dba" + ] + }, + "legacyFbxImporter": true + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier01.jpg b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..73a07f3f4559dd0a8a1a5c8fa9b2fb46dab3265b GIT binary patch literal 7048 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 literal 0 HcmV?d00001 diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier01.jpg.meta b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier01.jpg.meta new file mode 100644 index 0000000..7007391 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier01.jpg.meta @@ -0,0 +1,41 @@ +{ + "ver": "1.0.21", + "importer": "image", + "imported": true, + "uuid": "e90ad74a-b668-4e2c-bf91-51a2a91b02aa", + "files": [ + ".jpg", + ".json" + ], + "subMetas": { + "6c48a": { + "ver": "1.0.21", + "importer": "texture", + "uuid": "e90ad74a-b668-4e2c-bf91-51a2a91b02aa@6c48a", + "imported": true, + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "wrapModeS": "repeat", + "wrapModeT": "repeat", + "minfilter": "linear", + "magfilter": "linear", + "mipfilter": "none", + "premultiplyAlpha": false, + "anisotropy": 0, + "isUuid": true, + "imageUuidOrDatabaseUri": "e90ad74a-b668-4e2c-bf91-51a2a91b02aa" + }, + "displayName": "soldier01", + "id": "6c48a", + "name": "texture" + } + }, + "userData": { + "type": "texture", + "redirect": "e90ad74a-b668-4e2c-bf91-51a2a91b02aa@6c48a", + "hasAlpha": false + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier02.jpg b/examples/cocos-creator-multiplayer/frontend/assets/3d/soldier/soldier02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0ad1fdd878ab0e44e4eb706b49ddf064d8f92146 GIT binary patch literal 6145 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 { + const roots = director.getScene()?.children as BaseNode[]; + let allCanvases = director.getScene()?.getComponentsInChildren(Canvas) as Canvas[]; + if (allCanvases.length <= 1) return; + allCanvases = allCanvases.filter(x => !!x.cameraComponent); + + let allCameras = director.getScene()?.getComponentsInChildren(Camera) as Camera[]; + let usedLayer = 0; + allCameras.forEach(x => usedLayer |= (x.visibility & customLayerMask)); + + const persistCanvas: Canvas[] = []; + for (let i = 0, l = roots.length; i < l; i++) { + const root = roots[i]; + if (!game.isPersistRootNode(root)) continue; + const canvases = root.getComponentsInChildren(Canvas); + if (canvases.length === 0) continue; + persistCanvas.push(...canvases.filter(x => !!x.cameraComponent)); + } + + persistCanvas.forEach((val) => { + const isLayerCollided = allCanvases.find(x => x !== val && (x.cameraComponent!.visibility & val.cameraComponent!.visibility & customLayerMask)); + if (isLayerCollided) { + const availableLayers = ~usedLayer; + const lastAvailableLayer = availableLayers & ~(availableLayers - 1); + val.cameraComponent!.visibility = lastAvailableLayer | (val.cameraComponent!.visibility & builtinLayerMask); + setChildrenLayer(val.node, lastAvailableLayer); + usedLayer |= availableLayers; + } + }); +}); + +function setChildrenLayer (node: Node, layer: number) { + for (let i = 0, l = node.children.length; i < l; i++) { + node.children[i].layer = layer; + setChildrenLayer(node.children[i], layer); + } +} + +let setParentEngine = Node.prototype.setParent; + +if(!EDITOR) { + Node.prototype.setParent = function(value, keepWorldTransform) { + setParentEngine.call(this, value, keepWorldTransform); + if (!value) return; + // find canvas + let layer = getCanvasCameraLayer(this); + if (layer) { + this.layer = layer; + setChildrenLayer(this, layer); + } + } +} + +function getCanvasCameraLayer (node: Node) { + let layer = 0; + let canvas = node.getComponent(Canvas); + if (canvas && canvas.cameraComponent) { + if (canvas.cameraComponent.visibility & canvas.node.layer) { + layer = canvas.node.layer; + } else { + layer = canvas.cameraComponent.visibility & ~(canvas.cameraComponent.visibility - 1); + } + return layer; + } + if (node.parent) { + layer = getCanvasCameraLayer(node.parent); + } + return layer; +} \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/frontend/assets/migrate-canvas.ts.meta b/examples/cocos-creator-multiplayer/frontend/assets/migrate-canvas.ts.meta new file mode 100644 index 0000000..41d440f --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/migrate-canvas.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.22", + "importer": "typescript", + "imported": true, + "uuid": "3f14173e-54a7-423d-9c22-0efe5a1c634f", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/prefabs.meta b/examples/cocos-creator-multiplayer/frontend/assets/prefabs.meta new file mode 100644 index 0000000..a4582ae --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/prefabs.meta @@ -0,0 +1,12 @@ +{ + "ver": "1.1.0", + "importer": "directory", + "imported": true, + "uuid": "0b89f62b-f696-4a77-809d-aa85c3178bf2", + "files": [], + "subMetas": {}, + "userData": { + "compressionType": {}, + "isRemoteBundle": {} + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick.meta b/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick.meta new file mode 100644 index 0000000..dce83f5 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick.meta @@ -0,0 +1,12 @@ +{ + "ver": "1.1.0", + "importer": "directory", + "imported": true, + "uuid": "dfd416a2-ba3c-49d2-8200-2ed5fcd41292", + "files": [], + "subMetas": {}, + "userData": { + "compressionType": {}, + "isRemoteBundle": {} + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.prefab b/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.prefab new file mode 100644 index 0000000..d283edc --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.prefab @@ -0,0 +1,511 @@ +[ + { + "__type__": "cc.Prefab", + "_name": "", + "_objFlags": 0, + "_native": "", + "data": { + "__id__": 1 + }, + "optimizationPolicy": 0, + "asyncLoadAssets": false + }, + { + "__type__": "cc.Node", + "_name": "Joystick", + "_objFlags": 0, + "_parent": null, + "_children": [ + { + "__id__": 2 + } + ], + "_active": true, + "_components": [ + { + "__id__": 18 + }, + { + "__id__": 20 + }, + { + "__id__": 22 + } + ], + "_prefab": { + "__id__": 24 + }, + "_lpos": { + "__type__": "cc.Vec3", + "x": -480, + "y": -320, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_layer": 524288, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "disk", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 3 + }, + { + "__id__": 9 + } + ], + "_active": true, + "_components": [ + { + "__id__": 15 + } + ], + "_prefab": { + "__id__": 17 + }, + "_lpos": { + "__type__": "cc.Vec3", + "x": 299.003, + "y": 440.043, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_layer": 524288, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "base", + "_objFlags": 0, + "_parent": { + "__id__": 2 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 4 + }, + { + "__id__": 6 + } + ], + "_prefab": { + "__id__": 8 + }, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_layer": 524288, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 3 + }, + "_enabled": true, + "__prefab": { + "__id__": 5 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 256, + "height": 256 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "daHOQp4LdBFoenok+XY1Zo" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 3 + }, + "_enabled": true, + "__prefab": { + "__id__": 7 + }, + "_visFlags": 0, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 40 + }, + "_spriteFrame": { + "__uuid__": "521ad970-c5d9-4d2d-af6f-cc08f94230f8@f9941", + "__expectedType__": "cc.SpriteFrame" + }, + "_type": 0, + "_fillType": 0, + "_sizeMode": 1, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_useGrayscale": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "b4yQwCjWpMRZUnITwiaJW8" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "99DpUW4QRIJ4zS/1nooi0x" + }, + { + "__type__": "cc.Node", + "_name": "stick", + "_objFlags": 0, + "_parent": { + "__id__": 2 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 10 + }, + { + "__id__": 12 + } + ], + "_prefab": { + "__id__": 14 + }, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 0.238, + "y": 0.238, + "z": 0.238 + }, + "_layer": 524288, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 9 + }, + "_enabled": true, + "__prefab": { + "__id__": 11 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 256, + "height": 256 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "7fgMfPZ3pIZ72y8mESbyAp" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 9 + }, + "_enabled": true, + "__prefab": { + "__id__": 13 + }, + "_visFlags": 0, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 200 + }, + "_spriteFrame": { + "__uuid__": "521ad970-c5d9-4d2d-af6f-cc08f94230f8@f9941", + "__expectedType__": "cc.SpriteFrame" + }, + "_type": 0, + "_fillType": 0, + "_sizeMode": 1, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_useGrayscale": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "d8pnWua/5KaYBq0ggPBL1Y" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "ceQ/tc9/lBPIsW1Hwyb91a" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 2 + }, + "_enabled": true, + "__prefab": { + "__id__": 16 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 256, + "height": 256 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "f8l1UBgYFPm7f/KMYDjdJo" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "d0wZ2A2kRHRL52JXTqW2TD" + }, + { + "__type__": "cc.UITransform", + "_name": "Joystick", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "__prefab": { + "__id__": 19 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 960, + "height": 640 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "03ZUWxyGxEKrRNfAAZAjfl" + }, + { + "__type__": "cc.Widget", + "_name": "Joystick", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "__prefab": { + "__id__": 21 + }, + "_alignFlags": 45, + "_target": null, + "_left": 0, + "_right": 0, + "_top": 0, + "_bottom": 0, + "_horizontalCenter": 0, + "_verticalCenter": 0, + "_isAbsLeft": true, + "_isAbsRight": true, + "_isAbsTop": true, + "_isAbsBottom": true, + "_isAbsHorizontalCenter": true, + "_isAbsVerticalCenter": true, + "_originalWidth": 40, + "_originalHeight": 36, + "_alignMode": 2, + "_lockFlags": 0, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "dfw8DiwVhOMqNxW3/MvA/u" + }, + { + "__type__": "ccc7fTjElVEQqB07I1JvC+N", + "_name": "Joystick", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "__prefab": { + "__id__": 23 + }, + "radius": 128, + "disk": { + "__id__": 2 + }, + "stick": { + "__id__": 9 + }, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "b6/h8KXgpAI6dQQRwusaRr" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "25fHuwytBN2qk6dH5oVJvO" + } +] \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.prefab.meta b/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.prefab.meta new file mode 100644 index 0000000..7a76768 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.prefab.meta @@ -0,0 +1,13 @@ +{ + "ver": "1.1.32", + "importer": "prefab", + "imported": true, + "uuid": "0363f7f8-204e-410e-ade0-03adca6ea835", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "syncNodeName": "Joystick" + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.ts b/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.ts new file mode 100644 index 0000000..adda17b --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.ts @@ -0,0 +1,90 @@ +import { _decorator, Component, Node, EventTouch, tween, Vec2, Vec3 } from 'cc'; +import { MathUtil } from '../../../scripts/models/MathUtil'; +const { ccclass, property } = _decorator; + +const v3_1 = new Vec3; +const v3_2 = new Vec3; + +export interface JoystickOptions { + onOperate: (output: JoystickOutput) => void, + onOperateEnd: () => void, +} + +export interface JoystickOutput { + // 0 ~ 1 + x: number, + // 0 ~ 1 + y: number +} + +@ccclass('Joystick') +export class Joystick extends Component { + + @property + radius: number = 128; + + @property(Node) + disk: Node = null as any; + + @property(Node) + stick: Node = null as any; + + + private _options!: JoystickOptions; + public get options(): JoystickOptions { + return this._options; + } + public set options(v: JoystickOptions) { + this._options = v; + } + + + onLoad() { + this.node.on(Node.EventType.TOUCH_START, this.onTouch, this); + this.node.on(Node.EventType.TOUCH_MOVE, this.onTouch, this); + this.node.on(Node.EventType.TOUCH_END, this.onTouchEnd, this); + + this.disk.active = false; + } + + private _touchStartPos?: Vec2; + onTouch(e: EventTouch) { + this.disk.active = true; + let loc = e.touch.getUILocation(); + + if (!this._touchStartPos) { + this._touchStartPos = loc.clone(); + this.disk.setPosition(loc.x, loc.y, 0); + } + + let diskPos = this.disk.position; + + let stickPos: Vec3 = v3_1.set(loc.x - diskPos.x, loc.y - diskPos.y, 0); + let length = stickPos.length(); + if (length === 0) { + this.stick.setPosition(0, 0, 0); + return; + } + let newLength = MathUtil.limit(length, 0, this.radius); + stickPos.multiplyScalar(newLength / length); + + // if (length > newLength) { + // let newDiskPos = this.disk.position.clone().add(stickPos); + // this.disk.setPosition(newDiskPos); + // } + this.stick.setPosition(stickPos); + + stickPos.normalize(); + this.options?.onOperate({ + x: stickPos.x || 0, + y: stickPos.y || 0 + }) + } + + onTouchEnd(e: EventTouch) { + this.disk.active = false; + this._touchStartPos = undefined; + this.options?.onOperateEnd(); + } + +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.ts.meta b/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.ts.meta new file mode 100644 index 0000000..ba14ee9 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Joystick/Joystick.ts.meta @@ -0,0 +1,13 @@ +{ + "ver": "4.0.22", + "importer": "typescript", + "imported": true, + "uuid": "ccc7f4e3-1255-4442-a074-ec8d49bc2f8d", + "files": [], + "subMetas": {}, + "userData": { + "importAsPlugin": false, + "moduleId": "project:///assets/scenes/GameScene/scripts/Joystick.js", + "simulateGlobals": [] + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Soldier.meta b/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Soldier.meta new file mode 100644 index 0000000..b101e75 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/prefabs/Soldier.meta @@ -0,0 +1,12 @@ +{ + "ver": "1.1.0", + "importer": "directory", + "imported": true, + "uuid": "ceb8a41c-a457-4ec0-b9a3-f02af963096e", + "files": [], + "subMetas": {}, + "userData": { + "compressionType": {}, + "isRemoteBundle": {} + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/scenes.meta b/examples/cocos-creator-multiplayer/frontend/assets/scenes.meta new file mode 100644 index 0000000..5302778 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/scenes.meta @@ -0,0 +1,12 @@ +{ + "ver": "1.1.0", + "importer": "directory", + "imported": true, + "uuid": "b27b7c33-0d34-4728-84cb-cd4dae339cbd", + "files": [], + "subMetas": {}, + "userData": { + "compressionType": {}, + "isRemoteBundle": {} + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/scenes/GameScene.meta b/examples/cocos-creator-multiplayer/frontend/assets/scenes/GameScene.meta new file mode 100644 index 0000000..d4eaab1 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/scenes/GameScene.meta @@ -0,0 +1,12 @@ +{ + "ver": "1.1.0", + "importer": "directory", + "imported": true, + "uuid": "c9e83364-8449-4378-8949-7580d6c2e980", + "files": [], + "subMetas": {}, + "userData": { + "compressionType": {}, + "isRemoteBundle": {} + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/scenes/GameScene/GameScene.scene b/examples/cocos-creator-multiplayer/frontend/assets/scenes/GameScene/GameScene.scene new file mode 100644 index 0000000..9800ca9 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/scenes/GameScene/GameScene.scene @@ -0,0 +1,1128 @@ +[ + { + "__type__": "cc.SceneAsset", + "_name": "", + "_objFlags": 0, + "_native": "", + "scene": { + "__id__": 1 + } + }, + { + "__type__": "cc.Scene", + "_name": "GameScene", + "_objFlags": 0, + "_parent": null, + "_children": [ + { + "__id__": 2 + }, + { + "__id__": 5 + }, + { + "__id__": 7 + }, + { + "__id__": 15 + } + ], + "_active": true, + "_components": [], + "_prefab": null, + "autoReleaseAssets": false, + "_globals": { + "__id__": 33 + }, + "_id": "0d3889f6-dc9c-424e-b8cd-6fa78d63af15" + }, + { + "__type__": "cc.Node", + "_name": "Main Light", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 3 + } + ], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": -0.24999999999999997, + "y": -0.24999999999999997, + "z": -0.06698729810778066, + "w": 0.9330127018922194 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": -30, + "y": -30, + "z": 0 + }, + "_id": "c0y6F5f+pAvI805TdmxIjx" + }, + { + "__type__": "cc.DirectionalLight", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 2 + }, + "_enabled": true, + "__prefab": null, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_useColorTemperature": false, + "_colorTemperature": 6550, + "_staticSettings": { + "__id__": 4 + }, + "_illuminance": 100000, + "_id": "597uMYCbhEtJQc0ffJlcgA" + }, + { + "__type__": "cc.StaticLightSettings", + "_baked": false, + "_editorOnly": false, + "_bakeable": false, + "_castShadow": false + }, + { + "__type__": "cc.Node", + "_name": "Main Camera", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 6 + } + ], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": -10, + "y": 10, + "z": 10 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": -0.27781593346944056, + "y": -0.36497167621709875, + "z": -0.11507512748638377, + "w": 0.8811195706053617 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": -35, + "y": -45, + "z": 0 + }, + "_id": "c9DMICJLFO5IeO07EPon7U" + }, + { + "__type__": "cc.Camera", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 5 + }, + "_enabled": true, + "__prefab": null, + "_projection": 1, + "_priority": 0, + "_fov": 45, + "_fovAxis": 0, + "_orthoHeight": 10, + "_near": 1, + "_far": 1000, + "_color": { + "__type__": "cc.Color", + "r": 51, + "g": 51, + "b": 51, + "a": 255 + }, + "_depth": 1, + "_stencil": 0, + "_clearFlags": 7, + "_rect": { + "__type__": "cc.Rect", + "x": 0, + "y": 0, + "width": 1, + "height": 1 + }, + "_aperture": 19, + "_shutter": 7, + "_iso": 0, + "_screenScale": 1, + "_visibility": 1822425087, + "_targetTexture": null, + "_id": "7dWQTpwS5LrIHnc1zAPUtf" + }, + { + "__type__": "cc.Node", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_prefab": { + "__id__": 8 + } + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 7 + }, + "asset": { + "__uuid__": "c26a63b9-5039-47ae-b027-ef2bce881f6f@fc11b", + "__expectedType__": "cc.Prefab" + }, + "fileId": "2cyg9D4KRTnaWvFuyUcwrn", + "instance": { + "__id__": 9 + } + }, + { + "__type__": "cc.PrefabInstance", + "fileId": "b9eQ3gXWlMR4eNhYoDs3g8", + "mountedChildren": [], + "mountedComponents": [], + "propertyOverrides": [ + { + "__id__": 10 + }, + { + "__id__": 12 + }, + { + "__id__": 13 + }, + { + "__id__": 14 + } + ], + "removedComponents": [] + }, + { + "__type__": "CCPropertyOverrideInfo", + "targetInfo": { + "__id__": 11 + }, + "propertyPath": [ + "_name" + ], + "value": "Map" + }, + { + "__type__": "cc.TargetInfo", + "localID": [ + "2cyg9D4KRTnaWvFuyUcwrn" + ] + }, + { + "__type__": "CCPropertyOverrideInfo", + "targetInfo": { + "__id__": 11 + }, + "propertyPath": [ + "_lpos" + ], + "value": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + } + }, + { + "__type__": "CCPropertyOverrideInfo", + "targetInfo": { + "__id__": 11 + }, + "propertyPath": [ + "_lrot" + ], + "value": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + } + }, + { + "__type__": "CCPropertyOverrideInfo", + "targetInfo": { + "__id__": 11 + }, + "propertyPath": [ + "_euler" + ], + "value": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + } + }, + { + "__type__": "cc.Node", + "_name": "players", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 16 + } + ], + "_active": true, + "_components": [], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "e9eZdnhcBMlJbRHxB2KaB4" + }, + { + "__type__": "cc.Node", + "_name": "Soldier", + "_objFlags": 0, + "_parent": { + "__id__": 15 + }, + "_children": [ + { + "__id__": 17 + } + ], + "_active": true, + "_components": [ + { + "__id__": 32 + } + ], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0.941, + "y": 0, + "z": -0.76 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "ebyWCPQhZMyLIE8q8DzQ3L" + }, + { + "__type__": "cc.Node", + "_name": "RootNode", + "_objFlags": 0, + "_parent": { + "__id__": 16 + }, + "_children": [ + { + "__id__": 18 + }, + { + "__id__": 25 + }, + { + "__id__": 26 + }, + { + "__id__": 27 + }, + { + "__id__": 30 + }, + { + "__id__": 31 + } + ], + "_active": true, + "_components": [], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "b1SPz5a7NMd4JcacHxKGsn" + }, + { + "__type__": "cc.Node", + "_name": "Dummy01", + "_objFlags": 0, + "_parent": { + "__id__": 17 + }, + "_children": [ + { + "__id__": 19 + }, + { + "__id__": 21 + }, + { + "__id__": 22 + }, + { + "__id__": 23 + }, + { + "__id__": 24 + } + ], + "_active": true, + "_components": [], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 4.31247441140831e-32, + "z": 2.27106511374586e-9 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 8.146034247147302e-8, + "y": 0, + "z": 0, + "w": 0.9999999999999967 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 2.53999996185303, + "y": 2.53999996185303, + "z": 2.53999996185303 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": 0.000009334667642611398, + "y": 0, + "z": 0 + }, + "_id": "63UEIV8jVH6JFCmENPuLUg" + }, + { + "__type__": "cc.Node", + "_name": "Body", + "_objFlags": 0, + "_parent": { + "__id__": 18 + }, + "_children": [ + { + "__id__": 20 + } + ], + "_active": true, + "_components": [], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": -0.000466376630356535, + "y": 0.0555356666445732, + "z": -4.76837147544984e-9 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0.0000013147252531426701, + "y": 5.898311123805427e-7, + "z": 0.7037748466382776, + "w": 0.7104230888964633 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 0.256809949874878, + "y": 0.439815044403076, + "z": 0.0870304778218269 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": 0.006324434041980695, + "y": -0.006170109051330866, + "z": 89.46130112452344 + }, + "_id": "c3Kc0wgrVLqLDbm0JqXiO4" + }, + { + "__type__": "cc.Node", + "_name": "head", + "_objFlags": 0, + "_parent": { + "__id__": 19 + }, + "_children": [], + "_active": true, + "_components": [], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0.931041061878204, + "y": -1.62124635494365e-7, + "z": 1.28416282052513e-8 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": -0.000007869318285142453, + "y": -2.023334521019378e-7, + "z": -0.001340885290760051, + "w": 0.9999991009819308 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1.24272096157074, + "y": 1.03568971157074, + "z": 1.0696634054184 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": -0.0009017909722726095, + "y": -0.00002439492589956044, + "z": -0.15365418180060705 + }, + "_id": "b5X2VEA8RGd4hx8OiMzv/Z" + }, + { + "__type__": "cc.Node", + "_name": "legRight", + "_objFlags": 0, + "_parent": { + "__id__": 18 + }, + "_children": [], + "_active": true, + "_components": [], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": -0.15381583571434, + "y": 0.0330642610788345, + "z": -4.76837147544984e-9 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0.6775014926325843, + "y": 0.20089959890094192, + "z": 0.6787423421146606, + "w": -0.19984972269874676 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 0.184104666113853, + "y": 0.347824722528458, + "z": 0.0710852295160294 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": -147.07673505109858, + "y": -90.12052935501679, + "z": 0.05309133906220757 + }, + "_id": "e1fluQIndNObRTN+XQDXHF" + }, + { + "__type__": "cc.Node", + "_name": "legLeft", + "_objFlags": 0, + "_parent": { + "__id__": 18 + }, + "_children": [], + "_active": true, + "_components": [], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0.150058135390282, + "y": 0.0330642610788345, + "z": -1.43051144263495e-8 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0.6356643535110694, + "y": 0.3106639432517853, + "z": 0.635291228429095, + "w": -0.3095541941561399 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 0.184104397892952, + "y": 0.347825288772583, + "z": 0.0710852593183517 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": -127.97583425594252, + "y": -90.01226481486562, + "z": 0.09407173384696697 + }, + "_id": "68iMhCIVZK+7BrYtACLsh8" + }, + { + "__type__": "cc.Node", + "_name": "handRight", + "_objFlags": 0, + "_parent": { + "__id__": 18 + }, + "_children": [], + "_active": true, + "_components": [], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": -0.204364582896233, + "y": 0.240019470453262, + "z": -1.90734859017994e-8 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": -0.00043949465228992625, + "y": -0.00002823252593632647, + "z": 0.9849262411574669, + "w": -0.17297429151986207 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 0.184104412794113, + "y": 0.347825288772583, + "z": 0.07108523696661 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": 179.9873448759303, + "y": 179.94664434517173, + "z": -19.921588202819525 + }, + "_id": "7bTKOHx6JFo6TQB1hhAXLX" + }, + { + "__type__": "cc.Node", + "_name": "handLeft", + "_objFlags": 0, + "_parent": { + "__id__": 18 + }, + "_children": [], + "_active": true, + "_components": [], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0.203091412782669, + "y": 0.240019470453262, + "z": -1.90734859017994e-8 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": -0.00001006337055508986, + "y": -0.0003337875805372209, + "z": -0.17397424484232848, + "w": 0.9847501462889564 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 0.184104338288307, + "y": 0.347825139760971, + "z": 0.0710852667689323 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": -0.008291917560534557, + "y": -0.04030648567970078, + "z": -20.037940451355507 + }, + "_id": "0cvPWKogRPMoUakKiazJUx" + }, + { + "__type__": "cc.Node", + "_name": "Bip001", + "_objFlags": 0, + "_parent": { + "__id__": 17 + }, + "_children": [], + "_active": true, + "_components": [], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": -2.95868706703186, + "y": 0.568015873432159, + "z": 2.59012746810913 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": -0.5000003129242964, + "y": -0.49999968707550774, + "z": -0.49999968707550774, + "w": 0.5000003129242964 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 6.45159912109375, + "y": 6.45159912109375, + "z": 6.45160007476807 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": -90, + "y": -89.99992828301158, + "z": 0 + }, + "_id": "31vrZWcK9HRp5vyFtVjdDB" + }, + { + "__type__": "cc.Node", + "_name": "mixamorig:HeadTop_End", + "_objFlags": 0, + "_parent": { + "__id__": 17 + }, + "_children": [], + "_active": true, + "_components": [], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": -12.6684627532959, + "y": 2.27624535560608, + "z": -0.396418631076813 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0.07992084217915124, + "y": 0.35555240038341984, + "z": 0.03850968875854815, + "w": 0.9304365391786178 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 65.5876159667969, + "y": 65.5876617431641, + "z": 65.587646484375 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": 7.027884698082062, + "y": 41.37325087834414, + "z": 7.382559841159056 + }, + "_id": "94wDRuucREC4GyndIAbp/E" + }, + { + "__type__": "cc.Node", + "_name": "soldier01", + "_objFlags": 0, + "_parent": { + "__id__": 17 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 28 + } + ], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": -0.7071067811865476, + "y": 0, + "z": 0, + "w": 0.7071067811865476 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 2.53999996185303, + "y": 2.53999996185303, + "z": 2.53999996185303 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": -90.00000000000003, + "y": 0, + "z": 0 + }, + "_id": "af/w/4nmxBA7EI7p6SWLJ+" + }, + { + "__type__": "cc.SkinnedMeshRenderer", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 27 + }, + "_enabled": true, + "__prefab": null, + "_materials": [ + { + "__uuid__": "57d4c4ef-3199-4596-bf79-7c065964ca9c@95953", + "__expectedType__": "cc.Material" + } + ], + "_visFlags": 0, + "lightmapSettings": { + "__id__": 29 + }, + "_mesh": { + "__uuid__": "57d4c4ef-3199-4596-bf79-7c065964ca9c@6868c", + "__expectedType__": "cc.Mesh" + }, + "_shadowCastingMode": 0, + "_shadowReceivingMode": 1, + "_enableMorph": true, + "_skeleton": { + "__uuid__": "57d4c4ef-3199-4596-bf79-7c065964ca9c@438fe", + "__expectedType__": "cc.Skeleton" + }, + "_skinningRoot": { + "__id__": 16 + }, + "_id": "30YHOawqJAk45mqt1Kv4o4" + }, + { + "__type__": "cc.ModelLightmapSettings", + "texture": null, + "uvParam": { + "__type__": "cc.Vec4", + "x": 0, + "y": 0, + "z": 0, + "w": 0 + }, + "_bakeable": false, + "_castShadow": false, + "_receiveShadow": false, + "_recieveShadow": false, + "_lightmapSize": 64 + }, + { + "__type__": "cc.Node", + "_name": "Bip001(__autogen 4)", + "_objFlags": 0, + "_parent": { + "__id__": 17 + }, + "_children": [], + "_active": true, + "_components": [], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 9.61940002441406, + "y": 0.568015873432159, + "z": 1.51320099830627 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": -0.5000003129242964, + "y": -0.49999968707550774, + "z": -0.49999968707550774, + "w": 0.5000003129242964 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 6.45159912109375, + "y": 6.45159912109375, + "z": 6.45160007476807 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": -90, + "y": -89.99992828301158, + "z": 0 + }, + "_id": "c9relHXCxD8buEcxdgkJHW" + }, + { + "__type__": "cc.Node", + "_name": "mixamorig:HeadTop_End(__autogen 5)", + "_objFlags": 0, + "_parent": { + "__id__": 17 + }, + "_children": [], + "_active": true, + "_components": [], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": -0.0903754904866219, + "y": 2.27624559402466, + "z": -1.47334516048431 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0.07992084217915124, + "y": 0.35555240038341984, + "z": 0.03850968875854815, + "w": 0.9304365391786178 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 65.5876159667969, + "y": 65.5876617431641, + "z": 65.587646484375 + }, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": 7.027884698082062, + "y": 41.37325087834414, + "z": 7.382559841159056 + }, + "_id": "18OPyREQRP0bZHBbgBDM0L" + }, + { + "__type__": "cc.SkeletalAnimation", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 16 + }, + "_enabled": true, + "__prefab": null, + "playOnLoad": false, + "_clips": [ + { + "__uuid__": "57d4c4ef-3199-4596-bf79-7c065964ca9c@1f586", + "__expectedType__": "cc.AnimationClip" + }, + { + "__uuid__": "57d4c4ef-3199-4596-bf79-7c065964ca9c@cf5ee", + "__expectedType__": "cc.AnimationClip" + }, + { + "__uuid__": "57d4c4ef-3199-4596-bf79-7c065964ca9c@989ed", + "__expectedType__": "cc.AnimationClip" + }, + { + "__uuid__": "57d4c4ef-3199-4596-bf79-7c065964ca9c@ee525", + "__expectedType__": "cc.AnimationClip" + }, + { + "__uuid__": "57d4c4ef-3199-4596-bf79-7c065964ca9c@5b2e9", + "__expectedType__": "cc.AnimationClip" + } + ], + "_defaultClip": { + "__uuid__": "57d4c4ef-3199-4596-bf79-7c065964ca9c@1f586", + "__expectedType__": "cc.AnimationClip" + }, + "_useBakedAnimation": true, + "_sockets": [], + "_id": "d4kBjIp3xEdIVjRiQqSIsg" + }, + { + "__type__": "cc.SceneGlobals", + "ambient": { + "__id__": 34 + }, + "shadows": { + "__id__": 35 + }, + "_skybox": { + "__id__": 36 + }, + "fog": { + "__id__": 37 + } + }, + { + "__type__": "cc.AmbientInfo", + "_skyColor": { + "__type__": "cc.Color", + "r": 51, + "g": 128, + "b": 204, + "a": 1 + }, + "_skyIllum": 20000, + "_groundAlbedo": { + "__type__": "cc.Color", + "r": 51, + "g": 51, + "b": 51, + "a": 255 + } + }, + { + "__type__": "cc.ShadowsInfo", + "_type": 0, + "_enabled": false, + "_normal": { + "__type__": "cc.Vec3", + "x": 0, + "y": 1, + "z": 0 + }, + "_distance": 0, + "_shadowColor": { + "__type__": "cc.Color", + "r": 76, + "g": 76, + "b": 76, + "a": 255 + }, + "_fixedArea": false, + "_pcf": 0, + "_bias": 0.00001, + "_normalBias": 0, + "_near": 0.1, + "_far": 10, + "_shadowDistance": 100, + "_invisibleOcclusionRange": 200, + "_orthoSize": 5, + "_maxReceived": 4, + "_size": { + "__type__": "cc.Vec2", + "x": 512, + "y": 512 + }, + "_saturation": 0.75 + }, + { + "__type__": "cc.SkyboxInfo", + "_envmap": null, + "_isRGBE": false, + "_enabled": false, + "_useIBL": false + }, + { + "__type__": "cc.FogInfo", + "_type": 0, + "_fogColor": { + "__type__": "cc.Color", + "r": 200, + "g": 200, + "b": 200, + "a": 255 + }, + "_enabled": false, + "_fogDensity": 0.3, + "_fogStart": 0.5, + "_fogEnd": 300, + "_fogAtten": 5, + "_fogTop": 1.5, + "_fogRange": 1.2 + } +] \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/frontend/assets/scenes/GameScene/GameScene.scene.meta b/examples/cocos-creator-multiplayer/frontend/assets/scenes/GameScene/GameScene.scene.meta new file mode 100644 index 0000000..75261e5 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/scenes/GameScene/GameScene.scene.meta @@ -0,0 +1,11 @@ +{ + "ver": "1.1.32", + "importer": "scene", + "imported": true, + "uuid": "0d3889f6-dc9c-424e-b8cd-6fa78d63af15", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": {} +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/scripts.meta b/examples/cocos-creator-multiplayer/frontend/assets/scripts.meta new file mode 100644 index 0000000..c768f22 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/scripts.meta @@ -0,0 +1,12 @@ +{ + "ver": "1.1.0", + "importer": "directory", + "imported": true, + "uuid": "f40f793d-269b-44f4-b754-684d7d93892c", + "files": [], + "subMetas": {}, + "userData": { + "compressionType": {}, + "isRemoteBundle": {} + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/scripts/Room.ts b/examples/cocos-creator-multiplayer/frontend/assets/scripts/Room.ts new file mode 100644 index 0000000..b111b9c --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/scripts/Room.ts @@ -0,0 +1,101 @@ +import { WsClient } from 'tsrpc-browser'; +import { MsgInput } from './shared/protocols/clientMsgs/MsgInput'; +import { MsgFrame } from './shared/protocols/serverMsgs/MsgFrame'; +import { ServiceType } from "./shared/protocols/serviceProto"; +import { applyPlayerInput, PlayerInput, PlayerState } from "./shared/states/Player"; +import { RoomState } from './shared/states/RoomState'; + +/** + * 客户端 - 房间 - 逻辑系统 + */ +export class Room { + + state: RoomState = { + players: [] + } + + client: WsClient; + + self?: { + uid: number, + // 最后一次权威状态 + lastServerState: PlayerState + } + private _lastSendInputSN = 0; + private _sendingMsgs: MsgInput[] = []; + + constructor(client: WsClient) { + this.client = client; + this.client.listenMsg('serverMsgs/Frame', msg => { + this.applyServerFrame(msg); + }); + this.client.listenMsg('serverMsgs/Join', msg => { + this.state.players.push(msg.player); + }); + this.client.listenMsg('serverMsgs/Leave', msg => { + this.state.players.removeOne(v => v.uid === msg.uid); + }); + } + + init(roomState: RoomState) { + + } + + /** 同步服务端的权威消息 */ + applyServerFrame(msg: MsgFrame) { + msg.inputs.forEach(({ uid, msgInput }) => { + let playerIndex = this.state.players.findIndex(v => v.uid === uid); + if (playerIndex === -1) { + return; + } + let newPlayer: PlayerState = this.state.players[playerIndex]; + + // 自己:和解 + if (uid === this.self?.uid) { + this._sendingMsgs.remove(v => v.sn <= msgInput.sn); + this.state.players[playerIndex] = this.self.lastServerState; + // 预测 + this._sendingMsgs.forEach(v => { + this.state.players[playerIndex] = applyPlayerInput(this.state.players[playerIndex], v); + }) + } + // 其它人:直接同步 + else { + this.state.players[playerIndex] = applyPlayerInput(this.state.players[playerIndex], msgInput); + } + }); + } + + /** 发送客户端输入,并执行本地预测 */ + sendInput(input: PlayerInput) { + if (!this.self) { + return; + } + + let msg: MsgInput = { + ...input, + sn: ++this._lastSendInputSN + } + this._sendingMsgs.push(msg); + this.client.sendMsg('clientMsgs/Input', msg); + } + + async joinRoom() { + let ret = await this.client.callApi('JoinRoom', { + nickname: 'xxx', + skinId: 1 + }); + + if (!ret.isSucc) { + alert(ret.err.message); + return; + } + + this.self = { + uid: ret.res.uid, + lastServerState: ret.res.roomState.players.find(v => v.uid === ret.res!.uid)! + } + this.state = ret.res.roomState; + } + +} \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/frontend/assets/scripts/Room.ts.meta b/examples/cocos-creator-multiplayer/frontend/assets/scripts/Room.ts.meta new file mode 100644 index 0000000..3a6640c --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/scripts/Room.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.22", + "importer": "typescript", + "imported": true, + "uuid": "45fa3b70-b2ce-40a3-882a-79fbe5e7ae62", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/scripts/shared b/examples/cocos-creator-multiplayer/frontend/assets/scripts/shared new file mode 120000 index 0000000..4f09031 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/scripts/shared @@ -0,0 +1 @@ +../../../backend/src/shared \ No newline at end of file diff --git a/examples/cocos-creator-multiplayer/frontend/assets/scripts/shared.meta b/examples/cocos-creator-multiplayer/frontend/assets/scripts/shared.meta new file mode 100644 index 0000000..bd4ac41 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/scripts/shared.meta @@ -0,0 +1,12 @@ +{ + "ver": "1.1.0", + "importer": "directory", + "imported": true, + "uuid": "78099e0e-0105-4286-9a60-40235d454bce", + "files": [], + "subMetas": {}, + "userData": { + "compressionType": {}, + "isRemoteBundle": {} + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/spriteFrames.meta b/examples/cocos-creator-multiplayer/frontend/assets/spriteFrames.meta new file mode 100644 index 0000000..683c471 --- /dev/null +++ b/examples/cocos-creator-multiplayer/frontend/assets/spriteFrames.meta @@ -0,0 +1,12 @@ +{ + "ver": "1.1.0", + "importer": "directory", + "imported": true, + "uuid": "60d130b7-07a2-41e9-985d-b5511bec8941", + "files": [], + "subMetas": {}, + "userData": { + "compressionType": {}, + "isRemoteBundle": {} + } +} diff --git a/examples/cocos-creator-multiplayer/frontend/assets/spriteFrames/circle256.png b/examples/cocos-creator-multiplayer/frontend/assets/spriteFrames/circle256.png new file mode 100644 index 0000000000000000000000000000000000000000..d5bad8deae01f1f9afdadf9620231aac12261d54 GIT binary patch literal 5280 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