Skip to content

Commit

Permalink
Fix stone (#3)
Browse files Browse the repository at this point in the history
* (fix) 更正了宝石属性的计算
  • Loading branch information
Mcayear authored Jan 18, 2024
1 parent b4ce91e commit 0c84e81
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 59 deletions.
4 changes: 2 additions & 2 deletions src/main/java/RcRPG/AttrManager/PlayerAttr.java
Original file line number Diff line number Diff line change
Expand Up @@ -138,11 +138,11 @@ public void checkItemStoneAttr(String mainItemName, LinkedList<Stone> list, Arra
if(!map.containsKey(stone.getLabel())){
attr.clear();
OverAttr(attr,stone.getMainAttr());
setItemAttrConfig(stone.getLabel(), attr);
setItemAttrConfig(mainItemName + " -> " + stone.getLabel(), attr);
map.put(stone.getLabel(),attr);
}else{
OverAttr(map.get(stone.getLabel()),stone.getMainAttr());
setItemAttrConfig(stone.getLabel(), map.get(stone.getLabel()));
setItemAttrConfig(mainItemName + " -> " + stone.getLabel(), map.get(stone.getLabel()));
}
beforLabel.remove(mainItemName + " -> " + stone.getLabel());
labelList.add(mainItemName + " -> " + stone.getLabel());
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/RcRPG/Events.java
Original file line number Diff line number Diff line change
Expand Up @@ -361,10 +361,10 @@ public void damageEvent(EntityDamageByEntityEvent event){
}

// 闪避率处理
if (getProbabilisticResults(WAttr.dodgeChance - DAttr.hitChance)) {
float dodge = WAttr.dodgeChance > 0 ? WAttr.dodgeChance : 0;
if (getProbabilisticResults(dodge - DAttr.hitChance)) {
if (woundedIsPlayer) {
wounded.getLevel().addSound(wounded, Sound.valueOf("GAME_PLAYER_ATTACK_NODAMAGE"));
((Player) wounded).sendMessage("你闪避了 " + damagerName + " §r的攻击");
((Player) wounded).sendMessage(Main.getI18n().tr(((Player) wounded).getLanguageCode(), "rcrpg.events.dodge_message_you_evaded", damagerName));
}
if (damagerIsPlayer) {
Expand Down
98 changes: 53 additions & 45 deletions src/main/java/RcRPG/Form/inlayForm.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,20 @@
import cn.nukkit.form.window.FormWindowSimple;
import cn.nukkit.item.Item;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.stream.Collectors;

public class inlayForm {
private static final String NO_STONE = "无";
private static final String SUCCESS_MESSAGE = "宝石操作成功!";
private LinkedHashMap<Player, Stone> playerStone = new LinkedHashMap<>();
private LinkedHashMap<Player, Integer> playerClick = new LinkedHashMap<>();
private Stone beforeStone;
private int beforeClick;
private Item handItem = null;
private Weapon weaponItem = null;
private Armour armourItem = null;
private LinkedList<Stone> originStones = new LinkedList<>();

public void makeInlayForm(Player player, Item item) {
handItem = item;
Expand All @@ -52,20 +53,33 @@ public void makeInlayForm(Player player, Item item) {
private FormWindowSimple getStateWindow() {
String label = "";
LinkedList<Stone> stones = new LinkedList<>();
ArrayList<String> stoneSlots = new ArrayList<>();
if (weaponItem != null) {
stones = Weapon.getStones(handItem);
label = weaponItem.getLabel();
stoneSlots = weaponItem.getStoneList();
} else if (armourItem != null) {
stones = Armour.getStones(handItem);
label = armourItem.getLabel();
stoneSlots = armourItem.getStoneList();
}

int stoneCount = stones.size();
String slotShow = "";
if (!stoneSlots.isEmpty()) {
// 构建特定格式的字符串
StringBuilder stringBuilder = new StringBuilder();
for (String stone : stoneSlots) {
stringBuilder.append("- ").append(stone).append(" -\n");
}
slotShow = stringBuilder.toString();
}
this.originStones = stones;
return new FormWindowSimple(
label + "宝石列表",
stoneCount > 0 ? "装备拥有 " + stoneCount + " 个宝石槽" : "本装备没有宝石槽",
stoneCount > 0 ? "装备拥有 " + stoneCount + " 个宝石槽\n"+slotShow : "本装备没有宝石槽",
stones.stream()
.map(stone -> new ElementButton(stone == null ? NO_STONE : stone.getLabel()))
.map(stone -> new ElementButton(stone == null ? NO_STONE : stone.getShowName()))
.collect(Collectors.toList()));
}

Expand All @@ -74,8 +88,16 @@ private void handleStateWindowResponse(FormWindowSimple form, Player player) {
return;
}
FormResponseSimple response = form.getResponse();
String clickedStoneLabel = response.getClickedButton().getText();
Stone clickedStone = NO_STONE.equals(clickedStoneLabel) ? null : Handle.getStoneByLabel(clickedStoneLabel);
int clicked = response.getClickedButtonId();
String yamlName;
if (this.originStones.get(clicked) == null) {
yamlName = NO_STONE;
} else {
yamlName = this.originStones.get(clicked).getName();
}

beforeClick = response.getClickedButtonId();
beforeStone = NO_STONE.equals(yamlName) ? null : Handle.getStoneViaName(yamlName);

String type = null;
if (weaponItem != null) {
Expand All @@ -84,29 +106,24 @@ private void handleStateWindowResponse(FormWindowSimple form, Player player) {
type = armourItem.getStoneList().get(response.getClickedButtonId());
}

LinkedList<String> playerStones = Stone.getStones(player, clickedStoneLabel, type);
playerStones.addFirst(clickedStoneLabel);
LinkedList<String> playerStones = Stone.getStonesViaType(player, type);
if (!playerStones.contains(NO_STONE)) playerStones.addLast(NO_STONE);

FormWindowCustom form_ = getStoneWindow(clickedStoneLabel, playerStones);
FormWindowCustom form_ = getStoneWindow(yamlName, playerStones);
form_.addHandler(FormResponseHandler.withoutPlayer(ignored -> {
if (form_.wasClosed()) return;
handleStoneWindowResponse(form_, player, clickedStone);
handleStoneWindowResponse(form_, player);
}));
player.showFormWindow(form_);

playerClick.put(player, response.getClickedButtonId());
playerStone.put(player, clickedStone);
}

private FormWindowCustom getStoneWindow(String stoneLabel, LinkedList<String> stones) {
private FormWindowCustom getStoneWindow(String yamlName, LinkedList<String> stones) {
ElementDropdown dropdown = new ElementDropdown("", stones);
dropdown.setDefaultOptionIndex(0);
return new FormWindowCustom(stoneLabel, Collections.singletonList(dropdown));
return new FormWindowCustom(yamlName, Collections.singletonList(dropdown));
}

private void handleStoneWindowResponse(FormWindowCustom form, Player player, Stone clickedStone) {

private void handleStoneWindowResponse(FormWindowCustom form, Player player) {
String itemName = "";
LinkedList<Stone> stones = new LinkedList<>();
if (weaponItem != null) {
Expand All @@ -119,41 +136,17 @@ private void handleStoneWindowResponse(FormWindowCustom form, Player player, Sto

FormResponseCustom response = form.getResponse();
FormResponseData responseData = response.getDropdownResponse(0);
// 选择的是 yamlName 还是 NO_STONE
String responseContent = responseData.getElementContent();

Main.getInstance().getLogger().info("宝石槽数:" + stones.size());

Item item = player.getInventory().getItemInHand();
if (item.getNamedTag() == null) return;
if (!itemName.equals(item.getNamedTag().getString("name"))) return;
player.sendMessage(SUCCESS_MESSAGE);

if (responseData.getElementID() != 0) {
int clickedButtonId = playerClick.get(player);
Stone newStone = NO_STONE.equals(responseContent) ? null : Handle.getStoneByLabel(responseContent);
updateStones(stones, clickedButtonId, newStone);

if (newStone != null) {
Handle.removeStoneByLabel(player, newStone.getLabel());
}
Stone previousStone = playerStone.get(player);// 过去的宝石
if (previousStone != null) {
Stone.giveStone(player, previousStone.getName(), 1);
}

if (weaponItem != null) {
Weapon.setStone(player, handItem, stones);
} else if (armourItem != null) {
Armour.setStone(player, handItem, stones);
}
}

playerStone.remove(player);
playerClick.remove(player);
//makeInlayForm(player, player.getInventory().getItemInHand());
}
int clickedButtonId = beforeClick;
Stone newStone = NO_STONE.equals(responseContent) ? null : Handle.getStoneViaName(responseContent);

private void updateStones(LinkedList<Stone> stones, int clickedButtonId, Stone newStone) {
for (int i = 0; i < stones.size(); i++) {
if (i == clickedButtonId) {
if (newStone != null) {
Expand All @@ -164,5 +157,20 @@ private void updateStones(LinkedList<Stone> stones, int clickedButtonId, Stone n
break;
}
}

if (newStone != null) {
Handle.removeStoneViaName(player, responseContent);
}
if (beforeStone != null) {// 过去的宝石
Stone.giveStone(player, beforeStone.getName(), 1);
}

if (weaponItem != null) {
Weapon.setStone(player, handItem, stones);
} else if (armourItem != null) {
Armour.setStone(player, handItem, stones);
}
//makeInlayForm(player, player.getInventory().getItemInHand());
}

}
10 changes: 5 additions & 5 deletions src/main/java/RcRPG/Handle.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,18 +59,18 @@ public static Effect StringToEffect(String s){
return Effect.getEffect(Integer.parseInt(ss[0])).setAmplifier(Integer.parseInt(ss[1])-1).setDuration(Integer.parseInt(ss[2])*20);
}

public static Stone getStoneByLabel(String label){
for(Stone stone : Main.loadStone.values()){
if(stone.getLabel().equals(label)) return stone;
public static Stone getStoneViaName(String yamlName){
if (Main.loadStone.containsKey(yamlName)) {
return Main.loadStone.get(yamlName);
}
return null;
}

public static void removeStoneByLabel(Player player,String label){
public static void removeStoneViaName(Player player,String yamlName){
for(int i =0;i < player.getInventory().getSize();i++){
Item item = player.getInventory().getItem(i);
if(Stone.isStone(item)){
if(Main.loadStone.get(item.getNamedTag().getString("name")).getLabel().equals(label)){
if(item.getNamedTag().getString("name").equals(yamlName)){
if(item.getCount() == 1){
player.getInventory().remove(item);
}else{
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/RcRPG/RPG/Armour.java
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ public static LinkedList<Stone> getStones(Item item){
if (!isArmour(item) || item.getNamedTag() == null) return list;
ListTag<StringTag> tags = item.getNamedTag().getList("stone",StringTag.class);
for(StringTag tag : tags.getAll()){
list.add(Handle.getStoneByLabel(tag.parseValue()));
list.add(Handle.getStoneViaName(tag.parseValue()));
}
Armour armour = Main.loadArmour.get(item.getNamedTag().getString("name"));
while(list.size() < armour.getStone()){
Expand Down
14 changes: 11 additions & 3 deletions src/main/java/RcRPG/RPG/Stone.java
Original file line number Diff line number Diff line change
Expand Up @@ -183,14 +183,22 @@ public static boolean isStone(Item item){
return false;
}

public static LinkedList<String> getStones(Player player,String df,String type){
/**
* 通过 label 获取玩家背包中所有该类型的宝石
* @param player 玩家对象
* @param type 宝石类型
* @return 宝石的yamlName列表
*/
public static LinkedList<String> getStonesViaType(Player player, String type){
LinkedList<String> list = new LinkedList<>();
Item item;
for(int i = 0;i < player.getInventory().getSize();i++){
item = player.getInventory().getItem(i);
if(Stone.isStone(item)){
if(!list.contains(Main.loadStone.get(item.getNamedTag().getString("name")).getLabel()) && !Main.loadStone.get(item.getNamedTag().getString("name")).getLabel().equals(df) && Main.loadStone.get(item.getNamedTag().getString("name")).getType().equals(type)){
list.add(Main.loadStone.get(item.getNamedTag().getString("name")).getLabel());
if(!list.contains(item.getNamedTag().getString("name")) &&
Main.loadStone.get(item.getNamedTag().getString("name")).getType().equals(type)
){
list.add(item.getNamedTag().getString("name"));
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/RcRPG/RPG/Weapon.java
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ public static LinkedList<Stone> getStones(Item item){
if (!isWeapon(item) || item.getNamedTag() == null) return list;
ListTag<StringTag> tags = item.getNamedTag().getList("stone",StringTag.class);
for(StringTag tag : tags.getAll()){
list.add(Handle.getStoneByLabel(tag.parseValue()));
list.add(Handle.getStoneViaName(tag.parseValue()));
}
Weapon weapon = Main.loadWeapon.get(item.getNamedTag().getString("name"));
while(list.size() < weapon.getStone()){
Expand Down

0 comments on commit 0c84e81

Please sign in to comment.