Merge remote-tracking branch 'upstream/development'
This commit is contained in:
commit
14db0cc807
|
@ -1,31 +1,10 @@
|
|||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.settings
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
/.gradle/
|
||||
/.settings/
|
||||
.idea/
|
||||
build/
|
||||
target/
|
||||
## JetBrains IDEs
|
||||
/.idea/
|
||||
*.iml
|
||||
/bin/
|
||||
|
||||
## Maven
|
||||
/**/target/
|
||||
/dependency-reduced-pom.xml
|
||||
|
||||
## Misc.
|
||||
.DS_Store
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
<!--suppress HtmlDeprecatedAttribute -->
|
||||
<div align="center">
|
||||
<img src="https://craftaro.com/images/products/275/icons/9Ly29yOCtoQ2rVRZXHdnG0DjzDCpZlj49FFltuzq.png" width="128px">
|
||||
|
||||
# UltimateTimber
|
||||
**Give your players a new and exciting way to chop down trees.**
|
||||
**Includes animated block falling, excellent tree detection, custom drops, realistic sounds, and more.**
|
||||
|
||||
|
||||
[![Discord][Discord shield]][Discord invite]
|
||||
[![Patreon][Patreon shield]][Patreon page]
|
||||
<br>
|
||||
[![Latest version][Latest version shield]][Marketplace page]
|
||||
[![bStats Servers][bStats shield]][bStats page]
|
||||
</div>
|
||||
|
||||
|
||||
## Download (Marketplace)
|
||||
You can visit [our marketplace][Marketplace page] to download UltimateTimber as well as take a
|
||||
look at many other fantastic plugins which are sure to catch your eye.
|
||||
|
||||
## Documentation
|
||||
You can find all the information about UltimateTimber, including dependencies, commands, permissions and incompatible
|
||||
plugins on [our wiki][Plugin wiki].
|
||||
|
||||
Feel free to also contribute to the wiki as a way to help others in the community with using the plugin.
|
||||
|
||||
## Support
|
||||
If you encounter any issues while using the plugin, feel free to contact us on
|
||||
[our Discord server][Discord invite].
|
||||
|
||||
## Suggestions
|
||||
For suggestions about features you think should be added to the plugin to increase its functionality, feel free to
|
||||
create a thread over on [our Discord server][Discord invite].
|
||||
|
||||
|
||||
[Marketplace page]: https://craftaro.com/marketplace/product/18
|
||||
[Plugin wiki]: https://wiki.craftaro.com/index.php/Ultimate_Timber
|
||||
[Patreon page]: https://www.patreon.com/join/songoda
|
||||
[Discord invite]: https://discord.gg/craftaro
|
||||
[bStats page]: https://bstats.org/plugin/bukkit/UltimateTimber/4184
|
||||
|
||||
[Patreon shield]: https://img.shields.io/badge/-Support_us_on_Patreon-F96854.svg?logo=patreon&style=flat&logoColor=white
|
||||
[Discord shield]: https://img.shields.io/discord/293212540723396608?color=5865F2&label=Discord&logo=discord&logoColor=5865F2
|
||||
[bStats shield]: https://img.shields.io/bstats/servers/4184?label=Servers
|
||||
[Latest version shield]: https://img.shields.io/badge/dynamic/xml?style=flat&color=blue&logo=github&logoColor=white&label=Latest&url=https%3A%2F%2Fraw.githubusercontent.com%2Fcraftaro%2FUltimateTimber%2Fmaster%2Fpom.xml&query=%2F*%5Blocal-name()%3D'project'%5D%2F*%5Blocal-name()%3D'version'%5D
|
Binary file not shown.
Binary file not shown.
|
@ -1,29 +0,0 @@
|
|||
<project xmlns="http://maven.apache.org/POM/4.0.0">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>com.songoda</groupId>
|
||||
<artifactId>UltimateTimber</artifactId>
|
||||
<version>2.3.7</version>
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>Core</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot-api</artifactId>
|
||||
<version>1.18-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.songoda</groupId>
|
||||
<artifactId>SongodaCore</artifactId>
|
||||
<version>2.6.19</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
|
@ -1,9 +0,0 @@
|
|||
package com.songoda.ultimatetimber.tree;
|
||||
|
||||
/**
|
||||
* Represents a tree block type and whether it is a log or a leaf block
|
||||
*/
|
||||
public enum TreeBlockType {
|
||||
LOG,
|
||||
LEAF
|
||||
}
|
Binary file not shown.
|
@ -1,123 +0,0 @@
|
|||
<project xmlns="http://maven.apache.org/POM/4.0.0">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>com.songoda</groupId>
|
||||
<artifactId>UltimateTimber</artifactId>
|
||||
<version>2.3.7</version>
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>Plugin</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<build>
|
||||
<finalName>${project.parent.artifactId}-${project.parent.version}</finalName>
|
||||
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.3.2</version>
|
||||
<configuration>
|
||||
<showDeprecation>false</showDeprecation>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>com.google.code.maven-replacer-plugin</groupId>
|
||||
<artifactId>replacer</artifactId>
|
||||
<version>1.5.3</version>
|
||||
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>prepare-package</phase>
|
||||
<goals>
|
||||
<goal>replace</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
|
||||
<configuration>
|
||||
<file>${project.build.directory}/classes/plugin.yml</file>
|
||||
|
||||
<replacements>
|
||||
<replacement>
|
||||
<token>maven-version-number</token>
|
||||
<value>${project.version}</value>
|
||||
</replacement>
|
||||
</replacements>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.3.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>shaded</id>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
|
||||
<configuration>
|
||||
<shadedArtifactAttached>false</shadedArtifactAttached>
|
||||
<createDependencyReducedPom>false</createDependencyReducedPom>
|
||||
<minimizeJar>true</minimizeJar>
|
||||
|
||||
<artifactSet>
|
||||
<includes>
|
||||
<include>com.songoda:SongodaCore</include>
|
||||
<include>com.songoda:Core</include>
|
||||
</includes>
|
||||
</artifactSet>
|
||||
|
||||
<filters>
|
||||
<filter>
|
||||
<artifact>*:*</artifact>
|
||||
<excludes>
|
||||
<exclude>META-INF/*.SF</exclude>
|
||||
<exclude>META-INF/*.DSA</exclude>
|
||||
<exclude>META-INF/*.RSA</exclude>
|
||||
</excludes>
|
||||
</filter>
|
||||
|
||||
<filter>
|
||||
<artifact>com.songoda:Lootables</artifact>
|
||||
<excludes>
|
||||
<exclude>com/songoda/core/**</exclude>
|
||||
</excludes>
|
||||
</filter>
|
||||
</filters>
|
||||
|
||||
<relocations>
|
||||
<relocation>
|
||||
<pattern>com.songoda.core</pattern>
|
||||
<shadedPattern>${project.groupId}.ultimatetimber.core</shadedPattern>
|
||||
</relocation>
|
||||
</relocations>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot-api</artifactId>
|
||||
<version>1.18-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>${project.groupId}</groupId>
|
||||
<artifactId>Core</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
|
@ -1,27 +0,0 @@
|
|||
package com.songoda.ultimatetimber.utils;
|
||||
|
||||
import com.songoda.core.compatibility.CompatibleSound;
|
||||
import com.songoda.ultimatetimber.tree.ITreeBlock;
|
||||
import com.songoda.ultimatetimber.tree.TreeBlockType;
|
||||
import org.bukkit.Location;
|
||||
|
||||
public class SoundUtils {
|
||||
|
||||
public static void playFallingSound(ITreeBlock block) {
|
||||
Location location = block.getLocation();
|
||||
if (location.getWorld() == null) return;
|
||||
CompatibleSound.BLOCK_CHEST_OPEN.play(location.getWorld(), location, 2F, 0.1F);
|
||||
}
|
||||
|
||||
public static void playLandingSound(ITreeBlock block) {
|
||||
Location location = block.getLocation();
|
||||
if (location.getWorld() == null) return;
|
||||
|
||||
if (block.getTreeBlockType().equals(TreeBlockType.LOG)) {
|
||||
CompatibleSound.BLOCK_WOOD_FALL.play(location.getWorld(), location, 2F, 0.1F);
|
||||
} else {
|
||||
CompatibleSound.BLOCK_GRASS_BREAK.play(location.getWorld(), location, 0.5F, 0.75F);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
175
pom.xml
175
pom.xml
|
@ -1,115 +1,122 @@
|
|||
<project xmlns="http://maven.apache.org/POM/4.0.0">
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.songoda</groupId>
|
||||
<artifactId>UltimateTimber</artifactId>
|
||||
<version>2.3.7</version>
|
||||
<packaging>pom</packaging>
|
||||
<version>2.4.0-SNAPSHOT</version>
|
||||
|
||||
<!-- Run 'mvn versions:set -DgenerateBackupPoms=false -DnewVersion=X.Y.Z' to update version recursively -->
|
||||
<name>UltimateTimber</name>
|
||||
<description>Give your players a new and exciting way to chop down trees</description>
|
||||
<url>https://craftaro.com/marketplace/product/18</url>
|
||||
|
||||
<modules>
|
||||
<module>UltimateTimber/Core</module>
|
||||
<module>UltimateTimber/Plugin</module>
|
||||
</modules>
|
||||
<properties>
|
||||
<maven.compiler.release>8</maven.compiler.release>
|
||||
<maven.compiler.target>1.8</maven.compiler.target>
|
||||
<maven.compiler.source>1.8</maven.compiler.source>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>public</id>
|
||||
<url>https://repo.songoda.com/repository/public/</url>
|
||||
</repository>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<repository>
|
||||
<id>spigot-repo</id>
|
||||
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>apache.snapshots</id>
|
||||
<url>https://repository.apache.org/snapshots/</url>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
<issueManagement>
|
||||
<url>https://discord.gg/craftaro</url>
|
||||
<system>Discord server</system>
|
||||
</issueManagement>
|
||||
|
||||
<scm>
|
||||
<url>https://github.com/craftaro/UltimateTimber</url>
|
||||
<connection>scm:git:git://github.com/craftaro/UltimateTimber.git</connection>
|
||||
</scm>
|
||||
|
||||
<build>
|
||||
<defaultGoal>clean install</defaultGoal>
|
||||
<sourceDirectory>src</sourceDirectory>
|
||||
<testSourceDirectory>test</testSourceDirectory>
|
||||
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.1</version>
|
||||
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-antrun-plugin</artifactId>
|
||||
<version>1.7</version>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.4.1</version>
|
||||
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>validate</phase>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>run</goal>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
|
||||
<configuration>
|
||||
<finalName>${project.name}-${project.version}</finalName>
|
||||
|
||||
<shadedArtifactAttached>false</shadedArtifactAttached>
|
||||
<useDependencyReducedPomInJar>true</useDependencyReducedPomInJar>
|
||||
<minimizeJar>true</minimizeJar>
|
||||
|
||||
<relocations>
|
||||
<relocation>
|
||||
<pattern>com.craftaro.core</pattern>
|
||||
<shadedPattern>com.songoda.ultimatetimber.core</shadedPattern>
|
||||
</relocation>
|
||||
</relocations>
|
||||
|
||||
<filters>
|
||||
<filter>
|
||||
<artifact>*:*</artifact>
|
||||
|
||||
<excludes>
|
||||
<exclude>META-INF/**</exclude>
|
||||
<exclude>LICENSE</exclude>
|
||||
<exclude>LICENSE.**</exclude>
|
||||
</excludes>
|
||||
</filter>
|
||||
|
||||
<filter>
|
||||
<artifact>com.craftaro:CraftaroCore</artifact>
|
||||
<excludeDefaults>false</excludeDefaults>
|
||||
<includes>
|
||||
<include>**/nms/v*/**</include>
|
||||
</includes>
|
||||
</filter>
|
||||
</filters>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
|
||||
<inherited>false</inherited>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-dependency-plugin</artifactId>
|
||||
<version>2.8</version>
|
||||
|
||||
<configuration>
|
||||
<outputDirectory>jars</outputDirectory>
|
||||
<stripVersion>true</stripVersion>
|
||||
|
||||
<artifactItems>
|
||||
<artifactItem>
|
||||
<groupId>${project.groupId}</groupId>
|
||||
<artifactId>McMMO</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</artifactItem>
|
||||
|
||||
<artifactItem>
|
||||
<groupId>${project.groupId}</groupId>
|
||||
<artifactId>Plugin</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</artifactItem>
|
||||
|
||||
<artifactItem>
|
||||
<groupId>${project.groupId}</groupId>
|
||||
<artifactId>Core</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</artifactItem>
|
||||
</artifactItems>
|
||||
</configuration>
|
||||
|
||||
<inherited>false</inherited>
|
||||
</plugin>
|
||||
</plugins>
|
||||
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>resources</directory>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
</resource>
|
||||
</resources>
|
||||
</build>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>craftaro-minecraft-plugins</id>
|
||||
<url>https://repo.craftaro.com/repository/minecraft-plugins/</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>SpigotMC</id>
|
||||
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.craftaro</groupId>
|
||||
<artifactId>CraftaroCore</artifactId>
|
||||
<version>3.0.0-SNAPSHOT</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- TODO: Check if spigot-api can be downgraded to 1.8 -->
|
||||
<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot-api</artifactId>
|
||||
<version>1.18-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
package com.songoda.ultimatetimber;
|
||||
|
||||
import com.songoda.core.SongodaCore;
|
||||
import com.songoda.core.SongodaPlugin;
|
||||
import com.songoda.core.compatibility.CompatibleMaterial;
|
||||
import com.songoda.core.configuration.Config;
|
||||
import com.songoda.core.hooks.LogManager;
|
||||
import com.craftaro.core.SongodaCore;
|
||||
import com.craftaro.core.SongodaPlugin;
|
||||
import com.craftaro.core.commands.CommandManager;
|
||||
import com.craftaro.core.configuration.Config;
|
||||
import com.craftaro.core.hooks.LogManager;
|
||||
import com.craftaro.core.third_party.com.cryptomorin.xseries.XMaterial;
|
||||
import com.songoda.ultimatetimber.commands.CommandGiveAxe;
|
||||
import com.songoda.ultimatetimber.commands.CommandReload;
|
||||
import com.songoda.ultimatetimber.commands.CommandToggle;
|
||||
|
@ -18,19 +19,16 @@ import com.songoda.ultimatetimber.manager.TreeDefinitionManager;
|
|||
import com.songoda.ultimatetimber.manager.TreeDetectionManager;
|
||||
import com.songoda.ultimatetimber.manager.TreeFallManager;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class UltimateTimber extends SongodaPlugin {
|
||||
|
||||
private static UltimateTimber INSTANCE;
|
||||
|
||||
private Set<Manager> managers;
|
||||
private final Set<Manager> managers = new HashSet<>();
|
||||
|
||||
private ChoppingManager choppingManager;
|
||||
private ConfigurationManager configurationManager;
|
||||
private com.songoda.core.commands.CommandManager commandManager;
|
||||
private PlacedBlockManager placedBlockManager;
|
||||
private SaplingManager saplingManager;
|
||||
private TreeAnimationManager treeAnimationManager;
|
||||
|
@ -38,26 +36,29 @@ public class UltimateTimber extends SongodaPlugin {
|
|||
private TreeDetectionManager treeDetectionManager;
|
||||
private TreeFallManager treeFallManager;
|
||||
|
||||
/**
|
||||
* @deprecated Use {@link #getPlugin(Class)} instead
|
||||
*/
|
||||
@Deprecated
|
||||
public static UltimateTimber getInstance() {
|
||||
return INSTANCE;
|
||||
return getPlugin(UltimateTimber.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPluginLoad() {
|
||||
INSTANCE = this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPluginEnable() {
|
||||
// Run Songoda Updater
|
||||
SongodaCore.registerPlugin(this, 18, CompatibleMaterial.IRON_AXE);
|
||||
SongodaCore.registerPlugin(this, 18, XMaterial.IRON_AXE);
|
||||
|
||||
// Load hooks
|
||||
LogManager.load();
|
||||
|
||||
// Setup plugin commands
|
||||
this.commandManager = new com.songoda.core.commands.CommandManager(this);
|
||||
this.commandManager.addMainCommand("ut")
|
||||
CommandManager commandManager = new CommandManager(this);
|
||||
commandManager.addMainCommand("ut")
|
||||
.addSubCommands(
|
||||
new CommandReload(this),
|
||||
new CommandToggle(this),
|
||||
|
@ -65,7 +66,6 @@ public class UltimateTimber extends SongodaPlugin {
|
|||
);
|
||||
|
||||
// Register managers
|
||||
this.managers = new HashSet<>();
|
||||
this.choppingManager = this.registerManager(ChoppingManager.class);
|
||||
this.configurationManager = new ConfigurationManager(this);
|
||||
this.placedBlockManager = this.registerManager(PlacedBlockManager.class);
|
||||
|
@ -80,7 +80,8 @@ public class UltimateTimber extends SongodaPlugin {
|
|||
|
||||
@Override
|
||||
public void onPluginDisable() {
|
||||
this.disable();
|
||||
this.configurationManager.disable();
|
||||
this.managers.forEach(Manager::disable);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -96,15 +97,7 @@ public class UltimateTimber extends SongodaPlugin {
|
|||
|
||||
@Override
|
||||
public List<Config> getExtraConfig() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disables most of the plugin
|
||||
*/
|
||||
public void disable() {
|
||||
this.configurationManager.disable();
|
||||
this.managers.forEach(Manager::disable);
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -125,76 +118,35 @@ public class UltimateTimber extends SongodaPlugin {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the chopping manager
|
||||
*
|
||||
* @return The ChoppingManager instance
|
||||
*/
|
||||
public ChoppingManager getChoppingManager() {
|
||||
return this.choppingManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the configuration manager
|
||||
*
|
||||
* @return The ConfigurationManager instance
|
||||
*/
|
||||
public ConfigurationManager getConfigurationManager() {
|
||||
return this.configurationManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the placed block manager
|
||||
*
|
||||
* @return The PlacedBlockManager instance
|
||||
*/
|
||||
public PlacedBlockManager getPlacedBlockManager() {
|
||||
return this.placedBlockManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the sapling manager
|
||||
*
|
||||
* @return The SaplingManager instance
|
||||
*/
|
||||
public SaplingManager getSaplingManager() {
|
||||
return this.saplingManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the tree animation manager
|
||||
*
|
||||
* @return The TreeAnimationManager instance
|
||||
*/
|
||||
public TreeAnimationManager getTreeAnimationManager() {
|
||||
return this.treeAnimationManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the tree definition manager
|
||||
*
|
||||
* @return The TreeDefinitionManager instance
|
||||
*/
|
||||
public TreeDefinitionManager getTreeDefinitionManager() {
|
||||
return this.treeDefinitionManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the tree detection manager
|
||||
*
|
||||
* @return The TreeDetectionManager instance
|
||||
*/
|
||||
public TreeDetectionManager getTreeDetectionManager() {
|
||||
return this.treeDetectionManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the tree fall manager
|
||||
*
|
||||
* @return The TreeFallManager instance
|
||||
*/
|
||||
public TreeFallManager getTreeFallManager() {
|
||||
return this.treeFallManager;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,7 +1,8 @@
|
|||
package com.songoda.ultimatetimber.animation;
|
||||
|
||||
import com.songoda.core.compatibility.CompatibleHand;
|
||||
import com.songoda.core.compatibility.CompatibleMaterial;
|
||||
import com.craftaro.core.compatibility.CompatibleHand;
|
||||
import com.craftaro.core.compatibility.CompatibleMaterial;
|
||||
import com.craftaro.core.third_party.com.cryptomorin.xseries.XMaterial;
|
||||
import com.songoda.ultimatetimber.UltimateTimber;
|
||||
import com.songoda.ultimatetimber.tree.DetectedTree;
|
||||
import com.songoda.ultimatetimber.tree.FallingTreeBlock;
|
||||
|
@ -9,7 +10,6 @@ import com.songoda.ultimatetimber.tree.ITreeBlock;
|
|||
import com.songoda.ultimatetimber.tree.TreeBlock;
|
||||
import com.songoda.ultimatetimber.tree.TreeBlockSet;
|
||||
import com.songoda.ultimatetimber.utils.BlockUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
|
@ -19,7 +19,6 @@ import org.bukkit.entity.Player;
|
|||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public abstract class TreeAnimation {
|
||||
|
||||
protected final TreeAnimationType treeAnimationType;
|
||||
protected final DetectedTree detectedTree;
|
||||
protected final Player player;
|
||||
|
@ -99,9 +98,8 @@ public abstract class TreeAnimation {
|
|||
protected FallingTreeBlock convertToFallingBlock(TreeBlock treeBlock) {
|
||||
Location location = treeBlock.getLocation().clone().add(0.5, 0, 0.5);
|
||||
Block block = treeBlock.getBlock();
|
||||
CompatibleMaterial material = CompatibleMaterial.getMaterial(block);
|
||||
|
||||
if (material.isAir()) {
|
||||
XMaterial material = CompatibleMaterial.getMaterial(block.getType()).get();
|
||||
if (CompatibleMaterial.isAir(material)) {
|
||||
this.replaceBlock(treeBlock);
|
||||
return null;
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
package com.songoda.ultimatetimber.animation;
|
||||
|
||||
import com.songoda.core.compatibility.CompatibleMaterial;
|
||||
import com.craftaro.core.compatibility.CompatibleMaterial;
|
||||
import com.songoda.ultimatetimber.UltimateTimber;
|
||||
import com.songoda.ultimatetimber.manager.ConfigurationManager;
|
||||
import com.songoda.ultimatetimber.tree.DetectedTree;
|
||||
|
@ -24,7 +24,6 @@ import java.util.Comparator;
|
|||
import java.util.List;
|
||||
|
||||
public class TreeAnimationCrumble extends TreeAnimation {
|
||||
|
||||
public TreeAnimationCrumble(DetectedTree detectedTree, Player player) {
|
||||
super(TreeAnimationType.CRUMBLE, detectedTree, player);
|
||||
}
|
||||
|
@ -64,29 +63,35 @@ public class TreeAnimationCrumble extends TreeAnimation {
|
|||
List<ITreeBlock<Block>> partition = treeBlocks.get(0);
|
||||
for (int i = 0; i < 3 && !partition.isEmpty(); i++) {
|
||||
ITreeBlock<Block> treeBlock = partition.remove(0);
|
||||
if (treeBlock.getTreeBlockType().equals(TreeBlockType.LOG)) {
|
||||
if (td.getLogMaterial().stream().noneMatch(x -> x.equals(CompatibleMaterial.getMaterial(treeBlock.getBlock()))))
|
||||
if (treeBlock.getTreeBlockType() == TreeBlockType.LOG) {
|
||||
if (td.getLogMaterial().stream().noneMatch(x -> x == CompatibleMaterial.getMaterial(treeBlock.getBlock().getType()).orElse(null))) {
|
||||
continue;
|
||||
} else if (treeBlock.getTreeBlockType().equals(TreeBlockType.LEAF)) {
|
||||
if (td.getLeafMaterial().stream().noneMatch(x -> x.equals(CompatibleMaterial.getMaterial(treeBlock.getBlock()))))
|
||||
}
|
||||
} else if (treeBlock.getTreeBlockType() == TreeBlockType.LEAF) {
|
||||
if (td.getLeafMaterial().stream().noneMatch(x -> x == CompatibleMaterial.getMaterial(treeBlock.getBlock().getType()).orElse(null))) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
FallingTreeBlock fallingTreeBlock = TreeAnimationCrumble.this.convertToFallingBlock((TreeBlock)treeBlock);
|
||||
if (fallingTreeBlock == null)
|
||||
FallingTreeBlock fallingTreeBlock = TreeAnimationCrumble.this.convertToFallingBlock((TreeBlock) treeBlock);
|
||||
if (fallingTreeBlock == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
BlockUtils.toggleGravityFallingBlock(fallingTreeBlock.getBlock(), true);
|
||||
fallingTreeBlock.getBlock().setVelocity(Vector.getRandom().setY(0).subtract(new Vector(0.5, 0, 0.5)).multiply(0.15));
|
||||
TreeAnimationCrumble.this.fallingTreeBlocks.add(fallingTreeBlock);
|
||||
|
||||
if (TreeAnimationCrumble.this.fallingTreeBlocks == null)
|
||||
if (TreeAnimationCrumble.this.fallingTreeBlocks == null) {
|
||||
TreeAnimationCrumble.this.fallingTreeBlocks = new TreeBlockSet<>(fallingTreeBlock);
|
||||
}
|
||||
|
||||
if (useCustomSound)
|
||||
if (useCustomSound) {
|
||||
SoundUtils.playLandingSound(treeBlock);
|
||||
if (useCustomParticles)
|
||||
}
|
||||
if (useCustomParticles) {
|
||||
ParticleUtils.playFallingParticles(treeBlock);
|
||||
}
|
||||
}
|
||||
|
||||
if (partition.isEmpty()) {
|
||||
|
@ -102,4 +107,3 @@ public class TreeAnimationCrumble extends TreeAnimation {
|
|||
}.runTaskTimer(ultimateTimber, 0, 1);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
package com.songoda.ultimatetimber.animation;
|
||||
|
||||
import com.songoda.core.compatibility.CompatibleMaterial;
|
||||
import com.craftaro.core.compatibility.CompatibleMaterial;
|
||||
import com.songoda.ultimatetimber.UltimateTimber;
|
||||
import com.songoda.ultimatetimber.manager.ConfigurationManager;
|
||||
import com.songoda.ultimatetimber.manager.TreeDefinitionManager;
|
||||
|
@ -23,7 +23,6 @@ import java.util.Comparator;
|
|||
import java.util.List;
|
||||
|
||||
public class TreeAnimationDisintegrate extends TreeAnimation {
|
||||
|
||||
public TreeAnimationDisintegrate(DetectedTree detectedTree, Player player) {
|
||||
super(TreeAnimationType.DISINTEGRATE, detectedTree, player);
|
||||
}
|
||||
|
@ -71,20 +70,24 @@ public class TreeAnimationDisintegrate extends TreeAnimation {
|
|||
|
||||
if (!toDestroy.isEmpty()) {
|
||||
ITreeBlock<Block> first = toDestroy.get(0);
|
||||
if (useCustomSound)
|
||||
if (useCustomSound) {
|
||||
SoundUtils.playLandingSound(first);
|
||||
}
|
||||
|
||||
for (ITreeBlock<Block> treeBlock : toDestroy) {
|
||||
if (treeBlock.getTreeBlockType().equals(TreeBlockType.LOG)) {
|
||||
if (td.getLogMaterial().stream().noneMatch(x -> x.equals(CompatibleMaterial.getMaterial(treeBlock.getBlock()))))
|
||||
if (treeBlock.getTreeBlockType() == TreeBlockType.LOG) {
|
||||
if (td.getLogMaterial().stream().noneMatch(x -> x == CompatibleMaterial.getMaterial(treeBlock.getBlock().getType()).orElse(null))) {
|
||||
continue;
|
||||
} else if (treeBlock.getTreeBlockType().equals(TreeBlockType.LEAF)) {
|
||||
if (td.getLeafMaterial().stream().noneMatch(x -> x.equals(CompatibleMaterial.getMaterial(treeBlock.getBlock()))))
|
||||
}
|
||||
} else if (treeBlock.getTreeBlockType() == TreeBlockType.LEAF) {
|
||||
if (td.getLeafMaterial().stream().noneMatch(x -> x == CompatibleMaterial.getMaterial(treeBlock.getBlock().getType()).orElse(null))) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (useCustomParticles)
|
||||
if (useCustomParticles) {
|
||||
ParticleUtils.playFallingParticles(treeBlock);
|
||||
}
|
||||
treeDefinitionManager.dropTreeLoot(td, treeBlock, p, hst, false);
|
||||
TreeAnimationDisintegrate.this.replaceBlock((TreeBlock) treeBlock);
|
||||
}
|
||||
|
@ -95,5 +98,4 @@ public class TreeAnimationDisintegrate extends TreeAnimation {
|
|||
}
|
||||
}.runTaskTimer(ultimateTimber, 0, 1);
|
||||
}
|
||||
|
||||
}
|
|
@ -18,7 +18,6 @@ import org.bukkit.scheduler.BukkitRunnable;
|
|||
import org.bukkit.util.Vector;
|
||||
|
||||
public class TreeAnimationFancy extends TreeAnimation {
|
||||
|
||||
public TreeAnimationFancy(DetectedTree detectedTree, Player player) {
|
||||
super(TreeAnimationType.FANCY, detectedTree, player);
|
||||
}
|
||||
|
@ -31,24 +30,27 @@ public class TreeAnimationFancy extends TreeAnimation {
|
|||
boolean useCustomParticles = ConfigurationManager.Setting.USE_CUSTOM_PARTICLES.getBoolean();
|
||||
|
||||
ITreeBlock<Block> initialTreeBlock = this.detectedTree.getDetectedTreeBlocks().getInitialLogBlock();
|
||||
FallingTreeBlock initialFallingBlock = this.convertToFallingBlock((TreeBlock)this.detectedTree.getDetectedTreeBlocks().getInitialLogBlock());
|
||||
FallingTreeBlock initialFallingBlock = this.convertToFallingBlock((TreeBlock) this.detectedTree.getDetectedTreeBlocks().getInitialLogBlock());
|
||||
|
||||
if (useCustomSound)
|
||||
if (useCustomSound) {
|
||||
SoundUtils.playFallingSound(initialTreeBlock);
|
||||
}
|
||||
|
||||
Vector velocityVector = initialTreeBlock.getLocation().clone().subtract(this.player.getLocation().clone()).toVector().normalize().setY(0);
|
||||
|
||||
this.fallingTreeBlocks = new TreeBlockSet<>(initialFallingBlock);
|
||||
for (ITreeBlock<Block> treeBlock : this.detectedTree.getDetectedTreeBlocks().getAllTreeBlocks()) {
|
||||
FallingTreeBlock fallingTreeBlock = this.convertToFallingBlock((TreeBlock)treeBlock);
|
||||
if (fallingTreeBlock == null)
|
||||
FallingTreeBlock fallingTreeBlock = this.convertToFallingBlock((TreeBlock) treeBlock);
|
||||
if (fallingTreeBlock == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
FallingBlock fallingBlock = fallingTreeBlock.getBlock();
|
||||
this.fallingTreeBlocks.add(fallingTreeBlock);
|
||||
|
||||
if (useCustomParticles)
|
||||
ParticleUtils.playFallingParticles(treeBlock);
|
||||
if (useCustomParticles) {
|
||||
ParticleUtils.playFallingParticles(treeBlock);
|
||||
}
|
||||
|
||||
double multiplier = (treeBlock.getLocation().getY() - this.player.getLocation().getY()) * 0.05;
|
||||
fallingBlock.setVelocity(velocityVector.clone().multiply(multiplier));
|
||||
|
@ -83,13 +85,13 @@ public class TreeAnimationFancy extends TreeAnimation {
|
|||
|
||||
if (this.timer > 4 * 20) {
|
||||
TreeAnimationManager treeAnimationManager = ultimateTimber.getTreeAnimationManager();
|
||||
for (ITreeBlock<FallingBlock> fallingTreeBlock : TreeAnimationFancy.this.fallingTreeBlocks.getAllTreeBlocks())
|
||||
for (ITreeBlock<FallingBlock> fallingTreeBlock : TreeAnimationFancy.this.fallingTreeBlocks.getAllTreeBlocks()) {
|
||||
treeAnimationManager.runFallingBlockImpact(TreeAnimationFancy.this, fallingTreeBlock);
|
||||
}
|
||||
whenFinished.run();
|
||||
this.cancel();
|
||||
}
|
||||
}
|
||||
}.runTaskTimer(ultimateTimber, 20L, 1L);
|
||||
}
|
||||
|
||||
}
|
|
@ -12,7 +12,6 @@ import org.bukkit.block.Block;
|
|||
import org.bukkit.entity.Player;
|
||||
|
||||
public class TreeAnimationNone extends TreeAnimation {
|
||||
|
||||
public TreeAnimationNone(DetectedTree detectedTree, Player player) {
|
||||
super(TreeAnimationType.NONE, detectedTree, player);
|
||||
}
|
||||
|
@ -35,5 +34,4 @@ public class TreeAnimationNone extends TreeAnimation {
|
|||
|
||||
whenFinished.run();
|
||||
}
|
||||
|
||||
}
|
|
@ -4,10 +4,7 @@ package com.songoda.ultimatetimber.animation;
|
|||
* The types of tree animations that are available
|
||||
*/
|
||||
public enum TreeAnimationType {
|
||||
FANCY,
|
||||
DISINTEGRATE,
|
||||
CRUMBLE,
|
||||
NONE;
|
||||
FANCY, DISINTEGRATE, CRUMBLE, NONE;
|
||||
|
||||
/**
|
||||
* Gets a TreeAnimationType from a given string
|
||||
|
@ -16,9 +13,12 @@ public enum TreeAnimationType {
|
|||
* @return The TreeAnimationType, returns FANCY if the string is an invalid type
|
||||
*/
|
||||
public static TreeAnimationType fromString(String string) {
|
||||
for (TreeAnimationType value : values())
|
||||
if (value.name().equalsIgnoreCase(string))
|
||||
for (TreeAnimationType value : values()) {
|
||||
if (value.name().equalsIgnoreCase(string)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
return TreeAnimationType.FANCY;
|
||||
}
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
package com.songoda.ultimatetimber.commands;
|
||||
|
||||
import com.songoda.core.commands.AbstractCommand;
|
||||
import com.songoda.core.utils.PlayerUtils;
|
||||
import com.craftaro.core.commands.AbstractCommand;
|
||||
import com.craftaro.core.utils.PlayerUtils;
|
||||
import com.songoda.ultimatetimber.UltimateTimber;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
@ -11,7 +11,6 @@ import org.bukkit.inventory.ItemStack;
|
|||
import java.util.List;
|
||||
|
||||
public class CommandGiveAxe extends AbstractCommand {
|
||||
|
||||
private final UltimateTimber plugin;
|
||||
|
||||
public CommandGiveAxe(UltimateTimber plugin) {
|
||||
|
@ -21,43 +20,44 @@ public class CommandGiveAxe extends AbstractCommand {
|
|||
|
||||
@Override
|
||||
protected ReturnType runCommand(CommandSender sender, String... args) {
|
||||
|
||||
if (args.length < 1)
|
||||
if (args.length < 1) {
|
||||
return ReturnType.SYNTAX_ERROR;
|
||||
}
|
||||
|
||||
Player player = Bukkit.getPlayer(args[0]);
|
||||
if (player == null) {
|
||||
if (args[0].trim().equalsIgnoreCase("me")) {
|
||||
if (!(sender instanceof Player))
|
||||
if (!(sender instanceof Player)) {
|
||||
return ReturnType.NEEDS_PLAYER;
|
||||
}
|
||||
player = (Player) sender;
|
||||
} else {
|
||||
plugin.getLocale().getMessageOrDefault("command.give.not-a-player", "&cNot a player.")
|
||||
this.plugin.getLocale().getMessageOrDefault("command.give.not-a-player", "&cNot a player.")
|
||||
.sendPrefixedMessage(sender);
|
||||
return ReturnType.FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
ItemStack axe = plugin.getTreeDefinitionManager().getRequiredAxe();
|
||||
ItemStack axe = this.plugin.getTreeDefinitionManager().getRequiredAxe();
|
||||
|
||||
if (axe == null) {
|
||||
plugin.getLocale().getMessageOrDefault("command.give.no-axe", "&cThe axe could not be loaded.")
|
||||
this.plugin.getLocale().getMessageOrDefault("command.give.no-axe", "&cThe axe could not be loaded.")
|
||||
.sendPrefixedMessage(sender);
|
||||
return ReturnType.FAILURE;
|
||||
}
|
||||
|
||||
player.getInventory().addItem(axe);
|
||||
plugin.getLocale().getMessageOrDefault("command.give.given", "&fAxe given to &a%player%")
|
||||
this.plugin.getLocale().getMessageOrDefault("command.give.given", "&fAxe given to &a%player%")
|
||||
.processPlaceholder("player", player.getName())
|
||||
.sendPrefixedMessage(sender);
|
||||
return ReturnType.SUCCESS;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> onTab(CommandSender commandSender, String... args) {
|
||||
protected List<String> onTab(CommandSender sender, String... args) {
|
||||
List<String> suggestions = null;
|
||||
if (args.length == 1) {
|
||||
suggestions = PlayerUtils.getVisiblePlayerNames(commandSender, args[0]);
|
||||
suggestions = PlayerUtils.getVisiblePlayerNames(sender, args[0]);
|
||||
suggestions.add("me");
|
||||
}
|
||||
return suggestions;
|
|
@ -1,13 +1,12 @@
|
|||
package com.songoda.ultimatetimber.commands;
|
||||
|
||||
import com.songoda.core.commands.AbstractCommand;
|
||||
import com.craftaro.core.commands.AbstractCommand;
|
||||
import com.songoda.ultimatetimber.UltimateTimber;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class CommandReload extends AbstractCommand {
|
||||
|
||||
private final UltimateTimber plugin;
|
||||
|
||||
public CommandReload(UltimateTimber plugin) {
|
||||
|
@ -17,8 +16,8 @@ public class CommandReload extends AbstractCommand {
|
|||
|
||||
@Override
|
||||
protected ReturnType runCommand(CommandSender sender, String... args) {
|
||||
plugin.reloadConfig();
|
||||
plugin.getLocale().getMessage("command.reload.reloaded").sendPrefixedMessage(sender);
|
||||
this.plugin.reloadConfig();
|
||||
this.plugin.getLocale().getMessage("command.reload.reloaded").sendPrefixedMessage(sender);
|
||||
return ReturnType.SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -39,7 +38,6 @@ public class CommandReload extends AbstractCommand {
|
|||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return plugin.getLocale().getMessage("command.reload.description").getMessage();
|
||||
return this.plugin.getLocale().getMessage("command.reload.description").getMessage();
|
||||
}
|
||||
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
package com.songoda.ultimatetimber.commands;
|
||||
|
||||
import com.songoda.core.commands.AbstractCommand;
|
||||
import com.craftaro.core.commands.AbstractCommand;
|
||||
import com.songoda.ultimatetimber.UltimateTimber;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
@ -8,7 +8,6 @@ import org.bukkit.entity.Player;
|
|||
import java.util.List;
|
||||
|
||||
public class CommandToggle extends AbstractCommand {
|
||||
|
||||
private final UltimateTimber plugin;
|
||||
|
||||
public CommandToggle(UltimateTimber plugin) {
|
||||
|
@ -18,10 +17,10 @@ public class CommandToggle extends AbstractCommand {
|
|||
|
||||
@Override
|
||||
protected ReturnType runCommand(CommandSender sender, String... args) {
|
||||
if (UltimateTimber.getInstance().getChoppingManager().togglePlayer((Player) sender)) {
|
||||
plugin.getLocale().getMessage("command.toggle.enabled").sendPrefixedMessage(sender);
|
||||
if (this.plugin.getChoppingManager().togglePlayer((Player) sender)) {
|
||||
this.plugin.getLocale().getMessage("command.toggle.enabled").sendPrefixedMessage(sender);
|
||||
} else {
|
||||
plugin.getLocale().getMessage("command.toggle.disabled").sendPrefixedMessage(sender);
|
||||
this.plugin.getLocale().getMessage("command.toggle.disabled").sendPrefixedMessage(sender);
|
||||
}
|
||||
return ReturnType.SUCCESS;
|
||||
}
|
||||
|
@ -43,7 +42,7 @@ public class CommandToggle extends AbstractCommand {
|
|||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return plugin.getLocale().getMessage("command.toggle.description").getMessage();
|
||||
return this.plugin.getLocale().getMessage("command.toggle.description").getMessage();
|
||||
}
|
||||
|
||||
}
|
|
@ -8,21 +8,19 @@ import org.bukkit.event.player.PlayerEvent;
|
|||
* Abstract tree event containing tree's blocks and broke block
|
||||
*/
|
||||
public abstract class TreeEvent extends PlayerEvent {
|
||||
protected final DetectedTree detectedTree;
|
||||
|
||||
protected final DetectedTree detectedTree;
|
||||
|
||||
public TreeEvent(Player player, DetectedTree detectedTree) {
|
||||
super(player);
|
||||
public TreeEvent(Player who, DetectedTree detectedTree) {
|
||||
super(who);
|
||||
this.detectedTree = detectedTree;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the tree blocks
|
||||
*
|
||||
*
|
||||
* @return The blocks that are part of the tree
|
||||
*/
|
||||
public DetectedTree getDetectedTree() {
|
||||
return this.detectedTree;
|
||||
}
|
||||
|
||||
}
|
|
@ -9,32 +9,31 @@ import org.bukkit.event.HandlerList;
|
|||
* Called when a tree will fall
|
||||
*/
|
||||
public class TreeFallEvent extends TreeEvent implements Cancellable {
|
||||
|
||||
private boolean cancelled = false;
|
||||
|
||||
public TreeFallEvent(Player player, DetectedTree detectedTree) {
|
||||
super(player, detectedTree);
|
||||
private static final HandlerList HANDLERS = new HandlerList();
|
||||
|
||||
private boolean cancelled = false;
|
||||
|
||||
public TreeFallEvent(Player who, DetectedTree detectedTree) {
|
||||
super(who, detectedTree);
|
||||
}
|
||||
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
|
||||
@Override
|
||||
public HandlerList getHandlers() {
|
||||
return handlers;
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return this.cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(boolean cancel) {
|
||||
this.cancelled = cancel;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList() {
|
||||
return handlers;
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return this.cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(boolean cancelled) {
|
||||
this.cancelled = cancelled;
|
||||
}
|
||||
|
||||
}
|
|
@ -8,20 +8,18 @@ import org.bukkit.event.HandlerList;
|
|||
* Called when a tree fell
|
||||
*/
|
||||
public class TreeFellEvent extends TreeEvent {
|
||||
private static final HandlerList HANDLERS = new HandlerList();
|
||||
|
||||
public TreeFellEvent(Player player, DetectedTree detectedTree) {
|
||||
super(player, detectedTree);
|
||||
public TreeFellEvent(Player who, DetectedTree detectedTree) {
|
||||
super(who, detectedTree);
|
||||
}
|
||||
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
@Override
|
||||
public HandlerList getHandlers() {
|
||||
return handlers;
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList() {
|
||||
return handlers;
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
}
|
|
@ -11,14 +11,13 @@ import java.util.Set;
|
|||
import java.util.UUID;
|
||||
|
||||
public class ChoppingManager extends Manager {
|
||||
|
||||
private final Set<UUID> disabledPlayers;
|
||||
private final Map<UUID, Boolean> cooldownedPlayers;
|
||||
private boolean useCooldown;
|
||||
private int cooldownAmount;
|
||||
|
||||
public ChoppingManager(UltimateTimber ultimateTimber) {
|
||||
super(ultimateTimber);
|
||||
public ChoppingManager(UltimateTimber plugin) {
|
||||
super(plugin);
|
||||
this.disabledPlayers = new HashSet<>();
|
||||
this.cooldownedPlayers = new HashMap<>();
|
||||
}
|
||||
|
@ -72,8 +71,7 @@ public class ChoppingManager extends Manager {
|
|||
|
||||
this.cooldownedPlayers.put(player.getUniqueId(), false);
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(UltimateTimber.getInstance(), () ->
|
||||
this.cooldownedPlayers.remove(player.getUniqueId()), this.cooldownAmount * 20L);
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(this.plugin, () -> this.cooldownedPlayers.remove(player.getUniqueId()), this.cooldownAmount * 20L);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -90,5 +88,4 @@ public class ChoppingManager extends Manager {
|
|||
}
|
||||
return cooldowned;
|
||||
}
|
||||
|
||||
}
|
|
@ -8,7 +8,6 @@ import java.io.File;
|
|||
import java.util.List;
|
||||
|
||||
public class ConfigurationManager extends Manager {
|
||||
|
||||
public enum Setting {
|
||||
SERVER_TYPE(SettingType.STRING),
|
||||
LOCALE(SettingType.STRING),
|
||||
|
@ -49,7 +48,7 @@ public class ConfigurationManager extends Manager {
|
|||
SCATTER_TREE_BLOCKS_ON_GROUND(SettingType.BOOLEAN),
|
||||
FRAGILE_BLOCKS(SettingType.STRING_LIST);
|
||||
|
||||
private SettingType settingType;
|
||||
private final SettingType settingType;
|
||||
private Object value = null;
|
||||
|
||||
Setting(SettingType settingType) {
|
||||
|
@ -118,10 +117,11 @@ public class ConfigurationManager extends Manager {
|
|||
* Loads the value from the config and caches it if it isn't set yet
|
||||
*/
|
||||
private void loadValue() {
|
||||
if (this.value != null)
|
||||
if (this.value != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
FileConfiguration config = UltimateTimber.getInstance().getConfigurationManager().getConfig();
|
||||
FileConfiguration config = UltimateTimber.getPlugin(UltimateTimber.class).getConfigurationManager().getConfig();
|
||||
switch (this.settingType) {
|
||||
case BOOLEAN:
|
||||
this.value = config.getBoolean(this.getNameAsKey());
|
||||
|
@ -161,8 +161,8 @@ public class ConfigurationManager extends Manager {
|
|||
|
||||
private YamlConfiguration configuration;
|
||||
|
||||
public ConfigurationManager(UltimateTimber ultimateTimber) {
|
||||
super(ultimateTimber);
|
||||
public ConfigurationManager(UltimateTimber plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -171,7 +171,7 @@ public class ConfigurationManager extends Manager {
|
|||
|
||||
File configFile = new File(this.plugin.getDataFolder() + "/config.yml");
|
||||
|
||||
// If an old config still exists, rename it so it doesn't interfere
|
||||
// If an old config still exists, rename it, so it doesn't interfere
|
||||
if (configFile.exists() && this.plugin.getConfig().get("server-type") == null) {
|
||||
File renameConfigTo = new File(this.plugin.getDataFolder() + "/config-old.yml");
|
||||
configFile.renameTo(renameConfigTo);
|
||||
|
@ -188,14 +188,16 @@ public class ConfigurationManager extends Manager {
|
|||
|
||||
this.configuration = YamlConfiguration.loadConfiguration(configFile);
|
||||
|
||||
for (Setting setting : Setting.values())
|
||||
for (Setting setting : Setting.values()) {
|
||||
setting.reset();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disable() {
|
||||
for (Setting setting : Setting.values())
|
||||
for (Setting setting : Setting.values()) {
|
||||
setting.reset();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -206,5 +208,4 @@ public class ConfigurationManager extends Manager {
|
|||
public YamlConfiguration getConfig() {
|
||||
return this.configuration;
|
||||
}
|
||||
|
||||
}
|
|
@ -3,7 +3,6 @@ package com.songoda.ultimatetimber.manager;
|
|||
import com.songoda.ultimatetimber.UltimateTimber;
|
||||
|
||||
public abstract class Manager {
|
||||
|
||||
protected UltimateTimber plugin;
|
||||
|
||||
Manager(UltimateTimber plugin) {
|
||||
|
@ -19,5 +18,4 @@ public abstract class Manager {
|
|||
* Cleans up the Manager's resources
|
||||
*/
|
||||
public abstract void disable();
|
||||
|
||||
}
|
|
@ -1,11 +1,11 @@
|
|||
package com.songoda.ultimatetimber.manager;
|
||||
|
||||
import com.craftaro.core.compatibility.CompatibleMaterial;
|
||||
import com.songoda.ultimatetimber.UltimateTimber;
|
||||
import com.songoda.ultimatetimber.events.TreeFellEvent;
|
||||
import com.songoda.ultimatetimber.tree.ITreeBlock;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
@ -22,14 +22,13 @@ import java.util.Map;
|
|||
import java.util.Set;
|
||||
|
||||
public class PlacedBlockManager extends Manager implements Listener {
|
||||
|
||||
private Set<Location> placedBlocks;
|
||||
private boolean ignorePlacedBlocks;
|
||||
private int maxPlacedBlockMemorySize;
|
||||
|
||||
public PlacedBlockManager(UltimateTimber ultimateTimber) {
|
||||
super(ultimateTimber);
|
||||
Bukkit.getPluginManager().registerEvents(this, ultimateTimber);
|
||||
public PlacedBlockManager(UltimateTimber plugin) {
|
||||
super(plugin);
|
||||
Bukkit.getPluginManager().registerEvents(this, plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -53,48 +52,56 @@ public class PlacedBlockManager extends Manager implements Listener {
|
|||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onBlockPlaced(BlockPlaceEvent event) {
|
||||
if (!this.ignorePlacedBlocks)
|
||||
if (!this.ignorePlacedBlocks) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Ignore stripping logs
|
||||
if (event.getBlockPlaced().getType().name().contains("STRIPPED") && !event.getBlockReplacedState().getType().equals(Material.AIR))
|
||||
if (event.getBlockPlaced().getType().name().contains("STRIPPED") && !CompatibleMaterial.isAir(CompatibleMaterial.getMaterial(event.getBlockReplacedState().getType()).get())) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.internalProtect(event.getBlock(), true);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onBlockBreak(BlockBreakEvent event) {
|
||||
if (!this.ignorePlacedBlocks)
|
||||
if (!this.ignorePlacedBlocks) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.internalProtect(event.getBlock(), false);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onLeafDecay(LeavesDecayEvent event) {
|
||||
if (!this.ignorePlacedBlocks)
|
||||
if (!this.ignorePlacedBlocks) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.internalProtect(event.getBlock(), false);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onStructureGrow(StructureGrowEvent event) {
|
||||
if (!this.ignorePlacedBlocks)
|
||||
if (!this.ignorePlacedBlocks) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (BlockState blockState : event.getBlocks())
|
||||
for (BlockState blockState : event.getBlocks()) {
|
||||
this.internalProtect(blockState.getBlock(), false);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onTreeFell(TreeFellEvent event) {
|
||||
if (!this.ignorePlacedBlocks)
|
||||
if (!this.ignorePlacedBlocks) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (ITreeBlock<Block> treeBlock : event.getDetectedTree().getDetectedTreeBlocks().getAllTreeBlocks())
|
||||
for (ITreeBlock<Block> treeBlock : event.getDetectedTree().getDetectedTreeBlocks().getAllTreeBlocks()) {
|
||||
this.internalProtect(treeBlock.getBlock(), false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -102,8 +109,9 @@ public class PlacedBlockManager extends Manager implements Listener {
|
|||
*/
|
||||
private void internalProtect(Block block, boolean isPlaced) {
|
||||
if (isPlaced) {
|
||||
if (this.isBlockPlaced(block))
|
||||
if (this.isBlockPlaced(block)) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.placedBlocks.add(block.getLocation());
|
||||
} else {
|
||||
|
@ -120,5 +128,4 @@ public class PlacedBlockManager extends Manager implements Listener {
|
|||
public boolean isBlockPlaced(Block block) {
|
||||
return this.placedBlocks.contains(block.getLocation());
|
||||
}
|
||||
|
||||
}
|
|
@ -1,6 +1,8 @@
|
|||
package com.songoda.ultimatetimber.manager;
|
||||
|
||||
import com.songoda.core.compatibility.CompatibleMaterial;
|
||||
import com.craftaro.core.compatibility.CompatibleMaterial;
|
||||
import com.craftaro.core.third_party.com.cryptomorin.xseries.XBlock;
|
||||
import com.craftaro.core.third_party.com.cryptomorin.xseries.XMaterial;
|
||||
import com.songoda.ultimatetimber.UltimateTimber;
|
||||
import com.songoda.ultimatetimber.tree.ITreeBlock;
|
||||
import com.songoda.ultimatetimber.tree.TreeBlockType;
|
||||
|
@ -16,24 +18,21 @@ import java.util.Random;
|
|||
import java.util.Set;
|
||||
|
||||
public class SaplingManager extends Manager {
|
||||
private final Random random;
|
||||
private final Set<Location> protectedSaplings;
|
||||
|
||||
private Random random;
|
||||
private Set<Location> protectedSaplings;
|
||||
|
||||
public SaplingManager(UltimateTimber ultimateTimber) {
|
||||
super(ultimateTimber);
|
||||
public SaplingManager(UltimateTimber plugin) {
|
||||
super(plugin);
|
||||
this.random = new Random();
|
||||
this.protectedSaplings = new HashSet<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reload() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disable() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -41,15 +40,17 @@ public class SaplingManager extends Manager {
|
|||
* Takes into account config settings
|
||||
*
|
||||
* @param treeDefinition The TreeDefinition of the sapling
|
||||
* @param treeBlock The ITreeBlock to replant for
|
||||
* @param treeBlock The ITreeBlock to replant for
|
||||
*/
|
||||
public void replantSapling(TreeDefinition treeDefinition, ITreeBlock treeBlock) {
|
||||
if (!ConfigurationManager.Setting.REPLANT_SAPLINGS.getBoolean())
|
||||
if (!ConfigurationManager.Setting.REPLANT_SAPLINGS.getBoolean()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Block block = treeBlock.getLocation().getBlock();
|
||||
if (!block.getType().equals(Material.AIR) || treeBlock.getTreeBlockType().equals(TreeBlockType.LEAF))
|
||||
if (block.getType() != Material.AIR || treeBlock.getTreeBlockType() == TreeBlockType.LEAF) {
|
||||
return;
|
||||
}
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(this.plugin, () -> this.internalReplant(treeDefinition, treeBlock), 1L);
|
||||
}
|
||||
|
@ -59,15 +60,17 @@ public class SaplingManager extends Manager {
|
|||
* Takes into account config settings
|
||||
*
|
||||
* @param treeDefinition The TreeDefinition of the sapling
|
||||
* @param treeBlock The ITreeBlock to replant for
|
||||
* @param treeBlock The ITreeBlock to replant for
|
||||
*/
|
||||
public void replantSaplingWithChance(TreeDefinition treeDefinition, ITreeBlock treeBlock) {
|
||||
if (!ConfigurationManager.Setting.FALLING_BLOCKS_REPLANT_SAPLINGS.getBoolean() || !treeBlock.getLocation().getBlock().getType().equals(Material.AIR))
|
||||
if (!ConfigurationManager.Setting.FALLING_BLOCKS_REPLANT_SAPLINGS.getBoolean() || !CompatibleMaterial.isAir(CompatibleMaterial.getMaterial(treeBlock.getLocation().getBlock().getType()).get())) {
|
||||
return;
|
||||
}
|
||||
|
||||
double chance = ConfigurationManager.Setting.FALLING_BLOCKS_REPLANT_SAPLINGS_CHANCE.getDouble();
|
||||
if (this.random.nextDouble() > chance / 100)
|
||||
if (this.random.nextDouble() > chance / 100) {
|
||||
return;
|
||||
}
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(this.plugin, () -> this.internalReplant(treeDefinition, treeBlock), 1L);
|
||||
}
|
||||
|
@ -76,7 +79,7 @@ public class SaplingManager extends Manager {
|
|||
* Replants a sapling given a TreeDefinition and Location
|
||||
*
|
||||
* @param treeDefinition The TreeDefinition of the sapling
|
||||
* @param treeBlock The ITreeBlock to replant for
|
||||
* @param treeBlock The ITreeBlock to replant for
|
||||
*/
|
||||
private void internalReplant(TreeDefinition treeDefinition, ITreeBlock treeBlock) {
|
||||
TreeDefinitionManager treeDefinitionManager = this.plugin.getTreeDefinitionManager();
|
||||
|
@ -84,18 +87,19 @@ public class SaplingManager extends Manager {
|
|||
Block block = treeBlock.getLocation().getBlock();
|
||||
Block blockBelow = block.getRelative(BlockFace.DOWN);
|
||||
boolean isValidSoil = false;
|
||||
for (CompatibleMaterial soilMaterial : treeDefinitionManager.getPlantableSoilMaterial(treeDefinition)) {
|
||||
if (soilMaterial.equals(CompatibleMaterial.getMaterial(blockBelow))) {
|
||||
for (XMaterial soilMaterial : treeDefinitionManager.getPlantableSoilMaterial(treeDefinition)) {
|
||||
if (soilMaterial == CompatibleMaterial.getMaterial(blockBelow.getType()).orElse(null)) {
|
||||
isValidSoil = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isValidSoil)
|
||||
if (!isValidSoil) {
|
||||
return;
|
||||
}
|
||||
|
||||
CompatibleMaterial material = treeDefinition.getSaplingMaterial();
|
||||
material.applyToBlock(block);
|
||||
XMaterial material = treeDefinition.getSaplingMaterial();
|
||||
XBlock.setType(block, material);
|
||||
|
||||
int cooldown = ConfigurationManager.Setting.REPLANT_SAPLINGS_COOLDOWN.getInt();
|
||||
if (cooldown != 0) {
|
||||
|
@ -113,5 +117,4 @@ public class SaplingManager extends Manager {
|
|||
public boolean isSaplingProtected(Block block) {
|
||||
return this.protectedSaplings.contains(block.getLocation());
|
||||
}
|
||||
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
package com.songoda.ultimatetimber.manager;
|
||||
|
||||
import com.songoda.core.compatibility.CompatibleMaterial;
|
||||
import com.songoda.core.compatibility.ServerVersion;
|
||||
import com.craftaro.core.compatibility.CompatibleMaterial;
|
||||
import com.craftaro.core.compatibility.ServerVersion;
|
||||
import com.songoda.ultimatetimber.UltimateTimber;
|
||||
import com.songoda.ultimatetimber.animation.TreeAnimation;
|
||||
import com.songoda.ultimatetimber.animation.TreeAnimationCrumble;
|
||||
|
@ -31,15 +31,14 @@ import java.util.HashSet;
|
|||
import java.util.Set;
|
||||
|
||||
public class TreeAnimationManager extends Manager implements Listener, Runnable {
|
||||
|
||||
private final Set<TreeAnimation> activeAnimations;
|
||||
private final int taskId;
|
||||
|
||||
public TreeAnimationManager(UltimateTimber ultimateTimber) {
|
||||
super(ultimateTimber);
|
||||
public TreeAnimationManager(UltimateTimber plugin) {
|
||||
super(plugin);
|
||||
this.activeAnimations = new HashSet<>();
|
||||
this.taskId = -1;
|
||||
Bukkit.getPluginManager().registerEvents(this, ultimateTimber);
|
||||
Bukkit.getPluginManager().registerEvents(this, plugin);
|
||||
Bukkit.getScheduler().runTaskTimer(this.plugin, this, 0, 1L);
|
||||
}
|
||||
|
||||
|
@ -60,14 +59,16 @@ public class TreeAnimationManager extends Manager implements Listener, Runnable
|
|||
Set<ITreeBlock<FallingBlock>> groundedBlocks = new HashSet<>();
|
||||
for (ITreeBlock<FallingBlock> fallingTreeBlock : treeAnimation.getFallingTreeBlocks().getAllTreeBlocks()) {
|
||||
FallingBlock fallingBlock = fallingTreeBlock.getBlock();
|
||||
if (fallingBlock.isDead() || ServerVersion.isServerVersionAtLeast(ServerVersion.V1_17) && fallingBlock.isOnGround())
|
||||
if (fallingBlock.isDead() || ServerVersion.isServerVersionAtLeast(ServerVersion.V1_17) && fallingBlock.isOnGround()) {
|
||||
groundedBlocks.add(fallingTreeBlock);
|
||||
}
|
||||
}
|
||||
|
||||
for (ITreeBlock<FallingBlock> fallingBlock : groundedBlocks) {
|
||||
this.runFallingBlockImpact(treeAnimation, fallingBlock);
|
||||
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_17))
|
||||
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_17)) {
|
||||
fallingBlock.getBlock().remove();
|
||||
}
|
||||
treeAnimation.getFallingTreeBlocks().remove(fallingBlock);
|
||||
}
|
||||
}
|
||||
|
@ -102,10 +103,13 @@ public class TreeAnimationManager extends Manager implements Listener, Runnable
|
|||
* @param block The block to check
|
||||
*/
|
||||
public boolean isBlockInAnimation(Block block) {
|
||||
for (TreeAnimation treeAnimation : this.activeAnimations)
|
||||
for (ITreeBlock<Block> treeBlock : treeAnimation.getDetectedTree().getDetectedTreeBlocks().getAllTreeBlocks())
|
||||
if (treeBlock.getBlock().equals(block))
|
||||
for (TreeAnimation treeAnimation : this.activeAnimations) {
|
||||
for (ITreeBlock<Block> treeBlock : treeAnimation.getDetectedTree().getDetectedTreeBlocks().getAllTreeBlocks()) {
|
||||
if (treeBlock.getBlock().equals(block)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -115,10 +119,13 @@ public class TreeAnimationManager extends Manager implements Listener, Runnable
|
|||
* @param fallingBlock The falling block to check
|
||||
*/
|
||||
public boolean isBlockInAnimation(FallingBlock fallingBlock) {
|
||||
for (TreeAnimation treeAnimation : this.activeAnimations)
|
||||
for (ITreeBlock<FallingBlock> treeBlock : treeAnimation.getFallingTreeBlocks().getAllTreeBlocks())
|
||||
if (treeBlock.getBlock().equals(fallingBlock))
|
||||
for (TreeAnimation treeAnimation : this.activeAnimations) {
|
||||
for (ITreeBlock<FallingBlock> treeBlock : treeAnimation.getFallingTreeBlocks().getAllTreeBlocks()) {
|
||||
if (treeBlock.getBlock().equals(fallingBlock)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -128,10 +135,13 @@ public class TreeAnimationManager extends Manager implements Listener, Runnable
|
|||
* @return A TreeAnimation
|
||||
*/
|
||||
private TreeAnimation getAnimationForBlock(FallingBlock fallingBlock) {
|
||||
for (TreeAnimation treeAnimation : this.activeAnimations)
|
||||
for (ITreeBlock<FallingBlock> treeBlock : treeAnimation.getFallingTreeBlocks().getAllTreeBlocks())
|
||||
if (treeBlock.getBlock().equals(fallingBlock))
|
||||
for (TreeAnimation treeAnimation : this.activeAnimations) {
|
||||
for (ITreeBlock<FallingBlock> treeBlock : treeAnimation.getFallingTreeBlocks().getAllTreeBlocks()) {
|
||||
if (treeBlock.getBlock().equals(fallingBlock)) {
|
||||
return treeAnimation;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -155,14 +165,16 @@ public class TreeAnimationManager extends Manager implements Listener, Runnable
|
|||
boolean useCustomParticles = ConfigurationManager.Setting.USE_CUSTOM_PARTICLES.getBoolean();
|
||||
TreeDefinition treeDefinition = treeAnimation.getDetectedTree().getTreeDefinition();
|
||||
|
||||
if (useCustomParticles)
|
||||
if (useCustomParticles) {
|
||||
ParticleUtils.playLandingParticles(treeBlock);
|
||||
if (useCustomSound)
|
||||
}
|
||||
if (useCustomSound) {
|
||||
SoundUtils.playLandingSound(treeBlock);
|
||||
}
|
||||
|
||||
Block block = treeBlock.getLocation().subtract(0, 1, 0).getBlock();
|
||||
if (ConfigurationManager.Setting.FRAGILE_BLOCKS.getStringList().contains(block.getType().toString())) {
|
||||
block.getWorld().dropItemNaturally(block.getLocation(), CompatibleMaterial.getMaterial(block).getItem());
|
||||
block.getWorld().dropItemNaturally(block.getLocation(), CompatibleMaterial.getMaterial(block.getType()).get().parseItem());
|
||||
block.breakNaturally();
|
||||
}
|
||||
|
||||
|
@ -173,17 +185,21 @@ public class TreeAnimationManager extends Manager implements Listener, Runnable
|
|||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onFallingBlockLand(EntityChangeBlockEvent event) {
|
||||
if (!event.getEntityType().equals(EntityType.FALLING_BLOCK))
|
||||
if (event.getEntityType() != EntityType.FALLING_BLOCK) {
|
||||
return;
|
||||
}
|
||||
|
||||
FallingBlock fallingBlock = (FallingBlock) event.getEntity();
|
||||
if (!this.isBlockInAnimation(fallingBlock))
|
||||
if (!this.isBlockInAnimation(fallingBlock)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (ConfigurationManager.Setting.FALLING_BLOCKS_DEAL_DAMAGE.getBoolean()) {
|
||||
int damage = ConfigurationManager.Setting.FALLING_BLOCK_DAMAGE.getInt();
|
||||
for (Entity entity : fallingBlock.getNearbyEntities(0.5, 0.5, 0.5)) {
|
||||
if (!(entity instanceof LivingEntity)) continue;
|
||||
if (!(entity instanceof LivingEntity)) {
|
||||
continue;
|
||||
}
|
||||
if (entity instanceof Player) {
|
||||
Player p = ((Player) entity).getPlayer();
|
||||
TreeDamageEvent treeDamageEvent = new TreeDamageEvent(fallingBlock, p);
|
|
@ -1,11 +1,12 @@
|
|||
package com.songoda.ultimatetimber.manager;
|
||||
|
||||
import com.craftaro.core.compatibility.CompatibleMaterial;
|
||||
import com.craftaro.core.compatibility.ServerVersion;
|
||||
import com.craftaro.core.hooks.McMMOHook;
|
||||
import com.craftaro.core.third_party.com.cryptomorin.xseries.XMaterial;
|
||||
import com.craftaro.core.third_party.de.tr7zw.nbtapi.NBTItem;
|
||||
import com.craftaro.core.utils.TextUtils;
|
||||
import com.google.common.base.Strings;
|
||||
import com.songoda.core.compatibility.CompatibleMaterial;
|
||||
import com.songoda.core.compatibility.ServerVersion;
|
||||
import com.songoda.core.hooks.McMMOHook;
|
||||
import com.songoda.core.third_party.de.tr7zw.nbtapi.NBTItem;
|
||||
import com.songoda.core.utils.TextUtils;
|
||||
import com.songoda.ultimatetimber.UltimateTimber;
|
||||
import com.songoda.ultimatetimber.tree.ITreeBlock;
|
||||
import com.songoda.ultimatetimber.tree.TreeBlockType;
|
||||
|
@ -26,15 +27,15 @@ import org.bukkit.inventory.meta.ItemMeta;
|
|||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class TreeDefinitionManager extends Manager {
|
||||
|
||||
private final Random random;
|
||||
private final Set<TreeDefinition> treeDefinitions;
|
||||
private final Set<CompatibleMaterial> globalPlantableSoil;
|
||||
private final Set<XMaterial> globalPlantableSoil;
|
||||
private final Set<TreeLoot> globalLogLoot, globalLeafLoot, globalEntireTreeLoot;
|
||||
private final Set<ItemStack> globalRequiredTools;
|
||||
|
||||
|
@ -42,8 +43,8 @@ public class TreeDefinitionManager extends Manager {
|
|||
private ItemStack requiredAxe;
|
||||
private String requiredAxeKey;
|
||||
|
||||
public TreeDefinitionManager(UltimateTimber ultimateTimber) {
|
||||
super(ultimateTimber);
|
||||
public TreeDefinitionManager(UltimateTimber plugin) {
|
||||
super(plugin);
|
||||
this.random = new Random();
|
||||
this.treeDefinitions = new HashSet<>();
|
||||
this.globalPlantableSoil = new HashSet<>();
|
||||
|
@ -71,10 +72,10 @@ public class TreeDefinitionManager extends Manager {
|
|||
for (String key : treeSection.getKeys(false)) {
|
||||
ConfigurationSection tree = treeSection.getConfigurationSection(key);
|
||||
|
||||
Set<CompatibleMaterial> logMaterials = new HashSet<>();
|
||||
Set<CompatibleMaterial> leafMaterials = new HashSet<>();
|
||||
CompatibleMaterial saplingMaterial;
|
||||
Set<CompatibleMaterial> plantableSoilMaterial = new HashSet<>();
|
||||
Set<XMaterial> logMaterials = new HashSet<>();
|
||||
Set<XMaterial> leafMaterials = new HashSet<>();
|
||||
XMaterial saplingMaterial;
|
||||
Set<XMaterial> plantableSoilMaterial = new HashSet<>();
|
||||
double maxLogDistanceFromTrunk;
|
||||
int maxLeafDistanceFromLog;
|
||||
boolean detectLeavesDiagonally;
|
||||
|
@ -87,23 +88,29 @@ public class TreeDefinitionManager extends Manager {
|
|||
boolean requiredAxe;
|
||||
|
||||
for (String materialString : tree.getStringList("logs")) {
|
||||
CompatibleMaterial material = CompatibleMaterial.getMaterial(materialString);
|
||||
if (material == null || material.getMaterial() == null) continue top;
|
||||
logMaterials.add(material);
|
||||
Optional<XMaterial> material = CompatibleMaterial.getMaterial(materialString);
|
||||
if (!material.isPresent() || !material.get().isSupported()) {
|
||||
continue top;
|
||||
}
|
||||
logMaterials.add(material.get());
|
||||
}
|
||||
|
||||
for (String materialString : tree.getStringList("leaves")) {
|
||||
CompatibleMaterial material = CompatibleMaterial.getMaterial(materialString);
|
||||
if (material == null || material.getMaterial() == null) continue top;
|
||||
leafMaterials.add(material);
|
||||
Optional<XMaterial> material = CompatibleMaterial.getMaterial(materialString);
|
||||
if (!material.isPresent() || !material.get().isSupported()) {
|
||||
continue top;
|
||||
}
|
||||
leafMaterials.add(material.get());
|
||||
}
|
||||
|
||||
saplingMaterial = CompatibleMaterial.getMaterial(tree.getString("sapling"));
|
||||
saplingMaterial = CompatibleMaterial.getMaterial(tree.getString("sapling")).get();
|
||||
|
||||
for (String materialString : tree.getStringList("plantable-soil")) {
|
||||
CompatibleMaterial material = CompatibleMaterial.getMaterial(materialString);
|
||||
if (material == null || material.getMaterial() == null) continue top;
|
||||
plantableSoilMaterial.add(material);
|
||||
Optional<XMaterial> material = CompatibleMaterial.getMaterial(materialString);
|
||||
if (!material.isPresent() || !material.get().isSupported()) {
|
||||
continue top;
|
||||
}
|
||||
plantableSoilMaterial.add(material.get());
|
||||
}
|
||||
|
||||
maxLogDistanceFromTrunk = tree.getDouble("max-log-distance-from-trunk");
|
||||
|
@ -113,24 +120,32 @@ public class TreeDefinitionManager extends Manager {
|
|||
dropOriginalLeaf = tree.getBoolean("drop-original-leaf");
|
||||
|
||||
ConfigurationSection logLootSection = tree.getConfigurationSection("log-loot");
|
||||
if (logLootSection != null)
|
||||
for (String lootKey : logLootSection.getKeys(false))
|
||||
if (logLootSection != null) {
|
||||
for (String lootKey : logLootSection.getKeys(false)) {
|
||||
logLoot.add(this.getTreeLootEntry(TreeBlockType.LOG, logLootSection.getConfigurationSection(lootKey)));
|
||||
}
|
||||
}
|
||||
|
||||
ConfigurationSection leafLootSection = tree.getConfigurationSection("leaf-loot");
|
||||
if (leafLootSection != null)
|
||||
for (String lootKey : leafLootSection.getKeys(false))
|
||||
if (leafLootSection != null) {
|
||||
for (String lootKey : leafLootSection.getKeys(false)) {
|
||||
leafLoot.add(this.getTreeLootEntry(TreeBlockType.LEAF, leafLootSection.getConfigurationSection(lootKey)));
|
||||
}
|
||||
}
|
||||
|
||||
ConfigurationSection entireTreeLootSection = tree.getConfigurationSection("entire-tree-loot");
|
||||
if (entireTreeLootSection != null)
|
||||
for (String lootKey : entireTreeLootSection.getKeys(false))
|
||||
if (entireTreeLootSection != null) {
|
||||
for (String lootKey : entireTreeLootSection.getKeys(false)) {
|
||||
entireTreeLoot.add(this.getTreeLootEntry(TreeBlockType.LEAF, entireTreeLootSection.getConfigurationSection(lootKey)));
|
||||
}
|
||||
}
|
||||
|
||||
for (String itemStackString : tree.getStringList("required-tools")) {
|
||||
CompatibleMaterial material = CompatibleMaterial.getMaterial(itemStackString);
|
||||
if (material == null) continue top;
|
||||
requiredTools.add(material.getItem());
|
||||
Optional<XMaterial> material = CompatibleMaterial.getMaterial(itemStackString);
|
||||
if (!material.isPresent()) {
|
||||
continue top;
|
||||
}
|
||||
requiredTools.add(material.get().parseItem());
|
||||
}
|
||||
|
||||
requiredAxe = tree.getBoolean("required-axe", false);
|
||||
|
@ -140,43 +155,52 @@ public class TreeDefinitionManager extends Manager {
|
|||
}
|
||||
|
||||
// Load global plantable soil
|
||||
for (String material : config.getStringList("global-plantable-soil"))
|
||||
this.globalPlantableSoil.add(CompatibleMaterial.getMaterial(material));
|
||||
for (String material : config.getStringList("global-plantable-soil")) {
|
||||
this.globalPlantableSoil.add(CompatibleMaterial.getMaterial(material).get());
|
||||
}
|
||||
|
||||
// Load global log drops
|
||||
ConfigurationSection logSection = config.getConfigurationSection("global-log-loot");
|
||||
if (logSection != null)
|
||||
for (String lootKey : logSection.getKeys(false))
|
||||
if (logSection != null) {
|
||||
for (String lootKey : logSection.getKeys(false)) {
|
||||
this.globalLogLoot.add(this.getTreeLootEntry(TreeBlockType.LOG, logSection.getConfigurationSection(lootKey)));
|
||||
}
|
||||
}
|
||||
|
||||
// Load global leaf drops
|
||||
ConfigurationSection leafSection = config.getConfigurationSection("global-leaf-loot");
|
||||
if (leafSection != null)
|
||||
for (String lootKey : leafSection.getKeys(false))
|
||||
if (leafSection != null) {
|
||||
for (String lootKey : leafSection.getKeys(false)) {
|
||||
this.globalLeafLoot.add(this.getTreeLootEntry(TreeBlockType.LEAF, leafSection.getConfigurationSection(lootKey)));
|
||||
}
|
||||
}
|
||||
|
||||
// Load global entire tree drops
|
||||
ConfigurationSection entireTreeSection = config.getConfigurationSection("global-entire-tree-loot");
|
||||
if (entireTreeSection != null)
|
||||
for (String lootKey : entireTreeSection.getKeys(false))
|
||||
if (entireTreeSection != null) {
|
||||
for (String lootKey : entireTreeSection.getKeys(false)) {
|
||||
this.globalEntireTreeLoot.add(this.getTreeLootEntry(TreeBlockType.LOG, entireTreeSection.getConfigurationSection(lootKey)));
|
||||
}
|
||||
}
|
||||
|
||||
// Load global tools
|
||||
for (String itemStackString : config.getStringList("global-required-tools")) {
|
||||
ItemStack tool = CompatibleMaterial.getMaterial(itemStackString).getItem();
|
||||
if (tool == null) continue;
|
||||
this.globalRequiredTools.add(tool);
|
||||
Optional<XMaterial> tool = CompatibleMaterial.getMaterial(itemStackString);
|
||||
if (!tool.isPresent()) {
|
||||
continue;
|
||||
}
|
||||
this.globalRequiredTools.add(tool.get().parseItem());
|
||||
}
|
||||
|
||||
this.globalAxeRequired = config.getBoolean("global-required-axe", false);
|
||||
|
||||
// Load required axe
|
||||
if (config.contains("required-axe"))
|
||||
if (config.contains("required-axe")) {
|
||||
loadAxe(config);
|
||||
}
|
||||
}
|
||||
|
||||
private void loadAxe(YamlConfiguration config) {
|
||||
|
||||
// Reset the axe loaded, but load the NBT anyway in case someone wanted to use another plugin to give it.
|
||||
this.requiredAxeKey = config.getString("required-axe.nbt");
|
||||
this.requiredAxe = null;
|
||||
|
@ -184,18 +208,17 @@ public class TreeDefinitionManager extends Manager {
|
|||
String typeString = config.getString("required-axe.type");
|
||||
|
||||
if (Strings.isNullOrEmpty(typeString)) {
|
||||
plugin.getLogger().warning("Required-axe has to have a material set.");
|
||||
this.plugin.getLogger().warning("Required-axe has to have a material set.");
|
||||
return;
|
||||
}
|
||||
|
||||
CompatibleMaterial material = CompatibleMaterial.getMaterial(typeString);
|
||||
|
||||
if (material == null) {
|
||||
plugin.getLogger().warning("Material " + typeString + " is invalid.");
|
||||
Optional<XMaterial> material = CompatibleMaterial.getMaterial(typeString);
|
||||
if (!material.isPresent()) {
|
||||
this.plugin.getLogger().warning("Material " + typeString + " is invalid.");
|
||||
return;
|
||||
}
|
||||
|
||||
ItemStack item = material.getItem();
|
||||
ItemStack item = material.get().parseItem();
|
||||
|
||||
// Add display name and lore
|
||||
String displayName = TextUtils.formatText(config.getString("required-axe.name"));
|
||||
|
@ -219,13 +242,15 @@ public class TreeDefinitionManager extends Manager {
|
|||
enchantment = Enchantment.getByKey(key);
|
||||
|
||||
// Try to fall back to #getByName() if someone uses the old names.
|
||||
if (enchantment == null)
|
||||
if (enchantment == null) {
|
||||
enchantment = Enchantment.getByName(arr[0].trim());
|
||||
} else
|
||||
}
|
||||
} else {
|
||||
enchantment = Enchantment.getByName(arr[0].trim());
|
||||
}
|
||||
|
||||
if (enchantment == null) {
|
||||
plugin.getLogger().warning("Enchantment " + arr[0].trim() + " is invalid.");
|
||||
this.plugin.getLogger().warning("Enchantment " + arr[0].trim() + " is invalid.");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -236,7 +261,7 @@ public class TreeDefinitionManager extends Manager {
|
|||
|
||||
// Apply NBT
|
||||
NBTItem nbtItem = new NBTItem(item);
|
||||
nbtItem.setBoolean(requiredAxeKey, true);
|
||||
nbtItem.setBoolean(this.requiredAxeKey, true);
|
||||
item = nbtItem.getItem();
|
||||
|
||||
this.requiredAxe = item;
|
||||
|
@ -255,7 +280,7 @@ public class TreeDefinitionManager extends Manager {
|
|||
}
|
||||
|
||||
public boolean isGlobalAxeRequired() {
|
||||
return globalAxeRequired;
|
||||
return this.globalAxeRequired;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -267,7 +292,6 @@ public class TreeDefinitionManager extends Manager {
|
|||
* Gets a Set of possible TreeDefinitions that match the given Block
|
||||
*
|
||||
* @param block The Block to check
|
||||
*
|
||||
* @return A Set of TreeDefinitions for the given Block
|
||||
*/
|
||||
public Set<TreeDefinition> getTreeDefinitionsForLog(Block block) {
|
||||
|
@ -280,7 +304,6 @@ public class TreeDefinitionManager extends Manager {
|
|||
* @param possibleTreeDefinitions The possible TreeDefinitions
|
||||
* @param block The Block to narrow to
|
||||
* @param treeBlockType The TreeBlockType of the given Block
|
||||
*
|
||||
* @return A Set of TreeDefinitions narrowed down
|
||||
*/
|
||||
public Set<TreeDefinition> narrowTreeDefinition(Set<TreeDefinition> possibleTreeDefinitions, Block block, TreeBlockType treeBlockType) {
|
||||
|
@ -288,8 +311,8 @@ public class TreeDefinitionManager extends Manager {
|
|||
switch (treeBlockType) {
|
||||
case LOG:
|
||||
for (TreeDefinition treeDefinition : possibleTreeDefinitions) {
|
||||
for (CompatibleMaterial material : treeDefinition.getLogMaterial()) {
|
||||
if (material.equals(CompatibleMaterial.getMaterial(block))) {
|
||||
for (XMaterial material : treeDefinition.getLogMaterial()) {
|
||||
if (material == CompatibleMaterial.getMaterial(block.getType()).orElse(null)) {
|
||||
matchingTreeDefinitions.add(treeDefinition);
|
||||
break;
|
||||
}
|
||||
|
@ -298,8 +321,8 @@ public class TreeDefinitionManager extends Manager {
|
|||
break;
|
||||
case LEAF:
|
||||
for (TreeDefinition treeDefinition : possibleTreeDefinitions) {
|
||||
for (CompatibleMaterial material : treeDefinition.getLeafMaterial()) {
|
||||
if (material.equals(CompatibleMaterial.getMaterial(block))) {
|
||||
for (XMaterial material : treeDefinition.getLeafMaterial()) {
|
||||
if (material == CompatibleMaterial.getMaterial(block.getType()).orElse(null)) {
|
||||
matchingTreeDefinitions.add(treeDefinition);
|
||||
break;
|
||||
}
|
||||
|
@ -315,28 +338,34 @@ public class TreeDefinitionManager extends Manager {
|
|||
* Checks if a given tool is valid for any tree definitions, also takes into account global tools
|
||||
*
|
||||
* @param tool The tool to check
|
||||
*
|
||||
* @return True if the tool is allowed for toppling any trees
|
||||
*/
|
||||
public boolean isToolValidForAnyTreeDefinition(ItemStack tool) {
|
||||
if (ConfigurationManager.Setting.IGNORE_REQUIRED_TOOLS.getBoolean())
|
||||
if (ConfigurationManager.Setting.IGNORE_REQUIRED_TOOLS.getBoolean()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (TreeDefinition treeDefinition : this.treeDefinitions) {
|
||||
if (treeDefinition.isRequiredAxe() || isGlobalAxeRequired()) {
|
||||
if (tool != null && !tool.getType().isAir() && new NBTItem(tool).hasKey(requiredAxeKey))
|
||||
if (tool != null && !tool.getType().isAir() && new NBTItem(tool).hasTag(this.requiredAxeKey)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (TreeDefinition treeDefinition : this.treeDefinitions)
|
||||
for (ItemStack requiredTool : treeDefinition.getRequiredTools())
|
||||
if (requiredTool.getType().equals(tool.getType()))
|
||||
for (TreeDefinition treeDefinition : this.treeDefinitions) {
|
||||
for (ItemStack requiredTool : treeDefinition.getRequiredTools()) {
|
||||
if (tool != null && requiredTool.getType() == tool.getType()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (ItemStack requiredTool : this.globalRequiredTools)
|
||||
if (requiredTool.getType().equals(tool.getType()))
|
||||
for (ItemStack requiredTool : this.globalRequiredTools) {
|
||||
if (tool != null && requiredTool.getType() == tool.getType()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -346,26 +375,29 @@ public class TreeDefinitionManager extends Manager {
|
|||
*
|
||||
* @param treeDefinition The TreeDefinition to use
|
||||
* @param tool The tool to check
|
||||
*
|
||||
* @return True if the tool is allowed for toppling the given TreeDefinition
|
||||
*/
|
||||
public boolean isToolValidForTreeDefinition(TreeDefinition treeDefinition, ItemStack tool) {
|
||||
|
||||
if (ConfigurationManager.Setting.IGNORE_REQUIRED_TOOLS.getBoolean())
|
||||
if (ConfigurationManager.Setting.IGNORE_REQUIRED_TOOLS.getBoolean()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// If the tree definition requires the custom axe, don't allow any other checks to pass.
|
||||
if (treeDefinition.isRequiredAxe() || isGlobalAxeRequired()) {
|
||||
return tool != null && !tool.getType().isAir() && new NBTItem(tool).hasKey(requiredAxeKey);
|
||||
return tool != null && !tool.getType().isAir() && new NBTItem(tool).hasTag(this.requiredAxeKey);
|
||||
}
|
||||
|
||||
for (ItemStack requiredTool : treeDefinition.getRequiredTools())
|
||||
if (requiredTool.getType().equals(tool.getType()))
|
||||
for (ItemStack requiredTool : treeDefinition.getRequiredTools()) {
|
||||
if (requiredTool.getType() == tool.getType()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
for (ItemStack requiredTool : this.globalRequiredTools)
|
||||
if (requiredTool.getType().equals(tool.getType()))
|
||||
for (ItemStack requiredTool : this.globalRequiredTools) {
|
||||
if (requiredTool.getType() == tool.getType()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -391,8 +423,9 @@ public class TreeDefinitionManager extends Manager {
|
|||
} else {
|
||||
if (ConfigurationManager.Setting.APPLY_SILK_TOUCH.getBoolean() && hasSilkTouch) {
|
||||
if (ConfigurationManager.Setting.HOOKS_APPLY_EXTRA_DROPS.getBoolean()
|
||||
&& McMMOHook.hasWoodcuttingDoubleDrops(player))
|
||||
&& McMMOHook.hasWoodcuttingDoubleDrops(player)) {
|
||||
lootedItems.addAll(BlockUtils.getBlockDrops(treeBlock));
|
||||
}
|
||||
lootedItems.addAll(BlockUtils.getBlockDrops(treeBlock));
|
||||
} else {
|
||||
switch (treeBlock.getTreeBlockType()) {
|
||||
|
@ -401,8 +434,9 @@ public class TreeDefinitionManager extends Manager {
|
|||
toTry.addAll(this.globalLogLoot);
|
||||
if (treeDefinition.shouldDropOriginalLog()) {
|
||||
if (ConfigurationManager.Setting.HOOKS_APPLY_EXTRA_DROPS.getBoolean()
|
||||
&& McMMOHook.hasWoodcuttingDoubleDrops(player))
|
||||
&& McMMOHook.hasWoodcuttingDoubleDrops(player)) {
|
||||
lootedItems.addAll(BlockUtils.getBlockDrops(treeBlock));
|
||||
}
|
||||
lootedItems.addAll(BlockUtils.getBlockDrops(treeBlock));
|
||||
}
|
||||
break;
|
||||
|
@ -411,8 +445,9 @@ public class TreeDefinitionManager extends Manager {
|
|||
toTry.addAll(this.globalLeafLoot);
|
||||
if (treeDefinition.shouldDropOriginalLeaf()) {
|
||||
if (ConfigurationManager.Setting.HOOKS_APPLY_EXTRA_DROPS.getBoolean()
|
||||
&& McMMOHook.hasWoodcuttingDoubleDrops(player))
|
||||
&& McMMOHook.hasWoodcuttingDoubleDrops(player)) {
|
||||
lootedItems.addAll(BlockUtils.getBlockDrops(treeBlock));
|
||||
}
|
||||
lootedItems.addAll(BlockUtils.getBlockDrops(treeBlock));
|
||||
}
|
||||
break;
|
||||
|
@ -423,22 +458,27 @@ public class TreeDefinitionManager extends Manager {
|
|||
// Roll the dice
|
||||
double bonusLootMultiplier = ConfigurationManager.Setting.BONUS_LOOT_MULTIPLIER.getDouble();
|
||||
for (TreeLoot treeLoot : toTry) {
|
||||
if (treeLoot == null) continue;
|
||||
double chance = hasBonusChance ? treeLoot.getChance() * bonusLootMultiplier : treeLoot.getChance();
|
||||
if (this.random.nextDouble() > chance / 100)
|
||||
if (treeLoot == null) {
|
||||
continue;
|
||||
}
|
||||
double chance = hasBonusChance ? treeLoot.getChance() * bonusLootMultiplier : treeLoot.getChance();
|
||||
if (this.random.nextDouble() > chance / 100) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (treeLoot.hasItem()) {
|
||||
if (ConfigurationManager.Setting.HOOKS_APPLY_EXTRA_DROPS.getBoolean()
|
||||
&& McMMOHook.hasWoodcuttingDoubleDrops(player))
|
||||
&& McMMOHook.hasWoodcuttingDoubleDrops(player)) {
|
||||
lootedItems.add(treeLoot.getItem());
|
||||
}
|
||||
lootedItems.add(treeLoot.getItem());
|
||||
}
|
||||
|
||||
if (treeLoot.hasCommand()) {
|
||||
if (ConfigurationManager.Setting.HOOKS_APPLY_EXTRA_DROPS.getBoolean()
|
||||
&& McMMOHook.hasWoodcuttingDoubleDrops(player))
|
||||
&& McMMOHook.hasWoodcuttingDoubleDrops(player)) {
|
||||
lootedCommands.add(treeLoot.getCommand());
|
||||
}
|
||||
lootedCommands.add(treeLoot.getCommand());
|
||||
}
|
||||
}
|
||||
|
@ -446,36 +486,39 @@ public class TreeDefinitionManager extends Manager {
|
|||
// Add to inventory or drop on ground
|
||||
if (addToInventory && player.getWorld().equals(treeBlock.getLocation().getWorld())) {
|
||||
List<ItemStack> extraItems = new ArrayList<>();
|
||||
for (ItemStack lootedItem : lootedItems)
|
||||
for (ItemStack lootedItem : lootedItems) {
|
||||
extraItems.addAll(player.getInventory().addItem(lootedItem).values());
|
||||
}
|
||||
Location location = player.getLocation().clone().subtract(0.5, 0, 0.5);
|
||||
for (ItemStack extraItem : extraItems)
|
||||
for (ItemStack extraItem : extraItems) {
|
||||
location.getWorld().dropItemNaturally(location, extraItem);
|
||||
}
|
||||
} else {
|
||||
Location location = treeBlock.getLocation().clone().add(0.5, 0.5, 0.5);
|
||||
for (ItemStack lootedItem : lootedItems)
|
||||
for (ItemStack lootedItem : lootedItems) {
|
||||
location.getWorld().dropItemNaturally(location, lootedItem);
|
||||
}
|
||||
}
|
||||
|
||||
// Run looted commands
|
||||
for (String lootedCommand : lootedCommands)
|
||||
for (String lootedCommand : lootedCommands) {
|
||||
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),
|
||||
lootedCommand.replace("%player%", player.getName())
|
||||
.replace("%type%", treeDefinition.getKey())
|
||||
.replace("%xPos%", treeBlock.getLocation().getBlockX() + "")
|
||||
.replace("%yPos%", treeBlock.getLocation().getBlockY() + "")
|
||||
.replace("%zPos%", treeBlock.getLocation().getBlockZ() + ""));
|
||||
.replace("%xPos%", String.valueOf(treeBlock.getLocation().getBlockX()))
|
||||
.replace("%yPos%", String.valueOf(treeBlock.getLocation().getBlockY()))
|
||||
.replace("%zPos%", String.valueOf(treeBlock.getLocation().getBlockZ())));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all possible plantable soil blocks for the given tree definition
|
||||
*
|
||||
* @param treeDefinition The TreeDefinition
|
||||
*
|
||||
* @return A Set of IBlockData of plantable soil
|
||||
*/
|
||||
public Set<CompatibleMaterial> getPlantableSoilMaterial(TreeDefinition treeDefinition) {
|
||||
Set<CompatibleMaterial> plantableSoilBlockData = new HashSet<>();
|
||||
public Set<XMaterial> getPlantableSoilMaterial(TreeDefinition treeDefinition) {
|
||||
Set<XMaterial> plantableSoilBlockData = new HashSet<>();
|
||||
plantableSoilBlockData.addAll(treeDefinition.getPlantableSoilMaterial());
|
||||
plantableSoilBlockData.addAll(this.globalPlantableSoil);
|
||||
return plantableSoilBlockData;
|
||||
|
@ -486,14 +529,13 @@ public class TreeDefinitionManager extends Manager {
|
|||
*
|
||||
* @param treeBlockType The TreeBlockType to use
|
||||
* @param configurationSection The ConfigurationSection
|
||||
*
|
||||
* @return A TreeLoot entry from the section
|
||||
*/
|
||||
private TreeLoot getTreeLootEntry(TreeBlockType treeBlockType, ConfigurationSection configurationSection) {
|
||||
String material = configurationSection.getString("material");
|
||||
CompatibleMaterial compatibleMaterial = material == null ? null : CompatibleMaterial.getMaterial(material);
|
||||
Optional<XMaterial> compatibleMaterial = material == null ? Optional.empty() : CompatibleMaterial.getMaterial(material);
|
||||
|
||||
ItemStack item = compatibleMaterial == null ? null : compatibleMaterial.getItem();
|
||||
ItemStack item = compatibleMaterial.map(XMaterial::parseItem).orElse(null);
|
||||
String command = configurationSection.getString("command");
|
||||
double chance = configurationSection.getDouble("chance");
|
||||
return new TreeLoot(treeBlockType, item, command, chance);
|
|
@ -1,17 +1,26 @@
|
|||
package com.songoda.ultimatetimber.manager;
|
||||
|
||||
import com.songoda.core.compatibility.CompatibleMaterial;
|
||||
import com.craftaro.core.compatibility.CompatibleMaterial;
|
||||
import com.craftaro.core.third_party.com.cryptomorin.xseries.XMaterial;
|
||||
import com.songoda.ultimatetimber.UltimateTimber;
|
||||
import com.songoda.ultimatetimber.tree.*;
|
||||
import com.songoda.ultimatetimber.tree.DetectedTree;
|
||||
import com.songoda.ultimatetimber.tree.ITreeBlock;
|
||||
import com.songoda.ultimatetimber.tree.TreeBlock;
|
||||
import com.songoda.ultimatetimber.tree.TreeBlockSet;
|
||||
import com.songoda.ultimatetimber.tree.TreeBlockType;
|
||||
import com.songoda.ultimatetimber.tree.TreeDefinition;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class TreeDetectionManager extends Manager {
|
||||
|
||||
private final Set<Vector> VALID_TRUNK_OFFSETS, VALID_BRANCH_OFFSETS, VALID_LEAF_OFFSETS;
|
||||
|
||||
private TreeDefinitionManager treeDefinitionManager;
|
||||
|
@ -19,24 +28,30 @@ public class TreeDetectionManager extends Manager {
|
|||
private int numLeavesRequiredForTree;
|
||||
private boolean onlyBreakLogsUpwards, entireTreeBase, destroyLeaves;
|
||||
|
||||
public TreeDetectionManager(UltimateTimber ultimateTimber) {
|
||||
super(ultimateTimber);
|
||||
public TreeDetectionManager(UltimateTimber plugin) {
|
||||
super(plugin);
|
||||
|
||||
this.VALID_BRANCH_OFFSETS = new HashSet<>();
|
||||
this.VALID_TRUNK_OFFSETS = new HashSet<>();
|
||||
this.VALID_LEAF_OFFSETS = new HashSet<>();
|
||||
|
||||
// 3x2x3 centered around log, excluding -y axis
|
||||
for (int y = 0; y <= 1; y++)
|
||||
for (int x = -1; x <= 1; x++)
|
||||
for (int z = -1; z <= 1; z++)
|
||||
for (int y = 0; y <= 1; y++) {
|
||||
for (int x = -1; x <= 1; x++) {
|
||||
for (int z = -1; z <= 1; z++) {
|
||||
this.VALID_BRANCH_OFFSETS.add(new Vector(x, y, z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3x3x3 centered around log
|
||||
for (int y = -1; y <= 1; y++)
|
||||
for (int x = -1; x <= 1; x++)
|
||||
for (int z = -1; z <= 1; z++)
|
||||
for (int y = -1; y <= 1; y++) {
|
||||
for (int x = -1; x <= 1; x++) {
|
||||
for (int z = -1; z <= 1; z++) {
|
||||
this.VALID_TRUNK_OFFSETS.add(new Vector(x, y, z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Adjacent blocks to log
|
||||
for (int i = -1; i <= 1; i += 2) {
|
||||
|
@ -58,7 +73,6 @@ public class TreeDetectionManager extends Manager {
|
|||
|
||||
@Override
|
||||
public void disable() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -74,8 +88,9 @@ public class TreeDetectionManager extends Manager {
|
|||
TreeBlockSet<Block> detectedTreeBlocks = new TreeBlockSet<>(initialTreeBlock);
|
||||
Set<TreeDefinition> possibleTreeDefinitions = this.treeDefinitionManager.getTreeDefinitionsForLog(initialBlock);
|
||||
|
||||
if (possibleTreeDefinitions.isEmpty())
|
||||
if (possibleTreeDefinitions.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Detect tree trunk
|
||||
List<Block> trunkBlocks = new ArrayList<>();
|
||||
|
@ -98,45 +113,52 @@ public class TreeDetectionManager extends Manager {
|
|||
Collections.reverse(trunkBlocks);
|
||||
|
||||
// Detect branches off the main trunk
|
||||
for (Block trunkBlock : trunkBlocks)
|
||||
for (Block trunkBlock : trunkBlocks) {
|
||||
this.recursiveBranchSearch(possibleTreeDefinitions, trunkBlocks, detectedTreeBlocks, trunkBlock, initialBlock.getLocation().getBlockY());
|
||||
}
|
||||
|
||||
// Detect leaves off the trunk/branches
|
||||
Set<ITreeBlock<Block>> branchBlocks = new HashSet<>(detectedTreeBlocks.getLogBlocks());
|
||||
for (ITreeBlock<Block> branchBlock : branchBlocks)
|
||||
for (ITreeBlock<Block> branchBlock : branchBlocks) {
|
||||
this.recursiveLeafSearch(possibleTreeDefinitions, detectedTreeBlocks, branchBlock.getBlock(), new HashSet<>());
|
||||
}
|
||||
|
||||
// Use the first tree definition in the set
|
||||
TreeDefinition actualTreeDefinition = possibleTreeDefinitions.iterator().next();
|
||||
|
||||
// Trees need at least a certain number of leaves
|
||||
if (detectedTreeBlocks.getLeafBlocks().size() < this.numLeavesRequiredForTree)
|
||||
if (detectedTreeBlocks.getLeafBlocks().size() < this.numLeavesRequiredForTree) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Remove leaves if we don't care about the leaves
|
||||
if (!this.destroyLeaves)
|
||||
if (!this.destroyLeaves) {
|
||||
detectedTreeBlocks.removeAll(TreeBlockType.LEAF);
|
||||
}
|
||||
|
||||
// Check that the tree isn't on the ground if enabled
|
||||
if (this.entireTreeBase) {
|
||||
Set<Block> groundBlocks = new HashSet<>();
|
||||
for (ITreeBlock<Block> treeBlock : detectedTreeBlocks.getLogBlocks())
|
||||
if (treeBlock != detectedTreeBlocks.getInitialLogBlock() && treeBlock.getLocation().getBlockY() == initialBlock.getLocation().getBlockY())
|
||||
for (ITreeBlock<Block> treeBlock : detectedTreeBlocks.getLogBlocks()) {
|
||||
if (treeBlock != detectedTreeBlocks.getInitialLogBlock() && treeBlock.getLocation().getBlockY() == initialBlock.getLocation().getBlockY()) {
|
||||
groundBlocks.add(treeBlock.getBlock());
|
||||
}
|
||||
}
|
||||
|
||||
for (Block block : groundBlocks) {
|
||||
Block blockBelow = block.getRelative(BlockFace.DOWN);
|
||||
boolean blockBelowIsLog = this.isValidLogType(possibleTreeDefinitions, null, blockBelow);
|
||||
boolean blockBelowIsSoil = false;
|
||||
for (CompatibleMaterial material : treeDefinitionManager.getPlantableSoilMaterial(actualTreeDefinition)) {
|
||||
if (material.equals(CompatibleMaterial.getMaterial(blockBelow))) {
|
||||
for (XMaterial material : treeDefinitionManager.getPlantableSoilMaterial(actualTreeDefinition)) {
|
||||
if (material == CompatibleMaterial.getMaterial(blockBelow.getType()).orElse(null)) {
|
||||
blockBelowIsSoil = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (blockBelowIsLog || blockBelowIsSoil)
|
||||
if (blockBelowIsLog || blockBelowIsSoil) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -159,8 +181,9 @@ public class TreeDetectionManager extends Manager {
|
|||
if (this.isValidLogType(treeDefinitions, trunkBlocks, targetBlock) && !treeBlocks.contains(treeBlock)) {
|
||||
treeBlocks.add(treeBlock);
|
||||
treeDefinitions.retainAll(this.treeDefinitionManager.narrowTreeDefinition(treeDefinitions, targetBlock, TreeBlockType.LOG));
|
||||
if (!this.onlyBreakLogsUpwards || targetBlock.getLocation().getBlockY() > startingBlockY)
|
||||
if (!this.onlyBreakLogsUpwards || targetBlock.getLocation().getBlockY() > startingBlockY) {
|
||||
this.recursiveBranchSearch(treeDefinitions, trunkBlocks, treeBlocks, targetBlock, startingBlockY);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -177,8 +200,9 @@ public class TreeDetectionManager extends Manager {
|
|||
|
||||
for (Vector offset : !detectLeavesDiagonally ? this.VALID_LEAF_OFFSETS : this.VALID_TRUNK_OFFSETS) {
|
||||
Block targetBlock = block.getRelative(offset.getBlockX(), offset.getBlockY(), offset.getBlockZ());
|
||||
if (visitedBlocks.contains(targetBlock))
|
||||
if (visitedBlocks.contains(targetBlock)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
visitedBlocks.add(targetBlock);
|
||||
TreeBlock treeBlock = new TreeBlock(targetBlock, TreeBlockType.LEAF);
|
||||
|
@ -201,8 +225,9 @@ public class TreeDetectionManager extends Manager {
|
|||
private boolean doesLeafBorderInvalidLog(Set<TreeDefinition> treeDefinitions, TreeBlockSet<Block> treeBlocks, Block block) {
|
||||
for (Vector offset : this.VALID_TRUNK_OFFSETS) {
|
||||
Block targetBlock = block.getRelative(offset.getBlockX(), offset.getBlockY(), offset.getBlockZ());
|
||||
if (this.isValidLogType(treeDefinitions, null, targetBlock) && !treeBlocks.contains(new TreeBlock(targetBlock, TreeBlockType.LOG)))
|
||||
if (this.isValidLogType(treeDefinitions, null, targetBlock) && !treeBlocks.contains(new TreeBlock(targetBlock, TreeBlockType.LOG))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -217,35 +242,42 @@ public class TreeDetectionManager extends Manager {
|
|||
*/
|
||||
private boolean isValidLogType(Set<TreeDefinition> treeDefinitions, List<Block> trunkBlocks, Block block) {
|
||||
// Check if block is placed
|
||||
if (this.placedBlockManager.isBlockPlaced(block))
|
||||
if (this.placedBlockManager.isBlockPlaced(block)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if it matches the tree definition
|
||||
boolean isCorrectType = false;
|
||||
for (TreeDefinition treeDefinition : treeDefinitions) {
|
||||
for (CompatibleMaterial material : treeDefinition.getLogMaterial()) {
|
||||
if (material.equals(CompatibleMaterial.getMaterial(block))) {
|
||||
for (XMaterial material : treeDefinition.getLogMaterial()) {
|
||||
if (material == CompatibleMaterial.getMaterial(block.getType()).orElse(null)) {
|
||||
isCorrectType = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!isCorrectType)
|
||||
if (!isCorrectType) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check that it is close enough to the trunk
|
||||
if (trunkBlocks == null || trunkBlocks.isEmpty())
|
||||
if (trunkBlocks == null || trunkBlocks.isEmpty()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
Location location = block.getLocation();
|
||||
for (TreeDefinition treeDefinition : treeDefinitions) {
|
||||
double maxDistance = treeDefinition.getMaxLogDistanceFromTrunk() * treeDefinition.getMaxLogDistanceFromTrunk();
|
||||
if (!this.onlyBreakLogsUpwards) // Help detect logs more often if the tree isn't broken at the base
|
||||
{
|
||||
maxDistance *= 1.5;
|
||||
for (Block trunkBlock : trunkBlocks)
|
||||
if (location.distanceSquared(trunkBlock.getLocation()) < maxDistance)
|
||||
}
|
||||
for (Block trunkBlock : trunkBlocks) {
|
||||
if (location.distanceSquared(trunkBlock.getLocation()) < maxDistance) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -261,29 +293,31 @@ public class TreeDetectionManager extends Manager {
|
|||
*/
|
||||
private boolean isValidLeafType(Set<TreeDefinition> treeDefinitions, TreeBlockSet<Block> treeBlocks, Block block) {
|
||||
// Check if block is placed
|
||||
if (this.placedBlockManager.isBlockPlaced(block))
|
||||
if (this.placedBlockManager.isBlockPlaced(block)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if it matches the tree definition
|
||||
boolean isCorrectType = false;
|
||||
for (TreeDefinition treeDefinition : treeDefinitions) {
|
||||
for (CompatibleMaterial material : treeDefinition.getLeafMaterial()) {
|
||||
if (material.equals(CompatibleMaterial.getMaterial(block))) {
|
||||
for (XMaterial material : treeDefinition.getLeafMaterial()) {
|
||||
if (material == CompatibleMaterial.getMaterial(block.getType()).orElse(null)) {
|
||||
isCorrectType = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!isCorrectType)
|
||||
if (!isCorrectType) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check that it is close enough to a log
|
||||
if (treeBlocks == null || treeBlocks.isEmpty())
|
||||
if (treeBlocks == null || treeBlocks.isEmpty()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
int maxDistanceFromLog = treeDefinitions.stream().map(TreeDefinition::getMaxLeafDistanceFromLog).max(Integer::compareTo).orElse(0);
|
||||
return treeBlocks.getLogBlocks().stream().anyMatch(x -> x.getLocation().distanceSquared(block.getLocation()) < maxDistanceFromLog * maxDistanceFromLog);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,11 +1,11 @@
|
|||
package com.songoda.ultimatetimber.manager;
|
||||
|
||||
import com.songoda.core.compatibility.CompatibleHand;
|
||||
import com.songoda.core.hooks.JobsHook;
|
||||
import com.songoda.core.hooks.LogManager;
|
||||
import com.songoda.core.hooks.McMMOHook;
|
||||
import com.songoda.core.utils.ItemUtils;
|
||||
import com.songoda.core.world.SItemStack;
|
||||
import com.craftaro.core.compatibility.CompatibleHand;
|
||||
import com.craftaro.core.hooks.JobsHook;
|
||||
import com.craftaro.core.hooks.LogManager;
|
||||
import com.craftaro.core.hooks.McMMOHook;
|
||||
import com.craftaro.core.utils.ItemUtils;
|
||||
import com.craftaro.core.world.SItemStack;
|
||||
import com.songoda.ultimatetimber.UltimateTimber;
|
||||
import com.songoda.ultimatetimber.events.TreeFallEvent;
|
||||
import com.songoda.ultimatetimber.events.TreeFellEvent;
|
||||
|
@ -28,12 +28,11 @@ import org.bukkit.inventory.ItemStack;
|
|||
import java.util.stream.Collectors;
|
||||
|
||||
public class TreeFallManager extends Manager implements Listener {
|
||||
|
||||
private int maxLogBlocksAllowed;
|
||||
|
||||
public TreeFallManager(UltimateTimber ultimateTimber) {
|
||||
super(ultimateTimber);
|
||||
Bukkit.getPluginManager().registerEvents(this, ultimateTimber);
|
||||
public TreeFallManager(UltimateTimber plugin) {
|
||||
super(plugin);
|
||||
Bukkit.getPluginManager().registerEvents(this, plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -43,7 +42,6 @@ public class TreeFallManager extends Manager implements Listener {
|
|||
|
||||
@Override
|
||||
public void disable() {
|
||||
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
|
@ -67,54 +65,65 @@ public class TreeFallManager extends Manager implements Listener {
|
|||
// Condition checks
|
||||
boolean isValid = true;
|
||||
|
||||
if (ConfigurationManager.Setting.DISABLED_WORLDS.getStringList().contains(player.getWorld().getName()))
|
||||
if (ConfigurationManager.Setting.DISABLED_WORLDS.getStringList().contains(player.getWorld().getName())) {
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
if (!ConfigurationManager.Setting.ALLOW_CREATIVE_MODE.getBoolean() && player.getGameMode().equals(GameMode.CREATIVE))
|
||||
if (!ConfigurationManager.Setting.ALLOW_CREATIVE_MODE.getBoolean() && player.getGameMode().equals(GameMode.CREATIVE)) {
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
if (!this.checkToppleWhile(player))
|
||||
if (!this.checkToppleWhile(player)) {
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
if (ConfigurationManager.Setting.REQUIRE_CHOP_PERMISSION.getBoolean() && !player.hasPermission("ultimatetimber.chop"))
|
||||
if (ConfigurationManager.Setting.REQUIRE_CHOP_PERMISSION.getBoolean() && !player.hasPermission("ultimatetimber.chop")) {
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
if (!choppingManager.isChopping(player))
|
||||
if (!choppingManager.isChopping(player)) {
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
if (choppingManager.isInCooldown(player))
|
||||
if (choppingManager.isInCooldown(player)) {
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
if (treeAnimationManager.isBlockInAnimation(block)) {
|
||||
isValid = false;
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
if (!treeDefinitionManager.isToolValidForAnyTreeDefinition(tool))
|
||||
if (!treeDefinitionManager.isToolValidForAnyTreeDefinition(tool)) {
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
if (ConfigurationManager.Setting.HOOKS_REQUIRE_ABILITY_ACTIVE.getBoolean()
|
||||
&& !McMMOHook.isUsingTreeFeller(player))
|
||||
if (ConfigurationManager.Setting.HOOKS_REQUIRE_ABILITY_ACTIVE.getBoolean() && !McMMOHook.isUsingTreeFeller(player)) {
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
boolean alwaysReplantSapling = ConfigurationManager.Setting.ALWAYS_REPLANT_SAPLING.getBoolean();
|
||||
if (!isValid && !alwaysReplantSapling)
|
||||
if (!isValid && !alwaysReplantSapling) {
|
||||
return;
|
||||
}
|
||||
|
||||
DetectedTree detectedTree = treeDetectionManager.detectTree(block);
|
||||
if (detectedTree == null)
|
||||
if (detectedTree == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (alwaysReplantSapling) {
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(this.plugin, () ->
|
||||
saplingManager.replantSapling(detectedTree.getTreeDefinition(), detectedTree.getDetectedTreeBlocks().getInitialLogBlock()));
|
||||
|
||||
if (!isValid)
|
||||
if (!isValid) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!treeDefinitionManager.isToolValidForTreeDefinition(detectedTree.getTreeDefinition(), tool))
|
||||
if (!treeDefinitionManager.isToolValidForTreeDefinition(detectedTree.getTreeDefinition(), tool)) {
|
||||
return;
|
||||
}
|
||||
|
||||
short toolDamage = this.getToolDamage(detectedTree.getDetectedTreeBlocks(), tool.containsEnchantment(Enchantment.SILK_TOUCH));
|
||||
if (ConfigurationManager.Setting.PROTECT_TOOL.getBoolean() && !ItemUtils.hasEnoughDurability(tool, toolDamage)) {
|
||||
|
@ -124,13 +133,14 @@ public class TreeFallManager extends Manager implements Listener {
|
|||
// Trigger fall event
|
||||
TreeFallEvent treeFallEvent = new TreeFallEvent(player, detectedTree);
|
||||
Bukkit.getPluginManager().callEvent(treeFallEvent);
|
||||
if (treeFallEvent.isCancelled())
|
||||
if (treeFallEvent.isCancelled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Valid tree and meets all conditions past this point
|
||||
event.setCancelled(true);
|
||||
|
||||
detectedTree.getDetectedTreeBlocks().sortAndLimit(maxLogBlocksAllowed);
|
||||
detectedTree.getDetectedTreeBlocks().sortAndLimit(this.maxLogBlocksAllowed);
|
||||
|
||||
choppingManager.cooldownPlayer(player);
|
||||
|
||||
|
@ -140,7 +150,7 @@ public class TreeFallManager extends Manager implements Listener {
|
|||
detectedTree.getDetectedTreeBlocks().remove(detectedTree.getDetectedTreeBlocks().getInitialLogBlock());
|
||||
}
|
||||
|
||||
boolean isCreative = player.getGameMode().equals(GameMode.CREATIVE);
|
||||
boolean isCreative = player.getGameMode() == GameMode.CREATIVE;
|
||||
|
||||
if (!isCreative) {
|
||||
new SItemStack(tool).addDamage(player, toolDamage, true);
|
||||
|
@ -150,13 +160,16 @@ public class TreeFallManager extends Manager implements Listener {
|
|||
McMMOHook.addWoodcutting(player, detectedTree.getDetectedTreeBlocks().getAllTreeBlocks().stream()
|
||||
.map(ITreeBlock::getBlock).collect(Collectors.toList()));
|
||||
|
||||
if (!isCreative && JobsHook.isEnabled())
|
||||
for (ITreeBlock<Block> treeBlock : detectedTree.getDetectedTreeBlocks().getLogBlocks())
|
||||
if (!isCreative && JobsHook.isEnabled()) {
|
||||
for (ITreeBlock<Block> treeBlock : detectedTree.getDetectedTreeBlocks().getLogBlocks()) {
|
||||
JobsHook.breakBlock(player, treeBlock.getBlock());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (ITreeBlock<Block> treeBlock : detectedTree.getDetectedTreeBlocks().getAllTreeBlocks())
|
||||
for (ITreeBlock<Block> treeBlock : detectedTree.getDetectedTreeBlocks().getAllTreeBlocks()) {
|
||||
LogManager.logRemoval(player, treeBlock.getBlock());
|
||||
}
|
||||
|
||||
treeAnimationManager.runAnimation(detectedTree, player);
|
||||
treeDefinitionManager.dropTreeLoot(detectedTree.getTreeDefinition(), detectedTree.getDetectedTreeBlocks().getInitialLogBlock(), player, false, true);
|
||||
|
@ -170,7 +183,6 @@ public class TreeFallManager extends Manager implements Listener {
|
|||
* Checks if a player is doing a certain action required to topple a tree
|
||||
*
|
||||
* @param player The player to check
|
||||
*
|
||||
* @return True if the check passes, otherwise false
|
||||
*/
|
||||
private boolean checkToppleWhile(Player player) {
|
||||
|
@ -185,8 +197,9 @@ public class TreeFallManager extends Manager implements Listener {
|
|||
}
|
||||
|
||||
private short getToolDamage(TreeBlockSet<Block> treeBlocks, boolean hasSilkTouch) {
|
||||
if (!ConfigurationManager.Setting.REALISTIC_TOOL_DAMAGE.getBoolean())
|
||||
if (!ConfigurationManager.Setting.REALISTIC_TOOL_DAMAGE.getBoolean()) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ConfigurationManager.Setting.APPLY_SILK_TOUCH_TOOL_DAMAGE.getBoolean() && hasSilkTouch) {
|
||||
return (short) treeBlocks.size();
|
|
@ -1,20 +1,20 @@
|
|||
package com.songoda.ultimatetimber.misc;
|
||||
|
||||
public enum OnlyToppleWhile {
|
||||
SNEAKING,
|
||||
NOT_SNEAKING,
|
||||
ALWAYS;
|
||||
SNEAKING, NOT_SNEAKING, ALWAYS;
|
||||
|
||||
/**
|
||||
* Gets an OnlyToppleWhile from a given string
|
||||
*
|
||||
* @param string The string
|
||||
* @return The TreeAnimationType, returns FANCY if the string is an invalid type
|
||||
* @return The TreeAnimationType, returns {@link #ALWAYS} if the string is an invalid type
|
||||
*/
|
||||
public static OnlyToppleWhile fromString(String string) {
|
||||
for (OnlyToppleWhile value : values())
|
||||
if (value.name().equalsIgnoreCase(string))
|
||||
for (OnlyToppleWhile value : values()) {
|
||||
if (value.name().equalsIgnoreCase(string)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
return OnlyToppleWhile.ALWAYS;
|
||||
}
|
||||
}
|
|
@ -3,9 +3,8 @@ package com.songoda.ultimatetimber.tree;
|
|||
import org.bukkit.block.Block;
|
||||
|
||||
public class DetectedTree {
|
||||
|
||||
private TreeDefinition treeDefinition;
|
||||
private TreeBlockSet<Block> detectedTreeBlocks;
|
||||
private final TreeDefinition treeDefinition;
|
||||
private final TreeBlockSet<Block> detectedTreeBlocks;
|
||||
|
||||
public DetectedTree(TreeDefinition treeDefinition, TreeBlockSet<Block> detectedTreeBlocks) {
|
||||
this.treeDefinition = treeDefinition;
|
||||
|
@ -29,5 +28,4 @@ public class DetectedTree {
|
|||
public TreeBlockSet<Block> getDetectedTreeBlocks() {
|
||||
return this.detectedTreeBlocks;
|
||||
}
|
||||
|
||||
}
|
|
@ -4,7 +4,6 @@ import org.bukkit.Location;
|
|||
import org.bukkit.entity.FallingBlock;
|
||||
|
||||
public class FallingTreeBlock implements ITreeBlock<FallingBlock> {
|
||||
|
||||
private final FallingBlock fallingBlock;
|
||||
private final TreeBlockType treeBlockType;
|
||||
|
||||
|
@ -27,5 +26,4 @@ public class FallingTreeBlock implements ITreeBlock<FallingBlock> {
|
|||
public TreeBlockType getTreeBlockType() {
|
||||
return this.treeBlockType;
|
||||
}
|
||||
|
||||
}
|
|
@ -3,7 +3,6 @@ package com.songoda.ultimatetimber.tree;
|
|||
import org.bukkit.Location;
|
||||
|
||||
public interface ITreeBlock<BlockType> {
|
||||
|
||||
/**
|
||||
* Gets the block this TreeBlock represents
|
||||
*
|
||||
|
@ -24,5 +23,4 @@ public interface ITreeBlock<BlockType> {
|
|||
* @return The TreeBlockType
|
||||
*/
|
||||
TreeBlockType getTreeBlockType();
|
||||
|
||||
}
|
|
@ -6,7 +6,6 @@ import org.bukkit.block.Block;
|
|||
import java.util.Objects;
|
||||
|
||||
public class TreeBlock implements ITreeBlock<Block> {
|
||||
|
||||
private final Block block;
|
||||
private final TreeBlockType treeBlockType;
|
||||
|
||||
|
@ -36,11 +35,15 @@ public class TreeBlock implements ITreeBlock<Block> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (!(o instanceof TreeBlock)) return false;
|
||||
if (o == this) return true;
|
||||
TreeBlock oTreeBlock = (TreeBlock)o;
|
||||
return oTreeBlock.block.equals(this.block) && oTreeBlock.treeBlockType.equals(this.treeBlockType);
|
||||
}
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof TreeBlock)) {
|
||||
return false;
|
||||
}
|
||||
if (obj == this) {
|
||||
return true;
|
||||
}
|
||||
|
||||
TreeBlock oTreeBlock = (TreeBlock) obj;
|
||||
return oTreeBlock.block.equals(this.block) && oTreeBlock.treeBlockType == this.treeBlockType;
|
||||
}
|
||||
}
|
|
@ -1,7 +1,5 @@
|
|||
package com.songoda.ultimatetimber.tree;
|
||||
|
||||
import org.bukkit.block.Block;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
|
@ -13,7 +11,6 @@ import java.util.Set;
|
|||
import java.util.stream.Collectors;
|
||||
|
||||
public class TreeBlockSet<BlockType> implements Collection {
|
||||
|
||||
private final ITreeBlock<BlockType> initialLogBlock;
|
||||
private List<ITreeBlock<BlockType>> logBlocks;
|
||||
private final List<ITreeBlock<BlockType>> leafBlocks;
|
||||
|
@ -29,8 +26,9 @@ public class TreeBlockSet<BlockType> implements Collection {
|
|||
this.logBlocks = new LinkedList<>();
|
||||
this.leafBlocks = new LinkedList<>();
|
||||
|
||||
if (initialLogBlock != null)
|
||||
if (initialLogBlock != null) {
|
||||
this.logBlocks.add(initialLogBlock);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -100,7 +98,9 @@ public class TreeBlockSet<BlockType> implements Collection {
|
|||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public boolean add(Object o) {
|
||||
if (!(o instanceof ITreeBlock)) return false;
|
||||
if (!(o instanceof ITreeBlock)) {
|
||||
return false;
|
||||
}
|
||||
ITreeBlock treeBlock = (ITreeBlock) o;
|
||||
switch (treeBlock.getTreeBlockType()) {
|
||||
case LOG:
|
||||
|
@ -113,7 +113,9 @@ public class TreeBlockSet<BlockType> implements Collection {
|
|||
|
||||
@Override
|
||||
public boolean remove(Object o) {
|
||||
if (!(o instanceof ITreeBlock)) return false;
|
||||
if (!(o instanceof ITreeBlock)) {
|
||||
return false;
|
||||
}
|
||||
ITreeBlock treeBlock = (ITreeBlock) o;
|
||||
switch (treeBlock.getTreeBlockType()) {
|
||||
case LOG:
|
||||
|
@ -168,18 +170,22 @@ public class TreeBlockSet<BlockType> implements Collection {
|
|||
}
|
||||
|
||||
public void sortAndLimit(int max) {
|
||||
if (logBlocks.size() < max)
|
||||
if (this.logBlocks.size() < max) {
|
||||
return;
|
||||
}
|
||||
|
||||
logBlocks = logBlocks.stream().sorted(Comparator.comparingInt(b -> b.getLocation().getBlockY()))
|
||||
this.logBlocks = this.logBlocks.stream().sorted(Comparator.comparingInt(b -> b.getLocation().getBlockY()))
|
||||
.limit(max).collect(Collectors.toList());
|
||||
|
||||
int highest = logBlocks.get(logBlocks.size() - 1).getLocation().getBlockY();
|
||||
int highest = this.logBlocks.get(this.logBlocks.size() - 1).getLocation().getBlockY();
|
||||
|
||||
if (logBlocks.size() >= max)
|
||||
for (ITreeBlock<BlockType> leafBlock : new LinkedList<>(leafBlocks))
|
||||
if (leafBlock.getLocation().getY() > highest)
|
||||
leafBlocks.remove(leafBlock);
|
||||
if (this.logBlocks.size() >= max) {
|
||||
for (ITreeBlock<BlockType> leafBlock : new LinkedList<>(this.leafBlocks)) {
|
||||
if (leafBlock.getLocation().getY() > highest) {
|
||||
this.leafBlocks.remove(leafBlock);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -189,11 +195,12 @@ public class TreeBlockSet<BlockType> implements Collection {
|
|||
* @return If any blocks were removed
|
||||
*/
|
||||
public boolean removeAll(TreeBlockType treeBlockType) {
|
||||
if (treeBlockType.equals(TreeBlockType.LOG)) {
|
||||
if (treeBlockType == TreeBlockType.LOG) {
|
||||
boolean removedAny = !this.logBlocks.isEmpty();
|
||||
this.logBlocks.clear();
|
||||
return removedAny;
|
||||
} else if (treeBlockType.equals(TreeBlockType.LEAF)) {
|
||||
}
|
||||
if (treeBlockType == TreeBlockType.LEAF) {
|
||||
boolean removedAny = !this.leafBlocks.isEmpty();
|
||||
this.leafBlocks.clear();
|
||||
return removedAny;
|
||||
|
@ -203,9 +210,11 @@ public class TreeBlockSet<BlockType> implements Collection {
|
|||
|
||||
@Override
|
||||
public boolean containsAll(Collection c) {
|
||||
for (Object o : c)
|
||||
if (!this.contains(o))
|
||||
for (Object o : c) {
|
||||
if (!this.contains(o)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -213,10 +222,12 @@ public class TreeBlockSet<BlockType> implements Collection {
|
|||
@SuppressWarnings("unchecked")
|
||||
public Object[] toArray(Object[] a) {
|
||||
Set<ITreeBlock<BlockType>> treeBlocks = new HashSet<>();
|
||||
for (Object o : a)
|
||||
if (o instanceof ITreeBlock)
|
||||
treeBlocks.add((ITreeBlock<BlockType>)o);
|
||||
for (Object o : a) {
|
||||
if (o instanceof ITreeBlock) {
|
||||
treeBlocks.add((ITreeBlock<BlockType>) o);
|
||||
}
|
||||
}
|
||||
|
||||
return treeBlocks.toArray();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
package com.songoda.ultimatetimber.tree;
|
||||
|
||||
public enum TreeBlockType {
|
||||
LOG, LEAF
|
||||
}
|
|
@ -1,16 +1,15 @@
|
|||
package com.songoda.ultimatetimber.tree;
|
||||
|
||||
import com.songoda.core.compatibility.CompatibleMaterial;
|
||||
import com.craftaro.core.third_party.com.cryptomorin.xseries.XMaterial;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Set;
|
||||
|
||||
public class TreeDefinition {
|
||||
|
||||
private final String key;
|
||||
private final Set<CompatibleMaterial> logMaterial, leafMaterial, plantableSoilMaterial;
|
||||
private final CompatibleMaterial saplingMaterial;
|
||||
private final Set<XMaterial> logMaterial, leafMaterial, plantableSoilMaterial;
|
||||
private final XMaterial saplingMaterial;
|
||||
private final double maxLogDistanceFromTrunk;
|
||||
private final int maxLeafDistanceFromLog;
|
||||
private final boolean detectLeavesDiagonally;
|
||||
|
@ -19,8 +18,8 @@ public class TreeDefinition {
|
|||
private final Set<ItemStack> requiredTools;
|
||||
private final boolean requiredAxe;
|
||||
|
||||
public TreeDefinition(String key, Set<CompatibleMaterial> logMaterial, Set<CompatibleMaterial> leafMaterial, CompatibleMaterial saplingMaterial,
|
||||
Set<CompatibleMaterial> plantableSoilMaterial, double maxLogDistanceFromTrunk, int maxLeafDistanceFromLog,
|
||||
public TreeDefinition(String key, Set<XMaterial> logMaterial, Set<XMaterial> leafMaterial, XMaterial saplingMaterial,
|
||||
Set<XMaterial> plantableSoilMaterial, double maxLogDistanceFromTrunk, int maxLeafDistanceFromLog,
|
||||
boolean detectLeavesDiagonally, boolean dropOriginalLog, boolean dropOriginalLeaf, Set<TreeLoot> logLoot,
|
||||
Set<TreeLoot> leafLoot, Set<TreeLoot> entireTreeLoot, Set<ItemStack> requiredTools, boolean requiredAxe) {
|
||||
this.key = key;
|
||||
|
@ -54,7 +53,7 @@ public class TreeDefinition {
|
|||
*
|
||||
* @return A Set of CompatibleMaterial
|
||||
*/
|
||||
public Set<CompatibleMaterial> getLogMaterial() {
|
||||
public Set<XMaterial> getLogMaterial() {
|
||||
return Collections.unmodifiableSet(this.logMaterial);
|
||||
}
|
||||
|
||||
|
@ -63,7 +62,7 @@ public class TreeDefinition {
|
|||
*
|
||||
* @return A Set of CompatibleMaterial
|
||||
*/
|
||||
public Set<CompatibleMaterial> getLeafMaterial() {
|
||||
public Set<XMaterial> getLeafMaterial() {
|
||||
return Collections.unmodifiableSet(this.leafMaterial);
|
||||
}
|
||||
|
||||
|
@ -72,7 +71,7 @@ public class TreeDefinition {
|
|||
*
|
||||
* @return An CompatibleMaterial instance for the sapling
|
||||
*/
|
||||
public CompatibleMaterial getSaplingMaterial() {
|
||||
public XMaterial getSaplingMaterial() {
|
||||
return this.saplingMaterial;
|
||||
}
|
||||
|
||||
|
@ -81,7 +80,7 @@ public class TreeDefinition {
|
|||
*
|
||||
* @return A Set of CompatibleMaterial
|
||||
*/
|
||||
public Set<CompatibleMaterial> getPlantableSoilMaterial() {
|
||||
public Set<XMaterial> getPlantableSoilMaterial() {
|
||||
return Collections.unmodifiableSet(this.plantableSoilMaterial);
|
||||
}
|
||||
|
||||
|
@ -167,11 +166,11 @@ public class TreeDefinition {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns whether or not does this TreeDefinition require a custom axe.
|
||||
* Returns whether this TreeDefinition requires a custom axe.
|
||||
*
|
||||
* @return True if the TreeDefinition requires a custom axe
|
||||
*/
|
||||
public boolean isRequiredAxe() {
|
||||
return requiredAxe;
|
||||
return this.requiredAxe;
|
||||
}
|
||||
}
|
|
@ -3,7 +3,6 @@ package com.songoda.ultimatetimber.tree;
|
|||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class TreeLoot {
|
||||
|
||||
private final TreeBlockType treeBlockType;
|
||||
private final ItemStack item;
|
||||
private final String command;
|
||||
|
@ -73,10 +72,10 @@ public class TreeLoot {
|
|||
@Override
|
||||
public String toString() {
|
||||
return "TreeLoot{" +
|
||||
"treeBlockType=" + treeBlockType +
|
||||
", item=" + item +
|
||||
", command='" + command + '\'' +
|
||||
", chance=" + chance +
|
||||
"treeBlockType=" + this.treeBlockType +
|
||||
", item=" + this.item +
|
||||
", command='" + this.command + '\'' +
|
||||
", chance=" + this.chance +
|
||||
'}';
|
||||
}
|
||||
}
|
|
@ -1,7 +1,8 @@
|
|||
package com.songoda.ultimatetimber.utils;
|
||||
|
||||
import com.songoda.core.compatibility.CompatibleMaterial;
|
||||
import com.songoda.core.compatibility.ServerVersion;
|
||||
import com.craftaro.core.compatibility.CompatibleMaterial;
|
||||
import com.craftaro.core.compatibility.ServerVersion;
|
||||
import com.craftaro.core.third_party.com.cryptomorin.xseries.XMaterial;
|
||||
import com.songoda.ultimatetimber.tree.ITreeBlock;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
|
@ -10,34 +11,37 @@ import org.bukkit.inventory.ItemStack;
|
|||
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
public class BlockUtils {
|
||||
|
||||
public static Collection<ItemStack> getBlockDrops(ITreeBlock treeBlock) {
|
||||
Set<ItemStack> drops = new HashSet<>();
|
||||
if (treeBlock.getBlock() instanceof Block) {
|
||||
Block block = (Block)treeBlock.getBlock();
|
||||
CompatibleMaterial material = CompatibleMaterial.getMaterial(block);
|
||||
if (material.isAir())
|
||||
Block block = (Block) treeBlock.getBlock();
|
||||
Optional<XMaterial> material = CompatibleMaterial.getMaterial(block.getType());
|
||||
if (!material.isPresent() || CompatibleMaterial.isAir(material.get())) {
|
||||
return drops;
|
||||
drops.add(CompatibleMaterial.getMaterial(block).getItem());
|
||||
}
|
||||
drops.add(material.get().parseItem());
|
||||
} else if (treeBlock.getBlock() instanceof FallingBlock) {
|
||||
CompatibleMaterial material = CompatibleMaterial.getMaterial((FallingBlock)treeBlock.getBlock());
|
||||
if (material == null)
|
||||
Optional<XMaterial> material = CompatibleMaterial.getMaterial(((FallingBlock) treeBlock.getBlock()).getBlockData().getMaterial());
|
||||
if (!material.isPresent()) {
|
||||
return drops;
|
||||
drops.add(material.getItem());
|
||||
}
|
||||
drops.add(material.get().parseItem());
|
||||
}
|
||||
return drops;
|
||||
}
|
||||
|
||||
public static void toggleGravityFallingBlock(FallingBlock fallingBlock, boolean applyGravity) {
|
||||
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_9))
|
||||
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_9)) {
|
||||
fallingBlock.setGravity(applyGravity);
|
||||
}
|
||||
}
|
||||
|
||||
public static FallingBlock spawnFallingBlock(Location location, CompatibleMaterial material) {
|
||||
return location.getWorld().spawnFallingBlock(location, material.getMaterial(), material.getData());
|
||||
public static FallingBlock spawnFallingBlock(Location location, XMaterial material) {
|
||||
return location.getWorld().spawnFallingBlock(location, material.parseMaterial(), material.getData());
|
||||
}
|
||||
|
||||
public static void configureFallingBlock(FallingBlock fallingBlock) {
|
||||
|
@ -45,5 +49,4 @@ public class BlockUtils {
|
|||
fallingBlock.setDropItem(false);
|
||||
fallingBlock.setHurtEntities(false);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,8 +1,7 @@
|
|||
package com.songoda.ultimatetimber.utils;
|
||||
|
||||
import com.songoda.core.compatibility.ServerVersion;
|
||||
import com.craftaro.core.compatibility.ServerVersion;
|
||||
import com.songoda.ultimatetimber.tree.ITreeBlock;
|
||||
import com.songoda.ultimatetimber.tree.TreeDefinition;
|
||||
import org.bukkit.Effect;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Particle;
|
||||
|
@ -14,7 +13,6 @@ import org.bukkit.inventory.ItemStack;
|
|||
import java.util.Collection;
|
||||
|
||||
public class ParticleUtils {
|
||||
|
||||
public static void playFallingParticles(ITreeBlock treeBlock) {
|
||||
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13)) {
|
||||
BlockData blockData;
|
||||
|
@ -22,22 +20,26 @@ public class ParticleUtils {
|
|||
blockData = ((Block) treeBlock.getBlock()).getBlockData();
|
||||
} else if (treeBlock.getBlock() instanceof FallingBlock) {
|
||||
blockData = ((FallingBlock) treeBlock.getBlock()).getBlockData();
|
||||
} else return;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
Location location = treeBlock.getLocation().clone().add(0.5, 0.5, 0.5);
|
||||
location.getWorld().spawnParticle(Particle.BLOCK_DUST, location, 10, blockData);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Collection<ItemStack> blockDrops = BlockUtils.getBlockDrops(treeBlock);
|
||||
if (!blockDrops.iterator().hasNext()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Location location = treeBlock.getLocation().clone().add(0.5, 0.5, 0.5);
|
||||
if (ServerVersion.isServerVersion(ServerVersion.V1_8)) {
|
||||
location.getWorld().playEffect(location, Effect.SMOKE, 4);
|
||||
} else {
|
||||
|
||||
Collection<ItemStack> blockDrops = BlockUtils.getBlockDrops(treeBlock);
|
||||
if (!blockDrops.iterator().hasNext())
|
||||
return;
|
||||
|
||||
Location location = treeBlock.getLocation().clone().add(0.5, 0.5, 0.5);
|
||||
if (ServerVersion.isServerVersion(ServerVersion.V1_8)) {
|
||||
location.getWorld().playEffect(location, Effect.SMOKE, 4);
|
||||
} else {
|
||||
location.getWorld().spawnParticle(Particle.BLOCK_DUST, location, 10, blockDrops.iterator().next().getData());
|
||||
}
|
||||
location.getWorld().spawnParticle(Particle.BLOCK_DUST, location, 10, blockDrops.iterator().next().getData());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -48,21 +50,26 @@ public class ParticleUtils {
|
|||
blockData = ((Block) treeBlock.getBlock()).getBlockData();
|
||||
} else if (treeBlock.getBlock() instanceof FallingBlock) {
|
||||
blockData = ((FallingBlock) treeBlock.getBlock()).getBlockData();
|
||||
} else return;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
Location location = treeBlock.getLocation().clone().add(0.5, 0.5, 0.5);
|
||||
location.getWorld().spawnParticle(Particle.BLOCK_CRACK, location, 10, blockData);
|
||||
} else {
|
||||
Collection<ItemStack> blockDrops = BlockUtils.getBlockDrops(treeBlock);
|
||||
if (!blockDrops.iterator().hasNext())
|
||||
return;
|
||||
|
||||
Location location = treeBlock.getLocation().clone().add(0.5, 0.5, 0.5);
|
||||
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_9)) {
|
||||
location.getWorld().spawnParticle(Particle.BLOCK_CRACK, location, 10, blockDrops.iterator().next().getData());
|
||||
} else {
|
||||
location.getWorld().playEffect(location, Effect.SMOKE, 4);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Collection<ItemStack> blockDrops = BlockUtils.getBlockDrops(treeBlock);
|
||||
if (!blockDrops.iterator().hasNext()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Location location = treeBlock.getLocation().clone().add(0.5, 0.5, 0.5);
|
||||
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_9)) {
|
||||
location.getWorld().spawnParticle(Particle.BLOCK_CRACK, location, 10, blockDrops.iterator().next().getData());
|
||||
} else {
|
||||
location.getWorld().playEffect(location, Effect.SMOKE, 4);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package com.songoda.ultimatetimber.utils;
|
||||
|
||||
import com.craftaro.core.third_party.com.cryptomorin.xseries.XSound;
|
||||
import com.songoda.ultimatetimber.tree.ITreeBlock;
|
||||
import com.songoda.ultimatetimber.tree.TreeBlockType;
|
||||
import org.bukkit.Location;
|
||||
|
||||
public class SoundUtils {
|
||||
public static void playFallingSound(ITreeBlock block) {
|
||||
Location location = block.getLocation();
|
||||
if (location.getWorld() == null) {
|
||||
return;
|
||||
}
|
||||
XSound.BLOCK_CHEST_OPEN.play(location, 2, .1f);
|
||||
}
|
||||
|
||||
public static void playLandingSound(ITreeBlock block) {
|
||||
Location location = block.getLocation();
|
||||
if (location.getWorld() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (block.getTreeBlockType() == TreeBlockType.LOG) {
|
||||
XSound.BLOCK_WOOD_FALL.play(location, 2, .1f);
|
||||
} else {
|
||||
XSound.BLOCK_GRASS_BREAK.play(location, .5f, .75f);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -190,14 +190,15 @@ trees:
|
|||
- STRIPPED_OAK_WOOD
|
||||
leaves:
|
||||
- OAK_LEAVES
|
||||
- VINE
|
||||
sapling: OAK_SAPLING
|
||||
plantable-soil: []
|
||||
plantable-soil: [ ]
|
||||
max-log-distance-from-trunk: 6
|
||||
max-leaf-distance-from-log: 6
|
||||
search-for-leaves-diagonally: false
|
||||
drop-original-log: true
|
||||
drop-original-leaf: false
|
||||
log-loot: []
|
||||
log-loot: [ ]
|
||||
leaf-loot:
|
||||
0:
|
||||
material: OAK_SAPLING
|
||||
|
@ -205,8 +206,8 @@ trees:
|
|||
1:
|
||||
material: APPLE
|
||||
chance: 0.5
|
||||
entire-tree-loot: []
|
||||
required-tools: []
|
||||
entire-tree-loot: [ ]
|
||||
required-tools: [ ]
|
||||
required-axe: false
|
||||
spruce:
|
||||
logs:
|
||||
|
@ -216,20 +217,21 @@ trees:
|
|||
- STRIPPED_SPRUCE_WOOD
|
||||
leaves:
|
||||
- SPRUCE_LEAVES
|
||||
- VINE
|
||||
sapling: SPRUCE_SAPLING
|
||||
plantable-soil: []
|
||||
plantable-soil: [ ]
|
||||
max-log-distance-from-trunk: 2
|
||||
max-leaf-distance-from-log: 6
|
||||
search-for-leaves-diagonally: false
|
||||
drop-original-log: true
|
||||
drop-original-leaf: false
|
||||
log-loot: []
|
||||
log-loot: [ ]
|
||||
leaf-loot:
|
||||
0:
|
||||
material: SPRUCE_SAPLING
|
||||
chance: 5
|
||||
entire-tree-loot: []
|
||||
required-tools: []
|
||||
entire-tree-loot: [ ]
|
||||
required-tools: [ ]
|
||||
required-axe: false
|
||||
birch:
|
||||
logs:
|
||||
|
@ -239,20 +241,21 @@ trees:
|
|||
- STRIPPED_BIRCH_WOOD
|
||||
leaves:
|
||||
- BIRCH_LEAVES
|
||||
- VINE
|
||||
sapling: BIRCH_SAPLING
|
||||
plantable-soil: []
|
||||
plantable-soil: [ ]
|
||||
max-log-distance-from-trunk: 1
|
||||
max-leaf-distance-from-log: 4
|
||||
search-for-leaves-diagonally: false
|
||||
drop-original-log: true
|
||||
drop-original-leaf: false
|
||||
log-loot: []
|
||||
log-loot: [ ]
|
||||
leaf-loot:
|
||||
0:
|
||||
material: BIRCH_SAPLING
|
||||
chance: 5
|
||||
entire-tree-loot: []
|
||||
required-tools: []
|
||||
entire-tree-loot: [ ]
|
||||
required-tools: [ ]
|
||||
required-axe: false
|
||||
jungle:
|
||||
logs:
|
||||
|
@ -262,20 +265,21 @@ trees:
|
|||
- STRIPPED_JUNGLE_WOOD
|
||||
leaves:
|
||||
- JUNGLE_LEAVES
|
||||
- VINE
|
||||
sapling: JUNGLE_SAPLING
|
||||
plantable-soil: []
|
||||
plantable-soil: [ ]
|
||||
max-log-distance-from-trunk: 6
|
||||
max-leaf-distance-from-log: 6
|
||||
search-for-leaves-diagonally: false
|
||||
drop-original-log: true
|
||||
drop-original-leaf: false
|
||||
log-loot: []
|
||||
log-loot: [ ]
|
||||
leaf-loot:
|
||||
0:
|
||||
material: JUNGLE_SAPLING
|
||||
chance: 2.5
|
||||
entire-tree-loot: []
|
||||
required-tools: []
|
||||
entire-tree-loot: [ ]
|
||||
required-tools: [ ]
|
||||
required-axe: false
|
||||
acacia:
|
||||
logs:
|
||||
|
@ -286,19 +290,19 @@ trees:
|
|||
leaves:
|
||||
- ACACIA_LEAVES
|
||||
sapling: ACACIA_SAPLING
|
||||
plantable-soil: []
|
||||
plantable-soil: [ ]
|
||||
max-log-distance-from-trunk: 4
|
||||
max-leaf-distance-from-log: 5
|
||||
search-for-leaves-diagonally: false
|
||||
drop-original-log: true
|
||||
drop-original-leaf: false
|
||||
log-loot: []
|
||||
log-loot: [ ]
|
||||
leaf-loot:
|
||||
0:
|
||||
material: ACACIA_SAPLING
|
||||
chance: 5
|
||||
entire-tree-loot: []
|
||||
required-tools: []
|
||||
entire-tree-loot: [ ]
|
||||
required-tools: [ ]
|
||||
required-axe: false
|
||||
dark_oak:
|
||||
logs:
|
||||
|
@ -308,14 +312,15 @@ trees:
|
|||
- STRIPPED_DARK_OAK_WOOD
|
||||
leaves:
|
||||
- DARK_OAK_LEAVES
|
||||
- VINE
|
||||
sapling: DARK_OAK_SAPLING
|
||||
plantable-soil: []
|
||||
plantable-soil: [ ]
|
||||
max-log-distance-from-trunk: 3
|
||||
max-leaf-distance-from-log: 5
|
||||
search-for-leaves-diagonally: false
|
||||
drop-original-log: true
|
||||
drop-original-leaf: false
|
||||
log-loot: []
|
||||
log-loot: [ ]
|
||||
leaf-loot:
|
||||
0:
|
||||
material: DARK_OAK_SAPLING
|
||||
|
@ -323,8 +328,8 @@ trees:
|
|||
1:
|
||||
material: APPLE
|
||||
chance: 0.5
|
||||
entire-tree-loot: []
|
||||
required-tools: []
|
||||
entire-tree-loot: [ ]
|
||||
required-tools: [ ]
|
||||
required-axe: false
|
||||
azalea:
|
||||
logs:
|
||||
|
@ -335,6 +340,7 @@ trees:
|
|||
leaves:
|
||||
- AZALEA_LEAVES
|
||||
- FLOWERING_AZALEA_LEAVES
|
||||
- VINE
|
||||
sapling: AZALEA
|
||||
plantable-soil: [ ]
|
||||
max-log-distance-from-trunk: 3
|
||||
|
@ -350,6 +356,32 @@ trees:
|
|||
entire-tree-loot: [ ]
|
||||
required-tools: [ ]
|
||||
required-axe: false
|
||||
cherry:
|
||||
logs:
|
||||
- CHERRY_LOG
|
||||
- STRIPPED_CHERRY_LOG
|
||||
- CHERRY_WOOD
|
||||
- STRIPPED_CHERRY_WOOD
|
||||
leaves:
|
||||
- CHERRY_LEAVES
|
||||
sapling: CHERRY_SAPLING
|
||||
plantable-soil: [ ]
|
||||
max-log-distance-from-trunk: 10
|
||||
max-leaf-distance-from-log: 6
|
||||
search-for-leaves-diagonally: false
|
||||
drop-original-log: true
|
||||
drop-original-leaf: false
|
||||
log-loot: [ ]
|
||||
leaf-loot:
|
||||
0:
|
||||
material: CHERRY_SAPLING
|
||||
chance: 5
|
||||
1:
|
||||
material: STICK
|
||||
chance: 2.5
|
||||
entire-tree-loot: [ ]
|
||||
required-tools: [ ]
|
||||
required-axe: false
|
||||
mangrove:
|
||||
logs:
|
||||
- MANGROVE_LOG
|
||||
|
@ -359,11 +391,14 @@ trees:
|
|||
leaves:
|
||||
- MANGROVE_LEAVES
|
||||
- MANGROVE_ROOTS
|
||||
- MOSS_CARPET
|
||||
- MANGROVE_PROPAGULE
|
||||
- VINE
|
||||
sapling: MANGROVE_PROPAGULE
|
||||
plantable-soil: [ ]
|
||||
max-log-distance-from-trunk: 27
|
||||
max-leaf-distance-from-log: 5
|
||||
search-for-leaves-diagonally: false
|
||||
max-log-distance-from-trunk: 30
|
||||
max-leaf-distance-from-log: 10
|
||||
search-for-leaves-diagonally: true
|
||||
drop-original-log: true
|
||||
drop-original-leaf: false
|
||||
log-loot: [ ]
|
||||
|
@ -390,13 +425,13 @@ trees:
|
|||
search-for-leaves-diagonally: false
|
||||
drop-original-log: false
|
||||
drop-original-leaf: false
|
||||
log-loot: []
|
||||
log-loot: [ ]
|
||||
leaf-loot:
|
||||
0:
|
||||
material: BROWN_MUSHROOM
|
||||
chance: 25
|
||||
entire-tree-loot: []
|
||||
required-tools: []
|
||||
entire-tree-loot: [ ]
|
||||
required-tools: [ ]
|
||||
required-axe: false
|
||||
red_mushroom:
|
||||
logs:
|
||||
|
@ -411,13 +446,13 @@ trees:
|
|||
search-for-leaves-diagonally: true
|
||||
drop-original-log: false
|
||||
drop-original-leaf: false
|
||||
log-loot: []
|
||||
log-loot: [ ]
|
||||
leaf-loot:
|
||||
0:
|
||||
material: RED_MUSHROOM
|
||||
chance: 25
|
||||
entire-tree-loot: []
|
||||
required-tools: []
|
||||
entire-tree-loot: [ ]
|
||||
required-tools: [ ]
|
||||
required-axe: false
|
||||
huge_crimson_fungus:
|
||||
logs:
|
||||
|
@ -436,10 +471,10 @@ trees:
|
|||
search-for-leaves-diagonally: false
|
||||
drop-original-log: true
|
||||
drop-original-leaf: true
|
||||
log-loot: []
|
||||
leaf-loot: []
|
||||
entire-tree-loot: []
|
||||
required-tools: []
|
||||
log-loot: [ ]
|
||||
leaf-loot: [ ]
|
||||
entire-tree-loot: [ ]
|
||||
required-tools: [ ]
|
||||
required-axe: false
|
||||
huge_warpped_fungus:
|
||||
logs:
|
||||
|
@ -458,10 +493,10 @@ trees:
|
|||
search-for-leaves-diagonally: false
|
||||
drop-original-log: true
|
||||
drop-original-leaf: true
|
||||
log-loot: []
|
||||
leaf-loot: []
|
||||
entire-tree-loot: []
|
||||
required-tools: []
|
||||
log-loot: [ ]
|
||||
leaf-loot: [ ]
|
||||
entire-tree-loot: [ ]
|
||||
required-tools: [ ]
|
||||
required-axe: false
|
||||
|
||||
# All soil types that the tree type's saplings can be planted on
|
|
@ -1,14 +1,24 @@
|
|||
name: UltimateTimber
|
||||
version: maven-version-number
|
||||
authors: [Songoda]
|
||||
main: com.songoda.ultimatetimber.UltimateTimber
|
||||
name: ${project.name}
|
||||
description: ${project.description}
|
||||
version: ${project.version}
|
||||
api-version: 1.13
|
||||
softdepend: [mcMMO, Jobs, CoreProtect]
|
||||
|
||||
main: com.songoda.ultimatetimber.UltimateTimber
|
||||
softdepend:
|
||||
- mcMMO
|
||||
- Jobs
|
||||
- CoreProtect
|
||||
|
||||
author: Craftaro
|
||||
website: ${project.url}
|
||||
|
||||
# TODO: cleanup commands and permissions sections
|
||||
commands:
|
||||
ut:
|
||||
description: Reloads the configuration file
|
||||
usage: /ultimatetimber reload
|
||||
aliases: [ultimatetimber]
|
||||
aliases: [ ultimatetimber ]
|
||||
|
||||
permissions:
|
||||
ultimatetimber.*:
|
||||
description: Inherits all plugin permissions
|
||||
|
@ -17,15 +27,19 @@ permissions:
|
|||
ultimatetimber.bonusloot: true
|
||||
ultimatetimber.reload: true
|
||||
ultimatetimber.bypasscooldown: true
|
||||
|
||||
ultimatetimber.chop:
|
||||
description: Allows players to trigger the trees toppling down effect
|
||||
default: op
|
||||
|
||||
ultimatetimber.bonusloot:
|
||||
description: Doubles the loot obtained from trees
|
||||
default: op
|
||||
|
||||
ultimatetimber.reload:
|
||||
description: Reloads the configuration file
|
||||
default: op
|
||||
|
||||
ultimatetimber.bypasscooldown:
|
||||
description: Allows a player to bypass the tree topple cooldown
|
||||
default: op
|
Loading…
Reference in New Issue