forked from Minecraft/QoL
Compare commits
16 Commits
mauberries
...
main
Author | SHA1 | Date |
---|---|---|
Mighty_Squid | b0b5a74b2a | |
Mighty_Squid | e7ae36c3bf | |
Mighty_Squid | 7780532ab6 | |
benamaurer | 0cfb7582bf | |
Joey Hines | 0c08c26854 | |
Joey Hines | f327f59d6c | |
Mighty_Squid | df292f88c5 | |
Joey Hines | fa2f79239e | |
Mighty_Squid | 2e72736571 | |
Joey Hines | 3c54c249a1 | |
Joey Hines | 3ae415d7d0 | |
Joey Hines | e3cf0d6d9f | |
Joey Hines | 3c3fdc1725 | |
Joey Hines | 9c316f9fff | |
Joey Hines | e91e5ae9e5 | |
Joey Hines | 684b269039 |
|
@ -0,0 +1,36 @@
|
|||
---
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: compliance
|
||||
|
||||
steps:
|
||||
- name: build
|
||||
image: maven:3-openjdk-16
|
||||
commands:
|
||||
- mvn install
|
||||
|
||||
---
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: release
|
||||
|
||||
trigger:
|
||||
branch:
|
||||
- main
|
||||
event:
|
||||
- push
|
||||
|
||||
steps:
|
||||
- name: build
|
||||
image: maven:3-openjdk-16
|
||||
commands:
|
||||
- mvn install
|
||||
- name: gitea-release
|
||||
pull: always
|
||||
image: jolheiser/drone-gitea-main:latest
|
||||
settings:
|
||||
token:
|
||||
from_secret: gitea_token
|
||||
base: https://git.canopymc.net
|
||||
files:
|
||||
- "target/QoL-*.jar"
|
44
pom.xml
44
pom.xml
|
@ -3,7 +3,7 @@
|
|||
<groupId>xyz.etztech</groupId>
|
||||
<artifactId>QoL</artifactId>
|
||||
<!-- Version is used in plugin.yml -->
|
||||
<version>1.10</version>
|
||||
<version>1.17</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<!-- Plugin Information -->
|
||||
|
@ -37,17 +37,13 @@
|
|||
<dependency>
|
||||
<groupId>xyz.etztech</groupId>
|
||||
<artifactId>plugin-api</artifactId>
|
||||
<version>1.0.8</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.ess3</groupId>
|
||||
<artifactId>EssentialsX</artifactId>
|
||||
<version>2.18.1</version>
|
||||
<version>1.0.7</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>us.dynmap</groupId>
|
||||
<artifactId>dynmap-api</artifactId>
|
||||
<version>1.9.4</version>
|
||||
<version>3.5</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-lang</groupId>
|
||||
|
@ -57,7 +53,19 @@
|
|||
<dependency>
|
||||
<groupId>com.discordsrv</groupId>
|
||||
<artifactId>discordsrv</artifactId>
|
||||
<version>1.19.1</version>
|
||||
<version>1.27.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>me.lucko</groupId>
|
||||
<artifactId>spark-api</artifactId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.nisovin.shopkeepers</groupId>
|
||||
<artifactId>ShopkeepersAPI</artifactId>
|
||||
<version>2.13.3</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
@ -72,16 +80,12 @@
|
|||
<url>https://nexus.scarsz.me/content/groups/public/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>etztech-repo</id>
|
||||
<url>http://repo.etztech.xyz</url>
|
||||
<id>birbmc-repo</id>
|
||||
<url>https://mvn.jojodev.com</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>dynmap-repo</id>
|
||||
<url>http://repo.mikeprimm.com/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>ess-repo</id>
|
||||
<url>https://ci.ender.zone/plugin/repository/everything/</url>
|
||||
<url>https://repo.mikeprimm.com/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>mvn-repo</id>
|
||||
|
@ -95,6 +99,14 @@
|
|||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>sonatype-snapshots</id>
|
||||
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>shopkeepers-repo</id>
|
||||
<url>https://repo.projectshard.dev/repository/releases/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<build>
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
package xyz.etztech.qol;
|
||||
|
||||
import net.ess3.api.IEssentials;
|
||||
import com.nisovin.shopkeepers.api.ShopkeepersPlugin;
|
||||
import github.scarsz.discordsrv.DiscordSRV;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.dynmap.DynmapAPI;
|
||||
import org.dynmap.markers.Marker;
|
||||
|
@ -15,7 +17,9 @@ import org.dynmap.markers.MarkerSet;
|
|||
import xyz.etztech.qol.commands.*;
|
||||
import xyz.etztech.qol.listeners.*;
|
||||
import xyz.etztech.qol.other.LinkCommand;
|
||||
import xyz.etztech.qol.other.Reminder;
|
||||
import xyz.etztech.qol.other.TPSRunnable;
|
||||
import me.lucko.spark.api.Spark;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
@ -28,7 +32,7 @@ public class QoL extends JavaPlugin {
|
|||
private String qolMarkerIcon = null;
|
||||
|
||||
private static QoL instance;
|
||||
private IEssentials essentials = null;
|
||||
private Spark spark = null;
|
||||
private DynmapAPI dynmap = null;
|
||||
private MarkerAPI markerAPI = null;
|
||||
private MarkerSet playerMarkerSet = null;
|
||||
|
@ -45,16 +49,19 @@ public class QoL extends JavaPlugin {
|
|||
private static List<String> audits = new ArrayList<>();
|
||||
private static List<LinkCommand> links = new ArrayList<>();
|
||||
|
||||
private Reminder reminder = null;
|
||||
|
||||
public void onEnable() {
|
||||
instance = this;
|
||||
saveDefaultConfig();
|
||||
reloadConfig();
|
||||
saveResource("qol.png", true);
|
||||
|
||||
//Essentials hook
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("Essentials")) {
|
||||
log("Hooked into Essentials for TPS alert.");
|
||||
essentials = (IEssentials) Bukkit.getPluginManager().getPlugin("Essentials");
|
||||
//Spark hook
|
||||
RegisteredServiceProvider<Spark> sparkProvider = Bukkit.getServicesManager().getRegistration(Spark.class);
|
||||
if (sparkProvider != null) {
|
||||
log("Hooked into Spark for TPS alert.");
|
||||
spark = sparkProvider.getProvider();
|
||||
}
|
||||
|
||||
//Dynmap hook
|
||||
|
@ -84,10 +91,17 @@ public class QoL extends JavaPlugin {
|
|||
}
|
||||
}
|
||||
|
||||
// DiscordSRV Hook
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("DiscordSRV")) {
|
||||
new DiscordSRVListener(this);
|
||||
}
|
||||
|
||||
// Shopkeepers Hook
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("Shopkeepers")) {
|
||||
new HeadShopListener(this);
|
||||
log("Hooked in Shopkeepers for the head shop");
|
||||
}
|
||||
|
||||
if( isEnabled() ) {
|
||||
|
||||
// Add listeners
|
||||
|
@ -98,6 +112,7 @@ public class QoL extends JavaPlugin {
|
|||
new BlockIgniteListener(this);
|
||||
new CommandPreprocessListener(this);
|
||||
new DeathListener(this);
|
||||
new EntityChangeBlockListener(this);
|
||||
|
||||
// Add commands
|
||||
new MainCommand(this);
|
||||
|
@ -114,6 +129,12 @@ public class QoL extends JavaPlugin {
|
|||
new DeathMuteCommand(this);
|
||||
new CheckupCommand(this);
|
||||
new DynmapLinkCommand(this);
|
||||
new WikiCommand(this);
|
||||
new MoonCommand(this);
|
||||
|
||||
if (DiscordSRV.api.isAnyHooked()) {
|
||||
new DiscordIgnoreCommand(this);
|
||||
}
|
||||
|
||||
if (dynmap != null) {
|
||||
new MarkerCommand(this);
|
||||
|
@ -136,25 +157,17 @@ public class QoL extends JavaPlugin {
|
|||
}, 0, EtzTechUtil.minutesToTicks(schedule));
|
||||
}
|
||||
|
||||
// Reminders
|
||||
int frequency = config.getInt("reminders.frequency");
|
||||
if (frequency > 0) {
|
||||
if (reminder != null && reminder.getFrequency() != 0) {
|
||||
Bukkit.getScheduler().scheduleSyncRepeatingTask(QoL.getInstance(), new Runnable() {
|
||||
int idx = 0;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
List<String> reminders = config.getStringList("reminders.messages");
|
||||
ChatColor color = ChatColor.getByChar(config.getString("reminders.color").replace("&", ""));
|
||||
if (idx >= reminders.size()) {
|
||||
idx = 0;
|
||||
}
|
||||
BaseComponent [] msg = reminder.nextReminder();
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
EtzTechUtil.sms(player, color + reminders.get(idx));
|
||||
player.spigot().sendMessage(msg);
|
||||
}
|
||||
idx++;
|
||||
Bukkit.getConsoleSender().spigot().sendMessage(msg);
|
||||
}
|
||||
}, 0, EtzTechUtil.minutesToTicks(frequency));
|
||||
}, 0, EtzTechUtil.minutesToTicks(reminder.getFrequency()));
|
||||
}
|
||||
|
||||
// TPS Check
|
||||
|
@ -186,6 +199,8 @@ public class QoL extends JavaPlugin {
|
|||
qolMarkerIcon = config.getString("dynmap.marker_icon", "blueflag");
|
||||
qolMarkerLayerShow = config.getBoolean("dynmap.marker_set_show", false);
|
||||
qolMarkerSetLabel = config.getString("dynmap.marker_set_label", "QoL Markers");
|
||||
|
||||
reminder = Reminder.fromConfig(config.getConfigurationSection("reminders"));
|
||||
}
|
||||
|
||||
|
||||
|
@ -282,8 +297,6 @@ public class QoL extends JavaPlugin {
|
|||
return links;
|
||||
}
|
||||
|
||||
public IEssentials getEssentials() { return essentials; }
|
||||
|
||||
public DynmapAPI getDynmap() { return dynmap; }
|
||||
|
||||
public void runTask(final String command) {
|
||||
|
@ -336,5 +349,9 @@ public class QoL extends JavaPlugin {
|
|||
return marker;
|
||||
}
|
||||
}
|
||||
|
||||
public Spark getSpark() {
|
||||
return spark;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
package xyz.etztech.qol.commands;
|
||||
|
||||
import github.scarsz.discordsrv.DiscordSRV;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.metadata.FixedMetadataValue;
|
||||
import xyz.etztech.qol.EtzTechUtil;
|
||||
import xyz.etztech.qol.Lang;
|
||||
import xyz.etztech.qol.QoL;
|
||||
|
||||
public class DiscordIgnoreCommand implements CommandExecutor {
|
||||
public static final String DISCORD_IGNORE_METADATA = "qol.discord_ignore";
|
||||
QoL plugin;
|
||||
|
||||
public DiscordIgnoreCommand(QoL plugin) {
|
||||
this.plugin = plugin;
|
||||
plugin.getCommand("discordignore").setExecutor(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender commandSender, Command command, String s, String[] args) {
|
||||
if (!( commandSender instanceof Player)) {
|
||||
EtzTechUtil.sms(commandSender, Lang.NO_CONSOLE.getDef());
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!commandSender.hasPermission("qol.discordignore")) {
|
||||
EtzTechUtil.sms(commandSender, Lang.NO_PERMISSION.getDef());
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!DiscordSRV.api.isAnyHooked()) {
|
||||
EtzTechUtil.sms(commandSender, "Command not enabled!");
|
||||
return true;
|
||||
}
|
||||
|
||||
Player player = (Player) commandSender;
|
||||
|
||||
boolean ignoreState = player.hasMetadata(DISCORD_IGNORE_METADATA);
|
||||
String msg;
|
||||
if (ignoreState) {
|
||||
player.removeMetadata(DISCORD_IGNORE_METADATA, plugin);
|
||||
msg = "Discord messages will now appear.";
|
||||
}
|
||||
else {
|
||||
player.setMetadata(DISCORD_IGNORE_METADATA, new FixedMetadataValue(plugin, DISCORD_IGNORE_METADATA));
|
||||
msg = "Ignoring Discord messages.";
|
||||
}
|
||||
|
||||
EtzTechUtil.sms(commandSender, org.bukkit.ChatColor.GREEN + msg);
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
package xyz.etztech.qol.commands;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import xyz.etztech.qol.QoL;
|
||||
import xyz.etztech.qol.EtzTechUtil;
|
||||
import xyz.etztech.qol.Lang;
|
||||
|
||||
import java.util.Map;
|
||||
import java.lang.*;
|
||||
|
||||
public class MoonCommand implements CommandExecutor {
|
||||
QoL plugin;
|
||||
|
||||
private final Map<Integer, String> moonPhases = Map.of(
|
||||
0, "Full moon",
|
||||
1, "Waning gibbous",
|
||||
2, "Third quarter",
|
||||
3, "Waning crescent",
|
||||
4, "New moon",
|
||||
5, "Waxing crescent",
|
||||
6, "First quarter",
|
||||
7, "Waxing gibbous"
|
||||
);
|
||||
|
||||
public MoonCommand(QoL paramQoL) {
|
||||
this.plugin = paramQoL;
|
||||
plugin.getCommand("moon").setExecutor(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender commandSender, Command command, String s, String[] args) {
|
||||
if (!commandSender.hasPermission("qol.moon")) {
|
||||
EtzTechUtil.sms(commandSender, Lang.NO_PERMISSION.getDef());
|
||||
return true;
|
||||
}
|
||||
|
||||
String playername = commandSender.getName();
|
||||
long time = commandSender.getServer().getPlayer(playername).getWorld().getFullTime();
|
||||
double day = Math.floor(time / 24000);
|
||||
int moonPhase = (int)(day % 8);
|
||||
|
||||
StringBuilder message = new StringBuilder(ChatColor.GOLD + "===== Moon Phase Utility =====");
|
||||
message.append("\n" + ChatColor.GREEN + "Current moon phase: " + moonPhases.get(moonPhase) + ".");
|
||||
message.append("\n" + ChatColor.GREEN + "Full moon is " + (moonPhase == 0 ? "tonight." : "in " + (8 - moonPhase) + ((moonPhase == 7) ? " day." : " days.")));
|
||||
EtzTechUtil.sms(commandSender, message.toString());
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
package xyz.etztech.qol.commands;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonParser;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.TabExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import xyz.etztech.qol.QoL;
|
||||
import xyz.etztech.qol.EtzTechUtil;
|
||||
import xyz.etztech.qol.Lang;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class WikiCommand implements TabExecutor {
|
||||
QoL plugin;
|
||||
|
||||
public WikiCommand(QoL paramQoL) {
|
||||
this.plugin = paramQoL;
|
||||
plugin.getCommand("wiki").setExecutor(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender commandSender, Command command, String label, String[] args) {
|
||||
if (!commandSender.hasPermission("qol.wiki")) {
|
||||
EtzTechUtil.sms(commandSender, Lang.NO_PERMISSION.getDef());
|
||||
return true;
|
||||
}
|
||||
if (args.length < 1) {
|
||||
EtzTechUtil.sms(commandSender, ChatColor.RED + "Please give a search argument.");
|
||||
return true;
|
||||
}
|
||||
|
||||
String query = String.join(" ", args);
|
||||
List<List<String>> result = getWikiResults(query, 1);
|
||||
|
||||
if (result.isEmpty())
|
||||
{
|
||||
EtzTechUtil.sms(commandSender, ChatColor.RED + String.format("Nothing was found on the wiki using: %s", query));
|
||||
return true;
|
||||
}
|
||||
|
||||
String message = ChatColor.GREEN + result.get(0).get(0) + ": " + ChatColor.WHITE + result.get(0).get(1);
|
||||
EtzTechUtil.sms(commandSender, message);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender commandSender, Command command, String label, String[] args) {
|
||||
String query = String.join(" ", args);
|
||||
|
||||
if (query.isEmpty()) return null;
|
||||
|
||||
List<List<String>> results = getWikiResults(query, 10);
|
||||
|
||||
if (results.isEmpty()) return null;
|
||||
|
||||
List<String> completions = new ArrayList<>();
|
||||
results.forEach((result) -> completions.add(result.get(0)));
|
||||
return completions;
|
||||
}
|
||||
|
||||
private List<List<String>> getWikiResults(String query, Integer numOfResults) {
|
||||
try {
|
||||
InputStream response = new URL(String.format(plugin.getConfig().getString("wiki-base-url", "https://minecraft.wiki:") + "/api.php?action=opensearch&format=json&formatversion=2&search=%s&namespace=0&limit=%d", query, numOfResults)).openStream();
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(response));
|
||||
JsonArray jsonArray = new JsonParser().parse(reader.readLine()).getAsJsonArray();
|
||||
|
||||
JsonArray names = jsonArray.get(1).getAsJsonArray();
|
||||
JsonArray links = jsonArray.get(3).getAsJsonArray();
|
||||
|
||||
// Check if we got any result
|
||||
if (names.size() < 1)
|
||||
return Collections.emptyList();
|
||||
|
||||
List<List<String>> results = new ArrayList<>();
|
||||
for (int i = 0; i < names.size(); i++)
|
||||
{
|
||||
List<String> e = new ArrayList<>();
|
||||
e.add(names.get(i).getAsString());
|
||||
e.add(links.get(i).getAsString());
|
||||
results.add(e);
|
||||
}
|
||||
|
||||
return results;
|
||||
} catch(Exception e) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -6,8 +6,6 @@ import org.bukkit.event.EventHandler;
|
|||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
import org.bukkit.advancement.Advancement;
|
||||
import org.bukkit.Namespacedkey;
|
||||
import xyz.etztech.qol.QoL;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
@ -50,16 +48,6 @@ public class AsyncPlayerChatListener implements Listener {
|
|||
String chat = event.getMessage();
|
||||
boolean escape = false;
|
||||
|
||||
//Checking if player has been awarded the chat advancement, if not, message is searched for triggers
|
||||
Advancement adv = Bukkit.getAdvancement(new Namespacedkey("canopy", "chat_advancement"));
|
||||
|
||||
if (!player.getAdvancementProgress(adv).isDone()) {
|
||||
List<String> advancementTriggerList = plugin.getConfig().getStringList("chat-advancement-triggers");
|
||||
if (advancementTriggerList.stream().anyMatch(t -> chat.toLowerCase().contains(t.toLowerCase()))) {
|
||||
player.getAdvancementProgress(adv).awardCriteria("win");
|
||||
}
|
||||
}
|
||||
|
||||
// Escape
|
||||
if (chat.startsWith("\\")) {
|
||||
escape = true;
|
||||
|
|
|
@ -1,9 +1,15 @@
|
|||
package xyz.etztech.qol.listeners;
|
||||
|
||||
import github.scarsz.discordsrv.DiscordSRV;
|
||||
import github.scarsz.discordsrv.api.events.DiscordGuildMessagePreBroadcastEvent;
|
||||
import github.scarsz.discordsrv.api.events.GameChatMessagePreProcessEvent;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import xyz.etztech.qol.EtzTechUtil;
|
||||
import xyz.etztech.qol.Lang;
|
||||
import xyz.etztech.qol.QoL;
|
||||
import github.scarsz.discordsrv.api.Subscribe;
|
||||
import xyz.etztech.qol.commands.DiscordIgnoreCommand;
|
||||
|
||||
public class DiscordSRVListener {
|
||||
private final QoL plugin;
|
||||
|
@ -20,4 +26,18 @@ public class DiscordSRVListener {
|
|||
}
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void discordGuildMessagePreBroadcastEvent(DiscordGuildMessagePreBroadcastEvent event) {
|
||||
event.getRecipients().removeIf(recipient -> {
|
||||
if (recipient instanceof Player) {
|
||||
Player player = (Player) recipient;
|
||||
|
||||
return player.hasMetadata(DiscordIgnoreCommand.DISCORD_IGNORE_METADATA);
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
package xyz.etztech.qol.listeners;
|
||||
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntityChangeBlockEvent;
|
||||
import xyz.etztech.qol.QoL;
|
||||
|
||||
public class EntityChangeBlockListener implements Listener {
|
||||
QoL plugin;
|
||||
|
||||
public EntityChangeBlockListener(QoL plugin) {
|
||||
this.plugin = plugin;
|
||||
plugin.getServer().getPluginManager().registerEvents(this, plugin);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onEntityChangeBlock(EntityChangeBlockEvent e) {
|
||||
if (e.getEntity().getType() == EntityType.ENDERMAN) {
|
||||
if(plugin.getConfig().getBoolean("disable-mob-grief.enderman", false)){
|
||||
e.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
package xyz.etztech.qol.listeners;
|
||||
|
||||
import com.nisovin.shopkeepers.api.ShopkeepersPlugin;
|
||||
import com.nisovin.shopkeepers.api.shopkeeper.ShopkeeperRegistry;
|
||||
import com.nisovin.shopkeepers.api.shopkeeper.admin.regular.RegularAdminShopkeeper;
|
||||
import com.nisovin.shopkeepers.api.shopkeeper.offers.TradeOffer;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
import xyz.etztech.qol.QoL;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class HeadShopListener implements Listener{
|
||||
|
||||
private final QoL plugin;
|
||||
private final ShopkeepersPlugin shopkeepersAPI;
|
||||
|
||||
public HeadShopListener(QoL plugin) {
|
||||
this.plugin = plugin;
|
||||
plugin.getServer().getPluginManager().registerEvents(this, plugin);
|
||||
|
||||
this.shopkeepersAPI = ShopkeepersPlugin.getInstance();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onJoin(PlayerJoinEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
if (shopkeepersAPI != null && player.hasPermission("qol.head_shop")) {
|
||||
int shopKeeperID = plugin.getConfig().getInt("head_shop.id", -1);
|
||||
|
||||
if (shopKeeperID != -1) {
|
||||
ShopkeeperRegistry shopkeeperRegistry = shopkeepersAPI.getShopkeeperRegistry();
|
||||
RegularAdminShopkeeper donorHeadShop = (RegularAdminShopkeeper) shopkeeperRegistry.getShopkeeperById(shopKeeperID);
|
||||
|
||||
if (donorHeadShop != null) {
|
||||
// Remove the head if it already exists. This is done to refresh the skin of the head.
|
||||
List<? extends TradeOffer> tradeOffers = new ArrayList<>(donorHeadShop.getOffers());
|
||||
tradeOffers.removeIf(tradeOffer -> {
|
||||
SkullMeta itemOfferMeta = (SkullMeta)tradeOffer.getResultItem().getItemMeta();
|
||||
return itemOfferMeta.getOwningPlayer().getUniqueId() == player.getUniqueId();
|
||||
});
|
||||
|
||||
donorHeadShop.setOffers(tradeOffers);
|
||||
|
||||
// Add the head to the shop
|
||||
int diamondPrice = plugin.getConfig().getInt("head_shop.price", 2);
|
||||
ItemStack playerHead = new ItemStack(Material.PLAYER_HEAD);
|
||||
SkullMeta skullMeta = (SkullMeta) playerHead.getItemMeta();
|
||||
|
||||
skullMeta.setOwningPlayer(player);
|
||||
skullMeta.setDisplayName(player.getDisplayName());
|
||||
playerHead.setItemMeta(skullMeta);
|
||||
|
||||
TradeOffer donorHeadTrade = TradeOffer.create(playerHead, new ItemStack(Material.DIAMOND, diamondPrice), null);
|
||||
|
||||
donorHeadShop.addOffer(donorHeadTrade);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -2,13 +2,10 @@ package xyz.etztech.qol.listeners;
|
|||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
import org.dynmap.markers.Marker;
|
||||
import xyz.etztech.qol.QoL;
|
||||
import xyz.etztech.qol.commands.CheckupCommand;
|
||||
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
package xyz.etztech.qol.other;
|
||||
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.api.chat.ComponentBuilder;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class Reminder {
|
||||
private final int frequency;
|
||||
private final List<ReminderList> reminderLists;
|
||||
|
||||
public Reminder(int frequency, List<ReminderList> reminderLists) {
|
||||
this.frequency = frequency;
|
||||
this.reminderLists = reminderLists;
|
||||
Collections.sort(reminderLists);
|
||||
}
|
||||
|
||||
public static Reminder fromConfig(ConfigurationSection config) {
|
||||
int frequency = config.getInt("frequency");
|
||||
List<ReminderList> reminderLists = new ArrayList();
|
||||
ConfigurationSection reminderGroups = config.getConfigurationSection("reminder_groups");
|
||||
|
||||
for (String groupName: reminderGroups.getKeys(false)) {
|
||||
ConfigurationSection group = reminderGroups.getConfigurationSection(groupName);
|
||||
|
||||
int period = group.getInt("period", 0);
|
||||
ChatColor color = ChatColor.of(group.getString("color", "#3273DC"));
|
||||
List<String> reminders = group.getStringList("reminders");
|
||||
|
||||
reminderLists.add(new ReminderList(reminders, period, color));
|
||||
}
|
||||
|
||||
return new Reminder(frequency, reminderLists);
|
||||
}
|
||||
|
||||
public BaseComponent[] nextReminder() {
|
||||
BaseComponent[] msg = null;
|
||||
boolean reminderFound = false;
|
||||
for (ReminderList reminderList: reminderLists) {
|
||||
if (!reminderFound && reminderList.isReady()) {
|
||||
msg = new ComponentBuilder().
|
||||
color(reminderList.getColor())
|
||||
.append(reminderList.nextReminder())
|
||||
.create();
|
||||
|
||||
reminderFound = true;
|
||||
|
||||
}
|
||||
|
||||
reminderList.incCount();
|
||||
}
|
||||
|
||||
return msg;
|
||||
}
|
||||
|
||||
public int getFrequency() {
|
||||
return frequency;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
package xyz.etztech.qol.other;
|
||||
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class ReminderList implements Comparable<ReminderList>{
|
||||
private final List<String> reminders;
|
||||
private final int period;
|
||||
private final ChatColor color;
|
||||
private int ndx;
|
||||
private int count;
|
||||
|
||||
public ReminderList(List<String> reminders, int period, ChatColor color) {
|
||||
this.reminders = reminders;
|
||||
this.period = period;
|
||||
this.color = color;
|
||||
this.ndx = 0;
|
||||
this.count = 0;
|
||||
}
|
||||
|
||||
public void incCount() {
|
||||
count = (count + 1) % (period + 1);
|
||||
}
|
||||
|
||||
public boolean isReady() {
|
||||
return count == period;
|
||||
}
|
||||
|
||||
public String nextReminder() {
|
||||
String nextReminder = reminders.get(ndx);
|
||||
ndx = (ndx + 1) % reminders.size();
|
||||
|
||||
return nextReminder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(@NotNull ReminderList o) {
|
||||
return Integer.compare(o.period, this.period);
|
||||
}
|
||||
|
||||
public ChatColor getColor() {
|
||||
return color;
|
||||
}
|
||||
}
|
|
@ -1,9 +1,11 @@
|
|||
package xyz.etztech.qol.other;
|
||||
|
||||
import net.ess3.api.IEssentials;
|
||||
import me.lucko.spark.api.statistic.StatisticWindow;
|
||||
import me.lucko.spark.api.statistic.types.DoubleStatistic;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import xyz.etztech.core.web.Http;
|
||||
import xyz.etztech.qol.QoL;
|
||||
import me.lucko.spark.api.Spark;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
@ -18,13 +20,13 @@ public class TPSRunnable implements Runnable {
|
|||
|
||||
@Override
|
||||
public void run() {
|
||||
IEssentials essentials = plugin.getEssentials();
|
||||
if (essentials != null) {
|
||||
double tps = essentials.getTimer().getAverageTPS();
|
||||
Spark spark = plugin.getSpark();
|
||||
if (spark != null) {
|
||||
DoubleStatistic<StatisticWindow.TicksPerSecond> tps = spark.tps();
|
||||
int threshold = plugin.getConfig().getInt("tps.threshold", 0);
|
||||
String webhook = plugin.getConfig().getString("tps.webhook", "");
|
||||
String message = "@here TPS has fallen below " + threshold + "!";
|
||||
if (tps < threshold) {
|
||||
if (tps.poll(StatisticWindow.TicksPerSecond.SECONDS_10) < threshold) {
|
||||
plugin.log(message);
|
||||
if (StringUtils.isNotEmpty(webhook)) {
|
||||
Map<String, String> data = new HashMap<>();
|
||||
|
|
|
@ -60,10 +60,19 @@ schedule:
|
|||
|
||||
# To disable, set minutes to 0
|
||||
reminders:
|
||||
frequency: 5 # In minutes
|
||||
color: '&a'
|
||||
messages:
|
||||
- 'Check out the Discord!'
|
||||
frequency: 1 # In minutes
|
||||
reminder_groups:
|
||||
standard:
|
||||
color: '#3273DC'
|
||||
reminders:
|
||||
- '1st Standard Reminder'
|
||||
- '2nd Standard Reminder'
|
||||
event:
|
||||
color: '#3273DC'
|
||||
period: 2
|
||||
reminders:
|
||||
- '1st Event Reminder'
|
||||
- '2nd Event Reminder'
|
||||
|
||||
# A list of links for link command aliases, separated by a comma between name and URL
|
||||
links:
|
||||
|
@ -84,6 +93,9 @@ disable-fire:
|
|||
ender_crystal: false
|
||||
explosion: false
|
||||
|
||||
disable-mob-grief:
|
||||
enderman: false
|
||||
|
||||
# A list of commands to confirm before using if the user isn't in spectator mode
|
||||
spec-confirm:
|
||||
- "tp"
|
||||
|
@ -105,6 +117,12 @@ dynmap:
|
|||
map: "surface"
|
||||
zoom: 5
|
||||
|
||||
# A list of words/phrases which will award the chant advancement to the message author
|
||||
chat-advancement-triggers:
|
||||
- chat_advancment_test
|
||||
# Shopkeepers Player Head Shop
|
||||
head_shop:
|
||||
# Shopkeeper Shop ID, set to -1 to disable
|
||||
id: -1
|
||||
# Diamond price of a head in the shop, default is 2 diamonds
|
||||
price: 2
|
||||
|
||||
# Base URL for the /wiki command. Should support a https://www.mediawiki.org/wiki/API:Opensearch request
|
||||
wiki-base-url: 'https://minecraft.wiki'
|
||||
|
|
|
@ -4,13 +4,14 @@ description: ${description}
|
|||
author: ${author}
|
||||
website: ${url}
|
||||
main: ${mainClass}
|
||||
softdepend: [Essentials, dynmap, DiscordSRV]
|
||||
softdepend: [spark, dynmap, DiscordSRV, Shopkeepers]
|
||||
api-version: 1.13
|
||||
commands:
|
||||
qol:
|
||||
description: Base command
|
||||
colors:
|
||||
description: See all color/formatting codes
|
||||
aliases: [color, c]
|
||||
aliases: [color, c, colour, colours]
|
||||
list:
|
||||
description: See a list of players
|
||||
aliases: [players, playerlist]
|
||||
|
@ -46,6 +47,13 @@ commands:
|
|||
marker:
|
||||
description: Dynmap marker command
|
||||
aliases: [mark]
|
||||
wiki:
|
||||
description: Search the Minecraft wiki
|
||||
moon:
|
||||
description: Get information about the current moon phase
|
||||
discordignore:
|
||||
description: Mute chat messages coming from Discord
|
||||
aliases: [dignore]
|
||||
permissions:
|
||||
qol.admin:
|
||||
description: Ability to reload the plugin
|
||||
|
@ -116,3 +124,15 @@ permissions:
|
|||
default: op
|
||||
children:
|
||||
qol.marker.limit: true
|
||||
qol.wiki:
|
||||
description: Ability to use the wiki command
|
||||
default: op
|
||||
qol.moon:
|
||||
description: Ability to use the moon command
|
||||
default: op
|
||||
qol.discordignore:
|
||||
description: Ability to use the use the discordignore command
|
||||
default: op
|
||||
qol.head_shop:
|
||||
description: Controls if a player's head should be added to the head shop
|
||||
default: op
|
||||
|
|
Loading…
Reference in New Issue