修复在直播间内跳转自己的直播间问题

This commit is contained in:
18401019693 2023-09-12 17:14:17 +08:00
parent d1edf6bdd8
commit 9b301eba25
16 changed files with 6094 additions and 6 deletions

View File

@ -179,7 +179,7 @@ dependencies {
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
api 'com.jakewharton.rxbinding3:rxbinding:3.1.0' api 'com.jakewharton.rxbinding3:rxbinding:3.1.0'
//loading样式库 //loading样式库
api 'com.wang.avi:library:2.1.3' api 'com.wang.avi:library:2.1.3'
api 'com.google.firebase:firebase-messaging:23.0.6' api 'com.google.firebase:firebase-messaging:23.0.6'
api 'com.google.firebase:firebase-analytics:21.1.0' api 'com.google.firebase:firebase-analytics:21.1.0'
// api 'com.huawei.hms:push:4.0.2.300' // api 'com.huawei.hms:push:4.0.2.300'
@ -197,7 +197,13 @@ dependencies {
// //
api 'com.makeramen:roundedimageview:2.3.0' api 'com.makeramen:roundedimageview:2.3.0'
// SDK // SDK
api 'com.umeng.umsdk:common:9.6.3'// api 'com.umeng.umsdk:common:9.6.3'//
api 'com.umeng.umsdk:asms:1.8.0'// api 'com.umeng.umsdk:asms:1.8.0'//
api 'com.umeng.umsdk:uyumao:1.1.2' //使使common需搭配v9.6.3asms需搭配v1.7.0 api 'com.umeng.umsdk:uyumao:1.1.2'
//使使common需搭配v9.6.3asms需搭配v1.7.0
// SudMGP SDK
api 'tech.sud.mgp:SudMGP:1.3.3.1158'
// ()
api 'tech.sud.mgp:SudASR:1.3.3.1158'
} }

View File

@ -0,0 +1,432 @@
package com.yunbao.common.sud;
import android.app.Activity;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.Toast;
import com.yunbao.common.sud.decorator.SudFSMMGCache;
import com.yunbao.common.sud.decorator.SudFSMMGDecorator;
import com.yunbao.common.sud.decorator.SudFSMMGListener;
import com.yunbao.common.sud.decorator.SudFSTAPPDecorator;
import com.yunbao.common.sud.model.GameConfigModel;
import com.yunbao.common.sud.model.GameViewInfoModel;
import com.yunbao.common.sud.state.MGStateResponse;
import com.yunbao.common.utils.SudJsonUtils;
import tech.sud.mgp.core.ISudFSMStateHandle;
import tech.sud.mgp.core.ISudFSTAPP;
import tech.sud.mgp.core.ISudListenerInitSDK;
import tech.sud.mgp.core.SudMGP;
/**
* 游戏业务逻辑抽象类
* 1.定自义ViewModel继承此类实现对应方法(注意onAddGameView()与onRemoveGameView()与页面有交互)
* 2.外部调用switchGame()方法启动游戏
* 3.页面销毁时调用onDestroy()
*/
public abstract class BaseGameViewModel implements SudFSMMGListener {
private String gameRoomId; // 游戏房间id
private long playingGameId; // 当前使用的游戏id
public final SudFSTAPPDecorator sudFSTAPPDecorator = new SudFSTAPPDecorator(); // app调用sdk的封装类
private final SudFSMMGDecorator sudFSMMGDecorator = new SudFSMMGDecorator(); // 用于处理游戏SDK部分回调业务
private boolean isRunning = true; // 业务是否还在运行
public View gameView; // 游戏View
public GameConfigModel gameConfigModel = new GameConfigModel(); // 游戏配置
protected final Handler handler = new Handler(Looper.getMainLooper());
/**
* 外部调用切换游戏传不同的gameId即可加载不同的游戏
* gameId传0 等同于关闭游戏
*
* @param activity 游戏所在页面用作于生命周期判断
* @param gameRoomId 游戏房间id房间隔离同一房间才能一起游戏
* @param gameId 游戏id传入不同的游戏id即可加载不同的游戏传0等同于关闭游戏
*/
public void switchGame(Activity activity, String gameRoomId, long gameId) {
if (TextUtils.isEmpty(gameRoomId)) {
Toast.makeText(activity, "gameRoomId can not be empty", Toast.LENGTH_LONG).show();
return;
}
if (!isRunning) {
return;
}
if (playingGameId == gameId && gameRoomId.equals(this.gameRoomId)) {
return;
}
destroyMG();
this.gameRoomId = gameRoomId;
playingGameId = gameId;
login(activity, gameId);
}
/**
* 第1步获取短期令牌code用于换取游戏Server访问APP Server的长期ssToken
* 接入方客户端 调用 接入方服务端 login 获取 短期令牌code
* 参考文档时序图sud-mgp-doc(https://docs.sud.tech/zh-CN/app/Client/StartUp-Android.html)
*
* @param activity 游戏所在页面
* @param gameId 游戏id
*/
private void login(Activity activity, long gameId) {
if (activity.isDestroyed() || gameId <= 0) {
return;
}
// 请求登录code
getCode(activity, getUserId(), getAppId(), new GameGetCodeListener() {
@Override
public void onSuccess(String code) {
if (!isRunning || gameId != playingGameId) {
return;
}
initSdk(activity, gameId, code);
}
@Override
public void onFailed() {
delayLoadGame(activity, gameId);
}
});
}
/**
* 第2步初始化SudMGP sdk
*
* @param activity 游戏所在页面
* @param gameId 游戏id
* @param code 令牌
*/
private void initSdk(Activity activity, long gameId, String code) {
String appId = getAppId();
String appKey = getAppKey();
// 初始化sdk
SudMGP.initSDK(activity, appId, appKey, isTestEnv(), new ISudListenerInitSDK() {
@Override
public void onSuccess() {
loadGame(activity, code, gameId);
}
@Override
public void onFailure(int errCode, String errMsg) {
// TODO: 2022/6/13 下面toast可以根据业务需要决定是否保留
if (isTestEnv()) {
Toast.makeText(activity, "initSDK onFailure:" + errMsg + "(" + errCode + ")", Toast.LENGTH_LONG).show();
}
delayLoadGame(activity, gameId);
}
});
}
/**
* 第3步加载游戏
* APP和游戏的相互调用
* ISudFSTAPPAPP调用游戏的接口
* ISudFSMMG游戏调APP的响应回调
*
* @param activity 游戏所在页面
* @param code 登录令牌
* @param gameId 游戏id
*/
private void loadGame(Activity activity, String code, long gameId) {
if (activity.isDestroyed() || !isRunning || gameId != playingGameId) {
return;
}
// 给装饰类设置回调
sudFSMMGDecorator.setSudFSMMGListener(this);
// 调用游戏sdk加载游戏
ISudFSTAPP iSudFSTAPP = SudMGP.loadMG(activity, getUserId(), gameRoomId, code, gameId, getLanguageCode(), sudFSMMGDecorator);
// 如果返回空则代表参数问题或者非主线程
if (iSudFSTAPP == null) {
Toast.makeText(activity, "loadMG params error", Toast.LENGTH_LONG).show();
delayLoadGame(activity, gameId);
return;
}
// APP调用游戏接口的装饰类设置
sudFSTAPPDecorator.setISudFSTAPP(iSudFSTAPP);
// 获取游戏视图将其抛回Activity进行展示
// Activity调用gameContainer.addView(view, FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
gameView = iSudFSTAPP.getGameView();
onAddGameView(gameView);
}
/**
* 游戏加载失败的时候延迟一会再重新加载
*
* @param activity 游戏所在页面
* @param gameId 游戏id
*/
private void delayLoadGame(Activity activity, long gameId) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
login(activity, gameId);
}
}, 5000);
}
// region 生命周期相关
/** 页面销毁的时候调用 */
public void onDestroy() {
isRunning = false;
destroyMG();
}
// endregion 生命周期相关
/** 销毁游戏 */
private void destroyMG() {
if (playingGameId > 0) {
sudFSTAPPDecorator.destroyMG();
sudFSMMGDecorator.destroyMG();
playingGameId = 0;
gameView = null;
onRemoveGameView();
}
}
/** 获取当前游戏房id */
public String getGameRoomId() {
return gameRoomId;
}
// region 子类需要实现的方法
/**
* 向接入方服务器获取code
*/
protected abstract void getCode(Activity activity, String userId, String appId, GameGetCodeListener listener);
/**
* 设置当前用户id(接入方定义)
*
* @return 返回用户id
*/
protected abstract String getUserId();
/**
* 设置游戏所用的appId
*
* @return 返回游戏服务appId
*/
protected abstract String getAppId();
/**
* 设置游戏所用的appKey
*
* @return 返回游戏服务appKey
*/
protected abstract String getAppKey();
/**
* 设置游戏的语言代码
* 参考文档https://docs.sud.tech/zh-CN/app/Client/Languages/
*
* @return 返回语言代码
*/
protected abstract String getLanguageCode();
/**
* 设置游戏的安全操作区域
*
* @param gameViewInfoModel 游戏视图大小
*/
protected abstract void getGameRect(GameViewInfoModel gameViewInfoModel);
/**
* true 加载游戏时为测试环境
* false 加载游戏时为生产环境
*/
protected abstract boolean isTestEnv();
/**
* 将游戏View添加到页面中
*
* @param gameView
*/
protected abstract void onAddGameView(View gameView);
/**
* 将页面中的游戏View移除
*/
protected abstract void onRemoveGameView();
// endregion 子类需要实现的方法
// region 游戏侧回调
/**
* 游戏日志
* 最低版本v1.1.30.xx
*/
@Override
public void onGameLog(String str) {
SudFSMMGListener.super.onGameLog(str);
}
/**
* 游戏开始
* 最低版本v1.1.30.xx
*/
@Override
public void onGameStarted() {
}
/**
* 游戏销毁
* 最低版本v1.1.30.xx
*/
@Override
public void onGameDestroyed() {
}
/**
* Code过期需要实现
* APP接入方需要调用handle.success或handle.fail
*
* @param dataJson {"code":"value"}
*/
@Override
public void onExpireCode(ISudFSMStateHandle handle, String dataJson) {
processOnExpireCode(sudFSTAPPDecorator, handle);
}
/**
* 获取游戏View信息需要实现
* APP接入方需要调用handle.success或handle.fail
*
* @param handle handle
* @param dataJson {}
*/
@Override
public void onGetGameViewInfo(ISudFSMStateHandle handle, String dataJson) {
processOnGetGameViewInfo(gameView, handle);
}
/**
* 获取游戏Config需要实现
* APP接入方需要调用handle.success或handle.fail
*
* @param handle handle
* @param dataJson {}
* 最低版本v1.1.30.xx
*/
@Override
public void onGetGameCfg(ISudFSMStateHandle handle, String dataJson) {
processOnGetGameCfg(handle, dataJson);
}
// endregion 游戏侧回调
/** 处理code过期 */
public void processOnExpireCode(SudFSTAPPDecorator sudFSTAPPDecorator, ISudFSMStateHandle handle) {
// code过期刷新code
getCode(null, getUserId(), getAppId(), new GameGetCodeListener() {
@Override
public void onSuccess(String code) {
if (!isRunning) return;
MGStateResponse mgStateResponse = new MGStateResponse();
mgStateResponse.ret_code = MGStateResponse.SUCCESS;
sudFSTAPPDecorator.updateCode(code, null);
handle.success(SudJsonUtils.toJson(mgStateResponse));
}
@Override
public void onFailed() {
MGStateResponse mgStateResponse = new MGStateResponse();
mgStateResponse.ret_code = -1;
handle.failure(SudJsonUtils.toJson(mgStateResponse));
}
});
}
/**
* 处理游戏视图信息(游戏安全区)
* 文档https://docs.sud.tech/zh-CN/app/Client/API/ISudFSMMG/onGetGameViewInfo.html
*/
public void processOnGetGameViewInfo(View gameView, ISudFSMStateHandle handle) {
//拿到游戏View的宽高
int gameViewWidth = gameView.getMeasuredWidth();
int gameViewHeight = gameView.getMeasuredHeight();
if (gameViewWidth > 0 && gameViewHeight > 0) {
notifyGameViewInfo(handle, gameViewWidth, gameViewHeight);
return;
}
//如果游戏View未加载完成则监听加载完成时回调
gameView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
gameView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
int width = gameView.getMeasuredWidth();
int height = gameView.getMeasuredHeight();
notifyGameViewInfo(handle, width, height);
}
});
}
/** 通知游戏,游戏视图信息 */
private void notifyGameViewInfo(ISudFSMStateHandle handle, int gameViewWidth, int gameViewHeight) {
GameViewInfoModel gameViewInfoModel = new GameViewInfoModel();
gameViewInfoModel.ret_code = 0;
// 游戏View大小
gameViewInfoModel.view_size.width = gameViewWidth;
gameViewInfoModel.view_size.height = gameViewHeight;
// 游戏安全操作区域
getGameRect(gameViewInfoModel);
// 给游戏侧进行返回
String json = SudJsonUtils.toJson(gameViewInfoModel);
// 如果设置安全区有疑问可将下面的日志打印出来分析json数据
// 正确的格式为{"ret_code":0,"view_game_rect":{"bottom":156,"left":0,"right":0,"top":196},"view_size":{"height":1920,"width":1080}}
// 如果发生debug版本游戏正常release版本游戏不正常请检查是否混淆了GameViewInfoModel类导致json序列化类的成员发生了变化
// Log.d("SudBaseGameViewModel", "notifyGameViewInfo:" + json);
handle.success(json);
}
public void onPause() {
// playMG和pauseMG要配对
sudFSTAPPDecorator.pauseMG();
}
public void onResume() {
// playMG和pauseMG要配对
sudFSTAPPDecorator.playMG();
}
/**
* 处理游戏配置
* 文档https://docs.sud.tech/zh-CN/app/Client/API/ISudFSMMG/onGetGameCfg.html
*/
public void processOnGetGameCfg(ISudFSMStateHandle handle, String dataJson) {
handle.success(SudJsonUtils.toJson(gameConfigModel));
}
/** 游戏login(getCode)监听 */
public interface GameGetCodeListener {
/** 成功 */
void onSuccess(String code);
/** 失败 */
void onFailed();
}
/** 获取游戏状态缓存 */
public SudFSMMGCache getSudFSMMGCache() {
return sudFSMMGDecorator.getSudFSMMGCache();
}
}

View File

@ -0,0 +1,216 @@
package com.yunbao.common.sud;
import android.app.Activity;
import android.view.View;
import androidx.lifecycle.MutableLiveData;
import com.yunbao.common.sud.model.GameConfigModel;
import com.yunbao.common.sud.model.GameViewInfoModel;
import com.yunbao.common.sud.state.MGStateResponse;
import com.yunbao.common.sud.state.SudMGPMGState;
import org.json.JSONObject;
import java.io.IOException;
import java.util.Objects;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import tech.sud.mgp.core.ISudFSMMG;
import tech.sud.mgp.core.ISudFSMStateHandle;
/**
* 游戏业务逻辑
* 1.自定义ViewModel继承此类实现对应方法(注意onAddGameView()与onRemoveGameView()与页面有交互)
* 2.外部调用switchGame(activity,gameRoomId,gameId)方法启动游戏参数定义可查看方法注释
* 3.页面销毁时调用onDestroy()
*/
public class QuickStartGameViewModel extends BaseGameViewModel {
/** Sud平台申请的appId */
public static String SudMGP_APP_ID = "1701178631292395522";
/** Sud平台申请的appKey */
public static String SudMGP_APP_KEY = "E3Eokfq58ZklwR8fM7iKWYGzarbIOkyh";
/** true 加载游戏时为测试环境 false 加载游戏时为生产环境 */
public static final boolean GAME_IS_TEST_ENV = true;
/** 使用的UserId。这里随机生成作演示开发者将其修改为业务使用的唯一userId */
public static String userId = QuickStartUtils.genUserID();
/** 游戏自定义安全操作区域 */
public GameViewInfoModel.GameViewRectModel gameViewRectModel;
/** 游戏的语言代码 */
public String languageCode = "zh-CN";
public final MutableLiveData<View> gameViewLiveData = new MutableLiveData<>(); // 游戏View回调
/** 向接入方服务器获取code */
@Override
protected void getCode(Activity activity, String userId, String appId, GameGetCodeListener listener) {
// TODO: 2022/6/10 注意这里是演示使用OkHttpClient请求hello-sud服务
// TODO: 2022/6/10 开发者在与后端联调时需将其改成自己的网络请求方式向自己的服务器获取code
// OkHttpClient client = new OkHttpClient();
// String req;
// try {
// JSONObject reqJsonObj = new JSONObject();
// reqJsonObj.put("user_id", userId);
// req = reqJsonObj.toString();
// } catch (Exception e) {
// e.printStackTrace();
// req = "";
// }
//
// RequestBody body = RequestBody.create(req, MediaType.get("application/json; charset=utf-8"));
// Request request = new Request.Builder()
// .url("https://mgp-hello.sudden.ltd/login/v3")
// .post(body)
// .build();
// client.newCall(request).enqueue(new Callback() {
// @Override
// public void onFailure(Call call, IOException e) {
// handler.post(new Runnable() {
// @Override
// public void run() {
// listener.onFailed();
// }
// });
// }
//
// @Override
// public void onResponse(Call call, Response response) {
// try {
// String dataJson = Objects.requireNonNull(response.body()).string();
// JSONObject jsonObject = new JSONObject(dataJson);
// int ret_code = jsonObject.getInt("ret_code");
// JSONObject dataObject = jsonObject.getJSONObject("data");
// String code = dataObject.getString("code");
// handler.post(new Runnable() {
// @Override
// public void run() {
// if (ret_code == MGStateResponse.SUCCESS) {
// listener.onSuccess(code);
// } else {
// listener.onFailed();
// }
// }
// });
// } catch (Exception e) {
// e.printStackTrace();
// handler.post(new Runnable() {
// @Override
// public void run() {
// listener.onFailed();
// }
// });
// }
// }
// });
}
/** 设置当前用户id(接入方定义) */
@Override
protected String getUserId() {
return userId;
}
/** 设置Sud平台申请的appId */
@Override
protected String getAppId() {
return SudMGP_APP_ID;
}
/** 设置Sud平台申请的appKey */
@Override
protected String getAppKey() {
return SudMGP_APP_KEY;
}
/** 设置游戏的语言代码 */
@Override
protected String getLanguageCode() {
return languageCode;
}
/**
* 设置游戏的安全操作区域{@link ISudFSMMG}.onGetGameViewInfo()的实现
* 参考文档https://docs.sud.tech/zh-CN/app/Client/API/ISudFSMMG/onGetGameViewInfo.html
*
* @param gameViewInfoModel 游戏视图模型
*/
@Override
protected void getGameRect(GameViewInfoModel gameViewInfoModel) {
// 相对于view_size边框偏移单位像素
// 开发者可自定义gameViewRectModel来控制安全区域
if (gameViewRectModel != null) {
gameViewInfoModel.view_game_rect = gameViewRectModel;
}
}
/**
* 获取游戏配置对象{@link ISudFSMMG}.onGetGameCfg()的实现
* 参考文档https://docs.sud.tech/zh-CN/app/Client/API/ISudFSMMG/onGetGameCfg.html
* 开发者拿到此对象之后可修改自己需要的配置
* 注意在加载游戏之前配置才有效
*
* @return 游戏配置对象
*/
public GameConfigModel getGameConfigModel() {
return gameConfigModel;
}
/**
* true 加载游戏时为测试环境
* false 加载游戏时为生产环境
*/
@Override
protected boolean isTestEnv() {
return GAME_IS_TEST_ENV;
}
/** 将游戏View添加到页面中 */
@Override
protected void onAddGameView(View gameView) {
gameViewLiveData.setValue(gameView);
}
/** 将页面中的游戏View移除 */
@Override
protected void onRemoveGameView() {
gameViewLiveData.setValue(null);
}
// ************ 上面是基础能力以及必要配置下面讲解状态交互
// ************ 主要有1.App向游戏发送状态2.游戏向App回调状态
/**
* 1.App向游戏发送状态
* 这里演示的是发送1. 加入状态
* 开发者可自由定义方法能发送的状态都封装在{@link SudFSTAPPDecorator}
* 参考文档https://docs.sud.tech/zh-CN/app/Client/APPFST/
* 注意
* 1App向游戏发送状态因为需要走网络所以向游戏发送状态之后不能马上销毁游戏或者finish Activity否则状态无法发送成功
* 2要保证状态能到达可以发送之后delay 500ms再销毁游戏或者finish Activity
*/
public void notifyAPPCommonSelfIn(boolean isIn, int seatIndex, boolean isSeatRandom, int teamId) {
sudFSTAPPDecorator.notifyAPPCommonSelfIn(isIn, seatIndex, isSeatRandom, teamId);
}
/**
* 2.游戏向App回调状态
* 这里演示的是接收游戏回调状态10. 游戏状态 mg_common_game_state
* 游戏回调的每个状态都对应着一个方法方法定义在{@link SudFSMMGListener}
*/
@Override
public void onGameMGCommonGameState(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameState model) {
super.onGameMGCommonGameState(handle, model);
}
}

View File

@ -0,0 +1,30 @@
package com.yunbao.common.sud;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;
public class QuickStartUtils {
/** 随机生成一个userId用于演示 */
public static String genUserID() {
return md5Hex8(UUID.randomUUID().toString());
}
public static String md5Hex8(String plainText) {
byte[] secretBytes;
try {
secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());
} catch (NoSuchAlgorithmException e) {
return plainText;
}
String md5code = new BigInteger(1, secretBytes).toString(16);
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = String.format("0%s", md5code);
}
return md5code.substring(8, 16);
}
}

View File

@ -0,0 +1,151 @@
/*
* Copyright © Sud.Tech
* https://sud.tech
*/
package com.yunbao.common.sud.decorator;
import com.yunbao.common.sud.state.SudMGPMGState;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;
/**
* 游戏回调数据缓存
*/
public class SudFSMMGCache {
private String captainUserId; // 记录当前队长的用户id
private SudMGPMGState.MGCommonGameState mgCommonGameStateModel; // 全局游戏状态
private boolean isHitBomb = false; // 是否数字炸弹
private final HashSet<String> playerInSet = new HashSet<>(); // 记录已经加入了游戏的玩家
private final HashSet<String> playerReadySet = new HashSet<>(); // 记录已经准备好的游戏玩家
private final HashMap<String, SudMGPMGState.MGCommonPlayerPlaying> playerPlayingMap = new HashMap<>(); // 记录玩家的游戏状态
// 队长状态 处理
public void onPlayerMGCommonPlayerCaptain(String userId, SudMGPMGState.MGCommonPlayerCaptain model) {
if (model != null) {
if (model.isCaptain) {
captainUserId = userId;
} else {
if (Objects.equals(captainUserId, userId)) {
captainUserId = null;
}
}
}
}
// 游戏状态 处理
public void onGameMGCommonGameState(SudMGPMGState.MGCommonGameState model) {
mgCommonGameStateModel = model;
}
// 玩家加入状态处理
public void onPlayerMGCommonPlayerIn(String userId, SudMGPMGState.MGCommonPlayerIn model) {
if (model != null) {
if (model.isIn) {
playerInSet.add(userId);
} else {
playerInSet.remove(userId);
playerReadySet.remove(userId);
}
}
}
// 玩家准备状态
public void onPlayerMGCommonPlayerReady(String userId, SudMGPMGState.MGCommonPlayerReady model) {
if (model != null) {
if (model.isReady) {
playerReadySet.add(userId);
} else {
playerReadySet.remove(userId);
}
}
}
// 玩家游戏状态
public void onPlayerMGCommonPlayerPlaying(String userId, SudMGPMGState.MGCommonPlayerPlaying model) {
if (model != null) {
playerPlayingMap.put(userId, model);
}
}
// 关键词状态
public void onGameMGCommonKeyWordToHit(SudMGPMGState.MGCommonKeyWordToHit model) {
if (model != null) {
isHitBomb = model.wordType.equals("number");
}
}
// 返回该玩家是否正在游戏中
public boolean playerIsPlaying(String userId) {
SudMGPMGState.MGCommonPlayerPlaying mgCommonPlayerPlaying = playerPlayingMap.get(userId);
if (mgCommonPlayerPlaying != null) {
return mgCommonPlayerPlaying.isPlaying;
}
return false;
}
// 返回该玩家是否已准备
public boolean playerIsReady(String userId) {
return playerReadySet.contains(userId);
}
// 返回该玩家是否已加入了游戏
public boolean playerIsIn(String userId) {
return playerInSet.contains(userId);
}
// 获取当前游戏中的人数
public int getPlayerInNumber() {
return playerInSet.size();
}
// 是否数字炸弹
public boolean isHitBomb() {
return isHitBomb;
}
// 销毁游戏
public void destroyMG() {
captainUserId = null;
mgCommonGameStateModel = null;
isHitBomb = false;
playerInSet.clear();
playerReadySet.clear();
playerPlayingMap.clear();
}
/** 获取队长userId */
public String getCaptainUserId() {
return captainUserId;
}
/** 获取当前已加入游戏的玩家集合 */
public HashSet<String> getPlayerInSet() {
return new HashSet<>(playerInSet);
}
/** 获取当前已准备的玩家集合 */
public HashSet<String> getPlayerReadySet() {
return new HashSet<>(playerReadySet);
}
/** 获取玩家游戏状态集合 */
public HashMap<String, SudMGPMGState.MGCommonPlayerPlaying> getPlayerPlayingMap() {
return new HashMap<>(playerPlayingMap);
}
/**
* 返回当前游戏的状态数值参数{@link SudMGPMGState.MGCommonGameState}
*/
public int getGameState() {
if (mgCommonGameStateModel != null) {
return mgCommonGameStateModel.gameState;
}
return SudMGPMGState.MGCommonGameState.UNKNOW;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,901 @@
/*
* Copyright © Sud.Tech
* https://sud.tech
*/
package com.yunbao.common.sud.decorator;
import com.yunbao.common.sud.state.SudMGPMGState;
import com.yunbao.common.utils.ISudFSMStateHandleUtils;
import tech.sud.mgp.core.ISudFSMStateHandle;
/**
* {@link SudFSMMGDecorator} 回调定义
*/
public interface SudFSMMGListener {
/**
* 游戏日志
* 最低版本v1.1.30.xx
*/
default void onGameLog(String str) {
}
/**
* 游戏加载进度
*
* @param stage 阶段start=1,loading=2,end=3
* @param retCode 错误码0成功
* @param progress 进度[0, 100]
*/
default void onGameLoadingProgress(int stage, int retCode, int progress) {
}
/**
* 游戏开始需要实现
* 最低版本v1.1.30.xx
*/
void onGameStarted();
/**
* 游戏销毁需要实现
* 最低版本v1.1.30.xx
*/
void onGameDestroyed();
/**
* Code过期需要实现
* APP接入方需要调用handle.success或handle.fail
*
* @param dataJson {"code":"value"}
*/
void onExpireCode(ISudFSMStateHandle handle, String dataJson);
/**
* 获取游戏View信息需要实现
* APP接入方需要调用handle.success或handle.fail
*
* @param handle
* @param dataJson {}
*/
void onGetGameViewInfo(ISudFSMStateHandle handle, String dataJson);
/**
* 获取游戏Config需要实现
* APP接入方需要调用handle.success或handle.fail
*
* @param handle
* @param dataJson {}
* 最低版本v1.1.30.xx
*/
void onGetGameCfg(ISudFSMStateHandle handle, String dataJson);
// region 游戏回调APP 通用状态
// 参考文档https://github.com/SudTechnology/sud-mgp-doc/blob/main/Client/MG%20FSM/%E9%80%9A%E7%94%A8%E7%8A%B6%E6%80%81-%E7%8E%A9%E5%AE%B6.md
/**
* 1.游戏公屏消息
* mg_common_public_message
*/
default void onGameMGCommonPublicMessage(ISudFSMStateHandle handle, SudMGPMGState.MGCommonPublicMessage model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 2. 关键词状态
* mg_common_key_word_to_hit
*/
default void onGameMGCommonKeyWordToHit(ISudFSMStateHandle handle, SudMGPMGState.MGCommonKeyWordToHit model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 3. 游戏结算状态
* mg_common_game_settle
*/
default void onGameMGCommonGameSettle(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSettle model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 4. 加入游戏按钮点击状态
* mg_common_self_click_join_btn
*/
default void onGameMGCommonSelfClickJoinBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickJoinBtn model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 5. 取消加入(退出)游戏按钮点击状态
* mg_common_self_click_cancel_join_btn
*/
default void onGameMGCommonSelfClickCancelJoinBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickCancelJoinBtn model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 6. 准备按钮点击状态
* mg_common_self_click_ready_btn
*/
default void onGameMGCommonSelfClickReadyBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickReadyBtn model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 7. 取消准备按钮点击状态
* mg_common_self_click_cancel_ready_btn
*/
default void onGameMGCommonSelfClickCancelReadyBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickCancelReadyBtn model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 8. 开始游戏按钮点击状态
* mg_common_self_click_start_btn
*/
default void onGameMGCommonSelfClickStartBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickStartBtn model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 9. 分享按钮点击状态
* mg_common_self_click_share_btn
*/
default void onGameMGCommonSelfClickShareBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickShareBtn model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 10. 游戏状态
* mg_common_game_state
*/
default void onGameMGCommonGameState(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameState model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 11. 结算界面关闭按钮点击状态2021-12-27新增
* mg_common_self_click_game_settle_close_btn
*/
default void onGameMGCommonSelfClickGameSettleCloseBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickGameSettleCloseBtn model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 12. 结算界面再来一局按钮点击状态2021-12-27新增
* mg_common_self_click_game_settle_again_btn
*/
default void onGameMGCommonSelfClickGameSettleAgainBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickGameSettleAgainBtn model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 13. 游戏上报游戏中的声音列表2021-12-30新增现在只支持碰碰我最强
* mg_common_game_sound_list
*/
default void onGameMGCommonGameSoundList(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSoundList model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 14. 游通知app层播放声音2021-12-30新增现在只支持碰碰我最强
* mg_common_game_sound
*/
default void onGameMGCommonGameSound(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSound model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 15. 游戏通知app层播放背景音乐状态2022-01-07新增现在只支持碰碰我最强
* mg_common_game_bg_music_state
*/
default void onGameMGCommonGameBgMusicState(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameBgMusicState model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 16. 游戏通知app层播放音效的状态2022-01-07新增现在只支持碰碰我最强
* mg_common_game_sound_state
*/
default void onGameMGCommonGameSoundState(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSoundState model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 17. ASR状态(开启和关闭语音识别状态v1.1.45.xx 版本新增)
* mg_common_game_asr
*/
default void onGameMGCommonGameASR(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameASR model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 18. 麦克风状态2022-02-08新增
* mg_common_self_microphone
*/
default void onGameMGCommonSelfMicrophone(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfMicrophone model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 19. 耳机听筒扬声器状态2022-02-08新增
* mg_common_self_headphone
*/
default void onGameMGCommonSelfHeadphone(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfHeadphone model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 20. App通用状态操作结果错误码2022-05-10新增
* mg_common_app_common_self_x_resp
*/
default void onGameMGCommonAPPCommonSelfXResp(ISudFSMStateHandle handle, SudMGPMGState.MGCommonAPPCommonSelfXResp model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 21. 游戏通知app层添加陪玩机器人是否成功2022-05-17新增
* mg_common_game_add_ai_players
*/
default void onGameMGCommonGameAddAIPlayers(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameAddAIPlayers model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 22. 游戏通知app层添当前网络连接状态2022-06-21新增
* mg_common_game_network_state
*/
default void onGameMGCommonGameNetworkState(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameNetworkState model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 23. 游戏通知app获取积分
* mg_common_game_score
*/
default void onGameMGCommonGameGetScore(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameGetScore model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 24. 游戏通知app带入积分
* mg_common_game_set_score
*/
default void onGameMGCommonGameSetScore(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSetScore model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 25. 创建订单
* mg_common_game_create_order
*/
default void onGameMGCommonGameCreateOrder(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameCreateOrder model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 26. 游戏通知app玩家角色(仅对狼人杀有效)
* mg_common_player_role_id
*/
default void onGameMGCommonPlayerRoleId(ISudFSMStateHandle handle, SudMGPMGState.MGCommonPlayerRoleId model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 27. 游戏通知app玩家被扔便便(你画我猜你说我猜友尽闯关有效)
* mg_common_self_click_poop
*/
default void onGameMGCommonSelfClickPoop(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickPoop model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 28. 游戏通知app玩家被点赞(你画我猜你说我猜友尽闯关有效)
* mg_common_self_click_good
*/
default void onGameMGCommonSelfClickGood(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickGood model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 29. 游戏通知app游戏FPS(仅对碰碰多米诺骨牌飞镖达人生效)
* mg_common_game_fps
*/
default void onGameMGCommonGameFps(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameFps model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 30. 游戏通知app游戏弹框
* mg_common_alert
*/
default void onGameMGCommonAlert(ISudFSMStateHandle handle, SudMGPMGState.MGCommonAlert model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 31. 游戏通知app最坑队友只支持友尽闯关
* mg_common_worst_teammate
*/
default void onGameMGCommonWorstTeammate(ISudFSMStateHandle handle, SudMGPMGState.MGCommonWorstTeammate model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 32. 游戏通知app因玩家逃跑导致游戏结束只支持友尽闯关
* mg_common_game_over_tip
*/
default void onGameMGCommonGameOverTip(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameOverTip model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 33. 游戏通知app玩家颜色只支持友尽闯关
* mg_common_game_player_color
*/
default void onGameMGCommonGamePlayerColor(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGamePlayerColor model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 34. 游戏通知app玩家头像的坐标只支持ludo
* mg_common_game_player_icon_position
*/
default void onGameMGCommonGamePlayerIconPosition(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGamePlayerIconPosition model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 35. 游戏通知app退出游戏只支持teenpattipro 德州pro
* mg_common_self_click_exit_game_btn
*/
default void onGameMGCommonSelfClickExitGameBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickExitGameBtn model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 36. 游戏通知app是否要开启带入积分只支持teenpattipro 德州pro
* mg_common_game_is_app_chip
*/
default void onGameMGCommonGameIsAppChip(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameIsAppChip model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 37. 游戏通知app当前游戏的设置信息只支持德州proteenpatti pro
* mg_common_game_rule
*/
default void onGameMGCommonGameRule(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameRule model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 38. 游戏通知app进行玩法设置只支持德州proteenpatti pro
* mg_common_game_settings
*/
default void onGameMGCommonGameSettings(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSettings model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 39. 游戏通知app钱币不足只支持德州proteenpatti pro
* mg_common_game_money_not_enough
*/
default void onGameMGCommonGameMoneyNotEnough(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameMoneyNotEnough model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 40. 游戏通知app下发定制ui配置表只支持ludo
* mg_common_game_ui_custom_config
*/
default void onGameMGCommonGameUiCustomConfig(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameUiCustomConfig model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 41. 设置app提供给游戏可点击区域(赛车)
* mg_common_set_click_rect
*/
default void onGameMGCommonSetClickRect(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSetClickRect model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 42. 通知app提供对应uids列表玩家的数据(赛车)
* mg_common_users_info
*/
default void onGameMGCommonUsersInfo(ISudFSMStateHandle handle, SudMGPMGState.MGCommonUsersInfo model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 43. 通知app游戏前期准备完成(赛车)
* mg_common_game_prepare_finish
*/
default void onGameMGCommonGamePrepareFinish(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGamePrepareFinish model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 44. 通知app游戏主界面已显示(赛车)
* mg_common_show_game_scene
*/
default void onGameMGCommonShowGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGCommonShowGameScene model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 45. 通知app游戏主界面已隐藏(赛车)
* mg_common_hide_game_scene
*/
default void onGameMGCommonHideGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGCommonHideGameScene model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
// endregion 游戏回调APP 通用状态
// region 游戏回调APP 玩家状态
/**
* 1.加入状态已修改
* mg_common_player_in
*/
default void onPlayerMGCommonPlayerIn(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerIn model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 2.准备状态已修改
* mg_common_player_ready
*/
default void onPlayerMGCommonPlayerReady(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerReady model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 3.队长状态已修改
* mg_common_player_captain
*/
default void onPlayerMGCommonPlayerCaptain(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerCaptain model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 4.游戏状态已修改
* mg_common_player_playing
*/
default void onPlayerMGCommonPlayerPlaying(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerPlaying model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 5.玩家在线状态
* mg_common_player_online
*/
default void onPlayerMGCommonPlayerOnline(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerOnline model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 6.玩家换游戏位状态
* mg_common_player_change_seat
*/
default void onPlayerMGCommonPlayerChangeSeat(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerChangeSeat model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 7. 游戏通知app点击玩家头像
* mg_common_self_click_game_player_icon
*/
default void onPlayerMGCommonSelfClickGamePlayerIcon(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonSelfClickGamePlayerIcon model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 8. 游戏通知app玩家死亡状态2022-04-24新增
* mg_common_self_die_status
*/
default void onPlayerMGCommonSelfDieStatus(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonSelfDieStatus model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 9. 游戏通知app轮到玩家出手状态2022-04-24新增
* mg_common_self_turn_status
*/
default void onPlayerMGCommonSelfTurnStatus(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonSelfTurnStatus model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 10. 游戏通知app玩家选择状态2022-04-24新增
* mg_common_self_select_status
*/
default void onPlayerMGCommonSelfSelectStatus(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonSelfSelectStatus model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 11. 游戏通知app层当前游戏剩余时间2022-05-23新增目前UMO生效
* mg_common_game_countdown_time
*/
default void onPlayerMGCommonGameCountdownTime(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonGameCountdownTime model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 12. 游戏通知app层当前玩家死亡后变成ob视角2022-08-23新增目前狼人杀生效
* mg_common_self_ob_status
*/
default void onPlayerMGCommonSelfObStatus(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonSelfObStatus model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
// endregion 游戏回调APP 玩家状态
// region 游戏回调APP 玩家状态 你画我猜
// 参考文档https://github.com/SudTechnology/sud-mgp-doc/blob/main/Client/MG%20FSM/%E4%BD%A0%E7%94%BB%E6%88%91%E7%8C%9C.md
/**
* 1. 选词中状态已修改
* mg_dg_selecting
*/
default void onPlayerMGDGSelecting(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGDGSelecting model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 2. 作画中状态已修改
* mg_dg_painting
*/
default void onPlayerMGDGPainting(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGDGPainting model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 3. 显示错误答案状态已修改
* mg_dg_erroranswer
*/
default void onPlayerMGDGErroranswer(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGDGErroranswer model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 4. 显示总积分状态已修改
* mg_dg_totalscore
*/
default void onPlayerMGDGTotalscore(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGDGTotalscore model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 5. 本次获得积分状态已修改
* mg_dg_score
*/
default void onPlayerMGDGScore(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGDGScore model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
// endregion 游戏回调APP 玩家状态 你画我猜
// region 游戏回调APP 通用状态 元宇宙砂砂舞
/**
* 1. 元宇宙砂砂舞指令回调
* mg_common_game_disco_action
*/
default void onGameMGCommonGameDiscoAction(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameDiscoAction model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 2. 元宇宙砂砂舞指令动作结束通知
* mg_common_game_disco_action_end
*/
default void onGameMGCommonGameDiscoActionEnd(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameDiscoActionEnd model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
// endregion 游戏回调APP 通用状态 元宇宙砂砂舞
// region 游戏回调APP 通用状态 定制火箭
/**
* 1. 礼物配置文件(火箭)
* mg_custom_rocket_config
*/
default void onGameMGCustomRocketConfig(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketConfig model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 2. 拥有模型列表(火箭)
* mg_custom_rocket_model_list
*/
default void onGameMGCustomRocketModelList(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketModelList model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 3. 拥有组件列表(火箭)
* mg_custom_rocket_component_list
*/
default void onGameMGCustomRocketComponentList(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketComponentList model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 4. 获取用户信息(火箭)
* mg_custom_rocket_user_info
*/
default void onGameMGCustomRocketUserInfo(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketUserInfo model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 5. 订单记录列表(火箭)
* mg_custom_rocket_order_record_list
*/
default void onGameMGCustomRocketOrderRecordList(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketOrderRecordList model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 6. 展馆内列表(火箭)
* mg_custom_rocket_room_record_list
*/
default void onGameMGCustomRocketRoomRecordList(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketRoomRecordList model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 7. 展馆内玩家送出记录(火箭)
* mg_custom_rocket_user_record_list
*/
default void onGameMGCustomRocketUserRecordList(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketUserRecordList model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 8. 设置默认模型(火箭)
* mg_custom_rocket_set_default_model
*/
default void onGameMGCustomRocketSetDefaultModel(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketSetDefaultModel model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 9. 动态计算一键发送价格(火箭)
* mg_custom_rocket_dynamic_fire_price
*/
default void onGameMGCustomRocketDynamicFirePrice(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketDynamicFirePrice model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 10. 一键发送(火箭)
* mg_custom_rocket_fire_model
*/
default void onGameMGCustomRocketFireModel(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketFireModel model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 11. 新组装模型(火箭)
* mg_custom_rocket_create_model
*/
default void onGameMGCustomRocketCreateModel(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketCreateModel model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 12. 模型更换组件(火箭)
* mg_custom_rocket_replace_component
*/
default void onGameMGCustomRocketReplaceComponent(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketReplaceComponent model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 13. 购买组件(火箭)
* mg_custom_rocket_buy_component
*/
default void onGameMGCustomRocketBuyComponent(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketBuyComponent model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 14. 播放效果开始(火箭)
* mg_custom_rocket_play_effect_start
*/
default void onGameMGCustomRocketPlayEffectStart(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketPlayEffectStart model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 15. 播放效果完成(火箭)
* mg_custom_rocket_play_effect_finish
*/
default void onGameMGCustomRocketPlayEffectFinish(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketPlayEffectFinish model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 16. 验证签名合规(火箭)
* mg_custom_rocket_verify_sign
*/
default void onGameMGCustomRocketVerifySign(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketVerifySign model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 17. 上传icon(火箭)
* mg_custom_rocket_upload_model_icon
*/
default void onGameMGCustomRocketUploadModelIcon(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketUploadModelIcon model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 18. 前期准备完成(火箭)
* mg_custom_rocket_prepare_finish
*/
default void onGameMGCustomRocketPrepareFinish(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketPrepareFinish model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 19. 火箭主界面已显示(火箭)
* mg_custom_rocket_show_game_scene
*/
default void onGameMGCustomRocketShowGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketShowGameScene model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 20. 火箭主界面已隐藏(火箭)
* mg_custom_rocket_hide_game_scene
*/
default void onGameMGCustomRocketHideGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketHideGameScene model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 21. 点击锁住组件(火箭)
* mg_custom_rocket_click_lock_component
*/
default void onGameMGCustomRocketClickLockComponent(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketClickLockComponent model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 22. 火箭效果飞行点击(火箭)
* mg_custom_rocket_fly_click
*/
default void onGameMGCustomRocketFlyClick(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketFlyClick model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 23. 火箭效果飞行结束(火箭)
* mg_custom_rocket_fly_end
*/
default void onGameMGCustomRocketFlyEnd(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketFlyEnd model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 24. 设置点击区域(火箭)
* mg_custom_rocket_set_click_rect
*/
default void onGameMGCustomRocketSetClickRect(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketSetClickRect model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 25. 颜色和签名自定义改到装配间的模式保存颜色或签名
* mg_custom_rocket_save_sign_color
*/
default void onGameMGCustomRocketSaveSignColor(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketSaveSignColor model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
// endregion 游戏回调APP 通用状态 定制火箭
// region 游戏回调APP 通用状态 棒球
/**
* 1. 查询排行榜数据(棒球)
* mg_baseball_ranking
*/
default void onGameMGBaseballRanking(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballRanking model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 2. 查询我的排名(棒球)
* mg_baseball_my_ranking
*/
default void onGameMGBaseballMyRanking(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballMyRanking model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 3. 查询当前距离我的前后玩家数据(棒球)
* mg_baseball_range_info
*/
default void onGameMGBaseballRangeInfo(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballRangeInfo model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 4. 设置app提供给游戏可点击区域(棒球)
* mg_baseball_set_click_rect
*/
default void onGameMGBaseballSetClickRect(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballSetClickRect model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 5. 前期准备完成(棒球)
* mg_baseball_prepare_finish
*/
default void onGameMGBaseballPrepareFinish(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballPrepareFinish model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 6. 主界面已显示(棒球)
* mg_baseball_show_game_scene
*/
default void onGameMGBaseballShowGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballShowGameScene model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 7. 主界面已隐藏(棒球)
* mg_baseball_hide_game_scene
*/
default void onGameMGBaseballHideGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballHideGameScene model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
/**
* 8. 获取文本配置数据(棒球)
* mg_baseball_text_config
*/
default void onGameMGBaseballTextConfig(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballTextConfig model) {
ISudFSMStateHandleUtils.handleSuccess(handle);
}
// endregion 游戏回调APP 通用状态 棒球
/**
* 游戏状态变化
* 透传游戏向App发送的游戏通用状态消息
* **********使用此方法可先看下此方法的使用逻辑*************
*
* @param handle 回调操作
* @param state 状态命令
* @param dataJson 状态值
* @return 返回true表示由此方法接管该状态处理此时需注意调用ISudFSMStateHandleUtils.handleSuccess(handle);
*/
default boolean onGameStateChange(ISudFSMStateHandle handle, String state, String dataJson) {
return false;
}
/**
* 游戏玩家状态变化
* 透传游戏向App发送的玩家状态变化
* **********使用此方法可先看下此方法的使用逻辑*************
*
* @param handle 回调操作
* @param userId 用户Id
* @param state 状态命令
* @param dataJson 状态值
* @return 返回true表示由此方法接管该状态处理此时需注意调用ISudFSMStateHandleUtils.handleSuccess(handle);
*/
default boolean onPlayerStateChange(ISudFSMStateHandle handle, String userId, String state, String dataJson) {
return false;
}
}

View File

@ -0,0 +1,446 @@
/*
* Copyright © Sud.Tech
* https://sud.tech
*/
package com.yunbao.common.sud.decorator;
import com.yunbao.common.sud.state.SudMGPAPPState;
import com.yunbao.common.utils.SudJsonUtils;
import java.nio.ByteBuffer;
import java.util.List;
import tech.sud.mgp.core.ISudFSTAPP;
import tech.sud.mgp.core.ISudListenerNotifyStateChange;
/**
* ISudFSTAPP的装饰类接近于业务
* 参考文档https://docs.sud.tech/zh-CN/app/Client/API/ISudFSTAPP.html
* 注意
* 1向游戏侧发送状态之后不能立即调用destroyMG()方法也不能立即finish Activity例如{@link SudFSTAPPDecorator#notifyAPPCommonSelfEnd()}
*/
public class SudFSTAPPDecorator {
/**
* APP调用游戏的接口
*/
private ISudFSTAPP iSudFSTAPP;
/**
* 设置app调用sdk的对象
*
* @param iSudFSTAPP
*/
public void setISudFSTAPP(ISudFSTAPP iSudFSTAPP) {
this.iSudFSTAPP = iSudFSTAPP;
}
// region 状态通知ISudFSTAPP.notifyStateChange
/**
* 发送
* 1. 加入状态
*
* @param isIn true 加入游戏false 退出游戏
* @param seatIndex 加入的游戏位(座位号) 默认传seatIndex = -1 随机加入seatIndex 从0开始不可大于座位数
* @param isSeatRandom 默认为ture, 带有游戏位(座位号)的时候如果游戏位(座位号)已经被占用是否随机分配一个空位坐下 isSeatRandom=true 随机分配空位坐下isSeatRandom=false 不随机分配
* @param teamId 不支持分队的游戏数值填1支持分队的游戏数值填1或2两支队伍
*/
public void notifyAPPCommonSelfIn(boolean isIn, int seatIndex, boolean isSeatRandom, int teamId) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonSelfIn state = new SudMGPAPPState.APPCommonSelfIn();
state.isIn = isIn;
state.seatIndex = seatIndex;
state.isSeatRandom = isSeatRandom;
state.teamId = teamId;
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_IN, SudJsonUtils.toJson(state), null);
}
}
/**
* 发送
* 2. 准备状态
* 用户本人准备/取消准备
*
* @param isReady true 准备false 取消准备
*/
public void notifyAPPCommonSelfReady(boolean isReady) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonSelfReady state = new SudMGPAPPState.APPCommonSelfReady();
state.isReady = isReady;
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_READY, SudJsonUtils.toJson(state), null);
}
}
/**
* 发送
* 3. 游戏状态 模型
* 用户游戏状态如果用户在游戏中建议
* a.空出屏幕中心区
* 关闭全屏礼物特效
* b.部分强操作类小游戏spaceMax为true尽量收缩原生UI给游戏留出尽量大的操作空间
* 收缩公屏
* 收缩麦位
* 如果不在游戏中则恢复
*
* @param isPlaying true 开始游戏false 结束游戏
* @param reportGameInfoExtras string类型Https服务回调report_game_info参数最大长度1024字节超过则截断2022-01-21
*/
public void notifyAPPCommonSelfPlaying(boolean isPlaying, String reportGameInfoExtras, String reportGameInfoKey) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonSelfPlaying state = new SudMGPAPPState.APPCommonSelfPlaying();
state.isPlaying = isPlaying;
state.reportGameInfoExtras = reportGameInfoExtras;
state.reportGameInfoKey = reportGameInfoKey;
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_PLAYING, SudJsonUtils.toJson(state), null);
}
}
/**
* 发送
* 4. 队长状态
* 用户是否为队长队长在游戏中会有开始游戏的权利
* 发送此状态后会把队长身份转移到另一名用户身上
* 注意必须是队长发送才有效果可通过{@link SudFSMMGDecorator#getCaptainUserId()}拿到当前队长id
*
* @param curCaptainUID 必填指定队长uid
*/
public void notifyAPPCommonSelfCaptain(String curCaptainUID) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonSelfCaptain state = new SudMGPAPPState.APPCommonSelfCaptain();
state.curCaptainUID = curCaptainUID;
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_CAPTAIN, SudJsonUtils.toJson(state), null);
}
}
/**
* 发送
* 5. 踢人
* 用户本人队长踢其他玩家
* 队长才能踢人
*
* @param kickedUID 被踢用户uid
*/
public void notifyAPPCommonSelfKick(String kickedUID) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonSelfKick state = new SudMGPAPPState.APPCommonSelfKick();
state.kickedUID = kickedUID;
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_KICK, SudJsonUtils.toJson(state), null);
}
}
/**
* 发送
* 6. 结束游戏
* 用户本人队长结束本局游戏
* 注意必须是队长发送才有效果可通过{@link SudFSMMGDecorator#getCaptainUserId()}拿到当前队长id
*/
public void notifyAPPCommonSelfEnd() {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonSelfEnd state = new SudMGPAPPState.APPCommonSelfEnd();
// 使用iSudFSTAPP.notifyStateChange方法向游戏侧发送状态时因为大部分状态都需要通过网络向后端发送状态指令
// 所以如果发送状态后马上就销毁游戏或者Activity那么状态指令大概率会不生效
// *** 如果要确保指令能到达后端那么发送指令后不要立即destroyMG()或finish Activity可在发送后delay一定时间(如300 or 500 ms)再销毁
// *** 如果不在乎指令是否能成功到达可忽略delay
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_END, SudJsonUtils.toJson(state), null);
}
}
/**
* 发送
* 9. 麦克风状态
* 用户本人麦克风状态建议
* 进入房间后初始通知一次
* 每次变更开麦/闭麦/禁麦/解麦通知一次
*
* @param isOn true 开麦false 闭麦
* @param isDisabled true 被禁麦false 未被禁麦
*/
public void notifyAPPCommonSelfMicrophone(boolean isOn, boolean isDisabled) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonSelfMicrophone state = new SudMGPAPPState.APPCommonSelfMicrophone();
state.isOn = isOn;
state.isDisabled = isDisabled;
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_MICROPHONE, SudJsonUtils.toJson(state), null);
}
}
/**
* 发送
* 10. 文字命中状态
* 用户本人聊天信息命中关键词状态建议
* 精确匹配
* 首次聊天内容命中关键词之后后续聊天内容不翻转成未命中
* 直至小游戏侧关键词更新再将状态翻转为未命中
*
* @param isHit true 命中false 未命中
* @param keyWord 单个关键词 兼容老版本
* @param text 返回转写文本
* @param wordType text:文本包含匹配; number:数字等于匹配
* @param keyWordList 命中关键词可以包含多个关键词
* @param numberList 在number模式下才有返回转写的多个数字
*/
public void notifyAPPCommonSelfTextHitState(boolean isHit, String keyWord, String text,
String wordType, List<String> keyWordList, List<Integer> numberList) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonSelfTextHitState state = new SudMGPAPPState.APPCommonSelfTextHitState();
state.isHit = isHit;
state.keyWord = keyWord;
state.text = text;
state.wordType = wordType;
state.keyWordList = keyWordList;
state.numberList = numberList;
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_TEXT_HIT, SudJsonUtils.toJson(state), null);
}
}
/**
* 发送
* 11. 打开或关闭背景音乐2021-12-27新增
*
* @param isOpen true 打开背景音乐false 关闭背景音乐
*/
public void notifyAPPCommonOpenBgMusic(boolean isOpen) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonOpenBgMusic state = new SudMGPAPPState.APPCommonOpenBgMusic();
state.isOpen = isOpen;
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_OPEN_BG_MUSIC, SudJsonUtils.toJson(state), null);
}
}
/**
* 发送
* 12. 打开或关闭音效2021-12-27新增
*
* @param isOpen true 打开音效false 关闭音效
*/
public void notifyAPPCommonOpenSound(boolean isOpen) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonOpenSound state = new SudMGPAPPState.APPCommonOpenSound();
state.isOpen = isOpen;
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_OPEN_SOUND, SudJsonUtils.toJson(state), null);
}
}
/**
* 发送
* 13. 打开或关闭游戏中的振动效果2021-12-27新增
*
* @param isOpen 打开振动效果false 关闭振动效果
*/
public void notifyAPPCommonOpenVibrate(boolean isOpen) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonOpenVibrate state = new SudMGPAPPState.APPCommonOpenVibrate();
state.isOpen = isOpen;
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_OPEN_VIBRATE, SudJsonUtils.toJson(state), null);
}
}
/**
* 发送
* 14. 设置游戏的音量大小2021-12-31新增
*
* @param volume 音量大小 0 100
*/
public void notifyAPPCommonGameSoundVolume(int volume) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonGameSoundVolume state = new SudMGPAPPState.APPCommonGameSoundVolume();
state.volume = volume;
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_SOUND_VOLUME, SudJsonUtils.toJson(state), null);
}
}
/**
* 发送
* 15. 设置游戏玩法选项2022-05-10新增
*
* @param ludo ludo游戏
*/
public void notifyAPPCommonGameSettingSelectInfo(SudMGPAPPState.Ludo ludo) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonGameSettingSelectInfo state = new SudMGPAPPState.APPCommonGameSettingSelectInfo();
state.ludo = ludo;
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_SETTING_SELECT_INFO, SudJsonUtils.toJson(state), null);
}
}
/**
* 发送
* 16. 设置游戏中的AI玩家2022-05-11新增
*
* @param aiPlayers AI玩家
* @param isReady 机器人加入后是否自动准备 1自动准备0不自动准备 默认为1
*/
public void notifyAPPCommonGameAddAIPlayers(List<SudMGPAPPState.AIPlayers> aiPlayers, int isReady) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonGameAddAIPlayers state = new SudMGPAPPState.APPCommonGameAddAIPlayers();
state.aiPlayers = aiPlayers;
state.isReady = isReady;
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_ADD_AI_PLAYERS, SudJsonUtils.toJson(state), null);
}
}
/**
* 发送
* 17. app在收到游戏断开连接通知后通知游戏重试连接2022-06-21新增暂时支持ludo
*/
public void notifyAPPCommonGameReconnect() {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonGameReconnect state = new SudMGPAPPState.APPCommonGameReconnect();
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_RECONNECT, SudJsonUtils.toJson(state), null);
}
}
/**
* 发送
* 18. app返回玩家当前积分
*/
public void notifyAPPCommonGameScore(long score) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.APPCommonGameScore state = new SudMGPAPPState.APPCommonGameScore();
state.score = score;
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_SCORE, SudJsonUtils.toJson(state), null);
}
}
// endregion 状态通知ISudFSTAPP.notifyStateChange
// region 生命周期
public void startMG() {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
iSudFSTAPP.startMG();
}
}
public void pauseMG() {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
iSudFSTAPP.pauseMG();
}
}
public void playMG() {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
iSudFSTAPP.playMG();
}
}
public void stopMG() {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
iSudFSTAPP.stopMG();
}
}
public void destroyMG() {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
iSudFSTAPP.destroyMG();
}
}
// endregion 生命周期
/**
* 更新code
*
* @param code
* @param listener
*/
public void updateCode(String code, ISudListenerNotifyStateChange listener) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
iSudFSTAPP.updateCode(code, listener);
}
}
/**
* 音频流数据
*/
public void pushAudio(ByteBuffer buffer, int bufferLength) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
iSudFSTAPP.pushAudio(buffer, bufferLength);
}
}
// region 元宇宙砂砂舞
/**
* 发送
* 1. 元宇宙砂砂舞相关设置
* 参考文档https://docs.sud.tech/zh-CN/app/Client/APPFST/CommonStateForDisco.html
*
* @param actionId 必传的参数用于指定类型的序号不同序号用于区分游戏内的不同功能不传则会判断为无效指令具体序号代表的功能见下表
* @param cooldown 持续时间单位秒部分功能有持续时间就需要传对应的数值不传或传错则会按各自功能的默认值处理见下表
* @param isTop 是否置顶针对部分功能可排队置顶false不置顶true置顶默认为false
* @param field1 额外参数1针对部分功能有具体的意义
* @param field2 额外参数2针对部分功能有具体的意义
*/
public void notifyAppCommonGameDiscoAction(int actionId, Integer cooldown, Boolean isTop, String field1, String field2) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
SudMGPAPPState.AppCommonGameDiscoAction state = new SudMGPAPPState.AppCommonGameDiscoAction();
state.actionId = actionId;
state.cooldown = cooldown;
state.isTop = isTop;
state.field1 = field1;
state.field2 = field2;
iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_DISCO_ACTION, SudJsonUtils.toJson(state), null);
}
}
// endregion 元宇宙砂砂舞
/**
* APP状态通知给小游戏
*
* @param state 状态标识
* @param dataJson 数据
* @param listener 回调监听
*/
public void notifyStateChange(String state, String dataJson, ISudListenerNotifyStateChange listener) {
ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
if (iSudFSTAPP != null) {
iSudFSTAPP.notifyStateChange(state, dataJson, listener);
}
}
/**
* APP状态通知给小游戏
*
* @param state 状态标识
* @param dataJson 数据
*/
public void notifyStateChange(String state, String dataJson) {
notifyStateChange(state, dataJson, null);
}
/**
* APP状态通知给小游戏
*
* @param state 状态标识
* @param obj 数据
*/
public void notifyStateChange(String state, Object obj) {
notifyStateChange(state, SudJsonUtils.toJson(obj), null);
}
}

View File

@ -0,0 +1,256 @@
/*
* Copyright © Sud.Tech
* https://sud.tech
*/
package com.yunbao.common.sud.model;
import java.io.Serializable;
/**
* 游戏配置模型
* 参考文档https://docs.sud.tech/zh-CN/app/Client/API/ISudFSMMG/onGetGameCfg.html
*/
public class GameConfigModel implements Serializable {
public int gameMode = 1; // 游戏模式每个游戏默认模式是1不填是1
public int gameCPU = 0; // 游戏CPU值为0和10CPU正常功耗1CPU低功耗默认是0CPU正常功耗
public int gameSoundControl = 0; // 游戏中声音的播放是否被app层接管值为0和10游戏播放声音1app层播放声音游戏中不播放任何声音默认是0
public int gameSoundVolume = 100; // 游戏中音量的大小值为0到100默认是100
public GameUi ui = new GameUi(); // 对游戏ui界面的配置可定制ui界面的显示与不显示
// 游戏配置中ui部分
public static class GameUi implements Serializable {
public GameSettle gameSettle = new GameSettle(); // 结算界面
public GamePing ping = new GamePing(); // 界面中的ping值
public GameVersion version = new GameVersion(); // 界面中的版本信息值
public GameLevel level = new GameLevel(); // 大厅中的段位信息
public GameLobbySettingBtn lobby_setting_btn = new GameLobbySettingBtn(); // 大厅的设置按钮
public GameLobbyHelpBtn lobby_help_btn = new GameLobbyHelpBtn(); // 大厅的帮助按钮
public GameLobbyPlayers lobby_players = new GameLobbyPlayers(); // 大厅玩家展示位
public GameLobbyPlayerCaptainIcon lobby_player_captain_icon = new GameLobbyPlayerCaptainIcon(); // 大厅玩家展示位上队长标识
public GameLobbyPlayerKickoutIcon lobby_player_kickout_icon = new GameLobbyPlayerKickoutIcon(); // 大厅玩家展示位上踢人标识
public GameLobbyRule lobby_rule = new GameLobbyRule(); // 大厅的玩法规则描述文字
public GameLobbyGameSetting lobby_game_setting = new GameLobbyGameSetting(); // 玩法设置
public GameJoinBtn join_btn = new GameJoinBtn(); // 加入按钮
public GameCancelJoinBtn cancel_join_btn = new GameCancelJoinBtn(); // 取消加入按钮
public GameReadyBtn ready_btn = new GameReadyBtn(); // 准备按钮
public GameCancelReadyBtn cancel_ready_btn = new GameCancelReadyBtn(); // 取消准备按钮
public GameStartBtn start_btn = new GameStartBtn(); // 开始按钮
public GameShareBtn share_btn = new GameShareBtn(); // 分享
public GameSttingBtn game_setting_btn = new GameSttingBtn(); // 游戏场景中的设置按钮
public GameHelpBtn game_help_btn = new GameHelpBtn(); // 游戏场景中的帮助按钮
public GameSettleCloseBtn game_settle_close_btn = new GameSettleCloseBtn(); // 游戏结算界面中的关闭按钮
public GameSettleAgainBtn game_settle_again_btn = new GameSettleAgainBtn(); // 游戏结算界面中的再来一局按钮
public GameBg game_bg = new GameBg();// 是否隐藏背景图包括大厅和战斗
public BlockChangeSeat block_change_seat = new BlockChangeSeat(); // 自定义阻止换座位
public GameSettingSelectPnl game_setting_select_pnl = new GameSettingSelectPnl(); // 大厅中的玩法选择设置面板
public GameManagedImage game_managed_image = new GameManagedImage(); // 游戏中的托管图标
public GameTableImage game_table_image = new GameTableImage(); // 游戏中牌桌背景图 只对某些带牌桌类游戏有作用
public GameCountdownTime game_countdown_time = new GameCountdownTime(); // 游戏中游戏倒计时显示 现在只针对umo生效
public GameSelectedTips game_selected_tips = new GameSelectedTips(); // 游戏中所选择的玩法提示文字 现在只针对ludo生效
public NFTAvatar nft_avatar = new NFTAvatar(); // 控制NFT头像的开关
public GameOpening game_opening = new GameOpening(); // 控制开场动画的开关
public GameMvp game_mvp = new GameMvp(); // 游戏结算前的mvp动画
public UmoIcon umo_icon = new UmoIcon(); // 游戏中动画和头像右上角的UMO图标
public Logo logo = new Logo(); // 大厅中的logo
public GamePlayers game_players = new GamePlayers(); // 游戏中的游戏位
}
// 结算界面
public static class GameSettle implements Serializable {
public boolean hide = false; // 是否隐藏结算界面false: 显示 true: 隐藏默认为 false
}
// 界面中的ping值
public static class GamePing implements Serializable {
public boolean hide = false; // 是否隐藏ping值false: 显示true: 隐藏默认为false
}
// 界面中的版本信息值
public static class GameVersion implements Serializable {
public boolean hide = false; // 是否隐藏版本信息false: 显示 true: 隐藏默认为false
}
// 大厅中的段位信息
public static class GameLevel implements Serializable {
public boolean hide = false; // 是否隐藏段位信息false: 显示 true: 隐藏默认为false
}
// 大厅的设置按钮
public static class GameLobbySettingBtn implements Serializable {
public boolean hide = false; // 是否隐藏大厅的设置按钮false: 显示 true: 隐藏默认为false
}
// 大厅的帮助按钮
public static class GameLobbyHelpBtn implements Serializable {
public boolean hide = false; // 是否隐藏大厅的帮助按钮false: 显示 true: 隐藏默认为false
}
// 大厅玩家展示位
public static class GameLobbyPlayers implements Serializable {
public boolean custom = false; // 大厅玩家展示位头像点击加入false: 游戏处理逻辑 true: 游戏只通知按钮点击事件不处理默认为false
public boolean hide = false; // 是否隐藏大厅玩家展示位false: 显示 true: 隐藏默认为false
}
// 大厅玩家展示位上队长标识
public static class GameLobbyPlayerCaptainIcon implements Serializable {
public boolean hide = false; // 是否隐藏大厅玩家展示位上队长标识false: 显示 true: 隐藏默认为false
}
// 大厅玩家展示位上踢人标识
public static class GameLobbyPlayerKickoutIcon implements Serializable {
public boolean hide = false; // 是否隐藏大厅玩家展示位上踢人标识false: 显示 true: 隐藏默认为false
}
// 大厅的玩法规则描述文字
public static class GameLobbyRule implements Serializable {
public boolean hide = false; // 是否隐藏大厅的玩法规则描述文字false: 显示 true: 隐藏默认为false
}
// 玩法设置
public static class GameLobbyGameSetting implements Serializable {
public boolean hide = false; // 是否隐藏玩法设置false: 显示 true: 隐藏默认为false
}
// 加入按钮
public static class GameJoinBtn implements Serializable {
public boolean custom = false; // 加入按钮false: 游戏处理逻辑 true: 游戏只通知按钮点击事件不处理默认为false
public boolean hide = false; // 是否隐藏加入按钮false: 显示 true: 隐藏默认为false
}
// 取消加入按钮
public static class GameCancelJoinBtn implements Serializable {
public boolean custom = false; // 取消加入按钮false: 游戏处理逻辑 true: 游戏只通知按钮点击事件不处理默认为false
public boolean hide = false; // 是否隐藏取消加入按钮false: 显示 true: 隐藏默认为false
}
// 准备按钮
public static class GameReadyBtn implements Serializable {
public boolean custom = false; // 准备按钮false: 游戏处理逻辑 true: 游戏只通知按钮点击事件不处理默认为false
public boolean hide = false; // 是否隐藏准备按钮false: 显示 true: 隐藏默认为false
}
// 取消准备按钮
public static class GameCancelReadyBtn implements Serializable {
public boolean custom = false; // 取消准备按钮false: 游戏处理逻辑 true: 游戏只通知按钮点击事件不处理默认为false
public boolean hide = false; // 是否隐藏取消准备按钮false: 显示 true: 隐藏默认为false
}
// 开始游戏按钮
public static class GameStartBtn implements Serializable {
public boolean custom = false; // 开始游戏按钮false: 游戏处理逻辑 true: 游戏只通知按钮点击事件不处理默认为false
public boolean hide = false; // 是否隐藏开始游戏按钮false: 显示 true: 隐藏默认为false
}
// 分享按钮
public static class GameShareBtn implements Serializable {
public boolean custom = false; // 分享按钮false: 游戏处理逻辑 true: 游戏只通知按钮点击事件不处理默认为false
public boolean hide = true; // 是否隐藏分享按钮false: 显示 true: 隐藏默认为true
}
// 游戏场景中的设置按钮
public static class GameSttingBtn implements Serializable {
public boolean hide = false; // 是否隐藏游戏场景中的设置按钮false: 显示 true: 隐藏默认为false
}
// 游戏场景中的帮助按钮
public static class GameHelpBtn implements Serializable {
public boolean hide = false; // 是否隐藏游戏场景中的帮助按钮false: 显示 true: 隐藏默认为false
}
// 游戏结算界面中的关闭按钮
public static class GameSettleCloseBtn implements Serializable {
public boolean custom = false; // 游戏结算界面中的关闭按钮false: 关闭结算界面返回大厅 true: 游戏通知按钮点击事件并关闭结算界面返回大厅默认为false
}
// 游戏结算界面中的再来一局按钮
public static class GameSettleAgainBtn implements Serializable {
// 游戏结算界面中的再来一局按钮
// false: 关闭结算界面返回大厅并将玩家设置为准备状态 true: 游戏通知按钮点击事件并关闭结算界面返回大厅不将玩家设置为准备状态默认为false
public boolean custom = false;
// 是否隐藏结算界面中的再来一局按钮false: 显示 true: 隐藏默认为false
public boolean hide = false;
}
// 是否隐藏背景图包括大厅和战斗
// 这里只隐藏加载完成后的背景图加载中背景图如需隐藏则调用{SudMGP.getCfg().setShowLoadingGameBg(false); }
public static class GameBg implements Serializable {
//false: 显示 true: 隐藏默认为false
public boolean hide = false;
}
// 自定义阻止换座位
public static class BlockChangeSeat implements Serializable {
//false: 可以换座位 true: 不可以换座位默认为false
public boolean custom = false;
}
// 大厅中的玩法选择设置面板
public static class GameSettingSelectPnl implements Serializable {
// 是否隐藏大厅中的玩法选择设置面板false: 显示 true: 隐藏默认为false
public boolean hide = false;
}
// 游戏中的托管图标
public static class GameManagedImage implements Serializable {
// 是否隐藏游戏中的托管图标false: 显示 true: 隐藏默认为false
public boolean hide = false;
}
// 游戏中牌桌背景图 只对某些带牌桌类游戏有作用
public static class GameTableImage implements Serializable {
// 是否隐藏游戏牌桌背景图false: 显示 true: 隐藏默认为false
public boolean hide = false;
}
// 游戏中游戏倒计时显示 现在只针对umo生效
public static class GameCountdownTime implements Serializable {
// 是否隐藏游戏中游戏倒计时显示false: 显示 true: 隐藏默认为false
public boolean hide = false;
}
// 游戏中所选择的玩法提示文字 现在只针对ludo生效
public static class GameSelectedTips implements Serializable {
// 是否隐藏游戏中所选择的玩法提示文字显示false: 显示 true: 隐藏默认为false
public boolean hide = false;
}
// 控制NFT头像的开关
public static class NFTAvatar implements Serializable {
// true隐藏 false显示
public boolean hide = true;
}
// 控制开场动画的开关
public static class GameOpening implements Serializable {
// true隐藏 false显示
public boolean hide = true;
}
// 游戏结算前的mvp动画
public static class GameMvp implements Serializable {
// true隐藏 false显示
public boolean hide = true;
}
// 游戏中动画和头像右上角的UMO图标
public static class UmoIcon implements Serializable {
// 是否隐藏游戏中动画和头像右上角的UMO图标并改为UNOfalse: 不隐藏依然显示UMO true: 隐藏改为显示UNO默认为false
public boolean hide = false;
}
// 大厅中的logo
public static class Logo implements Serializable {
// 是否隐藏大厅中的logofalse: 不隐藏 true: 隐藏默认为false
public boolean hide = false;
}
// 游戏中的游戏位
public static class GamePlayers implements Serializable {
// 是否隐藏游戏中的游戏位false: 不隐藏 true: 隐藏默认为false暂时只支持你画我猜
public boolean hide = false;
}
}

View File

@ -0,0 +1,44 @@
/*
* Copyright © Sud.Tech
* https://sud.tech
*/
package com.yunbao.common.sud.model;
/**
* 游戏视图
* 参考文档https://docs.sud.tech/zh-CN/app/Client/API/ISudFSMMG/onGetGameViewInfo.html
*/
public class GameViewInfoModel {
// 返回码
public int ret_code;
// 返回消息
public String ret_msg;
// 游戏View的大小
public GameViewSizeModel view_size = new GameViewSizeModel();
// 游戏安全操作区域
public GameViewRectModel view_game_rect = new GameViewRectModel();
public static class GameViewSizeModel {
// 游戏View的宽 单位像素
public int width;
// 游戏View的高 单位像素
public int height;
}
public static class GameViewRectModel {
// 相对于view_size左边框偏移单位像素
public int left;
// 相对于view_size上边框偏移单位像素
public int top;
// 相对于view_size右边框偏移单位像素
public int right;
// 相对于view_size下边框偏移单位像素
public int bottom;
}
}

View File

@ -0,0 +1,18 @@
/*
* Copyright © Sud.Tech
* https://sud.tech
*/
package com.yunbao.common.sud.state;
/**
* mg2app状态响应
*/
public class MGStateResponse {
// 返回码成功
public static final int SUCCESS = 0;
public int ret_code; // 返回码
public String ret_msg; // 返回消息
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,26 @@
/*
* Copyright © Sud.Tech
* https://sud.tech
*/
package com.yunbao.common.utils;
import com.yunbao.common.sud.state.MGStateResponse;
import tech.sud.mgp.core.ISudFSMStateHandle;
public class ISudFSMStateHandleUtils {
/**
* 回调游戏成功
*
* @param handle
*/
public static void handleSuccess(ISudFSMStateHandle handle) {
MGStateResponse response = new MGStateResponse();
response.ret_code = MGStateResponse.SUCCESS;
response.ret_msg = "success";
handle.success(SudJsonUtils.toJson(response));
}
}

View File

@ -0,0 +1,43 @@
package com.yunbao.common.utils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
/**
* json解析工具
*/
public class SudJsonUtils {
/**
* 解析json
*
* @return 如果解析出错则返回空对象
*/
public static <T> T fromJson(final String json, final Class<T> type) {
try {
return getGson().fromJson(json, type);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 对象解析成json
*
* @param object
* @return
*/
public static String toJson(final Object object) {
return getGson().toJson(object);
}
public static Gson getGson() {
return InnerClass.gson;
}
public static class InnerClass {
public static Gson gson = new GsonBuilder().disableHtmlEscaping().create();
}
}

View File

@ -9,9 +9,9 @@ ext {
] ]
manifestPlaceholders = [ manifestPlaceholders = [
// //
// serverHost : "https://napi.yaoulive.com", serverHost : "https://napi.yaoulive.com",
// //
serverHost : " https://ceshi.yaoulive.com", // serverHost : " https://ceshi.yaoulive.com",