测试版

This commit is contained in:
yaohunya 2024-11-01 14:19:42 +08:00
parent 23d054922b
commit 88f8dd6fcb
21 changed files with 1553 additions and 74 deletions

View File

@ -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<Player> 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;}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}

View File

@ -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<String> 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<String,ItemStack> 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<String, GiftData> 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<String> 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;
}
}

View File

@ -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;
}
}
}
}
}

View File

@ -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,12 +108,16 @@ public class SummonTheCow {
if (locationMap.containsKey(uuid)) {
Location location1 = locationMap.get(uuid);
if (entity.getLocation().distance(location1) <= 1.0) {
if(locationMap.size() > 10) {
amount--;
}
//到达目标小麦位置
locationMap.remove(uuid);
for (int x = -1; x <= 1; x++) {
for (int z = -1; z <= 1; z++) {
// 获取这个坐标的方块数据是未种小麦还是未成熟小麦
Block block = location.getWorld().getBlockAt(location1);
if(!block.getType().equals(Material.AIR)) {
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) {
@ -130,6 +131,8 @@ public class SummonTheCow {
}
}
}
}
}
} else {
Vector direction = location1.toVector().subtract(entity.getLocation().toVector()).normalize();
Vector velocity = direction.multiply(0.25);
@ -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]");
}

View File

@ -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<UUID, Location> 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);
}
}

View File

@ -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);
}
}

View File

@ -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,11 +106,14 @@ public class SummonTheVillager {
if (locationMap.containsKey(uuid)) {
Location location1 = locationMap.get(uuid);
if (entity.getLocation().distance(location1) <= 1.0) {
if(locationMap.size() > 15) {
amount--;
}
//到达目标小麦位置
locationMap.remove(uuid);
// 获取这个坐标的方块数据是未种小麦还是未成熟小麦
Block block = location.getWorld().getBlockAt(location1);
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();
@ -130,6 +130,8 @@ public class SummonTheVillager {
}
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.25);
@ -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);
}

View File

@ -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<UUID, Location> 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);
}
}

View File

@ -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;

View File

@ -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<Location> wheatList = new ArrayList<>();
private List<BukkitTask> 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<String, LikeData> 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<String> 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<Location> 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++) {

View File

@ -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<UUID,UUID> 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<UUID> 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<Block> iterator = event.blockList().iterator();
while (iterator.hasNext()) {
Block block = iterator.next();
iterator.remove();
}
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}

View File

@ -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<String, LikeData> 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<ItemStack> 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<String> lore = new ArrayList<>();
lore.add("#"+RandomUtil.getRandomInt(999,100000));
meta.setLore(lore);
meta.setCustomModelData(modelId);
item.setItemMeta(meta);
return item;
}
}

View File

@ -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<String, LikeData> likeDataMap = new HashMap<>();
private HashMap<String, GiftData> 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<String, LikeData> 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<String, GiftData> getGiftDataMap() {
return giftDataMap;
}
}

View File

@ -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;
}
}

View File

@ -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<String> 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<String> lore = new ArrayList<>();
lore.add("§7#极光像素工作室制作");
meta.setLore(lore);
meta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE);
meta.setUnbreakable(true);
item.setItemMeta(meta);
return item;
}
}