mirror of
https://github.com/Xiao-MoMi/Custom-Crops.git
synced 2025-12-26 18:39:17 +00:00
[Fix] Tripwire for sprinkler
This commit is contained in:
@@ -52,7 +52,6 @@ public class CustomCropsPluginImpl extends CustomCropsPlugin {
|
||||
private PacketManager packetManager;
|
||||
private CommandManager commandManager;
|
||||
private HologramManager hologramManager;
|
||||
private AntiGriefLib antiGriefLib;
|
||||
|
||||
@Override
|
||||
public void onLoad() {
|
||||
@@ -71,11 +70,6 @@ public class CustomCropsPluginImpl extends CustomCropsPlugin {
|
||||
Dependency.BSTATS_BUKKIT
|
||||
)
|
||||
));
|
||||
|
||||
this.antiGriefLib = AntiGriefLib.builder(this)
|
||||
.silentLogs(true)
|
||||
.ignoreOP(true)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -91,14 +85,18 @@ public class CustomCropsPluginImpl extends CustomCropsPlugin {
|
||||
this.requirementManager = new RequirementManagerImpl(this);
|
||||
this.coolDownManager = new CoolDownManager(this);
|
||||
this.worldManager = new WorldManagerImpl(this);
|
||||
this.itemManager = new ItemManagerImpl(this, antiGriefLib);
|
||||
this.itemManager = new ItemManagerImpl(this,
|
||||
AntiGriefLib.builder(this)
|
||||
.silentLogs(true)
|
||||
.ignoreOP(true)
|
||||
.build()
|
||||
);
|
||||
this.messageManager = new MessageManagerImpl(this);
|
||||
this.packetManager = new PacketManager(this);
|
||||
this.commandManager = new CommandManager(this);
|
||||
this.placeholderManager = new PlaceholderManagerImpl(this);
|
||||
this.hologramManager = new HologramManager(this);
|
||||
this.commandManager.init();
|
||||
this.antiGriefLib.init();
|
||||
this.integrationManager.init();
|
||||
this.disableNBTAPILogs();
|
||||
Migration.tryUpdating();
|
||||
|
||||
@@ -17,12 +17,10 @@
|
||||
|
||||
package net.momirealms.customcrops.compatibility;
|
||||
|
||||
import com.gamingmesh.jobs.Jobs;
|
||||
import net.momirealms.customcrops.api.CustomCropsPlugin;
|
||||
import net.momirealms.customcrops.api.integration.LevelInterface;
|
||||
import net.momirealms.customcrops.api.integration.SeasonInterface;
|
||||
import net.momirealms.customcrops.api.manager.IntegrationManager;
|
||||
import net.momirealms.customcrops.api.mechanic.world.season.Season;
|
||||
import net.momirealms.customcrops.api.util.LogUtils;
|
||||
import net.momirealms.customcrops.compatibility.item.MMOItemsItemImpl;
|
||||
import net.momirealms.customcrops.compatibility.item.MythicMobsItemImpl;
|
||||
@@ -32,7 +30,6 @@ import net.momirealms.customcrops.compatibility.level.*;
|
||||
import net.momirealms.customcrops.compatibility.season.AdvancedSeasonsImpl;
|
||||
import net.momirealms.customcrops.compatibility.season.InBuiltSeason;
|
||||
import net.momirealms.customcrops.compatibility.season.RealisticSeasonsImpl;
|
||||
import org.bukkit.World;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.HashMap;
|
||||
@@ -110,13 +107,6 @@ public class IntegrationManagerImpl implements IntegrationManager {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a level plugin with the specified name.
|
||||
*
|
||||
* @param plugin The name of the level plugin.
|
||||
* @param level The implementation of the LevelInterface.
|
||||
* @return true if the registration was successful, false if the plugin name is already registered.
|
||||
*/
|
||||
@Override
|
||||
public boolean registerLevelPlugin(String plugin, LevelInterface level) {
|
||||
if (levelPluginMap.containsKey(plugin)) return false;
|
||||
@@ -124,12 +114,6 @@ public class IntegrationManagerImpl implements IntegrationManager {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters a level plugin with the specified name.
|
||||
*
|
||||
* @param plugin The name of the level plugin to unregister.
|
||||
* @return true if the unregistration was successful, false if the plugin name is not found.
|
||||
*/
|
||||
@Override
|
||||
public boolean unregisterLevelPlugin(String plugin) {
|
||||
return levelPluginMap.remove(plugin) != null;
|
||||
@@ -139,12 +123,6 @@ public class IntegrationManagerImpl implements IntegrationManager {
|
||||
LogUtils.info( plugin + " hooked!");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the LevelInterface provided by a plugin.
|
||||
*
|
||||
* @param plugin The name of the plugin providing the LevelInterface.
|
||||
* @return The LevelInterface provided by the specified plugin, or null if the plugin is not registered.
|
||||
*/
|
||||
@Override
|
||||
@Nullable
|
||||
public LevelInterface getLevelPlugin(String plugin) {
|
||||
@@ -155,14 +133,4 @@ public class IntegrationManagerImpl implements IntegrationManager {
|
||||
public SeasonInterface getSeasonInterface() {
|
||||
return seasonInterface;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Season getSeason(World world) {
|
||||
return seasonInterface.getSeason(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDate(World world) {
|
||||
return seasonInterface.getDate(world);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
package net.momirealms.customcrops.compatibility.level;
|
||||
|
||||
import com.archyx.aureliumskills.api.AureliumAPI;
|
||||
import com.archyx.aureliumskills.leveler.Leveler;
|
||||
import net.momirealms.customcrops.api.integration.LevelInterface;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
|
||||
@@ -74,10 +74,10 @@ public class CCPapi extends PlaceholderExpansion {
|
||||
switch (split[0]) {
|
||||
case "season" -> {
|
||||
if (split.length == 1) {
|
||||
return MessageManager.seasonTranslation(plugin.getIntegrationManager().getSeason(player.getWorld()));
|
||||
return MessageManager.seasonTranslation(plugin.getIntegrationManager().getSeasonInterface().getSeason(player.getWorld()));
|
||||
} else {
|
||||
try {
|
||||
return MessageManager.seasonTranslation(plugin.getIntegrationManager().getSeason(Bukkit.getWorld(split[1])));
|
||||
return MessageManager.seasonTranslation(plugin.getIntegrationManager().getSeasonInterface().getSeason(Bukkit.getWorld(split[1])));
|
||||
} catch (NullPointerException e) {
|
||||
LogUtils.severe("World " + split[1] + " does not exist");
|
||||
e.printStackTrace();
|
||||
@@ -86,10 +86,10 @@ public class CCPapi extends PlaceholderExpansion {
|
||||
}
|
||||
case "date" -> {
|
||||
if (split.length == 1) {
|
||||
return String.valueOf(plugin.getIntegrationManager().getDate(player.getWorld()));
|
||||
return String.valueOf(plugin.getIntegrationManager().getSeasonInterface().getDate(player.getWorld()));
|
||||
} else {
|
||||
try {
|
||||
return String.valueOf(plugin.getIntegrationManager().getDate(Bukkit.getWorld(split[1])));
|
||||
return String.valueOf(plugin.getIntegrationManager().getSeasonInterface().getDate(Bukkit.getWorld(split[1])));
|
||||
} catch (NullPointerException e) {
|
||||
LogUtils.severe("World " + split[1] + " does not exist");
|
||||
e.printStackTrace();
|
||||
|
||||
@@ -24,9 +24,11 @@ import dev.jorel.commandapi.arguments.StringArgument;
|
||||
import net.momirealms.customcrops.api.CustomCropsPlugin;
|
||||
import net.momirealms.customcrops.api.common.Initable;
|
||||
import net.momirealms.customcrops.api.integration.SeasonInterface;
|
||||
import net.momirealms.customcrops.api.manager.AdventureManager;
|
||||
import net.momirealms.customcrops.api.manager.ConfigManager;
|
||||
import net.momirealms.customcrops.api.manager.MessageManager;
|
||||
import net.momirealms.customcrops.api.mechanic.item.ItemType;
|
||||
import net.momirealms.customcrops.api.mechanic.world.ChunkPos;
|
||||
import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
|
||||
import net.momirealms.customcrops.api.mechanic.world.level.CustomCropsChunk;
|
||||
import net.momirealms.customcrops.api.mechanic.world.level.CustomCropsSection;
|
||||
@@ -61,7 +63,8 @@ public class CommandManager implements Initable {
|
||||
getAboutCommand(),
|
||||
getSeasonCommand(),
|
||||
getDateCommand(),
|
||||
getForceTickCommand()
|
||||
getForceTickCommand(),
|
||||
getUnsafeCommand()
|
||||
)
|
||||
.register();
|
||||
}
|
||||
@@ -81,6 +84,23 @@ public class CommandManager implements Initable {
|
||||
});
|
||||
}
|
||||
|
||||
private CommandAPICommand getUnsafeCommand() {
|
||||
return new CommandAPICommand("unsafe")
|
||||
.withSubcommands(
|
||||
new CommandAPICommand("delete-chunk-data").executesPlayer((player, args) -> {
|
||||
CustomCropsPlugin.get().getWorldManager().getCustomCropsWorld(player.getWorld()).ifPresent(customCropsWorld -> {
|
||||
var optionalChunk = customCropsWorld.getLoadedChunkAt(ChunkPos.getByBukkitChunk(player.getChunk()));
|
||||
if (optionalChunk.isEmpty()) {
|
||||
AdventureManager.getInstance().sendMessageWithPrefix(player, "<white>This chunk doesn't have any data.");
|
||||
return;
|
||||
}
|
||||
customCropsWorld.deleteChunk(ChunkPos.getByBukkitChunk(player.getChunk()));
|
||||
AdventureManager.getInstance().sendMessageWithPrefix(player, "<white>Done.");
|
||||
});
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
private CommandAPICommand getAboutCommand() {
|
||||
return new CommandAPICommand("about").executes((sender, args) -> {
|
||||
plugin.getAdventure().sendMessage(sender, "<#FFA500>⛈ CustomCrops <gray>- <#87CEEB>" + CustomCropsPlugin.getInstance().getVersionManager().getPluginVersion());
|
||||
@@ -138,7 +158,7 @@ public class CommandManager implements Initable {
|
||||
plugin.getAdventure().sendMessageWithPrefix(sender, "CustomCrops is not enabled in that world");
|
||||
return;
|
||||
}
|
||||
plugin.getAdventure().sendMessageWithPrefix(sender, String.valueOf(plugin.getIntegrationManager().getDate(world)));
|
||||
plugin.getAdventure().sendMessageWithPrefix(sender, String.valueOf(plugin.getIntegrationManager().getSeasonInterface().getDate(world)));
|
||||
}),
|
||||
new CommandAPICommand("set")
|
||||
.withArguments(new StringArgument("world").replaceSuggestions(ArgumentSuggestions.strings(commandSenderSuggestionInfo -> plugin.getWorldManager().getCustomCropsWorlds().stream()
|
||||
@@ -196,7 +216,7 @@ public class CommandManager implements Initable {
|
||||
plugin.getAdventure().sendMessageWithPrefix(sender, "CustomCrops is not enabled in that world");
|
||||
return;
|
||||
}
|
||||
plugin.getAdventure().sendMessageWithPrefix(sender, MessageManager.seasonTranslation(plugin.getIntegrationManager().getSeason(world)));
|
||||
plugin.getAdventure().sendMessageWithPrefix(sender, MessageManager.seasonTranslation(plugin.getIntegrationManager().getSeasonInterface().getSeason(world)));
|
||||
}),
|
||||
new CommandAPICommand("set")
|
||||
.withArguments(new StringArgument("world").replaceSuggestions(ArgumentSuggestions.strings(commandSenderSuggestionInfo -> {
|
||||
|
||||
@@ -111,11 +111,6 @@ public class ConditionManagerImpl implements ConditionManager {
|
||||
return this.conditionBuilderMap.remove(type) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasCondition(String type) {
|
||||
return conditionBuilderMap.containsKey(type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull Condition[] getConditions(ConfigurationSection section) {
|
||||
ArrayList<Condition> conditions = new ArrayList<>();
|
||||
@@ -578,7 +573,7 @@ public class ConditionManagerImpl implements ConditionManager {
|
||||
registerCondition("suitable_season", (args) -> {
|
||||
HashSet<String> seasons = new HashSet<>(ConfigUtils.stringListArgs(args).stream().map(it -> it.toUpperCase(Locale.ENGLISH)).toList());
|
||||
return (block, offline) -> {
|
||||
Season season = plugin.getIntegrationManager().getSeason(block.getLocation().getBukkitWorld());
|
||||
Season season = plugin.getIntegrationManager().getSeasonInterface().getSeason(block.getLocation().getBukkitWorld());
|
||||
if (season == null) {
|
||||
return true;
|
||||
}
|
||||
@@ -602,7 +597,7 @@ public class ConditionManagerImpl implements ConditionManager {
|
||||
registerCondition("unsuitable_season", (args) -> {
|
||||
HashSet<String> seasons = new HashSet<>(ConfigUtils.stringListArgs(args).stream().map(it -> it.toUpperCase(Locale.ENGLISH)).toList());
|
||||
return (block, offline) -> {
|
||||
Season season = plugin.getIntegrationManager().getSeason(block.getLocation().getBukkitWorld());
|
||||
Season season = plugin.getIntegrationManager().getSeasonInterface().getSeason(block.getLocation().getBukkitWorld());
|
||||
if (season == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -742,6 +742,79 @@ public class ItemManagerImpl implements ItemManager {
|
||||
}
|
||||
|
||||
this.registerItemFunction(itemID, FunctionTrigger.INTERACT_AT,
|
||||
/*
|
||||
* Handle clicking sprinkler with a watering can
|
||||
*/
|
||||
new CFunction(conditionWrapper -> {
|
||||
if (!(conditionWrapper instanceof InteractBlockWrapper blockWrapper)) {
|
||||
return FunctionResult.PASS;
|
||||
}
|
||||
// is a pot
|
||||
Block block = blockWrapper.getClickedBlock();
|
||||
Sprinkler sprinkler = getSprinklerBy3DItemID(customProvider.getBlockID(block));
|
||||
if (sprinkler == null) {
|
||||
return FunctionResult.PASS;
|
||||
}
|
||||
final Player player = blockWrapper.getPlayer();
|
||||
final ItemStack itemInHand = blockWrapper.getItemInHand();
|
||||
final Location clicked = block.getLocation();
|
||||
State state = new State(player, itemInHand, clicked);
|
||||
// check watering-can requirements
|
||||
if (!RequirementManager.isRequirementMet(state, wateringCan.getRequirements())) {
|
||||
return FunctionResult.RETURN;
|
||||
}
|
||||
// check whitelist
|
||||
if (!wateringCan.getSprinklerWhitelist().contains(sprinkler.getKey())) {
|
||||
wateringCan.trigger(ActionTrigger.WRONG_SPRINKLER, state);
|
||||
return FunctionResult.RETURN;
|
||||
}
|
||||
// get water in can
|
||||
int waterInCan = wateringCan.getCurrentWater(itemInHand);
|
||||
|
||||
// check sprinkler requirements
|
||||
if (!RequirementManager.isRequirementMet(state, sprinkler.getUseRequirements())) {
|
||||
return FunctionResult.RETURN;
|
||||
}
|
||||
// check whitelist
|
||||
if (!wateringCan.getSprinklerWhitelist().contains(sprinkler.getKey())) {
|
||||
wateringCan.trigger(ActionTrigger.WRONG_SPRINKLER, state);
|
||||
return FunctionResult.RETURN;
|
||||
}
|
||||
// check amount of water
|
||||
if (waterInCan > 0 || wateringCan.isInfinite()) {
|
||||
// get sprinkler data
|
||||
SimpleLocation simpleLocation = SimpleLocation.of(clicked);
|
||||
Optional<WorldSprinkler> worldSprinkler = plugin.getWorldManager().getSprinklerAt(simpleLocation);
|
||||
if (worldSprinkler.isEmpty()) {
|
||||
plugin.debug("Player " + player.getName() + " tried to interact a sprinkler which not exists in memory. Fixing the data...");
|
||||
WorldSprinkler sp = new MemorySprinkler(simpleLocation, sprinkler.getKey(), 0);
|
||||
plugin.getWorldManager().addSprinklerAt(sp, simpleLocation);
|
||||
worldSprinkler = Optional.of(sp);
|
||||
} else {
|
||||
if (sprinkler.getStorage() <= worldSprinkler.get().getWater()) {
|
||||
return FunctionResult.RETURN;
|
||||
}
|
||||
}
|
||||
|
||||
// fire the event
|
||||
WateringCanWaterEvent waterEvent = new WateringCanWaterEvent(player, itemInHand, new HashSet<>(Set.of(clicked)), wateringCan, worldSprinkler.get());
|
||||
if (EventUtils.fireAndCheckCancel(waterEvent))
|
||||
return FunctionResult.CANCEL_EVENT_AND_RETURN;
|
||||
|
||||
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
|
||||
state.setArg("{current}", String.valueOf(waterInCan - 1));
|
||||
state.setArg("{water_bar}", wateringCan.getWaterBar() == null ? "" : wateringCan.getWaterBar().getWaterBar(waterInCan - 1, wateringCan.getStorage()));
|
||||
wateringCan.updateItem(player, itemInHand, waterInCan - 1, state.getArgs());
|
||||
wateringCan.trigger(ActionTrigger.CONSUME_WATER, state);
|
||||
plugin.getWorldManager().addWaterToSprinkler(sprinkler, simpleLocation, 1);
|
||||
} else {
|
||||
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
|
||||
state.setArg("{current}", "0");
|
||||
state.setArg("{water_bar}", wateringCan.getWaterBar() == null ? "" : wateringCan.getWaterBar().getWaterBar(0, wateringCan.getStorage()));
|
||||
wateringCan.trigger(ActionTrigger.NO_WATER, state);
|
||||
}
|
||||
return FunctionResult.RETURN;
|
||||
}, CFunction.FunctionPriority.HIGH),
|
||||
/*
|
||||
* Handle clicking pot with a watering can
|
||||
*/
|
||||
@@ -893,6 +966,9 @@ public class ItemManagerImpl implements ItemManager {
|
||||
}
|
||||
return FunctionResult.RETURN;
|
||||
}, CFunction.FunctionPriority.NORMAL),
|
||||
/*
|
||||
* Handle clicking crop with a watering can
|
||||
*/
|
||||
new CFunction(conditionWrapper -> {
|
||||
if (!(conditionWrapper instanceof InteractFurnitureWrapper furnitureWrapper)) {
|
||||
return FunctionResult.PASS;
|
||||
@@ -1316,12 +1392,12 @@ public class ItemManagerImpl implements ItemManager {
|
||||
* Interact the sprinkler
|
||||
*/
|
||||
new CFunction(conditionWrapper -> {
|
||||
if (!(conditionWrapper instanceof InteractFurnitureWrapper interactFurnitureWrapper)) {
|
||||
if (!(conditionWrapper instanceof InteractWrapper interactWrapper)) {
|
||||
return FunctionResult.PASS;
|
||||
}
|
||||
ItemStack itemInHand = interactFurnitureWrapper.getItemInHand();
|
||||
Player player = interactFurnitureWrapper.getPlayer();
|
||||
Location location = interactFurnitureWrapper.getLocation();
|
||||
ItemStack itemInHand = interactWrapper.getItemInHand();
|
||||
Player player = interactWrapper.getPlayer();
|
||||
Location location = interactWrapper.getLocation();
|
||||
// check use requirements
|
||||
State state = new State(player, itemInHand, location);
|
||||
if (!RequirementManager.isRequirementMet(state, sprinkler.getUseRequirements())) {
|
||||
@@ -1381,6 +1457,7 @@ public class ItemManagerImpl implements ItemManager {
|
||||
state.setArg("{current}", String.valueOf(sprinkler.getStorage()));
|
||||
state.setArg("{water_bar}", sprinkler.getWaterBar() == null ? "" : sprinkler.getWaterBar().getWaterBar(sprinkler.getStorage(), sprinkler.getStorage()));
|
||||
sprinkler.trigger(ActionTrigger.FULL, state);
|
||||
return FunctionResult.CANCEL_EVENT_AND_RETURN;
|
||||
}
|
||||
}
|
||||
return FunctionResult.RETURN;
|
||||
@@ -1394,14 +1471,14 @@ public class ItemManagerImpl implements ItemManager {
|
||||
|
||||
this.registerItemFunction(new String[]{sprinkler.get3DItemID(), sprinkler.get3DItemWithWater()}, FunctionTrigger.BE_INTERACTED,
|
||||
new CFunction(conditionWrapper -> {
|
||||
if (!(conditionWrapper instanceof InteractFurnitureWrapper interactFurnitureWrapper)) {
|
||||
if (!(conditionWrapper instanceof InteractWrapper interactWrapper)) {
|
||||
return FunctionResult.PASS;
|
||||
}
|
||||
|
||||
Location location = interactFurnitureWrapper.getLocation();
|
||||
Location location = interactWrapper.getLocation();
|
||||
// trigger interact actions
|
||||
plugin.getScheduler().runTaskSyncLater(() -> {
|
||||
State state = new State(interactFurnitureWrapper.getPlayer(), interactFurnitureWrapper.getItemInHand(), location);
|
||||
State state = new State(interactWrapper.getPlayer(), interactWrapper.getItemInHand(), location);
|
||||
Optional<WorldSprinkler> optionalSprinkler = plugin.getWorldManager().getSprinklerAt(SimpleLocation.of(location));
|
||||
if (optionalSprinkler.isEmpty()) {
|
||||
return;
|
||||
@@ -2071,6 +2148,7 @@ public class ItemManagerImpl implements ItemManager {
|
||||
plugin.getWorldManager().addWaterToPot(pot, simpleLocation, method.getAmount());
|
||||
} else {
|
||||
pot.trigger(ActionTrigger.FULL, state);
|
||||
return FunctionResult.CANCEL_EVENT_AND_RETURN;
|
||||
}
|
||||
}
|
||||
return FunctionResult.RETURN;
|
||||
|
||||
@@ -145,9 +145,15 @@ public abstract class AbstractCustomListener implements Listener {
|
||||
|
||||
@EventHandler (ignoreCancelled = true)
|
||||
public void onPlaceBlock(BlockPlaceEvent event) {
|
||||
onPlaceBlock(
|
||||
final Block block = event.getBlock();
|
||||
// prevent players from placing blocks on entities (crops/sprinklers)
|
||||
if (CustomCropsPlugin.get().getWorldManager().getBlockAt(SimpleLocation.of(block.getLocation())).isPresent()) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
this.onPlaceBlock(
|
||||
event.getPlayer(),
|
||||
event.getBlock(),
|
||||
block,
|
||||
event.getBlockPlaced().getType().name(),
|
||||
event
|
||||
);
|
||||
|
||||
@@ -146,11 +146,6 @@ public class RequirementManagerImpl implements RequirementManager {
|
||||
return requirements.toArray(new Requirement[0]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasRequirement(String type) {
|
||||
return requirementBuilderMap.containsKey(type);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Requirement getRequirement(ConfigurationSection section, boolean advanced) {
|
||||
|
||||
@@ -276,6 +276,11 @@ public class CWorld implements CustomCropsWorld {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteChunk(ChunkPos chunkPos) {
|
||||
CChunk chunk = loadedChunks.remove(chunkPos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInfoData(WorldInfoData infoData) {
|
||||
this.infoData = infoData;
|
||||
|
||||
Reference in New Issue
Block a user