diff --git a/README.md b/README.md index 9a942b1..c683293 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -g_game.bcm_tool.queryPlayerInfo(g_game.bcm_tool.getPlayerIds()); \ No newline at end of file +g_game.bcm_tool.ExportPlayerInfo(g_game.bcm_tool.EetPlayerIds()); \ No newline at end of file diff --git a/dist/bcm_tool.js b/dist/bcm_tool.js index 979da99..7b6703f 100644 --- a/dist/bcm_tool.js +++ b/dist/bcm_tool.js @@ -1,10 +1,17 @@ "use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; class BcmTool { constructor() { - this.mgrTeamInfo = g_game.mgr.mgr_team_player_team_info; - } - queryPlayerInfo(playersToQuery) { - const attributes = [ + this.attributes = new Map([ + ['年龄', -100], ['速度', 1], ['力量', 2], ['内攻', 3], @@ -49,47 +56,141 @@ class BcmTool { ['进攻技能', 44], ['防守技能', 48], ['身体素质', 50], - ]; - var form = new Form(); - for (let i = 0; i != attributes.length; ++i) { - form.SetCell(i + 1, 0, attributes[i][0]); + ]); + this.mgrTeamInfo = g_game.mgr.mgr_team_player_team_info; + this.mgrMarket = g_game.mgr.mgr_market; + } + ExportPlayerInfo(playersToQuery) { + const lstAttributes = [...this.attributes]; + const form = new Form(); + for (let i = 0; i != lstAttributes.length; ++i) { + form.SetCell(i + 1, 0, lstAttributes[i][0]); } for (let i = 0; i != playersToQuery.length; ++i) { const playerId = playersToQuery[i]; - if (!this.checkInfo(playerId)) { + if (!this.CheckInfo(playerId)) { console.log('找不到id', playerId); continue; } - form.SetCell(0, i + 1, this.queryName(playerId)); - for (let j = 0; j != attributes.length; ++j) { - const record = this.queryInfo(playerId, attributes[j][1]); + form.SetCell(0, i + 1, this.QueryName(playerId)); + for (let j = 0; j != lstAttributes.length; ++j) { + const record = this.QueryInfo(playerId, lstAttributes[j][1]); form.SetCell(j + 1, i + 1, record.toString()); } } console.log(form); g_game.tools.CopyStrToClipboard(form.ToString()); } - checkInfo(playerId) { + BulkSearchMarket(searchStr, maxIterate = 100) { + searchStr = searchStr.replace(/ /g, ''); + const strs = searchStr.split('&&'); + const operators = ['>', '<', '==']; + const handlers = [ + (id, attri, value) => { + return this.QueryInfo(id, attri) > value; + }, + (id, attri, value) => { + return this.QueryInfo(id, attri) < value; + }, + (id, attri, value) => { + return Math.floor(this.QueryInfo(id, attri)) == value; + }, + (id, attri, value) => { + return this.QueryInfo(id, attri) >= value; + }, + (id, attri, value) => { + return this.QueryInfo(id, attri) <= value; + }, + ]; + const conditions = []; + const requireAttributes = []; + const requireSearch = []; + const requireValues = []; + for (let i = 0; i != strs.length; ++i) { + const str = strs[i]; + const operator = operators.find(e => str.search(e) != -1); + if (operator == null) { + console.log('条件解析失败', str); + continue; + } + const handler = handlers[operators.indexOf(operator)]; + const requires = str.split(operator); + const attribute = this.attributes.get(requires[0]); + const value = Number(requires[1]); + if (attribute == null || handler == null) { + console.log('条件解析失败', str); + continue; + } + conditions.push(handler); + requireAttributes.push(attribute); + requireValues.push(value); + requireSearch.push(requires[0]); + } + this.mgrMarket.SendSynOpenMarketInfoByFilter(() => __awaiter(this, void 0, void 0, function* () { + var results = []; + const ids = Object.keys(this.mgrMarket._map_player_infos); + for (const id of ids) { + if (maxIterate < 0) { + break; + } + const info = this.mgrMarket._map_player_infos[id]; + yield this.RefreshPlayerInTransaction(info.teamId, info.playerId); + if (conditions.every((e, i) => e(info.playerId, requireAttributes[i], requireValues[i]))) { + results.push(info); + } + maxIterate -= 1; + } + const displays = new Set(requireAttributes); + for (const result of results) { + const displayStr = [...displays].map(e => { + const idx = requireAttributes.indexOf(e); + const search = requireSearch[idx]; + const value = result.GetSingleAttribute(e, true); + return `${search}:${value}`; + }); + console.log(result.playerName, ...displayStr); + } + })); + } + RefreshPlayerInTransaction(teamId, playerId) { + return new Promise(resolve => { + this.mgrTeamInfo.OpenPlayerDetailInTransaction(teamId, playerId, e => { + resolve(); + return true; + }, e => { + resolve(); + }); + }); + } + CheckInfo(playerId) { const data = this.mgrTeamInfo.GetPlayerData(playerId); return data != null; } - queryName(playerId) { + QueryName(playerId) { const data = this.mgrTeamInfo.GetPlayerData(playerId); return data.playerName; } - queryInfo(playerId, attri) { + QueryInfo(playerId, attri) { const data = this.mgrTeamInfo.GetPlayerData(playerId); - return data.GetSingleAttribute(attri).toFixed(2); + if (attri == -100) { + return data.playerAge; + } + return data.GetSingleAttribute(attri); } - getPlayerIds() { + GetPlayerIds() { return Object.keys(this.mgrTeamInfo._map_player_detail); } - listPlayers() { + ListPlayers() { const ids = Object.keys(this.mgrTeamInfo._map_player_detail); for (const id of ids) { - console.log(this.queryName(id), id); + console.log(this.QueryName(id), id); } } + ListMarketPlayers() { + this.mgrMarket.SendSynOpenMarketInfoByFilter(() => { + console.log(this.mgrMarket._map_player_infos); + }); + } } class Logger { constructor() { @@ -122,7 +223,7 @@ class Form { } ToString() { var _a; - var logger = new Logger(); + const logger = new Logger(); for (let col = 0; col != this.records.length; ++col) { for (let row = 0; row != this.records[col].length; ++row) { logger.Info((_a = this.records[col][row]) !== null && _a !== void 0 ? _a : ''); diff --git a/src/bcm_tool.ts b/src/bcm_tool.ts index 121fe46..7c02d70 100644 --- a/src/bcm_tool.ts +++ b/src/bcm_tool.ts @@ -1,74 +1,76 @@ class BcmTool { + private attributes = new Map([ + ['年龄', -100], + ['速度', 1], + ['力量', 2], + ['内攻', 3], + ['中投', 4], + ['三分', 5], + ['三分急停跳投倾向', 6], + ['内线防守能力', 7], + ['外线防守能力', 8], + ['突破能力', 9], + ['上篮能力', 10], + ['控球能力', 11], + ['传球能力', 12], + ['传球视野', 13], + ['干扰投篮', 14], + ['篮板能力', 15], + ['*出手时间', 16], + ['*进攻IQ', 17], + ['*防守IQ', 18], + ['体能', 19], + ['卡位能力', 20], + ['罚球能力', 21], + ['抢断能力', 22], + ['盖帽能力', 23], + ['*进攻犯规', 24], + ['*防守犯规', 25], + ['扣篮能力', 26], + ['勾手倾向', 27], + ['*后仰倾向', 28], + ['打板倾向', 29], + ['*反应时间', 30], + ['拉开空间', 31], + ['补防、协防', 32], + ['*造进攻犯规', 33], + ['快下', 34], + ['无球跑动', 35], + ['挡拆', 36], + ['*造防守犯规', 37], + ['无球掩护', 38], + ['进攻篮板', 39], + ['*假动作', 40], + ['攻转守', 41], + ['进攻技能', 44], + ['防守技能', 48], + ['身体素质', 50], + ]); private mgrTeamInfo = g_game.mgr.mgr_team_player_team_info; + private mgrMarket = g_game.mgr.mgr_market; - public queryPlayerInfo(playersToQuery: string[]) + public ExportPlayerInfo(playersToQuery: string[]) { - const attributes = [ - ['速度', 1], - ['力量', 2], - ['内攻', 3], - ['中投', 4], - ['三分', 5], - ['三分急停跳投倾向', 6], - ['内线防守能力', 7], - ['外线防守能力', 8], - ['突破能力', 9], - ['上篮能力', 10], - ['控球能力', 11], - ['传球能力', 12], - ['传球视野', 13], - ['干扰投篮', 14], - ['篮板能力', 15], - ['*出手时间', 16], - ['*进攻IQ', 17], - ['*防守IQ', 18], - ['体能', 19], - ['卡位能力', 20], - ['罚球能力', 21], - ['抢断能力', 22], - ['盖帽能力', 23], - ['*进攻犯规', 24], - ['*防守犯规', 25], - ['扣篮能力', 26], - ['勾手倾向', 27], - ['*后仰倾向', 28], - ['打板倾向', 29], - ['*反应时间', 30], - ['拉开空间', 31], - ['补防、协防', 32], - ['*造进攻犯规', 33], - ['快下', 34], - ['无球跑动', 35], - ['挡拆', 36], - ['*造防守犯规', 37], - ['无球掩护', 38], - ['进攻篮板', 39], - ['*假动作', 40], - ['攻转守', 41], - ['进攻技能', 44], - ['防守技能', 48], - ['身体素质', 50], - ]; - - var form = new Form(); - for (let i = 0; i != attributes.length; ++i) + const lstAttributes = [...this.attributes]; + const form = new Form(); + for (let i = 0; i != lstAttributes.length; ++i) { - form.SetCell(i + 1, 0, attributes[i][0] as string); + form.SetCell(i + 1, 0, lstAttributes[i][0] as string); } for (let i = 0; i != playersToQuery.length; ++i) { const playerId = playersToQuery[i]; - if (!this.checkInfo(playerId)) + if (!this.CheckInfo(playerId)) { console.log('找不到id', playerId); continue; } - form.SetCell(0, i + 1, this.queryName(playerId)); - for (let j = 0; j != attributes.length; ++j) + form.SetCell(0, i + 1, this.QueryName(playerId)); + for (let j = 0; j != lstAttributes.length; ++j) { - const record = this.queryInfo(playerId, attributes[j][1] as number); + const record = this.QueryInfo(playerId, lstAttributes[j][1] as number); form.SetCell(j + 1, i + 1, record.toString()); } } @@ -76,38 +78,155 @@ class BcmTool g_game.tools.CopyStrToClipboard(form.ToString()); } - public checkInfo(playerId: string) + public BulkSearchMarket(searchStr: string, maxIterate = 100) + { + searchStr = searchStr.replace(/ /g, ''); + const strs = searchStr.split('&&'); + const operators = ['>', '<', '==']; + const handlers: ((id: string, attri: number, value: number) => boolean)[] = [ + (id: string, attri: number, value: number) => + { + return this.QueryInfo(id, attri) > value; + }, + (id: string, attri: number, value: number) => + { + return this.QueryInfo(id, attri) < value; + }, + (id: string, attri: number, value: number) => + { + return Math.floor(this.QueryInfo(id, attri)) == value; + }, + (id: string, attri: number, value: number) => + { + return this.QueryInfo(id, attri) >= value; + }, + (id: string, attri: number, value: number) => + { + return this.QueryInfo(id, attri) <= value; + }, + ]; + const conditions: ((id: string, attri: number, value: number) => boolean)[] = []; + const requireAttributes: number[] = []; + const requireSearch: string[] = []; + const requireValues: number[] = []; + + for (let i = 0; i != strs.length; ++i) + { + const str = strs[i]; + const operator = operators.find(e => str.search(e) != -1); + if (operator == null) + { + console.log('条件解析失败', str); + continue; + } + const handler = handlers[operators.indexOf(operator)]; + const requires = str.split(operator); + const attribute = this.attributes.get(requires[0]); + const value = Number(requires[1]); + if (attribute == null || handler == null) + { + console.log('条件解析失败', str); + continue; + } + conditions.push(handler); + requireAttributes.push(attribute); + requireValues.push(value); + requireSearch.push(requires[0]); + } + + this.mgrMarket.SendSynOpenMarketInfoByFilter(async () => + { + var results: CPlayerData[] = []; + const ids = Object.keys(this.mgrMarket._map_player_infos); + for (const id of ids) + { + if (maxIterate < 0) + { + break; + } + const info = this.mgrMarket._map_player_infos[id]; + await this.RefreshPlayerInTransaction(info.teamId, info.playerId); + if (conditions.every((e, i) => e(info.playerId, requireAttributes[i], requireValues[i]))) + { + results.push(info); + } + maxIterate -= 1; + } + const displays = new Set(requireAttributes); + for (const result of results) + { + const displayStr = [...displays].map(e => + { + const idx = requireAttributes.indexOf(e); + const search = requireSearch[idx]; + const value = result.GetSingleAttribute(e, true); + return `${search}:${value}`; + }); + console.log(result.playerName, ...displayStr); + } + }); + } + + private RefreshPlayerInTransaction(teamId: string, playerId: string) + { + return new Promise(resolve => + { + this.mgrTeamInfo.OpenPlayerDetailInTransaction(teamId, playerId, e => + { + resolve() + return true; + }, e => + { + resolve(); + }); + + }); + } + + public CheckInfo(playerId: string) { const data = this.mgrTeamInfo.GetPlayerData(playerId); return data != null; } - public queryName(playerId: string) + public QueryName(playerId: string) { const data = this.mgrTeamInfo.GetPlayerData(playerId); return data.playerName; } - public queryInfo(playerId: string, attri: number) + public QueryInfo(playerId: string, attri: number) { const data = this.mgrTeamInfo.GetPlayerData(playerId); - return data.GetSingleAttribute(attri).toFixed(2); + if (attri == -100) + { + return data.playerAge; + } + return data.GetSingleAttribute(attri); } - public getPlayerIds() + public GetPlayerIds() { return Object.keys(this.mgrTeamInfo._map_player_detail); } - public listPlayers() + public ListPlayers() { const ids = Object.keys(this.mgrTeamInfo._map_player_detail); for (const id of ids) { - console.log(this.queryName(id), id); + console.log(this.QueryName(id), id); } } + public ListMarketPlayers() + { + this.mgrMarket.SendSynOpenMarketInfoByFilter(() => + { + console.log(this.mgrMarket._map_player_infos); + }); + } + } class Logger @@ -153,7 +272,7 @@ class Form public ToString() { - var logger = new Logger(); + const logger = new Logger(); for (let col = 0; col != this.records.length; ++col) { for (let row = 0; row != this.records[col].length; ++row) diff --git a/src/global.d.ts b/src/global.d.ts index 1ea3d3b..3fdb228 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -2,29 +2,55 @@ export { }; declare global { - interface BGameMgr { - public mgr_team_player_team_info: MgrTeamPlayerInfo; + interface BGameMgr + { + public mgr_team_player_team_info: MgrTeamPlayerInfo; + public mgr_market: MgrMarket; } - interface BGameTools { - public CopyStrToClipboard(str:string, success?:Function); + interface BGameTools + { + public CopyStrToClipboard(str: string, success?: Function); } - interface MgrTeamPlayerInfo { - public _map_player_detail:{ [key:string]:CPlayerData } - public GetPlayerData(player_id:string):CPlayerData; - public UpdateFromMessage(msg:BMProto.S2CGetPlayerDetailResp):void; + interface MgrTeamPlayerInfo + { + public _map_player_detail: { [key: string]: CPlayerData } + public GetPlayerData(player_id: string): CPlayerData; + public UpdateFromMessage(msg: BMProto.S2CGetPlayerDetailResp): void; + public OpenPlayerDetailInTransaction(team_id: string, player_id: string, filter?: (data: CPlayerData) => boolean, error_callback?: (code: number, msg: BMProto.S2CGetPlayerDetailResp, msgid: EnumCommandId) => void): void; } - interface CPlayerData { + interface MgrMarket + { + public _map_player_infos: { [key: string]: CMarketPlayerInfo }; + public SendSynOpenMarketInfoByFilter(callback?: () => void); + } + + interface BNetManager + { + public SendHttpEx(cmd: EnumCommandId, data: BMProto.C2SMessage, respClass: new () => T, success: (msg: T) => void, fail: (code: number, msg: T, msgid: EnumCommandId) => void = null, callback: () => void = null) + } + + interface CPlayerData + { + public playerId: string; public playerName: string; + public playerAge: number; + public teamName: string; + public teamId: string; + public GetSingleAttribute(PlayerAttribute: number, is_floor?: boolean): number; + } + + interface CMarketPlayerInfo extends CPlayerData + { - public GetSingleAttribute(PlayerAttribute:number,is_floor?:boolean):number; } var g_game: { - mgr: BGameMgr; bcm_tool: BcmTool; - tools: BGameTools; + mgr: BGameMgr; + tools: BGameTools; + net: BNetManager; }; } \ No newline at end of file