Skip to content

Commit

Permalink
新增:设置炫彩皮肤(没有原皮肤但有炫彩皮肤的情况下,此功能可以突破游戏限制)
Browse files Browse the repository at this point in the history
  • Loading branch information
4379711 committed Apr 26, 2024
1 parent a3ab3b5 commit c551a87
Show file tree
Hide file tree
Showing 12 changed files with 208 additions and 11 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
- 查看双方所有人的近期战绩,并计算得分,添加大神和牛马称谓,一键发送到聊天框
- **游戏内一键喊话,对喷**
- **游戏内一键鼓励队友,彩虹屁**
- **设置炫彩皮肤(没有原皮肤但有炫彩皮肤的情况下,此功能可以突破游戏限制)**

## 项目说明
- 一键喊话功能和快捷键触发盲仔光速摸眼等功能,均使用模拟按键的方式实现
Expand Down
15 changes: 12 additions & 3 deletions src/main/java/yalong/site/ClientStarter.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class ClientStarter {

public void initLcu() throws Exception {
LeagueClientBO leagueClientBO = ProcessUtil.getClientProcess();
if(leagueClientBO.equals(new LeagueClientBO())){
if (leagueClientBO.equals(new LeagueClientBO())) {
throw new NoProcessException();
}
RequestLcuUtil requestUtil = new RequestLcuUtil(leagueClientBO);
Expand Down Expand Up @@ -54,7 +54,7 @@ public void cacheData() {
}
}

public void loadFrameData(){
public void loadFrameData() {
// 所有英雄添加到面板下拉框
int itemCount = FrameInnerCache.pickBox.getItemCount();
if (itemCount == 1) {
Expand All @@ -66,16 +66,25 @@ public void loadFrameData(){
}
}


@SuppressWarnings("InfiniteLoopStatement")
public void listenGameStatus() throws InterruptedException, IOException {
int currentStatus = 0;
while (true) {
TimeUnit.MILLISECONDS.sleep(500);
GameStatusContext gameStatusContext = new GameStatusContext();
CalculateScore calculateScore = new CalculateScore(api);
//监听游戏状态
GameStatusEnum gameStatus = api.getGameStatus();
switch (gameStatus) {
case None:
case Lobby:
case Matchmaking:
case PreEndOfGame:
case WaitingForStats: {
gameStatusContext.setStrategy(new OtherStatusStrategy());
GameDataCache.reset();
break;
}
case ReadyCheck: {
gameStatusContext.setStrategy(new ReadyCheckStrategy(api));
break;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/yalong/site/bo/ChampionBO.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class ChampionBO {
/**
* 英雄id
*/
private int id;
private Integer id;
/**
* 英雄中文名
*/
Expand Down
22 changes: 22 additions & 0 deletions src/main/java/yalong/site/bo/SkinBO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package yalong.site.bo;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
* @author yalong
*/
@Data
@AllArgsConstructor
public class SkinBO {

/**
* 皮肤id
*/
private Integer id;
/**
* 皮肤中文名
*/
private String name;

}
2 changes: 2 additions & 0 deletions src/main/java/yalong/site/cache/FrameInnerCache.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import yalong.site.frame.panel.client.BanBox;
import yalong.site.frame.panel.client.PickBox;
import yalong.site.frame.panel.client.PickSkinBox;

/**
* 配置全局属性
Expand All @@ -11,5 +12,6 @@
public class FrameInnerCache {
public static BanBox banBox;
public static PickBox pickBox;
public static PickSkinBox pickSkinBox;

}
20 changes: 20 additions & 0 deletions src/main/java/yalong/site/cache/GameDataCache.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package yalong.site.cache;

import yalong.site.bo.SkinBO;
import yalong.site.bo.SummonerInfoBO;
import yalong.site.frame.bo.ItemBO;

import java.util.ArrayList;
import java.util.List;

/**
* 每一局游戏的数据缓存
Expand All @@ -11,12 +14,29 @@
*/
public class GameDataCache {
public static SummonerInfoBO me;
/**
* 本局游戏中,所选英雄的所有炫彩皮肤
*/
public static List<SkinBO> currentChampionSkins;
/**
* 本局游戏中,要选择的炫彩皮肤
*/
public static Integer skinId;
public static ArrayList<String> otherTeamScore = new ArrayList<>();
public static ArrayList<String> myTeamScore = new ArrayList<>();

public static void reset() {
skinId = null;
currentChampionSkins = new ArrayList<>();
otherTeamScore = new ArrayList<>();
myTeamScore = new ArrayList<>();
resetPickSkinBoxData();
}

public static void resetPickSkinBoxData() {
for (int i = 1; i < FrameInnerCache.pickSkinBox.getItemCount(); i++) {
FrameInnerCache.pickSkinBox.removeItemAt(i);
}
}

}
2 changes: 2 additions & 0 deletions src/main/java/yalong/site/frame/panel/client/ClientPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ public static ClientPanel builder() {
clientPanel.add(banBox.getComp(), banBox.getConstraints());
ComponentBO pickBox = PickBox.builder();
clientPanel.add(pickBox.getComp(), pickBox.getConstraints());
ComponentBO pickSkinBox = PickSkinBox.builder();
clientPanel.add(pickSkinBox.getComp(), pickSkinBox.getConstraints());
return clientPanel;

}
Expand Down
63 changes: 63 additions & 0 deletions src/main/java/yalong/site/frame/panel/client/PickSkinBox.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package yalong.site.frame.panel.client;

import lombok.extern.slf4j.Slf4j;
import yalong.site.cache.FrameCache;
import yalong.site.cache.FrameInnerCache;
import yalong.site.cache.GameDataCache;
import yalong.site.frame.bo.ComponentBO;
import yalong.site.frame.bo.ItemBO;
import yalong.site.frame.panel.base.BaseComboBox;

import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

/**
* @author yaLong
*/
@Slf4j
public class PickSkinBox extends BaseComboBox<ItemBO> {

public PickSkinBox() {
this.addItem(new ItemBO(null, "选择皮肤"));
this.addItemListener(listener());
}

/**
* @return 带布局的盒子
*/
public static ComponentBO builder() {
PickSkinBox box = new PickSkinBox();
FrameInnerCache.pickSkinBox = box;
GridBagConstraints grid = new GridBagConstraints(
// 第(0,4)个格子
0, 4,
// 占3列,占1行
3, 1,
//横向占100%长度,纵向占100%长度
100, 100,
//居中,组件小的话就两边铺满窗格
GridBagConstraints.CENTER, GridBagConstraints.NONE,
// 窗格之间的距离
new Insets(0, 0, 0, 0),
// 增加组件的首选宽度和高度
0, 0
);
return new ComponentBO(box, grid);
}

private ItemListener listener() {
return e -> {
if (e.getStateChange() == ItemEvent.SELECTED) {
ItemBO item = (ItemBO) e.getItem();
if (item.getValue() == null) {
GameDataCache.skinId = null;
} else {
GameDataCache.skinId = Integer.parseInt(item.getValue());
}

}
};
}

}
27 changes: 27 additions & 0 deletions src/main/java/yalong/site/services/lcu/ChampSelectStrategy.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package yalong.site.services.lcu;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import yalong.site.bo.SkinBO;
import yalong.site.cache.FrameCache;
import yalong.site.cache.FrameInnerCache;
import yalong.site.cache.GameDataCache;
import yalong.site.frame.bo.ItemBO;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
* @author yalong
Expand All @@ -22,6 +27,22 @@ public ChampSelectStrategy(LinkLeagueClientApi api, CalculateScore calculateScor
this.calculateScore = calculateScore;
}

private void setSkin() throws IOException {
if(CollectionUtil.isEmpty(GameDataCache.currentChampionSkins)){
List<SkinBO> currentChampionSkins = api.getCurrentChampionSkins();
if(CollectionUtil.isEmpty(currentChampionSkins)){
return;
}
GameDataCache.currentChampionSkins = currentChampionSkins;
for (SkinBO bo : GameDataCache.currentChampionSkins) {
FrameInnerCache.pickSkinBox.addItem(new ItemBO(String.valueOf(bo.getId()), bo.getName()));
}
}
if(GameDataCache.skinId!=null){
api.setCurrentChampionSkins(GameDataCache.skinId);
}
}

private void autoBanPick() throws IOException {
// todo 有些游戏模式会让选择多次,暂未发现什么标记能够分辨是预选和确认选择,所以目前的方式让程序一直发起pick请求
if (FrameCache.pickChampionId != null ||FrameCache.banChampionId != null) {
Expand Down Expand Up @@ -84,5 +105,11 @@ public void doThis() {
} catch (Exception e) {
log.error("sendScore错误", e);
}

try {
setSkin();
} catch (Exception e) {
log.error("设置皮肤错误", e);
}
}
}
2 changes: 0 additions & 2 deletions src/main/java/yalong/site/services/lcu/EndOfGameStrategy.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ public EndOfGameStrategy(LinkLeagueClientApi api) {

@Override
public void doThis() {
//游戏结束时,此时清除对局缓存
GameDataCache.reset();
if (FrameCache.autoPlayAgain) {
//再来一局
try {
Expand Down
61 changes: 58 additions & 3 deletions src/main/java/yalong/site/services/lcu/LinkLeagueClientApi.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package yalong.site.services.lcu;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import yalong.site.bo.*;
Expand All @@ -11,6 +12,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
Expand Down Expand Up @@ -85,12 +87,65 @@ public void setBackgroundSkin(int skinId) throws IOException {
}

/**
* 获取某个英雄的皮肤
* 获取某个英雄的所有皮肤和炫彩皮肤的id名字
*
* @param championId 英雄id
*/
public String getBackgroundSkin(int championId) throws IOException {
return requestLcuUtil.doGet("/lol-game-data/assets/v1/champions/" + championId + ".json");
public List<SkinBO> getChromasSkinByChampionId(int championId) throws IOException {
String resp = requestLcuUtil.doGet("/lol-game-data/assets/v1/champions/" + championId + ".json");
ArrayList<SkinBO> arrayList = new ArrayList<>();
JSONArray skins = JSON.parseObject(resp).getJSONArray("skins");
for (int i = 0; i < skins.size(); i++) {
JSONObject jsonObject = skins.getJSONObject(i);
Integer id = jsonObject.getInteger("id");
String name = jsonObject.getString("name");
arrayList.add(new SkinBO(id, name));
JSONArray chromas = jsonObject.getJSONArray("chromas");
if (chromas == null) {
continue;
}
for (int j = 0; j < chromas.size(); j++) {
Integer chromasId = chromas.getJSONObject(j).getInteger("id");
String chromasName = chromas.getJSONObject(j).getString("name");
arrayList.add(new SkinBO(chromasId, chromasName));
}
}
return arrayList.stream().distinct().collect(Collectors.toList());
}

/**
* 查询当前选定的英雄所有可用的炫彩皮肤
*/
public List<SkinBO> getCurrentChampionSkins() throws IOException {
String resp = requestLcuUtil.doGet("/lol-champ-select/v1/skin-carousel-skins");
JSONArray jsonArray = JSON.parseArray(resp);
if(jsonArray == null || jsonArray.isEmpty()) {
return new ArrayList<>();
}
Integer championId = jsonArray.getJSONObject(0).getInteger("championId");
//查询此英雄的皮肤名字
List<SkinBO> skinBOList = getChromasSkinByChampionId(championId);
Map<Integer, SkinBO> map = skinBOList.stream().collect(Collectors.toMap(SkinBO::getId, i->i));

List<SkinBO> childSkinList = new ArrayList<>();
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
JSONArray childSkins = jsonObject.getJSONArray("childSkins");
for (int j = 0; j < childSkins.size(); j++) {
JSONObject childSkinsJsonObject = childSkins.getJSONObject(j);
if (childSkinsJsonObject.getBooleanValue("unlocked")) {
int skinId = childSkinsJsonObject.getIntValue("id");
childSkinList.add(map.get(skinId));
}
}
}
return childSkinList;
}

public String setCurrentChampionSkins(int skinId) throws IOException {
JSONObject body = new JSONObject(3);
body.put("selectedSkinId", skinId);
return requestLcuUtil.doPatch("/lol-champ-select/v1/session/my-selection", body.toString());
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ public ReadyCheckStrategy(LinkLeagueClientApi api) {

@Override
public void doThis() {
//接受对局时为游戏开始时机,此时清除对局缓存
GameDataCache.reset();
if (FrameCache.autoAccept) {
// 自动接受对局
try {
Expand Down

0 comments on commit c551a87

Please sign in to comment.