From 4c4796982887a6f677c47ef66b7589e25181282c Mon Sep 17 00:00:00 2001 From: "DESKTOP-5RP3AKU\\Jisol" <2858626794@qq.com> Date: Sat, 2 Dec 2023 02:13:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8D=87=E7=BA=A7=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=20=E6=91=B8=E9=B1=BC=E7=9A=84=E4=B8=80=E5=A4=A9~~~?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JisolGameCocos/assets/script/AppData.ts | 2 + JisolGameCocos/assets/script/consts/GAPI.ts | 9 +++ .../assets/script/data/GOnHookData.ts | 15 ++++ .../assets/script/data/GOnHookData.ts.meta | 9 +++ JisolGameServer/JNGame | 2 +- .../java/cn/jisol/game/JGameApplication.java | 3 +- .../exception/HTTPExceptionHandler.java | 7 ++ .../exception/ResourceNotException.java | 9 +++ .../controller/game/GPlayerPetController.java | 2 - .../game/mode/GOnHookController.java | 34 +++++++++ .../cn/jisol/game/entity/mode/ModeOnHook.java | 21 ++++++ .../jisol/game/mapper/ModeOnHookMapper.java | 11 +++ .../jisol/game/service/ModeOnHookService.java | 8 +++ .../service/impl/ModeOnHookServiceImpl.java | 12 ++++ .../service/impl/ResourceServiceImpl.java | 69 +++++++++---------- 15 files changed, 173 insertions(+), 40 deletions(-) create mode 100644 JisolGameCocos/assets/script/data/GOnHookData.ts create mode 100644 JisolGameCocos/assets/script/data/GOnHookData.ts.meta create mode 100644 JisolGameServer/Main/src/main/java/cn/jisol/game/controller/exception/ResourceNotException.java create mode 100644 JisolGameServer/Main/src/main/java/cn/jisol/game/entity/mode/ModeOnHook.java create mode 100644 JisolGameServer/Main/src/main/java/cn/jisol/game/mapper/ModeOnHookMapper.java create mode 100644 JisolGameServer/Main/src/main/java/cn/jisol/game/service/ModeOnHookService.java create mode 100644 JisolGameServer/Main/src/main/java/cn/jisol/game/service/impl/ModeOnHookServiceImpl.java diff --git a/JisolGameCocos/assets/script/AppData.ts b/JisolGameCocos/assets/script/AppData.ts index c47b0b3f..e12ee0b9 100644 --- a/JisolGameCocos/assets/script/AppData.ts +++ b/JisolGameCocos/assets/script/AppData.ts @@ -2,6 +2,7 @@ import SystemBase from "../../extensions/ngame/assets/ngame/system/SystemBase"; import { app } from "./App"; import BaseData from "./data/BaseData"; import ChatData from "./data/ChatData"; +import GOnHookData from "./data/GOnHookData"; import PlayerData from "./data/PlayerData"; import PlayerPetData from "./data/PlayerPetData"; import PlayerTacticalData from "./data/PlayerTacticalData"; @@ -18,6 +19,7 @@ export class AppData extends SystemBase{ ChatData.getIns(), //聊天 PlayerTacticalData.getIns(), //阵法 ResourceData.getIns(), //玩家资源 + GOnHookData.getIns(), //无限模式信息类 (无限模式是游戏基础模式玩法 需要默认信息) ]; async onInit(): Promise { diff --git a/JisolGameCocos/assets/script/consts/GAPI.ts b/JisolGameCocos/assets/script/consts/GAPI.ts index 3eaa7c91..9ebb690c 100644 --- a/JisolGameCocos/assets/script/consts/GAPI.ts +++ b/JisolGameCocos/assets/script/consts/GAPI.ts @@ -3,9 +3,18 @@ import { app } from "../App"; import { PlayerPetOV, RData, RProto } from "./API"; import { GActionType } from "./GActionType"; +export interface ModeOnHookOV{ + + playerId:number; //玩家Id + onHookMap:number; //当前玩家所在的地图(配置表Id) + +} + export const GAPI = { /************** 无限模式接口 ********************/ + //获取模式信息 + GOnHookInfo : async () => RData(await app.api.get(`/game/mode/onHook/info`)) as ModeOnHookOV, //生成野怪 GOnHookSpawnCreeps : async () => RProto(await app.api.get(`/game/mode/onHook/onSpawnCreeps`,{responseType:'arraybuffer'}),GActionType.GOnHookPets) as GOnHookPets, //捕捉野怪 diff --git a/JisolGameCocos/assets/script/data/GOnHookData.ts b/JisolGameCocos/assets/script/data/GOnHookData.ts new file mode 100644 index 00000000..0632c227 --- /dev/null +++ b/JisolGameCocos/assets/script/data/GOnHookData.ts @@ -0,0 +1,15 @@ +import { GAPI, ModeOnHookOV } from "../consts/GAPI"; +import BaseData from "./BaseData"; + +//无限模式数据类 +export default class GOnHookData extends BaseData{ + + info:ModeOnHookOV; + + async onInit() { + this.info = await GAPI.GOnHookInfo(); + console.log("GOnHookData Info",this.info); + } + +} + diff --git a/JisolGameCocos/assets/script/data/GOnHookData.ts.meta b/JisolGameCocos/assets/script/data/GOnHookData.ts.meta new file mode 100644 index 00000000..c6bbeb71 --- /dev/null +++ b/JisolGameCocos/assets/script/data/GOnHookData.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.23", + "importer": "typescript", + "imported": true, + "uuid": "f5a8c28b-dae6-4393-b922-3fbc5097400d", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameServer/JNGame b/JisolGameServer/JNGame index cd18e8d3..87cdbc5b 160000 --- a/JisolGameServer/JNGame +++ b/JisolGameServer/JNGame @@ -1 +1 @@ -Subproject commit cd18e8d3444e584393b0dca23a1c11e0ab3c691f +Subproject commit 87cdbc5b91be3f46c06c6a647ed9cf3525a009eb diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/JGameApplication.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/JGameApplication.java index 20faf52b..8dc54016 100644 --- a/JisolGameServer/Main/src/main/java/cn/jisol/game/JGameApplication.java +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/JGameApplication.java @@ -5,8 +5,9 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; +import org.springframework.retry.annotation.EnableRetry; - +@EnableRetry @MapperScan(basePackages = "cn.jisol.game.mapper") @SpringBootApplication public class JGameApplication { diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/exception/HTTPExceptionHandler.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/exception/HTTPExceptionHandler.java index f68f7d7b..db501c47 100644 --- a/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/exception/HTTPExceptionHandler.java +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/exception/HTTPExceptionHandler.java @@ -18,6 +18,13 @@ public class HTTPExceptionHandler { return NewsContext.onMessage("Token 失效",null,LOGIN_TOKEN); } + //材料不够 + @ExceptionHandler(value = ResourceNotException.class) + @ResponseBody + public NewsContext retryExceptionHandler(ResourceNotException e){ + return NewsContext.onFail("材料不够."); + } + //并发异常 @ExceptionHandler(value = RetryException.class) @ResponseBody diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/exception/ResourceNotException.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/exception/ResourceNotException.java new file mode 100644 index 00000000..642b6123 --- /dev/null +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/exception/ResourceNotException.java @@ -0,0 +1,9 @@ +package cn.jisol.game.controller.exception; + +public class ResourceNotException extends RuntimeException{ + public ResourceNotException() { + } + public ResourceNotException(String message) { + super(message); + } +} diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/GPlayerPetController.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/GPlayerPetController.java index b0e0fb7c..51c18650 100644 --- a/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/GPlayerPetController.java +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/GPlayerPetController.java @@ -62,7 +62,6 @@ public class GPlayerPetController { @ApiOperation(value = "提升宠物星") @PostMapping("/up/star") @Transactional - @Retryable(value = RetryException.class) public NewsResource onUpStar(@RequestBody PetUpStarOV info, @CurrentPlayer Player player){ //判断参数 @@ -132,7 +131,6 @@ public class GPlayerPetController { @ApiOperation(value = "提升宠物等级") @PostMapping("/up/level/{petId}") @Transactional - @Retryable(value = RetryException.class) public NewsResource onUpLevel(@PathVariable Integer petId, @CurrentPlayer Player player){ //整理刷新数据 diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/mode/GOnHookController.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/mode/GOnHookController.java index 51e81297..b1aa41db 100644 --- a/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/mode/GOnHookController.java +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/mode/GOnHookController.java @@ -1,5 +1,6 @@ package cn.jisol.game.controller.game.mode; +import cfg.TB.TbGOnHookMaps; import cfg.TB.TbGRole; import cn.hutool.core.util.RandomUtil; import cn.jisol.game.controller.argsresolver.CurrentPlayer; @@ -9,7 +10,9 @@ import cn.jisol.game.data.TD; import cn.jisol.game.entity.game.Player; import cn.jisol.game.entity.game.PlayerPet; import cn.jisol.game.entity.game.Resource; +import cn.jisol.game.entity.mode.ModeOnHook; import cn.jisol.game.proto.GOnHookMessage; +import cn.jisol.game.service.ModeOnHookService; import cn.jisol.game.service.PlayerPetService; import cn.jisol.game.service.ResourceService; import cn.jisol.game.vo.news.NewsResource; @@ -22,6 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.retry.RetryException; +import org.springframework.retry.annotation.Retryable; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; @@ -40,10 +44,40 @@ public class GOnHookController { PlayerPetService playerPetService; @Autowired ResourceService resourceService; + @Autowired + ModeOnHookService modeOnHookService; //生成的野怪列表 public static Map> CREEPS = new HashMap<>(); + //获取玩家模式信息 + @ApiImplicitParams({}) + @ApiOperation(value = "生成野怪") + @GetMapping("/info") + @Retryable(value = RetryException.class) + public NewsContext getInfo(@CurrentPlayer Player player){ + + ModeOnHook info = modeOnHookService.getById(player.getPlayerId()); + + //如果没有信息则初始化默认信息 + if(Objects.isNull(info)){ + //获取第一个地图 + TbGOnHookMaps oneMapInfo = TD.DATA.getTbGOnHookMaps().getDataList().get(0); + if(Objects.isNull(oneMapInfo)){ + return NewsResource.onFail("获取信息失败 没有地图信息"); + } + modeOnHookService.save(ModeOnHook.builder() + .playerId(player.getPlayerId()) + .onHookMap(oneMapInfo.id) + .build()); + //并且重试获取 + throw new RetryException(""); + } + + return NewsContext.onSuccess("获取成功",info); + + } + //生成野怪 @ApiImplicitParams({}) @ApiOperation(value = "生成野怪") diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/entity/mode/ModeOnHook.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/entity/mode/ModeOnHook.java new file mode 100644 index 00000000..1678d4ed --- /dev/null +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/entity/mode/ModeOnHook.java @@ -0,0 +1,21 @@ +package cn.jisol.game.entity.mode; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Builder; +import lombok.Data; + +/** + * 玩家 无限模式(OnHook) 信息 + */ +@Builder +@Data +@TableName("`mode_on_hook`") +public class ModeOnHook { + + @TableId(type = IdType.INPUT) + private Long playerId; //玩家Id + private Integer onHookMap; //当前玩家所在的地图(配置表Id) + +} diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/mapper/ModeOnHookMapper.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/mapper/ModeOnHookMapper.java new file mode 100644 index 00000000..10ca89d7 --- /dev/null +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/mapper/ModeOnHookMapper.java @@ -0,0 +1,11 @@ +package cn.jisol.game.mapper; + +import cn.jisol.game.entity.game.Player; +import cn.jisol.game.entity.mode.ModeOnHook; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springframework.stereotype.Component; + +@Component +public interface ModeOnHookMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/service/ModeOnHookService.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/service/ModeOnHookService.java new file mode 100644 index 00000000..a4949c40 --- /dev/null +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/service/ModeOnHookService.java @@ -0,0 +1,8 @@ +package cn.jisol.game.service; + +import cn.jisol.game.entity.mode.ModeOnHook; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface ModeOnHookService extends IService { + +} diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/service/impl/ModeOnHookServiceImpl.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/service/impl/ModeOnHookServiceImpl.java new file mode 100644 index 00000000..d44b7613 --- /dev/null +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/service/impl/ModeOnHookServiceImpl.java @@ -0,0 +1,12 @@ +package cn.jisol.game.service.impl; + +import cn.jisol.game.entity.mode.ModeOnHook; +import cn.jisol.game.mapper.ModeOnHookMapper; +import cn.jisol.game.service.ModeOnHookService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service +public class ModeOnHookServiceImpl extends ServiceImpl implements ModeOnHookService { + +} diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/service/impl/ResourceServiceImpl.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/service/impl/ResourceServiceImpl.java index 371ccd08..809393ea 100644 --- a/JisolGameServer/Main/src/main/java/cn/jisol/game/service/impl/ResourceServiceImpl.java +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/service/impl/ResourceServiceImpl.java @@ -1,10 +1,12 @@ package cn.jisol.game.service.impl; +import cn.jisol.game.controller.exception.ResourceNotException; import cn.jisol.game.data.ResourceId; import cn.jisol.game.entity.game.Player; import cn.jisol.game.entity.game.Resource; import cn.jisol.game.mapper.ResourceMapper; import cn.jisol.game.service.ResourceService; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.retry.RetryException; @@ -24,53 +26,48 @@ public class ResourceServiceImpl extends ServiceImpl i * @return */ @Override - @Retryable(value = RetryException.class) + @Retryable(RetryException.class) public Resource addResourceValue(Long playerId, int type, Long value) { - //获取玩家资源 + + LambdaUpdateWrapper eq = Wrappers.lambdaUpdate(Resource.class) + .eq(Resource::getPlayerId, playerId) //玩家 + .eq(Resource::getResourceTbId, type);//资源 + + if(value < 0) { + eq.gt(Resource::getResourceValue,Math.abs(value)); + } + + //执行SQL + boolean update = this.update( + eq.setSql("version = version + 1,resource_value = resource_value + " + value) + ); + + //查询货币数量 Resource res = this.getOne( Wrappers.lambdaQuery(Resource.class) .eq(Resource::getPlayerId, playerId) //玩家 .eq(Resource::getResourceTbId, type) //资源 ); - //如果没有资源则默认给一个0的资源 - if(Objects.isNull(res)){ - //创建初始资源 - res = this.initResource(playerId,type); - } - - if(value > 0){ - - //如果是累加 则 执行累加sql - if(this.update( - Wrappers.lambdaUpdate(Resource.class) - .eq(Resource::getPlayerId, playerId) //玩家 - .eq(Resource::getResourceTbId, type) //资源 - .setSql("version = version + 1,resource_value = resource_value + "+value) - )){ - //添加资源 - res.setResourceValue(res.getResourceValue() + value); - return res; - }else{ + if(!update){ + if(Objects.isNull(res)){ + //没有资源信息 创建初始资源 + res = this.initResource(playerId,type); + //并且重试 throw new RetryException(""); + }else{ + //更新失败 材料不够 + throw new ResourceNotException("资源不够"); } - - }else{ - - //添加资源 - res.setResourceValue(res.getResourceValue() + value); - - if(res.getResourceValue() <= 0){ - return null; - } - - //保存资源 (保存失败重试) - if (!this.saveOrUpdate(res)) throw new RetryException(""); - - return res; } + + //如果资源不够则报错 + if(res.getResourceValue() < 0) throw new ResourceNotException("资源不够"); + + return res; + } //初始化某个资源 @@ -83,7 +80,7 @@ public class ResourceServiceImpl extends ServiceImpl i @Override public Resource initResource(Resource resource) { - this.saveOrUpdate(resource); + this.save(resource); return resource; }