From e8a1cb93624393572efb5a1955990c86e88e8f5c Mon Sep 17 00:00:00 2001 From: "PC-20230316NUNE\\Administrator" <2858626794@qq.com> Date: Mon, 8 Jan 2024 18:55:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E9=94=BB=E9=80=A0=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Datas/宠物系统/宠物装备/锻造装备等级.xlsx | Bin 11689 -> 11688 bytes .../resources/config/json/tbgresource.json | 5 + .../resources/config/json/tbgroleequip.json | 1844 ++++---- .../config/json/tbgroleequiplevel.json | 200 +- .../config/json/tbgroleequiptype.json | 42 + .../config/json/tbgroleequiptype.json.meta | 11 + .../resources/prefab/ui/主页/MainView.prefab | 1335 ++---- .../resources/prefab/ui/主页/锻造台.meta | 9 + .../prefab/ui/主页/锻造台/锻造台.prefab | 2873 ++++++++++++ .../prefab/ui/主页/锻造台/锻造台.prefab.meta | 13 + .../prefab/ui/宠物/宠物单选页面.prefab | 3922 +++++++++++++++++ .../prefab/ui/宠物/宠物单选页面.prefab.meta | 13 + .../assets/resources/prefab/ui/宠物装备.meta | 9 + .../ui/宠物装备/弹出锻造装备页面.prefab | 442 ++ .../ui/宠物装备/弹出锻造装备页面.prefab.meta | 13 + JisolGameCocos/assets/script/App.ts | 8 +- JisolGameCocos/assets/script/AppData.ts | 2 + .../assets/script/config/data/schema.ts | 69 +- JisolGameCocos/assets/script/consts/API.ts | 30 + .../assets/script/consts/entity.meta | 9 + .../assets/script/consts/entity/EntityData.ts | 9 + .../script/consts/entity/EntityData.ts.meta | 9 + .../assets/script/data/PetEquipData.ts | 33 + .../assets/script/data/PetEquipData.ts.meta | 9 + .../assets/script/data/PlayerTacticalData.ts | 9 +- .../manager/battle/mode/GOnHookManager.ts | 5 +- .../assets/script/ui/Home/ForgingBench.meta | 9 + .../ui/Home/ForgingBench/MainForgingBench.ts | 29 + .../ForgingBench/MainForgingBench.ts.meta | 9 + .../assets/script/ui/Pet/PetRadioView.ts | 11 + .../assets/script/ui/Pet/PetRadioView.ts.meta | 9 + JisolGameCocos/assets/script/ui/PetEquip.meta | 9 + .../ui/PetEquip/PetEquipForgingPopupView.ts | 10 + .../PetEquip/PetEquipForgingPopupView.ts.meta | 9 + .../script/ui/Tactical/IntoBattleView.ts | 59 +- JisolGameCocos/assets/script/ui/UIConfig.ts | 18 +- .../game/GPlayerEquipController.java | 44 +- .../game/entity/table/EquipForgingBench.java | 15 +- .../resources/json/tbgroleequiplevel.json | 200 +- 39 files changed, 9319 insertions(+), 2035 deletions(-) create mode 100644 JisolGameCocos/assets/resources/config/json/tbgroleequiptype.json create mode 100644 JisolGameCocos/assets/resources/config/json/tbgroleequiptype.json.meta create mode 100644 JisolGameCocos/assets/resources/prefab/ui/主页/锻造台.meta create mode 100644 JisolGameCocos/assets/resources/prefab/ui/主页/锻造台/锻造台.prefab create mode 100644 JisolGameCocos/assets/resources/prefab/ui/主页/锻造台/锻造台.prefab.meta create mode 100644 JisolGameCocos/assets/resources/prefab/ui/宠物/宠物单选页面.prefab create mode 100644 JisolGameCocos/assets/resources/prefab/ui/宠物/宠物单选页面.prefab.meta create mode 100644 JisolGameCocos/assets/resources/prefab/ui/宠物装备.meta create mode 100644 JisolGameCocos/assets/resources/prefab/ui/宠物装备/弹出锻造装备页面.prefab create mode 100644 JisolGameCocos/assets/resources/prefab/ui/宠物装备/弹出锻造装备页面.prefab.meta create mode 100644 JisolGameCocos/assets/script/consts/entity.meta create mode 100644 JisolGameCocos/assets/script/consts/entity/EntityData.ts create mode 100644 JisolGameCocos/assets/script/consts/entity/EntityData.ts.meta create mode 100644 JisolGameCocos/assets/script/data/PetEquipData.ts create mode 100644 JisolGameCocos/assets/script/data/PetEquipData.ts.meta create mode 100644 JisolGameCocos/assets/script/ui/Home/ForgingBench.meta create mode 100644 JisolGameCocos/assets/script/ui/Home/ForgingBench/MainForgingBench.ts create mode 100644 JisolGameCocos/assets/script/ui/Home/ForgingBench/MainForgingBench.ts.meta create mode 100644 JisolGameCocos/assets/script/ui/Pet/PetRadioView.ts create mode 100644 JisolGameCocos/assets/script/ui/Pet/PetRadioView.ts.meta create mode 100644 JisolGameCocos/assets/script/ui/PetEquip.meta create mode 100644 JisolGameCocos/assets/script/ui/PetEquip/PetEquipForgingPopupView.ts create mode 100644 JisolGameCocos/assets/script/ui/PetEquip/PetEquipForgingPopupView.ts.meta diff --git a/DataTables/Datas/宠物系统/宠物装备/锻造装备等级.xlsx b/DataTables/Datas/宠物系统/宠物装备/锻造装备等级.xlsx index 1989154f8f0a86664f26cbe3edb38355788fa882..db4a9f56f2f23ab5327e5e3baaa6acfde0ce9e86 100644 GIT binary patch delta 4033 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 B@o)eD delta 4012 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 { diff --git a/JisolGameCocos/assets/script/config/data/schema.ts b/JisolGameCocos/assets/script/config/data/schema.ts index a3b1413e..ff2c9bf7 100644 --- a/JisolGameCocos/assets/script/config/data/schema.ts +++ b/JisolGameCocos/assets/script/config/data/schema.ts @@ -710,8 +710,8 @@ export class TbGRoleEquip { this.id = _json_.id if (_json_.name === undefined) { throw new Error() } this.name = _json_.name - if (_json_.type === undefined) { throw new Error() } - this.type = _json_.type + if (_json_.position === undefined) { throw new Error() } + this.position = _json_.position if (_json_.quality === undefined) { throw new Error() } this.quality = _json_.quality if (_json_.icon === undefined) { throw new Error() } @@ -739,7 +739,7 @@ export class TbGRoleEquip { /** * 装备类别(1=武器/2=帽子/3=项链/4=护肩/5=衣服/6=腰带/7=手套/8=戒指/9=裤子/10=鞋子) */ - readonly type: number + readonly position: number /** * 品质信息 */ @@ -867,6 +867,33 @@ export class TbGRoleEquipQuality { } +export namespace TB { +export class TbGRoleEquipType { + + constructor(_json_: any) { + if (_json_.id === undefined) { throw new Error() } + this.id = _json_.id + if (_json_.name === undefined) { throw new Error() } + this.name = _json_.name + } + + /** + * 类型Id + */ + readonly id: number + /** + * 名称 + */ + readonly name: string + + resolve(tables:Tables) + { + } +} + +} + + export namespace TB { export class TbGSysFuben { @@ -1504,6 +1531,38 @@ export class TbGRoleEquipQuality{ +export class TbGRoleEquipType{ + private _dataMap: Map + private _dataList: TB.TbGRoleEquipType[] + constructor(_json_: any) { + this._dataMap = new Map() + this._dataList = [] + for(var _json2_ of _json_) { + let _v: TB.TbGRoleEquipType + _v = new TB.TbGRoleEquipType(_json2_) + this._dataList.push(_v) + this._dataMap.set(_v.id, _v) + } + } + + getDataMap(): Map { return this._dataMap; } + getDataList(): TB.TbGRoleEquipType[] { return this._dataList; } + + get(key: number): TB.TbGRoleEquipType | undefined { return this._dataMap.get(key); } + + resolve(tables:Tables) + { + for(let data of this._dataList) + { + data.resolve(tables) + } + } + +} + + + + export class TbGSysFuben{ private _dataMap: Map private _dataList: TB.TbGSysFuben[] @@ -1577,6 +1636,8 @@ export class Tables { get TbGRoleEquipLevel(): TbGRoleEquipLevel { return this._TbGRoleEquipLevel;} private _TbGRoleEquipQuality: TbGRoleEquipQuality get TbGRoleEquipQuality(): TbGRoleEquipQuality { return this._TbGRoleEquipQuality;} + private _TbGRoleEquipType: TbGRoleEquipType + get TbGRoleEquipType(): TbGRoleEquipType { return this._TbGRoleEquipType;} private _TbGSysFuben: TbGSysFuben get TbGSysFuben(): TbGSysFuben { return this._TbGSysFuben;} @@ -1600,6 +1661,7 @@ export class Tables { this._TbGRoleEquip = new TbGRoleEquip(loader('tbgroleequip')) this._TbGRoleEquipLevel = new TbGRoleEquipLevel(loader('tbgroleequiplevel')) this._TbGRoleEquipQuality = new TbGRoleEquipQuality(loader('tbgroleequipquality')) + this._TbGRoleEquipType = new TbGRoleEquipType(loader('tbgroleequiptype')) this._TbGSysFuben = new TbGSysFuben(loader('tbgsysfuben')) this._TbGGlobal.resolve(this) @@ -1621,6 +1683,7 @@ export class Tables { this._TbGRoleEquip.resolve(this) this._TbGRoleEquipLevel.resolve(this) this._TbGRoleEquipQuality.resolve(this) + this._TbGRoleEquipType.resolve(this) this._TbGSysFuben.resolve(this) } } diff --git a/JisolGameCocos/assets/script/consts/API.ts b/JisolGameCocos/assets/script/consts/API.ts index 98f13291..8c0b4c95 100644 --- a/JisolGameCocos/assets/script/consts/API.ts +++ b/JisolGameCocos/assets/script/consts/API.ts @@ -2,6 +2,7 @@ import { app } from "../App"; import PlayerPetData from "../data/PlayerPetData"; import ResourceData from "../data/ResourceData"; import { GUI } from "../ui/UIConfig"; +import { GAttribute } from "./entity/EntityData"; //接受到JSON消息 export const RData = (data:any,isTips:boolean = false) => { @@ -101,6 +102,29 @@ export interface ModeOnHookRankingOV{ mapId:number; //地图Id } +//宠物装备 +export interface PetEquip{ + equipId:number; //装备唯一Id + equipCfgId:number; //装备配置表Id + equipPlayerId:number; //装备的所属玩家Id + equipLevel:number; //装备等级 + equipWear:number; //当前装备穿戴的宠物Id + equipPosition:number; //装备部位 + + equipBaseAttributes:GAttribute[]; //基础属性 + equipHighAttributes:GAttribute[]; //高级属性 + +} + +//宠物锻造台 +export interface EquipForgingBench{ + forgingId:number; //锻造台Id + playerId:number; //锻造台所属的玩家Id + forgingExp:number; //锻造等级经验 + forgingQuality:number; //锻造品质等级 + forgingPetId:number; //当前占用宠物Id +} + export const API = { UserRegister : async () => RData(await app.api.post(`/user/register`)) as UserVO, //玩家注册 @@ -129,5 +153,11 @@ export const API = { /********** 排行榜接口(无限模式) *******************/ GOnHookRankings: async (mapId:number) => RData(await app.api.get(`/game/mode/onHook/onRankings/${mapId}`),false) as ModeOnHookRankingOV[], //获取玩家资源 + /********** 宠物装备系统接口 ****************/ + PetEquipAll: async () => RData(await app.api.get(`/game/equip/all`),false) as PetEquip[], //获取全部装备 + PetEquipForging: async () => RData(await app.api.get(`/game/equip/forging`),true) as PetEquip, //锻造装备 + PetEquipForgingInfo: async () => RData(await app.api.get(`/game/equip/forging/info`),true) as EquipForgingBench, //锻造台 + PetEquipForgingPetId: async (petId) => RData(await app.api.get(`/game/equip/forging/petId/${petId}`),true) as EquipForgingBench, //设置锻造宠 + } diff --git a/JisolGameCocos/assets/script/consts/entity.meta b/JisolGameCocos/assets/script/consts/entity.meta new file mode 100644 index 00000000..c5305600 --- /dev/null +++ b/JisolGameCocos/assets/script/consts/entity.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.2.0", + "importer": "directory", + "imported": true, + "uuid": "2476b527-7c23-4d00-b752-94a0595f3585", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/script/consts/entity/EntityData.ts b/JisolGameCocos/assets/script/consts/entity/EntityData.ts new file mode 100644 index 00000000..486cf434 --- /dev/null +++ b/JisolGameCocos/assets/script/consts/entity/EntityData.ts @@ -0,0 +1,9 @@ + + +//属性类 +export interface GAttribute{ + + id:number; + value:number; + +} diff --git a/JisolGameCocos/assets/script/consts/entity/EntityData.ts.meta b/JisolGameCocos/assets/script/consts/entity/EntityData.ts.meta new file mode 100644 index 00000000..d976970f --- /dev/null +++ b/JisolGameCocos/assets/script/consts/entity/EntityData.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.23", + "importer": "typescript", + "imported": true, + "uuid": "a861d195-9b8d-424e-8122-b1ccb06b516c", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/script/data/PetEquipData.ts b/JisolGameCocos/assets/script/data/PetEquipData.ts new file mode 100644 index 00000000..a4cf1e51 --- /dev/null +++ b/JisolGameCocos/assets/script/data/PetEquipData.ts @@ -0,0 +1,33 @@ +import { API, EquipForgingBench, PetEquip } from "../consts/API"; +import BaseData from "./BaseData"; +import PlayerPetData from "./PlayerPetData"; + +//宠物装备数据类 +export default class PetEquipData extends BaseData{ + + //装备 + equips:PetEquip[]; + //锻造台 + info:EquipForgingBench; + + //锻造台是否有宠物 + get isForgingBenchPet(){ + return !!PlayerPetData.getIns().petIdQueryPetInfo(this.info.forgingPetId); + } + + async onInit() { + this.equips = await API.PetEquipAll(); + this.info = await API.PetEquipForgingInfo(); + } + + //锻造 + async forging(){ + await API.PetEquipForging(); + } + + //设置锻造宠 + async setForgingPetId(petId:number){ + await API.PetEquipForgingPetId(petId); + } + +} \ No newline at end of file diff --git a/JisolGameCocos/assets/script/data/PetEquipData.ts.meta b/JisolGameCocos/assets/script/data/PetEquipData.ts.meta new file mode 100644 index 00000000..217d2689 --- /dev/null +++ b/JisolGameCocos/assets/script/data/PetEquipData.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.23", + "importer": "typescript", + "imported": true, + "uuid": "ea657593-8f6d-4713-addc-2d01393bf466", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/script/data/PlayerTacticalData.ts b/JisolGameCocos/assets/script/data/PlayerTacticalData.ts index 5a015656..26fa2c2f 100644 --- a/JisolGameCocos/assets/script/data/PlayerTacticalData.ts +++ b/JisolGameCocos/assets/script/data/PlayerTacticalData.ts @@ -1,6 +1,7 @@ import { app } from "../App"; import { API, PlayerTacticalOV } from "../consts/API"; import BaseData from "./BaseData"; +import PlayerPetData from "./PlayerPetData"; export enum PlayerTacticalEvent{ //更新上阵信息 @@ -31,7 +32,7 @@ export default class PlayerTacticalData extends BaseData{ } this.info = { ...ov, - roles: JSON.parse(ov.tacticalData), + roles: JSON.parse(ov.tacticalData).map(id => PlayerPetData.getIns().petIdQueryPetInfo(id) ? id : 0), } //通知阵法信息已更新 @@ -56,6 +57,7 @@ export default class PlayerTacticalData extends BaseData{ //修改指定位置的上阵 上阵下标,上阵的宠物Id async UpdateIndexTactical(index:number,petId:number){ + this.info.roles = this.info.roles.map(id => petId == id ? 0 : id); this.info.roles[index] = petId; await this.UpdateTactical(this.info.roles); } @@ -65,6 +67,11 @@ export default class PlayerTacticalData extends BaseData{ return this.info.roles[index]; } + //获取宠物的阵法下标 + getItemIndex(roleId:number){ + return this.info.roles.indexOf(roleId); + } + //获取初始化上阵信息 getInitTacticalInfo():number[]{ return [0,0,0,0,0,0,0,0,0] diff --git a/JisolGameCocos/assets/script/manager/battle/mode/GOnHookManager.ts b/JisolGameCocos/assets/script/manager/battle/mode/GOnHookManager.ts index d8d8228f..23fa63b4 100644 --- a/JisolGameCocos/assets/script/manager/battle/mode/GOnHookManager.ts +++ b/JisolGameCocos/assets/script/manager/battle/mode/GOnHookManager.ts @@ -9,6 +9,7 @@ import { API, PlayerPetOV } from "../../../consts/API"; import { GAPI } from "../../../consts/GAPI"; import GOnHookData from "../../../data/GOnHookData"; import PlayerPetData from "../../../data/PlayerPetData"; +import PlayerTacticalData from "../../../data/PlayerTacticalData"; import { GUI } from "../../../ui/UIConfig"; export enum GOnHookManagerEvent{ @@ -96,9 +97,9 @@ export default class GOnHookManager extends Singleton{ //自动吞噬 for (const item of this.onHookEngulfPets) { - //获取可吞噬的宠物 + //获取可吞噬的宠物 ( 等级0, 同类宠物, 不是自己, 不在阵法中) let engulfs = PlayerPetData.getIns().getData() - .filter(value => (value.petStar || 0) == 0 && item.petTbId == value.petTbId && item.petId != value.petId) + .filter(value => (value.petStar || 0) == 0 && item.petTbId == value.petTbId && item.petId != value.petId && PlayerTacticalData.getIns().getItemIndex(value.petId) != -1) .map(value => value.petId); //吞噬 diff --git a/JisolGameCocos/assets/script/ui/Home/ForgingBench.meta b/JisolGameCocos/assets/script/ui/Home/ForgingBench.meta new file mode 100644 index 00000000..453d5820 --- /dev/null +++ b/JisolGameCocos/assets/script/ui/Home/ForgingBench.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.2.0", + "importer": "directory", + "imported": true, + "uuid": "30ce933c-5000-49b3-a16a-3595e42bacbb", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/script/ui/Home/ForgingBench/MainForgingBench.ts b/JisolGameCocos/assets/script/ui/Home/ForgingBench/MainForgingBench.ts new file mode 100644 index 00000000..660d29cf --- /dev/null +++ b/JisolGameCocos/assets/script/ui/Home/ForgingBench/MainForgingBench.ts @@ -0,0 +1,29 @@ +import { _decorator, Component, Node } from 'cc'; +import PetEquipData from '../../../data/PetEquipData'; +import { app } from '../../../App'; +import { GUI } from '../../UIConfig'; +const { ccclass, property } = _decorator; + + +//锻造台 +@ccclass('MainForgingBench') +export class MainForgingBench extends Component { + + //点击锻造 + async onClickForging(){ + if(!PetEquipData.getIns().isForgingBenchPet){ + app.layer.Open(GUI.Tips,{text:"请选择锻造宠"}); + return; + } + PetEquipData.getIns().forging(); + app.layer.Open(GUI.PetEquipForgingPopupView); + } + + //点击锻造宠 + async onClickForgingPet(){ + app.layer.Open(GUI.PetRadioView); + } + +} + + diff --git a/JisolGameCocos/assets/script/ui/Home/ForgingBench/MainForgingBench.ts.meta b/JisolGameCocos/assets/script/ui/Home/ForgingBench/MainForgingBench.ts.meta new file mode 100644 index 00000000..ea2e6c93 --- /dev/null +++ b/JisolGameCocos/assets/script/ui/Home/ForgingBench/MainForgingBench.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.23", + "importer": "typescript", + "imported": true, + "uuid": "9b2f1109-b0bc-4cfc-978e-768af2a09b25", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/script/ui/Pet/PetRadioView.ts b/JisolGameCocos/assets/script/ui/Pet/PetRadioView.ts new file mode 100644 index 00000000..a3e45da6 --- /dev/null +++ b/JisolGameCocos/assets/script/ui/Pet/PetRadioView.ts @@ -0,0 +1,11 @@ +import { _decorator, Component, Node } from 'cc'; +import JNLayerBase from '../../../../extensions/ngame/assets/ngame/ui/base/JNLayerBase'; +const { ccclass, property } = _decorator; + +//宠物单选页面 +@ccclass('PetRadioView') +export class PetRadioView extends JNLayerBase { + +} + + diff --git a/JisolGameCocos/assets/script/ui/Pet/PetRadioView.ts.meta b/JisolGameCocos/assets/script/ui/Pet/PetRadioView.ts.meta new file mode 100644 index 00000000..393be23a --- /dev/null +++ b/JisolGameCocos/assets/script/ui/Pet/PetRadioView.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.23", + "importer": "typescript", + "imported": true, + "uuid": "54ddf509-ad07-4caa-8931-ce6abfd7bbc5", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/script/ui/PetEquip.meta b/JisolGameCocos/assets/script/ui/PetEquip.meta new file mode 100644 index 00000000..f860a9ad --- /dev/null +++ b/JisolGameCocos/assets/script/ui/PetEquip.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.2.0", + "importer": "directory", + "imported": true, + "uuid": "d35cf27a-07da-4228-b168-0b8b1f030c5f", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/script/ui/PetEquip/PetEquipForgingPopupView.ts b/JisolGameCocos/assets/script/ui/PetEquip/PetEquipForgingPopupView.ts new file mode 100644 index 00000000..cb54c014 --- /dev/null +++ b/JisolGameCocos/assets/script/ui/PetEquip/PetEquipForgingPopupView.ts @@ -0,0 +1,10 @@ +import { _decorator, Component, Node } from 'cc'; +import JNLayerBase from '../../../../extensions/ngame/assets/ngame/ui/base/JNLayerBase'; +const { ccclass, property } = _decorator; + +//锻造宠物装备页面 +@ccclass('PetEquipForgingPopupView') +export class PetEquipForgingPopupView extends JNLayerBase { +} + + diff --git a/JisolGameCocos/assets/script/ui/PetEquip/PetEquipForgingPopupView.ts.meta b/JisolGameCocos/assets/script/ui/PetEquip/PetEquipForgingPopupView.ts.meta new file mode 100644 index 00000000..60f77682 --- /dev/null +++ b/JisolGameCocos/assets/script/ui/PetEquip/PetEquipForgingPopupView.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.23", + "importer": "typescript", + "imported": true, + "uuid": "19e44699-645c-4b07-aff3-552dc7a12ba8", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/script/ui/Tactical/IntoBattleView.ts b/JisolGameCocos/assets/script/ui/Tactical/IntoBattleView.ts index bdbc3b37..981334c9 100644 --- a/JisolGameCocos/assets/script/ui/Tactical/IntoBattleView.ts +++ b/JisolGameCocos/assets/script/ui/Tactical/IntoBattleView.ts @@ -15,6 +15,10 @@ import { PetPreviewWindow } from '../Consts/Pet/info/PetPreviewWindow'; import { Label } from 'cc'; const { ccclass, property } = _decorator; +export enum IntoBattleState{ + 请选择 = "请选择",下阵 = "下阵",替阵 = "替阵",上阵 = "上阵" +} + //上阵页面 @ccclass('IntoBattleView') export class IntoBattleView extends JNLayerBase { @@ -100,9 +104,35 @@ export class IntoBattleView extends JNLayerBase { //刷新上阵 onUpdateTactical(){ - //获取当前阵法下标是否存在宠物 - let petId = PlayerTacticalData.getIns().getItem(this.tIndex); - this.tacticalLabel.string = `${petId ? "下阵" : "上阵"}` + + //选择的宠物 + this.tacticalLabel.string = `${this.getIntoBattleState()}`; + + } + + //获取当前状态 + getIntoBattleState():IntoBattleState{ + + //选择的宠物 + let selectPet = this.pets[this.index]; + if(this.index == -1 || !selectPet) { + return IntoBattleState.请选择 + } + + //判断选中的宠物是否存在阵法里 存在则下阵 + let selectIndex = PlayerTacticalData.getIns().getItemIndex(selectPet.petId); + if(selectIndex >= 0){ + + //存在 如果存在的下标是当前下标则下阵 不是 则替换 + if(selectIndex == this.tIndex) + return IntoBattleState.下阵 + else return IntoBattleState.替阵; + + }else{ + //不存在则上阵 + return IntoBattleState.上阵; + } + } //点击Item @@ -118,26 +148,21 @@ export class IntoBattleView extends JNLayerBase { //点击上阵 async onClickTactical(){ - if(this.index < 0){ + let state = this.getIntoBattleState(); + + if(state == IntoBattleState.请选择){ app.layer.Open(GUI.Tips,{text:"请选择要上阵的宠物."}) return; - } - //获取当前阵法下标是否存在宠物 - let petId = PlayerTacticalData.getIns().getItem(this.tIndex); - - if(petId) { - //下阵 + }else if(state == IntoBattleState.上阵 || state == IntoBattleState.替阵){ + //修改上阵信息 + await PlayerTacticalData.getIns().UpdateIndexTactical(this.tIndex,this.pets[this.index].petId); + app.layer.Open(GUI.Tips,{text:"上阵成功"}); + }else if(state == IntoBattleState.下阵){ + //修改上阵信息 await PlayerTacticalData.getIns().UpdateIndexTactical(this.tIndex,0); app.layer.Open(GUI.Tips,{text:"下阵成功"}); - //上阵完 关闭页面 - app.layer.CloseNode(this.node); - return; } - //修改上阵信息 - await PlayerTacticalData.getIns().UpdateIndexTactical(this.tIndex,this.pets[this.index].petId); - app.layer.Open(GUI.Tips,{text:"上阵成功"}); - //上阵完 关闭页面 app.layer.CloseNode(this.node); diff --git a/JisolGameCocos/assets/script/ui/UIConfig.ts b/JisolGameCocos/assets/script/ui/UIConfig.ts index f26687b5..093435d0 100644 --- a/JisolGameCocos/assets/script/ui/UIConfig.ts +++ b/JisolGameCocos/assets/script/ui/UIConfig.ts @@ -21,10 +21,16 @@ export enum GUI{ /** 主页页面 */ MainChat = "MainChat", //主页聊天页面 IntoBattleView = "IntoBattleView", //上阵页面 - PetUpStarView = "PetUpStarView", //宠物升星页面 MainOnHookView = "MainOnHookView", //挂机弹窗 MapSelectView = "MapSelectView", //地图选择页面 + + /**宠物 */ + PetUpStarView = "PetUpStarView", //宠物升星页面 + PetRadioView = "PetRadioView", //宠物单选页面 + PetEquipForgingPopupView = "PetEquipForgingPopupView", //弹出锻造宠物装备页面 + + /**游戏模式页面 */ PVPModeMatchView = "PVPModeMatchView", //PVP模式匹配页面 CampGuardianView = "CampGuardianView", //阵营守护战斗页面 @@ -106,6 +112,16 @@ const UIPetConfig:{ [key: string]: JNLayerInfo; } = { uri: "prefab/ui/宠物/宠物升星页面", anims:BackOutScale, }, + [GUI.PetRadioView]:{ + layer:GLayer.Popup, + uri: "prefab/ui/宠物/宠物单选页面", + anims:BackOutScale, + }, + [GUI.PetEquipForgingPopupView]:{ + layer:GLayer.Popup, + uri: "prefab/ui/宠物装备/弹出锻造装备页面", + anims:BackOutScale, + }, } diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/GPlayerEquipController.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/GPlayerEquipController.java index dcc112b2..4c265993 100644 --- a/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/GPlayerEquipController.java +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/GPlayerEquipController.java @@ -21,10 +21,7 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.Arrays; @@ -48,7 +45,7 @@ public class GPlayerEquipController { @Autowired ResourceService resourceService; - //获取玩家宠物列表 + //锻造装备(扣除玩家锻造石 打造一件装备) @ApiImplicitParams({}) @ApiOperation(value = "锻造装备(扣除玩家锻造石 打造一件装备)") @GetMapping("/forging") @@ -75,6 +72,7 @@ public class GPlayerEquipController { //随机取一个装备 TbGRoleEquip equipInfo = GRandomUtil.randomArray(equips); + //封装 PetEquip equip = new PetEquip(); equip.setEquipCfgId(equipInfo.id); equip.setEquipPlayerId(player.getPlayerId()); @@ -109,6 +107,18 @@ public class GPlayerEquipController { } + //获取所有装备 + @ApiImplicitParams({}) + @ApiOperation(value = "获取所有装备") + @GetMapping("/all") + public NewsContext> all(@CurrentPlayer Player player){ + return NewsContext.onSuccess("获取成功", + petEquipService.list(Wrappers.lambdaQuery(PetEquip.class) + .eq(PetEquip::getEquipPlayerId,player.getPlayerId())) + ); + } + + //获取锻造台等级 @ApiImplicitParams({}) @ApiOperation(value = "获取锻造台") @@ -122,15 +132,35 @@ public class GPlayerEquipController { try{ info = EquipForgingBench.builder().playerId(player.getPlayerId()) .forgingQuality(TD.DATA.getTbGRoleEquipQuality().getDataList().get(0).id) - .forgingLevel(TD.DATA.getTbGRoleEquipLevel().getDataList().get(0).id).build(); + .forgingExp(0).build(); equipForgingBenchService.saveOrUpdate(info); }catch (Exception ignored){} assert equipForgingBenchService != null; - info = equipForgingBenchService.getById(player.getPlayerId()); + info = equipForgingBenchService.getOne(Wrappers.lambdaQuery(EquipForgingBench.class).eq(EquipForgingBench::getPlayerId,player.getPlayerId())); } return NewsContext.onSuccess("获取成功",info); } + //设置锻造宠 + @ApiImplicitParams({}) + @ApiOperation(value = "设置锻造宠") + @PostMapping("/forging/petId/{petId}") + public NewsContext setForgingPetId(@CurrentPlayer Player player, @PathVariable Integer petId){ + + EquipForgingBench info = equipForgingBenchService.getOne(Wrappers.lambdaQuery(EquipForgingBench.class).eq(EquipForgingBench::getPlayerId,player.getPlayerId())); + + if(Objects.isNull(info)){ + return NewsContext.onFail("没有找到锻造台"); + } + + info.setForgingPetId(petId); + equipForgingBenchService.saveOrUpdate(info); + + return NewsContext.onSuccess("设置成功",info); + + } + + } diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/entity/table/EquipForgingBench.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/entity/table/EquipForgingBench.java index dce8344f..faabeac3 100644 --- a/JisolGameServer/Main/src/main/java/cn/jisol/game/entity/table/EquipForgingBench.java +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/entity/table/EquipForgingBench.java @@ -1,11 +1,16 @@ package cn.jisol.game.entity.table; +import cfg.TB.TbGRoleEquipLevel; +import cn.jisol.game.data.TD; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Builder; import lombok.Data; +import java.util.List; +import java.util.stream.Collectors; + @Builder @Data @TableName("`equip_forging_bench`") @@ -14,7 +19,13 @@ public class EquipForgingBench { @TableId(type = IdType.AUTO) private Integer forgingId; //锻造台Id private Long playerId; //锻造台所属的玩家Id - private Integer forgingLevel; //锻造等级 - private Integer forgingQuality; //锻造品质等级 + private Integer forgingExp; //锻造等级经验 + private Integer forgingQuality; //锻造品质等级 + private Integer forgingPetId; //当前占用宠物Id + //获取锻造等级 + public Integer getForgingLevel() { + List collect = TD.DATA.getTbGRoleEquipLevel().getDataList().stream().filter(info -> info.exp <= this.forgingExp).collect(Collectors.toList()); + return collect.get(collect.size() - 1).id; + } } diff --git a/JisolGameServer/Main/src/main/resources/json/tbgroleequiplevel.json b/JisolGameServer/Main/src/main/resources/json/tbgroleequiplevel.json index 6c05f069..bb7c3c8c 100644 --- a/JisolGameServer/Main/src/main/resources/json/tbgroleequiplevel.json +++ b/JisolGameServer/Main/src/main/resources/json/tbgroleequiplevel.json @@ -1,402 +1,402 @@ [ { "id": 1, - "exp": 1 + "exp": 0 }, { "id": 2, - "exp": 2 + "exp": 1 }, { "id": 3, - "exp": 3 + "exp": 2 }, { "id": 4, - "exp": 4 + "exp": 3 }, { "id": 5, - "exp": 5 + "exp": 4 }, { "id": 6, - "exp": 6 + "exp": 5 }, { "id": 7, - "exp": 7 + "exp": 6 }, { "id": 8, - "exp": 8 + "exp": 7 }, { "id": 9, - "exp": 9 + "exp": 8 }, { "id": 10, - "exp": 10 + "exp": 9 }, { "id": 11, - "exp": 11 + "exp": 10 }, { "id": 12, - "exp": 12 + "exp": 11 }, { "id": 13, - "exp": 13 + "exp": 12 }, { "id": 14, - "exp": 14 + "exp": 13 }, { "id": 15, - "exp": 15 + "exp": 14 }, { "id": 16, - "exp": 16 + "exp": 15 }, { "id": 17, - "exp": 17 + "exp": 16 }, { "id": 18, - "exp": 18 + "exp": 17 }, { "id": 19, - "exp": 19 + "exp": 18 }, { "id": 20, - "exp": 20 + "exp": 19 }, { "id": 21, - "exp": 21 + "exp": 20 }, { "id": 22, - "exp": 22 + "exp": 21 }, { "id": 23, - "exp": 23 + "exp": 22 }, { "id": 24, - "exp": 24 + "exp": 23 }, { "id": 25, - "exp": 25 + "exp": 24 }, { "id": 26, - "exp": 26 + "exp": 25 }, { "id": 27, - "exp": 27 + "exp": 26 }, { "id": 28, - "exp": 28 + "exp": 27 }, { "id": 29, - "exp": 29 + "exp": 28 }, { "id": 30, - "exp": 30 + "exp": 29 }, { "id": 31, - "exp": 31 + "exp": 30 }, { "id": 32, - "exp": 32 + "exp": 31 }, { "id": 33, - "exp": 33 + "exp": 32 }, { "id": 34, - "exp": 34 + "exp": 33 }, { "id": 35, - "exp": 35 + "exp": 34 }, { "id": 36, - "exp": 36 + "exp": 35 }, { "id": 37, - "exp": 37 + "exp": 36 }, { "id": 38, - "exp": 38 + "exp": 37 }, { "id": 39, - "exp": 39 + "exp": 38 }, { "id": 40, - "exp": 40 + "exp": 39 }, { "id": 41, - "exp": 41 + "exp": 40 }, { "id": 42, - "exp": 42 + "exp": 41 }, { "id": 43, - "exp": 43 + "exp": 42 }, { "id": 44, - "exp": 44 + "exp": 43 }, { "id": 45, - "exp": 45 + "exp": 44 }, { "id": 46, - "exp": 46 + "exp": 45 }, { "id": 47, - "exp": 47 + "exp": 46 }, { "id": 48, - "exp": 48 + "exp": 47 }, { "id": 49, - "exp": 49 + "exp": 48 }, { "id": 50, - "exp": 50 + "exp": 49 }, { "id": 51, - "exp": 51 + "exp": 50 }, { "id": 52, - "exp": 52 + "exp": 51 }, { "id": 53, - "exp": 53 + "exp": 52 }, { "id": 54, - "exp": 54 + "exp": 53 }, { "id": 55, - "exp": 55 + "exp": 54 }, { "id": 56, - "exp": 56 + "exp": 55 }, { "id": 57, - "exp": 57 + "exp": 56 }, { "id": 58, - "exp": 58 + "exp": 57 }, { "id": 59, - "exp": 59 + "exp": 58 }, { "id": 60, - "exp": 60 + "exp": 59 }, { "id": 61, - "exp": 61 + "exp": 60 }, { "id": 62, - "exp": 62 + "exp": 61 }, { "id": 63, - "exp": 63 + "exp": 62 }, { "id": 64, - "exp": 64 + "exp": 63 }, { "id": 65, - "exp": 65 + "exp": 64 }, { "id": 66, - "exp": 66 + "exp": 65 }, { "id": 67, - "exp": 67 + "exp": 66 }, { "id": 68, - "exp": 68 + "exp": 67 }, { "id": 69, - "exp": 69 + "exp": 68 }, { "id": 70, - "exp": 70 + "exp": 69 }, { "id": 71, - "exp": 71 + "exp": 70 }, { "id": 72, - "exp": 72 + "exp": 71 }, { "id": 73, - "exp": 73 + "exp": 72 }, { "id": 74, - "exp": 74 + "exp": 73 }, { "id": 75, - "exp": 75 + "exp": 74 }, { "id": 76, - "exp": 76 + "exp": 75 }, { "id": 77, - "exp": 77 + "exp": 76 }, { "id": 78, - "exp": 78 + "exp": 77 }, { "id": 79, - "exp": 79 + "exp": 78 }, { "id": 80, - "exp": 80 + "exp": 79 }, { "id": 81, - "exp": 81 + "exp": 80 }, { "id": 82, - "exp": 82 + "exp": 81 }, { "id": 83, - "exp": 83 + "exp": 82 }, { "id": 84, - "exp": 84 + "exp": 83 }, { "id": 85, - "exp": 85 + "exp": 84 }, { "id": 86, - "exp": 86 + "exp": 85 }, { "id": 87, - "exp": 87 + "exp": 86 }, { "id": 88, - "exp": 88 + "exp": 87 }, { "id": 89, - "exp": 89 + "exp": 88 }, { "id": 90, - "exp": 90 + "exp": 89 }, { "id": 91, - "exp": 91 + "exp": 90 }, { "id": 92, - "exp": 92 + "exp": 91 }, { "id": 93, - "exp": 93 + "exp": 92 }, { "id": 94, - "exp": 94 + "exp": 93 }, { "id": 95, - "exp": 95 + "exp": 94 }, { "id": 96, - "exp": 96 + "exp": 95 }, { "id": 97, - "exp": 97 + "exp": 96 }, { "id": 98, - "exp": 98 + "exp": 97 }, { "id": 99, - "exp": 99 + "exp": 98 }, { "id": 100, - "exp": 100 + "exp": 99 } ] \ No newline at end of file