diff --git a/src/main/java/com/yaohun/wheatwar/WheatWar.java b/src/main/java/com/yaohun/wheatwar/WheatWar.java index e609709..40a2f40 100644 --- a/src/main/java/com/yaohun/wheatwar/WheatWar.java +++ b/src/main/java/com/yaohun/wheatwar/WheatWar.java @@ -1,29 +1,47 @@ package com.yaohun.wheatwar; -import com.yaohun.wheatwar.effect.SummonTheCow; -import com.yaohun.wheatwar.effect.SummonTheVillager; -import com.yaohun.wheatwar.effect.SummonTheZombie; +import com.yaohun.wheatwar.data.RepairGiftGui; +import com.yaohun.wheatwar.effect.*; import com.yaohun.wheatwar.game.Game; import com.yaohun.wheatwar.listener.GameEffectListener; import com.yaohun.wheatwar.listener.GameListener; import com.yaohun.wheatwar.listener.GamePotect; import com.yaohun.wheatwar.listener.JoinListener; +import com.yaohun.wheatwar.liveevent.GiftEventHandler; +import com.yaohun.wheatwar.liveevent.GiftListener; +import com.yaohun.wheatwar.liveevent.LikeListener; +import com.yaohun.wheatwar.manage.GameManager; +import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import org.bukkit.entity.Villager; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; import tools.GameUtil; +import tools.RandomUtil; + +import java.util.ArrayList; +import java.util.List; public class WheatWar extends JavaPlugin { private static WheatWar instance; private static Game game; + private static GameManager gameManager; @Override public void onEnable() { instance = this; + gameManager = new GameManager(); game = new Game(); + getServer().getPluginManager().registerEvents(new GiftListener(),this); + getServer().getPluginManager().registerEvents(new LikeListener(gameManager),this); + + getServer().getPluginManager().registerEvents(new RepairGiftGui(),this); + getServer().getPluginManager().registerEvents(new GameEffectListener(),this); getServer().getPluginManager().registerEvents(new GameListener(),this); getServer().getPluginManager().registerEvents(new GamePotect(),this); @@ -50,18 +68,90 @@ public class WheatWar extends JavaPlugin { sender.sendMessage("执行成功."); } if(args.length == 1 && args[0].equalsIgnoreCase("test2")){ - SummonTheCow.apply(getGame(), (Player) sender, "路人", 50); + SummonTheSheep.apply(getGame(), (Player) sender, "路人", 50); sender.sendMessage("执行成功."); } if(args.length == 1 && args[0].equalsIgnoreCase("test3")){ SummonTheZombie.apply(getGame(), (Player) sender, "僵尸先生", 10); sender.sendMessage("执行成功."); } + if(args.length == 1 && args[0].equalsIgnoreCase("test4")){ + SummonTheBombsTNT.apply(getGame(), (Player) sender, "僵尸先生", 10); + sender.sendMessage("执行成功."); + } + if(args.length == 1 && args[0].equalsIgnoreCase("test5")){ + SummonTheTNTRain.apply(getGame(), (Player) sender, "僵尸先生", 50); + sender.sendMessage("执行成功."); + } + if(args.length == 1 && args[0].equalsIgnoreCase("test6")){ + SummonTheSheepPro.apply(getGame(), (Player) sender, "暴躁小杨", 10); + sender.sendMessage("执行成功."); + } + if(args.length == 1 && args[0].equalsIgnoreCase("test7")){ + Player player = (Player) sender; + Location location = player.getLocation(); + Villager entity = (Villager) location.getWorld().spawnEntity(location, EntityType.VILLAGER); + entity.setAI(false); + entity.setProfession(Villager.Profession.FARMER); + sender.sendMessage("执行成功."); + } + if(args.length == 1 && args[0].equalsIgnoreCase("play")){ + Player player = (Player) sender; + Location center = new Location(Bukkit.getWorld("world"), 1, 66, -2); + // 启动计时器 + new BukkitRunnable() { + private int ticks = 0; // 计时器的 ticks 变量,1秒20 ticks + private final double radius = 30.0; // 绕圈半径 + private final int duration = 36000 * 10; // 1分钟(1200 ticks) + @Override + public void run() { + if(player == null || !player.isOnline()){ + cancel(); + return; + } + if (ticks >= duration) { // 计时结束 + cancel(); + return; + } + // 计算当前旋转角度 + double angle = Math.toRadians((ticks * 0.3) % 360); // 每tick增加角度,控制旋转速度 + double x = center.getX() + radius * Math.cos(angle); + double z = center.getZ() + radius * Math.sin(angle); + double y = center.getY() + 13; + // 更新玩家位置和朝向 + Location playerLoc = player.getLocation(); + playerLoc.setX(x); + playerLoc.setY(y); + playerLoc.setZ(z); + + // 设置玩家面朝中心点 + playerLoc.setDirection(center.toVector().subtract(playerLoc.toVector())); + player.teleport(playerLoc); + ticks++; + } + }.runTaskTimer(instance, 0L, 1L); // 每tick执行一次 + sender.sendMessage("执行成功."); + return true; + } + if (args.length == 2 && args[0].equalsIgnoreCase("effect")) { + List players = new ArrayList<>(Bukkit.getOnlinePlayers()); + Player player = players.get(0); + if (sender instanceof Player) { + player = (Player) sender; + } + String eventName = args[1]; + String userName = "观众" + RandomUtil.getRandomInt(0, 10); + String title = "§c" + eventName; + String subtitle = "§9" + GameUtil.hideName(userName); + player.sendTitle(title, subtitle, 10, 30, 10); + GiftEventHandler.SendHandLer(player, userName, eventName); + return true; + } } return false; } public static WheatWar inst(){return instance;} - public static Game getGame() {return game;} + public static GameManager getGameManager() {return gameManager;} } diff --git a/src/main/java/com/yaohun/wheatwar/data/GiftData.java b/src/main/java/com/yaohun/wheatwar/data/GiftData.java new file mode 100644 index 0000000..7b878c5 --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/data/GiftData.java @@ -0,0 +1,65 @@ +package com.yaohun.wheatwar.data; + +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import tools.GameUtil; + +public class GiftData { + private String giftName; + private String event; + private String comple_type; + private String sounds; + private int amount = 0; + + public GiftData(String giftName, FileConfiguration yml){ + String str = "礼物设置."+giftName+"."; + this.giftName = giftName; + this.comple_type = "NULL"; + if(yml.getString(str+"进度") != null){ + String[] stringSp = yml.getString(str+"进度").split("#"); + String tpye = stringSp[0]; + int a = Integer.parseInt(stringSp[1]); + this.comple_type = tpye; + this.amount = a; + } + this.sounds = yml.getString(str+"声音","NULL"); + this.event = yml.getString(str + "效果"); + if (comple_type.equalsIgnoreCase("NULL")) { + Bukkit.getConsoleSender().sendMessage("事件: " + this.event + " 条件: " + giftName+" 声音: "+this.sounds); + }else{ + if(comple_type.equalsIgnoreCase("take")){ + Bukkit.getConsoleSender().sendMessage("事件: " + this.event + " 条件: " + giftName+" 减"+amount+"赢"); + } else if(comple_type.equalsIgnoreCase("add")){ + Bukkit.getConsoleSender().sendMessage("事件: " + this.event + " 条件: " + giftName+" 加"+amount+"赢"); + } + } + } + public String getEvent() { + return event; + } + + public String getComple_Show() { + if(comple_type.equalsIgnoreCase("take")){ + return "§c赢-"+amount; + }else if(comple_type.equalsIgnoreCase("add")){ + return "§b赢+"+amount; + } + return ""; + } + + public void OutCompleEvent(int amount) { + int new_amount = this.amount * amount; + if(comple_type.equalsIgnoreCase("take")){ + // FarmingWar.getGame().effect_takeComplete(new_amount); + Bukkit.broadcastMessage("§c[系统]§a今日挑战进度: §c-"+new_amount); + } else if(comple_type.equalsIgnoreCase("add")){ + // FarmingWar.getGame().effect_addComplete(new_amount); + Bukkit.broadcastMessage("§c[系统]§a今日挑战进度: §b+"+new_amount); + } + } + public void OutPlaySoundsEvent() { + if(!sounds.equalsIgnoreCase("NULL")) { + GameUtil.sendAllSound(sounds); + } + } +} diff --git a/src/main/java/com/yaohun/wheatwar/data/LikeData.java b/src/main/java/com/yaohun/wheatwar/data/LikeData.java new file mode 100644 index 0000000..263547e --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/data/LikeData.java @@ -0,0 +1,48 @@ +package com.yaohun.wheatwar.data; + +import tools.GameUtil; + +public class LikeData { + + private String effectKey; + private int needAmount; + private int nowAmount; + private String sound; + + public LikeData(String effectKey, int needAmount, String sound){ + this.effectKey = effectKey; + this.needAmount = needAmount; + this.nowAmount = 0; + this.sound = sound; + } + + public String getEffectKey() { + return effectKey; + } + + public boolean meetTheQuantityRequirement(){ + if(nowAmount >= needAmount){ + return true; + } + return false; + } + + public int getNeedAmount() { + return needAmount; + } + + public int getNowAmount() { + return nowAmount; + } + + public void addNowAmount(int amount){ + setNowAmount(getNowAmount()+amount); + } + + public void setNowAmount(int nowAmount) { + this.nowAmount = nowAmount; + } + public void OutPlaySoundsEvent() { + GameUtil.sendAllSound(this.sound); + } +} diff --git a/src/main/java/com/yaohun/wheatwar/data/RepairGiftGui.java b/src/main/java/com/yaohun/wheatwar/data/RepairGiftGui.java new file mode 100644 index 0000000..45f6d8e --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/data/RepairGiftGui.java @@ -0,0 +1,255 @@ +package com.yaohun.wheatwar.data; + +import com.yaohun.wheatwar.WheatWar; +import com.yaohun.wheatwar.liveevent.GiftEventHandler; +import com.yaohun.wheatwar.util.GiftUtil; +import de.tr7zw.nbtapi.NBTItem; +import org.bukkit.Bukkit; +import org.bukkit.Material; +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 org.bukkit.inventory.meta.ItemMeta; +import tools.GameUtil; +import tools.RandomUtil; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class RepairGiftGui implements Listener { + + public static String invTitle = "我的世界整蛊 - 礼物触发管理"; + + public static String invTitle2 = "请选择触发礼物的数量"; + public static void OpenGui(Player p,ItemStack stack){ + Inventory inv = Bukkit.createInventory(null,18,invTitle2); + inv.setItem(0,getGiftStack(stack,1,1)); + inv.setItem(1,getGiftStack(stack,2,2)); + inv.setItem(2,getGiftStack(stack,3,3)); + inv.setItem(3,getGiftStack(stack,5,5)); + inv.setItem(4,getGiftStack(stack,6,6)); + inv.setItem(5,getGiftStack(stack,7,7)); + inv.setItem(6,getGiftStack(stack,8,8)); + inv.setItem(7,getGiftStack(stack,9,9)); + inv.setItem(8,getGiftStack(stack,10,10)); + inv.setItem(9,getGiftStack(stack,6,66)); + inv.setItem(10,getGiftStack(stack,18,188)); + inv.setItem(11,getGiftStack(stack,52,520)); + inv.setItem(12,getGiftStack(stack,64,1314)); + p.openInventory(inv); + } + + public static ItemStack getGiftStack(ItemStack stack,int itemAmount,int amount){ + ItemStack item = stack.clone(); + item.setAmount(itemAmount); + ItemMeta meta = item.getItemMeta(); + List lore = new ArrayList<>(); + lore.add(" "); + lore.add("§b§l★ §6点击 §7执行§e"+amount+"§7次"); + meta.setLore(lore); + item.setItemMeta(meta); + NBTItem nbti = new NBTItem(item); + nbti.setInteger("giftAmount",amount); + return nbti.getItem(); + } + + @EventHandler + public void onClick(InventoryClickEvent e){ + int rawSlot = e.getRawSlot(); + Player zhubo = (Player) e.getWhoClicked(); + Inventory inv = e.getInventory(); + if(e.getView().getTitle().equalsIgnoreCase(invTitle2)){ + e.setCancelled(true); + if(rawSlot < 0 || rawSlot >= 18) { return;} + zhubo.closeInventory(); + ItemStack stack = e.getCurrentItem(); + if (stack != null && stack.getType() != Material.AIR) { + NBTItem nbti = new NBTItem(stack); + if (nbti.hasKey("giftName")) { + String giftName = nbti.getString("giftName"); + String userName = "抖音" + RandomUtil.getRandomInt(1, 100); + int amount = nbti.getInteger("giftAmount"); + GiftData giftData = WheatWar.getGameManager().getGiftData(giftName); + giftData.OutCompleEvent(amount); + String hide_userName = GameUtil.hideName(userName); + String eventName = giftData.getEvent(); + if (GiftUtil.specialGiftEffectTriggers(zhubo, eventName, hide_userName, amount)) { + giftData.OutPlaySoundsEvent(); + return; + } + if (amount <= 1) { + String title = "§c" + eventName; + String subtitle = "§9" + hide_userName; + zhubo.sendTitle(title, subtitle, 0, 30, 10); + giftData.OutPlaySoundsEvent(); + GiftEventHandler.SendHandLer(zhubo, userName, eventName); + } else { + String title = "§c" + eventName + " x" + amount; + String subtitle = "§9" + hide_userName; + zhubo.sendTitle(title, subtitle, 0, 30, 10); + for (int i = 0; i < amount; i++) { + Bukkit.getScheduler().runTaskLater(WheatWar.inst(), () -> { + giftData.OutPlaySoundsEvent(); + GiftEventHandler.SendHandLer(zhubo, userName, eventName); + }, (long) i * 5); + } + } + } + } + } else if(e.getView().getTitle().equalsIgnoreCase(invTitle)){ + if(rawSlot >= 0) { + e.setCancelled(true); + ItemStack stack = e.getCurrentItem(); + if (stack != null && stack.getType() != Material.AIR) { + NBTItem nbti = new NBTItem(stack); + if (nbti.hasKey("giftName")) { + String giftName = nbti.getString("giftName"); + String userName = "抖音"+ RandomUtil.getRandomInt(1,100); + int amount = 1; + zhubo.closeInventory(); + if(WheatWar.getGameManager().getGiftData(giftName) == null){ + zhubo.sendTitle("§r", "§c未设置效果",10, 30, 10); + return; + } + if(e.getClick() == ClickType.SHIFT_RIGHT || e.getClick() == ClickType.SHIFT_LEFT){ + OpenGui(zhubo,stack); + return; + } + if (e.getClick() == ClickType.RIGHT) { + amount = 10; + } + GiftData giftData = WheatWar.getGameManager().getGiftData(giftName); + giftData.OutCompleEvent(amount); + String hide_userName = GameUtil.hideName(userName); + String eventName = giftData.getEvent(); + if(GiftUtil.specialGiftEffectTriggers(zhubo,eventName,hide_userName,amount)){ + giftData.OutPlaySoundsEvent(); + return; + } + if (amount <= 1) { + String title = "§c" + eventName; + String subtitle = "§9" + hide_userName; + zhubo.sendTitle(title, subtitle, 0, 30, 10); + giftData.OutPlaySoundsEvent(); + GiftEventHandler.SendHandLer(zhubo, userName, eventName); + } else { + String title = "§c" + eventName + " x" + amount; + String subtitle = "§9" + hide_userName; + zhubo.sendTitle(title, subtitle, 0, 30, 10); + for (int i = 0; i < amount; i++) { + Bukkit.getScheduler().runTaskLater(WheatWar.inst(), () -> { + giftData.OutPlaySoundsEvent(); + GiftEventHandler.SendHandLer(zhubo, userName, eventName); + }, (long) i * 5); + } + } + } + } + } + } + } + + public static void OpenGui(Player p){ + Inventory inv = Bukkit.createInventory(null,27,invTitle); + HashMap hashMap = new HashMap<>(); + hashMap.put("ONE礼挑一", stackGift("ONE礼挑一", 1)); + hashMap.put("Thuglife", stackGift("Thuglife", 2)); + hashMap.put("爱的纸鹤", stackGift("爱的纸鹤", 3)); + hashMap.put("爱你哟", stackGift("爱你哟", 4)); + hashMap.put("棒棒糖", stackGift("棒棒糖", 5)); + hashMap.put("比心", stackGift("比心", 6)); + hashMap.put("比心兔兔", stackGift("比心兔兔", 7)); + hashMap.put("称心如意", stackGift("称心如意", 8)); + hashMap.put("大啤酒", stackGift("大啤酒", 9)); + hashMap.put("点亮孤单", stackGift("点亮孤单", 10)); + hashMap.put("抖音", stackGift("抖音", 11)); + hashMap.put("抖音1号", stackGift("抖音1号", 12)); + hashMap.put("多喝热水", stackGift("多喝热水", 13)); + hashMap.put("繁花秘语", stackGift("繁花秘语", 14)); + hashMap.put("粉丝团灯牌", stackGift("粉丝团灯牌", 15)); + hashMap.put("光之祝福", stackGift("光之祝福", 16)); + hashMap.put("豪华邮轮", stackGift("豪华邮轮", 17)); + hashMap.put("花开烂漫", stackGift("花开烂漫", 18)); + hashMap.put("花落长亭", stackGift("花落长亭", 19)); + hashMap.put("环球旅行车", stackGift("环球旅行车", 20)); + hashMap.put("黄桃罐头", stackGift("黄桃罐头", 21)); + hashMap.put("加油鸭", stackGift("加油鸭", 22)); + hashMap.put("嘉年华", stackGift("嘉年华", 23)); + hashMap.put("浪漫花火", stackGift("浪漫花火", 24)); + hashMap.put("礼花筒", stackGift("礼花筒", 25)); + hashMap.put("龙抬头", stackGift("龙抬头", 26)); + hashMap.put("玫瑰", stackGift("玫瑰", 27)); + hashMap.put("你最好看", stackGift("你最好看", 28)); + hashMap.put("捏捏小脸", stackGift("捏捏小脸", 29)); + hashMap.put("跑车", stackGift("跑车", 30)); + hashMap.put("保时捷", stackGift("保时捷", 30)); + hashMap.put("怦然心动", stackGift("怦然心动", 31)); + hashMap.put("亲吻", stackGift("亲吻", 32)); + hashMap.put("拳拳出击", stackGift("拳拳出击", 33)); + hashMap.put("热气球", stackGift("热气球", 34)); + hashMap.put("人气票", stackGift("人气票", 35)); + hashMap.put("日出相伴", stackGift("日出相伴", 36)); + hashMap.put("闪耀星辰", stackGift("闪耀星辰", 37)); + hashMap.put("私人飞机", stackGift("私人飞机", 38)); + hashMap.put("送你花花", stackGift("送你花花", 39)); + hashMap.put("万象烟花", stackGift("万象烟花", 40)); + hashMap.put("为你闪耀", stackGift("为你闪耀", 41)); + hashMap.put("为你举牌", stackGift("为你举牌", 42)); + hashMap.put("鲜花", stackGift("鲜花", 43)); + hashMap.put("小心心", stackGift("小心心", 44)); + hashMap.put("星星点灯", stackGift("星星点灯", 45)); + hashMap.put("一点心意", stackGift("一点心意", 46)); + hashMap.put("一束花开", stackGift("一束花开", 47)); + hashMap.put("荧光棒", stackGift("荧光棒", 48)); + hashMap.put("游戏手柄", stackGift("游戏手柄", 49)); + hashMap.put("掌上明珠", stackGift("掌上明珠", 50)); + hashMap.put("真爱玫瑰", stackGift("真爱玫瑰", 51)); + hashMap.put("真的爱你", stackGift("真的爱你", 52)); + hashMap.put("直升机", stackGift("直升机", 53)); + hashMap.put("纸短情长", stackGift("纸短情长", 54)); + hashMap.put("蝶 · 比翼鸟", stackGift("蝶 · 比翼鸟", 56)); + hashMap.put("永生花", stackGift("永生花", 57)); + HashMap giftData = WheatWar.getGameManager().getGiftDataMap(); + for (String giftName : giftData.keySet()){ + if(hashMap.get(giftName) != null){ + inv.addItem(hashMap.get(giftName)); + }else{ + inv.addItem(stackGift(giftName,-1)); + } + } + p.openInventory(inv); + } + + public static ItemStack stackGift(String name,int model_id) { + ItemStack item = new ItemStack(Material.PAPER); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("§d§l★ §e礼物: " + name); + List lore = new ArrayList<>(); + if (WheatWar.getGameManager().getGiftData(name) != null) { + GiftData giftData = WheatWar.getGameManager().getGiftData(name); + lore.add("§7触发效果: §a" + giftData.getEvent() + " " + giftData.getComple_Show()); + } else { + lore.add("§7触发效果: §c无"); + } + lore.add(" "); + lore.add("§b§l★ §6左键点击 §7召唤1次"); + lore.add("§b§l★ §6右键点击 §7召唤10次"); + lore.add("§b§l★ §6SHIFT+点击 §7自定义数量"); + meta.setLore(lore); + if (model_id >= 1){ + meta.setCustomModelData(model_id); + }else{ + item.setType(Material.DIAMOND); + } + item.setItemMeta(meta); + NBTItem nbti = new NBTItem(item); + nbti.setString("giftName",name); + item = nbti.getItem(); + return item; + } +} diff --git a/src/main/java/com/yaohun/wheatwar/effect/SummonTheBombsTNT.java b/src/main/java/com/yaohun/wheatwar/effect/SummonTheBombsTNT.java new file mode 100644 index 0000000..74722ca --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/effect/SummonTheBombsTNT.java @@ -0,0 +1,73 @@ +package com.yaohun.wheatwar.effect; + +import com.yaohun.wheatwar.WheatWar; +import com.yaohun.wheatwar.game.Game; +import com.yaohun.wheatwar.listener.GameListener; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.*; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Vector; +import tools.CDTimeAPI; + +import java.util.HashMap; +import java.util.UUID; + +public class SummonTheBombsTNT { + + public static void apply(Game game, Player zhubo, String userName, int amount) { + if (!game.isStarted()) { + return; + } + // 获取主播的uuid + UUID uuid = zhubo.getUniqueId(); + // 计时器key + String timepieceKey = "SummonBombsTNTEffect"; + startTimepieceEvent(game,zhubo,userName,timepieceKey); + if(CDTimeAPI.isCD(uuid,timepieceKey)){ + long newTime = CDTimeAPI.getCD(uuid,timepieceKey) + (195L * amount); + CDTimeAPI.setPlayerCD(uuid,timepieceKey,newTime); + } else { + CDTimeAPI.setPlayerCD(uuid,timepieceKey,195L * amount); + } + } + + public static void startTimepieceEvent(Game game, Player zhubo, String userName, String timepieceKey) { + if (CDTimeAPI.isCD(zhubo.getUniqueId(), timepieceKey)) { + return; + } + BukkitTask task = new BukkitRunnable() { + @Override + public void run() { + if (!CDTimeAPI.isCD(zhubo.getUniqueId(), timepieceKey)) { + cancel(); + return; + } + zhubo.playSound(zhubo.getLocation(), Sound.ENTITY_CHICKEN_EGG,1,1); + spawnMobs(game); + } + }.runTaskTimer(WheatWar.inst(), 0L, 4L); + game.addTasks(task); + } + + public static void spawnMobs(Game game) { + for (Entity entity : game.getWorld().getEntities()){ + if (entity instanceof ZombieVillager || entity instanceof Zombie) { + if(entity.getPassengers().size() <= 0) { + // 在僵尸头上生成TNT + TNTPrimed tnt = (TNTPrimed) entity.getWorld().spawn(entity.getLocation().add(0, 2, 0), TNTPrimed.class); + GameListener.whiteListTNT.add(tnt.getUniqueId()); + // 设置爆炸范围和伤害监听器 + tnt.setYield(2.0F); // 爆炸范围(默认值为 4.0F) + tnt.setIsIncendiary(false); // 如果需要爆炸引起火焰,可设置为 true + tnt.setFuseTicks(40); // 设置2秒后爆炸(1秒=20 ticks) + // 将TNT附加在僵尸头上 + entity.addPassenger(tnt); + break; + } + } + } + } +} diff --git a/src/main/java/com/yaohun/wheatwar/effect/SummonTheCow.java b/src/main/java/com/yaohun/wheatwar/effect/SummonTheSheep.java similarity index 76% rename from src/main/java/com/yaohun/wheatwar/effect/SummonTheCow.java rename to src/main/java/com/yaohun/wheatwar/effect/SummonTheSheep.java index d88197c..53176d1 100644 --- a/src/main/java/com/yaohun/wheatwar/effect/SummonTheCow.java +++ b/src/main/java/com/yaohun/wheatwar/effect/SummonTheSheep.java @@ -2,28 +2,24 @@ package com.yaohun.wheatwar.effect; import com.yaohun.wheatwar.WheatWar; import com.yaohun.wheatwar.game.Game; -import net.minecraft.world.entity.EntityInsentient; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Particle; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.data.Ageable; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_18_R2.entity.CraftLivingEntity; import org.bukkit.entity.Cow; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; -import org.bukkit.entity.Villager; +import org.bukkit.entity.Sheep; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.Vector; import tools.CDTimeAPI; +import tools.RandomUtil; import java.util.HashMap; import java.util.UUID; -public class SummonTheCow { +public class SummonTheSheep { public static void apply(Game game, Player zhubo, String userName, int amount) { if (!game.isStarted()) { @@ -63,7 +59,9 @@ public class SummonTheCow { public static void spawnMobs(Game game,String userName) { Location location = game.getFarmlandRandom().clone().add(0,1,0); - Cow entity = (Cow) location.getWorld().spawnEntity(location, EntityType.COW); + Sheep entity = (Sheep) location.getWorld().spawnEntity(location, EntityType.SHEEP); + DyeColor dyeColor = DyeColor.values()[RandomUtil.getRandomInt(0, 6)]; + entity.setColor(dyeColor); entity.setCollidable(false); entity.setCustomNameVisible(true); entity.setCustomName("§c" + userName); @@ -102,7 +100,6 @@ public class SummonTheCow { } if(amount <= 0){ entity.damage(999.0D); - cancel(); return; } // 检测村民是否存在任务 若存在则抵达目标方块时触发消息 ”已完成任务“ @@ -111,22 +108,28 @@ public class SummonTheCow { if (locationMap.containsKey(uuid)) { Location location1 = locationMap.get(uuid); if (entity.getLocation().distance(location1) <= 1.0) { - amount--; + if(locationMap.size() > 10) { + amount--; + } //到达目标小麦位置 locationMap.remove(uuid); - // 获取这个坐标的方块数据是未种小麦还是未成熟小麦 - Block block = location.getWorld().getBlockAt(location1); - if(!block.getType().equals(Material.AIR)) { - if (block.getType().equals(Material.WHEAT)) { - BlockData blockData = block.getBlockData(); - if (blockData instanceof Ageable ageable) { - if (ageable.getAge() == 7) { - ageable.setAge(3); - block.setBlockData(ageable); - } else { - block.setType(Material.AIR); + for (int x = -1; x <= 1; x++) { + for (int z = -1; z <= 1; z++) { + // 获取这个坐标的方块数据是未种小麦还是未成熟小麦 + Block block = location.getWorld().getBlockAt(location1.clone().add(x, 0, z)); + if (!block.getType().equals(Material.AIR)) { + if (block.getType().equals(Material.WHEAT)) { + BlockData blockData = block.getBlockData(); + if (blockData instanceof Ageable ageable) { + if (ageable.getAge() == 7) { + ageable.setAge(3); + block.setBlockData(ageable); + } else { + block.setType(Material.AIR); + } + block.getWorld().spawnParticle(Particle.VILLAGER_ANGRY, block.getLocation().add(0.5, 1, 0.5), 5, 0.5, 0.5, 0.5, 0.1); + } } - block.getWorld().spawnParticle(Particle.VILLAGER_ANGRY, block.getLocation().add(0.5, 1, 0.5), 5, 0.5, 0.5, 0.5, 0.1); } } } @@ -143,8 +146,6 @@ public class SummonTheCow { cancel(); return; } - EntityInsentient nmsEntity = (EntityInsentient) ((CraftLivingEntity) entity).getHandle(); - nmsEntity.D().a(location1.getX(), location1.getY(), location1.getZ(), 1.0F); locationMap.put(uuid, location1); entity.setCustomName("§c" + userName+" [§6"+amount+"§c]"); } diff --git a/src/main/java/com/yaohun/wheatwar/effect/SummonTheSheepPro.java b/src/main/java/com/yaohun/wheatwar/effect/SummonTheSheepPro.java new file mode 100644 index 0000000..5c0fa43 --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/effect/SummonTheSheepPro.java @@ -0,0 +1,159 @@ +package com.yaohun.wheatwar.effect; + +import com.yaohun.wheatwar.WheatWar; +import com.yaohun.wheatwar.game.Game; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.block.data.Ageable; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.Sheep; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Vector; +import tools.CDTimeAPI; +import tools.RandomUtil; + +import java.util.HashMap; +import java.util.UUID; + +public class SummonTheSheepPro { + + public static void apply(Game game, Player zhubo, String userName, int amount) { + if (!game.isStarted()) { + return; + } + // 获取主播的uuid + UUID uuid = zhubo.getUniqueId(); + // 计时器key + String timepieceKey = "SummonSheepProEffect"; + startTimepieceEvent(game,zhubo,userName,timepieceKey); + if(CDTimeAPI.isCD(uuid,timepieceKey)){ + long newTime = CDTimeAPI.getCD(uuid,timepieceKey) + (95L * amount); + CDTimeAPI.setPlayerCD(uuid,timepieceKey,newTime); + } else { + CDTimeAPI.setPlayerCD(uuid,timepieceKey,95L * amount); + } + } + + public static void startTimepieceEvent(Game game, Player zhubo, String userName, String timepieceKey) { + if (CDTimeAPI.isCD(zhubo.getUniqueId(), timepieceKey)) { + return; + } + BukkitTask task = new BukkitRunnable() { + @Override + public void run() { + if (!CDTimeAPI.isCD(zhubo.getUniqueId(), timepieceKey)) { + cancel(); + return; + } + spawnMobs(game,userName); + } + }.runTaskTimer(WheatWar.inst(), 0L, 2L); + game.addTasks(task); + } + + public static HashMap locationMap = new HashMap<>(); // 村民 正在执行的任务 需前往的地方 + + public static void spawnMobs(Game game,String userName) { + Location location = game.getFarmlandRandom().clone().add(0,1,0); + Sheep entity = (Sheep) location.getWorld().spawnEntity(location, EntityType.SHEEP); + DyeColor dyeColor = DyeColor.values()[14]; + entity.setColor(dyeColor); + entity.setCollidable(false); + entity.setCustomNameVisible(true); + entity.setCustomName("§c" + userName); + Location centralPoint = game.getCentralPoint(); + // 计算方向 + Vector direction = centralPoint.toVector().subtract(location.toVector()).normalize(); + // 设置初速度 + double initialVerticalVelocity = 0.4; // 向上抛的速度 + double horizontalVelocity = 1.35; // 控制水平抛出的力度 + // 创建一个向量,包括水平和垂直方向的速度 + Vector velocity = direction.multiply(horizontalVelocity).setY(initialVerticalVelocity); + entity.setVelocity(velocity); + new BukkitRunnable() { + private int i = 0; + @Override + public void run() { + if(i >= 15){ + cancel(); + return; + } + game.getWorld().spawnParticle(Particle.ELECTRIC_SPARK,entity.getLocation().clone().add(0,1,0),2); + //game.getWorld().spawnParticle(Particle.VILLAGER_HAPPY,entity.getLocation().clone().add(0,1,0),2); + i++; + } + }.runTaskTimer(WheatWar.inst(),0,1L); + new BukkitRunnable() { + private int color = 0; + private int amount = 50; + @Override + public void run() { + UUID uuid = entity.getUniqueId(); + // 若村民死亡则计时器种植并结束村民任务 + if (entity.isDead()) { + locationMap.remove(uuid); + cancel(); + return; + } + if(amount <= 0){ + entity.damage(999.0D); + return; + } + // 检测村民是否存在任务 若存在则抵达目标方块时触发消息 ”已完成任务“ + // + // 若村民没有任务则获取坐标后通过NMS设置村民寻路目标坐标 并put添加任务 + if (locationMap.containsKey(uuid)) { + Location location1 = locationMap.get(uuid); + if (entity.getLocation().distance(location1) <= 1.0) { + amount--; + //到达目标小麦位置 + locationMap.remove(uuid); + for (int x = -2; x <= 2; x++) { + for (int z = -2; z <= 2; z++) { + // 获取这个坐标的方块数据是未种小麦还是未成熟小麦 + Block block = location.getWorld().getBlockAt(location1.clone().add(x, 0, z)); + if (!block.getType().equals(Material.AIR)) { + if (block.getType().equals(Material.WHEAT)) { + BlockData blockData = block.getBlockData(); + if (blockData instanceof Ageable ageable) { + if (ageable.getAge() == 7) { + ageable.setAge(3); + block.setBlockData(ageable); + } else { + block.setType(Material.AIR); + } + block.getWorld().spawnParticle(Particle.VILLAGER_ANGRY, block.getLocation().add(0.5, 1, 0.5), 5, 0.5, 0.5, 0.5, 0.1); + } + } + } + } + } + } else { + Vector direction = location1.toVector().subtract(entity.getLocation().toVector()).normalize(); + Vector velocity = direction.multiply(0.45); + entity.setVelocity(velocity); + } + } else { + // 优先寻找未种小麦的地 已种小麦未成熟的地 坐标 + Location location1 = game.getPriorityClearLocation(); + if(location1 == null){ + Bukkit.broadcastMessage("!游戏结束!路人获胜!"); + cancel(); + return; + } + locationMap.put(uuid, location1); + entity.setCustomName("§c" + userName+" [§6"+amount+"§c]"); + } + if(color > 5) { + DyeColor dyeColor = DyeColor.values()[RandomUtil.getRandomInt(7, 15)]; + entity.setColor(dyeColor); + color -= 5; + } + color++; + } + }.runTaskTimer(WheatWar.inst(), 20L, 1L); + } +} diff --git a/src/main/java/com/yaohun/wheatwar/effect/SummonTheTNTRain.java b/src/main/java/com/yaohun/wheatwar/effect/SummonTheTNTRain.java new file mode 100644 index 0000000..3b3117b --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/effect/SummonTheTNTRain.java @@ -0,0 +1,86 @@ +package com.yaohun.wheatwar.effect; + +import com.yaohun.wheatwar.WheatWar; +import com.yaohun.wheatwar.game.Game; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.Sound; +import org.bukkit.entity.*; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Vector; +import tools.CDTimeAPI; +import tools.RandomUtil; + +import java.util.UUID; + +public class SummonTheTNTRain { + + public static void apply(Game game, Player zhubo, String userName, int amount) { + if (!game.isStarted()) { + return; + } + // 获取主播的uuid + UUID uuid = zhubo.getUniqueId(); + // 计时器key + String timepieceKey = "SummonRainTNTEffect"; + startTimepieceEvent(game,zhubo,userName,timepieceKey); + if(CDTimeAPI.isCD(uuid,timepieceKey)){ + long newTime = CDTimeAPI.getCD(uuid,timepieceKey) + (195L * amount); + CDTimeAPI.setPlayerCD(uuid,timepieceKey,newTime); + } else { + CDTimeAPI.setPlayerCD(uuid,timepieceKey,195L * amount); + } + } + + public static void startTimepieceEvent(Game game, Player zhubo, String userName, String timepieceKey) { + if (CDTimeAPI.isCD(zhubo.getUniqueId(), timepieceKey)) { + return; + } + BukkitTask task = new BukkitRunnable() { + @Override + public void run() { + if (!CDTimeAPI.isCD(zhubo.getUniqueId(), timepieceKey)) { + cancel(); + return; + } + spawnMobs(game); + spawnMobs(game); + if(RandomUtil.getRandomInt(1,100) >= 70) { + zhubo.playSound(zhubo.getLocation(), "youbom", 1, 1); + } + } + }.runTaskTimer(WheatWar.inst(), 0L, 5L); + game.addTasks(task); + } + + public static void spawnMobs(Game game) { + Location location = game.getFarmlandRandom().clone().add(0,1,0); + TNTPrimed entity = (TNTPrimed) game.getWorld().spawn(location, TNTPrimed.class); + // 设置爆炸范围和伤害监听器 + entity.setYield(3.0F); // 爆炸范围(默认值为 4.0F) + entity.setIsIncendiary(false); // 如果需要爆炸引起火焰,可设置为 true + entity.setFuseTicks(40); // 设置2秒后爆炸(1秒=20 ticks) + Location centralPoint = game.getCentralPoint(); + // 计算方向 + Vector direction = centralPoint.toVector().subtract(location.toVector()).normalize(); + // 设置初速度 + double initialVerticalVelocity = 0.4; // 向上抛的速度 + double horizontalVelocity = 1.35; // 控制水平抛出的力度 + // 创建一个向量,包括水平和垂直方向的速度 + Vector velocity = direction.multiply(horizontalVelocity).setY(initialVerticalVelocity); + entity.setVelocity(velocity); + new BukkitRunnable() { + private int i = 0; + @Override + public void run() { + if(i >= 15){ + cancel(); + return; + } + game.getWorld().spawnParticle(Particle.ELECTRIC_SPARK,entity.getLocation().clone().add(0,1,0),2); + i++; + } + }.runTaskTimer(WheatWar.inst(),0,1L); + } +} diff --git a/src/main/java/com/yaohun/wheatwar/effect/SummonTheVillager.java b/src/main/java/com/yaohun/wheatwar/effect/SummonTheVillager.java index b18b65a..a4e45b2 100644 --- a/src/main/java/com/yaohun/wheatwar/effect/SummonTheVillager.java +++ b/src/main/java/com/yaohun/wheatwar/effect/SummonTheVillager.java @@ -2,12 +2,10 @@ package com.yaohun.wheatwar.effect; import com.yaohun.wheatwar.WheatWar; import com.yaohun.wheatwar.game.Game; -import net.minecraft.world.entity.EntityInsentient; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.data.Ageable; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_18_R2.entity.CraftLivingEntity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Villager; @@ -100,7 +98,6 @@ public class SummonTheVillager { } if(amount <= 0){ entity.damage(999.0D); - cancel(); return; } // 检测村民是否存在任务 若存在则抵达目标方块时触发消息 ”已完成任务“ @@ -109,26 +106,31 @@ public class SummonTheVillager { if (locationMap.containsKey(uuid)) { Location location1 = locationMap.get(uuid); if (entity.getLocation().distance(location1) <= 1.0) { - amount--; + if(locationMap.size() > 15) { + amount--; + } //到达目标小麦位置 locationMap.remove(uuid); - // 获取这个坐标的方块数据是未种小麦还是未成熟小麦 - Block block = location.getWorld().getBlockAt(location1); - if(block.getType().equals(Material.AIR)){ - block.setType(Material.WHEAT); - BlockData blockData = block.getBlockData(); - if (blockData instanceof Ageable ageable) { - ageable.setAge(3); - block.setBlockData(ageable); + for (int x = -1; x <= 1; x++) { + for (int z = -1; z <= 1; z++) { + Block block = location.getWorld().getBlockAt(location1.clone().add(x, 0, z)); + if(block.getType().equals(Material.AIR)){ + block.setType(Material.WHEAT); + BlockData blockData = block.getBlockData(); + if (blockData instanceof Ageable ageable) { + ageable.setAge(3); + block.setBlockData(ageable); + } + block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, block.getLocation().add(0.5, 1, 0.5), 5, 0.5, 0.5, 0.5, 0.1); + }else if(block.getType().equals(Material.WHEAT)){ + BlockData blockData = block.getBlockData(); + if (blockData instanceof Ageable ageable) { + ageable.setAge(7); + block.setBlockData(ageable); + } + block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, block.getLocation().add(0.5, 1, 0.5), 5, 0.5, 0.5, 0.5, 0.1); + } } - block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, block.getLocation().add(0.5, 1, 0.5), 5, 0.5, 0.5, 0.5, 0.1); - }else if(block.getType().equals(Material.WHEAT)){ - BlockData blockData = block.getBlockData(); - if (blockData instanceof Ageable ageable) { - ageable.setAge(7); - block.setBlockData(ageable); - } - block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, block.getLocation().add(0.5, 1, 0.5), 5, 0.5, 0.5, 0.5, 0.1); } } else { Vector direction = location1.toVector().subtract(entity.getLocation().toVector()).normalize(); @@ -143,11 +145,10 @@ public class SummonTheVillager { cancel(); return; } - net.minecraft.world.entity.EntityInsentient nmsEntity = (EntityInsentient) ((CraftLivingEntity) entity).getHandle(); - nmsEntity.D().a(location1.getX(), location1.getY(), location1.getZ(), 1.0F); locationMap.put(uuid, location1); entity.setCustomName("§b" + userName+"[§6"+amount+"§b]"); } + entity.setProfession(Villager.Profession.FARMER); } }.runTaskTimer(WheatWar.inst(), 20L, 1L); } diff --git a/src/main/java/com/yaohun/wheatwar/effect/SummonTheVillagerPro.java b/src/main/java/com/yaohun/wheatwar/effect/SummonTheVillagerPro.java new file mode 100644 index 0000000..776e9dd --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/effect/SummonTheVillagerPro.java @@ -0,0 +1,155 @@ +package com.yaohun.wheatwar.effect; + +import com.yaohun.wheatwar.WheatWar; +import com.yaohun.wheatwar.game.Game; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.block.Block; +import org.bukkit.block.data.Ageable; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.Villager; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Vector; +import tools.CDTimeAPI; + +import java.util.HashMap; +import java.util.UUID; + +public class SummonTheVillagerPro { + + public static void apply(Game game, Player zhubo, String userName, int amount) { + if (!game.isStarted()) { + return; + } + // 获取主播的uuid + UUID uuid = zhubo.getUniqueId(); + // 计时器key + String timepieceKey = "SummonVillagerProEffect"; + startTimepieceEvent(game,zhubo,userName,timepieceKey); + if(CDTimeAPI.isCD(uuid,timepieceKey)){ + long newTime = CDTimeAPI.getCD(uuid,timepieceKey) + (95L * amount); + CDTimeAPI.setPlayerCD(uuid,timepieceKey,newTime); + } else { + CDTimeAPI.setPlayerCD(uuid,timepieceKey,95L * amount); + } + } + + public static void startTimepieceEvent(Game game, Player zhubo, String userName, String timepieceKey) { + if (CDTimeAPI.isCD(zhubo.getUniqueId(), timepieceKey)) { + return; + } + BukkitTask task = new BukkitRunnable() { + @Override + public void run() { + if (!CDTimeAPI.isCD(zhubo.getUniqueId(), timepieceKey)) { + cancel(); + return; + } + spawnMobs(game,userName); + } + }.runTaskTimer(WheatWar.inst(), 0L, 2L); + game.addTasks(task); + } + + public static HashMap locationMap = new HashMap<>(); // 村民 正在执行的任务 需前往的地方 + + public static void spawnMobs(Game game,String userName) { + Location location = game.getFarmlandRandom().clone().add(0,1,0); + Villager entity = (Villager) location.getWorld().spawnEntity(location, EntityType.VILLAGER); + entity.setCollidable(false); + entity.setCustomNameVisible(true); + entity.setCustomName("§b" + userName); + entity.setHealth(2); + Location centralPoint = game.getCentralPoint(); + // 计算方向 + Vector direction = centralPoint.toVector().subtract(location.toVector()).normalize(); + // 设置初速度 + double initialVerticalVelocity = 0.4; // 向上抛的速度 + double horizontalVelocity = 1.35; // 控制水平抛出的力度 + // 创建一个向量,包括水平和垂直方向的速度 + Vector velocity = direction.multiply(horizontalVelocity).setY(initialVerticalVelocity); + entity.setVelocity(velocity); + new BukkitRunnable() { + private int i = 0; + @Override + public void run() { + if(i >= 15){ + cancel(); + return; + } + game.getWorld().spawnParticle(Particle.ELECTRIC_SPARK,entity.getLocation().clone().add(0,1,0),2); + i++; + } + }.runTaskTimer(WheatWar.inst(),0,1L); + new BukkitRunnable() { + private int amount = 50; + @Override + public void run() { + UUID uuid = entity.getUniqueId(); + // 若村民死亡则计时器种植并结束村民任务 + if (entity.isDead()) { + locationMap.remove(uuid); + cancel(); + return; + } + if(amount <= 0){ + entity.damage(999.0D); + return; + } + // 检测村民是否存在任务 若存在则抵达目标方块时触发消息 ”已完成任务“ + // + // 若村民没有任务则获取坐标后通过NMS设置村民寻路目标坐标 并put添加任务 + if (locationMap.containsKey(uuid)) { + Location location1 = locationMap.get(uuid); + if (entity.getLocation().distance(location1) <= 1.0) { + amount--; + //到达目标小麦位置 + locationMap.remove(uuid); + for (int x = -2; x <= 2; x++) { + for (int z = -2; z <= 2; z++) { + // 获取这个坐标的方块数据是未种小麦还是未成熟小麦 + Block block = location.getWorld().getBlockAt(location1.clone().add(x, 0, z)); + if (block.getType().equals(Material.AIR)) { + block.setType(Material.WHEAT); + BlockData blockData = block.getBlockData(); + if (blockData instanceof Ageable ageable) { + ageable.setAge(3); + block.setBlockData(ageable); + } + block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, block.getLocation().add(0.5, 1, 0.5), 5, 0.5, 0.5, 0.5, 0.1); + } else if (block.getType().equals(Material.WHEAT)) { + BlockData blockData = block.getBlockData(); + if (blockData instanceof Ageable ageable) { + ageable.setAge(7); + block.setBlockData(ageable); + } + block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, block.getLocation().add(0.5, 1, 0.5), 5, 0.5, 0.5, 0.5, 0.1); + } + } + } + } else { + Vector direction = location1.toVector().subtract(entity.getLocation().toVector()).normalize(); + Vector velocity = direction.multiply(0.45); + entity.setVelocity(velocity); + } + } else { + // 优先寻找未种小麦的地 已种小麦未成熟的地 坐标 + Location location1 = game.getPriorityRepairLocation(); + if(location1 == null){ + Bukkit.broadcastMessage("!游戏结束!村民获胜!"); + cancel(); + return; + } + locationMap.put(uuid, location1); + entity.setCustomName("§b" + userName+"[§6"+amount+"§b]"); + } + entity.setProfession(Villager.Profession.ARMORER); + } + }.runTaskTimer(WheatWar.inst(), 20L, 1L); + } +} diff --git a/src/main/java/com/yaohun/wheatwar/effect/SummonTheZombie.java b/src/main/java/com/yaohun/wheatwar/effect/SummonTheZombie.java index b594f09..f9af47a 100644 --- a/src/main/java/com/yaohun/wheatwar/effect/SummonTheZombie.java +++ b/src/main/java/com/yaohun/wheatwar/effect/SummonTheZombie.java @@ -2,7 +2,6 @@ package com.yaohun.wheatwar.effect; import com.yaohun.wheatwar.WheatWar; import com.yaohun.wheatwar.game.Game; -import net.minecraft.world.entity.EntityInsentient; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -11,7 +10,6 @@ import org.bukkit.attribute.Attribute; import org.bukkit.block.Block; import org.bukkit.block.data.Ageable; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_18_R2.entity.CraftLivingEntity; import org.bukkit.entity.*; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; diff --git a/src/main/java/com/yaohun/wheatwar/game/Game.java b/src/main/java/com/yaohun/wheatwar/game/Game.java index 2e2b793..f838541 100644 --- a/src/main/java/com/yaohun/wheatwar/game/Game.java +++ b/src/main/java/com/yaohun/wheatwar/game/Game.java @@ -1,6 +1,8 @@ package com.yaohun.wheatwar.game; +import com.io.yutian.pixelliveengine.api.PixelLiveEngineAPI; import com.yaohun.wheatwar.WheatWar; +import com.yaohun.wheatwar.data.LikeData; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.data.Ageable; @@ -8,15 +10,17 @@ import org.bukkit.block.data.BlockData; import org.bukkit.boss.BarColor; import org.bukkit.boss.BarStyle; import org.bukkit.boss.BossBar; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import tools.BossBarUtil; +import tools.StackUtil; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Random; +import java.util.*; public class Game { @@ -24,17 +28,20 @@ public class Game { private Region region; private BossBar bossBar1; private BossBar bossBar2; + private BossBar bossBar3; private boolean started = false; private Location centralPoint; private List wheatList = new ArrayList<>(); private List tasks = new ArrayList<>(); + // 狂暴模式 public Game(){ this.world = Bukkit.getWorld("world"); this.region = new Region(world,new Point(-30,68,-33),new Point(32,68,29)); this.centralPoint = new Location(world,1,72,-2); this.bossBar1 = Bukkit.createBossBar("今日挑战进度", BarColor.WHITE, BarStyle.SEGMENTED_10); this.bossBar2 = Bukkit.createBossBar("补种进度", BarColor.GREEN, BarStyle.SEGMENTED_20); - loadGameMapFarmland(); + this.bossBar3 = Bukkit.createBossBar("点赞累积数量", BarColor.WHITE, BarStyle.SEGMENTED_10); + initGameMapFarmland(); } private void updateCompleteWheatGoalBossBar() { @@ -47,6 +54,26 @@ public class Game { BossBarUtil.setBarProgress(bossBar2,d); } + public void updateDianZanBossBar() { + int dz = 0; + int needDz = 300; + String eventName = ""; + HashMap likeDataMap = WheatWar.getGameManager().getLikeDataMap(); + for (String key : likeDataMap.keySet()){ + LikeData likeData = likeDataMap.get(key); + dz = likeData.getNowAmount(); + needDz = likeData.getNeedAmount(); + eventName = likeData.getEffectKey(); + break; + } + int dz_need = needDz; + double dz1 = (double) dz / (double) dz_need; + // String bossTitle = "§6"+eventName+"(戳一戳): §d"+dz+"§f/§c"+dz_need; + String bossTitle = "§9§l"+eventName+"§6: §d"+dz+"§f/§c"+dz_need; + bossBar3.setTitle(bossTitle); + BossBarUtil.setBarColor(bossBar3,dz1); + BossBarUtil.setBarProgress(bossBar3,dz1); + } public void start(){ @@ -58,16 +85,53 @@ public class Game { @Override public void run() { updateCompleteWheatGoalBossBar(); + updateDianZanBossBar(); } }.runTaskTimer(WheatWar.inst(), 0L, 5L)); } + public int getWorldEntityAmount(EntityType entityType){ + int amount = 0; + for (Entity entity : this.world.getEntities()){ + if(entity.getType().equals(entityType)){ + amount++; + } + } + return amount; + } + public void initPlayerData(Player player) { player.setArrowCooldown(6000); player.setGameMode(GameMode.SURVIVAL); player.setAllowFlight(true); // bossBar1.addPlayer(player); bossBar2.addPlayer(player); + bossBar3.addPlayer(player); + initPlayerBackpack(player); + /*tasks.add(new BukkitRunnable() { + @Override + public void run() { + if(player == null || !player.isOnline()){ + cancel(); + return; + } + refreshHudMessage(player); + } + }.runTaskTimer(WheatWar.inst(), 0L, 5L));*/ + } + public void refreshHudMessage(Player player){ + PixelLiveEngineAPI.clearHudText(); + List stringList = new ArrayList<>(); + stringList.add("§c小羊哥: §f"+getWorldEntityAmount(EntityType.SHEEP)+"只"); + stringList.add("§b村民: §f"+getWorldEntityAmount(EntityType.VILLAGER)+"名"); + PixelLiveEngineAPI.setHudText(stringList); + } + public void initPlayerBackpack(Player player){ + Inventory inv = player.getInventory(); + inv.setItem(0, StackUtil.diamondSword()); + inv.setItem(1,StackUtil.trident()); + inv.setItem(2,new ItemStack(Material.WHEAT_SEEDS,32)); + inv.setItem(3,new ItemStack(Material.BONE_MEAL,32)); } @@ -186,7 +250,15 @@ public class Game { this.tasks.add(task); } - public void loadGameMapFarmland(){ + public void initGameMapFarmland(){ + this.world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false); + this.world.setGameRule(GameRule.DO_WEATHER_CYCLE, false); + this.world.setGameRule(GameRule.DO_MOB_SPAWNING, false); + this.world.setGameRule(GameRule.DO_MOB_LOOT, false); + this.world.setGameRule(GameRule.MOB_GRIEFING, false); + this.world.setGameRule(GameRule.RANDOM_TICK_SPEED, 0); + this.world.setTime(4500); + this.world.setDifficulty(Difficulty.NORMAL); List locationList = new ArrayList<>(); for (int y = (int) Math.floor(67); y <= 67; y++) { for (int x = (int) Math.floor(region.getMin().getX()); x <= region.getMax().getX(); x++) { diff --git a/src/main/java/com/yaohun/wheatwar/listener/GameListener.java b/src/main/java/com/yaohun/wheatwar/listener/GameListener.java index 253ca71..485ece9 100644 --- a/src/main/java/com/yaohun/wheatwar/listener/GameListener.java +++ b/src/main/java/com/yaohun/wheatwar/listener/GameListener.java @@ -1,22 +1,44 @@ package com.yaohun.wheatwar.listener; +import com.yaohun.wheatwar.WheatWar; import com.yaohun.wheatwar.effect.SummonTheZombie; import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.data.Ageable; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.Farmland; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityTargetEvent; +import org.bukkit.event.server.ServerListPingEvent; -import java.util.HashMap; -import java.util.UUID; +import java.util.*; public class GameListener implements Listener { + @EventHandler + public void onPingMotd(ServerListPingEvent e){ + if(WheatWar.getGame().isStarted()){ + e.setMotd("§a整蛊模式: §6小麦保卫战 §a当前版本: §6常规版 §b运行中"); + } else { + e.setMotd("§a整蛊模式: §6小麦保卫战 §a当前版本: §6常规版 §b运行中"); + } + } - public static HashMap zombieTargetMap = new HashMap<>(); @EventHandler public void onZombieTarget(EntityTargetEvent event) { + // 检查是否是僵尸 + if (event.getEntityType() == EntityType.ZOMBIE_VILLAGER) { + // 检查目标是否是玩家 + if (event.getTarget() instanceof Player) { + // 取消该事件以阻止僵尸将玩家设为仇恨目标 + event.setCancelled(true); + } + } // 检查是否是僵尸 if (event.getEntityType() == EntityType.ZOMBIE) { // 检查目标是否是玩家 @@ -24,16 +46,6 @@ public class GameListener implements Listener { // 取消该事件以阻止僵尸将玩家设为仇恨目标 event.setCancelled(true); } - if(event.getTarget() instanceof Villager villager){ - UUID vuuid = villager.getUniqueId(); - UUID uuid = event.getEntity().getUniqueId(); - /*// 若这个村民已经被僵尸锁定则无法被选中 - if(zombieTargetMap.containsKey(vuuid)){ - event.setCancelled(true); - } else { - zombieTargetMap.put(vuuid,uuid); - }*/ - } } } @@ -58,4 +70,29 @@ public class GameListener implements Listener { } } + + public static List whiteListTNT = new ArrayList<>(); + @EventHandler + public void onDamage(EntityDamageByEntityEvent e){ + if(e.getDamager() instanceof TNTPrimed tntPrimed){ + Entity entity = e.getEntity(); + if(entity instanceof ZombieVillager){ + e.setDamage(1000.0D); + } else if(entity instanceof Zombie){ + e.setDamage(1000.0D); + } else { + if(whiteListTNT.contains(tntPrimed.getUniqueId())){ + e.setCancelled(true); + } + } + } + } + @EventHandler + public void onEntityExplode(EntityExplodeEvent event) { + Iterator iterator = event.blockList().iterator(); + while (iterator.hasNext()) { + Block block = iterator.next(); + iterator.remove(); + } + } } diff --git a/src/main/java/com/yaohun/wheatwar/listener/GamePotect.java b/src/main/java/com/yaohun/wheatwar/listener/GamePotect.java index a366dc8..4520c17 100644 --- a/src/main/java/com/yaohun/wheatwar/listener/GamePotect.java +++ b/src/main/java/com/yaohun/wheatwar/listener/GamePotect.java @@ -4,17 +4,23 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBurnEvent; import org.bukkit.event.block.BlockIgniteEvent; import org.bukkit.event.entity.EntityCombustEvent; import org.bukkit.event.entity.EntityInteractEvent; import org.bukkit.event.entity.FoodLevelChangeEvent; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.weather.WeatherChangeEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.PlayerInventory; public class GamePotect implements Listener { @EventHandler // 取消生物燃烧 @@ -59,4 +65,17 @@ public class GamePotect implements Listener { } } } + + @EventHandler + public void onBreak(BlockBreakEvent e){ + e.setCancelled(true); + } + @EventHandler + public void onDrop(PlayerDropItemEvent e){ + e.setCancelled(true); + } + @EventHandler + public void onClick(InventoryClickEvent e){ + e.setCancelled(true); + } } diff --git a/src/main/java/com/yaohun/wheatwar/listener/JoinListener.java b/src/main/java/com/yaohun/wheatwar/listener/JoinListener.java index e5076a8..200312a 100644 --- a/src/main/java/com/yaohun/wheatwar/listener/JoinListener.java +++ b/src/main/java/com/yaohun/wheatwar/listener/JoinListener.java @@ -1,16 +1,24 @@ package com.yaohun.wheatwar.listener; +import com.io.yutian.pixelliveengine.api.PixelLiveEngineAPI; import com.yaohun.wheatwar.WheatWar; +import com.yaohun.wheatwar.data.RepairGiftGui; import com.yaohun.wheatwar.game.Game; +import org.bukkit.Location; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.scheduler.BukkitRunnable; +import tools.RandomUtil; public class JoinListener implements Listener { @EventHandler public void onJoin(PlayerJoinEvent e){ + Player player = e.getPlayer(); Game game = WheatWar.getGame(); new BukkitRunnable() { @Override @@ -18,8 +26,63 @@ public class JoinListener implements Listener { if(!game.isStarted()) { game.start(); } + player.teleport(new Location(player.getWorld(),3.5,68,32.5,-180,0)); game.initPlayerData(e.getPlayer()); } }.runTaskLater(WheatWar.inst(),10L); + new BukkitRunnable() { + @Override + public void run() { + PixelLiveEngineAPI.loadResourcePack("SoundPack5","rvHbB9FdOxWYAfi8kTLe"); + } + }.runTaskLater(WheatWar.inst(),20L); + } + + @EventHandler + public void onPick(PlayerDropItemEvent e){ + Player p = e.getPlayer(); + if (WheatWar.getGame().isStarted()) { + if(p.isSneaking()){ + RepairGiftGui.OpenGui(p); + } + } + } + + @EventHandler + public void onAutoRespawn(PlayerDeathEvent e) { + e.setDeathMessage(null); + Player p = e.getEntity(); + // 获取当前游戏记录点高度 + Game game = WheatWar.getGame(); + if (game.isStarted()) { + new BukkitRunnable() { + private int i = 0; + + public void run() { + if (i == 1) { + p.spigot().respawn(); + } + if(i == 3){ + p.getInventory().clear(); + } + if(i == 4) { + if (RandomUtil.getRandomInt(1,100) >= 50) { + p.sendTitle("§4你嘎了", "行不行啊?菜就多练!"); + } else { + p.sendTitle("§4你嘎了", "汗流浃背了?"); + } + game.initPlayerBackpack(p); + } + if(i == 5) { + p.teleport(new Location(p.getWorld(),3.5,68,32.5,-180,0)); + if(!p.getAllowFlight()){ + p.setAllowFlight(true); + } + cancel(); + } + i++; + } + }.runTaskTimer(WheatWar.inst(),0L, 2L); + } } } diff --git a/src/main/java/com/yaohun/wheatwar/liveevent/GiftEventHandler.java b/src/main/java/com/yaohun/wheatwar/liveevent/GiftEventHandler.java new file mode 100644 index 0000000..c949991 --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/liveevent/GiftEventHandler.java @@ -0,0 +1,68 @@ +package com.yaohun.wheatwar.liveevent; + +import com.yaohun.wheatwar.WheatWar; +import com.yaohun.wheatwar.effect.*; +import com.yaohun.wheatwar.game.Game; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import tools.GameUtil; +import tools.RandomUtil; + +public class GiftEventHandler { + + public static void SendHandLer(Player zhubo, String userName, String eventName){ + Game game = WheatWar.getGame(); + userName = GameUtil.hideName(userName); + if (eventName.contains("小羊哥")) { + int amount = 1; + if(eventName.contains("X") || eventName.contains("x") || eventName.contains("*")) { + eventName = eventName.replace("*","X"); + String[] eventSp = eventName.toUpperCase().split("X"); + amount = Integer.parseInt(eventSp[1]); + } + SummonTheSheep.apply(game, zhubo, userName, amount); + } else if (eventName.contains("小红羊")) { + int amount = 1; + if(eventName.contains("X") || eventName.contains("x") || eventName.contains("*")) { + eventName = eventName.replace("*","X"); + String[] eventSp = eventName.toUpperCase().split("X"); + amount = Integer.parseInt(eventSp[1]); + } + SummonTheSheepPro.apply(game, zhubo, userName, amount); + } else if (eventName.contains("暴躁村民")) { + int amount = 1; + if(eventName.contains("X") || eventName.contains("x") || eventName.contains("*")) { + eventName = eventName.replace("*","X"); + String[] eventSp = eventName.toUpperCase().split("X"); + amount = Integer.parseInt(eventSp[1]); + } + SummonTheVillagerPro.apply(game, zhubo, userName, amount); + }else if (eventName.contains("村民")) { + int amount = 1; + if(eventName.contains("X") || eventName.contains("x") || eventName.contains("*")) { + eventName = eventName.replace("*","X"); + String[] eventSp = eventName.toUpperCase().split("X"); + amount = Integer.parseInt(eventSp[1]); + } + SummonTheVillager.apply(game, zhubo, userName, amount); + } else if (eventName.contains("僵尸")) { + int amount = 1; + if(eventName.contains("X") || eventName.contains("x") || eventName.contains("*")) { + eventName = eventName.replace("*","X"); + String[] eventSp = eventName.toUpperCase().split("X"); + amount = Integer.parseInt(eventSp[1]); + } + SummonTheZombie.apply(game, zhubo, userName, amount); + } else if (eventName.contains("炸弹")) { + int amount = 1; + if(eventName.contains("X") || eventName.contains("x") || eventName.contains("*")) { + eventName = eventName.replace("*","X"); + String[] eventSp = eventName.toUpperCase().split("X"); + amount = Integer.parseInt(eventSp[1]); + } + SummonTheBombsTNT.apply(game, zhubo, userName, amount); + } else if (eventName.equalsIgnoreCase("无差别轰炸")) { + SummonTheTNTRain.apply(game,zhubo,userName,50); + } + } +} diff --git a/src/main/java/com/yaohun/wheatwar/liveevent/GiftListener.java b/src/main/java/com/yaohun/wheatwar/liveevent/GiftListener.java new file mode 100644 index 0000000..e245140 --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/liveevent/GiftListener.java @@ -0,0 +1,30 @@ +package com.yaohun.wheatwar.liveevent; + +import com.io.yutian.mclive.event.LiveGiftEvents; +import com.yaohun.wheatwar.util.GiftUtil; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import tools.GameUtil; +import tools.RandomUtil; + +public class GiftListener implements Listener { + + @EventHandler + public void onGfit(LiveGiftEvents e) { + Player zhubo = e.getPlayer(); + String userName = ""+ RandomUtil.getRandomInt(10000,90000); + boolean butt = false; + if(e.getUser().nickName() != null) { + userName = e.getUser().nickName(); + butt = true; + } + String giftName = e.getName(); + int amount = (int) e.getAmount(); + if (amount <= 0) { + amount = 1; + } + String show_userName = GameUtil.hideName(userName); + GiftUtil.simulatedGiftEffect(zhubo,show_userName,giftName,amount); + } +} diff --git a/src/main/java/com/yaohun/wheatwar/liveevent/LikeListener.java b/src/main/java/com/yaohun/wheatwar/liveevent/LikeListener.java new file mode 100644 index 0000000..61c9f45 --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/liveevent/LikeListener.java @@ -0,0 +1,87 @@ +package com.yaohun.wheatwar.liveevent; + +import com.io.yutian.mclive.event.LiveChatEvents; +import com.io.yutian.mclive.event.LiveLikeEvents; +import com.yaohun.wheatwar.WheatWar; +import com.yaohun.wheatwar.data.LikeData; +import com.yaohun.wheatwar.manage.GameManager; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.util.Vector; +import tools.CDTimeAPI; +import tools.RandomUtil; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class LikeListener implements Listener { + + private GameManager gameManager; + public LikeListener(GameManager manager){ + gameManager = manager; + } + @EventHandler//点赞 + public void onDianZan(LiveLikeEvents e) { + Player zhubo = e.getPlayer(); + String userName = ""+ RandomUtil.getRandomInt(999,10000); + if(e.getUser().nickName() != null) { + userName = e.getUser().nickName(); + } + long add_amount = e.getCount(); + HashMap likeDataMap = gameManager.getLikeDataMap(); + for (String key : likeDataMap.keySet()){ + LikeData likeData = likeDataMap.get(key); + likeData.addNowAmount((int)add_amount); + dropLikeEffect(zhubo, (int) add_amount); + if(likeData.meetTheQuantityRequirement()){ + String eventName = likeData.getEffectKey(); + String title = "§c"; + String subtitle = "§c("+eventName+") §f- §9"+likeData.getNeedAmount()+"个戳一戳"; + // String subtitle = "§r"; + likeData.OutPlaySoundsEvent(); + zhubo.sendTitle(title, subtitle,0, 30, 10); + GiftEventHandler.SendHandLer(zhubo,userName,eventName); + likeData.setNowAmount(0); + } + } + } + + public void dropLikeEffect(Player zhubo,int amount) { + List stackList = new ArrayList<>(); + stackList.add(getLikeStack(251)); + stackList.add(getLikeStack(252)); + stackList.add(getLikeStack(253)); + stackList.add(getLikeStack(254)); + stackList.add(getLikeStack(255)); + stackList.add(getLikeStack(256)); + stackList.add(getLikeStack(257)); + for (int i = 0; i < amount; i++) { + Bukkit.getScheduler().runTaskLater(WheatWar.inst(), () -> { + int rand = RandomUtil.getRandomInt(0, stackList.size() - 1); + ItemStack stack = stackList.get(rand); + Item item = zhubo.getWorld().dropItem(zhubo.getLocation().add(0,1,0), stack); + item.setVelocity(item.getLocation().getDirection().multiply(0.25D)); + item.setVelocity(new Vector(item.getVelocity().getX(), 0.4D, item.getVelocity().getZ())); + Bukkit.getScheduler().runTaskLater(WheatWar.inst(), item::remove, (long) 60); + }, (long) i * 5); + } + } + + public ItemStack getLikeStack(int modelId){ + ItemStack item = new ItemStack(Material.SUGAR); + ItemMeta meta = item.getItemMeta(); + List lore = new ArrayList<>(); + lore.add("#"+RandomUtil.getRandomInt(999,100000)); + meta.setLore(lore); + meta.setCustomModelData(modelId); + item.setItemMeta(meta); + return item; + } +} diff --git a/src/main/java/com/yaohun/wheatwar/manage/GameManager.java b/src/main/java/com/yaohun/wheatwar/manage/GameManager.java new file mode 100644 index 0000000..a06dcb7 --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/manage/GameManager.java @@ -0,0 +1,70 @@ +package com.yaohun.wheatwar.manage; + +import com.io.yutian.mclive.event.ZhuboAPI; +import com.yaohun.wheatwar.data.GiftData; +import com.yaohun.wheatwar.data.LikeData; +import org.bukkit.Bukkit; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; + +public class GameManager { + private File manageFile; + private FileConfiguration manageConfig; + private HashMap likeDataMap = new HashMap<>(); + private HashMap giftDataMap = new HashMap<>(); + private static boolean isRandomBox; + public GameManager(){ + Bukkit.getConsoleSender().sendMessage("[日志 - 保卫小麦] 工具注册:"); + loadRandomBoxPlugin(); + Bukkit.getConsoleSender().sendMessage("[日志 - 保卫小麦] 游戏设置:"); + loadSettingsData(); + Bukkit.getConsoleSender().sendMessage("[日志 - 保卫小麦] 事件注册:"); + File file = new File("./plugins/游戏设置","礼物设置.yml"); + FileConfiguration gift_yml = YamlConfiguration.loadConfiguration(file); + ConfigurationSection likeSection = gift_yml.getConfigurationSection("点赞整蛊"); + if (likeSection != null) { + for (String key : likeSection.getKeys(false)) { + String effect = likeSection.getString(key+".效果"); + int likeAmount = likeSection.getInt(key+".点赞次数"); + String likesounds = likeSection.getString(key+".声音","wau"); + likeDataMap.put(effect,new LikeData(effect,likeAmount,likesounds)); + String message = "事件: "+effect+" 条件: 点赞x"+likeAmount; + Bukkit.getConsoleSender().sendMessage(message); + } + } + ConfigurationSection giftSection = gift_yml.getConfigurationSection("礼物设置"); + if(giftSection != null){ + ZhuboAPI.setGameGiftList(new ArrayList<>(giftSection.getKeys(false))); + for (String giftName : giftSection.getKeys(false)) { + giftDataMap.put(giftName, new GiftData(giftName, gift_yml)); + } + } + } + + public void loadSettingsData(){ + manageFile = new File("./plugins/游戏设置","游戏设置.yml"); + manageConfig = YamlConfiguration.loadConfiguration(manageFile); + } + + public void loadRandomBoxPlugin() { + if(Bukkit.getPluginManager().getPlugin("RandomBox") != null){ + isRandomBox = true; + Bukkit.getConsoleSender().sendMessage("- 随机盲盒: 已启用"); + } else { + isRandomBox = false; + Bukkit.getConsoleSender().sendMessage("- 随机盲盒: 未启用"); + } + } + + public HashMap getLikeDataMap() {return likeDataMap;} + public boolean isGiftDataExit(String giftName){for (String gift : this.giftDataMap.keySet()){if(gift.equalsIgnoreCase(giftName)){return true;}}return false;} + public GiftData getGiftData(String giftName){if(this.giftDataMap.get(giftName) == null){return null;}return this.giftDataMap.get(giftName);} + public HashMap getGiftDataMap() { + return giftDataMap; + } +} diff --git a/src/main/java/com/yaohun/wheatwar/util/GiftUtil.java b/src/main/java/com/yaohun/wheatwar/util/GiftUtil.java new file mode 100644 index 0000000..49f048a --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/util/GiftUtil.java @@ -0,0 +1,75 @@ +package com.yaohun.wheatwar.util; + +import com.yaohun.wheatwar.WheatWar; +import com.yaohun.wheatwar.data.GiftData; +import com.yaohun.wheatwar.liveevent.GiftEventHandler; +import com.yaohun.wheatwar.manage.GameManager; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +public class GiftUtil { + public static void simulateEventEffect(Player player,String userName, String eventName, int amount){ + if(specialGiftEffectTriggers(player,eventName,userName,amount)){ + return; + } + GiftEventHandler.SendHandLer(player, userName, eventName); + } + public static void simulatedGiftEffect(Player player, String userName, String giftName, int amount){ + GameManager manager = WheatWar.getGameManager(); + if(!manager.isGiftDataExit(giftName)){ + return; + } + GiftData giftData = manager.getGiftData(giftName); + giftData.OutCompleEvent(amount); + String eventName = giftData.getEvent(); + if(GiftUtil.specialGiftEffectTriggers(player,eventName,userName,amount)){ + giftData.OutPlaySoundsEvent(); + return; + } + String title = "§c" + eventName; + if(amount >= 2) { + title = "§c" + eventName + " x" + amount; + } + String subtitle = "§9" + giftName; + player.sendTitle(title, subtitle,0, 30, 10); + if (amount <= 1) { + giftData.OutPlaySoundsEvent(); + GiftEventHandler.SendHandLer(player, userName, eventName); + } else { + long dadey = 5L; + for (int i = 0; i < amount; i++) { + Bukkit.getScheduler().runTaskLater(WheatWar.inst(), giftData::OutPlaySoundsEvent, (long) i * dadey); + } + for (int i = 0; i < amount; i++) { + GiftEventHandler.SendHandLer(player, userName, eventName); + } + } + } + + public static boolean specialGiftEffectTriggers(Player player,String eventName,String show_userName,int amount) { + if (eventName.contains("盲盒")) { + if (eventName.contains("#")) { + String s1 = "love"; + String s2 = "000304"; + String[] eventSp = eventName.split("#"); + String boxKey = eventSp[1]; + int boxAmount = 1; + if (boxKey.contains("X")) { + boxAmount = Integer.parseInt(boxKey.split("X")[1]); + boxKey = s1 + "-" + s2 + "-" + boxKey.split("X")[0]; + } else if (boxKey.contains("x")) { + boxAmount = Integer.parseInt(boxKey.split("x")[1]); + boxKey = s1 + "-" + s2 + "-" + boxKey.split("x")[0]; + } else { + boxKey = s1 + "-" + s2 + "-" + boxKey; + } + amount = (boxAmount * amount); + // RBoxAPI.addUserData(player, show_userName, boxKey, amount); + } else { + System.out.println("[错误 - 盲盒] 随机盲盒在礼物设置中配置错误."); + } + return true; + } + return false; + } +} diff --git a/src/main/java/tools/StackUtil.java b/src/main/java/tools/StackUtil.java index 63242a9..135192c 100644 --- a/src/main/java/tools/StackUtil.java +++ b/src/main/java/tools/StackUtil.java @@ -13,5 +13,32 @@ import java.util.ArrayList; import java.util.List; public class StackUtil { - + public static ItemStack diamondSword(){ + ItemStack item = new ItemStack(Material.DIAMOND_SWORD); + int randint = RandomUtil.getRandomInt(0,100); + if(randint >= 50){ + item.setType(Material.NETHERITE_SWORD); + } + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("§6§l农夫的神剑"); + List lore = new ArrayList<>(); + lore.add("§7#极光像素工作室制作"); + meta.setLore(lore); + meta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE); + meta.setUnbreakable(true); + item.setItemMeta(meta); + return item; + } + public static ItemStack trident(){ + ItemStack item = new ItemStack(Material.TRIDENT); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("§6§l三叉戟"); + List lore = new ArrayList<>(); + lore.add("§7#极光像素工作室制作"); + meta.setLore(lore); + meta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE); + meta.setUnbreakable(true); + item.setItemMeta(meta); + return item; + } }