From 987aa1cb5e64db1bbffed4b5ec62a00d5398c413 Mon Sep 17 00:00:00 2001 From: JianMiau Date: Fri, 24 Nov 2023 11:15:26 +0800 Subject: [PATCH] [add] Lobby --- src/Common/MainControl/MainControl.ts | 40 ++ .../CatanEngine/NetManagerV2/NetConnector.ts | 9 +- src/UI/Lobby.tsx | 48 ++ src/UI/Login.tsx | 30 +- src/context/GameItemsContext.tsx | 61 ++- src/define/PlayerData.ts | 5 + src/define/Request/.ExampleCodeRequest.ts | 28 ++ src/define/Request/ActivityRequest.ts | 140 ++++++ src/define/Request/AdRequest.ts | 98 +++++ src/define/Request/BackpackRequest.ts | 18 + src/define/Request/ChatRequest.ts | 166 +++++++ src/define/Request/DlygoRequest.ts | 219 ++++++++++ src/define/Request/FriendRequest.ts | 108 +++++ src/define/Request/GameRequest.ts | 53 +++ src/define/Request/GiftRequest.ts | 26 ++ src/define/Request/MyCardRequest.ts | 65 +++ src/define/Request/PaRequest.ts | 29 ++ src/define/Request/ProfileRequest.ts | 72 +++ src/define/Request/RankRequest.ts | 11 + src/define/Request/RegisterRequest.ts | 132 ++++++ src/define/Request/ReportRequest.ts | 50 +++ src/define/Request/ResUpdateRequest.ts | 19 + src/define/Request/TaskRequest.ts | 90 ++++ src/define/Request/TxnRequest.ts | 413 ++++++++++++++++++ src/define/Request/VIPRequest.ts | 66 +++ src/index.tsx | 11 +- src/types/index.ts | 5 +- 27 files changed, 1985 insertions(+), 27 deletions(-) create mode 100644 src/define/PlayerData.ts create mode 100644 src/define/Request/.ExampleCodeRequest.ts create mode 100644 src/define/Request/ActivityRequest.ts create mode 100644 src/define/Request/AdRequest.ts create mode 100644 src/define/Request/BackpackRequest.ts create mode 100644 src/define/Request/ChatRequest.ts create mode 100644 src/define/Request/DlygoRequest.ts create mode 100644 src/define/Request/FriendRequest.ts create mode 100644 src/define/Request/GameRequest.ts create mode 100644 src/define/Request/GiftRequest.ts create mode 100644 src/define/Request/MyCardRequest.ts create mode 100644 src/define/Request/PaRequest.ts create mode 100644 src/define/Request/ProfileRequest.ts create mode 100644 src/define/Request/RankRequest.ts create mode 100644 src/define/Request/RegisterRequest.ts create mode 100644 src/define/Request/ReportRequest.ts create mode 100644 src/define/Request/ResUpdateRequest.ts create mode 100644 src/define/Request/TaskRequest.ts create mode 100644 src/define/Request/TxnRequest.ts create mode 100644 src/define/Request/VIPRequest.ts diff --git a/src/Common/MainControl/MainControl.ts b/src/Common/MainControl/MainControl.ts index 513ed8f..b31450f 100644 --- a/src/Common/MainControl/MainControl.ts +++ b/src/Common/MainControl/MainControl.ts @@ -1,4 +1,9 @@ +import { Action } from "@/Engine/CatanEngine/CSharp/System/Action"; +import { INetResponse } from "@/Engine/CatanEngine/NetManagerV2/Core/INetResponse"; +import { NetConnector } from "@/Engine/CatanEngine/NetManagerV2/NetConnector"; +import { NetManager } from "@/Engine/CatanEngine/NetManagerV2/NetManager"; import BaseSingleton from "@/Engine/Utils/Singleton/BaseSingleton"; +import BusinessTypeSetting from "@/_BusinessTypeSetting/BusinessTypeSetting"; export class MainControl extends BaseSingleton() { /** 每次啟動APP */ @@ -16,6 +21,41 @@ export class MainControl extends BaseSingleton() { public IsInGame: boolean = false; /** 現在時間 */ public get NowTime(): number { return Date.now(); } + + public static readonly DataReceivedEvent: Action = new Action(); + + /** 連線控制 */ + private _conn: NetConnector = null; + + //#region 網路相關 + + /**連線(目前沒有重連機制) */ + public * ConnectAsync() { + if (NetManager.IsConnected) { + return; + } + this._conn = new NetConnector(BusinessTypeSetting.UseHost, BusinessTypeSetting.UsePort); + this._conn.OnDataReceived.AddCallback(this._onNetDataReceived, this); + this._conn.OnDisconnected.AddCallback(this._onNetDisconnected, this); + NetManager.Initialize(this._conn); + console.log("[socket] connecting..."); + // 同個connector要再次連線, 可以不用叫CasinoNetManager.Initialize(), 但要先叫CasinoNetManager.Disconnect() + yield NetManager.ConnectAsync(); + } + + /**只要連線中斷不管主被動都會走到這裡 */ + private _onNetDisconnected() { + console.warn("[socket] Disconnected"); + this._conn.OnDataReceived.RemoveAllCallbacks(); + MainControl.DataReceivedEvent.DispatchCallback([MainControl.DataType.NetDisconnected]); + } + + /**RPC回傳.若協定錯誤斷線.原因也會在這裡收到 */ + private _onNetDataReceived(resp: INetResponse) { + MainControl.DataReceivedEvent.DispatchCallback([MainControl.DataType.ServerData, resp]); + } + + //#endregion } export module MainControl { diff --git a/src/Engine/CatanEngine/NetManagerV2/NetConnector.ts b/src/Engine/CatanEngine/NetManagerV2/NetConnector.ts index 2062b65..43d8636 100644 --- a/src/Engine/CatanEngine/NetManagerV2/NetConnector.ts +++ b/src/Engine/CatanEngine/NetManagerV2/NetConnector.ts @@ -1,4 +1,3 @@ -import Event from "@/modules/event"; import { Action } from "../CSharp/System/Action"; import { Encoding } from "../CSharp/System/Text/Encoding"; import { BaseEnumerator } from "../CoroutineV2/Core/BaseEnumerator"; @@ -21,8 +20,6 @@ export interface Func { } export class NetConnector { - /** Event */ - public readonly event: Event = new Event(); readonly OnDataReceived: Action> = new Action>(); readonly OnDisconnected: Action = new Action(); readonly OnLoadUIMask: Action = new Action(); @@ -147,10 +144,7 @@ export class NetConnector { } private OnWebSocketOpen(e: Event) { - // if (CC_DEBUG) { console.debug(`[RPC] ${this._host} Connected.`); - // } - this.event.emit(Socket.Connect); } private OnWebSocketMessage(e: MessageEvent) { @@ -221,11 +215,10 @@ export class NetConnector { private OnWebSocketClose(e: CloseEvent) { this.WebSocketEnded(); - this.event.emit(Socket.Disconnect); } private OnWebSocketError(e: CloseEvent) { - this.event.emit(Socket.Error); + } } diff --git a/src/UI/Lobby.tsx b/src/UI/Lobby.tsx index 37702df..7efbbb7 100644 --- a/src/UI/Lobby.tsx +++ b/src/UI/Lobby.tsx @@ -1,4 +1,52 @@ +import MainControl from "@/Common/MainControl/MainControl"; +import CSMessage from "@/Common/Message/CSMessage"; +import { CoroutineV2 } from "@/Engine/CatanEngine/CoroutineV2/CoroutineV2"; +import { INetResponse } from "@/Engine/CatanEngine/NetManagerV2/Core/INetResponse"; +import { useGameItems } from "@/context/GameItemsContext"; +import { CommonAccountResponse, LineLoginRequest } from "@/define/Request/RegisterRequest"; +import { useEffect } from "react"; +import { useNavigate } from "react-router-dom"; + const Lobby = () => { + const { player, setPlayer } = useGameItems(); + const navigate = useNavigate(); + const { token } = player; + + function onLoad() { + if (!token) { + navigate(`/`); + return; + } + CoroutineV2.Single(onStart()).Start(); + } + + function* onStart() { + yield* MainControl.Instance.ConnectAsync(); + + } + function* registerLineLogin() { + let req: LineLoginRequest = new LineLoginRequest(token); + yield req.SendAsync(true); + let resp: INetResponse = req.Result; + if (!resp.IsValid) { + //取得帳號失敗直接斷開SOCKET + if (resp.Status != 12) { + const msg: string = "Line Info Error. Error Code:" + req.Result.Status; + CSMessage.CreateYesMsg(msg); + return; + } + console.warn("LINE帳號無綁定"); + return; + } + // yield* this.ServerAccountLogin(resp.Data.id, resp.Data.pw); + + return; + } + + useEffect(() => { + onLoad(); + }, []); + return ( <>Lobby ); diff --git a/src/UI/Login.tsx b/src/UI/Login.tsx index dcc5f3f..6331eb6 100644 --- a/src/UI/Login.tsx +++ b/src/UI/Login.tsx @@ -1,7 +1,9 @@ import { BusinessEnum } from "@/_BusinessTypeSetting/BusinessTypeSetting"; import { useGameItems } from "@/context/GameItemsContext"; import { Button, Cascader } from "antd"; +import TextArea from "antd/es/input/TextArea"; import React, { useState } from "react"; +import { useNavigate } from "react-router-dom"; interface Option { value: string; @@ -10,10 +12,12 @@ interface Option { } const Login = () => { - const { onLoad } = useGameItems(); + const { onLoad, player, setPlayer } = useGameItems(); + const navigate = useNavigate(); const serverType: typeof BusinessEnum.ServerType = BusinessEnum.ServerType; const [type, setType] = useState(BusinessEnum.ServerType.Internal_Dev); const [isLogin, setIsLogin] = useState(false); + const [token, SetToken] = useState(""); const options: Option[] = []; for (let i = 0, names: string[] = Object.keys(serverType); i < names.length; i++) { const key: string = names[i]; @@ -28,13 +32,23 @@ const Login = () => { async function login() { setIsLogin(true); await onLoad(type); + setPlayer({ + ...player, + token: token + }); + navigate(`/lobby/`); } return ( <>{!isLogin &&
- setType(+v[0])} /> - +
+ setType(+v[0])} /> +
+