9
0
mirror of https://github.com/Xiao-MoMi/Custom-Crops.git synced 2025-12-22 08:29:35 +00:00

KingdomsX 兼容

This commit is contained in:
Xiao-MoMi
2022-05-22 14:52:30 +08:00
parent 577a8e54ec
commit 9fe67dd7cc
15 changed files with 142 additions and 57 deletions

View File

@@ -3,6 +3,7 @@ package net.momirealms.customcrops;
import net.momirealms.customcrops.DataManager.BackUp;
import net.momirealms.customcrops.DataManager.CropManager;
import net.momirealms.customcrops.DataManager.SprinklerManager;
import net.momirealms.customcrops.Integrations.KingdomsXIntegrations;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@@ -26,6 +27,7 @@ public class CommandHandler implements CommandExecutor {
FileConfiguration config = CustomCrops.instance.getConfig();
//重载插件
if(args[0].equalsIgnoreCase("reload")){
CustomCrops.loadConfig();
if(sender instanceof Player){
@@ -34,7 +36,7 @@ public class CommandHandler implements CommandExecutor {
MessageManager.consoleMessage(config.getString("messages.prefix") + config.getString("messages.reload"), Bukkit.getConsoleSender());
}
}
//设置季节
if(args[0].equalsIgnoreCase("setseason")){
if(config.getBoolean("enable-season")){
config.set("current-season", args[1]);
@@ -60,7 +62,7 @@ public class CommandHandler implements CommandExecutor {
}
}
}
//强制保存
if(args[0].equalsIgnoreCase("forcesave")){
CropManager.saveData();
SprinklerManager.saveData();
@@ -70,7 +72,7 @@ public class CommandHandler implements CommandExecutor {
MessageManager.consoleMessage(config.getString("messages.prefix") + config.getString("messages.force-save"), Bukkit.getConsoleSender());
}
}
//清除缓存
if(args[0].equalsIgnoreCase("cleancache")){
Bukkit.getScheduler().runTaskAsynchronously(CustomCrops.instance,()->{
CropManager.cleanLoadedCache();
@@ -82,7 +84,6 @@ public class CommandHandler implements CommandExecutor {
MessageManager.consoleMessage(config.getString("messages.prefix") + config.getString("messages.clean-cache"), Bukkit.getConsoleSender());
}
}
if(args[0].equalsIgnoreCase("backup")){
BackUp.backUpData();
if(sender instanceof Player){

View File

@@ -18,7 +18,7 @@ import java.util.Objects;
public class TimeCheck extends BukkitRunnable {
FileConfiguration config = CustomCrops.instance.getConfig();
@Override
public void run() {
@@ -30,6 +30,7 @@ public class TimeCheck extends BukkitRunnable {
CropManager.saveData();
}
if(time == 23900){
FileConfiguration config = CustomCrops.instance.getConfig();
File file = new File(CustomCrops.instance.getDataFolder(), "crop-data.yml");
FileConfiguration data;
data = YamlConfiguration.loadConfiguration(file);
@@ -126,6 +127,7 @@ public class TimeCheck extends BukkitRunnable {
SprinklerManager.saveData();
}
if(time == 500){
FileConfiguration config = CustomCrops.instance.getConfig();
File file = new File(CustomCrops.instance.getDataFolder(), "sprinkler-data.yml");
FileConfiguration data;
data = YamlConfiguration.loadConfiguration(file);
@@ -136,21 +138,21 @@ public class TimeCheck extends BukkitRunnable {
for(int i = -1; i <= 1;i++){
for (int j = -1; j <= 1; j++){
Location tempLoc = location.clone().add(i,-1,j);
waterPot(tempLoc, world);
waterPot(tempLoc, world, config);
}
}
}else if(type.equals("s2")){
for(int i = -2; i <= 2;i++){
for (int j = -2; j <= 2; j++){
Location tempLoc = location.clone().add(i,-1,j);
waterPot(tempLoc, world);
waterPot(tempLoc, world, config);
}
}
}
}));
}
}
private void waterPot(Location tempLoc, World world) {
private void waterPot(Location tempLoc, World world, FileConfiguration config) {
if(CustomBlock.byAlreadyPlaced(world.getBlockAt(tempLoc)) != null){
if(CustomBlock.byAlreadyPlaced(world.getBlockAt(tempLoc)).getNamespacedID().equalsIgnoreCase(config.getString("config.pot"))){

View File

@@ -1,5 +1,12 @@
package net.momirealms.customcrops;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.ProtocolManager;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.wrappers.WrappedChatComponent;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.momirealms.customcrops.Crops.CropTimer;
import net.momirealms.customcrops.DataManager.BackUp;
@@ -34,6 +41,7 @@ public final class CustomCrops extends JavaPlugin {
instance = this;
saveDefaultConfig();
//指令注册
Objects.requireNonNull(Bukkit.getPluginCommand("customcrops")).setExecutor(new CommandHandler());
Objects.requireNonNull(Bukkit.getPluginCommand("customcrops")).setTabCompleter(new CommandTabComplete());
Bukkit.getPluginManager().registerEvents(new RightClickCustomBlock(),this);
@@ -41,8 +49,26 @@ public final class CustomCrops extends JavaPlugin {
Bukkit.getPluginManager().registerEvents(new RightClickBlock(),this);
Bukkit.getPluginManager().registerEvents(new BreakFurniture(),this);
//修改末影箱标题
manager = ProtocolLibrary.getProtocolManager();
manager.addPacketListener(new PacketAdapter(this, PacketType.Play.Server.OPEN_WINDOW) {
public void onPacketSending(PacketEvent event) {
PacketContainer packet = event.getPacket();
List<WrappedChatComponent> components = packet.getChatComponents().getValues();
for (WrappedChatComponent component : components) {
if(component.toString().contains("Ender Chest")){
//component.setJson("{\"text\":\"收纳袋\"}");
component.setJson("{\"translate\":\"container.enderchest\"}");
packet.getChatComponents().write(components.indexOf(component), component);
}
}
}
});
//开始计时任务
startTimer();
//新建data文件
File crop_file = new File(CustomCrops.instance.getDataFolder(), "crop-data.yml");
File sprinkler_file = new File(CustomCrops.instance.getDataFolder(), "sprinkler-data.yml");
if(!crop_file.exists()){
@@ -60,6 +86,7 @@ public final class CustomCrops extends JavaPlugin {
}
}
//载入data数据
FileConfiguration crop_data;
FileConfiguration sprinkler_data;
crop_data = YamlConfiguration.loadConfiguration(crop_file);
@@ -67,30 +94,35 @@ public final class CustomCrops extends JavaPlugin {
CustomCrops.cropManager = new CropManager(crop_data);
CustomCrops.sprinklerManager = new SprinklerManager(sprinkler_data);
//检测papi依赖
if(Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null){
new Placeholders(this).register();
MessageManager.consoleMessage("<gradient:#ccfbff:#ef96c5>[CustomCorps] 检测到PlaceHolderAPI 已启用季节变量!</gradient>",Bukkit.getConsoleSender());
}
MessageManager.consoleMessage("<gradient:#ccfbff:#ef96c5>[CustomCorps] 自定义农作物插件已启用!作者:小默米</gradient>",Bukkit.getConsoleSender());
//启动成功
MessageManager.consoleMessage("<gradient:#ccfbff:#ef96c5>[CustomCorps] 自定义农作物插件已启用!作者:小默米 QQ:3266959688</gradient>",Bukkit.getConsoleSender());
}
@Override
public void onDisable() {
//关闭异步定时任务
if (CustomCrops.timer != null) {
CropTimer.stopTimer(CustomCrops.timer.getTaskID());
}
//保存缓存中的数据
CropManager.saveData();
SprinklerManager.saveData();
//关闭adventure
if(this.adventure != null) {
this.adventure.close();
this.adventure = null;
}
//备份
BackUp.backUpData();
MessageManager.consoleMessage("<gradient:#ccfbff:#ef96c5>[CustomCorps] 自定义农作物插件已卸载!作者:小默米</gradient>",Bukkit.getConsoleSender());
MessageManager.consoleMessage("<gradient:#ccfbff:#ef96c5>[CustomCorps] 自定义农作物插件已卸载!作者:小默米 QQ:3266959688</gradient>",Bukkit.getConsoleSender());
}
public @NonNull BukkitAudiences adventure() {
@@ -100,10 +132,12 @@ public final class CustomCrops extends JavaPlugin {
return this.adventure;
}
//定时任务
public static void startTimer() {
CustomCrops.timer = new CropTimer();
}
//重载插件
public static void loadConfig(){
instance.reloadConfig();
}

View File

@@ -15,7 +15,7 @@ import java.util.*;
public class CropManager {
public static HashMap<Location, String> instances;
//开服的时候将文件的数据读入
public CropManager(FileConfiguration data) {
FileConfiguration config = CustomCrops.instance.getConfig();
File file = new File(CustomCrops.instance.getDataFolder(), "crop-data.yml");
@@ -38,7 +38,7 @@ public class CropManager {
}
saveData();
}
//根据世界名获取所有的农作物
public static List<Location> getCrops(World world){
FileConfiguration config = CustomCrops.instance.getConfig();
File file = new File(CustomCrops.instance.getDataFolder(), "crop-data.yml");
@@ -61,12 +61,13 @@ public class CropManager {
}
return locations;
}
//保存数据
public static void saveData(){
File file = new File(CustomCrops.instance.getDataFolder(), "crop-data.yml");
FileConfiguration data;
data = YamlConfiguration.loadConfiguration(file);
if (CropManager.instances != null) {
//性能更高
Set<Map.Entry<Location, String>> en = instances.entrySet();
for(Map.Entry<Location, String> entry : en){
data.set(entry.getKey().getWorld().getName() + "." + entry.getKey().getBlockX() + "," + entry.getKey().getBlockY()+ ","+entry.getKey().getBlockZ(), entry.getValue());
@@ -74,7 +75,7 @@ public class CropManager {
}
else {
CropManager.instances = new HashMap<Location, String>();
Bukkit.getConsoleSender().sendMessage("错误");
Bukkit.getConsoleSender().sendMessage("错误类型1:请联系开发者并提供报错信息");
}
try {
data.save(file);
@@ -84,12 +85,21 @@ public class CropManager {
}
}
//test
public static void testData(){
for(int i = 1; i < 100000;i++){
Location tempLoc = new Location(Bukkit.getWorld("world"),i,100,i);
String name = "1";
instances.put(tempLoc, name);
}
}
public static void putInstance(Location location, String season) {
CropManager.instances.put(location, season);
}
public HashMap<Location, String> getMap() {
return CropManager.instances;
}
//清理无效的农作物
public static void cleanLoadedCache() {
FileConfiguration config = CustomCrops.instance.getConfig();
File file = new File(CustomCrops.instance.getDataFolder(), "crop-data.yml");

View File

@@ -16,6 +16,7 @@ public class SprinklerManager {
public static HashMap<Location, String> instances;
//开服的时候将文件的数据读入
public SprinklerManager(FileConfiguration data) {
FileConfiguration config = CustomCrops.instance.getConfig();
File file = new File(CustomCrops.instance.getDataFolder(), "sprinkler-data.yml");
@@ -38,7 +39,7 @@ public class SprinklerManager {
}
saveData();
}
//根据世界名获取所有的洒水器
public static List<Location> getSprinklers(World world){
FileConfiguration config = CustomCrops.instance.getConfig();
File file = new File(CustomCrops.instance.getDataFolder(), "sprinkler-data.yml");
@@ -49,6 +50,7 @@ public class SprinklerManager {
if(data.contains(world.getName())){
data.getConfigurationSection(world.getName()).getKeys(false).forEach(key ->{
String[] string_list = key.split(",");
//只返回被加载的区块中的洒水器坐标
if (config.getBoolean("config.only-grow-in-loaded-chunks")){
if (world.isChunkLoaded(Integer.parseInt(string_list[0])/16, Integer.parseInt(string_list[2])/16)){
locations.add(new Location(world, Double.parseDouble(string_list[0]),Double.parseDouble(string_list[1]),Double.parseDouble(string_list[2])));
@@ -61,12 +63,13 @@ public class SprinklerManager {
}
return locations;
}
//保存数据
public static void saveData(){
File file = new File(CustomCrops.instance.getDataFolder(), "sprinkler-data.yml");
FileConfiguration data;
data = YamlConfiguration.loadConfiguration(file);
if (SprinklerManager.instances != null) {
//性能更高
Set<Map.Entry<Location, String>> en = instances.entrySet();
for(Map.Entry<Location, String> entry : en){
data.set(entry.getKey().getWorld().getName() + "." + entry.getKey().getBlockX() + "," + entry.getKey().getBlockY()+ ","+entry.getKey().getBlockZ(), entry.getValue());
@@ -74,7 +77,7 @@ public class SprinklerManager {
}
else {
SprinklerManager.instances = new HashMap<Location, String>();
Bukkit.getConsoleSender().sendMessage("错误");
Bukkit.getConsoleSender().sendMessage("错误:请联系开发者并提供报错信息");
}
try {
data.save(file);
@@ -90,6 +93,8 @@ public class SprinklerManager {
File file = new File(CustomCrops.instance.getDataFolder(), "sprinkler-data.yml");
FileConfiguration data;
data = YamlConfiguration.loadConfiguration(file);
//map不能一边循环一边删除
//创建一个新的HashSet,用作循环
Bukkit.getScheduler().callSyncMethod(CustomCrops.instance,()->{
Set<Location> key = new HashSet(instances.keySet());
try{

View File

@@ -11,10 +11,12 @@ public class IAFurniture {
static FileConfiguration config = CustomCrops.instance.getConfig();
//放置IA自定义家具
public static void placeFurniture(String name, Location location){
CustomFurniture.spawn(name,location.getWorld().getBlockAt(location));
}
//根据位置获取盔甲架如果是洒水器返回true否则返回false
public static boolean getFromLocation(Location location, World world){
for(Entity entity : world.getNearbyEntities(location,0,0,0)){
if(entity instanceof ArmorStand){

View File

@@ -0,0 +1,25 @@
package net.momirealms.customcrops.Integrations;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.kingdoms.constants.group.Kingdom;
import org.kingdoms.constants.land.Land;
import org.kingdoms.constants.player.KingdomPlayer;
public class KingdomsXIntegrations {
public static boolean checkKDBuild(Location location, Player player){
KingdomPlayer kp = KingdomPlayer.getKingdomPlayer(player);
Land land = Land.getLand(location);
if (land == null) return false;
if (land.isClaimed()) {
Kingdom cropKingdom = land.getKingdom();
if (kp.getKingdom() != null) {
Kingdom kingdom = kp.getKingdom();
return kingdom != cropKingdom;
}else {
return true;
}
}
return false;
}
}

View File

@@ -3,35 +3,29 @@ package net.momirealms.customcrops.Integrations;
import com.bekvon.bukkit.residence.protection.ClaimedResidence;
import com.bekvon.bukkit.residence.protection.FlagPermissions;
import com.bekvon.bukkit.residence.protection.ResidencePermissions;
import dev.lone.itemsadder.api.Events.CustomBlockInteractEvent;
import org.bukkit.Location;
import org.bukkit.entity.Player;
public class ResidenceIntegrations {
public static boolean checkResBuild(Location location, CustomBlockInteractEvent event){
public static boolean checkResBuild(Location location, Player player){
FlagPermissions.addFlag("build");
ClaimedResidence res = com.bekvon.bukkit.residence.Residence.getInstance().getResidenceManager().getByLoc(location);
if(res!=null){
ResidencePermissions perms = res.getPermissions();
String playerName = event.getPlayer().getName();
String playerName = player.getName();
boolean hasPermission = perms.playerHas(playerName, "build", true);
if(!hasPermission){
event.setCancelled(true);
return true;
}
return !hasPermission;
}
return false;
}
public static boolean checkResHarvest(Location location, CustomBlockInteractEvent event){
public static boolean checkResHarvest(Location location, Player player){
FlagPermissions.addFlag("harvest");
ClaimedResidence res = com.bekvon.bukkit.residence.Residence.getInstance().getResidenceManager().getByLoc(location);
if(res!=null){
ResidencePermissions perms = res.getPermissions();
String playerName = event.getPlayer().getName();
String playerName = player.getName();
boolean hasPermission = perms.playerHas(playerName, "harvest", true);
if(!hasPermission){
event.setCancelled(true);
return true;
}
return !hasPermission;
}
return false;
}

View File

@@ -7,31 +7,28 @@ import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.flags.Flags;
import com.sk89q.worldguard.protection.regions.RegionContainer;
import com.sk89q.worldguard.protection.regions.RegionQuery;
import dev.lone.itemsadder.api.Events.CustomBlockInteractEvent;
import org.bukkit.Location;
import org.bukkit.entity.Player;
public class WorldGuardIntegrations {
public static boolean checkWGBuild(Player player, Location loc, CustomBlockInteractEvent event){
public static boolean checkWGBuild(Location loc,Player player){
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
RegionQuery query = container.createQuery();
if (!query.testState(BukkitAdapter.adapt(loc), localPlayer, Flags.BUILD)) {
event.setCancelled(true);
return true;
}
return false;
}
public static boolean checkWGHarvest(Player player, Location loc, CustomBlockInteractEvent event){
public static boolean checkWGHarvest(Location loc,Player player){
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
RegionQuery query = container.createQuery();
if (!query.testState(BukkitAdapter.adapt(loc), localPlayer, Flags.BLOCK_BREAK)) {
event.setCancelled(true);
return true;
}
return false;

View File

@@ -13,10 +13,9 @@ import org.bukkit.event.Listener;
public class BreakCustomBlock implements Listener {
FileConfiguration config = CustomCrops.instance.getConfig();
@EventHandler
public void breakCustomBlock(CustomBlockBreakEvent event){
FileConfiguration config = CustomCrops.instance.getConfig();
Player player =event.getPlayer();
Location location = event.getBlock().getLocation();
if(event.getNamespacedID().contains("stage")){

View File

@@ -11,10 +11,9 @@ import org.bukkit.event.entity.EntitySpawnEvent;
public class BreakFurniture implements Listener {
FileConfiguration config = CustomCrops.instance.getConfig();
@EventHandler
public void breakFurniture(EntitySpawnEvent event){
FileConfiguration config = CustomCrops.instance.getConfig();
Entity entity = event.getEntity();
if(!(entity instanceof Item)){
return;

View File

@@ -9,6 +9,9 @@ import net.momirealms.customcrops.CustomCrops;
import net.momirealms.customcrops.DataManager.MaxSprinklersPerChunk;
import net.momirealms.customcrops.DataManager.SprinklerManager;
import net.momirealms.customcrops.IAFurniture;
import net.momirealms.customcrops.Integrations.KingdomsXIntegrations;
import net.momirealms.customcrops.Integrations.ResidenceIntegrations;
import net.momirealms.customcrops.Integrations.WorldGuardIntegrations;
import net.momirealms.customcrops.MessageManager;
import org.bukkit.GameMode;
import org.bukkit.Location;
@@ -56,18 +59,23 @@ public class RightClickBlock implements Listener {
if(CustomStack.byItemStack(event.getItem()) == null) return;
Location location = event.getClickedBlock().getLocation();
//res兼容
if(config.getBoolean("config.integration.residence")){
FlagPermissions.addFlag("build");
ClaimedResidence res = Residence.getInstance().getResidenceManager().getByLoc(location);
if(res!=null){
ResidencePermissions perms = res.getPermissions();
String playerName = event.getPlayer().getName();
boolean hasPermission = perms.playerHas(playerName, "build", true);
if(!hasPermission){
event.setCancelled(true);
if(ResidenceIntegrations.checkResBuild(location,player)){
return;
}
}
//wg兼容
if(config.getBoolean("config.integration.worldguard")){
if(WorldGuardIntegrations.checkWGBuild(location,player)){
return;
}
}
//kingdomsX兼容
if(config.getBoolean("config.integration.kingdomsX")){
if(KingdomsXIntegrations.checkKDBuild(location,player)){
return;
}
}
//是否过高过低
if(event.getClickedBlock().getY() > config.getInt("config.height.max") || event.getClickedBlock().getY() < config.getInt("config.height.min")){

View File

@@ -6,6 +6,7 @@ import dev.lone.itemsadder.api.Events.CustomBlockInteractEvent;
import net.momirealms.customcrops.CustomCrops;
import net.momirealms.customcrops.DataManager.CropManager;
import net.momirealms.customcrops.DataManager.MaxCropsPerChunk;
import net.momirealms.customcrops.Integrations.KingdomsXIntegrations;
import net.momirealms.customcrops.Integrations.ResidenceIntegrations;
import net.momirealms.customcrops.Integrations.WorldGuardIntegrations;
import net.momirealms.customcrops.MessageManager;
@@ -33,14 +34,20 @@ public class RightClickCustomBlock implements Listener {
CustomBlock clickedCustomBlock = CustomBlock.byAlreadyPlaced(clickedBlock);
FileConfiguration config = CustomCrops.instance.getConfig();
Player player = event.getPlayer();
//kingdomsX兼容
if(config.getBoolean("config.integration.kingdomsX")){
if(KingdomsXIntegrations.checkKDBuild(clickedBlockLocation,player)){
return;
}
}
if (event.getItem() == null) {
if(config.getBoolean("config.integration.residence")){
if(ResidenceIntegrations.checkResHarvest(clickedBlockLocation, event)){
if(ResidenceIntegrations.checkResHarvest(clickedBlockLocation,player)){
return;
}
}
if(config.getBoolean("config.integration.worldguard")){
if(WorldGuardIntegrations.checkWGHarvest(player,clickedBlockLocation, event)){
if(WorldGuardIntegrations.checkWGHarvest(clickedBlockLocation,player)){
return;
}
}
@@ -62,14 +69,14 @@ public class RightClickCustomBlock implements Listener {
}
//res兼容
if(config.getBoolean("config.integration.residence")){
if(ResidenceIntegrations.checkResBuild(clickedBlockLocation, event)){
if(ResidenceIntegrations.checkResBuild(clickedBlockLocation,player)){
return;
}
}
//wg兼容
if(config.getBoolean("config.integration.worldguard")){
if(WorldGuardIntegrations.checkWGBuild(player,clickedBlockLocation, event)){
if(WorldGuardIntegrations.checkWGBuild(clickedBlockLocation,player)){
return;
}
}

View File

@@ -71,6 +71,8 @@ config:
residence: false
#收获flag为BLOCK_BREAK 浇水种植flag为BUILD
worldguard: false
#王国成员可以破坏和种植
kingdomsX: false
messages:
prefix: '<gradient:#ccfbff:#ef96c5>[CustomCrops] </gradient>'

View File

@@ -1,9 +1,9 @@
name: CustomCrops
version: '${project.version}'
version: '1.1'
main: net.momirealms.customcrops.CustomCrops
api-version: 1.18
depend: [ ItemsAdder , ProtocolLib ]
softdepend: [ PlaceholderAPI ]
softdepend: [ PlaceholderAPI , Kingdoms , Residence , WorldGuard ]
authors: [ XiaoMoMi ]
commands:
customcrops: