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

1.4.3 worlds fix

This commit is contained in:
Xiao-MoMi
2022-06-08 21:56:04 +08:00
parent f7764b3728
commit a7ada230cd
21 changed files with 297 additions and 291 deletions

View File

@@ -22,11 +22,7 @@ public class CommandHandler implements CommandExecutor {
@Override
@ParametersAreNonnullByDefault
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(sender instanceof Player && !sender.isOp()){
return false;
}
if(args.length<1) return true;
//重载插件
if(args[0].equalsIgnoreCase("reload")){
@@ -41,6 +37,7 @@ public class CommandHandler implements CommandExecutor {
}
//设置季节
if(args[0].equalsIgnoreCase("setseason")){
if(args.length<2) return true;
if(ConfigManager.Config.season){
FileConfiguration config = CustomCrops.instance.getConfig();
@@ -84,7 +81,8 @@ public class CommandHandler implements CommandExecutor {
}
//强制生长
if(args[0].equalsIgnoreCase("forcegrow")){
Bukkit.getScheduler().runTaskAsynchronously(CustomCrops.instance, CropManager::CropGrow);
if(args.length<2) return true;
Bukkit.getScheduler().runTaskAsynchronously(CustomCrops.instance, () -> CropManager.CropGrow(args[1]));
if(sender instanceof Player){
MessageManager.playerMessage(ConfigManager.Config.prefix + ConfigManager.Config.force_grow, (Player) sender);
}else {
@@ -94,7 +92,8 @@ public class CommandHandler implements CommandExecutor {
}
//强制洒水
if(args[0].equalsIgnoreCase("forcewater")){
Bukkit.getScheduler().runTaskAsynchronously(CustomCrops.instance, SprinklerManager::SprinklerWork);
if(args.length<2) return true;
Bukkit.getScheduler().runTaskAsynchronously(CustomCrops.instance, () -> SprinklerManager.SprinklerWork(args[1]));
if(sender instanceof Player){
MessageManager.playerMessage(ConfigManager.Config.prefix + ConfigManager.Config.force_water, (Player) sender);
}else {

View File

@@ -1,11 +1,14 @@
package net.momirealms.customcrops.commands;
import net.momirealms.customcrops.datamanager.ConfigManager;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.jetbrains.annotations.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -19,6 +22,9 @@ public class CommandTabComplete implements TabCompleter {
if(args[0].equalsIgnoreCase("setseason")){
return Arrays.asList("spring","summer","autumn","winter");
}
if(args[0].equalsIgnoreCase("forcegrow") || args[0].equalsIgnoreCase("forcewater")){
return ConfigManager.Config.worlds;
}
return null;
}
}

View File

@@ -136,6 +136,7 @@ public class ConfigManager {
Config.summer = configuration.getString("messages.summer");
Config.autumn = configuration.getString("messages.autumn");
Config.winter = configuration.getString("messages.winter");
Config.winter = configuration.getString("messages.noperm");
}
/*

View File

@@ -11,6 +11,7 @@ import org.bukkit.block.Block;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.scheduler.BukkitScheduler;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
@@ -66,17 +67,11 @@ public class CropManager {
}
}
/*
添加农作物实例
*/
public static void putInstance(Location location, String crop) {
CROPS.put(location, crop);
}
/*
生长部分
*/
public static void CropGrow() {
public static void CropGrow(String worldName) {
/*
阶段1更新数据
*/
@@ -97,12 +92,9 @@ public class CropManager {
阶段2清理数据内无效的农作物并让有效农作物生长
*/
long start2 = System.currentTimeMillis();
ConfigManager.Config.worlds.forEach(worldName ->{
if(data.contains(worldName)){
World world = Bukkit.getWorld(worldName);
data.getConfigurationSection(worldName).getKeys(false).forEach(key ->{
String[] coordinate = StringUtils.split(key,",");
//先判断区块是否加载,未加载则不进行下一步计算
if (world.isChunkLoaded(Integer.parseInt(coordinate[0])/16, Integer.parseInt(coordinate[2])/16)){
@@ -244,7 +236,6 @@ public class CropManager {
}
});
}
});
long finish2 = System.currentTimeMillis();
MessageManager.consoleMessage("&#ccfbff-#ef96c5&[CustomCrops] &7农作物生长耗时&a" + (finish2 - start2) + "&fms",Bukkit.getConsoleSender());

View File

@@ -1,6 +1,6 @@
package net.momirealms.customcrops.datamanager;
import net.momirealms.customcrops.Libs.minedown.MineDown;
import net.momirealms.customcrops.libs.minedown.MineDown;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

View File

@@ -6,16 +6,28 @@ import org.bukkit.configuration.file.FileConfiguration;
import java.util.Objects;
public class NextSeason {
public static void changeSeason(){
FileConfiguration config = CustomCrops.instance.getConfig();
String currentSeason = ConfigManager.Config.current;
String nextSeason = switch (Objects.requireNonNull(currentSeason)) {
case "spring" -> "summer";
case "summer" -> "autumn";
case "autumn" -> "winter";
case "winter" -> "spring";
default -> null;
};
String nextSeason;
switch (Objects.requireNonNull(currentSeason)) {
case "spring":
nextSeason = "summer";
break;
case "summer":
nextSeason = "autumn";
break;
case "autumn":
nextSeason = "winter";
break;
case "winter":
nextSeason = "spring";
break;
default:
nextSeason = null;
break;
}
if(nextSeason != null){
config.set("current-season", nextSeason);
ConfigManager.Config.current = nextSeason;

View File

@@ -18,7 +18,7 @@ import java.util.concurrent.ConcurrentHashMap;
public class SprinklerManager {
public static ConcurrentHashMap<Location, String> SPRINKLERS;
static ConcurrentHashMap<Location, String> SPRINKLERS;
/*
开服的时候将文件的数据读入
*/
@@ -63,7 +63,7 @@ public class SprinklerManager {
SPRINKLERS.put(location, type);
}
public static void SprinklerWork() {
public static void SprinklerWork(String worldName) {
/*
阶段1更新数据
*/
@@ -78,14 +78,13 @@ public class SprinklerManager {
data.set(entry.getKey().getWorld().getName() + "." + entry.getKey().getBlockX() + "," + entry.getKey().getBlockY()+ ","+entry.getKey().getBlockZ(), entry.getValue());
}
long finish1 = System.currentTimeMillis();
MessageManager.consoleMessage("&#ccfbff-#ef96c5&[CustomCrops] &7洒水器数据更新耗时&a" + String.valueOf(finish1-start1) + "&fms",Bukkit.getConsoleSender());
MessageManager.consoleMessage("&#ccfbff-#ef96c5&[CustomCrops] &7洒水器数据更新耗时&a" + (finish1-start1) + "&fms",Bukkit.getConsoleSender());
/*
阶段2清理数据内无效的洒水器并工作
*/
bukkitScheduler.callSyncMethod(CustomCrops.instance,()->{
long start2 = System.currentTimeMillis();
//检测碰撞体积需要同步
ConfigManager.Config.worlds.forEach(worldName ->{
if(data.contains(worldName)){
World world = Bukkit.getWorld(worldName);
data.getConfigurationSection(worldName).getKeys(false).forEach(key ->{
@@ -97,7 +96,11 @@ public class SprinklerManager {
data.set(worldName+"."+coordinate[0]+","+coordinate[1]+","+coordinate[2], null);
}else {
String type = data.getString(worldName + "." + coordinate[0] + "," + coordinate[1] + "," + coordinate[2]);
if(type.equals("s1")){
if(type == null){
MessageManager.consoleMessage("错误数据位于"+ worldName + coordinate[0] + "," + coordinate[1] + "," + coordinate[2], Bukkit.getConsoleSender());
return;
}
if(type.equalsIgnoreCase("s1")){
for(int i = -1; i <= 1;i++){
for (int j = -1; j <= 1; j++){
waterPot(tempLoc.clone().add(i,-1,j));
@@ -114,9 +117,8 @@ public class SprinklerManager {
}
});
}
});
long finish2 = System.currentTimeMillis();
MessageManager.consoleMessage("&#ccfbff-#ef96c5&[CustomCrops] &7洒水器工作耗时&a" + String.valueOf(finish2-start2) + "&fms",Bukkit.getConsoleSender());
MessageManager.consoleMessage("&#ccfbff-#ef96c5&[CustomCrops] &7洒水器工作耗时&a" + (finish2-start2) + "&fms",Bukkit.getConsoleSender());
bukkitScheduler.runTaskAsynchronously(CustomCrops.instance,()->{
/*
@@ -130,19 +132,17 @@ public class SprinklerManager {
CustomCrops.instance.getLogger().warning("洒水器数据保存出错!");
}
long finish3 = System.currentTimeMillis();
MessageManager.consoleMessage("&#ccfbff-#ef96c5&[CustomCrops] &7洒水器数据保存耗时&a" + String.valueOf(finish3-start3) + "&fms",Bukkit.getConsoleSender());
MessageManager.consoleMessage("&#ccfbff-#ef96c5&[CustomCrops] &7洒水器数据保存耗时&a" + (finish3-start3) + "&fms",Bukkit.getConsoleSender());
});
return null;
});
}
private static void waterPot(Location tempLoc) {
if(CustomBlock.byAlreadyPlaced(tempLoc.getBlock()) != null){
if(CustomBlock.byAlreadyPlaced(tempLoc.getBlock()).getNamespacedID().equalsIgnoreCase(ConfigManager.Config.pot)){
Bukkit.getScheduler().callSyncMethod(CustomCrops.instance,()->{
CustomBlock cb = CustomBlock.byAlreadyPlaced(tempLoc.getBlock());
if(cb != null){
if(cb.getNamespacedID().equalsIgnoreCase(ConfigManager.Config.pot)){
CustomBlock.remove(tempLoc);
CustomBlock.place((ConfigManager.Config.watered_pot), tempLoc);
return null;
});
}
}
}

View File

@@ -8,6 +8,7 @@ import org.bukkit.Location;
import org.bukkit.entity.Player;
public class ResidenceIntegrations {
public static boolean checkResBuild(Location location, Player player){
FlagPermissions.addFlag("build");
ClaimedResidence res = com.bekvon.bukkit.residence.Residence.getInstance().getResidenceManager().getByLoc(location);

View File

@@ -1,4 +1,4 @@
package net.momirealms.customcrops.Libs.minedown;
package net.momirealms.customcrops.libs.minedown;
/*
* Copyright (c) 2017 Max Lee (https://github.com/Phoenix616)

View File

@@ -1,4 +1,4 @@
package net.momirealms.customcrops.Libs.minedown;
package net.momirealms.customcrops.libs.minedown;
/*
* Copyright (c) 2017 Max Lee (https://github.com/Phoenix616)
@@ -50,11 +50,11 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static net.momirealms.customcrops.Libs.minedown.MineDown.COLOR_PREFIX;
import static net.momirealms.customcrops.Libs.minedown.MineDown.FONT_PREFIX;
import static net.momirealms.customcrops.Libs.minedown.MineDown.FORMAT_PREFIX;
import static net.momirealms.customcrops.Libs.minedown.MineDown.HOVER_PREFIX;
import static net.momirealms.customcrops.Libs.minedown.MineDown.INSERTION_PREFIX;
import static net.momirealms.customcrops.libs.minedown.MineDown.COLOR_PREFIX;
import static net.momirealms.customcrops.libs.minedown.MineDown.FONT_PREFIX;
import static net.momirealms.customcrops.libs.minedown.MineDown.FORMAT_PREFIX;
import static net.momirealms.customcrops.libs.minedown.MineDown.HOVER_PREFIX;
import static net.momirealms.customcrops.libs.minedown.MineDown.INSERTION_PREFIX;
public class MineDownParser {
private static final String RAINBOW = "rainbow";

View File

@@ -1,4 +1,4 @@
package net.momirealms.customcrops.Libs.minedown;
package net.momirealms.customcrops.libs.minedown;
/*
* Copyright (c) 2017 Max Lee (https://github.com/Phoenix616)
@@ -44,11 +44,11 @@ import java.util.Set;
import java.util.stream.Collectors;
import static net.momirealms.customcrops.Libs.minedown.MineDown.COLOR_PREFIX;
import static net.momirealms.customcrops.Libs.minedown.MineDown.FONT_PREFIX;
import static net.momirealms.customcrops.Libs.minedown.MineDown.FORMAT_PREFIX;
import static net.momirealms.customcrops.Libs.minedown.MineDown.HOVER_PREFIX;
import static net.momirealms.customcrops.Libs.minedown.MineDown.INSERTION_PREFIX;
import static net.momirealms.customcrops.libs.minedown.MineDown.COLOR_PREFIX;
import static net.momirealms.customcrops.libs.minedown.MineDown.FONT_PREFIX;
import static net.momirealms.customcrops.libs.minedown.MineDown.FORMAT_PREFIX;
import static net.momirealms.customcrops.libs.minedown.MineDown.HOVER_PREFIX;
import static net.momirealms.customcrops.libs.minedown.MineDown.INSERTION_PREFIX;
public class MineDownStringifier {

View File

@@ -1,4 +1,4 @@
package net.momirealms.customcrops.Libs.minedown;
package net.momirealms.customcrops.libs.minedown;
/*
* Copyright (c) 2017 Max Lee (https://github.com/Phoenix616)

View File

@@ -1,4 +1,4 @@
package net.momirealms.customcrops.Libs.minedown;
package net.momirealms.customcrops.libs.minedown;
/*
* Copyright (c) 2017 Max Lee (https://github.com/Phoenix616)

View File

@@ -37,7 +37,4 @@ public class MaxSprinklersPerChunk {
}
return n > maxAmount;
}
public static boolean alreadyPlaced(Location location){
return IAFurniture.getFromLocation(location.clone().add(0.5, 1.5, 0.5), location.getWorld());
}
}

View File

@@ -18,10 +18,10 @@ public class BreakCrops implements Listener {
String namespacedId = CustomStack.byItemStack(((Item) entity).getItemStack()).getNamespacedID();
if(namespacedId.equalsIgnoreCase(ConfigManager.Config.sprinkler_1)){
entity.remove();
entity.getWorld().dropItem(entity.getLocation() ,CustomStack.getInstance(namespacedId + "_item").getItemStack());
entity.getWorld().dropItem(entity.getLocation() ,CustomStack.getInstance(ConfigManager.Config.sprinkler_1i).getItemStack());
}else if(namespacedId.equalsIgnoreCase(ConfigManager.Config.sprinkler_2)){
entity.remove();
entity.getWorld().dropItem(entity.getLocation() ,CustomStack.getInstance(namespacedId + "_item").getItemStack());
entity.getWorld().dropItem(entity.getLocation() ,CustomStack.getInstance(ConfigManager.Config.sprinkler_2i).getItemStack());
}else if(namespacedId.contains("_stage_")){
entity.remove();
}

View File

@@ -75,7 +75,7 @@ public class RightClickBlock implements Listener {
return;
}
//此位置是否已有洒水器
if(MaxSprinklersPerChunk.alreadyPlaced(location)){
if(IAFurniture.getFromLocation(location.clone().add(0.5, 1.5, 0.5), location.getWorld())){
return;
}
//区块上限

View File

@@ -4,8 +4,6 @@ import dev.lone.itemsadder.api.CustomBlock;
import dev.lone.itemsadder.api.CustomStack;
import dev.lone.itemsadder.api.Events.CustomBlockInteractEvent;
import net.momirealms.customcrops.datamanager.ConfigManager;
import net.momirealms.customcrops.CustomCrops;
import net.momirealms.customcrops.datamanager.CropManager;
import net.momirealms.customcrops.limits.MaxCropsPerChunk;
import net.momirealms.customcrops.integrations.IntegrationCheck;
import net.momirealms.customcrops.datamanager.MessageManager;
@@ -19,13 +17,12 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitScheduler;
import java.util.Objects;
public class RightClickCustomBlock implements Listener {
import static net.momirealms.customcrops.datamanager.CropManager.CROPS;
BukkitScheduler bukkitScheduler = Bukkit.getScheduler();
public class RightClickCustomBlock implements Listener {
@EventHandler
public void rightClickCustomBlock(CustomBlockInteractEvent event){
@@ -238,7 +235,7 @@ public class RightClickCustomBlock implements Listener {
return false;
}
//添加到缓存中
CropManager.putInstance(locUp, key);
CROPS.put(locUp, key);
//放置自定义农作物
CustomBlock.place(namespacedID.replace("_seeds","_stage_1"),locUp);
return true;
@@ -246,7 +243,6 @@ public class RightClickCustomBlock implements Listener {
private void waterPot(ItemStack itemStack, Player player, Location location){
//是否为IA物品
if(CustomStack.byItemStack(itemStack) == null) return;
bukkitScheduler.runTaskAsynchronously(CustomCrops.instance,()-> {
//获取IA物品
CustomStack customStack = CustomStack.byItemStack(itemStack);
String namespacedId = customStack.getNamespacedID();
@@ -285,11 +281,8 @@ public class RightClickCustomBlock implements Listener {
if(cb != null){
if(cb.getNamespacedID().equalsIgnoreCase(ConfigManager.Config.pot)){
//同步替换方块
bukkitScheduler.callSyncMethod(CustomCrops.instance,()->{
CustomBlock.remove(tempLoc);
CustomBlock.place(ConfigManager.Config.watered_pot,tempLoc);
return null;
});
}
}
}
@@ -307,16 +300,12 @@ public class RightClickCustomBlock implements Listener {
if(cb != null){
if(cb.getNamespacedID().equalsIgnoreCase(ConfigManager.Config.pot)){
//同步替换方块
bukkitScheduler.callSyncMethod(CustomCrops.instance,()->{
CustomBlock.remove(tempLoc);
CustomBlock.place(ConfigManager.Config.watered_pot,tempLoc);
return null;
});
}
}
}
}
}
});
}
}

View File

@@ -10,22 +10,19 @@ import org.bukkit.scheduler.BukkitScheduler;
public class TimeCheck extends BukkitRunnable {
BukkitScheduler bukkitScheduler = Bukkit.getScheduler();
@Override
public void run() {
ConfigManager.Config.worlds.forEach(world ->{
BukkitScheduler bukkitScheduler = Bukkit.getScheduler();
long time = Bukkit.getWorld(world).getTime();
ConfigManager.Config.cropGrowTimeList.forEach(cropGrowTime -> {
if(time == cropGrowTime){
bukkitScheduler.runTaskAsynchronously(CustomCrops.instance, CropManager::CropGrow);
bukkitScheduler.runTaskAsynchronously(CustomCrops.instance, () -> CropManager.CropGrow(world));
}
});
ConfigManager.Config.sprinklerWorkTimeList.forEach(sprinklerTime -> {
if(time == sprinklerTime){
bukkitScheduler.runTaskAsynchronously(CustomCrops.instance, SprinklerManager::SprinklerWork);
bukkitScheduler.runTaskAsynchronously(CustomCrops.instance, () -> SprinklerManager.SprinklerWork(world));
}
});
});

View File

@@ -58,11 +58,11 @@ config:
greenhouse-glass: customcrops:greenhouse_glass
#洒水器的家具
sprinkler-1: customcrops:sprinkler_1
#洒水器的方块的物品请以_item结尾
#洒水器的方块的2D物品
sprinkler-1-item: customcrops:sprinkler_1_item
#优质洒水器的家具
sprinkler-2: customcrops:sprinkler_2
#优质洒水器的方块的物品请以_item结尾
#优质洒水器的方块的2D物品
sprinkler-2-item: customcrops:sprinkler_2_item
#农作物枯萎后变成的方块,物品ID中请保留stage以保持其下方方块被破坏时枯萎作物也被破坏的特性
dead-crop: customcrops:crop_stage_death
@@ -111,3 +111,4 @@ messages:
summer: '&f夏'
autumn: '&f秋'
winter: '&f冬'
noperm: '&f权限不足'

View File

@@ -1,8 +1,7 @@
crops:
tomato:
#在IA配置文件中命名农作物时请以_seeds和_stage_X结尾否则会无法生长和种植
#只要遵循正确的命名规则,你可以无限自定义农作物阶段数量
tomato:
#每个生长点生长一个阶段的概率
#此项目必填0-1
grow-chance: 0.4
@@ -11,12 +10,23 @@ crops:
#若启用季节则必须填写此项目
#季节之间用逗号分隔
#可用的季节类型spring,summer,autumn,winter
#season: spring,summer
season: spring,summer
#空手收获后返回第几个生长状态
#不填写此项目则无法重复收获
#return: customcrops:tomato_stage_1
return: customcrops:tomato_stage_1
#巨大化植物,以极低的概率生长为另一种形态
#gigantic: customcrops:gigantic_tomato
#gigantic-chance: 0.01
gigantic: customcrops:gigantic_tomato
gigantic-chance: 0.01
cabbage:
grow-chance: 0.8
season: summer,autumn
gigantic: customcrops:gigantic_cabbage
gigantic-chance: 0.02
grape:
grow-chance: 0.5
season: autumn
return: customcrops:grape_stage_4

View File

@@ -1,10 +1,12 @@
name: CustomCrops
version: '1.4.0'
version: '1.4.3'
main: net.momirealms.customcrops.CustomCrops
api-version: 1.16
depend: [ ItemsAdder , ProtocolLib ]
depend: [ ItemsAdder ]
softdepend: [ PlaceholderAPI ]
authors: [ XiaoMoMi ]
commands:
customcrops:
usage: /customcrops <args>
permission-message: No Permission
permission: customcrops.admin