From 07db3912ccff1beb2394cd703a3899b6149aba5c Mon Sep 17 00:00:00 2001 From: "DESKTOP-5RP3AKU\\Jisol" <2858626794@qq.com> Date: Tue, 28 Nov 2023 02:13:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataTables/Datas/__beans__.xlsx | Bin 9426 -> 9633 bytes .../Datas/战斗/角色/升级/角色升级消耗表.xlsx | Bin 11541 -> 11721 bytes JisolGameCocos/assets/res/UI/宠物.meta | 9 + JisolGameCocos/assets/res/UI/通用.meta | 9 + JisolGameCocos/assets/res/UI/通用/ICON.meta | 9 + .../assets/res/UI/通用/ICON/ty_xingxing.png | Bin 0 -> 2820 bytes .../res/UI/通用/ICON/ty_xingxing.png.meta | 134 ++ .../assets/resources/config/data/schema.ts | 12 +- .../resources/config/json/tbgattribute.json | 5 + .../config/json/tbgrolebaseattribute.json | 1 + .../prefab/ui/常用预制体/宠物/icon.meta | 9 + .../宠物/{ => icon}/列表选择宠物ICON.prefab | 0 .../宠物/{ => icon}/列表选择宠物ICON.prefab.meta | 0 .../宠物/{ => icon}/宠物ICON.prefab | 497 ++++- .../宠物/{ => icon}/宠物ICON.prefab.meta | 0 .../宠物/{ => icon}/选择宠物ICON.prefab | 0 .../宠物/{ => icon}/选择宠物ICON.prefab.meta | 0 .../prefab/ui/常用预制体/宠物/info.meta | 9 + .../常用预制体/宠物/info/宠物预览窗口.prefab | 791 ++++++++ .../宠物/info/宠物预览窗口.prefab.meta | 13 + .../prefab/ui/阵法/阵法选择页面.prefab | 1621 ++++++++--------- JisolGameCocos/assets/script/consts/API.ts | 6 +- .../assets/script/data/PlayerPetData.ts | 2 +- .../assets/script/ui/Consts/Pet/PetIcon.ts | 50 +- .../script/ui/Consts/Pet/PetIconSelect.ts | 7 +- .../ui/Consts/Pet/PetIconSelectScroll.ts | 2 +- .../assets/script/ui/Consts/Pet/info.meta | 9 + .../ui/Consts/Pet/info/PetPreviewWindow.ts | 78 + .../Consts/Pet/info/PetPreviewWindow.ts.meta | 9 + .../script/ui/Home/Sreeps/MainSreepsIcon.ts | 9 +- .../script/ui/Tactical/IntoBattleView.ts | 21 +- JisolGameCocos/extensions/ngame | 2 +- .../java/cfg/TB/TbGRoleBaseAttribute.java | 6 + .../src/main/java/cfg/TB/TbGRoleUpLevel.java | 4 +- .../{Resource.java => TResource.java} | 10 +- .../java/cn/jisol/game/config/WebConfig.java | 15 + .../exception/HTTPExceptionHandler.java | 8 + .../controller/game/GNoviceController.java | 2 +- .../controller/game/GPlayerPetController.java | 41 +- .../game/mode/GOnHookController.java | 4 +- .../cn/jisol/game/entity/game/PlayerPet.java | 5 +- .../cn/jisol/game/entity/game/Resource.java | 3 + .../jisol/game/service/ResourceService.java | 4 +- .../service/impl/ResourceServiceImpl.java | 21 +- .../src/main/resources/json/tbgattribute.json | 5 + .../resources/json/tbgrolebaseattribute.json | 1 + 46 files changed, 2482 insertions(+), 961 deletions(-) create mode 100644 JisolGameCocos/assets/res/UI/宠物.meta create mode 100644 JisolGameCocos/assets/res/UI/通用.meta create mode 100644 JisolGameCocos/assets/res/UI/通用/ICON.meta create mode 100644 JisolGameCocos/assets/res/UI/通用/ICON/ty_xingxing.png create mode 100644 JisolGameCocos/assets/res/UI/通用/ICON/ty_xingxing.png.meta create mode 100644 JisolGameCocos/assets/resources/prefab/ui/常用预制体/宠物/icon.meta rename JisolGameCocos/assets/resources/prefab/ui/常用预制体/宠物/{ => icon}/列表选择宠物ICON.prefab (100%) rename JisolGameCocos/assets/resources/prefab/ui/常用预制体/宠物/{ => icon}/列表选择宠物ICON.prefab.meta (100%) rename JisolGameCocos/assets/resources/prefab/ui/常用预制体/宠物/{ => icon}/宠物ICON.prefab (52%) rename JisolGameCocos/assets/resources/prefab/ui/常用预制体/宠物/{ => icon}/宠物ICON.prefab.meta (100%) rename JisolGameCocos/assets/resources/prefab/ui/常用预制体/宠物/{ => icon}/选择宠物ICON.prefab (100%) rename JisolGameCocos/assets/resources/prefab/ui/常用预制体/宠物/{ => icon}/选择宠物ICON.prefab.meta (100%) create mode 100644 JisolGameCocos/assets/resources/prefab/ui/常用预制体/宠物/info.meta create mode 100644 JisolGameCocos/assets/resources/prefab/ui/常用预制体/宠物/info/宠物预览窗口.prefab create mode 100644 JisolGameCocos/assets/resources/prefab/ui/常用预制体/宠物/info/宠物预览窗口.prefab.meta create mode 100644 JisolGameCocos/assets/script/ui/Consts/Pet/info.meta create mode 100644 JisolGameCocos/assets/script/ui/Consts/Pet/info/PetPreviewWindow.ts create mode 100644 JisolGameCocos/assets/script/ui/Consts/Pet/info/PetPreviewWindow.ts.meta rename JisolGameServer/Main/src/main/java/cfg/TbGEntity/{Resource.java => TResource.java} (79%) diff --git a/DataTables/Datas/__beans__.xlsx b/DataTables/Datas/__beans__.xlsx index 3fdcee74a2e6cd9357de8fafd02cd54b76a9cc12..157593a28ae82a181aa885f1c13874b87c9cb140 100644 GIT binary patch delta 4802 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 delta 7424 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 SM5ISPF7$&8&Ee|VBlUj`D7`WO diff --git a/JisolGameCocos/assets/res/UI/宠物.meta b/JisolGameCocos/assets/res/UI/宠物.meta new file mode 100644 index 00000000..31fe463b --- /dev/null +++ b/JisolGameCocos/assets/res/UI/宠物.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.2.0", + "importer": "directory", + "imported": true, + "uuid": "74a175d5-0c0f-465a-883c-8c9af5b40cfe", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/res/UI/通用.meta b/JisolGameCocos/assets/res/UI/通用.meta new file mode 100644 index 00000000..394f4d28 --- /dev/null +++ b/JisolGameCocos/assets/res/UI/通用.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.2.0", + "importer": "directory", + "imported": true, + "uuid": "db84da0f-9f72-42b4-aac3-31a93092820f", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/res/UI/通用/ICON.meta b/JisolGameCocos/assets/res/UI/通用/ICON.meta new file mode 100644 index 00000000..797e8be4 --- /dev/null +++ b/JisolGameCocos/assets/res/UI/通用/ICON.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.2.0", + "importer": "directory", + "imported": true, + "uuid": "191aa1fb-ff89-4513-89a0-4e251d5cb524", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/res/UI/通用/ICON/ty_xingxing.png b/JisolGameCocos/assets/res/UI/通用/ICON/ty_xingxing.png new file mode 100644 index 0000000000000000000000000000000000000000..c695536cb9165ee0be6f79302144e9a30f16822e GIT binary patch literal 2820 zcmV+f3;XnmP)UevB&ex^LyNj?&k@#sgpQu z_DI&e?)}c+|8vg&oO=bA#&W*C2Qx7e_YIt`^HtHVfG~^b%8)>B|zw`sDl^UUL=Zb4`?Acu|tbW&Td#V+G z6j%;Sz6QUuvQL<>e)xTtAJE=C)#2^y^ugb}O^@!lNjD}o>oXQqp4Npw-ldN|xk|sV z?M|&r8}ydPR*$xd=cgCr(3<7CUSKWoUrQEujBWkSs&r|zk(-#T)0M5#b@~0co$rI_ zFsM8-c`d2V<><-|{APuzF~yB*`qHOf^1Z>m#cO~@tMV_%`iI zeCWvJ05Aa@0R9*F9&mKF0L^y~0v`e94fJJLv%1H7^RjI7)*I*eS1rl*4WDXASC;7R z?I(T3BM8|Ex(UKYt0JfpkVJ@p^0BW|9v#N3JIw1#;?;F|>rxu&!9@%t~Y-f?qJa&C{C6GGedsRpO=6{Pma7LR3UYMG!91atK2~ZLCJkYtm?Hy63ob&Pia(y;2UVPYq7hzqRRj@|RDX z$N(l!KLq@ICV+Re=nnql;p>im^8JhYaAe2$$qL?72_b!KCrKim!%fX4)&Cyc_P>cG zF7mbzl)sPNb|*4*9jdvPu<`^#x=1@k*o>%8)(L}%W-~%XI{r%}Ed~Zskg~(ATSvw} z@aa8sPUk%b_&D&@mjhe@40U!SYL9Qa`NR!t`j(9hO$u+SNG7dFbu1&8zK7iM|HR4N z1*!?*VF*q@I1Zr)RzIq_4`seXqy6I``oUcSv=P>xMXRaly$H0P4r>&um_^GHq_QrV zo($RUG?|Refdd}7xlVTDXIBIuOt1e31MsavNY>xkXGi&}WyuP;1$U8}_aMSB7VHD% z#VnXAMMvPw2NYp>3kWC9!=UsSs`)fpd2x7!4sg5w9hrIy=z2?||7uFbOe&o&h)EFno|U20Pen!dudEz#X& zlP};J21lYWNc=CT6LxoB8@OCYagsE!PI7= z>Q9I&KL?Q{PQY`S5HxB*T;Z8Eo3Y7&<0nmOFm85jH`)J-ZFv`0Mv69Sh3C-0A+Y98 zJ2YXn=Ya4D#=nee4k2vQ{p2e{XTmLvK&Mdt3k0Qa6E*iw13X95GSLhD2&1uKq-dX; z3)L`@_DkcxdB(+nt+e+HN=H z(@*1%ZvwdxtUgq28&UNcq}6-wP`#R;^Z#l~8eW6iWP?CK&t)0D@}1-CKWI8%-1hu4 zS$hgtaPVmPrbTlz`P=U3Yae;Z$7&9e=)4x`EX1F9BpyPh8F~G7CbX48m9iIb#gZ&T z2Rwhn13PV{)K1_5&KkE&n|uEgPvr+T+`S>~e&plFIbpjSbNl-GsCf zGs?tk0w@JRBgC%-Xd&qCP3i|XzM%iKuV{Y$;LDGzXL~fEmZwK+>pI$#<9EHSCp%U4 zNv0Gs;hwuDE*hYW0oFaAxm_+h_mrZ4{?|dH_&)(2dimO!;BcrnDxLag40k(?ZLa&R#PUKr@&5ojE5~i%Ue>j1~)3q{(GnS|5|M0cb?7yML}_ zbjpg<^j0A*)h)@inLIRo*bf!G-La6HbelIDfM%g|oip06rvYA4c+-^}|IfHsT#H27!A-l!80a*eLF)k3s6}*jIur_i@SE)gr*-=^aW;^1 zwT6?X7miOx&3o@#Ec{a7R6HO25FII$A5t$h<0+&z)g+1(*^EO^cY<6;0^1VQ>ml`u zPtXVm8zDMW@oR0OMs><3QksD`b?}XE9rL$r9X0?z5A2&Qz;R&y;TOxdxXLzUIL=Ps?9FTObV0(1aOo-GldVA}+u8S`u3g#~Gzs(s{N}E;Jb+L3oTU?4Sja1losK(fMtPDq5 zeRNApD$F$UUUMIqa2-}$k>QPtv!oI>`LQay_Iea2jGD0v_{Y{A&5Sl%{k RData(await app.api.get(`/game/pet/list`),false) as PlayerPetOV[], //获取玩家全部宠物 //petId 需合成的Id pets 被合成的Id列表 - PetUpStar: async (petId:number,pets:number[]) => RData(await app.api.post(`/game/pet/up/star`,{petId,pets}),true) as PlayerPetOV, //提升宠物星 + PetUpStar: async (petId:number,pets:number[]) => RData(await app.api.post(`/game/pet/up/star`,{petId,pets}),true) as PlayerPetOV, //提升宠物星 + //petId 升级的宠物Id + PetUpLevel: async (petId:number) => RData(await app.api.post(`/game/pet/up/level/${petId}`),true) as PlayerPetOV, //升级宠物 /********** 阵法接口 ******************/ GetPlayerTactical: async () => RData(await app.api.get(`/game/tactical/get`),false) as PlayerTacticalOV, //获取玩家阵法 diff --git a/JisolGameCocos/assets/script/data/PlayerPetData.ts b/JisolGameCocos/assets/script/data/PlayerPetData.ts index 3eb6b0ec..27971d53 100644 --- a/JisolGameCocos/assets/script/data/PlayerPetData.ts +++ b/JisolGameCocos/assets/script/data/PlayerPetData.ts @@ -75,7 +75,7 @@ export default class PlayerPetData extends BaseData{ if(pet){ //更新数据 Object.assign(pet,resource); - app.event.emit(PlayerPetEvent.UPDATE_INFO) + app.event.emit(PlayerPetEvent.UPDATE_INFO,pet) }else{ operation = ResourceUpdateType.ADD; this.onUpdateOV(operation,resource); diff --git a/JisolGameCocos/assets/script/ui/Consts/Pet/PetIcon.ts b/JisolGameCocos/assets/script/ui/Consts/Pet/PetIcon.ts index a866531d..601c3628 100644 --- a/JisolGameCocos/assets/script/ui/Consts/Pet/PetIcon.ts +++ b/JisolGameCocos/assets/script/ui/Consts/Pet/PetIcon.ts @@ -3,6 +3,9 @@ import { _decorator, Component, Node } from 'cc'; import { app } from '../../../App'; import { UIPetAnim } from '../../../consts/GData'; import { v3 } from 'cc'; +import { PlayerPetOV } from '../../../consts/API'; +import { Label } from 'cc'; +import { PlayerPetEvent } from '../../../data/PlayerPetData'; const { ccclass, property } = _decorator; @ccclass('PetIcon') @@ -11,13 +14,54 @@ export class PetIcon extends Component { @property(sp.Skeleton) spine:sp.Skeleton; - //设置icon - setIcon(petTbId:number){ + @property(Node) + starNode:Node; //星星 - this.spine.skeletonData = app.battleRes.roleSpine[petTbId]; + info:PlayerPetOV; + + onLoad(){ + this.reset(); + + //监听 + app.event.on(PlayerPetEvent.UPDATE_INFO,this.onUpdateInfo,this) + } + + protected onDestroy(): void { + app.event.off(PlayerPetEvent.UPDATE_INFO,this.onUpdateInfo,this) + } + + //初始化 + reset(){ + + this.starNode.active = false; + + } + + //信息更新 + onUpdateInfo(info:PlayerPetOV){ + if(this.info && info.petId == this.info.petId){ + this.onUpdateView(); //刷新页面 + } + } + + //刷新页面 + onUpdateView(){ + this.spine.skeletonData = app.battleRes.roleSpine[this.info.petTbId]; this.spine.setAnimation(0,UIPetAnim.std,true); + + if(this.info.petStar){ + this.starNode.active = true; + this.starNode.getComponentInChildren(Label).string = `${this.info.petStar}`; + } } + + //设置icon + set(info:PlayerPetOV){ + this.reset(); + this.info = info; + this.onUpdateView(); + } } diff --git a/JisolGameCocos/assets/script/ui/Consts/Pet/PetIconSelect.ts b/JisolGameCocos/assets/script/ui/Consts/Pet/PetIconSelect.ts index 2c561bcf..af1e3f7a 100644 --- a/JisolGameCocos/assets/script/ui/Consts/Pet/PetIconSelect.ts +++ b/JisolGameCocos/assets/script/ui/Consts/Pet/PetIconSelect.ts @@ -1,5 +1,6 @@ import { _decorator, Component, Node } from 'cc'; import { PetIcon } from './PetIcon'; +import { PlayerPetOV } from '../../../consts/API'; const { ccclass, property } = _decorator; @ccclass('PetIconSelect') @@ -43,10 +44,10 @@ export class PetIconSelect extends Component { } - //设置icon - setIcon(petTbId:number){ + //设置 + set(info:PlayerPetOV){ - this.petIcon.setIcon(petTbId); + this.petIcon.set(info); } diff --git a/JisolGameCocos/assets/script/ui/Consts/Pet/PetIconSelectScroll.ts b/JisolGameCocos/assets/script/ui/Consts/Pet/PetIconSelectScroll.ts index f09a349b..a422916f 100644 --- a/JisolGameCocos/assets/script/ui/Consts/Pet/PetIconSelectScroll.ts +++ b/JisolGameCocos/assets/script/ui/Consts/Pet/PetIconSelectScroll.ts @@ -11,7 +11,7 @@ export class PetIconSelectScroll extends JNScrollViewItem { select:PetIconSelect; protected start(): void { - this.select.setIcon(this.data.petTbId); + this.select.set(this.data); } } diff --git a/JisolGameCocos/assets/script/ui/Consts/Pet/info.meta b/JisolGameCocos/assets/script/ui/Consts/Pet/info.meta new file mode 100644 index 00000000..d25b1188 --- /dev/null +++ b/JisolGameCocos/assets/script/ui/Consts/Pet/info.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.2.0", + "importer": "directory", + "imported": true, + "uuid": "c1b92428-4724-4f3e-b2c6-416af802434c", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/script/ui/Consts/Pet/info/PetPreviewWindow.ts b/JisolGameCocos/assets/script/ui/Consts/Pet/info/PetPreviewWindow.ts new file mode 100644 index 00000000..a9297fd8 --- /dev/null +++ b/JisolGameCocos/assets/script/ui/Consts/Pet/info/PetPreviewWindow.ts @@ -0,0 +1,78 @@ +import { sp } from 'cc'; +import { _decorator, Component, Node } from 'cc'; +import { PlayerPetOV } from '../../../../consts/API'; +import { app } from '../../../../App'; +import { UIPetAnim } from '../../../../consts/GData'; +import { Label } from 'cc'; +import { PlayerPetEvent } from '../../../../data/PlayerPetData'; +const { ccclass, property } = _decorator; + +@ccclass('PetPreviewWindow') +export class PetPreviewWindow extends Component { + + @property(Node) + starNode:Node; //星星节点 + + @property(Label) + levelLabel:Label; //等级 + + @property(sp.Skeleton) + spine:sp.Skeleton; //宠物Spine + + info:PlayerPetOV; + + onLoad(){ + + this.onUpdateInit(); + + //监听 + app.event.on(PlayerPetEvent.UPDATE_INFO,this.onUpdateInfo,this) + } + + protected onDestroy(): void { + app.event.off(PlayerPetEvent.UPDATE_INFO,this.onUpdateInfo,this) + } + + + //初始化 + onUpdateInit(){ + //隐藏 + this.starNode.active = false; + this.levelLabel.node.active = false; + } + + //刷新信息 + onUpdateInfo(info:PlayerPetOV){ + if(this.info && info.petId == this.info.petId){ + this.onUpdateView(); //刷新页面 + } + } + + //刷新页面 + onUpdateView(){ + this.onUpdateInit(); + + //显示宠物 + this.spine.skeletonData = app.battleRes.roleSpine[this.info.petTbId]; + this.spine.setAnimation(0,UIPetAnim.std,true); + + //等级 + this.levelLabel.node.active = true; + this.levelLabel.string = `Lv ${this.info.petLevel}`; + + //如果有星则显示星 + if(this.info.petStar){ + this.starNode.active = true; + this.starNode.getComponentInChildren(Label).string = `${this.info.petStar}`; + } + } + + //绑定显示的宠物 + bind(info:PlayerPetOV){ + this.info = info; + this.onUpdateView(); + } + +} + + diff --git a/JisolGameCocos/assets/script/ui/Consts/Pet/info/PetPreviewWindow.ts.meta b/JisolGameCocos/assets/script/ui/Consts/Pet/info/PetPreviewWindow.ts.meta new file mode 100644 index 00000000..7742e9d2 --- /dev/null +++ b/JisolGameCocos/assets/script/ui/Consts/Pet/info/PetPreviewWindow.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.23", + "importer": "typescript", + "imported": true, + "uuid": "f423768a-7790-4a2f-b005-a40110aba905", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/script/ui/Home/Sreeps/MainSreepsIcon.ts b/JisolGameCocos/assets/script/ui/Home/Sreeps/MainSreepsIcon.ts index 2992b6a4..07236e9a 100644 --- a/JisolGameCocos/assets/script/ui/Home/Sreeps/MainSreepsIcon.ts +++ b/JisolGameCocos/assets/script/ui/Home/Sreeps/MainSreepsIcon.ts @@ -12,7 +12,14 @@ export class MainSreepsIcon extends JNScrollViewItem { icon:PetIconSelect; start(){ - this.icon.setIcon(this.data.petTbId); + this.icon.set({ + petTbId: this.data.petTbId, + petId: 0, + petPlayerId: 0, + petLevel: 0, + petStar: 0, + petStarExp: 0 + }); } } diff --git a/JisolGameCocos/assets/script/ui/Tactical/IntoBattleView.ts b/JisolGameCocos/assets/script/ui/Tactical/IntoBattleView.ts index ad4969e4..c00bfdb5 100644 --- a/JisolGameCocos/assets/script/ui/Tactical/IntoBattleView.ts +++ b/JisolGameCocos/assets/script/ui/Tactical/IntoBattleView.ts @@ -6,11 +6,12 @@ import JNScrollView from '../../../../extensions/ngame/assets/ngame/util/compone import { NodeEventType } from 'cc'; import { sp } from 'cc'; import { app } from '../../App'; -import { PlayerPetOV } from '../../consts/API'; +import { API, PlayerPetOV } from '../../consts/API'; import { UIPetAnim } from '../../consts/GData'; import { GUI } from '../UIConfig'; import PlayerTacticalData from '../../data/PlayerTacticalData'; import { PetIconSelectScroll } from '../Consts/Pet/PetIconSelectScroll'; +import { PetPreviewWindow } from '../Consts/Pet/info/PetPreviewWindow'; const { ccclass, property } = _decorator; //上阵页面 @@ -21,8 +22,8 @@ export class IntoBattleView extends JNLayerBase { @property(JNScrollView) views:JNScrollView; //宠物列表 - @property(sp.Skeleton) - spine:sp.Skeleton; //当前选中的宠物 + @property(PetPreviewWindow) + petPreview:PetPreviewWindow; //宠物显示窗口 //宠物数据 pets:PlayerPetOV[] = []; @@ -79,8 +80,7 @@ export class IntoBattleView extends JNLayerBase { current.select.isSelect = true; //显示选中宠物 - this.spine.skeletonData = app.battleRes.roleSpine[this.pets[this.index].petTbId]; - this.spine.setAnimation(0,UIPetAnim.std,true); + this.petPreview.bind(this.pets[this.index]); } } @@ -126,6 +126,17 @@ export class IntoBattleView extends JNLayerBase { } + //点击升级 + async onClickUpLevel(){ + if(this.index < 0){ + app.layer.Open(GUI.Tips,{text:"请选择宠物."}) + return; + } + if(await API.PetUpLevel(this.pets[this.index].petId)) + app.layer.Open(GUI.Tips,{text:"升级成功!"}) + } + + } diff --git a/JisolGameCocos/extensions/ngame b/JisolGameCocos/extensions/ngame index 47865f8d..b1ff668c 160000 --- a/JisolGameCocos/extensions/ngame +++ b/JisolGameCocos/extensions/ngame @@ -1 +1 @@ -Subproject commit 47865f8d0af09462f3cf8594ccde001802df8723 +Subproject commit b1ff668cfa5f73ab924bf16904c77cac17817961 diff --git a/JisolGameServer/Main/src/main/java/cfg/TB/TbGRoleBaseAttribute.java b/JisolGameServer/Main/src/main/java/cfg/TB/TbGRoleBaseAttribute.java index 6e9b3b13..16fbb104 100644 --- a/JisolGameServer/Main/src/main/java/cfg/TB/TbGRoleBaseAttribute.java +++ b/JisolGameServer/Main/src/main/java/cfg/TB/TbGRoleBaseAttribute.java @@ -17,6 +17,7 @@ import com.google.gson.JsonObject; public final class TbGRoleBaseAttribute extends AbstractBean { public TbGRoleBaseAttribute(JsonObject _buf) { id = _buf.get("id").getAsInt(); + Blood = _buf.get("Blood").getAsInt(); Attack = _buf.get("Attack").getAsInt(); Defend = _buf.get("Defend").getAsInt(); } @@ -29,6 +30,10 @@ public final class TbGRoleBaseAttribute extends AbstractBean { * 角色Id (0 则默认) */ public final int id; + /** + * 默认血量 + */ + public final int Blood; /** * 默认攻击属性 */ @@ -47,6 +52,7 @@ public final class TbGRoleBaseAttribute extends AbstractBean { public String toString() { return "{ " + "(format_field_name __code_style field.name):" + id + "," + + "(format_field_name __code_style field.name):" + Blood + "," + "(format_field_name __code_style field.name):" + Attack + "," + "(format_field_name __code_style field.name):" + Defend + "," + "}"; diff --git a/JisolGameServer/Main/src/main/java/cfg/TB/TbGRoleUpLevel.java b/JisolGameServer/Main/src/main/java/cfg/TB/TbGRoleUpLevel.java index df1241a9..26051f4c 100644 --- a/JisolGameServer/Main/src/main/java/cfg/TB/TbGRoleUpLevel.java +++ b/JisolGameServer/Main/src/main/java/cfg/TB/TbGRoleUpLevel.java @@ -17,7 +17,7 @@ import com.google.gson.JsonObject; public final class TbGRoleUpLevel extends AbstractBean { public TbGRoleUpLevel(JsonObject _buf) { grade = _buf.get("grade").getAsInt(); - { com.google.gson.JsonArray _json0_ = _buf.get("materials").getAsJsonArray(); int __n0 = _json0_.size(); materials = new cfg.TbGEntity.Resource[__n0]; int __index0=0; for(JsonElement __e0 : _json0_) { cfg.TbGEntity.Resource __v0; __v0 = cfg.TbGEntity.Resource.deserialize(__e0.getAsJsonObject()); materials[__index0++] = __v0; } } + { com.google.gson.JsonArray _json0_ = _buf.get("materials").getAsJsonArray(); int __n0 = _json0_.size(); materials = new cfg.TbGEntity.TResource[__n0]; int __index0=0; for(JsonElement __e0 : _json0_) { cfg.TbGEntity.TResource __v0; __v0 = cfg.TbGEntity.TResource.deserialize(__e0.getAsJsonObject()); materials[__index0++] = __v0; } } } public static TbGRoleUpLevel deserialize(JsonObject _buf) { @@ -31,7 +31,7 @@ public final class TbGRoleUpLevel extends AbstractBean { /** * 消耗的材料 */ - public final cfg.TbGEntity.Resource[] materials; + public final cfg.TbGEntity.TResource[] materials; public static final int __ID__ = -877225318; diff --git a/JisolGameServer/Main/src/main/java/cfg/TbGEntity/Resource.java b/JisolGameServer/Main/src/main/java/cfg/TbGEntity/TResource.java similarity index 79% rename from JisolGameServer/Main/src/main/java/cfg/TbGEntity/Resource.java rename to JisolGameServer/Main/src/main/java/cfg/TbGEntity/TResource.java index 5537f48c..2a9e9863 100644 --- a/JisolGameServer/Main/src/main/java/cfg/TbGEntity/Resource.java +++ b/JisolGameServer/Main/src/main/java/cfg/TbGEntity/TResource.java @@ -17,14 +17,14 @@ import com.google.gson.JsonObject; /** * 资源信息 */ -public final class Resource extends AbstractBean { - public Resource(JsonObject _buf) { +public final class TResource extends AbstractBean { + public TResource(JsonObject _buf) { id = _buf.get("id").getAsInt(); value = _buf.get("value").getAsInt(); } - public static Resource deserialize(JsonObject _buf) { - return new cfg.TbGEntity.Resource(_buf); + public static TResource deserialize(JsonObject _buf) { + return new cfg.TbGEntity.TResource(_buf); } /** @@ -36,7 +36,7 @@ public final class Resource extends AbstractBean { */ public final int value; - public static final int __ID__ = -215001824; + public static final int __ID__ = 125240784; @Override public int getTypeId() { return __ID__; } diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/config/WebConfig.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/config/WebConfig.java index 67bf9d48..5747e589 100644 --- a/JisolGameServer/Main/src/main/java/cn/jisol/game/config/WebConfig.java +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/config/WebConfig.java @@ -4,7 +4,10 @@ import cn.jisol.game.controller.argsresolver.PlayerMethodArgumentResolver; import cn.jisol.game.controller.argsresolver.UserMethodArgumentResolver; import cn.jisol.game.controller.game.GPlayerController; import cn.jisol.game.interceptor.LoginInterceptor; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; @@ -28,10 +31,22 @@ public class WebConfig implements WebMvcConfigurer { registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/game/**"); } + /** + * 参数解析 + * @param resolvers + */ @Override public void addArgumentResolvers(List resolvers) { WebMvcConfigurer.super.addArgumentResolvers(resolvers); resolvers.add(new UserMethodArgumentResolver()); resolvers.add(new PlayerMethodArgumentResolver(this.playerController)); } + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); + return interceptor; + } + } 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 39155bab..f68f7d7b 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 @@ -1,6 +1,7 @@ package cn.jisol.game.controller.exception; import cn.jisol.ngame.util.NewsContext; +import org.springframework.retry.RetryException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @@ -17,6 +18,13 @@ public class HTTPExceptionHandler { return NewsContext.onMessage("Token 失效",null,LOGIN_TOKEN); } + //并发异常 + @ExceptionHandler(value = RetryException.class) + @ResponseBody + public NewsContext retryExceptionHandler(RetryException e){ + return NewsContext.onFail("服务器忙碌啦~ 一会再试试."); + } + //全局异常 @ExceptionHandler(value = Exception.class) @ResponseBody diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/GNoviceController.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/GNoviceController.java index 370e4c67..7e40cd27 100644 --- a/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/GNoviceController.java +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/controller/game/GNoviceController.java @@ -51,7 +51,7 @@ public class GNoviceController { return NewsContext.onFail("你已经有宠物了!"); }else{ //选择宠物 - if (playerPetService.save(PlayerPet.builder().petPlayerId(player.getPlayerId()).petTbId(petId).petGrade(0).build())){ + if (playerPetService.save(PlayerPet.builder().petPlayerId(player.getPlayerId()).petTbId(petId).petLevel(0).build())){ return NewsContext.onSuccess("选择宠物成功"); }else{ return NewsContext.onSuccess("选择宠物失败"); 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 7444354f..64780203 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 @@ -1,10 +1,14 @@ package cn.jisol.game.controller.game; +import cfg.TB.TbGRoleUpLevel; +import cfg.TbGEntity.TResource; import cn.jisol.game.controller.argsresolver.CurrentPlayer; 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.service.PlayerPetService; +import cn.jisol.game.service.ResourceService; import cn.jisol.game.vo.news.NewsResource; import cn.jisol.game.vo.news.ov.ResourceUpdateOV; import cn.jisol.game.vo.pet.PetUpStarOV; @@ -15,6 +19,8 @@ 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.*; @@ -34,6 +40,8 @@ public class GPlayerPetController { @Autowired PlayerPetService playerPetService; + @Autowired + ResourceService resourceService; //获取玩家宠物列表 @ApiImplicitParams({}) @@ -54,6 +62,7 @@ public class GPlayerPetController { @ApiOperation(value = "提升宠物星") @PostMapping("/up/star") @Transactional + @Retryable(value = RetryException.class) public NewsResource onUpStar(@RequestBody PetUpStarOV info, @CurrentPlayer Player player){ //判断参数 @@ -99,8 +108,8 @@ public class GPlayerPetController { pet.setPetStar(pet.getPetStar() + 1); } - //保存宠物信息 - playerPetService.updateById(pet); + //保存宠物信息 (保存失败则重试) + if(!playerPetService.updateById(pet)) throw new RetryException(""); //删除被合成的宠物 playerPetService.removeByIds(info.getPets()); @@ -122,15 +131,41 @@ public class GPlayerPetController { @ApiImplicitParams({}) @ApiOperation(value = "提升宠物等级") @PostMapping("/up/level/{petId}") + @Transactional + @Retryable(value = RetryException.class) public NewsResource onUpLevel(@PathVariable Integer petId, @CurrentPlayer Player player){ + //整理刷新数据 + ArrayList resources = new ArrayList<>(); + //获取需要升级的宠物 PlayerPet pet = playerPetService.getById(petId); if(Objects.isNull(pet) || !Objects.equals(pet.getPetPlayerId(), player.getPlayerId())){ return NewsResource.onFail("你未拥有这个宠物"); } - return NewsResource.onFail("升级成功"); + TbGRoleUpLevel resource = TD.DATA.getTbGRoleUpLevel().get(pet.getPetLevel() + 1); + + //扣除玩家材料 + for (int i = 0; i < resource.materials.length; i++) { + TResource res = resource.materials[i]; + Resource data = resourceService.addResourceValue(player.getPlayerId(), res.id, -((long) res.value)); + if (Objects.isNull(data)){ + return NewsResource.onFail("材料不够"); + }else{ + //刷新资源 + resources.add(ResourceUpdateOV.onUpdate(data)); //刷新资源 + } + } + + //升级 + pet.setPetLevel(pet.getPetLevel() + 1); + + //保存 + if(!playerPetService.updateById(pet)) throw new RetryException(""); + resources.add(ResourceUpdateOV.onPet(ResourceUpdateOV.ResourceUpdateType.UPDATE,pet)); //刷新宠物 + + return NewsResource.onSuccess("升级成功",pet,resources.toArray(new ResourceUpdateOV[0])); } 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 40b86022..4e2a8828 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 @@ -100,7 +100,7 @@ public class GOnHookController { if(Objects.nonNull(creeps.remove(creepId))){ //增加玩家金币 (默认添加100) - Resource res = resourceService.addResourceValue(player.getPlayerId(), ResourceId.Gold, 100L); + Resource res = resourceService.addResourceValue(player.getPlayerId(), ResourceId.Gold.id, 100L); return NewsResource.onSuccess( "卖出成功", true, @@ -135,7 +135,7 @@ public class GOnHookController { } //捕捉 - PlayerPet pet = PlayerPet.builder().petPlayerId(player.getPlayerId()).petTbId(onHookPet.getPetTbId()).petGrade(0).build(); + PlayerPet pet = PlayerPet.builder().petPlayerId(player.getPlayerId()).petTbId(onHookPet.getPetTbId()).petLevel(0).build(); if(playerPetService.save(pet)){ return NewsContext.onSuccess("捕捉成功",pet); }else{ diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/entity/game/PlayerPet.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/entity/game/PlayerPet.java index bc21c12c..26a25b60 100644 --- a/JisolGameServer/Main/src/main/java/cn/jisol/game/entity/game/PlayerPet.java +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/entity/game/PlayerPet.java @@ -3,6 +3,7 @@ package cn.jisol.game.entity.game; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; import lombok.Builder; import lombok.Data; @@ -17,7 +18,9 @@ public class PlayerPet { private Long petId; //宠物唯一Id private Long petPlayerId; //宠物的玩家Id private Integer petTbId; //宠物配置表Id - private Integer petGrade; //宠物等级 + private Integer petLevel; //宠物等级 private Integer petStar; //宠物星级 private Integer petStarExp; //宠物星级经验 + @Version + private Integer version; } diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/entity/game/Resource.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/entity/game/Resource.java index bc4604a1..b9a32445 100644 --- a/JisolGameServer/Main/src/main/java/cn/jisol/game/entity/game/Resource.java +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/entity/game/Resource.java @@ -3,6 +3,7 @@ package cn.jisol.game.entity.game; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; import lombok.Builder; import lombok.Data; @@ -19,5 +20,7 @@ public class Resource { private Long playerId; //玩家Id private int resourceTbId; //资源配置表Id private Long resourceValue; //资源数量 + @Version + private Integer version; } diff --git a/JisolGameServer/Main/src/main/java/cn/jisol/game/service/ResourceService.java b/JisolGameServer/Main/src/main/java/cn/jisol/game/service/ResourceService.java index e9531b55..1646c2c3 100644 --- a/JisolGameServer/Main/src/main/java/cn/jisol/game/service/ResourceService.java +++ b/JisolGameServer/Main/src/main/java/cn/jisol/game/service/ResourceService.java @@ -8,10 +8,10 @@ import com.baomidou.mybatisplus.extension.service.IService; public interface ResourceService extends IService { //添加某个资源的数量 - public Resource addResourceValue(Long playerId, ResourceId type, Long value); + public Resource addResourceValue(Long playerId, int type, Long value); //初始化某个资源 - public Resource initResource(Long playerId, ResourceId type); + public Resource initResource(Long playerId, int type); public Resource initResource(Resource resource); } 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 aab47630..05d6a2e9 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 @@ -7,6 +7,8 @@ import cn.jisol.game.mapper.ResourceMapper; import cn.jisol.game.service.ResourceService; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.retry.RetryException; +import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,15 +24,14 @@ public class ResourceServiceImpl extends ServiceImpl i * @return */ @Override - @Transactional - public Resource addResourceValue(Long playerId, ResourceId type, Long value) { + @Retryable(value = RetryException.class) + public Resource addResourceValue(Long playerId, int type, Long value) { //获取玩家资源 Resource res = this.getOne( Wrappers.lambdaQuery(Resource.class) .eq(Resource::getPlayerId, playerId) //玩家 - .eq(Resource::getResourceTbId, type.id) //资源 - .last(" for update") //加锁 + .eq(Resource::getResourceTbId, type) //资源 ); //如果没有资源则默认给一个0的资源 @@ -42,16 +43,20 @@ public class ResourceServiceImpl extends ServiceImpl i //添加资源 res.setResourceValue(res.getResourceValue() + value); - //保存资源 - this.saveOrUpdate(res); + if(res.getResourceValue() <= 0){ + return null; + } + + //保存资源 (保存失败重试) + if (!this.saveOrUpdate(res)) throw new RetryException(""); return res; } //初始化某个资源 @Override - public Resource initResource(Long playerId, ResourceId type) { - Resource resource = Resource.builder().playerId(playerId).resourceTbId(type.id).resourceValue(0L).build(); + public Resource initResource(Long playerId, int type) { + Resource resource = Resource.builder().playerId(playerId).resourceTbId(type).resourceValue(0L).build(); this.initResource(resource); return resource; } diff --git a/JisolGameServer/Main/src/main/resources/json/tbgattribute.json b/JisolGameServer/Main/src/main/resources/json/tbgattribute.json index 4ece033b..4435e535 100644 --- a/JisolGameServer/Main/src/main/resources/json/tbgattribute.json +++ b/JisolGameServer/Main/src/main/resources/json/tbgattribute.json @@ -8,5 +8,10 @@ "id": 110002, "name": "防御", "sign": "Defend" + }, + { + "id": 110003, + "name": "血量", + "sign": "Blood" } ] \ No newline at end of file diff --git a/JisolGameServer/Main/src/main/resources/json/tbgrolebaseattribute.json b/JisolGameServer/Main/src/main/resources/json/tbgrolebaseattribute.json index a5e7765b..7e3570d2 100644 --- a/JisolGameServer/Main/src/main/resources/json/tbgrolebaseattribute.json +++ b/JisolGameServer/Main/src/main/resources/json/tbgrolebaseattribute.json @@ -1,6 +1,7 @@ [ { "id": 0, + "Blood": 100, "Attack": 10, "Defend": 5 }