1.0
This commit is contained in:
commit
58b473aa1a
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
/.idea/
|
||||
/lib/
|
||||
/target/
|
||||
/RefineSystem.iml
|
71
pom.xml
Normal file
71
pom.xml
Normal file
|
@ -0,0 +1,71 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.io.yutian</groupId>
|
||||
<artifactId>RefineSystem</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>RefineSystem</name>
|
||||
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.8.1</version>
|
||||
<configuration>
|
||||
<source>${java.version}</source>
|
||||
<target>${java.version}</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.2.4</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
</resource>
|
||||
</resources>
|
||||
</build>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>papermc-repo</id>
|
||||
<url>https://repo.papermc.io/repository/maven-public/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>sonatype</id>
|
||||
<url>https://oss.sonatype.org/content/groups/public/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.destroystokyo.paper</groupId>
|
||||
<artifactId>paper-api</artifactId>
|
||||
<version>1.12.2-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
83
src/main/java/com/io/yutian/refinesystem/RefineSystem.java
Normal file
83
src/main/java/com/io/yutian/refinesystem/RefineSystem.java
Normal file
|
@ -0,0 +1,83 @@
|
|||
package com.io.yutian.refinesystem;
|
||||
|
||||
import com.io.yutian.refinesystem.gui.GuiHolder;
|
||||
import com.io.yutian.refinesystem.gui.RefineGui;
|
||||
import com.io.yutian.refinesystem.listener.GuiListener;
|
||||
import de.tr7zw.itemnbtapi.NBTItem;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public final class RefineSystem extends JavaPlugin {
|
||||
|
||||
private static RefineSystem instance;
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
instance = this;
|
||||
Bukkit.getPluginManager().registerEvents(new GuiListener(), this);
|
||||
|
||||
RefineSystemSetting.reload();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
if (player.getOpenInventory() != null) {
|
||||
InventoryHolder inventoryHolder = player.getOpenInventory().getTopInventory().getHolder();
|
||||
if (inventoryHolder instanceof GuiHolder) {
|
||||
player.closeInventory();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (args.length == 1 && args[0].equalsIgnoreCase("reload") && sender.isOp()) {
|
||||
RefineSystemSetting.reload();
|
||||
sender.sendMessage("§8§l[§a§l!§8§l] §7重载成功");
|
||||
return true;
|
||||
}
|
||||
if (args.length == 1 && args[0].equalsIgnoreCase("item") && sender.isOp()) {
|
||||
Player player = (Player) sender;
|
||||
ItemStack itemStack = new ItemStack(Material.IRON_PICKAXE);
|
||||
List<String> lores = new ArrayList<>();
|
||||
lores.add("§f品质: §b稀有");
|
||||
lores.add("§7- < §1§5§r§7尚未进行洗炼§1§5§r§7 >");
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
itemMeta.setLore(lores);
|
||||
itemStack.setItemMeta(itemMeta);
|
||||
player.getInventory().addItem(itemStack);
|
||||
ItemStack itemStack1 = new ItemStack(Material.PAPER);
|
||||
ItemMeta itemMeta1 = itemStack1.getItemMeta();
|
||||
itemMeta1.setDisplayName("§f雨天洗炼符");
|
||||
itemStack1.setItemMeta(itemMeta1);
|
||||
NBTItem item = new NBTItem(itemStack1);
|
||||
item.setString("refineType", "雨天洗炼符");
|
||||
player.getInventory().addItem(item.getItem());
|
||||
sender.sendMessage("§8§l[§a§l!§8§l] §7获取物品成功");
|
||||
return true;
|
||||
}
|
||||
if (!(sender instanceof Player)) {
|
||||
return true;
|
||||
}
|
||||
Player player = (Player) sender;
|
||||
new RefineGui(player).open();
|
||||
return true;
|
||||
}
|
||||
|
||||
public static RefineSystem inst() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
package com.io.yutian.refinesystem;
|
||||
|
||||
import com.io.yutian.refinesystem.data.RefineData;
|
||||
import com.io.yutian.refinesystem.data.SkillData;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class RefineSystemSetting {
|
||||
|
||||
private static String detectionLore;
|
||||
private static Map<String, RefineData> refineDatas = new HashMap<>();
|
||||
private static Map<String, Integer> tierLevels = new HashMap<>();
|
||||
|
||||
public static void reload() {
|
||||
refineDatas.clear();
|
||||
RefineSystem.inst().saveDefaultConfig();
|
||||
RefineSystem.inst().reloadConfig();
|
||||
FileConfiguration config = RefineSystem.inst().getConfig();
|
||||
detectionLore = config.getString("detectionLore");
|
||||
ConfigurationSection section = config.getConfigurationSection("options");
|
||||
for (String key : section.getKeys(false)) {
|
||||
double chance = section.getDouble(key+".chance");
|
||||
int needQuality = section.getInt(key+".needQuality");
|
||||
int minGlossaryAmount = section.getInt(key+".glossaryAmount.min");
|
||||
int maxGlossaryAmount = section.getInt(key+".glossaryAmount.max");
|
||||
ConfigurationSection skillSection = section.getConfigurationSection(key+".skills");
|
||||
Map<String, SkillData> skillDatas = new HashMap<>();
|
||||
for (String skillKey : skillSection.getKeys(false)) {
|
||||
double skillChance = skillSection.getDouble(skillKey+".chance");
|
||||
int minSkillLevel = skillSection.getInt(skillKey+".level.min");
|
||||
int maxSkillLevel = skillSection.getInt(skillKey+".level.max");
|
||||
double minTrigger = skillSection.getDouble(skillKey+".trigger.min");
|
||||
double maxTrigger = skillSection.getDouble(skillKey+".trigger.max");
|
||||
skillDatas.put(skillKey, new SkillData(skillKey, skillChance, minSkillLevel, maxSkillLevel, minTrigger, maxTrigger));
|
||||
}
|
||||
refineDatas.put(key, new RefineData(key, chance, needQuality, minGlossaryAmount, maxGlossaryAmount, skillDatas));
|
||||
}
|
||||
ConfigurationSection tierSection = config.getConfigurationSection("tierLevels");
|
||||
for (String tierKey : tierSection.getKeys(false)) {
|
||||
int tierLevel = tierSection.getInt(tierKey);
|
||||
tierLevels.put(tierKey, tierLevel);
|
||||
}
|
||||
}
|
||||
|
||||
public static String getDetectionLore() {
|
||||
return detectionLore;
|
||||
}
|
||||
|
||||
public static boolean hasRefineData(String id) {
|
||||
return refineDatas.containsKey(id);
|
||||
}
|
||||
|
||||
public static RefineData getRefineData(String id) {
|
||||
return refineDatas.get(id);
|
||||
}
|
||||
|
||||
public static Map<String, RefineData> getRefineDatas() {
|
||||
return refineDatas;
|
||||
}
|
||||
|
||||
public static Map<String, Integer> getTierLevels() {
|
||||
return tierLevels;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
package com.io.yutian.refinesystem.data;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class RefineData {
|
||||
|
||||
private String id;
|
||||
private double chance;
|
||||
private int needQuality;
|
||||
private int minGlossaryAmount;
|
||||
private int maxGlossaryAmount;
|
||||
|
||||
private Map<String, SkillData> skillDatas;
|
||||
|
||||
protected final Map<String, Double> skillChances = new HashMap<>();
|
||||
|
||||
public RefineData(String id, double chance, int needQuality, int minGlossaryAmount, int maxGlossaryAmount, Map<String, SkillData> skillDatas) {
|
||||
this.id = id;
|
||||
this.chance = chance;
|
||||
this.needQuality = needQuality;
|
||||
this.minGlossaryAmount = minGlossaryAmount;
|
||||
this.maxGlossaryAmount = maxGlossaryAmount;
|
||||
this.skillDatas = skillDatas;
|
||||
for (SkillData sd : skillDatas.values()) {
|
||||
skillChances.put(sd.getId(), sd.getChance());
|
||||
}
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public double getChance() {
|
||||
return chance;
|
||||
}
|
||||
|
||||
public int getNeedQuality() {
|
||||
return needQuality;
|
||||
}
|
||||
|
||||
public int getMinGlossaryAmount() {
|
||||
return minGlossaryAmount;
|
||||
}
|
||||
|
||||
public int getMaxGlossaryAmount() {
|
||||
return maxGlossaryAmount;
|
||||
}
|
||||
|
||||
public Map<String, SkillData> getSkillDatas() {
|
||||
return skillDatas;
|
||||
}
|
||||
|
||||
public Map<String, Double> getSkillChances() {
|
||||
return skillChances;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "RefineData{" +
|
||||
"id='" + id + '\'' +
|
||||
", chance=" + chance +
|
||||
", needQuality=" + needQuality +
|
||||
", minGlossaryAmount=" + minGlossaryAmount +
|
||||
", maxGlossaryAmount=" + maxGlossaryAmount +
|
||||
", skillDatas=" + skillDatas +
|
||||
'}';
|
||||
}
|
||||
}
|
65
src/main/java/com/io/yutian/refinesystem/data/SkillData.java
Normal file
65
src/main/java/com/io/yutian/refinesystem/data/SkillData.java
Normal file
|
@ -0,0 +1,65 @@
|
|||
package com.io.yutian.refinesystem.data;
|
||||
|
||||
import com.io.yutian.refinesystem.util.RandomUtil;
|
||||
import com.io.yutian.refinesystem.util.StringUtil;
|
||||
|
||||
public class SkillData {
|
||||
|
||||
private String id;
|
||||
private double chance;
|
||||
private int minLevel;
|
||||
private int maxLevel;
|
||||
private double minTrigger;
|
||||
private double maxTrigger;
|
||||
|
||||
public SkillData(String id, double chance, int minLevel, int maxLevel, double minTrigger, double maxTrigger) {
|
||||
this.id = id;
|
||||
this.chance = chance;
|
||||
this.minLevel = minLevel;
|
||||
this.maxLevel = maxLevel;
|
||||
this.minTrigger = minTrigger;
|
||||
this.maxTrigger = maxTrigger;
|
||||
}
|
||||
|
||||
public String randomSkillLore() {
|
||||
int level = RandomUtil.getRandomInt(minLevel, maxLevel);
|
||||
double trigger = RandomUtil.getRandomDouble(minTrigger, maxTrigger, 1);
|
||||
return "§f§0§4§r"+id+" "+ StringUtil.intToRoman(level) +"§0§4§r§f §8| §f§0§5§r§f"+trigger+"§0§5§r§f% §7(被动技)";
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public double getChance() {
|
||||
return chance;
|
||||
}
|
||||
|
||||
public int getMinLevel() {
|
||||
return minLevel;
|
||||
}
|
||||
|
||||
public int getMaxLevel() {
|
||||
return maxLevel;
|
||||
}
|
||||
|
||||
public double getMinTrigger() {
|
||||
return minTrigger;
|
||||
}
|
||||
|
||||
public double getMaxTrigger() {
|
||||
return maxTrigger;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "SkillData{" +
|
||||
"id='" + id + '\'' +
|
||||
", chance=" + chance +
|
||||
", minLevel=" + minLevel +
|
||||
", maxLevel=" + maxLevel +
|
||||
", minTrigger=" + minTrigger +
|
||||
", maxTrigger=" + maxTrigger +
|
||||
'}';
|
||||
}
|
||||
}
|
14
src/main/java/com/io/yutian/refinesystem/gui/GuiHolder.java
Normal file
14
src/main/java/com/io/yutian/refinesystem/gui/GuiHolder.java
Normal file
|
@ -0,0 +1,14 @@
|
|||
package com.io.yutian.refinesystem.gui;
|
||||
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
|
||||
public interface GuiHolder {
|
||||
|
||||
void onClick(InventoryClickEvent event);
|
||||
|
||||
void onClose(InventoryCloseEvent event);
|
||||
|
||||
void open();
|
||||
|
||||
}
|
265
src/main/java/com/io/yutian/refinesystem/gui/RefineGui.java
Normal file
265
src/main/java/com/io/yutian/refinesystem/gui/RefineGui.java
Normal file
|
@ -0,0 +1,265 @@
|
|||
package com.io.yutian.refinesystem.gui;
|
||||
|
||||
import com.io.yutian.refinesystem.RefineSystemSetting;
|
||||
import com.io.yutian.refinesystem.data.RefineData;
|
||||
import com.io.yutian.refinesystem.data.SkillData;
|
||||
import com.io.yutian.refinesystem.util.ItemStackUtil;
|
||||
import com.io.yutian.refinesystem.util.PlayerInventoryUtil;
|
||||
import com.io.yutian.refinesystem.util.RandomBuilder;
|
||||
import com.io.yutian.refinesystem.util.RandomUtil;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class RefineGui implements InventoryHolder, GuiHolder {
|
||||
|
||||
private static final int[] ARRAY_1 = new int[] {0,2,3,5,6,8,12,14,18,20,21,23,24,26};
|
||||
private static final int[] ARRAY_2 = new int[] {1,7,9,11,15,17,19,25};
|
||||
private static final int[] ARRAY_3 = new int[] {4,22};
|
||||
|
||||
private static final ItemStack ITEM_1;
|
||||
private static final ItemStack ITEM_2;
|
||||
private static final ItemStack ITEM_3;
|
||||
private static final ItemStack ITEM_4;
|
||||
private static final ItemStack ITEM_5;
|
||||
private static final ItemStack ITEM_6;
|
||||
private static final ItemStack ITEM_7;
|
||||
private static final ItemStack ITEM_10;
|
||||
|
||||
private Inventory inventory;
|
||||
private Player player;
|
||||
|
||||
private ItemStack inputItem;
|
||||
private ItemStack refineItem;
|
||||
|
||||
public RefineGui(Player player) {
|
||||
this.player = player;
|
||||
this.inventory = Bukkit.createInventory(this, 27, "洗练系统");
|
||||
for (int i : ARRAY_1) {
|
||||
this.inventory.setItem(i, ITEM_1);
|
||||
}
|
||||
for (int i : ARRAY_2) {
|
||||
this.inventory.setItem(i, ITEM_2);
|
||||
}
|
||||
for (int i : ARRAY_3) {
|
||||
this.inventory.setItem(i, ITEM_3);
|
||||
}
|
||||
this.inventory.setItem(10, ITEM_4);
|
||||
this.inventory.setItem(13, ITEM_10);
|
||||
this.inventory.setItem(16, ITEM_6);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(InventoryClickEvent event) {
|
||||
Inventory clickedInventory = event.getClickedInventory();
|
||||
int slot = event.getRawSlot();
|
||||
event.setCancelled(true);
|
||||
if (slot < 27) {
|
||||
if (slot == 10) {
|
||||
removeInputItem(10);
|
||||
} else if (slot == 16) {
|
||||
removeRefineItem(16);
|
||||
} else if (slot == 13) {
|
||||
refine();
|
||||
}
|
||||
} else {
|
||||
ItemStack clickedItem = event.getCurrentItem();
|
||||
if (clickedItem == null || clickedItem.getType() == Material.AIR) {
|
||||
return;
|
||||
}
|
||||
if (ItemStackUtil.isRefineItem(clickedItem)) {
|
||||
setRefineItem(clickedItem, clickedInventory, event.getSlot());
|
||||
return;
|
||||
}
|
||||
if (ItemStackUtil.canRefine(clickedItem)) {
|
||||
setInputItem(clickedItem, clickedInventory, event.getSlot());
|
||||
return;
|
||||
}
|
||||
if (this.inputItem == null || this.refineItem == null) {
|
||||
player.sendMessage("§8§l[§e§l!§8§l] §7该物品不是可洗练的物品或洗练符");
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1.6F);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setInputItem(ItemStack inputItem, Inventory inventory, int slot) {
|
||||
if (this.inputItem != null) {
|
||||
return;
|
||||
}
|
||||
this.inputItem = inputItem;
|
||||
update();
|
||||
inventory.setItem(slot, null);
|
||||
player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 1);
|
||||
}
|
||||
|
||||
public void setRefineItem(ItemStack refineItem, Inventory inventory, int slot) {
|
||||
if (this.refineItem != null) {
|
||||
return;
|
||||
}
|
||||
int amount = refineItem.getAmount();
|
||||
ItemStack itemStack1 = refineItem.clone();
|
||||
ItemStack itemStack2 = refineItem.clone();
|
||||
if (amount > 1) {
|
||||
itemStack1.setAmount(1);
|
||||
itemStack2.setAmount(amount - 1);
|
||||
} else {
|
||||
itemStack2 = null;
|
||||
}
|
||||
this.refineItem = itemStack1;
|
||||
update();
|
||||
inventory.setItem(slot, itemStack2);
|
||||
player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 1);
|
||||
}
|
||||
|
||||
public void removeInputItem(int index) {
|
||||
if (this.inputItem == null) {
|
||||
return;
|
||||
}
|
||||
if (!PlayerInventoryUtil.hasFreeSlot(player)) {
|
||||
player.sendMessage("§8§l[§c§l!§8§l] §7您的背包空间不足,无法拿下物品");
|
||||
return;
|
||||
}
|
||||
PlayerInventoryUtil.giveItemStack(player, this.inputItem);
|
||||
this.inputItem = null;
|
||||
update();
|
||||
player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 1);
|
||||
}
|
||||
|
||||
public void removeRefineItem(int index) {
|
||||
if (this.refineItem == null) {
|
||||
return;
|
||||
}
|
||||
if (!PlayerInventoryUtil.hasFreeSlot(player)) {
|
||||
player.sendMessage("§8§l[§c§l!§8§l] §7您的背包空间不足,无法拿下物品");
|
||||
return;
|
||||
}
|
||||
PlayerInventoryUtil.giveItemStack(player, this.refineItem);
|
||||
this.refineItem = null;
|
||||
update();
|
||||
player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 1);
|
||||
}
|
||||
|
||||
public void refine() {
|
||||
if (this.inputItem == null || this.refineItem == null) {
|
||||
return;
|
||||
}
|
||||
int tierLevel = ItemStackUtil.getTierLevel(this.inputItem);
|
||||
String refineType = ItemStackUtil.getRefineType(this.refineItem);
|
||||
if (!RefineSystemSetting.hasRefineData(refineType)) {
|
||||
return;
|
||||
}
|
||||
RefineData refineData = RefineSystemSetting.getRefineData(refineType);
|
||||
if (tierLevel < refineData.getNeedQuality()) {
|
||||
player.sendMessage("§8§l[§c§l!§8§l] §7该物品的品质未达到洗练要求,无法洗练");
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1.6F);
|
||||
return;
|
||||
}
|
||||
boolean success = RandomUtil.random(refineData.getChance());
|
||||
ItemStack itemStack = this.inputItem;
|
||||
if (success) {
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1, 1);
|
||||
player.sendMessage("§8§l[§a§l!§8§l] §7恭喜您,洗炼成功!");
|
||||
itemStack = applyRefine(this.inputItem, refineData);
|
||||
} else {
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_BLAZE_DEATH, 1, 1);
|
||||
player.sendMessage("§8§l[§e§l!§8§l] §7很遗憾,洗炼失败");
|
||||
}
|
||||
this.inputItem = null;
|
||||
this.refineItem = null;
|
||||
new RefineResultGui(player, itemStack).open();
|
||||
}
|
||||
|
||||
public ItemStack applyRefine(ItemStack inputItem, RefineData refineData) {
|
||||
ItemStack itemStack = inputItem.clone();
|
||||
int glossaryAmount = RandomUtil.getRandomInt(refineData.getMinGlossaryAmount(), refineData.getMaxGlossaryAmount());
|
||||
List<String> lores = new ArrayList<>();
|
||||
Map<String, Double> cacheMap = new HashMap<>(refineData.getSkillChances());
|
||||
for (int i = 0; i < glossaryAmount; i++) {
|
||||
RandomBuilder<String> randomBuilder = new RandomBuilder<>(cacheMap);
|
||||
String skill = randomBuilder.random();
|
||||
if (skill == null) {
|
||||
continue;
|
||||
}
|
||||
cacheMap.remove(skill);
|
||||
SkillData skillData = refineData.getSkillDatas().get(skill);
|
||||
lores.add(skillData.randomSkillLore());
|
||||
}
|
||||
itemStack = ItemStackUtil.replaceLore(itemStack, RefineSystemSetting.getDetectionLore(), lores);
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
private void update() {
|
||||
this.inventory.setItem(10, this.inputItem != null ? this.inputItem : ITEM_4);
|
||||
this.inventory.setItem(16, this.refineItem != null ? this.refineItem : ITEM_6);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClose(InventoryCloseEvent event) {
|
||||
if (this.inputItem != null) {
|
||||
PlayerInventoryUtil.giveItemStack(player, this.inputItem);
|
||||
}
|
||||
if (this.refineItem != null) {
|
||||
PlayerInventoryUtil.giveItemStack(player, this.refineItem);
|
||||
}
|
||||
this.inputItem = null;
|
||||
this.refineItem = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void open() {
|
||||
player.openInventory(inventory);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Inventory getInventory() {
|
||||
return inventory;
|
||||
}
|
||||
|
||||
static {
|
||||
ITEM_1 = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 15);
|
||||
ITEM_2 = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 0);
|
||||
ITEM_3 = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 5);
|
||||
ITEM_4 = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 14);
|
||||
ITEM_5 = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 1);
|
||||
ITEM_6 = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 2);
|
||||
ITEM_7 = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 14);
|
||||
ITEM_10 = new ItemStack(Material.ANVIL, 1);
|
||||
ItemMeta itemMeta1 = ITEM_1.getItemMeta();
|
||||
itemMeta1.setDisplayName(" ");
|
||||
ITEM_1.setItemMeta(itemMeta1);
|
||||
ItemMeta itemMeta2 = ITEM_2.getItemMeta();
|
||||
itemMeta2.setDisplayName("");
|
||||
ITEM_2.setItemMeta(itemMeta2);
|
||||
ItemMeta itemMeta3 = ITEM_3.getItemMeta();
|
||||
itemMeta3.setDisplayName(" ");
|
||||
ITEM_3.setItemMeta(itemMeta3);
|
||||
ItemMeta itemMeta4 = ITEM_4.getItemMeta();
|
||||
itemMeta4.setDisplayName("§a物品孔");
|
||||
ITEM_4.setItemMeta(itemMeta4);
|
||||
ItemMeta itemMeta5 = ITEM_5.getItemMeta();
|
||||
itemMeta5.setDisplayName(" ");
|
||||
ITEM_5.setItemMeta(itemMeta5);
|
||||
ItemMeta itemMeta6 = ITEM_6.getItemMeta();
|
||||
itemMeta6.setDisplayName("§a洗练符孔");
|
||||
ITEM_6.setItemMeta(itemMeta6);
|
||||
ItemMeta itemMeta7 = ITEM_7.getItemMeta();
|
||||
itemMeta7.setDisplayName(" ");
|
||||
ITEM_7.setItemMeta(itemMeta7);
|
||||
ItemMeta itemMeta10 = ITEM_10.getItemMeta();
|
||||
itemMeta10.setDisplayName("§f点击洗练");
|
||||
ITEM_10.setItemMeta(itemMeta10);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
package com.io.yutian.refinesystem.gui;
|
||||
|
||||
import com.io.yutian.refinesystem.util.PlayerInventoryUtil;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
public class RefineResultGui implements InventoryHolder, GuiHolder {
|
||||
|
||||
private static final int[] ARRAY_1 = new int[] {0,8,9,17,18,26};
|
||||
private static final int[] ARRAY_2 = new int[] {1,2,3,5,6,7,10,11,15,16,19,20,21,23,24,25};
|
||||
private static final int[] ARRAY_3 = new int[] {4,12,14,22};
|
||||
|
||||
private static final ItemStack ITEM_1;
|
||||
private static final ItemStack ITEM_2;
|
||||
private static final ItemStack ITEM_3;
|
||||
|
||||
private static final int SLOT = 13;
|
||||
|
||||
private Inventory inventory;
|
||||
private Player player;
|
||||
|
||||
private ItemStack result;
|
||||
|
||||
public RefineResultGui(Player player, ItemStack result) {
|
||||
this.player = player;
|
||||
this.result = result;
|
||||
this.inventory = Bukkit.createInventory(this, 27, "洗练界面");
|
||||
for (int i : ARRAY_1) {
|
||||
inventory.setItem(i, ITEM_1);
|
||||
}
|
||||
for (int i : ARRAY_2) {
|
||||
inventory.setItem(i, ITEM_2);
|
||||
}
|
||||
for (int i : ARRAY_3) {
|
||||
inventory.setItem(i, ITEM_3);
|
||||
}
|
||||
this.inventory.setItem(SLOT, result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(InventoryClickEvent event) {
|
||||
event.setCancelled(true);
|
||||
Inventory clickedInventory = event.getClickedInventory();
|
||||
int slot = event.getRawSlot();
|
||||
if (slot == SLOT) {
|
||||
PlayerInventoryUtil.giveItemStack(player, result);
|
||||
player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 1);
|
||||
result = null;
|
||||
player.closeInventory();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClose(InventoryCloseEvent event) {
|
||||
if (result != null) {
|
||||
PlayerInventoryUtil.giveItemStack(player, result);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void open() {
|
||||
player.openInventory(inventory);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Inventory getInventory() {
|
||||
return inventory;
|
||||
}
|
||||
|
||||
static {
|
||||
ITEM_1 = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 15);
|
||||
ITEM_2 = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 0);
|
||||
ITEM_3 = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 5);
|
||||
ItemMeta itemMeta1 = ITEM_1.getItemMeta();
|
||||
itemMeta1.setDisplayName(" ");
|
||||
ITEM_1.setItemMeta(itemMeta1);
|
||||
ItemMeta itemMeta2 = ITEM_2.getItemMeta();
|
||||
itemMeta2.setDisplayName("");
|
||||
ITEM_2.setItemMeta(itemMeta2);
|
||||
ItemMeta itemMeta3 = ITEM_3.getItemMeta();
|
||||
itemMeta3.setDisplayName(" ");
|
||||
ITEM_3.setItemMeta(itemMeta3);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
package com.io.yutian.refinesystem.listener;
|
||||
|
||||
import com.io.yutian.refinesystem.gui.GuiHolder;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
|
||||
public class GuiListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onInventoryClick(InventoryClickEvent event) {
|
||||
Inventory inventory = event.getInventory();
|
||||
InventoryHolder holder = inventory.getHolder();
|
||||
if (holder != null && holder instanceof GuiHolder) {
|
||||
GuiHolder guiHolder = (GuiHolder) holder;
|
||||
guiHolder.onClick(event);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onInventoryClose(InventoryCloseEvent event) {
|
||||
Inventory inventory = event.getInventory();
|
||||
InventoryHolder holder = inventory.getHolder();
|
||||
if (holder != null && holder instanceof GuiHolder) {
|
||||
GuiHolder guiHolder = (GuiHolder) holder;
|
||||
guiHolder.onClose(event);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,96 @@
|
|||
package com.io.yutian.refinesystem.util;
|
||||
|
||||
import com.io.yutian.refinesystem.RefineSystemSetting;
|
||||
import de.tr7zw.itemnbtapi.NBTItem;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class ItemStackUtil {
|
||||
|
||||
public static boolean canRefine(ItemStack itemStack) {
|
||||
if (itemStack == null || itemStack.getType() == Material.AIR) {
|
||||
return false;
|
||||
}
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
if (!itemMeta.hasLore()) {
|
||||
return false;
|
||||
}
|
||||
List<String> lore = itemMeta.getLore();
|
||||
for (String s : lore) {
|
||||
if (s.contains(RefineSystemSetting.getDetectionLore())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean isRefineItem(ItemStack itemStack) {
|
||||
if (itemStack == null || itemStack.getType() == Material.AIR) {
|
||||
return false;
|
||||
}
|
||||
NBTItem nbtItem = new NBTItem(itemStack);
|
||||
if (nbtItem.hasKey("refineType")) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static String getRefineType(ItemStack itemStack) {
|
||||
if (itemStack == null || itemStack.getType() == Material.AIR) {
|
||||
return null;
|
||||
}
|
||||
NBTItem nbtItem = new NBTItem(itemStack);
|
||||
if (nbtItem.hasKey("refineType")) {
|
||||
return nbtItem.getString("refineType");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static int getTierLevel(ItemStack itemStack) {
|
||||
if (itemStack == null || itemStack.getType() == Material.AIR) {
|
||||
return -1;
|
||||
}
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
if (!itemMeta.hasLore()) {
|
||||
return -1;
|
||||
}
|
||||
List<String> lore = itemMeta.getLore();
|
||||
for (String s : lore) {
|
||||
for (Map.Entry<String, Integer> entry : RefineSystemSetting.getTierLevels().entrySet()) {
|
||||
if (s.contains(entry.getKey())) {
|
||||
return entry.getValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static ItemStack replaceLore(ItemStack itemStack, String oldLore, List<String> newLores) {
|
||||
ItemStack itemStack1 = itemStack.clone();
|
||||
ItemMeta itemMeta = itemStack1.getItemMeta();
|
||||
List<String> lores = itemMeta.hasLore() ? itemMeta.getLore() : new ArrayList<>();
|
||||
int index = -1;
|
||||
for (int i = 0; i < lores.size(); i++) {
|
||||
String s = lores.get(i);
|
||||
if (s.contains(oldLore)) {
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
lores.remove(index);
|
||||
int i = 0;
|
||||
for (String s : newLores) {
|
||||
lores.add(index+i, s);
|
||||
i++;
|
||||
}
|
||||
itemMeta.setLore(lores);
|
||||
itemStack1.setItemMeta(itemMeta);
|
||||
return itemStack1;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
package com.io.yutian.refinesystem.util;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Item;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class PlayerInventoryUtil {
|
||||
|
||||
public static boolean hasFreeSlot(Player player) {
|
||||
return getFreeSize(player) > 0;
|
||||
}
|
||||
|
||||
public static int getFreeSize(Player player) {
|
||||
int index = -1;
|
||||
int freesize = 0;
|
||||
while (index < 35) {
|
||||
index++;
|
||||
ItemStack i = player.getInventory().getItem(index);
|
||||
if (i == null) {
|
||||
freesize++;
|
||||
continue;
|
||||
}
|
||||
if (i.getType().equals(Material.AIR)) {
|
||||
freesize++;
|
||||
}
|
||||
}
|
||||
return freesize;
|
||||
}
|
||||
|
||||
public static void giveItemStack(Player player, ItemStack itemStack) {
|
||||
if (PlayerInventoryUtil.hasFreeSlot(player)) {
|
||||
player.getInventory().addItem(itemStack);
|
||||
} else {
|
||||
Item item = player.getLocation().getWorld().dropItem(player.getLocation(), itemStack);
|
||||
item.setCanMobPickup(false);
|
||||
item.setPickupDelay(20);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
package com.io.yutian.refinesystem.util;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
public class RandomBuilder<T> {
|
||||
|
||||
private Map<T, Double> valueMap;
|
||||
|
||||
private List<Element> elementList = new ArrayList<>();
|
||||
private double maxElement = 0;
|
||||
|
||||
public RandomBuilder(Map<T, Double> map) {
|
||||
valueMap = map;
|
||||
|
||||
double minElement = 0;
|
||||
|
||||
for (Map.Entry<T, Double> entry : map.entrySet()) {
|
||||
minElement = maxElement;
|
||||
maxElement += entry.getValue();
|
||||
elementList.add(new Element(entry.getKey(), minElement, maxElement));
|
||||
}
|
||||
}
|
||||
|
||||
public T random() {
|
||||
return random(new Random());
|
||||
}
|
||||
|
||||
public T random(Random random) {
|
||||
double d = random.nextDouble() * maxElement;
|
||||
if (d == 0) {
|
||||
d = 0.1 * maxElement;
|
||||
}
|
||||
int size = valueMap.size();
|
||||
for (int i = 0; i < elementList.size(); i++) {
|
||||
Element element = elementList.get(i);
|
||||
if (element.isContainKey(d)) {
|
||||
return element.getValue();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public double getMaxElement() {
|
||||
return maxElement;
|
||||
}
|
||||
|
||||
public List<Element> getElementList() {
|
||||
return elementList;
|
||||
}
|
||||
|
||||
public Map<T, Double> getValueMap() {
|
||||
return valueMap;
|
||||
}
|
||||
|
||||
private class Element {
|
||||
|
||||
private T value;
|
||||
|
||||
private final double minElement;
|
||||
private final double maxElement;
|
||||
|
||||
public Element(T value, double element0, double element1) {
|
||||
this.value = value;
|
||||
this.minElement = Math.min(element0, element1);
|
||||
this.maxElement = Math.max(element0, element1);
|
||||
}
|
||||
|
||||
public T getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public boolean isContainKey(double element) {
|
||||
return element > minElement && element <= maxElement;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
package com.io.yutian.refinesystem.util;
|
||||
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
public class RandomUtil {
|
||||
|
||||
public static boolean random(double d) {
|
||||
return d >= new Random().nextFloat();
|
||||
}
|
||||
|
||||
public static Color getRandomColor() {
|
||||
Random random = new Random();
|
||||
int r = random.nextInt(256);
|
||||
int g = random.nextInt(256);
|
||||
int b = random.nextInt(256);
|
||||
return Color.fromRGB(r, g, b);
|
||||
}
|
||||
|
||||
public static Location getRandomLocation(World world, double minX, double maxX, double minZ, double maxZ) {
|
||||
double rx = getRandomDouble(minX, maxX, 3);
|
||||
double rz = getRandomDouble(minZ, maxZ, 3);
|
||||
int y = world.getHighestBlockAt((int)rx, (int)rz).getY()+1;
|
||||
Location location = new Location(world, rx, y, rz);
|
||||
return location;
|
||||
}
|
||||
|
||||
public static <E> E getRandomElement(List<E> list) {
|
||||
if (list.size() == 0) {
|
||||
return null;
|
||||
}
|
||||
return list.get(getRandomInt(0, list.size()-1));
|
||||
}
|
||||
|
||||
public static String getRandomString(String[] array) {
|
||||
Random r = new Random();
|
||||
return array[getRandomInt(0, array.length)];
|
||||
}
|
||||
|
||||
public static int getRandomInt(int min, int max) {
|
||||
if (min == max) {
|
||||
return max;
|
||||
}
|
||||
Random r = new Random();
|
||||
int i = min < max ? min : max;
|
||||
int a = min < max ? max : min;
|
||||
return r.nextInt(a - i + 1) + i;
|
||||
}
|
||||
|
||||
public static double getRandomDouble(double min, double max, int scl) {
|
||||
int pow = (int) Math.pow(10, scl);
|
||||
return Math.floor((Math.random() * (max - min) + min) * pow) / pow;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package com.io.yutian.refinesystem.util;
|
||||
|
||||
public class StringUtil {
|
||||
|
||||
public static String intToRoman(int number) {
|
||||
int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
|
||||
String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
|
||||
StringBuilder roman = new StringBuilder();
|
||||
for (int i = 0; i < values.length; i++) {
|
||||
while (number >= values[i]) {
|
||||
number -= values[i];
|
||||
roman.append(symbols[i]);
|
||||
}
|
||||
}
|
||||
return roman.toString();
|
||||
}
|
||||
|
||||
|
||||
}
|
48
src/main/resources/config.yml
Normal file
48
src/main/resources/config.yml
Normal file
|
@ -0,0 +1,48 @@
|
|||
tierLevels:
|
||||
'§f品质: §b稀有': 1
|
||||
'§f品质: §e超稀有': 2
|
||||
'§f品质: §5史诗': 3
|
||||
'§f品质: §6传说': 4
|
||||
'§f品质: §d卓越': 5
|
||||
'§f品质: §c神圣': 6
|
||||
detectionLore: '§7- < §1§5§r§7尚未进行洗炼§1§5§r§7 >'
|
||||
options:
|
||||
# NbtKey
|
||||
雨天洗炼符:
|
||||
# 洗炼成功率
|
||||
chance: 1.0
|
||||
# 武器需要达到什么品质
|
||||
needQuality: 1
|
||||
# 可随机添加多少个词条
|
||||
glossaryAmount:
|
||||
min: 2
|
||||
max: 3
|
||||
skills:
|
||||
# name
|
||||
冲击:
|
||||
# 抽中概率
|
||||
chance: 10
|
||||
# 等级随机 需要转化成 I II III IV V IV IIV IIIV IX X
|
||||
level:
|
||||
min: 1
|
||||
max: 3
|
||||
# 被动触发概率
|
||||
trigger:
|
||||
min: 10.5
|
||||
max: 18.6
|
||||
吸血:
|
||||
chance: 10
|
||||
level:
|
||||
min: 1
|
||||
max: 3
|
||||
trigger:
|
||||
min: 9.85
|
||||
max: 30.5
|
||||
暗黑火焰:
|
||||
chance: 10
|
||||
level:
|
||||
min: 1
|
||||
max: 3
|
||||
trigger:
|
||||
min: 10.5
|
||||
max: 20.2
|
6
src/main/resources/plugin.yml
Normal file
6
src/main/resources/plugin.yml
Normal file
|
@ -0,0 +1,6 @@
|
|||
name: RefineSystem
|
||||
version: '${project.version}'
|
||||
main: com.io.yutian.refinesystem.RefineSystem
|
||||
commands:
|
||||
refinesystem:
|
||||
aliases: [rs]
|
Loading…
Reference in New Issue
Block a user