commit cee388aa7d39657fd5d25cdbea75d65a661ad425 Author: tianyu <32282861@qq.com> Date: Thu Jul 25 05:56:32 2024 +0800 测试版 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..b18b765 --- /dev/null +++ b/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + org.example + DemonCropBuyShop + 1.0-SNAPSHOT + + + 8 + 8 + UTF-8 + + + + + public-rpg + https://repo.aurora-pixels.com/repository/public-rpg/ + + + + + + org.spigotmc + spigot-api + 1.12.2 + + + me.clip.placeholderapi + PlaceholderAPI + 2.9.2 + + + me.Demon.DemonPlugin + DemonAPI + 1.2.0 + + + + \ No newline at end of file diff --git a/src/main/java/me/Demon/DemonCropBuyShop/CropData.java b/src/main/java/me/Demon/DemonCropBuyShop/CropData.java new file mode 100644 index 0000000..f940c5e --- /dev/null +++ b/src/main/java/me/Demon/DemonCropBuyShop/CropData.java @@ -0,0 +1,103 @@ +package me.Demon.DemonCropBuyShop; + +import org.bukkit.Material; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.inventory.ItemStack; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +public class CropData { + + private String cropType; + + private double dmoney; + private double money; + + private double last; + + private List log; + + public CropData(String cropType) { + this.cropType = cropType; + FileConfiguration yml = Main.plugin.getConfig(); + this.dmoney = yml.getDouble(cropType + ".default"); + this.money = yml.getDouble(cropType + ".money"); + this.last = yml.getDouble(cropType + ".last"); + this.log = yml.getStringList(cropType + ".log"); + } + + public void SaveData() { + FileConfiguration yml = Main.plugin.getConfig(); + yml.set(cropType + ".default", this.dmoney); + yml.set(cropType + ".money", this.money); + yml.set(cropType + ".last", this.last); + yml.set(cropType + ".log", this.log); + Main.plugin.saveConfig(); + } + + public String getCropType() { + return cropType; + } + + public ItemStack getItem() { + return new ItemStack(Material.valueOf(this.getCropType())); + } + + public double getDmoney() { + return dmoney; + } + + public double getMoney() { + return money; + } + + public void setMoney(double money) { + this.money = money; + } + + public double getLast() { + return last; + } + + public void setLast(double last) { + this.last = last; + } + + public List getLog() { + return log; + } + + public void setLog(List log) { + this.log = log; + } + + public void setCropMarketLog(String lore) { + List list = new ArrayList<>(); + list.add(lore); + List jiu_log = getLog(); + if (jiu_log.size() >= 4) { + for (int i = 0; i < 4; i++) { + list.add(jiu_log.get(i)); + } + } else { + list.addAll(getLog()); + } + setLog(list); + } + + public String getCurrenBFB() { + double change = getCurrenAndPrevious(); + if (change >= 0) { + return "§a§l↑↑ §a" + new DecimalFormat("###.##").format(change) + "%"; + } else { + return "§c§l↓↓ §c" + new DecimalFormat("###.##").format(change) + "%"; + } + } + + public double getCurrenAndPrevious() { + double change = getMoney() - getLast(); + return (change / getLast()) * 100; + } +} diff --git a/src/main/java/me/Demon/DemonCropBuyShop/CropShopAPI.java b/src/main/java/me/Demon/DemonCropBuyShop/CropShopAPI.java new file mode 100644 index 0000000..a2898ca --- /dev/null +++ b/src/main/java/me/Demon/DemonCropBuyShop/CropShopAPI.java @@ -0,0 +1,205 @@ +package me.Demon.DemonCropBuyShop; + +import me.Demon.DemonCropBuyShop.Event.MarktStatsEvent; +import me.Demon.DemonCropBuyShop.Event.PlayerCropBuyEvent; +import me.Demon.DemonPlugin.DemonAPI; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; + +import java.text.DecimalFormat; +import java.util.Random; + +public class CropShopAPI { + + public static int getCropBuyAmount(String CorpType){ + FileConfiguration yml = Main.plugin.getConfig(); + return yml.getInt("BuyData."+CorpType); + } + + public static void addCropBuyAmount(String CorpType,int amount){ + FileConfiguration yml = Main.plugin.getConfig(); + int a = getCropBuyAmount(CorpType) + amount; + yml.set("BuyData."+CorpType,a); + Main.plugin.saveConfig(); + } + + public static void setCropBuyAmount(String CorpType,int amount){ + FileConfiguration yml = Main.plugin.getConfig(); + yml.set("BuyData."+CorpType,amount); + Main.plugin.saveConfig(); + } + + public static void SellCropsItemsEvant(Player p, String CropType, int sell_groupAmount){ + CropData dataAPI = Main.dataAPI.get(CropType); + int price = (int) dataAPI.getMoney(); + if(sell_groupAmount >= 2){ + price = price * sell_groupAmount; + } + double tax = 0.05; + if(p.hasPermission("vip2.use")){ + tax = 0.02; + }else if(p.hasPermission("vip1.use")){ + tax = 0.03; + } + price = (int) (price - (price * tax)); + double taxMoney = price * tax; + DemonAPI.giveMoney(p, price); + p.sendMessage(Main.prefix + "你获得了: §f$" + new DecimalFormat(",###.##").format(price) + "金币 §6(纳税: " + new DecimalFormat("#.##").format(taxMoney) + "金币)"); + int sellAmount = sell_groupAmount * 64; + if(CropType.equalsIgnoreCase("EGG")){ + sellAmount = sell_groupAmount * 16; + } + PlayerCropBuyEvent event = new PlayerCropBuyEvent(p, dataAPI.getCropType(), sellAmount,price,(int) taxMoney); + Bukkit.getPluginManager().callEvent(event); + } + + public static void Start_Updata_Event(String CropType,int type){ + // 获取CropData数据 + CropData dataAPI = Main.dataAPI.get(CropType); + // 刷新现在价格 + double current_price = dataAPI.getMoney(); + // type == 0 系统随机 + // type == 1 上涨 + // type == 2 下跌 + if (type == 0) { + if (current_price >= (dataAPI.getDmoney() * 1.1)) { + // zhenfu_1 = 越大上涨概率低 + // zhenfu = 越小概率越高 + System_Updata_Price(dataAPI, 40, 70, 30); + } else if (current_price >= (dataAPI.getDmoney() * 0.8)) { + System_Updata_Price(dataAPI, 70, 40, 40); + } else { + System_Updata_Price(dataAPI, 70, 40, 40); + } + } else if (type == 1) { + if (Main.getRandomInt(100, 1) >= 70) { + Admin_Up_Price(dataAPI, 1); + } else { + Admin_Up_Price(dataAPI, 2); + } + } else if (type == 2) { + if (Main.getRandomInt(100, 1) >= 40) { + Admin_Down_Price(dataAPI, 1); + } else { + Admin_Down_Price(dataAPI, 2); + } + } + } + + public static void System_Updata_Price(CropData dataAPI,int zhenfu,int zhenfu_1,int die){ + // type = 1[涨] 2[跌] + int mk_stats = 0; + String new_s = ""; + // 刷新现在价格 + double server_current = dataAPI.getMoney(); + int gailv = Main.getRandomInt(100,1); + if(gailv >= zhenfu){ + if(Main.getRandomInt(100,1) >= zhenfu_1){ + double Vmin = server_current * 0.02; + double Vmax = server_current * 0.04; + double Vprice = new Random().nextDouble()*(Vmax-Vmin)+Vmin; + double price = server_current + Vprice; + new_s = new DecimalFormat("###.##").format(price); + mk_stats = 1; + Bukkit.getConsoleSender().sendMessage("§6[现货交易所SY] §f农产品: "+dataAPI.getCropType()+" 状态: 震浮-涨 "+server_current+" ---> "+new_s+" "+getCurrenBFB(price,dataAPI.getMoney())); + } else { + double Vmin = server_current * 0.03; + double Vmax = server_current * 0.05; + double Vprice = new Random().nextDouble()*(Vmax-Vmin)+Vmin; + double price = server_current - Vprice; + new_s = new DecimalFormat("###.##").format(price); + mk_stats = 2; + Bukkit.getConsoleSender().sendMessage("§6[现货交易所SY] §f农产品: "+dataAPI.getCropType()+" 状态: 震浮-跌 "+server_current+" ---> "+new_s+" "+getCurrenBFB(price,dataAPI.getMoney())); + } + }else if(gailv >= die){ + // 扣除 + double Vmin = server_current * 0.01; + double Vmax = server_current * 0.03; + double Vprice = new Random().nextDouble()*(Vmax-Vmin)+Vmin; + double price = server_current - Vprice; + new_s = new DecimalFormat("###.##").format(price); + mk_stats = 1; + Bukkit.getConsoleSender().sendMessage("§6[现货交易所SY] §f农产品: "+dataAPI.getCropType()+" 状态: 跌 "+server_current+" ---> "+new_s+" "+getCurrenBFB(price,dataAPI.getMoney())); + }else { + double Vmin = server_current * 0.01; + double Vmax = server_current * 0.03; + double Vprice = new Random().nextDouble()*(Vmax-Vmin)+Vmin; + double price = server_current + Vprice; + new_s = new DecimalFormat("###.##").format(price); + mk_stats = 2; + Bukkit.getConsoleSender().sendMessage("§6[现货交易所SY] §f农产品: "+dataAPI.getCropType()+" 状态: 涨 "+server_current+" ---> "+new_s+" "+getCurrenBFB(price,dataAPI.getMoney())); + } + double xian_jia_money = Double.parseDouble(new_s); + MarktStatsEvent event = new MarktStatsEvent(dataAPI, mk_stats,xian_jia_money); + Bukkit.getPluginManager().callEvent(event); + } + + public static void Admin_Up_Price(CropData dataAPI,int type){ + // type = 1[涨] 2[跌] + int mk_stats = 1; + String new_s = ""; + // 刷新现在价格 + double server_current = dataAPI.getMoney(); + if(type == 1){ + double Vmin = server_current * 0.02; + double Vmax = server_current * 0.04; + double Vprice = new Random().nextDouble()*(Vmax-Vmin)+Vmin; + double price = server_current + Vprice; + new_s = new DecimalFormat("###.##").format(price); + Bukkit.getConsoleSender().sendMessage("§6[现货交易所] §f农产品: "+dataAPI.getCropType()+" 状态: 震浮-涨 "+server_current+" ---> "+new_s+" "+getCurrenBFB(price,dataAPI.getMoney())); + }else{ + double Vmin = server_current * 0.01; + double Vmax = server_current * 0.03; + double Vprice = new Random().nextDouble()*(Vmax-Vmin)+Vmin; + double price = server_current + Vprice; + new_s = new DecimalFormat("###.##").format(price); + Bukkit.getConsoleSender().sendMessage("§6[现货交易所] §f农产品: "+dataAPI.getCropType()+" 状态: 涨 "+server_current+" ---> "+new_s+" "+getCurrenBFB(price,dataAPI.getMoney())); + } + double xian_jia_money = Double.parseDouble(new_s); + MarktStatsEvent event = new MarktStatsEvent(dataAPI, mk_stats,xian_jia_money); + Bukkit.getPluginManager().callEvent(event); + } + + + public static void Admin_Down_Price(CropData dataAPI,int type){ + // type = 1[涨] 2[跌] + int mk_stats = 2; + String new_s = ""; + // 刷新现在价格 + double server_current = dataAPI.getMoney(); + if (type == 1) { + double Vmin = server_current * 0.03; + double Vmax = server_current * 0.05; + double Vprice = new Random().nextDouble()*(Vmax-Vmin)+Vmin; + double price = server_current - Vprice; + new_s = new DecimalFormat("###.##").format(price); + Bukkit.getConsoleSender().sendMessage("§6[现货交易所] §f农产品: "+dataAPI.getCropType()+" 状态: 震浮-跌 "+server_current+" ---> "+new_s+" "+getCurrenBFB(price,dataAPI.getMoney())); + } else { + double Vmin = server_current * 0.01; + double Vmax = server_current * 0.03; + double Vprice = new Random().nextDouble()*(Vmax-Vmin)+Vmin; + double price = server_current - Vprice; + new_s = new DecimalFormat("###.##").format(price); + Bukkit.getConsoleSender().sendMessage("§6[现货交易所] §f农产品: "+dataAPI.getCropType()+" 状态: 跌 "+server_current+" ---> "+new_s+" "+getCurrenBFB(price,dataAPI.getMoney())); + } + double xian_jia_money = Double.parseDouble(new_s); + MarktStatsEvent event = new MarktStatsEvent(dataAPI, mk_stats,xian_jia_money); + Bukkit.getPluginManager().callEvent(event); + } + + public static String getCurrenBFB(double xianjia,double last){ + double change = getCAP(xianjia,last); + if(change >= 0) { + return new DecimalFormat("###.##").format(change) + "%"; + }else{ + return "§c"+new DecimalFormat("###.##").format(change)+ "%"; + } + } + + public static double getCAP(double xianjia,double last){ + double change = xianjia - last; + return (change / last) * 100; + } + +} diff --git a/src/main/java/me/Demon/DemonCropBuyShop/Event/MarktStatsEvent.java b/src/main/java/me/Demon/DemonCropBuyShop/Event/MarktStatsEvent.java new file mode 100644 index 0000000..9f207af --- /dev/null +++ b/src/main/java/me/Demon/DemonCropBuyShop/Event/MarktStatsEvent.java @@ -0,0 +1,46 @@ +package me.Demon.DemonCropBuyShop.Event; + +import me.Demon.DemonCropBuyShop.CropData; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class MarktStatsEvent extends Event { + + private static HandlerList handlers = new HandlerList(); + private CropData dataAPI; + private int type; + private double money; + + @Override + public HandlerList getHandlers(){ + return handlers; + } + + public static HandlerList getHandlerList(){ + return handlers; + } + + public MarktStatsEvent(CropData dataAPI, int type, double money){ + this.dataAPI = dataAPI; + this.type = type; + this.money = money; + } + + public CropData getDataAPI() { + return dataAPI; + } + + public int getType() { + return type; + } + + public double getMoney() { + return money; + } + + @Override + public String getEventName() { + return super.getEventName(); + } +} diff --git a/src/main/java/me/Demon/DemonCropBuyShop/Event/PlayerCropBuyEvent.java b/src/main/java/me/Demon/DemonCropBuyShop/Event/PlayerCropBuyEvent.java new file mode 100644 index 0000000..d1c69b3 --- /dev/null +++ b/src/main/java/me/Demon/DemonCropBuyShop/Event/PlayerCropBuyEvent.java @@ -0,0 +1,57 @@ +package me.Demon.DemonCropBuyShop.Event; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class PlayerCropBuyEvent extends Event { + + private static HandlerList handlers = new HandlerList(); + private Player player; + private String Croptype; + private int Buyamount; + private int BuyMoney; + private int BuyTax; + + @Override + public HandlerList getHandlers(){ + return handlers; + } + + public static HandlerList getHandlerList(){ + return handlers; + } + + public PlayerCropBuyEvent(Player player, String Croptype, int Buyamount, int BuyMoney, int BuyTax){ + this.player = player; + this.Croptype = Croptype; + this.Buyamount = Buyamount; + this.BuyMoney = BuyMoney; + this.BuyTax = BuyTax; + } + + public Player getPlayer(){ + return player; + } + + public String getCroptype() { + return Croptype; + } + + public int getBuyamount() { + return Buyamount; + } + + public int getBuyMoney() { + return BuyMoney; + } + + public int getBuyTax() { + return BuyTax; + } + + @Override + public String getEventName() { + return super.getEventName(); + } +} diff --git a/src/main/java/me/Demon/DemonCropBuyShop/Main.java b/src/main/java/me/Demon/DemonCropBuyShop/Main.java new file mode 100644 index 0000000..916d804 --- /dev/null +++ b/src/main/java/me/Demon/DemonCropBuyShop/Main.java @@ -0,0 +1,82 @@ +package me.Demon.DemonCropBuyShop; + +import com.sun.scenario.effect.Crop; +import me.Demon.DemonCropBuyShop.listener.BuyGui; +import me.Demon.DemonCropBuyShop.listener.GuiListener; +import me.Demon.DemonCropBuyShop.listener.MarkStats; +import me.Demon.DemonCropBuyShop.listener.PlayerCropBuy; +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.ItemStack; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Random; + +public class Main extends JavaPlugin { + public static Main plugin; + public static int TodayBank = 0; + public static String prefix = "§7[§6战争领域§7] §f"; + public static LinkedHashMap dataAPI = new LinkedHashMap<>(); + + @Override + public void onEnable() { + plugin = this; + saveDefaultConfig(); + Bukkit.getServer().getPluginManager().registerEvents(new PlayerCropBuy(), plugin); + Bukkit.getServer().getPluginManager().registerEvents(new GuiListener(), plugin); + Bukkit.getServer().getPluginManager().registerEvents(new MarkStats(), plugin); + Bukkit.getConsoleSender().sendMessage("§e[农贸商店] §r正在启动插件..."); + for (String cropType : getConfig().getKeys(false)){ + if(getConfig().getString(cropType+".log") != null){ + dataAPI.put(cropType,new CropData(cropType)); + } + } + Bukkit.getConsoleSender().sendMessage("§e[农贸商店] §r载入农贸: "+dataAPI.size()+"个"); + long time = 20L * 60 * 30; + new TimeCheckRunnable().runTaskTimer(this, time, time); + if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { + new Placeholders(this).register(); + } + } + + @Override + public void onDisable() { + for (String cropType : dataAPI.keySet()){ + Main.dataAPI.get(cropType).SaveData(); + } + Bukkit.getConsoleSender().sendMessage("§e[农贸商店] §r正在关闭插件..."); + } + + public boolean onCommand(CommandSender sender, Command cmd, String Command, String[] args) { + if (Command.equalsIgnoreCase("cropshop")) { + if(args.length == 1 && args[0].equalsIgnoreCase("open")){ + new BuyGui((Player) sender); + } + + if(args.length == 1 && args[0].equalsIgnoreCase("start") && sender.isOp()){ + for (String corpType : Main.dataAPI.keySet()) { + CropShopAPI.Start_Updata_Event(corpType,0); + } + sender.sendMessage("[日志-农贸商店] 倒计时结束随机市场调整."); + } + + if(args.length == 1 && args[0].equalsIgnoreCase("resetprice") && sender.isOp()){ + for (String corpType : Main.dataAPI.keySet()) { + CropShopAPI.Start_Updata_Event(corpType,0); + } + sender.sendMessage("[日志-农贸商店] 倒计时结束随机市场调整."); + } + + } + return false; + } + public static boolean itemIsNull(ItemStack item){return item == null || item.getType() == Material.AIR;} + public static boolean itemIsLore(ItemStack item){return item.getItemMeta().getLore() == null;} + public static int getRandomInt(int max,int min){return new Random().nextInt(max) + min;} +} + diff --git a/src/main/java/me/Demon/DemonCropBuyShop/Placeholders.java b/src/main/java/me/Demon/DemonCropBuyShop/Placeholders.java new file mode 100644 index 0000000..8835cf9 --- /dev/null +++ b/src/main/java/me/Demon/DemonCropBuyShop/Placeholders.java @@ -0,0 +1,61 @@ +package me.Demon.DemonCropBuyShop; + +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +public class Placeholders extends PlaceholderExpansion { + + private Plugin plugin; + public Placeholders(Plugin plugin) { + this.plugin = plugin; + } + @Override + public boolean persist() { + return true; + } + + @Override + public boolean canRegister() { + return true; + } + + @Override + public String getAuthor() { + return plugin.getDescription().getAuthors().toString(); + } + + @Override + public String getIdentifier() { + return "dcropshop"; + } + + + // %dcropshop_bfb_ndsad% + // %dcropshop_jg_ndsad% + @Override + public String getVersion() { + return plugin.getDescription().getVersion(); + } + + public String onPlaceholderRequest(Player p, String indentifier) {if (p == null) { return ""; } + String[] sp = indentifier.split("_"); + if (sp.length == 2) { + CropData dataAPI = Main.dataAPI.get(sp[1]); + if (sp[0].equalsIgnoreCase("jg")) { + return "" + dataAPI.getMoney(); + } else { + return "" + dataAPI.getCurrenBFB(); + } + }else if (sp.length == 3) { + String cropType = sp[1]+"_"+sp[2]; + CropData dataAPI = Main.dataAPI.get(cropType); + if (sp[0].equalsIgnoreCase("jg")) { + return "" + dataAPI.getMoney(); + } else { + return "" + dataAPI.getCurrenBFB(); + } + } + return "-999"; + } +} diff --git a/src/main/java/me/Demon/DemonCropBuyShop/TimeCheckRunnable.java b/src/main/java/me/Demon/DemonCropBuyShop/TimeCheckRunnable.java new file mode 100644 index 0000000..002d3a3 --- /dev/null +++ b/src/main/java/me/Demon/DemonCropBuyShop/TimeCheckRunnable.java @@ -0,0 +1,23 @@ +package me.Demon.DemonCropBuyShop; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.HashMap; + +public class TimeCheckRunnable extends BukkitRunnable { + + HashMap onlineSeconds; + + public TimeCheckRunnable() { + this.onlineSeconds = new HashMap<>(); + } + + public void run() { + for (String corpType : Main.dataAPI.keySet()) { + CropShopAPI.Start_Updata_Event(corpType,0); + } + Bukkit.getConsoleSender().sendMessage("[日志-农贸商店] 倒计时结束随机市场调整."); + } +} diff --git a/src/main/java/me/Demon/DemonCropBuyShop/listener/BuyGui.java b/src/main/java/me/Demon/DemonCropBuyShop/listener/BuyGui.java new file mode 100644 index 0000000..5b8eb34 --- /dev/null +++ b/src/main/java/me/Demon/DemonCropBuyShop/listener/BuyGui.java @@ -0,0 +1,96 @@ +package me.Demon.DemonCropBuyShop.listener; + +import me.Demon.DemonCropBuyShop.CropData; +import me.Demon.DemonCropBuyShop.Main; +import me.Demon.DemonPlugin.DemonAPI; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +public class BuyGui implements InventoryHolder { + + private Inventory inventory; + + private Player player; + + public BuyGui(Player p){ + this.player = p; + inventory = Bukkit.createInventory(this,36,"战争领域 - 农贸市场"); + int slot = 9; + for (String itemType : Main.dataAPI.keySet()){ + CropData dataAPI = Main.dataAPI.get(itemType); + Material material = Material.valueOf(itemType); + ItemStack item = new ItemStack(material,1); + inventory.setItem(slot,shopitem(item,dataAPI)); + slot++; + } + for (int i = 27;i lore = new ArrayList<>(); + lore.add("§a§l★§7单位: §2组"); + // 计算现价和上一次变动价格的涨幅和跌幅 + double change = dataAPI.getCurrenAndPrevious(); + String show = new DecimalFormat("###.##").format(change); + + String m = new DecimalFormat("###.##").format(dataAPI.getMoney()); + if(change >= 0) { + lore.add("§d§l★§7现价: §6" + m+"元 §a(+"+show+"%)"); + }else{ + lore.add("§d§l★§7现价: §6" + m+"元 §c("+show+"%)"); + } + lore.add("§b§l★§7历史行情:"); + lore.addAll(dataAPI.getLog()); + lore.add("§8#祝老板成为农贸大亨!"); + lore.add(" "); + if (item.getType() == Material.EGG) { + lore.add("§a§l★§7左键点击 §f| §7出售16个"); + lore.add("§a§l★§7右键点击 §f| §7出售27组"); + }else{ + lore.add("§a§l★§7左键点击 §f| §7出售64个"); + lore.add("§a§l★§7右键点击 §f| §7出售27组"); + } + meta.setLore(lore); + item.setItemMeta(meta); + return item; + } + + public static ItemStack glass(String name,int date){ + ItemStack item = new ItemStack(160,1,(short) date); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(name); + item.setItemMeta(meta); + return item; + } + public static ItemStack BackBook(String name){ + ItemStack item = new ItemStack(Material.BOOK); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(name); + item.setItemMeta(meta); + return item; + } + + @Override + public Inventory getInventory() { + return null; + } +} diff --git a/src/main/java/me/Demon/DemonCropBuyShop/listener/GuiListener.java b/src/main/java/me/Demon/DemonCropBuyShop/listener/GuiListener.java new file mode 100644 index 0000000..f27bf9a --- /dev/null +++ b/src/main/java/me/Demon/DemonCropBuyShop/listener/GuiListener.java @@ -0,0 +1,127 @@ +package me.Demon.DemonCropBuyShop.listener; + +import me.Demon.DemonCropBuyShop.CropData; +import me.Demon.DemonCropBuyShop.Event.PlayerCropBuyEvent; +import me.Demon.DemonCropBuyShop.Main; +import me.Demon.DemonPlugin.DemonAPI; +import me.skymc.taboomenu.TabooMenuAPI; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.text.DecimalFormat; + +public class GuiListener implements Listener { + + @EventHandler + public void onclick(InventoryClickEvent e){ + Player p = (Player) e.getWhoClicked(); + if(e.getInventory().getHolder() != null && e.getInventory().getHolder() instanceof BuyGui){ + e.setCancelled(true); + int rawSlot = e.getRawSlot(); + if(rawSlot <= 0 || rawSlot >= e.getInventory().getSize()){ + return; + } + if(rawSlot == 31){ + TabooMenuAPI.openMenu(p,"商城菜单",true); + return; + } + if(Main.itemIsNull(e.getCurrentItem()) && Main.itemIsLore(e.getCurrentItem())){ + return; + } + String CorpType = e.getCurrentItem().getType().name(); + if (e.getClick() == ClickType.LEFT) { + if(e.getCurrentItem().getType() == Material.EGG) { + SellItemsEvant(p,CorpType, 16, 1); + } else { + SellItemsEvant(p, CorpType, 64, 1); + } + } + if (e.getClick() == ClickType.RIGHT) { + if(e.getCurrentItem().getType() == Material.EGG) { + SellItemsEvant(p, CorpType, 16*27, 2); + }else{ + SellItemsEvant(p, CorpType, 1728, 2); + } + } + } + } + + public static void SellItemsEvant(Player p, String CropType, int sellAmount, int type){ + if(Main.TodayBank >= 30000000){ + p.sendMessage(Main.prefix+"农贸市场每日仅回收3000万金币的农作物."); + p.playSound(p.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 2); + return; + } + CropData dataAPI = Main.dataAPI.get(CropType); + //检测玩家是否拥有这么多的物品出售 + ItemStack item = dataAPI.getItem(); + int PlayerAmount = getInvAmount(p,item); + if(PlayerAmount < sellAmount){ + p.sendMessage(Main.prefix+"你没有足够的物品."); + p.playSound(p.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 2); + return; + } + SellItemEvent(p.getInventory(),PlayerAmount,item,sellAmount); + int price = (int) dataAPI.getMoney(); + if(type == 2){ + price = price * 27; + } + double tax = 0.05; + if(p.hasPermission("vip2.use")){ + tax = 0.02; + }else if(p.hasPermission("vip1.use")){ + tax = 0.03; + } + price = (int) (price - (price * tax)); + double taxMoney = price * tax; + DemonAPI.giveMoney(p, price); + Main.TodayBank = Main.TodayBank + price; + p.sendMessage(Main.prefix + "你获得了: §f$" + new DecimalFormat(",###.##").format(price) + "金币 §6(纳税: " + new DecimalFormat("#.##").format(taxMoney) + "金币)"); + p.updateInventory(); + p.playSound(p.getLocation(), Sound.BLOCK_COMPARATOR_CLICK, 1, 2); + PlayerCropBuyEvent event = new PlayerCropBuyEvent(p, dataAPI.getCropType(), sellAmount,price,(int) taxMoney); + Bukkit.getPluginManager().callEvent(event); + new BuyGui(p); + } + + public static int getInvAmount(Player p, ItemStack item){ + int amount = 0; + Inventory inv = p.getInventory(); + Material material = item.getType(); + for (int i = 0;i < 36;i++){ + ItemStack items = inv.getItem(i); + if(!Main.itemIsNull(items) && Main.itemIsLore(items)){ + Material inv_type = items.getType(); + if(inv_type == material){ + amount = amount + items.getAmount(); + } + } + } + return amount; + } + public static void SellItemEvent(Inventory inv,int playerAmount,ItemStack item,int sellAmount){ + int last = playerAmount - sellAmount; + for (int i = 0;i < 36;i++){ + ItemStack items = inv.getItem(i); + if(!Main.itemIsNull(items) && Main.itemIsLore(items)){ + Material inv_type = items.getType(); + if(inv_type == item.getType()){ + inv.setItem(i, new ItemStack(Material.AIR)); + } + } + } + if(last >= 1) { + ItemStack newItem = new ItemStack(item.getType()); + newItem.setAmount(last); + inv.addItem(newItem); + } + } +} diff --git a/src/main/java/me/Demon/DemonCropBuyShop/listener/MarkStats.java b/src/main/java/me/Demon/DemonCropBuyShop/listener/MarkStats.java new file mode 100644 index 0000000..2773fc0 --- /dev/null +++ b/src/main/java/me/Demon/DemonCropBuyShop/listener/MarkStats.java @@ -0,0 +1,64 @@ +package me.Demon.DemonCropBuyShop.listener; + +import me.Demon.DemonCropBuyShop.CropData; +import me.Demon.DemonCropBuyShop.Event.MarktStatsEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.text.DecimalFormat; + +public class MarkStats implements Listener { + + @EventHandler + public void markStats(MarktStatsEvent e){ + CropData dataAPI = e.getDataAPI(); + // 刷新现在价格 + double current_price = dataAPI.getMoney(); + // 判断本次事件是涨还是跌 + int mk_stats = e.getType(); + boolean butt = false; + if(mk_stats == 1){ + if(!isMoneyUpLimit(dataAPI.getDmoney(),current_price)){ + butt = true; + } + } else { + if(!isMoneyDownLimit(dataAPI.getDmoney(),current_price)){ + butt = true; + } + } + if(butt){ + // 首先记录当前价格 + double change = dataAPI.getCurrenAndPrevious(); + String show = new DecimalFormat("###.##").format(change); + if (change >= 0) { + String str_lore = " §f- §6" + dataAPI.getMoney() + " §a§l↑↑ §a" + show + "%"; + dataAPI.setCropMarketLog(str_lore); + } else { + String str_lore = " §f- §6" + dataAPI.getMoney() + " §c§l↓↓ §c" + show + "%"; + dataAPI.setCropMarketLog(str_lore); + } + // 设置上次价格 + dataAPI.setLast(current_price); + // 设置当前价格 + dataAPI.setMoney(e.getMoney()); + } + } + + + public static boolean isMoneyUpLimit(double Dmoney,double price){ + // Dmoney = 10000 * 1.3 = 13000; + // Bukkit.getConsoleSender().sendMessage("price = "+price+" default = "+Dmoney); + if(price >= (Dmoney * 1.5)){ + return true; + } + return false; + } + public static boolean isMoneyDownLimit(double Dmoney,double price){ + // Dmoney = 10000 * 1.3 = 13000; + // Bukkit.getConsoleSender().sendMessage("price = "+price+" default = "+Dmoney); + if(price <= (Dmoney * 0.3)){ + return true; + } + return false; + } +} diff --git a/src/main/java/me/Demon/DemonCropBuyShop/listener/PlayerCropBuy.java b/src/main/java/me/Demon/DemonCropBuyShop/listener/PlayerCropBuy.java new file mode 100644 index 0000000..3fef70f --- /dev/null +++ b/src/main/java/me/Demon/DemonCropBuyShop/listener/PlayerCropBuy.java @@ -0,0 +1,54 @@ +package me.Demon.DemonCropBuyShop.listener; + +import me.Demon.DemonCropBuyShop.CropShopAPI; +import me.Demon.DemonCropBuyShop.Event.PlayerCropBuyEvent; +import me.Demon.DemonCropBuyShop.Main; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class PlayerCropBuy implements Listener { + + @EventHandler + public void buyCrop(PlayerCropBuyEvent e){ + Player p = e.getPlayer(); + // 判断农作物出售数量是否大于27组~ + String cropType = e.getCroptype(); + CropShopAPI.addCropBuyAmount(cropType,e.getBuyamount()); + int sellAmount = CropShopAPI.getCropBuyAmount(cropType); + // 若大于27组则执行市场变动 + if(sellAmount >= (getCropLimit(cropType) * 2)){ + for (String crop : Main.dataAPI.keySet()){ + if(crop.equalsIgnoreCase(cropType)){ + CropShopAPI.Start_Updata_Event(cropType,2); + CropShopAPI.setCropBuyAmount(cropType,0); + } else { + CropShopAPI.Start_Updata_Event(crop,1); + } + } + } + } + + public static int getCropLimit(String Crop){ + if(Crop.equalsIgnoreCase("WHEAT")){ + return 27 * 64; + }else if(Crop.equalsIgnoreCase("POTATO_ITEM")){ + return 48 * 64; + }else if(Crop.equalsIgnoreCase("CARROT_ITEM")){ + return 48 * 64; + }else if(Crop.equalsIgnoreCase("MELON")){ + return 342 * 64; + }else if(Crop.equalsIgnoreCase("PUMPKIN")){ + return 57 * 64; + }else if(Crop.equalsIgnoreCase("CACTUS")){ + return 40 * 64; + }else if(Crop.equalsIgnoreCase("SUGAR_CANE")){ + return 162 * 64; + }else if(Crop.equalsIgnoreCase("NETHER_STALK")){ + return 57 * 64; + }else if(Crop.equalsIgnoreCase("EGG")){ + return 70 * 16; + } + return 27 * 64; + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..9ef6b73 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,68 @@ +WHEAT: + default: 2280.0 + money: 2280.37 + last: 2280.64 + log: + - ' §f- §63209.64 §c§l↓↓ §c-1.36%' + - ' §f- §63253.77 §a§l↑↑ §a3.11%' + - ' §f- §63155.66 §c§l↓↓ §c-3%' + - ' §f- §63253.16 §a§l↑↑ §a1.32%' + - ' §f- §63210.76 §c§l↓↓ §c-4.08%' +POTATO_ITEM: + default: 1280.0 + money: 1280.37 + last: 1280.64 + log: + - ' §f- §61280.64 §c§l↓↓ §c-1.36%' +CARROT_ITEM: + default: 1280.0 + money: 1280.37 + last: 1280.64 + log: + - ' §f- §61280.64 §c§l↓↓ §c-1.36%' +MELON: + default: 180.0 + money: 180.37 + last: 180.64 + log: + - ' §f- §6180.64 §c§l↓↓ §c-1.36%' +PUMPKIN: + default: 1080.0 + money: 1080.37 + last: 1080.64 + log: + - ' §f- §61080.64 §c§l↓↓ §c-1.36%' +CACTUS: + default: 1080.0 + money: 1080.37 + last: 1080.64 + log: + - ' §f- §61080.64 §c§l↓↓ §c-1.36%' +SUGAR_CANE: + default: 380.0 + money: 380.37 + last: 380.64 + log: + - ' §f- §6380.64 §c§l↓↓ §c-1.36%' +NETHER_STALK: + default: 1080.0 + money: 1080.37 + last: 1080.64 + log: + - ' §f- §6380.64 §c§l↓↓ §c-1.36%' +EGG: + default: 880.0 + money: 880.37 + last: 880.64 + log: + - ' §f- §6380.64 §c§l↓↓ §c-1.36%' +BuyData: + WHEAT: 1 + POTATO_ITEM: 1 + CARROT_ITEM: 1 + MELON: 1 + PUMPKIN: 1 + CACTUS: 1 + SUGAR_CANE: 1 + NETHER_STALK: 1 + EGG: 1 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..1de179e --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,5 @@ +name: DemonCropBuyShop +main: me.Demon.DemonCropBuyShop.Main +version: 1.0.2 +commands: + cropshop: \ No newline at end of file