mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-09-26 10:16:14 +00:00
提交资源
This commit is contained in:
@@ -17,9 +17,11 @@ import com.google.gson.JsonObject;
|
||||
public final class TbGResource extends AbstractBean {
|
||||
public TbGResource(JsonObject _buf) {
|
||||
id = _buf.get("id").getAsInt();
|
||||
icon = _buf.get("icon").getAsString();
|
||||
name = _buf.get("name").getAsString();
|
||||
tig = _buf.get("tig").getAsString();
|
||||
args = _buf.get("args").getAsString();
|
||||
quality = _buf.get("quality").getAsInt();
|
||||
}
|
||||
|
||||
public static TbGResource deserialize(JsonObject _buf) {
|
||||
@@ -30,6 +32,10 @@ public final class TbGResource extends AbstractBean {
|
||||
* id
|
||||
*/
|
||||
public final int id;
|
||||
/**
|
||||
* 资源图片
|
||||
*/
|
||||
public final String icon;
|
||||
/**
|
||||
* 资源名称
|
||||
*/
|
||||
@@ -42,6 +48,10 @@ public final class TbGResource extends AbstractBean {
|
||||
* 额外参数
|
||||
*/
|
||||
public final String args;
|
||||
/**
|
||||
* 资源品质
|
||||
*/
|
||||
public final int quality;
|
||||
|
||||
public static final int __ID__ = 1780642599;
|
||||
|
||||
@@ -52,9 +62,11 @@ public final class TbGResource extends AbstractBean {
|
||||
public String toString() {
|
||||
return "{ "
|
||||
+ "(format_field_name __code_style field.name):" + id + ","
|
||||
+ "(format_field_name __code_style field.name):" + icon + ","
|
||||
+ "(format_field_name __code_style field.name):" + name + ","
|
||||
+ "(format_field_name __code_style field.name):" + tig + ","
|
||||
+ "(format_field_name __code_style field.name):" + args + ","
|
||||
+ "(format_field_name __code_style field.name):" + quality + ","
|
||||
+ "}";
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,117 @@
|
||||
package cn.jisol.game.controller.game.mode;
|
||||
|
||||
import cfg.TB.TbGSysDungeon;
|
||||
import cfg.TbGEntity.TDungeon;
|
||||
import cn.jisol.game.controller.argsresolver.CurrentPlayer;
|
||||
import cn.jisol.game.data.TD;
|
||||
import cn.jisol.game.entity.mode.ModeDungeonType;
|
||||
import cn.jisol.game.entity.table.Dungeon;
|
||||
import cn.jisol.game.entity.table.Player;
|
||||
import cn.jisol.game.service.DungeonService;
|
||||
import cn.jisol.game.service.ResourceService;
|
||||
import cn.jisol.game.table.TableUtil;
|
||||
import cn.jisol.game.vo.news.NewsResource;
|
||||
import cn.jisol.game.vo.news.ov.ResourceUpdateOV;
|
||||
import cn.jisol.ngame.util.NewsContext;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiImplicitParams;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.retry.RetryException;
|
||||
import org.springframework.retry.annotation.Retryable;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Api(value = "JNGameDemo - API", tags = {"副本 - API"})
|
||||
@RestController
|
||||
@RequestMapping("/game/mode/dungeon")
|
||||
@ResponseBody
|
||||
public class GDungeonController {
|
||||
|
||||
@Autowired
|
||||
ResourceService resourceService;
|
||||
@Autowired
|
||||
DungeonService dungeonService;
|
||||
|
||||
//获取副本信息
|
||||
@ApiImplicitParams({})
|
||||
@ApiOperation(value = "获取副本信息")
|
||||
@PostMapping("/info")
|
||||
public NewsContext<Map<Integer,Dungeon>> getInfos(@CurrentPlayer Player player){
|
||||
|
||||
//获取所有副本信息
|
||||
List<Dungeon> list = dungeonService.list(Wrappers.lambdaQuery(Dungeon.class).eq(Dungeon::getPlayerId, player.getPlayerId()));
|
||||
|
||||
Map<Integer,Dungeon> dungeons = new HashMap<>();
|
||||
//获取全部副本
|
||||
TD.DATA.getTbGSysDungeon().getDataList().forEach(info -> {
|
||||
Dungeon dungeon = null;
|
||||
try{
|
||||
dungeon = list.stream().filter(item -> info.id == item.getDungeonCfgId()).collect(Collectors.toList()).get(0);
|
||||
}catch (Exception ignored){}
|
||||
|
||||
if(Objects.isNull(dungeon)){
|
||||
//如果没有数据则生成数据
|
||||
try{
|
||||
//获取当前副本最小的进度
|
||||
Object table = Objects.requireNonNull(TableUtil.getDataList(Objects.requireNonNull(TableUtil.getTDObject(info.tigs)))).get(0);
|
||||
dungeon = Dungeon.builder()
|
||||
.playerId(player.getPlayerId())
|
||||
.dungeonCfgId(info.id)
|
||||
.dungeonCfgItemId(TableUtil.getTableId(table))
|
||||
.build();
|
||||
dungeonService.save(dungeon);
|
||||
}catch (Exception ignored){
|
||||
assert dungeonService != null;
|
||||
dungeon = dungeonService.getOne(Wrappers.lambdaQuery(Dungeon.class).eq(Dungeon::getPlayerId,player.getPlayerId()).eq(Dungeon::getDungeonCfgId,info.id));
|
||||
}
|
||||
}
|
||||
dungeons.put(dungeon.getDungeonCfgId(),dungeon);
|
||||
});
|
||||
|
||||
return NewsContext.onSuccess("获取成功",dungeons);
|
||||
}
|
||||
|
||||
//消耗钥匙挑战副本
|
||||
@ApiImplicitParams({})
|
||||
@ApiOperation(value = "消耗钥匙挑战普通副本")
|
||||
@PostMapping("/challenge/dungeon/{dungeonId}/{dungeonItemId}")
|
||||
@Transactional
|
||||
public NewsResource<Map<Integer,Dungeon>> challengeDungeon(@CurrentPlayer Player player, @PathVariable Integer dungeonId, @PathVariable Integer dungeonItemId){
|
||||
|
||||
TbGSysDungeon tbGSysDungeon = TD.DATA.getTbGSysDungeon().get(dungeonId);
|
||||
if(Objects.isNull(tbGSysDungeon)) return NewsResource.onFail("不存在该副本");
|
||||
if(!tbGSysDungeon.type.equals(ModeDungeonType.GDungeonMode)) return NewsResource.onFail("错误副本");
|
||||
|
||||
//获取副本信息
|
||||
Map<Integer, Dungeon> infos = this.getInfos(player).data;
|
||||
|
||||
//禁止越级挑战
|
||||
if(infos.get(dungeonId).getDungeonCfgItemId() < dungeonItemId) return NewsResource.onFail("请不要越级挑战哦");
|
||||
|
||||
//获取副本
|
||||
TableUtil.TableData tableData = Objects.requireNonNull(TableUtil.getTableData(tbGSysDungeon.tigs));
|
||||
//获取等级数据
|
||||
TDungeon dungeon = Objects.requireNonNull((TDungeon) tableData.get(dungeonItemId).getData());
|
||||
|
||||
//扣除消耗
|
||||
resourceService.addResourceValue(player.getPlayerId(), tbGSysDungeon.consume.id, (long) -tbGSysDungeon.consume.value);
|
||||
|
||||
//更新等级
|
||||
if(infos.get(dungeonId).getDungeonCfgItemId().equals(dungeonItemId)){
|
||||
if(Objects.nonNull(tableData.get(dungeonItemId + 1))){
|
||||
infos.get(dungeonId).setDungeonCfgItemId(dungeonItemId + 1);
|
||||
dungeonService.saveOrUpdate(infos.get(dungeonId));
|
||||
}
|
||||
}
|
||||
|
||||
//发放奖励
|
||||
return NewsResource.onSuccess("挑战成功",infos,resourceService.rewards(player.getPlayerId(), dungeon.rewards));
|
||||
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,8 @@
|
||||
package cn.jisol.game.entity.mode;
|
||||
|
||||
//副本模式类型
|
||||
public interface ModeDungeonType {
|
||||
|
||||
static String GDungeonMode = "GDungeonMode"; //普通模式
|
||||
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
package cn.jisol.game.entity.table;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
|
||||
@Builder
|
||||
@Data
|
||||
@TableName("`dungeon`")
|
||||
public class Dungeon {
|
||||
|
||||
@TableId(type = IdType.AUTO)
|
||||
private Long dungeonId; //副本唯一Id
|
||||
private Long playerId; //副本玩家Id
|
||||
private Integer dungeonCfgId; //副本配置表Id
|
||||
private Integer dungeonCfgItemId; //副本进度表Id
|
||||
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
package cn.jisol.game.mapper;
|
||||
|
||||
import cn.jisol.game.entity.table.Dungeon;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public interface DungeonMapper extends BaseMapper<Dungeon> {
|
||||
|
||||
|
||||
}
|
@@ -0,0 +1,8 @@
|
||||
package cn.jisol.game.service;
|
||||
|
||||
import cn.jisol.game.entity.table.Dungeon;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
public interface DungeonService extends IService<Dungeon> {
|
||||
|
||||
}
|
@@ -1,11 +1,13 @@
|
||||
package cn.jisol.game.service;
|
||||
|
||||
import cfg.TbGEntity.TResource;
|
||||
import cn.jisol.game.entity.table.Player;
|
||||
import cn.jisol.game.entity.table.Resource;
|
||||
import cn.jisol.game.vo.news.ov.ResourceUpdateOV;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public interface ResourceService extends IService<Resource> {
|
||||
|
||||
@@ -25,6 +27,7 @@ public interface ResourceService extends IService<Resource> {
|
||||
//返回通用加速卷 减少的时间(ms)
|
||||
public long timeSpeedUp(int type);
|
||||
|
||||
|
||||
//发放奖励
|
||||
public List<ResourceUpdateOV> rewards(Long playerId,TResource[] rewards);
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,14 @@
|
||||
package cn.jisol.game.service.impl;
|
||||
|
||||
import cn.jisol.game.entity.table.Dungeon;
|
||||
import cn.jisol.game.entity.table.EquipForgingBench;
|
||||
import cn.jisol.game.mapper.DungeonMapper;
|
||||
import cn.jisol.game.mapper.EquipForgingBenchMapper;
|
||||
import cn.jisol.game.service.DungeonService;
|
||||
import cn.jisol.game.service.EquipForgingBenchService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class DungeonServiceImpl extends ServiceImpl<DungeonMapper, Dungeon> implements DungeonService {
|
||||
}
|
@@ -22,7 +22,9 @@ import org.springframework.stereotype.Service;
|
||||
import java.lang.reflect.Array;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
public class ResourceServiceImpl extends ServiceImpl<ResourceMapper, Resource> implements ResourceService {
|
||||
@@ -130,5 +132,10 @@ public class ResourceServiceImpl extends ServiceImpl<ResourceMapper, Resource> i
|
||||
return Integer.parseInt(TD.DATA.getTbGResource().get(type).args) * 1000L;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ResourceUpdateOV> rewards(Long playerId, TResource[] rewards) {
|
||||
return Arrays.stream(rewards).map(reward -> ResourceUpdateOV.onUpdate(this.addResourceValue(playerId, reward.id, (long) reward.value))).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@@ -33,13 +33,7 @@ public class GTbGOnHookLevels {
|
||||
}
|
||||
|
||||
public int getId(){
|
||||
try {
|
||||
Field idField = data.getClass().getField("id");
|
||||
return (int)idField.get(data);
|
||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
return -1;
|
||||
}
|
||||
return TableUtil.getTableId(this.data);
|
||||
}
|
||||
|
||||
public TOnHookLevel getData(){
|
||||
@@ -56,30 +50,20 @@ public class GTbGOnHookLevels {
|
||||
|
||||
//通过Id获取关卡
|
||||
public GTbGOnHookLevel get(int key){
|
||||
try {
|
||||
Method method = this.data.getClass().getMethod("get",int.class);
|
||||
Object data = method.invoke(this.data,key);
|
||||
if(Objects.isNull(data)) return null;
|
||||
return new GTbGOnHookLevel(data);
|
||||
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
|
||||
return null;
|
||||
}
|
||||
Object data = TableUtil.getId(this.data,key);
|
||||
if(Objects.isNull(data)) return null;
|
||||
return new GTbGOnHookLevel(data);
|
||||
}
|
||||
|
||||
//获取全部关卡
|
||||
public List<GTbGOnHookLevel> getDataList(){
|
||||
try {
|
||||
Method method = null;
|
||||
method = this.data.getClass().getMethod("getDataList");
|
||||
Object data = method.invoke(this.data);
|
||||
if(Objects.isNull(data) || !(data instanceof ArrayList)){
|
||||
return null;
|
||||
}
|
||||
return (List<GTbGOnHookLevel>) ((ArrayList)data).stream().map((Object i) -> new GTbGOnHookLevel(i)).collect(Collectors.toList());
|
||||
|
||||
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
|
||||
Object data = TableUtil.getDataList(this.data);
|
||||
if(Objects.isNull(data) || !(data instanceof ArrayList)){
|
||||
return null;
|
||||
}
|
||||
return (List<GTbGOnHookLevel>) ((ArrayList)data).stream().map((Object i) -> new GTbGOnHookLevel(i)).collect(Collectors.toList());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -2,13 +2,59 @@ package cn.jisol.game.table;
|
||||
|
||||
import cn.jisol.game.data.TD;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
//文档工具类
|
||||
public class TableUtil {
|
||||
|
||||
public static class TableData{
|
||||
//表数据
|
||||
Object data;
|
||||
|
||||
public TableData(Object data) {
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public Table get(Integer Id){
|
||||
return new Table(TableUtil.getId(this.data,Id));
|
||||
}
|
||||
|
||||
public List<Table> getDataList(){
|
||||
return Objects.requireNonNull(TableUtil.getDataList(this.data)).stream().map(Table::new).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class Table{
|
||||
|
||||
//表行数据
|
||||
Object data;
|
||||
|
||||
public Table(Object data) {
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public Integer getId(){
|
||||
return TableUtil.getTableId(this.data);
|
||||
}
|
||||
|
||||
public Object getData(){
|
||||
return TableUtil.getTableKey(this.data,"data");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//获取对象
|
||||
public static TableData getTableData(String sign){
|
||||
return new TableData(TableUtil.getTDObject(sign));
|
||||
}
|
||||
|
||||
//获取名字的对象
|
||||
public static Object getTDObject(String sign){
|
||||
try {
|
||||
@@ -19,4 +65,57 @@ public class TableUtil {
|
||||
}
|
||||
}
|
||||
|
||||
//获取配置列表
|
||||
public static List<Object> getDataList(Object config){
|
||||
try {
|
||||
Method method = null;
|
||||
method = config.getClass().getMethod("getDataList");
|
||||
Object data = method.invoke(config);
|
||||
if(Objects.isNull(data) || !(data instanceof ArrayList)){
|
||||
return null;
|
||||
}
|
||||
return (ArrayList<Object>)data;
|
||||
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
//通过Id获取表数据
|
||||
public static Object getId(Object config,Integer id){
|
||||
|
||||
try {
|
||||
Method method = config.getClass().getMethod("get",int.class);
|
||||
Object data = method.invoke(config,id);
|
||||
if(Objects.isNull(data)) return null;
|
||||
return data;
|
||||
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//获取数据Id
|
||||
public static int getTableId(Object table){
|
||||
|
||||
Object id = TableUtil.getTableKey(table,"id");
|
||||
if (Objects.isNull(id)){
|
||||
return -1;
|
||||
}
|
||||
return (int) id;
|
||||
|
||||
}
|
||||
|
||||
//获取指定Key数据
|
||||
public static Object getTableKey(Object table,String key){
|
||||
|
||||
try {
|
||||
Field idField = table.getClass().getField(key);
|
||||
return idField.get(table);
|
||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -37,6 +37,9 @@ public class NewsResource<T> extends NewsContext<T> {
|
||||
public static <T> NewsResource<T> onSuccess(String msg,T data,ResourceUpdateOV... resource){
|
||||
return onMessage(msg,data,NEWS_STATE_SUCCESS, Arrays.asList(resource));
|
||||
}
|
||||
public static <T> NewsResource<T> onSuccess(String msg,T data,List<ResourceUpdateOV> resource){
|
||||
return onMessage(msg,data,NEWS_STATE_SUCCESS, resource);
|
||||
}
|
||||
|
||||
public static <T> NewsResource<T> onFail(String msg){
|
||||
return onMessage(msg,null,NEWS_STATE_FAIL,new ArrayList<>());
|
||||
|
@@ -1,38 +1,50 @@
|
||||
[
|
||||
{
|
||||
"id": 90001,
|
||||
"icon": "90001",
|
||||
"name": "金币",
|
||||
"tig": "金币 (目前叫做金币 名称还没有定) 游戏的基础资源 用于升级宠物",
|
||||
"args": ""
|
||||
"args": "",
|
||||
"quality": 1
|
||||
},
|
||||
{
|
||||
"id": 90002,
|
||||
"icon": "90002",
|
||||
"name": "锻造石",
|
||||
"tig": "锻造石 可以锻造装备的石头",
|
||||
"args": ""
|
||||
"args": "",
|
||||
"quality": 1
|
||||
},
|
||||
{
|
||||
"id": 90003,
|
||||
"icon": "90003",
|
||||
"name": "通用加速卷",
|
||||
"tig": "加速卷 用来加速一切需要时间的东西 减少冷却:60s",
|
||||
"args": "60"
|
||||
"args": "60",
|
||||
"quality": 1
|
||||
},
|
||||
{
|
||||
"id": 90004,
|
||||
"icon": "90004",
|
||||
"name": "钥匙:金币副本",
|
||||
"tig": "金币副本的钥匙",
|
||||
"args": ""
|
||||
"args": "",
|
||||
"quality": 1
|
||||
},
|
||||
{
|
||||
"id": 90005,
|
||||
"icon": "90005",
|
||||
"name": "钥匙:锻造石副本",
|
||||
"tig": "锻造石副本的钥匙",
|
||||
"args": ""
|
||||
"args": "",
|
||||
"quality": 1
|
||||
},
|
||||
{
|
||||
"id": 90006,
|
||||
"icon": "90006",
|
||||
"name": "魂:一品宠物魂",
|
||||
"tig": "用于宠物升星",
|
||||
"args": ""
|
||||
"args": "",
|
||||
"quality": 1
|
||||
}
|
||||
]
|
Reference in New Issue
Block a user