9
0
mirror of https://github.com/Xiao-MoMi/Custom-Crops.git synced 2025-12-22 16:39:36 +00:00

res wg 兼容

This commit is contained in:
Xiao-MoMi
2022-05-22 13:04:02 +08:00
parent b1be47bd57
commit 577a8e54ec
5 changed files with 174 additions and 23 deletions

View File

@@ -0,0 +1,38 @@
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;
public class ResidenceIntegrations {
public static boolean checkResBuild(Location location, CustomBlockInteractEvent event){
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();
boolean hasPermission = perms.playerHas(playerName, "build", true);
if(!hasPermission){
event.setCancelled(true);
return true;
}
}
return false;
}
public static boolean checkResHarvest(Location location, CustomBlockInteractEvent event){
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();
boolean hasPermission = perms.playerHas(playerName, "harvest", true);
if(!hasPermission){
event.setCancelled(true);
return true;
}
}
return false;
}
}

View File

@@ -0,0 +1,39 @@
package net.momirealms.customcrops.Integrations;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.WorldGuard;
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){
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){
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

@@ -1,5 +1,9 @@
package net.momirealms.customcrops.listener;
import com.bekvon.bukkit.residence.Residence;
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.CustomStack;
import net.momirealms.customcrops.CustomCrops;
import net.momirealms.customcrops.DataManager.MaxSprinklersPerChunk;
@@ -24,16 +28,16 @@ import java.util.List;
public class RightClickBlock implements Listener {
FileConfiguration config = CustomCrops.instance.getConfig();
@EventHandler
public void rightClickBlock(PlayerInteractEvent event){
if(event.getAction() != Action.RIGHT_CLICK_BLOCK || !event.hasItem()){
FileConfiguration config = CustomCrops.instance.getConfig();
if(!event.hasItem()){
return;
}
if(event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.RIGHT_CLICK_AIR) return;
Player player = event.getPlayer();
ItemStack itemStack = event.getItem();
//水壶加水
if(itemStack.getType() == Material.WOODEN_SWORD){
List<Block> lineOfSight = player.getLineOfSight(null, 3);
boolean hasWater = false;
@@ -47,19 +51,30 @@ public class RightClickBlock implements Listener {
return;
}
}
if(event.getAction() != Action.RIGHT_CLICK_BLOCK) return;
if(event.getBlockFace() != BlockFace.UP) return;
if(CustomStack.byItemStack(event.getItem()) == null) return;
if(CustomStack.byItemStack(event.getItem()) == null){
return;
Location location = event.getClickedBlock().getLocation();
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);
return;
}
}
}
//是否过高过低
if(event.getClickedBlock().getY() > config.getInt("config.height.max") || event.getClickedBlock().getY() < config.getInt("config.height.min")){
MessageManager.playerMessage(config.getString("messages.prefix") + config.getString("messages.not-a-good-place"),player);
return;
}
Location location = event.getClickedBlock().getLocation();
if(CustomStack.byItemStack(event.getItem()).getNamespacedID().equalsIgnoreCase(config.getString("config.sprinkler-1-item"))){
if(MaxSprinklersPerChunk.maxSprinklersPerChunk(location)){
MessageManager.playerMessage(config.getString("messages.prefix")+config.getString("messages.reach-limit-sprinkler").replace("{Max}", config.getString("config.max-sprinklers")),player);
@@ -83,6 +98,7 @@ public class RightClickBlock implements Listener {
}
}
private void addWater(ItemStack itemStack, Player player){
FileConfiguration config = CustomCrops.instance.getConfig();
if(CustomStack.byItemStack(itemStack)!= null){
CustomStack customStack = CustomStack.byItemStack(itemStack);
if(customStack.getNamespacedID().equalsIgnoreCase(config.getString("config.watering-can-1")) ||

View File

@@ -6,6 +6,8 @@ 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.ResidenceIntegrations;
import net.momirealms.customcrops.Integrations.WorldGuardIntegrations;
import net.momirealms.customcrops.MessageManager;
import org.bukkit.*;
import org.bukkit.block.Block;
@@ -21,8 +23,6 @@ import java.util.Objects;
public class RightClickCustomBlock implements Listener {
FileConfiguration config = CustomCrops.instance.getConfig();
@EventHandler
public void rightClickCustomCrop(CustomBlockInteractEvent event){
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
@@ -31,7 +31,19 @@ public class RightClickCustomBlock implements Listener {
Block clickedBlock = event.getBlockClicked();
Location clickedBlockLocation = clickedBlock.getLocation();
CustomBlock clickedCustomBlock = CustomBlock.byAlreadyPlaced(clickedBlock);
FileConfiguration config = CustomCrops.instance.getConfig();
Player player = event.getPlayer();
if (event.getItem() == null) {
if(config.getBoolean("config.integration.residence")){
if(ResidenceIntegrations.checkResHarvest(clickedBlockLocation, event)){
return;
}
}
if(config.getBoolean("config.integration.worldguard")){
if(WorldGuardIntegrations.checkWGHarvest(player,clickedBlockLocation, event)){
return;
}
}
if (clickedCustomBlock.getNamespacedID().contains("stage")){
if(clickedCustomBlock.getNamespacedID().equalsIgnoreCase(config.getString("config.dead-crop"))) return;
String namespace = clickedCustomBlock.getNamespacedID().split(":")[0];
@@ -47,16 +59,31 @@ public class RightClickCustomBlock implements Listener {
}
}
}
return;
}
Player player = event.getPlayer();
//res兼容
if(config.getBoolean("config.integration.residence")){
if(ResidenceIntegrations.checkResBuild(clickedBlockLocation, event)){
return;
}
}
//wg兼容
if(config.getBoolean("config.integration.worldguard")){
if(WorldGuardIntegrations.checkWGBuild(player,clickedBlockLocation, event)){
return;
}
}
World world = player.getWorld();
ItemStack mainHandItem = player.getInventory().getItemInMainHand();
//右键的作物下方是否为自定义方块
if (CustomBlock.byAlreadyPlaced(world.getBlockAt(clickedBlockLocation.clone().subtract(0,1,0))) != null && clickedBlock.getType() == Material.TRIPWIRE) {
//检测右键的方块下方是否为干燥的种植盆方块
if(CustomBlock.byAlreadyPlaced(world.getBlockAt(clickedBlockLocation.clone().subtract(0,1,0))).getNamespacedID().equalsIgnoreCase(config.getString("config.pot"))) {
//如果手中的是水桶,那么转干为湿
if (mainHandItem.getType() == Material.WATER_BUCKET) {
//扣除水桶
if(player.getGameMode() != GameMode.CREATIVE){
mainHandItem.setAmount(mainHandItem.getAmount() - 1);
player.getInventory().addItem(new ItemStack(Material.BUCKET));
@@ -64,23 +91,29 @@ public class RightClickCustomBlock implements Listener {
CustomBlock.remove(clickedBlockLocation.clone().subtract(0, 1, 0));
CustomBlock.place(config.getString("config.watered-pot"), clickedBlockLocation.clone().subtract(0, 1, 0));
}else if(mainHandItem.getType() == Material.WOODEN_SWORD){
waterPot(mainHandItem,player,clickedBlockLocation.clone().subtract(0,1,0));
waterPot(mainHandItem,player,clickedBlockLocation.clone().subtract(0,1,0),config);
}
}
//检测右键的方块下方是否为湿润的种植盆方块
else if(CustomBlock.byAlreadyPlaced(world.getBlockAt(clickedBlockLocation.clone().subtract(0,1,0))).getNamespacedID().equalsIgnoreCase(config.getString("config.watered-pot"))){
//如果是骨粉
if (mainHandItem.getType() == Material.BONE_MEAL){
//植物是否具有stage属性
if (clickedCustomBlock.getNamespacedID().contains("stage")){
String[] cropNameList = clickedCustomBlock.getNamespacedID().split("_");
int nextStage = Integer.parseInt(cropNameList[2]) + 1;
//植物是否存在下一个stage
if (CustomBlock.getInstance(cropNameList[0] + "_" +cropNameList[1] +"_" + nextStage) != null){
if(player.getGameMode() != GameMode.CREATIVE){
mainHandItem.setAmount(mainHandItem.getAmount() - 1);
}
//骨粉的成功率
if (Math.random() < config.getDouble("config.bone-meal-chance")){
CustomBlock.remove(clickedBlockLocation);
CustomBlock.place(cropNameList[0] + "_" +cropNameList[1] +"_" + nextStage,clickedBlockLocation);
Particle particleSuccess = Particle.valueOf(config.getString("config.particle.success"));
world.spawnParticle(particleSuccess, clickedBlockLocation.clone().add(0.5, 0.1,0.5), 1 ,0,0,0,0);
//使用骨粉是否消耗水分
if(config.getBoolean("config.bone-meal-consume-water")){
CustomBlock.remove(clickedBlockLocation.clone().subtract(0,1,0));
CustomBlock.place(config.getString("config.pot"), clickedBlockLocation.clone().subtract(0,1,0));
@@ -94,8 +127,11 @@ public class RightClickCustomBlock implements Listener {
}
}
} else if (CustomBlock.byAlreadyPlaced(world.getBlockAt(clickedBlockLocation)) != null && event.getBlockFace() == BlockFace.UP){
//检测右键的方块是否为干燥的种植盆方块
if (CustomBlock.byAlreadyPlaced(world.getBlockAt(clickedBlockLocation)).getNamespacedID().equalsIgnoreCase(config.getString("config.pot"))){
//如果手中的是水桶,那么转干为湿
if (mainHandItem.getType() == Material.WATER_BUCKET){
//扣除水桶
if(player.getGameMode() != GameMode.CREATIVE){
mainHandItem.setAmount(mainHandItem.getAmount() - 1);
player.getInventory().addItem(new ItemStack(Material.BUCKET));
@@ -103,25 +139,30 @@ public class RightClickCustomBlock implements Listener {
CustomBlock.remove(clickedBlockLocation);
CustomBlock.place(config.getString("config.watered-pot"),clickedBlockLocation);
} else if (mainHandItem.getType() == Material.WOODEN_SWORD){
waterPot(mainHandItem, player,clickedBlockLocation);
waterPot(mainHandItem, player,clickedBlockLocation, config);
} else {
tryPlantSeed(clickedBlockLocation, mainHandItem, player);
tryPlantSeed(clickedBlockLocation, mainHandItem, player, config);
}
//检测右键的方块是否为湿润的种植盆方块
}else if(CustomBlock.byAlreadyPlaced(world.getBlockAt(clickedBlockLocation)).getNamespacedID().equalsIgnoreCase(config.getString("config.watered-pot"))){
tryPlantSeed(clickedBlockLocation, mainHandItem, player);
tryPlantSeed(clickedBlockLocation, mainHandItem, player, config);
}
}
}
private void tryPlantSeed(Location clickedBlockLocation, ItemStack mainHandItem, Player player) {
//尝试种植植物
private void tryPlantSeed(Location clickedBlockLocation, ItemStack mainHandItem, Player player, FileConfiguration config) {
if(CustomStack.byItemStack(mainHandItem) == null) return;
if (CustomStack.byItemStack(mainHandItem).getNamespacedID().toLowerCase().endsWith("_seeds")){
String namespaced_id = CustomStack.byItemStack(mainHandItem).getNamespacedID().toLowerCase();
String[] crop = CustomStack.byItemStack(mainHandItem).getNamespacedID().toLowerCase().replace("_seeds","").split(":");
//是否超高超低
if (clickedBlockLocation.getY() < config.getInt("config.height.min") || clickedBlockLocation.getY() > config.getInt("config.height.max")){
MessageManager.playerMessage(config.getString("messages.prefix") + config.getString("messages.not-a-good-place"),player);
return;
}
//是否启用了季节
Label_out:
if(config.getBoolean("enable-season")){
if(config.getBoolean("config.enable-greenhouse")){
@@ -146,26 +187,31 @@ public class RightClickCustomBlock implements Listener {
return;
}
}
//该种子是否存在于配置文件中
if(!config.contains("crops."+crop[1])){
MessageManager.playerMessage(config.getString("messages.prefix")+config.getString("messages.no-such-seed"),player);
return;
}
//是否到达区块上限
if(MaxCropsPerChunk.maxCropsPerChunk(clickedBlockLocation)){
MessageManager.playerMessage(config.getString("messages.prefix")+config.getString("messages.reach-limit-crop").replace("{Max}", config.getString("config.max-crops")),player);
return;
}
//添加到缓存中
if(config.getBoolean("enable-season")){
CropManager.putInstance(clickedBlockLocation.clone().add(0,1,0), config.getString("crops."+crop[1]+".season"));
}else{
CropManager.putInstance(clickedBlockLocation.clone().add(0,1,0), "all");
}
//减少种子数量
if(player.getGameMode() != GameMode.CREATIVE){
mainHandItem.setAmount(mainHandItem.getAmount() -1);
}
//放置自定义农作物
CustomBlock.place(namespaced_id.replace("_seeds","_stage_1"),clickedBlockLocation.clone().add(0,1,0));
}
}
private void waterPot(ItemStack itemStack, Player player, Location location){
private void waterPot(ItemStack itemStack, Player player, Location location, FileConfiguration config){
if(CustomStack.byItemStack(itemStack) == null) return;
@@ -189,6 +235,12 @@ public class RightClickCustomBlock implements Listener {
x = 4;
z = 4;
} else return;
/*
-45 < yaw < 45 z+
-135 < yaw < -45 x+
45 < yaw < 135 x-
else z-
*/
player.playSound(player,Sound.BLOCK_WATER_AMBIENT,1,1);
float yaw = player.getLocation().getYaw();
if (yaw <= 45 && yaw >= -135) {
@@ -200,7 +252,7 @@ public class RightClickCustomBlock implements Listener {
for (int i = 0; i <= x; i++) {
for (int j = 0; j <= z; j++) {
Location tempLoc = location.clone().add(i, 0, j);
canWaterPot(tempLoc);
canWaterPot(tempLoc,config);
}
}
} else {
@@ -212,13 +264,13 @@ public class RightClickCustomBlock implements Listener {
for (int i = 0; i <= x; i++) {
for (int j = 0; j <= z; j++) {
Location tempLoc = location.clone().subtract(i, 0, j);
canWaterPot(tempLoc);
canWaterPot(tempLoc,config);
}
}
}
});
}
private void canWaterPot(Location location){
private void canWaterPot(Location location, FileConfiguration config){
if(CustomBlock.byAlreadyPlaced(location.getWorld().getBlockAt(location)) != null){
if(CustomBlock.byAlreadyPlaced(location.getWorld().getBlockAt(location)).getNamespacedID().equalsIgnoreCase(config.getString("config.pot"))){
Bukkit.getScheduler().callSyncMethod(CustomCrops.instance,()->{

View File

@@ -65,6 +65,12 @@ config:
- world
# 只在被加载的区块中生长和枯萎,对性能友好
only-grow-in-loaded-chunks: true
#与第三方插件兼容
integration:
#收获权限为harvest 浇水种植权限为build
residence: false
#收获flag为BLOCK_BREAK 浇水种植flag为BUILD
worldguard: false
messages:
prefix: '<gradient:#ccfbff:#ef96c5>[CustomCrops] </gradient>'