Compare commits

...

42 Commits
1.3.2 ... 1.4.2

Author SHA1 Message Date
hyperdefined
e3e1c6a690 Update pom.xml 2022-06-18 17:09:25 -04:00
hyperdefined
5eebcb9ff4 make sure chests are in the same world
fixes #14
2022-06-18 17:09:12 -04:00
hyperdefined
63d508fded fixed typo 2022-06-16 00:04:23 -04:00
hyperdefined
59a8079ba2 Update pom.xml 2022-06-16 00:00:19 -04:00
hyperdefined
3767ee2f63 fixed reseting lore for armor 2022-06-16 00:00:04 -04:00
hyperdefined
7d5f73ae96 better number formatting 2022-06-15 23:59:19 -04:00
hyperdefined
b581d9d178 much better item checking 2022-06-15 23:48:39 -04:00
hyperdefined
d355b7a429 moved class 2022-06-15 23:26:20 -04:00
hyperdefined
d06a1c4a40 support for adding lore to minecart items 2022-06-15 23:25:21 -04:00
hyperdefined
e22fc7b530 Merge pull request #13 from hyperdefined/dependabot/maven/net.kyori-adventure-platform-bukkit-4.1.1
Bump adventure-platform-bukkit from 4.1.0 to 4.1.1
2022-06-13 18:32:54 -04:00
dependabot[bot]
8478411b8f Bump adventure-platform-bukkit from 4.1.0 to 4.1.1
Bumps [adventure-platform-bukkit](https://github.com/KyoriPowered/adventure-platform) from 4.1.0 to 4.1.1.
- [Release notes](https://github.com/KyoriPowered/adventure-platform/releases)
- [Commits](https://github.com/KyoriPowered/adventure-platform/compare/v4.1.0...v4.1.1)

---
updated-dependencies:
- dependency-name: net.kyori:adventure-platform-bukkit
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-13 11:38:33 +00:00
hyperdefined
85d072667a Update CommandToolStats.java 2022-06-13 03:10:39 -04:00
hyperdefined
010ca54144 gamemode check 2022-06-13 03:07:37 -04:00
hyperdefined
6af49d6c30 better null handling 2022-06-13 02:55:11 -04:00
hyperdefined
c4e4ce01fd removed debug message 2022-06-13 02:21:32 -04:00
hyperdefined
983a35bd0b Update README.md 2022-06-08 21:01:15 -04:00
hyperdefined
d9ad7ebcad shade stuff 2022-06-07 17:58:46 -04:00
hyperdefined
995f80e159 Update plugin.yml 2022-06-06 13:26:05 -04:00
hyperdefined
56850c40d1 Merge pull request #11 from hyperdefined/dependabot/maven/net.kyori-adventure-text-minimessage-4.11.0
Bump adventure-text-minimessage from 4.10.1 to 4.11.0
2022-06-06 13:25:15 -04:00
dependabot[bot]
b9e4bbd1e8 Bump adventure-text-minimessage from 4.10.1 to 4.11.0
Bumps [adventure-text-minimessage](https://github.com/KyoriPowered/adventure) from 4.10.1 to 4.11.0.
- [Release notes](https://github.com/KyoriPowered/adventure/releases)
- [Commits](https://github.com/KyoriPowered/adventure/compare/v4.10.1...v4.11.0)

---
updated-dependencies:
- dependency-name: net.kyori:adventure-text-minimessage
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-02 11:28:36 +00:00
hyperdefined
6a23c7a724 version bump 2022-05-10 15:31:52 -04:00
hyperdefined
cd6cb999c0 handle item pickup better 2022-05-10 15:29:53 -04:00
hyperdefined
f9cff275b5 fixed trident lore not being added 2022-05-10 15:27:51 -04:00
hyperdefined
ba1ae01801 use minimessage for various messages 2022-05-10 14:41:01 -04:00
hyperdefined
fd35cf6e9c Update README.md 2022-04-19 18:55:48 -04:00
hyperdefined
5971ecc919 Merge pull request #10 from hyperdefined/dependabot/maven/org.apache.maven.plugins-maven-clean-plugin-3.2.0
Bump maven-clean-plugin from 3.1.0 to 3.2.0
2022-04-06 11:38:22 -04:00
dependabot[bot]
4c4ca0c31e Bump maven-clean-plugin from 3.1.0 to 3.2.0
Bumps [maven-clean-plugin](https://github.com/apache/maven-clean-plugin) from 3.1.0 to 3.2.0.
- [Release notes](https://github.com/apache/maven-clean-plugin/releases)
- [Commits](https://github.com/apache/maven-clean-plugin/compare/maven-clean-plugin-3.1.0...maven-clean-plugin-3.2.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-clean-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 11:24:12 +00:00
hyperdefined
294b753430 Merge pull request #9 from hyperdefined/dependabot/maven/org.apache.maven.plugins-maven-shade-plugin-3.3.0
Bump maven-shade-plugin from 3.2.4 to 3.3.0
2022-03-30 15:11:18 -04:00
dependabot[bot]
adf6a3149b Bump maven-shade-plugin from 3.2.4 to 3.3.0
Bumps [maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.2.4 to 3.3.0.
- [Release notes](https://github.com/apache/maven-shade-plugin/releases)
- [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.2.4...maven-shade-plugin-3.3.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-shade-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-30 11:32:46 +00:00
hyperdefined
ea68650038 Merge pull request #8 from hyperdefined/dependabot/maven/org.apache.maven.plugins-maven-compiler-plugin-3.10.1
Bump maven-compiler-plugin from 3.10.0 to 3.10.1
2022-03-11 16:47:40 -05:00
dependabot[bot]
114a27e9b5 Bump maven-compiler-plugin from 3.10.0 to 3.10.1
Bumps [maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.10.0 to 3.10.1.
- [Release notes](https://github.com/apache/maven-compiler-plugin/releases)
- [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.10.0...maven-compiler-plugin-3.10.1)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-compiler-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-11 11:26:04 +00:00
hyperdefined
7cdb71df50 cleanup 2022-03-01 23:33:55 -05:00
hyperdefined
bd80d6718c Update CommandToolStats.java 2022-03-01 23:33:26 -05:00
hyperdefined
b9907eedec unify item arrays & date formats 2022-03-01 23:32:30 -05:00
hyperdefined
61cf44a407 handle finding who opens a newly spawned chest better 2022-03-01 23:21:09 -05:00
hyperdefined
337f88ce36 Update pom.xml 2022-02-24 11:46:50 -05:00
hyperdefined
42f100f0b0 added missing return (fixes #7) 2022-02-24 11:46:08 -05:00
hyperdefined
63b3cb1d03 Update pom.xml 2022-02-23 19:57:41 -05:00
hyperdefined
7717b6b5a5 Update EntityDamage.java 2022-02-23 19:53:54 -05:00
hyperdefined
a421430fa8 only add damage to valid armor
closes #6
2022-02-23 19:52:58 -05:00
hyperdefined
7a89b31766 removed unused set 2022-02-22 19:05:00 -05:00
hyperdefined
0334681971 getFinalDamage() instead because of armor reductions 2022-02-22 17:33:48 -05:00
17 changed files with 495 additions and 209 deletions

View File

@@ -1,7 +1,7 @@
<h1 align="center">ToolStats</h1> <h1 align="center">ToolStats</h1>
<p align="center"> <p align="center">
<img src="https://img.shields.io/badge/Minecraft-1.15+-orange" alt="Minecraft versions"> <img src="https://img.shields.io/badge/Minecraft-1.15--1.19-orange" alt="Minecraft versions">
<img src="https://img.shields.io/github/v/release/hyperdefined/ToolStats" alt="GitHub release (latest by date)"> <img src="https://img.shields.io/github/v/release/hyperdefined/ToolStats" alt="GitHub release (latest by date)">
<a href="https://github.com/hyperdefined/ToolStats/releases"><img src="https://img.shields.io/github/downloads/hyperdefined/ToolStats/total?logo=github" alt="Downloads"></a> <a href="https://github.com/hyperdefined/ToolStats/releases"><img src="https://img.shields.io/github/downloads/hyperdefined/ToolStats/total?logo=github" alt="Downloads"></a>
<a href="https://en.cryptobadges.io/donate/1F29aNKQzci3ga5LDcHHawYzFPXvELTFoL"><img src="https://en.cryptobadges.io/badge/micro/1F29aNKQzci3ga5LDcHHawYzFPXvELTFoL" alt="Donate with Bitcoin"></a> <a href="https://en.cryptobadges.io/donate/1F29aNKQzci3ga5LDcHHawYzFPXvELTFoL"><img src="https://en.cryptobadges.io/badge/micro/1F29aNKQzci3ga5LDcHHawYzFPXvELTFoL" alt="Donate with Bitcoin"></a>
@@ -36,5 +36,8 @@ If item lore is ever incorrect, you can run `/toolstats reset` to reset the item
![Image](https://raw.githubusercontent.com/hyperdefined/ToolStats/master/images/image9.png) ![Image](https://raw.githubusercontent.com/hyperdefined/ToolStats/master/images/image9.png)
![Image](https://raw.githubusercontent.com/hyperdefined/ToolStats/master/images/image10.png) ![Image](https://raw.githubusercontent.com/hyperdefined/ToolStats/master/images/image10.png)
## Documentation
Visit the [wiki](https://github.com/hyperdefined/ToolStats/wiki) for help.
## License ## License
This plugin is released under GNU General Public License v3. See [LICENSE](https://github.com/hyperdefined/ToolStats/blob/master/LICENSE). This plugin is released under GNU General Public License v3. See [LICENSE](https://github.com/hyperdefined/ToolStats/blob/master/LICENSE).

45
pom.xml
View File

@@ -23,7 +23,7 @@
<groupId>lol.hyper</groupId> <groupId>lol.hyper</groupId>
<artifactId>toolstats</artifactId> <artifactId>toolstats</artifactId>
<version>1.3.2</version> <version>1.4.2</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>ToolStats</name> <name>ToolStats</name>
@@ -37,7 +37,7 @@
<plugins> <plugins>
<plugin> <plugin>
<artifactId>maven-clean-plugin</artifactId> <artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version> <version>3.2.0</version>
<executions> <executions>
<execution> <execution>
<id>auto-clean</id> <id>auto-clean</id>
@@ -51,7 +51,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.10.0</version> <version>3.10.1</version>
<configuration> <configuration>
<source>${java.version}</source> <source>${java.version}</source>
<target>${java.version}</target> <target>${java.version}</target>
@@ -60,13 +60,21 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId> <artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version> <version>3.3.0</version>
<configuration> <configuration>
<relocations> <relocations>
<relocation> <relocation>
<pattern>org.bstats</pattern> <pattern>org.bstats</pattern>
<shadedPattern>lol.hyper.toolstats.bstats</shadedPattern> <shadedPattern>lol.hyper.toolstats.bstats</shadedPattern>
</relocation> </relocation>
<relocation>
<pattern>net.kyori.adventure</pattern>
<shadedPattern>lol.hyper.toolstats.adventure</shadedPattern>
</relocation>
<relocation>
<pattern>lol.hyper.githubreleaseapi</pattern>
<shadedPattern>lol.hyper.toolstats.updater</shadedPattern>
</relocation>
</relocations> </relocations>
</configuration> </configuration>
<executions> <executions>
@@ -101,15 +109,9 @@
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId> <artifactId>spigot-api</artifactId>
<version>1.18.1-R0.1-SNAPSHOT</version> <version>1.19-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>23.0.0</version>
<scope>compile</scope>
</dependency>
<dependency> <dependency>
<groupId>org.bstats</groupId> <groupId>org.bstats</groupId>
<artifactId>bstats-bukkit</artifactId> <artifactId>bstats-bukkit</artifactId>
@@ -119,7 +121,26 @@
<dependency> <dependency>
<groupId>lol.hyper</groupId> <groupId>lol.hyper</groupId>
<artifactId>github-release-api</artifactId> <artifactId>github-release-api</artifactId>
<version>1.0.1</version> <version>1.0.2</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-text-minimessage</artifactId>
<version>4.11.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-platform-bukkit</artifactId>
<version>4.1.1</version>
<scope>compile</scope>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -21,6 +21,7 @@ import lol.hyper.githubreleaseapi.GitHubRelease;
import lol.hyper.githubreleaseapi.GitHubReleaseAPI; import lol.hyper.githubreleaseapi.GitHubReleaseAPI;
import lol.hyper.toolstats.commands.CommandToolStats; import lol.hyper.toolstats.commands.CommandToolStats;
import lol.hyper.toolstats.events.*; import lol.hyper.toolstats.events.*;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import org.bstats.bukkit.Metrics; import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@@ -32,8 +33,9 @@ import org.bukkit.plugin.java.JavaPlugin;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.HashSet; import java.text.DecimalFormat;
import java.util.Set; import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.logging.Logger; import java.util.logging.Logger;
public final class ToolStats extends JavaPlugin { public final class ToolStats extends JavaPlugin {
@@ -57,7 +59,9 @@ public final class ToolStats extends JavaPlugin {
// used for tracking new elytras // used for tracking new elytras
public final NamespacedKey newElytra = new NamespacedKey(this, "new"); public final NamespacedKey newElytra = new NamespacedKey(this, "new");
public final Set<NamespacedKey> keys = new HashSet<>(); public final SimpleDateFormat dateFormat = new SimpleDateFormat("M/dd/yyyy", Locale.ENGLISH);
public final DecimalFormat decimalFormat = new DecimalFormat("#,###.00");
public final DecimalFormat commaFormat = new DecimalFormat("#,###");
public BlocksMined blocksMined; public BlocksMined blocksMined;
public ChunkPopulate chunkPopulate; public ChunkPopulate chunkPopulate;
@@ -67,6 +71,7 @@ public final class ToolStats extends JavaPlugin {
public PickupItem pickupItem; public PickupItem pickupItem;
public EntityDamage mobKill; public EntityDamage mobKill;
public PlayerFish playerFish; public PlayerFish playerFish;
public PlayerInteract playerInteract;
public SheepShear sheepShear; public SheepShear sheepShear;
public VillagerTrade villagerTrade; public VillagerTrade villagerTrade;
public CommandToolStats commandToolStats; public CommandToolStats commandToolStats;
@@ -76,8 +81,11 @@ public final class ToolStats extends JavaPlugin {
public FileConfiguration config; public FileConfiguration config;
public final int CONFIG_VERSION = 3; public final int CONFIG_VERSION = 3;
private BukkitAudiences adventure;
@Override @Override
public void onEnable() { public void onEnable() {
this.adventure = BukkitAudiences.create(this);
if (!configFile.exists()) { if (!configFile.exists()) {
this.saveResource("config.yml", true); this.saveResource("config.yml", true);
logger.info("Copying default config!"); logger.info("Copying default config!");
@@ -91,6 +99,7 @@ public final class ToolStats extends JavaPlugin {
pickupItem = new PickupItem(this); pickupItem = new PickupItem(this);
mobKill = new EntityDamage(this); mobKill = new EntityDamage(this);
playerFish = new PlayerFish(this); playerFish = new PlayerFish(this);
playerInteract = new PlayerInteract(this);
sheepShear = new SheepShear(this); sheepShear = new SheepShear(this);
villagerTrade = new VillagerTrade(this); villagerTrade = new VillagerTrade(this);
commandToolStats = new CommandToolStats(this); commandToolStats = new CommandToolStats(this);
@@ -103,6 +112,7 @@ public final class ToolStats extends JavaPlugin {
Bukkit.getServer().getPluginManager().registerEvents(pickupItem, this); Bukkit.getServer().getPluginManager().registerEvents(pickupItem, this);
Bukkit.getServer().getPluginManager().registerEvents(mobKill, this); Bukkit.getServer().getPluginManager().registerEvents(mobKill, this);
Bukkit.getServer().getPluginManager().registerEvents(playerFish, this); Bukkit.getServer().getPluginManager().registerEvents(playerFish, this);
Bukkit.getServer().getPluginManager().registerEvents(playerInteract, this);
Bukkit.getServer().getPluginManager().registerEvents(sheepShear, this); Bukkit.getServer().getPluginManager().registerEvents(sheepShear, this);
Bukkit.getServer().getPluginManager().registerEvents(villagerTrade, this); Bukkit.getServer().getPluginManager().registerEvents(villagerTrade, this);
@@ -111,15 +121,6 @@ public final class ToolStats extends JavaPlugin {
new Metrics(this, 14110); new Metrics(this, 14110);
Bukkit.getScheduler().runTaskAsynchronously(this, this::checkForUpdates); Bukkit.getScheduler().runTaskAsynchronously(this, this::checkForUpdates);
keys.add(genericOwner);
keys.add(timeCreated);
keys.add(swordPlayerKills);
keys.add(swordMobKills);
keys.add(genericMined);
keys.add(fishingRodCaught);
keys.add(shearsSheared);
keys.add(armorDamage);
} }
public void loadConfig() { public void loadConfig() {
@@ -154,20 +155,24 @@ public final class ToolStats extends JavaPlugin {
/** /**
* Checks the config to see if we want to show lore on certain items. * Checks the config to see if we want to show lore on certain items.
* @param itemStack The item to check. *
* @param itemStack The item to check.
* @param configName The config we are checking under. * @param configName The config we are checking under.
* @return If we want to allow lore or not. * @return If we want to allow lore or not.
*/ */
public boolean checkConfig(ItemStack itemStack, String configName) { public boolean checkConfig(ItemStack itemStack, String configName) {
String itemName = itemStack.getType().toString().toLowerCase(); String itemName = itemStack.getType().toString().toLowerCase();
String itemType = null; String itemType = null;
if (itemName.contains("bow") || itemName.contains("shears")) { if (itemName.contains("bow") || itemName.contains("shears") || itemName.contains("trident")) {
if (itemName.contains("bow")) { if (itemName.contains("bow")) {
itemType = "bow"; itemType = "bow";
} }
if (itemName.contains("shears")) { if (itemName.contains("shears")) {
itemType = "shears"; itemType = "shears";
} }
if (itemName.contains("trident")) {
itemType = "trident";
}
} else { } else {
itemType = itemName.substring(itemName.indexOf("_") + 1); itemType = itemName.substring(itemName.indexOf("_") + 1);
} }
@@ -198,6 +203,9 @@ public final class ToolStats extends JavaPlugin {
case "bow": { case "bow": {
return config.getBoolean("enabled." + configName + ".bow"); return config.getBoolean("enabled." + configName + ".bow");
} }
case "trident": {
return config.getBoolean("enabled." + configName + ".trident");
}
case "helmet": case "helmet":
case "chestplate": case "chestplate":
case "leggings": case "leggings":
@@ -210,8 +218,9 @@ public final class ToolStats extends JavaPlugin {
/** /**
* Gets the lore message from the config. * Gets the lore message from the config.
*
* @param configName The config name, "messages." is already in front. * @param configName The config name, "messages." is already in front.
* @param raw If you want the raw message with the formatting codes and placeholders. * @param raw If you want the raw message with the formatting codes and placeholders.
* @return The lore message. * @return The lore message.
*/ */
public String getLoreFromConfig(String configName, boolean raw) { public String getLoreFromConfig(String configName, boolean raw) {
@@ -253,4 +262,11 @@ public final class ToolStats extends JavaPlugin {
} }
return lore; return lore;
} }
public BukkitAudiences getAdventure() {
if(this.adventure == null) {
throw new IllegalStateException("Tried to access Adventure when the plugin was disabled!");
}
return this.adventure;
}
} }

View File

@@ -18,8 +18,11 @@
package lol.hyper.toolstats.commands; package lol.hyper.toolstats.commands;
import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.ToolStats;
import lol.hyper.toolstats.UUIDDataType; import lol.hyper.toolstats.tools.UUIDDataType;
import org.bukkit.*; import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Material;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor; import org.bukkit.command.TabExecutor;
@@ -31,34 +34,35 @@ import org.bukkit.persistence.PersistentDataType;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
public class CommandToolStats implements TabExecutor { public class CommandToolStats implements TabExecutor {
private final ToolStats toolStats; private final ToolStats toolStats;
private final BukkitAudiences audiences;
public CommandToolStats(ToolStats toolStats) { public CommandToolStats(ToolStats toolStats) {
this.toolStats = toolStats; this.toolStats = toolStats;
this.audiences = toolStats.getAdventure();
} }
private final SimpleDateFormat format = new SimpleDateFormat("M/dd/yyyy", Locale.ENGLISH);
@Override @Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!sender.hasPermission("toolstats.use")) { if (!sender.hasPermission("toolstats.use")) {
sender.sendMessage(ChatColor.RED + "You do not have permission for this command."); audiences.sender(sender).sendMessage(Component.text("You do not have permission for this command.").color(NamedTextColor.RED));
return true; return true;
} }
if (args.length == 0) { if (args.length == 0) {
sender.sendMessage(ChatColor.GREEN + "ToolStats version " + toolStats.getDescription().getVersion() + ". Created by hyperdefined."); audiences.sender(sender).sendMessage(Component.text("ToolStats version " + toolStats.getDescription().getVersion() + ". Created by hyperdefined.").color(NamedTextColor.GREEN));
return true;
} }
switch (args[0]) { switch (args[0]) {
case "reload": { case "reload": {
if (sender.isOp() || sender.hasPermission("toolstats.reload")) { if (sender.hasPermission("toolstats.reload")) {
toolStats.loadConfig(); toolStats.loadConfig();
sender.sendMessage(ChatColor.GREEN + "Configuration reloaded!"); audiences.sender(sender).sendMessage(Component.text("Configuration reloaded!").color(NamedTextColor.GREEN));
} else { } else {
sender.sendMessage(ChatColor.RED + "You do not have permission for this command."); audiences.sender(sender).sendMessage(Component.text("You do not have permission for this command.").color(NamedTextColor.RED));
} }
return true; return true;
} }
@@ -67,21 +71,21 @@ public class CommandToolStats implements TabExecutor {
Player player = (Player) sender; Player player = (Player) sender;
ItemStack heldItem = player.getInventory().getItemInMainHand(); ItemStack heldItem = player.getInventory().getItemInMainHand();
if (heldItem.getType() == Material.AIR) { if (heldItem.getType() == Material.AIR) {
sender.sendMessage(ChatColor.RED + "You must hold an item!"); audiences.sender(sender).sendMessage(Component.text("You must hold an item!").color(NamedTextColor.RED));
return true; return true;
} }
fixItemLore(heldItem, player); fixItemLore(heldItem, player);
sender.sendMessage(ChatColor.GREEN + "The lore was reset!"); audiences.sender(sender).sendMessage(Component.text("The lore was reset!").color(NamedTextColor.GREEN));
return true; return true;
} }
sender.sendMessage(ChatColor.GREEN + "This will remove ALL current lore from the held item and replace it with the correct lore."); audiences.sender(sender).sendMessage(Component.text("This will remove ALL current lore from the held item and replace it with the correct lore.").color(NamedTextColor.GREEN));
sender.sendMessage(ChatColor.GREEN + "The item owner will be who ever is currently running this command."); audiences.sender(sender).sendMessage(Component.text("The item owner will be who ever is currently running this command.").color(NamedTextColor.GREEN));
sender.sendMessage(ChatColor.GREEN + "Only use this if the tags on the tool are incorrect."); audiences.sender(sender).sendMessage(Component.text("Only use this if the tags on the tool are incorrect.").color(NamedTextColor.GREEN));
sender.sendMessage(ChatColor.GREEN + "Type /toolstats reset confirm to confirm this."); audiences.sender(sender).sendMessage(Component.text("Type /toolstats reset confirm to confirm this.").color(NamedTextColor.GREEN));
return true; return true;
} }
default: { default: {
sender.sendMessage(ChatColor.RED + "Invalid sub-command."); audiences.sender(sender).sendMessage(Component.text("Invalid sub-command.").color(NamedTextColor.RED));
} }
} }
return true; return true;
@@ -89,8 +93,9 @@ public class CommandToolStats implements TabExecutor {
/** /**
* Fixes lore on a given item. This will wipe all lore and reapply our custom ones. * Fixes lore on a given item. This will wipe all lore and reapply our custom ones.
*
* @param original The item we are fixing. * @param original The item we are fixing.
* @param player The player running the command. * @param player The player running the command.
*/ */
private void fixItemLore(ItemStack original, Player player) { private void fixItemLore(ItemStack original, Player player) {
ItemStack finalItem = original.clone(); ItemStack finalItem = original.clone();
@@ -137,7 +142,7 @@ public class CommandToolStats implements TabExecutor {
if (container.has(toolStats.timeCreated, PersistentDataType.LONG)) { if (container.has(toolStats.timeCreated, PersistentDataType.LONG)) {
Long time = container.get(toolStats.timeCreated, PersistentDataType.LONG); Long time = container.get(toolStats.timeCreated, PersistentDataType.LONG);
if (time != null) { if (time != null) {
lore.add(toolStats.getLoreFromConfig("looted.found-on", true).replace("{date}", format.format(new Date(time)))); lore.add(toolStats.getLoreFromConfig("looted.found-on", true).replace("{date}", toolStats.dateFormat.format(new Date(time))));
} }
} }
finalMeta.setLore(lore); finalMeta.setLore(lore);
@@ -179,19 +184,19 @@ public class CommandToolStats implements TabExecutor {
// show how when the item was created based on the previous lore // show how when the item was created based on the previous lore
switch (type) { switch (type) {
case "DEFAULT": { case "DEFAULT": {
lore.add(toolStats.getLoreFromConfig("created.created-on", true).replace("{date}", format.format(new Date(time)))); lore.add(toolStats.getLoreFromConfig("created.created-on", true).replace("{date}", toolStats.dateFormat.format(new Date(time))));
break; break;
} }
case "CAUGHT": { case "CAUGHT": {
lore.add(toolStats.getLoreFromConfig("fished.caught-on", true).replace("{date}", format.format(new Date(time)))); lore.add(toolStats.getLoreFromConfig("fished.caught-on", true).replace("{date}", toolStats.dateFormat.format(new Date(time))));
break; break;
} }
case "LOOTED": { case "LOOTED": {
lore.add(toolStats.getLoreFromConfig("looted.foundon", true).replace("{date}", format.format(new Date(time)))); lore.add(toolStats.getLoreFromConfig("looted.found-on", true).replace("{date}", toolStats.dateFormat.format(new Date(time))));
break; break;
} }
case "TRADED": { case "TRADED": {
lore.add(toolStats.getLoreFromConfig("traded.traded-on", true).replace("{date}", format.format(new Date(time)))); lore.add(toolStats.getLoreFromConfig("traded.traded-on", true).replace("{date}", toolStats.dateFormat.format(new Date(time))));
break; break;
} }
} }
@@ -202,7 +207,7 @@ public class CommandToolStats implements TabExecutor {
if (container.has(toolStats.swordPlayerKills, PersistentDataType.INTEGER)) { if (container.has(toolStats.swordPlayerKills, PersistentDataType.INTEGER)) {
Integer kills = container.get(toolStats.swordPlayerKills, PersistentDataType.INTEGER); Integer kills = container.get(toolStats.swordPlayerKills, PersistentDataType.INTEGER);
if (kills != null) { if (kills != null) {
lore.add(toolStats.getLoreFromConfig("kills.player", true).replace("{kills}", Integer.toString(kills))); lore.add(toolStats.getLoreFromConfig("kills.player", true).replace("{kills}", toolStats.commaFormat.format(kills)));
} }
} }
} }
@@ -210,7 +215,7 @@ public class CommandToolStats implements TabExecutor {
if (container.has(toolStats.swordMobKills, PersistentDataType.INTEGER)) { if (container.has(toolStats.swordMobKills, PersistentDataType.INTEGER)) {
Integer kills = container.get(toolStats.swordMobKills, PersistentDataType.INTEGER); Integer kills = container.get(toolStats.swordMobKills, PersistentDataType.INTEGER);
if (kills != null) { if (kills != null) {
lore.add(toolStats.getLoreFromConfig("kills.mob", true).replace("{kills}", Integer.toString(kills))); lore.add(toolStats.getLoreFromConfig("kills.mob", true).replace("{kills}", toolStats.commaFormat.format(kills)));
} }
} }
} }
@@ -218,7 +223,7 @@ public class CommandToolStats implements TabExecutor {
if (container.has(toolStats.genericMined, PersistentDataType.INTEGER)) { if (container.has(toolStats.genericMined, PersistentDataType.INTEGER)) {
Integer blocksMined = container.get(toolStats.genericMined, PersistentDataType.INTEGER); Integer blocksMined = container.get(toolStats.genericMined, PersistentDataType.INTEGER);
if (blocksMined != null) { if (blocksMined != null) {
lore.add(toolStats.getLoreFromConfig("blocks-mined", true).replace("{blocks}", Integer.toString(blocksMined))); lore.add(toolStats.getLoreFromConfig("blocks-mined", true).replace("{blocks}", toolStats.commaFormat.format(blocksMined)));
} }
} }
} }
@@ -226,7 +231,7 @@ public class CommandToolStats implements TabExecutor {
if (container.has(toolStats.fishingRodCaught, PersistentDataType.INTEGER)) { if (container.has(toolStats.fishingRodCaught, PersistentDataType.INTEGER)) {
Integer fish = container.get(toolStats.fishingRodCaught, PersistentDataType.INTEGER); Integer fish = container.get(toolStats.fishingRodCaught, PersistentDataType.INTEGER);
if (fish != null) { if (fish != null) {
lore.add(toolStats.getLoreFromConfig("fished.fish-caught", true).replace("{fish}", Integer.toString(fish))); lore.add(toolStats.getLoreFromConfig("fished.fish-caught", true).replace("{fish}", toolStats.commaFormat.format(fish)));
} }
} }
} }
@@ -234,15 +239,15 @@ public class CommandToolStats implements TabExecutor {
if (container.has(toolStats.shearsSheared, PersistentDataType.INTEGER)) { if (container.has(toolStats.shearsSheared, PersistentDataType.INTEGER)) {
Integer sheep = container.get(toolStats.shearsSheared, PersistentDataType.INTEGER); Integer sheep = container.get(toolStats.shearsSheared, PersistentDataType.INTEGER);
if (sheep != null) { if (sheep != null) {
lore.add(toolStats.getLoreFromConfig("sheep-sheared", true).replace("{sheep}", Integer.toString(sheep))); lore.add(toolStats.getLoreFromConfig("sheep-sheared", true).replace("{sheep}", toolStats.commaFormat.format(sheep)));
} }
} }
} }
if (toolStats.config.getBoolean("enabled.armor-damage")) { if (toolStats.config.getBoolean("enabled.armor-damage")) {
if (container.has(toolStats.armorDamage, PersistentDataType.INTEGER)) { if (container.has(toolStats.armorDamage, PersistentDataType.DOUBLE)) {
Integer damage = container.get(toolStats.armorDamage, PersistentDataType.INTEGER); Double damage = container.get(toolStats.armorDamage, PersistentDataType.DOUBLE);
if (damage != null) { if (damage != null) {
lore.add(toolStats.getLoreFromConfig("damage-taken", true).replace("{damage}", Integer.toString(damage))); lore.add(toolStats.getLoreFromConfig("damage-taken", true).replace("{damage}", toolStats.commaFormat.format(damage)));
} }
} }
} }

View File

@@ -18,6 +18,7 @@
package lol.hyper.toolstats.events; package lol.hyper.toolstats.events;
import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.ToolStats;
import lol.hyper.toolstats.tools.ItemChecker;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -30,13 +31,11 @@ import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType; import org.bukkit.persistence.PersistentDataType;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
public class BlocksMined implements Listener { public class BlocksMined implements Listener {
private final ToolStats toolStats; private final ToolStats toolStats;
private final String[] validTools = {"pickaxe", "axe", "hoe", "shovel", "shear"};
public BlocksMined(ToolStats toolStats) { public BlocksMined(ToolStats toolStats) {
this.toolStats = toolStats; this.toolStats = toolStats;
@@ -48,8 +47,7 @@ public class BlocksMined implements Listener {
return; return;
} }
Player player = event.getPlayer(); Player player = event.getPlayer();
// ignore creative mode if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) {
if (player.getGameMode() != GameMode.SURVIVAL) {
return; return;
} }
// if the player mines something with their fist // if the player mines something with their fist
@@ -58,8 +56,7 @@ public class BlocksMined implements Listener {
return; return;
} }
// only check certain items // only check certain items
String itemName = heldItem.getType().toString().toLowerCase(); if (!ItemChecker.isMineTool(heldItem.getType())) {
if (Arrays.stream(validTools).noneMatch(itemName::contains)) {
return; return;
} }
// if it's an item we want, update the stats // if it's an item we want, update the stats
@@ -84,7 +81,6 @@ public class BlocksMined implements Listener {
blocksMined++; blocksMined++;
} }
container.set(toolStats.genericMined, PersistentDataType.INTEGER, blocksMined); container.set(toolStats.genericMined, PersistentDataType.INTEGER, blocksMined);
String configLore = toolStats.getLoreFromConfig("blocks-mined", false); String configLore = toolStats.getLoreFromConfig("blocks-mined", false);
String configLoreRaw = toolStats.getLoreFromConfig("blocks-mined", true); String configLoreRaw = toolStats.getLoreFromConfig("blocks-mined", true);
@@ -103,18 +99,18 @@ public class BlocksMined implements Listener {
for (int x = 0; x < lore.size(); x++) { for (int x = 0; x < lore.size(); x++) {
if (lore.get(x).contains(configLore)) { if (lore.get(x).contains(configLore)) {
hasLore = true; hasLore = true;
lore.set(x, configLoreRaw.replace("{blocks}", Integer.toString(blocksMined))); lore.set(x, configLoreRaw.replace("{blocks}", toolStats.commaFormat.format(blocksMined)));
break; break;
} }
} }
// if the item has lore but doesn't have the tag, add it // if the item has lore but doesn't have the tag, add it
if (!hasLore) { if (!hasLore) {
lore.add(configLoreRaw.replace("{blocks}", Integer.toString(blocksMined))); lore.add(configLoreRaw.replace("{blocks}", toolStats.commaFormat.format(blocksMined)));
} }
} else { } else {
// if the item has no lore, create a new list and add the string // if the item has no lore, create a new list and add the string
lore = new ArrayList<>(); lore = new ArrayList<>();
lore.add(configLoreRaw.replace("{blocks}", Integer.toString(blocksMined))); lore.add(configLoreRaw.replace("{blocks}", toolStats.commaFormat.format(blocksMined)));
} }
// do we add the lore based on the config? // do we add the lore based on the config?
if (toolStats.checkConfig(itemStack, "blocks-mined")) { if (toolStats.checkConfig(itemStack, "blocks-mined")) {

View File

@@ -35,7 +35,7 @@ import org.bukkit.persistence.PersistentDataType;
public class ChunkPopulate implements Listener { public class ChunkPopulate implements Listener {
// this tags all elytras with a "new" tag // this tags all elytras with a "new" tag
// this let's use tag any new elytras player loot // this let's us track any new elytras player loot
private final ToolStats toolStats; private final ToolStats toolStats;

View File

@@ -18,8 +18,10 @@
package lol.hyper.toolstats.events; package lol.hyper.toolstats.events;
import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.ToolStats;
import lol.hyper.toolstats.UUIDDataType; import lol.hyper.toolstats.tools.ItemChecker;
import lol.hyper.toolstats.tools.UUIDDataType;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@@ -30,16 +32,11 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType; import org.bukkit.persistence.PersistentDataType;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
public class CraftItem implements Listener { public class CraftItem implements Listener {
private final ToolStats toolStats; private final ToolStats toolStats;
public final String[] validItems = {
"pickaxe", "sword", "shovel", "axe", "hoe", "bow", "helmet", "chestplate", "leggings", "boots", "fishing"
};
private final SimpleDateFormat format = new SimpleDateFormat("M/dd/yyyy", Locale.ENGLISH);
public CraftItem(ToolStats toolStats) { public CraftItem(ToolStats toolStats) {
this.toolStats = toolStats; this.toolStats = toolStats;
@@ -51,37 +48,40 @@ public class CraftItem implements Listener {
return; return;
} }
Player player = (Player) event.getWhoClicked(); Player player = (Player) event.getWhoClicked();
if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) {
return;
}
ItemStack itemStack = event.getCurrentItem(); ItemStack itemStack = event.getCurrentItem();
if (itemStack == null || itemStack.getType() == Material.AIR) { if (itemStack == null || itemStack.getType() == Material.AIR) {
return; return;
} }
String name = itemStack.getType().toString().toLowerCase(Locale.ROOT); // only check certain items
// only check for items we want if (!ItemChecker.isValidItem(itemStack.getType())) {
for (String x : validItems) { return;
if (name.contains(x)) { }
// if the player shift clicks, send them this warning
if (event.isShiftClick()) { // if the player shift clicks, send them this warning
String configMessage = toolStats.config.getString("messages.shift-click-warning.crafting"); if (event.isShiftClick()) {
if (configMessage != null) { String configMessage = toolStats.config.getString("messages.shift-click-warning.crafting");
if (configMessage.length() != 0) { if (configMessage != null) {
event.getWhoClicked().sendMessage(ChatColor.translateAlternateColorCodes('&', configMessage)); if (configMessage.length() != 0) {
} event.getWhoClicked().sendMessage(ChatColor.translateAlternateColorCodes('&', configMessage));
}
} }
// test the item before setting it
if (addLore(itemStack, player) == null) {
return;
}
// set the result
event.setCurrentItem(addLore(itemStack, player));
} }
} }
// test the item before setting it
ItemStack newItem = addLore(itemStack, player);
if (newItem != null) {
// set the result
event.setCurrentItem(newItem);
}
} }
/** /**
* Adds crafted tags to item. * Adds crafted tags to item.
*
* @param itemStack The item add item to. * @param itemStack The item add item to.
* @param owner The player crafting. * @param owner The player crafting.
* @return A copy of the item with the tags + lore. * @return A copy of the item with the tags + lore.
*/ */
private ItemStack addLore(ItemStack itemStack, Player owner) { private ItemStack addLore(ItemStack itemStack, Player owner) {
@@ -127,7 +127,7 @@ public class CraftItem implements Listener {
} }
// do we add the lore based on the config? // do we add the lore based on the config?
if (toolStats.checkConfig(itemStack, "created-date")) { if (toolStats.checkConfig(itemStack, "created-date")) {
lore.add(createdOnRaw.replace("{date}", format.format(finalDate))); lore.add(createdOnRaw.replace("{date}", toolStats.dateFormat.format(finalDate)));
} }
if (toolStats.checkConfig(itemStack, "created-by")) { if (toolStats.checkConfig(itemStack, "created-by")) {
lore.add(createdByRaw.replace("{player}", owner.getName())); lore.add(createdByRaw.replace("{player}", owner.getName()));

View File

@@ -18,6 +18,7 @@
package lol.hyper.toolstats.events; package lol.hyper.toolstats.events;
import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.ToolStats;
import lol.hyper.toolstats.tools.ItemChecker;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.*; import org.bukkit.entity.*;
@@ -32,15 +33,11 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType; import org.bukkit.persistence.PersistentDataType;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.*; import java.util.*;
public class EntityDamage implements Listener { public class EntityDamage implements Listener {
private final ToolStats toolStats; private final ToolStats toolStats;
private final String[] validTools = {"sword", "trident", "axe"};
private final DecimalFormat decimalFormat = new DecimalFormat("0.00");
public final Set<UUID> trackedMobs = new HashSet<>(); public final Set<UUID> trackedMobs = new HashSet<>();
public EntityDamage(ToolStats toolStats) { public EntityDamage(ToolStats toolStats) {
@@ -61,7 +58,7 @@ public class EntityDamage implements Listener {
// a player is killing something // a player is killing something
if (event.getDamager() instanceof Player) { if (event.getDamager() instanceof Player) {
Player player = (Player) event.getDamager(); Player player = (Player) event.getDamager();
if (player.getGameMode() != GameMode.SURVIVAL) { if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) {
return; return;
} }
// a player killed something with their fist // a player killed something with their fist
@@ -69,9 +66,8 @@ public class EntityDamage implements Listener {
if (heldItem == null || heldItem.getType() == Material.AIR) { if (heldItem == null || heldItem.getType() == Material.AIR) {
return; return;
} }
// check items we want // only check certain items
String itemName = heldItem.getType().toString().toLowerCase(); if (!ItemChecker.isMeleeWeapon(heldItem.getType())) {
if (Arrays.stream(validTools).noneMatch(itemName::contains)) {
return; return;
} }
// a player is killing another player // a player is killing another player
@@ -104,6 +100,9 @@ public class EntityDamage implements Listener {
// if the shooter is a player // if the shooter is a player
if (arrow.getShooter() instanceof Player) { if (arrow.getShooter() instanceof Player) {
Player player = (Player) arrow.getShooter(); Player player = (Player) arrow.getShooter();
if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) {
return;
}
ItemStack heldItem = player.getInventory().getItem(player.getInventory().getHeldItemSlot()); ItemStack heldItem = player.getInventory().getItem(player.getInventory().getHeldItemSlot());
if (heldItem == null) { if (heldItem == null) {
return; return;
@@ -123,10 +122,15 @@ public class EntityDamage implements Listener {
// player is taken damage but not being killed // player is taken damage but not being killed
if (livingEntity instanceof Player) { if (livingEntity instanceof Player) {
Player player = (Player) livingEntity; Player player = (Player) livingEntity;
if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) {
return;
}
PlayerInventory inventory = player.getInventory(); PlayerInventory inventory = player.getInventory();
for (ItemStack armor : inventory.getArmorContents()) { for (ItemStack armor : inventory.getArmorContents()) {
if (armor != null) { if (armor != null) {
updateArmorDamage(armor, event.getDamage()); if (ItemChecker.isArmor(armor.getType())) {
updateArmorDamage(armor, event.getFinalDamage());
}
} }
} }
} }
@@ -141,10 +145,15 @@ public class EntityDamage implements Listener {
// player is taken damage but not being killed // player is taken damage but not being killed
if (livingEntity instanceof Player) { if (livingEntity instanceof Player) {
Player player = (Player) livingEntity; Player player = (Player) livingEntity;
if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) {
return;
}
PlayerInventory inventory = player.getInventory(); PlayerInventory inventory = player.getInventory();
for (ItemStack armor : inventory.getArmorContents()) { for (ItemStack armor : inventory.getArmorContents()) {
if (armor != null) { if (armor != null) {
updateArmorDamage(armor, event.getDamage()); if (ItemChecker.isArmor(armor.getType())) {
updateArmorDamage(armor, event.getFinalDamage());
}
} }
} }
} }
@@ -159,10 +168,15 @@ public class EntityDamage implements Listener {
// player is taken damage but not being killed // player is taken damage but not being killed
if (livingEntity instanceof Player) { if (livingEntity instanceof Player) {
Player player = (Player) livingEntity; Player player = (Player) livingEntity;
if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) {
return;
}
PlayerInventory inventory = player.getInventory(); PlayerInventory inventory = player.getInventory();
for (ItemStack armor : inventory.getArmorContents()) { for (ItemStack armor : inventory.getArmorContents()) {
if (armor != null) { if (armor != null) {
updateArmorDamage(armor, event.getDamage()); if (ItemChecker.isArmor(armor.getType())) {
updateArmorDamage(armor, event.getFinalDamage());
}
} }
} }
} }
@@ -170,6 +184,7 @@ public class EntityDamage implements Listener {
/** /**
* Updates a weapon's player kills. * Updates a weapon's player kills.
*
* @param itemStack The item to update. * @param itemStack The item to update.
* @return A copy of the item. * @return A copy of the item.
*/ */
@@ -209,18 +224,18 @@ public class EntityDamage implements Listener {
for (int x = 0; x < lore.size(); x++) { for (int x = 0; x < lore.size(); x++) {
if (lore.get(x).contains(playerKillsLore)) { if (lore.get(x).contains(playerKillsLore)) {
hasLore = true; hasLore = true;
lore.set(x, playerKillsLoreRaw.replace("{kills}", Integer.toString(playerKills))); lore.set(x, playerKillsLoreRaw.replace("{kills}", toolStats.commaFormat.format(playerKills)));
break; break;
} }
} }
// if the item has lore but doesn't have the tag, add it // if the item has lore but doesn't have the tag, add it
if (!hasLore) { if (!hasLore) {
lore.add(playerKillsLoreRaw.replace("{kills}", Integer.toString(playerKills))); lore.add(playerKillsLoreRaw.replace("{kills}", toolStats.commaFormat.format(playerKills)));
} }
} else { } else {
// if the item has no lore, create a new list and add the string // if the item has no lore, create a new list and add the string
lore = new ArrayList<>(); lore = new ArrayList<>();
lore.add(playerKillsLoreRaw.replace("{kills}", Integer.toString(playerKills))); lore.add(playerKillsLoreRaw.replace("{kills}", toolStats.commaFormat.format(playerKills)));
} }
// do we add the lore based on the config? // do we add the lore based on the config?
if (toolStats.checkConfig(itemStack, "player-kills")) { if (toolStats.checkConfig(itemStack, "player-kills")) {
@@ -232,6 +247,7 @@ public class EntityDamage implements Listener {
/** /**
* Updates a weapon's mob kills. * Updates a weapon's mob kills.
*
* @param itemStack The item to update. * @param itemStack The item to update.
* @return A copy of the item. * @return A copy of the item.
*/ */
@@ -271,18 +287,18 @@ public class EntityDamage implements Listener {
for (int x = 0; x < lore.size(); x++) { for (int x = 0; x < lore.size(); x++) {
if (lore.get(x).contains(mobKillsLore)) { if (lore.get(x).contains(mobKillsLore)) {
hasLore = true; hasLore = true;
lore.set(x, mobKillsLoreRaw.replace("{kills}", Integer.toString(mobKills))); lore.set(x, mobKillsLoreRaw.replace("{kills}", toolStats.commaFormat.format(mobKills)));
break; break;
} }
} }
// if the item has lore but doesn't have the tag, add it // if the item has lore but doesn't have the tag, add it
if (!hasLore) { if (!hasLore) {
lore.add(mobKillsLoreRaw.replace("{kills}", Integer.toString(mobKills))); lore.add(mobKillsLoreRaw.replace("{kills}", toolStats.commaFormat.format(mobKills)));
} }
} else { } else {
// if the item has no lore, create a new list and add the string // if the item has no lore, create a new list and add the string
lore = new ArrayList<>(); lore = new ArrayList<>();
lore.add(mobKillsLoreRaw.replace("{kills}", Integer.toString(mobKills))); lore.add(mobKillsLoreRaw.replace("{kills}", toolStats.commaFormat.format(mobKills)));
} }
// do we add the lore based on the config? // do we add the lore based on the config?
if (toolStats.checkConfig(itemStack, "mob-kills")) { if (toolStats.checkConfig(itemStack, "mob-kills")) {
@@ -294,8 +310,9 @@ public class EntityDamage implements Listener {
/** /**
* Updates a player's armor damage stats. * Updates a player's armor damage stats.
*
* @param itemStack The armor piece. * @param itemStack The armor piece.
* @param damage How much damage is being added. * @param damage How much damage is being added.
*/ */
private void updateArmorDamage(ItemStack itemStack, double damage) { private void updateArmorDamage(ItemStack itemStack, double damage) {
ItemMeta meta = itemStack.getItemMeta(); ItemMeta meta = itemStack.getItemMeta();
@@ -312,7 +329,6 @@ public class EntityDamage implements Listener {
} else { } else {
damageTaken = damageTaken + damage; damageTaken = damageTaken + damage;
} }
decimalFormat.setRoundingMode(RoundingMode.DOWN);
container.set(toolStats.armorDamage, PersistentDataType.DOUBLE, damageTaken); container.set(toolStats.armorDamage, PersistentDataType.DOUBLE, damageTaken);
String damageTakenLore = toolStats.getLoreFromConfig("damage-taken", false); String damageTakenLore = toolStats.getLoreFromConfig("damage-taken", false);
@@ -333,18 +349,18 @@ public class EntityDamage implements Listener {
for (int x = 0; x < lore.size(); x++) { for (int x = 0; x < lore.size(); x++) {
if (lore.get(x).contains(damageTakenLore)) { if (lore.get(x).contains(damageTakenLore)) {
hasLore = true; hasLore = true;
lore.set(x, damageTakenLoreRaw.replace("{damage}", decimalFormat.format(damageTaken))); lore.set(x, damageTakenLoreRaw.replace("{damage}", toolStats.decimalFormat.format(damageTaken)));
break; break;
} }
} }
// if the item has lore but doesn't have the tag, add it // if the item has lore but doesn't have the tag, add it
if (!hasLore) { if (!hasLore) {
lore.add(damageTakenLoreRaw.replace("{damage}", decimalFormat.format(damageTaken))); lore.add(damageTakenLoreRaw.replace("{damage}", toolStats.decimalFormat.format(damageTaken)));
} }
} else { } else {
// if the item has no lore, create a new list and add the string // if the item has no lore, create a new list and add the string
lore = new ArrayList<>(); lore = new ArrayList<>();
lore.add(damageTakenLoreRaw.replace("{damage}", decimalFormat.format(damageTaken))); lore.add(damageTakenLoreRaw.replace("{damage}", toolStats.decimalFormat.format(damageTaken)));
} }
if (toolStats.config.getBoolean("enabled.armor-damage")) { if (toolStats.config.getBoolean("enabled.armor-damage")) {
meta.setLore(lore); meta.setLore(lore);

View File

@@ -18,6 +18,7 @@
package lol.hyper.toolstats.events; package lol.hyper.toolstats.events;
import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.ToolStats;
import lol.hyper.toolstats.tools.ItemChecker;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@@ -46,11 +47,8 @@ public class EntityDeath implements Listener {
// if it's a mob we are tracking that matters // if it's a mob we are tracking that matters
if (toolStats.mobKill.trackedMobs.contains(livingEntityUUID)) { if (toolStats.mobKill.trackedMobs.contains(livingEntityUUID)) {
for (ItemStack current : event.getDrops()) { for (ItemStack current : event.getDrops()) {
String name = current.getType().toString().toLowerCase(Locale.ROOT); if (ItemChecker.isValidItem(current.getType())) {
for (String item : toolStats.craftItem.validItems) { addLore(current, livingEntity.getName());
if (name.contains(item)) {
addLore(current, livingEntity.getName());
}
} }
} }
toolStats.mobKill.trackedMobs.remove(livingEntityUUID); toolStats.mobKill.trackedMobs.remove(livingEntityUUID);
@@ -59,8 +57,9 @@ public class EntityDeath implements Listener {
/** /**
* Adds "drop by" tag to item. * Adds "drop by" tag to item.
*
* @param itemStack The item to add lore to. * @param itemStack The item to add lore to.
* @param mob The mob or player name. * @param mob The mob or player name.
*/ */
private void addLore(ItemStack itemStack, String mob) { private void addLore(ItemStack itemStack, String mob) {
ItemMeta meta = itemStack.getItemMeta(); ItemMeta meta = itemStack.getItemMeta();

View File

@@ -18,10 +18,15 @@
package lol.hyper.toolstats.events; package lol.hyper.toolstats.events;
import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.ToolStats;
import lol.hyper.toolstats.UUIDDataType; import lol.hyper.toolstats.tools.ItemChecker;
import lol.hyper.toolstats.tools.UUIDDataType;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.Chest;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.minecart.StorageMinecart;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.world.LootGenerateEvent; import org.bukkit.event.world.LootGenerateEvent;
@@ -32,19 +37,13 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType; import org.bukkit.persistence.PersistentDataType;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale;
public class GenerateLoot implements Listener { public class GenerateLoot implements Listener {
private final ToolStats toolStats; private final ToolStats toolStats;
public final String[] validItems = {
"pickaxe", "sword", "shovel", "axe", "hoe", "bow", "helmet", "chestplate", "leggings", "boots", "fishing"
};
private final SimpleDateFormat format = new SimpleDateFormat("M/dd/yyyy", Locale.ENGLISH);
public GenerateLoot(ToolStats toolStats) { public GenerateLoot(ToolStats toolStats) {
this.toolStats = toolStats; this.toolStats = toolStats;
@@ -56,32 +55,76 @@ public class GenerateLoot implements Listener {
if (inventoryHolder == null) { if (inventoryHolder == null) {
return; return;
} }
Inventory chest = inventoryHolder.getInventory(); Location lootLocation = event.getLootContext().getLocation();
// run task later since if it runs on the same tick it breaks idk Inventory chestInv = inventoryHolder.getInventory();
Bukkit.getScheduler().runTaskLater(toolStats, () -> {
Player player = (Player) chest.getViewers().get(0); if (inventoryHolder instanceof Chest) {
// do a classic for loot so we keep track of chest index of item Block openedChest = null;
for (int i = 0; i < chest.getContents().length; i++) { // look at the current list of opened chest and get the distance
ItemStack itemStack = chest.getItem(i); // between the lootcontext location and chest location
// ignore air // if the distance is less than 1, it's the same chest
if (itemStack == null || itemStack.getType() == Material.AIR) { for (Block chest : toolStats.playerInteract.openedChests.keySet()) {
continue; Location chestLocation = chest.getLocation();
} if (chest.getWorld() == lootLocation.getWorld()) {
String name = itemStack.getType().toString().toLowerCase(Locale.ROOT); double distance = lootLocation.distance(chestLocation);
for (String x : validItems) { if (distance <= 1.0) {
if (name.contains(x)) { openedChest = chest;
chest.setItem(i, addLore(itemStack, player));
} }
} }
} }
// ignore if the chest is not in the same location
if (openedChest == null) {
return;
}
},1); // run task later since if it runs on the same tick it breaks idk
Block finalOpenedChest = openedChest;
Bukkit.getScheduler().runTaskLater(toolStats, () -> {
Player player = toolStats.playerInteract.openedChests.get(finalOpenedChest);
// do a classic for loop, so we keep track of chest index of item
for (int i = 0; i < chestInv.getContents().length; i++) {
ItemStack itemStack = chestInv.getItem(i);
// ignore air
if (itemStack == null || itemStack.getType() == Material.AIR) {
continue;
}
if (ItemChecker.isValidItem(itemStack.getType())) {
ItemStack newItem = addLore(itemStack, player);
if (newItem != null) {
chestInv.setItem(i, newItem);
}
}
}
}, 1);
}
if (inventoryHolder instanceof StorageMinecart) {
StorageMinecart mineCart = (StorageMinecart) inventoryHolder;
if (toolStats.playerInteract.openedMineCarts.containsKey(mineCart)) {
Player player = toolStats.playerInteract.openedMineCarts.get(mineCart);
// player clicked this minecart
for (int i = 0; i < chestInv.getContents().length; i++) {
ItemStack itemStack = chestInv.getItem(i);
// ignore air
if (itemStack == null || itemStack.getType() == Material.AIR) {
continue;
}
if (ItemChecker.isValidItem(itemStack.getType())) {
ItemStack newItem = addLore(itemStack, player);
if (newItem != null) {
chestInv.setItem(i, newItem);
}
}
}
}
}
} }
/** /**
* Adds lore to newly generated items. * Adds lore to newly generated items.
*
* @param itemStack The item to add lore to. * @param itemStack The item to add lore to.
* @param owner The player that found the item. * @param owner The player that found the item.
* @return The item with the lore. * @return The item with the lore.
*/ */
private ItemStack addLore(ItemStack itemStack, Player owner) { private ItemStack addLore(ItemStack itemStack, Player owner) {
@@ -117,7 +160,7 @@ public class GenerateLoot implements Listener {
lore = new ArrayList<>(); lore = new ArrayList<>();
} }
if (toolStats.checkConfig(newItem, "looted-tag")) { if (toolStats.checkConfig(newItem, "looted-tag")) {
lore.add(foundOnLoreRaw.replace("{date}", format.format(finalDate))); lore.add(foundOnLoreRaw.replace("{date}", toolStats.dateFormat.format(finalDate)));
lore.add(foundByLoreRaw.replace("{player}", owner.getName())); lore.add(foundByLoreRaw.replace("{player}", owner.getName()));
} }
meta.setLore(lore); meta.setLore(lore);

View File

@@ -18,10 +18,10 @@
package lol.hyper.toolstats.events; package lol.hyper.toolstats.events;
import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.ToolStats;
import lol.hyper.toolstats.UUIDDataType; import lol.hyper.toolstats.tools.UUIDDataType;
import org.bukkit.GameMode;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Entity; import org.bukkit.entity.*;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.EntityPickupItemEvent;
@@ -30,16 +30,13 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType; import org.bukkit.persistence.PersistentDataType;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale;
public class PickupItem implements Listener { public class PickupItem implements Listener {
private final ToolStats toolStats; private final ToolStats toolStats;
private final SimpleDateFormat format = new SimpleDateFormat("M/dd/yyyy", Locale.ENGLISH);
public PickupItem(ToolStats toolStats) { public PickupItem(ToolStats toolStats) {
this.toolStats = toolStats; this.toolStats = toolStats;
@@ -52,16 +49,26 @@ public class PickupItem implements Listener {
} }
Entity entity = event.getEntity(); Entity entity = event.getEntity();
if (entity instanceof Player) { if (entity instanceof Player) {
ItemStack itemStack = event.getItem().getItemStack(); Player player = (Player) entity;
if (itemStack.getType() == Material.ELYTRA) { if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) {
return;
}
Item item = event.getItem();
if (item.getType() == EntityType.DROPPED_ITEM) {
ItemStack itemStack = event.getItem().getItemStack();
ItemMeta meta = itemStack.getItemMeta(); ItemMeta meta = itemStack.getItemMeta();
if (meta == null) { if (meta == null) {
return; return;
} }
PersistentDataContainer container = meta.getPersistentDataContainer(); PersistentDataContainer container = meta.getPersistentDataContainer();
// the elytra has the new key, set the lore to it if (itemStack.getType() == Material.ELYTRA) {
if (container.has(toolStats.newElytra, PersistentDataType.INTEGER)) { // the elytra has the new key, set the lore to it
addLore(itemStack, (Player) event.getEntity()); if (container.has(toolStats.newElytra, PersistentDataType.INTEGER)) {
ItemStack newElytra = addLore(itemStack, (Player) event.getEntity());
if (newElytra != null) {
item.setItemStack(newElytra);
}
}
} }
} }
} }
@@ -69,13 +76,15 @@ public class PickupItem implements Listener {
/** /**
* Adds "looted by" tags for elytras. * Adds "looted by" tags for elytras.
*
* @param itemStack The elytra to add lore to. * @param itemStack The elytra to add lore to.
* @param owner The player who found it. * @param owner The player who found it.
*/ */
private void addLore(ItemStack itemStack, Player owner) { private ItemStack addLore(ItemStack itemStack, Player owner) {
ItemMeta meta = itemStack.getItemMeta(); ItemStack finalItem = itemStack.clone();
ItemMeta meta = finalItem.getItemMeta();
if (meta == null) { if (meta == null) {
return; return null;
} }
long timeCreated = System.currentTimeMillis(); long timeCreated = System.currentTimeMillis();
Date finalDate = new Date(timeCreated); Date finalDate = new Date(timeCreated);
@@ -89,7 +98,7 @@ public class PickupItem implements Listener {
if (foundByLoreRaw == null || foundOnLoreRaw == null) { if (foundByLoreRaw == null || foundOnLoreRaw == null) {
toolStats.logger.warning("There is no lore message for messages.looted!"); toolStats.logger.warning("There is no lore message for messages.looted!");
return; return null;
} }
List<String> lore; List<String> lore;
@@ -100,10 +109,11 @@ public class PickupItem implements Listener {
lore = new ArrayList<>(); lore = new ArrayList<>();
} }
if (toolStats.config.getBoolean("enabled.elytra-tag")) { if (toolStats.config.getBoolean("enabled.elytra-tag")) {
lore.add(foundOnLoreRaw.replace("{date}", format.format(finalDate))); lore.add(foundOnLoreRaw.replace("{date}", toolStats.dateFormat.format(finalDate)));
lore.add(foundByLoreRaw.replace("{player}", owner.getName())); lore.add(foundByLoreRaw.replace("{player}", owner.getName()));
} }
meta.setLore(lore); meta.setLore(lore);
itemStack.setItemMeta(meta); finalItem.setItemMeta(meta);
return finalItem;
} }
} }

View File

@@ -18,7 +18,9 @@
package lol.hyper.toolstats.events; package lol.hyper.toolstats.events;
import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.ToolStats;
import lol.hyper.toolstats.UUIDDataType; import lol.hyper.toolstats.tools.ItemChecker;
import lol.hyper.toolstats.tools.UUIDDataType;
import org.bukkit.GameMode;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Item; import org.bukkit.entity.Item;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -30,19 +32,13 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType; import org.bukkit.persistence.PersistentDataType;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale;
public class PlayerFish implements Listener { public class PlayerFish implements Listener {
private final ToolStats toolStats; private final ToolStats toolStats;
public final String[] validItems = {
"pickaxe", "sword", "shovel", "axe", "hoe", "bow", "helmet", "chestplate", "leggings", "boots", "fishing"
};
private final SimpleDateFormat format = new SimpleDateFormat("M/dd/yyyy", Locale.ENGLISH);
public PlayerFish(ToolStats toolStats) { public PlayerFish(ToolStats toolStats) {
this.toolStats = toolStats; this.toolStats = toolStats;
@@ -59,6 +55,9 @@ public class PlayerFish implements Listener {
} }
Player player = event.getPlayer(); Player player = event.getPlayer();
if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) {
return;
}
ItemStack heldItem = player.getInventory().getItem(player.getInventory().getHeldItemSlot()); ItemStack heldItem = player.getInventory().getItem(player.getInventory().getHeldItemSlot());
if (heldItem == null || heldItem.getType() == Material.AIR || heldItem.getType() != Material.FISHING_ROD) { if (heldItem == null || heldItem.getType() == Material.AIR || heldItem.getType() != Material.FISHING_ROD) {
return; return;
@@ -68,15 +67,14 @@ public class PlayerFish implements Listener {
return; return;
} }
ItemStack caughtItem = ((Item) event.getCaught()).getItemStack(); ItemStack caughtItem = ((Item) event.getCaught()).getItemStack();
for (String x : validItems) { if (ItemChecker.isValidItem(caughtItem.getType())) {
if (caughtItem.getType().toString().toLowerCase(Locale.ROOT).contains(x)) { addNewLore(caughtItem, player);
addNewLore(caughtItem, player);
}
} }
} }
/** /**
* Updates a fishing rod's count. * Updates a fishing rod's count.
*
* @param itemStack The fishing rod to update. * @param itemStack The fishing rod to update.
*/ */
private void updateFishCount(ItemStack itemStack) { private void updateFishCount(ItemStack itemStack) {
@@ -114,18 +112,18 @@ public class PlayerFish implements Listener {
for (int x = 0; x < lore.size(); x++) { for (int x = 0; x < lore.size(); x++) {
if (lore.get(x).contains(fishCaughtLore)) { if (lore.get(x).contains(fishCaughtLore)) {
hasLore = true; hasLore = true;
lore.set(x, fishCaughtLoreRaw.replace("{fish}", Integer.toString(fishCaught))); lore.set(x, fishCaughtLoreRaw.replace("{fish}", toolStats.commaFormat.format(fishCaught)));
break; break;
} }
} }
// if the item has lore but doesn't have the tag, add it // if the item has lore but doesn't have the tag, add it
if (!hasLore) { if (!hasLore) {
lore.add(fishCaughtLoreRaw.replace("{fish}", Integer.toString(fishCaught))); lore.add(fishCaughtLoreRaw.replace("{fish}", toolStats.commaFormat.format(fishCaught)));
} }
} else { } else {
// if the item has no lore, create a new list and add the string // if the item has no lore, create a new list and add the string
lore = new ArrayList<>(); lore = new ArrayList<>();
lore.add(fishCaughtLoreRaw.replace("{fish}", Integer.toString(fishCaught))); lore.add(fishCaughtLoreRaw.replace("{fish}", toolStats.commaFormat.format(fishCaught)));
} }
if (toolStats.config.getBoolean("enabled.fish-caught")) { if (toolStats.config.getBoolean("enabled.fish-caught")) {
meta.setLore(lore); meta.setLore(lore);
@@ -135,8 +133,9 @@ public class PlayerFish implements Listener {
/** /**
* Adds "caught by" tags to newly fished items. * Adds "caught by" tags to newly fished items.
*
* @param itemStack The item to add lore to. * @param itemStack The item to add lore to.
* @param owner The player who caught the item. * @param owner The player who caught the item.
*/ */
private void addNewLore(ItemStack itemStack, Player owner) { private void addNewLore(ItemStack itemStack, Player owner) {
ItemMeta meta = itemStack.getItemMeta(); ItemMeta meta = itemStack.getItemMeta();
@@ -170,7 +169,7 @@ public class PlayerFish implements Listener {
lore = new ArrayList<>(); lore = new ArrayList<>();
} }
if (toolStats.checkConfig(itemStack, "fished-tag")) { if (toolStats.checkConfig(itemStack, "fished-tag")) {
lore.add(caughtOnLoreRaw.replace("{date}", format.format(finalDate))); lore.add(caughtOnLoreRaw.replace("{date}", toolStats.dateFormat.format(finalDate)));
lore.add(caughtByLoreRaw.replace("{player}", owner.getName())); lore.add(caughtByLoreRaw.replace("{player}", owner.getName()));
} }
meta.setLore(lore); meta.setLore(lore);

View File

@@ -0,0 +1,84 @@
/*
* This file is part of ToolStats.
*
* ToolStats is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ToolStats is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ToolStats. If not, see <https://www.gnu.org/licenses/>.
*/
package lol.hyper.toolstats.events;
import lol.hyper.toolstats.ToolStats;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.minecart.StorageMinecart;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import java.util.HashMap;
public class PlayerInteract implements Listener {
private final ToolStats toolStats;
public final HashMap<Block, Player> openedChests = new HashMap<>();
public final HashMap<StorageMinecart, Player> openedMineCarts = new HashMap<>();
public PlayerInteract(ToolStats toolStats) {
this.toolStats = toolStats;
}
@EventHandler
public void onInteract(PlayerInteractEvent event) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return;
}
Block block = event.getClickedBlock();
if (block == null) {
return;
}
Player player = event.getPlayer();
if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) {
return;
}
// store when a player opens a chest
if (block.getType() != Material.AIR && block.getType() == Material.CHEST) {
openedChests.put(block, player);
Bukkit.getScheduler().runTaskLater(toolStats, () -> openedChests.remove(block), 20);
}
}
@EventHandler
public void onInteract(PlayerInteractEntityEvent event) {
Entity clicked = event.getRightClicked();
Player player = event.getPlayer();
if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) {
return;
}
// store when a player opens a minecart
if (clicked.getType() == EntityType.MINECART_CHEST) {
StorageMinecart storageMinecart = (StorageMinecart) clicked;
openedMineCarts.put(storageMinecart, player);
Bukkit.getScheduler().runTaskLater(toolStats, () -> openedMineCarts.remove(storageMinecart), 20);
}
}
}

View File

@@ -18,6 +18,7 @@
package lol.hyper.toolstats.events; package lol.hyper.toolstats.events;
import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.ToolStats;
import org.bukkit.GameMode;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -47,6 +48,9 @@ public class SheepShear implements Listener {
return; return;
} }
Player player = event.getPlayer(); Player player = event.getPlayer();
if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) {
return;
}
Entity entity = event.getRightClicked(); Entity entity = event.getRightClicked();
if (!(entity instanceof Sheep)) { if (!(entity instanceof Sheep)) {
return; return;
@@ -66,6 +70,7 @@ public class SheepShear implements Listener {
/** /**
* Adds tags to shears. * Adds tags to shears.
*
* @param itemStack The shears. * @param itemStack The shears.
*/ */
private void addLore(ItemStack itemStack) { private void addLore(ItemStack itemStack) {
@@ -103,18 +108,18 @@ public class SheepShear implements Listener {
for (int x = 0; x < lore.size(); x++) { for (int x = 0; x < lore.size(); x++) {
if (lore.get(x).contains(sheepShearedLore)) { if (lore.get(x).contains(sheepShearedLore)) {
hasLore = true; hasLore = true;
lore.set(x, sheepShearedLoreRaw.replace("{sheep}", Integer.toString(sheepSheared))); lore.set(x, sheepShearedLoreRaw.replace("{sheep}", toolStats.commaFormat.format(sheepSheared)));
break; break;
} }
} }
// if the item has lore but doesn't have the tag, add it // if the item has lore but doesn't have the tag, add it
if (!hasLore) { if (!hasLore) {
lore.add(sheepShearedLoreRaw.replace("{sheep}", Integer.toString(sheepSheared))); lore.add(sheepShearedLoreRaw.replace("{sheep}", toolStats.commaFormat.format(sheepSheared)));
} }
} else { } else {
// if the item has no lore, create a new list and add the string // if the item has no lore, create a new list and add the string
lore = new ArrayList<>(); lore = new ArrayList<>();
lore.add(sheepShearedLoreRaw.replace("{sheep}", Integer.toString(sheepSheared))); lore.add(sheepShearedLoreRaw.replace("{sheep}", toolStats.commaFormat.format(sheepSheared)));
} }
if (toolStats.config.getBoolean("enabled.sheep-sheared")) { if (toolStats.config.getBoolean("enabled.sheep-sheared")) {
meta.setLore(lore); meta.setLore(lore);

View File

@@ -18,9 +18,11 @@
package lol.hyper.toolstats.events; package lol.hyper.toolstats.events;
import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.ToolStats;
import lol.hyper.toolstats.UUIDDataType; import lol.hyper.toolstats.tools.ItemChecker;
import lol.hyper.toolstats.tools.UUIDDataType;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@@ -33,19 +35,13 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType; import org.bukkit.persistence.PersistentDataType;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale;
public class VillagerTrade implements Listener { public class VillagerTrade implements Listener {
private final ToolStats toolStats; private final ToolStats toolStats;
public final String[] validItems = {
"pickaxe", "sword", "shovel", "axe", "hoe", "bow", "helmet", "chestplate", "leggings", "boots", "fishing"
};
private final SimpleDateFormat format = new SimpleDateFormat("M/dd/yyyy", Locale.ENGLISH);
public VillagerTrade(ToolStats toolStats) { public VillagerTrade(ToolStats toolStats) {
this.toolStats = toolStats; this.toolStats = toolStats;
@@ -57,28 +53,32 @@ public class VillagerTrade implements Listener {
return; return;
} }
Inventory inventory = event.getClickedInventory(); Inventory inventory = event.getClickedInventory();
if (!(event.getWhoClicked() instanceof Player)) {
return;
}
Player player = (Player) event.getWhoClicked();
if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) {
return;
}
// only check villager inventories // only check villager inventories
if (inventory instanceof MerchantInventory) { if (inventory instanceof MerchantInventory) {
// only check the result slot (the item you receive) // only check the result slot (the item you receive)
if (event.getSlotType() == InventoryType.SlotType.RESULT) { if (event.getSlotType() == InventoryType.SlotType.RESULT) {
ItemStack item = event.getCurrentItem(); ItemStack item = event.getCurrentItem();
// only check items we want // only check items we want
for (String x : validItems) { if (ItemChecker.isValidItem(item.getType())) {
if (item.getType().toString().toLowerCase(Locale.ROOT).contains(x)) { // if the player shift clicks, show the warning
// if the player shift clicks show the warning if (event.isShiftClick()) {
if (event.isShiftClick()) { String configMessage = toolStats.config.getString("messages.shift-click-warning.trading");
String configMessage = toolStats.config.getString("messages.shift-click-warning.trading"); if (configMessage != null) {
if (configMessage != null) { event.getWhoClicked().sendMessage(ChatColor.translateAlternateColorCodes('&', configMessage));
event.getWhoClicked().sendMessage(ChatColor.translateAlternateColorCodes('&', configMessage));
}
}
ItemStack newItem = addLore(item, (Player) event.getWhoClicked());
if (newItem == null) {
return;
} }
}
ItemStack newItem = addLore(item, player);
if (newItem != null) {
// this gets delayed since villager inventories suck for no reason // this gets delayed since villager inventories suck for no reason
// if you don't delay this it doesn't work idk Bukkit.getScheduler().runTaskLater(toolStats, () -> event.setCurrentItem(newItem), 5);
Bukkit.getScheduler().runTaskLater(toolStats, ()-> event.setCurrentItem(newItem), 5); return;
} }
} }
} }
@@ -87,8 +87,9 @@ public class VillagerTrade implements Listener {
/** /**
* Adds "traded by" tags to item. * Adds "traded by" tags to item.
*
* @param itemStack The item to add lore. * @param itemStack The item to add lore.
* @param owner The player who traded. * @param owner The player who traded.
* @return The item with lore. * @return The item with lore.
*/ */
private ItemStack addLore(ItemStack itemStack, Player owner) { private ItemStack addLore(ItemStack itemStack, Player owner) {
@@ -123,7 +124,7 @@ public class VillagerTrade implements Listener {
lore = new ArrayList<>(); lore = new ArrayList<>();
} }
if (toolStats.checkConfig(itemStack, "traded-tag")) { if (toolStats.checkConfig(itemStack, "traded-tag")) {
lore.add(tradedOnLoreRaw.replace("{date}", format.format(finalDate))); lore.add(tradedOnLoreRaw.replace("{date}", toolStats.dateFormat.format(finalDate)));
lore.add(tradedByLoreRaw.replace("{player}", owner.getName())); lore.add(tradedByLoreRaw.replace("{player}", owner.getName()));
} }
meta.setLore(lore); meta.setLore(lore);

View File

@@ -0,0 +1,71 @@
/*
* This file is part of ToolStats.
*
* ToolStats is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ToolStats is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ToolStats. If not, see <https://www.gnu.org/licenses/>.
*/
package lol.hyper.toolstats.tools;
import org.bukkit.Material;
import java.util.Arrays;
import java.util.Locale;
public class ItemChecker {
private static final String[] validItems = { "pickaxe", "sword", "shovel", "axe", "hoe", "bow", "helmet", "chestplate", "leggings", "boots", "fishing" };
private static final String[] validArmor = { "helmet", "chestplate", "leggings", "boots" };
private static final String[] validMelee = {"sword", "trident", "axe"};
private static final String[] validMine = { "pickaxe", "axe", "hoe", "shovel", "shear" };
/**
* Check if item is an armor piece.
*
* @param itemType The item type, not name.
* @return If the item is an armor piece.
*/
public static boolean isArmor(Material itemType) {
return Arrays.stream(validArmor).anyMatch(type -> itemType.toString().toLowerCase(Locale.ROOT).contains(type));
}
/**
* Check if item is a tool or armor piece we want to track.
*
* @param itemType The item type, not name.
* @return If the item something we want to track.
*/
public static boolean isValidItem(Material itemType) {
return Arrays.stream(validItems).anyMatch(type -> itemType.toString().toLowerCase(Locale.ROOT).contains(type));
}
/**
* Check if item is a melee weapon.
*
* @param itemType The item type, not name.
* @return If the item is a melee weapon.
*/
public static boolean isMeleeWeapon(Material itemType) {
return Arrays.stream(validMelee).anyMatch(type -> itemType.toString().toLowerCase(Locale.ROOT).contains(type));
}
/**
* Check if item is a mining tool.
*
* @param itemType The item type, not name.
* @return If the item is a mining tool.
*/
public static boolean isMineTool(Material itemType) {
return Arrays.stream(validMine).anyMatch(type -> itemType.toString().toLowerCase(Locale.ROOT).contains(type));
}
}

View File

@@ -15,7 +15,24 @@
* along with ToolStats. If not, see <https://www.gnu.org/licenses/>. * along with ToolStats. If not, see <https://www.gnu.org/licenses/>.
*/ */
package lol.hyper.toolstats; /*
* This file is part of ToolStats.
*
* ToolStats is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ToolStats is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ToolStats. If not, see <https://www.gnu.org/licenses/>.
*/
package lol.hyper.toolstats.tools;
import org.bukkit.persistence.PersistentDataAdapterContext; import org.bukkit.persistence.PersistentDataAdapterContext;
import org.bukkit.persistence.PersistentDataType; import org.bukkit.persistence.PersistentDataType;