Compare commits

..

38 Commits

Author SHA1 Message Date
a33a39af19 Retired support for 2021.02 fully. (#72) 2021-06-07 16:16:10 +01:00
e1e8f1b3b5 Merge branch 'main' into RELEASE-2021.05 2021-06-06 11:37:44 +01:00
86a8e21d06 TotalFreedomMod May Update 2021-06-06 14:06:01 +10:00
4e577f97fa Enable downward Sync from main (#60)
We want to make sure anything on the main branch which is commited makes it's way down to the dev and other branches.
2021-05-28 15:22:07 +01:00
da37ca52fa Bump version 2021-05-27 11:35:11 +10:00
8c7bf365a0 Addresses FS-224 (#70) 2021-05-26 19:55:49 +10:00
eedb7a5375 Use long instead of int and use offset to check time (FS-181) (#69)
* Use long instead of int and use offset to check time (FS-181)

* Remove star import
2021-05-25 21:45:53 +10:00
d047cfc8ff Calculate the player count without offline players (FS-247) (#68)
Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
2021-05-22 15:40:55 +01:00
9ff5da8d8f Small modification to new TFGuilds (FS-255) (#67) 2021-05-22 15:06:34 +01:00
ac615f54f7 Add //g to blocked commands (#62)
Co-authored-by: Nathan Curran <30569566+Focusvity@users.noreply.github.com>
2021-05-21 22:44:51 +01:00
21af722e23 Name change for Fleek (#64) 2021-05-17 20:31:34 +10:00
b1196fcf00 Added new dependency to allow TFM to compile (#65) 2021-05-17 06:50:09 +01:00
d170f6d323 Switched from -c to -ci (#63)
Resolves FS-219
2021-05-16 15:27:12 +01:00
9dd0298f56 Bug fixes, improvements, and removals (FS-192) (#46)
* Three fixes

* Fixes /tempban throwing a NullPointerException when trying to get a player who isn't on the server but was in the past
* Fixes /tempban banning players for 24 hours regardless of the duration defined
* Fixes /list -t throwing a NullPointerException when performed from a non-player source (such as Telnet)

* Removes hubworld entriely

* Configurable blacklists for tag, muted commands, and wildcard

Changes:
* Moves globally blocked commands to the `global` subsection of the original `blocked_commands` section. You *will* need to update your configurations
* /wildcard's command blacklist is now configurable under the `wildcard` section in `blocked_commands`.
* The commands muted players can't use are now configurable under the `muted` section in `blocked_commands`.
* Removes some commented-out globally blocked command entries.

Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
2021-05-09 16:42:31 +01:00
bdf4ca84e0 Why overcomplicating things is a horrifically bad idea (#55)
The longer I look into this plugin's code, the angrier I will become.

This fixes 2 bugs in the /potion command:
- Fixes non-admins being able to clear other players
- Fixes NPE caused when trying to add potion effects to players who are not on the server as a non-admin.

Both of these issues are caused by overcomplicating seemingly simple solutions, hence the name of this commit.

Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
Co-authored-by: Nathan Curran <30569566+Focusvity@users.noreply.github.com>
2021-05-04 13:31:55 +01:00
caaa067096 Update Security Matrix (#59)
* Update Security Matrix

Updating the full security matrix.

* Yay for consistency

* I hate Markdown / Markup / Whatever the fuck this is.
2021-05-04 13:30:17 +01:00
7258d7f1bf Merge pull request #58 from AtlasMediaGroup/FS-221
Remove a number of wipe commands we don't want anyway
2021-05-04 12:59:31 +01:00
8a504bff07 Merge branch 'development' into FS-221 2021-05-03 22:15:20 -06:00
c00e64f736 Merge pull request #54 from VideoGameSmash12/FS-137
Assistant executive discord integration (FS-137)
2021-05-03 20:14:35 +01:00
9e73db0f24 Merge branch 'development' into FS-137 2021-05-03 19:46:59 +01:00
951c061d77 Merge pull request #57 from AtlasMediaGroup/Elmon11-patch-2
grammar fix
2021-05-03 19:46:37 +01:00
579d3e0719 Merge branch 'development' into Elmon11-patch-2 2021-05-03 19:13:39 +01:00
9777733d04 Merge pull request #53 from VideoGameSmash12/ride-typo
Fixes typo in /ride
2021-05-03 19:13:26 +01:00
05e118dcb4 Merge branch 'development' into ride-typo 2021-05-03 18:21:16 +01:00
7a0d6f49f4 Merge pull request #52 from VideoGameSmash12/FS-156
Fixes typo in the Lightning Rod's name (FS-156)
2021-05-03 18:20:20 +01:00
19f1b7f6bd Merge branch 'development' into Elmon11-patch-2 2021-05-03 15:45:54 +01:00
b12afbdc1f Merge branch 'development' into FS-137 2021-05-03 15:45:45 +01:00
49e77d4f93 Merge branch 'development' into ride-typo 2021-05-03 15:45:36 +01:00
eb9107bedf Merge branch 'development' into FS-156 2021-05-03 15:45:25 +01:00
951c699ed0 Remove a number of wipe commands we don't want anyway
We shouldn't be wiping any of this data within the server now anyway so let's not tempt fate again.
2021-05-03 15:44:05 +01:00
9e676143b8 2021.04 Release
Formal Release for 2021.04
2021-05-03 15:19:42 +01:00
6895e46375 Merge branch 'development' into ride-typo 2021-05-02 14:15:15 +02:00
c8b20bc255 RC2 Release 2021-05-02 13:12:37 +01:00
1cf46c7337 grammar fix 2021-05-02 14:03:48 +02:00
f240a15af3 Force the count to be zero if the value is negative (FS-216) (#56) 2021-05-01 23:58:03 +10:00
407b63e48b Fixes FS-137 2021-04-26 01:23:24 -06:00
be562fe722 ok, done (FS-156) 2021-04-26 00:58:28 -06:00
928ab41d7f Update Command_ride.java 2021-04-26 00:37:16 -06:00
35 changed files with 471 additions and 890 deletions

43
.github/workflows/downstream.yml vendored Normal file
View File

@ -0,0 +1,43 @@
# This is a basic workflow to help you get started with Actions
name: Downstream Branch Updates
on:
schedule:
- cron: '20 7 * * *'
# scheduled at 07:00 every Monday and Thursday
workflow_dispatch: # click the button on Github repo!
jobs:
sync_with_upstream:
runs-on: ubuntu-latest
name: Sync main with upstream latest
steps:
# Step 1: run a standard checkout action, provided by github
- name: Checkout main
uses: actions/checkout@v2
with:
ref: main
# submodules: 'recursive' ### may be needed in your situation
# Step 2: run this sync action - specify the upstream repo, upstream branch to sync with, and target sync branch
- name: Pull (Fast-Forward) upstream changes
id: sync
uses: aormsby/Fork-Sync-With-Upstream-action@v2.1
with:
upstream_repository: AtlasMediaGroup/TotalFreedomMod
upstream_branch: main
target_branch: main
git_pull_args: --ff-only # optional arg use, defaults to simple 'pull'
# Step 3: Display a message if 'sync' step had new commits (simple test)
- name: Check for new commits
if: steps.sync.outputs.has_new_commits
run: echo "There were new commits."
# Step 4: Print a helpful timestamp for your records (not required, just nice)
- name: Timestamp
run: date

View File

@ -2,18 +2,34 @@
## Supported Versions ## Supported Versions
We currently support the code running on the "development" branch of this repository. This is supported in addition to those formal releases, but note anything not yet released should be treated as in-development. We currently support the code running on the "main" branch and "development" branch of this repository. This is supported in addition to those formal releases, but note anything not yet released should be treated as in-development.
In terms of plugin releases, we support the following versions: In terms of plugin releases, our support matrix is as follows:
| Version | Supported | ### Actively Supported
| ------------------- | ------------------ | These versions are currently actively supported by our team, and you should expect security patches where appropriate for these versions.
| 2021.04 | :white_check_mark: |
| 2021.02 | :white_check_mark: | | Version | Supported | Support End: |
| 2020.11 | :white_check_mark: | | ------------------- | ------------------ | ------------------------------ |
| 6.0.x (Pre-Release) | :x: | | 2021.05 | :white_check_mark: | No Earlier than August 2021 |
| < 2020.11 | :x: |
| < 5.x | :x: | ### Legacy Supported
These versions are no longer under active development, however we will look to release critical secuirty patches where appropriate.
| Version | Supported | Support End: |
| ------------------- | ------------------ | ------------ |
| 2021.04 | :white_check_mark: | July 2021 |
### No Longer Supported
These versions are no longer supported at all. It is strongly advised to update if you are running any of these versions.
| Version | Supported | Support Ended: |
| ------------------- | ------------------ | ------------------- |
| 2021.02 | :x: | 6 June 2021 |
| 2020.11 | :x: | 3 May 2021 |
| 6.0.x (Pre-Release) | :x: | December 2020 |
| < 2020.11 | :x: | December 2020 |
| < 5.x | :x: | December 2020 |
## Reporting a Vulnerability ## Reporting a Vulnerability

14
pom.xml
View File

@ -5,7 +5,7 @@
<groupId>me.totalfreedom</groupId> <groupId>me.totalfreedom</groupId>
<artifactId>TotalFreedomMod</artifactId> <artifactId>TotalFreedomMod</artifactId>
<version>2021.04-RC01</version> <version>2021.05</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties> <properties>
@ -252,9 +252,9 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.TotalFreedomMC</groupId> <groupId>com.github.AtlasMediaGroup</groupId>
<artifactId>TFGuilds</artifactId> <artifactId>TFGuilds</artifactId>
<version>db036fb187</version> <version>master-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
@ -277,6 +277,11 @@
<version>5.4.2</version> <version>5.4.2</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>org.eclipse.sisu</groupId>
<artifactId>org.eclipse.sisu.inject</artifactId>
<version>0.3.4</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
@ -434,7 +439,8 @@
<relocations> <relocations>
<relocation> <relocation>
<pattern>io.papermc.lib</pattern> <pattern>io.papermc.lib</pattern>
<shadedPattern>me.totalfreedom.totalfreedommod.paperlib</shadedPattern> <!-- Replace this --> <shadedPattern>me.totalfreedom.totalfreedommod.paperlib
</shadedPattern> <!-- Replace this -->
</relocation> </relocation>
<relocation> <relocation>
<pattern>org.bstats</pattern> <pattern>org.bstats</pattern>

View File

@ -1,6 +1,5 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import java.io.File;
import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList; import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList;
import me.totalfreedom.totalfreedommod.config.YamlConfig; import me.totalfreedom.totalfreedommod.config.YamlConfig;
import me.totalfreedom.totalfreedommod.permissions.PermissionConfig; import me.totalfreedom.totalfreedommod.permissions.PermissionConfig;
@ -9,8 +8,11 @@ import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.util.FileUtil; import org.bukkit.util.FileUtil;
import java.io.File;
public class BackupManager extends FreedomService public class BackupManager extends FreedomService
{ {
@Override @Override
public void onStart() public void onStart()
{ {
@ -42,16 +44,16 @@ public class BackupManager extends FreedomService
config.load(); config.load();
// Weekly // Weekly
if (!config.isInt(save + ".weekly")) if (!config.isLong(save + ".weekly"))
{ {
performBackup(file, "weekly"); performBackup(file, "weekly");
config.set(save + ".weekly", FUtil.getUnixTime()); config.set(save + ".weekly", FUtil.getUnixTime());
} }
else else
{ {
int lastBackupWeekly = config.getInt(save + ".weekly"); long lastBackupWeekly = config.getLong(save + ".weekly");
if (lastBackupWeekly + 3600 * 24 * 7 < FUtil.getUnixTime()) if (FUtil.parseLongOffset(lastBackupWeekly, "1w") < FUtil.getUnixTime())
{ {
performBackup(file, "weekly"); performBackup(file, "weekly");
config.set(save + ".weekly", FUtil.getUnixTime()); config.set(save + ".weekly", FUtil.getUnixTime());
@ -65,16 +67,16 @@ public class BackupManager extends FreedomService
} }
// Daily // Daily
if (!config.isInt(save + ".daily")) if (!config.isLong(save + ".daily"))
{ {
performBackup(file, "daily"); performBackup(file, "daily");
config.set(save + ".daily", FUtil.getUnixTime()); config.set(save + ".daily", FUtil.getUnixTime());
} }
else else
{ {
int lastBackupDaily = config.getInt(save + ".daily"); long lastBackupDaily = config.getLong(save + ".daily");
if (lastBackupDaily + 3600 * 24 < FUtil.getUnixTime()) if (FUtil.parseLongOffset(lastBackupDaily, "1d") < FUtil.getUnixTime())
{ {
performBackup(file, "daily"); performBackup(file, "daily");
config.set(save + ".daily", FUtil.getUnixTime()); config.set(save + ".daily", FUtil.getUnixTime());
@ -98,5 +100,4 @@ public class BackupManager extends FreedomService
final File newYaml = new File(backupFolder, file + "." + type + ".bak"); final File newYaml = new File(backupFolder, file + "." + type + ".bak");
FileUtil.copy(oldYaml, newYaml); FileUtil.copy(oldYaml, newYaml);
} }
} }

View File

@ -240,17 +240,9 @@ public class LoginProcess extends FreedomService
if (noteCount != 0) if (noteCount != 0)
{ {
String noteMessage = "This player has " + noteCount + " admin note" + (noteCount > 1 ? "s" : "") + "."; String noteMessage = "This player has " + noteCount + " admin note" + (noteCount > 1 ? "s" : "") + ".";
JSONMessage notice = JSONMessage.create(ChatColor.GOLD + noteMessage + " Click here to view them.")
.tooltip("Click here to view them.")
.runCommand("/notes " + player.getName() + " list");
FLog.info(noteMessage); FLog.info(noteMessage);
for (Player p : server.getOnlinePlayers()) plugin.al.messageAllAdmins(ChatColor.GOLD + noteMessage);
{ plugin.al.messageAllAdmins(ChatColor.GOLD + "Do " + ChatColor.YELLOW + "/notes " + player.getName() + " list" + ChatColor.GOLD + " to view them.");
if (plugin.al.isAdmin(p))
{
notice.send(p);
}
}
} }
} }

View File

@ -1,13 +1,11 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FSync; import me.totalfreedom.totalfreedommod.util.FSync;
import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -20,7 +18,6 @@ import org.bukkit.event.player.PlayerJoinEvent;
public class Muter extends FreedomService public class Muter extends FreedomService
{ {
public static final List<String> MUTE_COMMANDS = Arrays.asList(StringUtils.split("say,me,msg,tell,reply,mail", ","));
public final List<String> MUTED_PLAYERS = new ArrayList<>(); public final List<String> MUTED_PLAYERS = new ArrayList<>();
@Override @Override
@ -88,7 +85,7 @@ public class Muter extends FreedomService
cmdName = command.getName().toLowerCase(); cmdName = command.getName().toLowerCase();
} }
if (MUTE_COMMANDS.contains(cmdName)) if (ConfigEntry.MUTED_BLOCKED_COMMANDS.getStringList().contains(cmdName))
{ {
player.sendMessage(ChatColor.RED + "That command is blocked while you are muted."); player.sendMessage(ChatColor.RED + "That command is blocked while you are muted.");
event.setCancelled(true); event.setCancelled(true);

View File

@ -127,7 +127,6 @@ public class TotalFreedomMod extends JavaPlugin
public Sitter st; public Sitter st;
public VanishHandler vh; public VanishHandler vh;
public Pterodactyl ptero; public Pterodactyl ptero;
//public HubWorldRestrictions hwr;
// //
// Bridges // Bridges
public BukkitTelnetBridge btb; public BukkitTelnetBridge btb;

View File

@ -53,6 +53,6 @@ public class TFGuildsBridge extends FreedomService
{ {
return false; return false;
} }
return Common.IN_GUILD_CHAT.contains(player); return Common.GUILD_CHAT.contains(player);
} }
} }

View File

@ -15,7 +15,6 @@ public class WorldGuardBridge extends FreedomService
@Override @Override
public void onStart() public void onStart()
{ {
plugin.wr.protectWorld(plugin.wm.hubworld.getWorld());
plugin.wr.protectWorld(plugin.wm.masterBuilderWorld.getWorld()); plugin.wr.protectWorld(plugin.wm.masterBuilderWorld.getWorld());
} }

View File

@ -26,7 +26,7 @@ public class Command_glow extends FreedomCommand
playerSender.addPotionEffect(glow); playerSender.addPotionEffect(glow);
glowing = true; glowing = true;
} }
msg("You " + (glowing ? "are now" : "no longer") + " glowing."); msg("You are " + (glowing ? "now" : "no longer") + " glowing.");
return true; return true;
} }
} }

View File

@ -1,202 +0,0 @@
package me.totalfreedom.totalfreedommod.command;
import io.papermc.lib.PaperLib;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.world.WorldTime;
import me.totalfreedom.totalfreedommod.world.WorldWeather;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
@CommandParameters(description = "HubWorld management stuff",
usage = "/<command> [time <morning | noon | evening | night> | weather <off | rain | storm>]",
aliases = "hw,hub")
public class Command_hubworld extends FreedomCommand
{
@Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{
CommandMode commandMode = null;
if (args.length == 0)
{
commandMode = CommandMode.TELEPORT;
}
else if (args.length >= 2)
{
if ("time".equalsIgnoreCase(args[0]))
{
commandMode = CommandMode.TIME;
}
else if ("weather".equalsIgnoreCase(args[0]))
{
commandMode = CommandMode.WEATHER;
}
}
if (commandMode == null)
{
return false;
}
try
{
switch (commandMode)
{
case TELEPORT:
{
if (!(sender instanceof Player) || playerSender == null)
{
return false;
}
World hubWorld = null;
try
{
hubWorld = plugin.wm.hubworld.getWorld();
}
catch (Exception ignored)
{
}
if (hubWorld == null || playerSender.getWorld() == hubWorld)
{
msg("Going to the main world.");
PaperLib.teleportAsync(playerSender, server.getWorlds().get(0).getSpawnLocation());
}
else
{
msg("Going to the hub world");
plugin.wm.hubworld.sendToWorld(playerSender);
}
break;
}
case TIME:
{
assertCommandPerms(sender, playerSender);
if (args.length == 2)
{
WorldTime timeOfDay = WorldTime.getByAlias(args[1]);
if (timeOfDay != null)
{
plugin.wm.hubworld.setTimeOfDay(timeOfDay);
msg("Hub world time set to: " + timeOfDay.name());
}
else
{
msg("Invalid time of day. Can be: sunrise, noon, sunset, midnight");
}
}
else
{
return false;
}
break;
}
case WEATHER:
{
assertCommandPerms(sender, playerSender);
if (args.length == 2)
{
WorldWeather weatherMode = WorldWeather.getByAlias(args[1]);
if (weatherMode != null)
{
plugin.wm.hubworld.setWeatherMode(weatherMode);
msg("Hub world weather set to: " + weatherMode.name());
}
else
{
msg("Invalid weather mode. Can be: off, rain, storm");
}
}
else
{
return false;
}
break;
}
default:
{
return false;
}
}
}
catch (PermissionDeniedException ex)
{
if (ex.getMessage().isEmpty())
{
return noPerms();
}
msg(ex.getMessage());
return true;
}
return true;
}
@Override
public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
{
if (!plugin.al.isAdmin(sender))
{
return Collections.emptyList();
}
if (args.length == 1)
{
return Arrays.asList("time", "weather");
}
else if (args.length == 2)
{
if (args[0].equals("time"))
{
return Arrays.asList("morning", "noon", "evening", "night");
}
else if (args[0].equals("weather"))
{
return Arrays.asList("off", "rain", "storm");
}
}
return Collections.emptyList();
}
// TODO: Redo this properly
private void assertCommandPerms(CommandSender sender, Player playerSender) throws PermissionDeniedException
{
if (!(sender instanceof Player) || playerSender == null || !plugin.al.isAdmin(playerSender))
{
throw new PermissionDeniedException();
}
}
private enum CommandMode
{
TELEPORT, TIME, WEATHER
}
private static class PermissionDeniedException extends Exception
{
private static final long serialVersionUID = 1L;
private PermissionDeniedException()
{
super("");
}
private PermissionDeniedException(String string)
{
super(string);
}
}
}

View File

@ -88,7 +88,7 @@ public class Command_list extends FreedomCommand
List<String> n = new ArrayList<>(); List<String> n = new ArrayList<>();
if (listFilter == ListFilter.TELNET_SESSIONS && plugin.al.isAdmin(sender) && plugin.al.getAdmin(playerSender).getRank().isAtLeast(Rank.ADMIN)) if (listFilter == ListFilter.TELNET_SESSIONS && plugin.al.isAdmin(sender))
{ {
List<Admin> connectedAdmins = plugin.btb.getConnectedAdmins(); List<Admin> connectedAdmins = plugin.btb.getConnectedAdmins();
onlineStats.append(ChatColor.BLUE).append("There are ").append(ChatColor.RED).append(connectedAdmins.size()) onlineStats.append(ChatColor.BLUE).append("There are ").append(ChatColor.RED).append(connectedAdmins.size())
@ -101,7 +101,7 @@ public class Command_list extends FreedomCommand
} }
else else
{ {
onlineStats.append(ChatColor.BLUE).append("There are ").append(ChatColor.RED).append(server.getOnlinePlayers().size() - AdminList.vanished.size()) onlineStats.append(ChatColor.BLUE).append("There are ").append(ChatColor.RED).append(FUtil.getFakePlayerCount())
.append(ChatColor.BLUE) .append(ChatColor.BLUE)
.append(" out of a maximum ") .append(" out of a maximum ")
.append(ChatColor.RED) .append(ChatColor.RED)

View File

@ -65,7 +65,7 @@ public class Command_potion extends FreedomCommand
Player target = playerSender; Player target = playerSender;
if (args.length == 2) if (args.length == 2)
{ {
if (!plugin.al.isAdmin(sender) && !target.equals(getPlayer(sender.getName()))) if (!plugin.al.isAdmin(sender) && !args[1].equalsIgnoreCase(sender.getName()))
{ {
msg(ChatColor.RED + "Only admins can clear potion effects from other players."); msg(ChatColor.RED + "Only admins can clear potion effects from other players.");
return true; return true;
@ -104,7 +104,7 @@ public class Command_potion extends FreedomCommand
if (args.length == 5) if (args.length == 5)
{ {
if (!plugin.al.isAdmin(sender) && !getPlayer(args[4]).equals(getPlayer(sender.getName()))) if (!plugin.al.isAdmin(sender) && !args[4].equalsIgnoreCase(sender.getName()))
{ {
msg("Only admins can apply potion effects to other players.", ChatColor.RED); msg("Only admins can apply potion effects to other players.", ChatColor.RED);
return true; return true;

View File

@ -26,7 +26,7 @@ public class Command_ride extends FreedomCommand
final FPlayer fPlayer = plugin.pl.getPlayer(playerSender); final FPlayer fPlayer = plugin.pl.getPlayer(playerSender);
if (fPlayer.getCageData().isCaged()) if (fPlayer.getCageData().isCaged())
{ {
msg("You cannot used this command while caged."); msg("You cannot use this command while caged.");
return true; return true;
} }

View File

@ -15,7 +15,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH) @CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
@CommandParameters(description = "Someone being a little bitch? Smite them down...", usage = "/<command> <player> [reason] [-c | -q]") @CommandParameters(description = "Someone being a little bitch? Smite them down...", usage = "/<command> <player> [reason] [-ci | -q]")
public class Command_smite extends FreedomCommand public class Command_smite extends FreedomCommand
{ {
@ -106,9 +106,9 @@ public class Command_smite extends FreedomCommand
reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " "); reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " ");
} }
} }
else if (args[args.length - 1].equalsIgnoreCase("-c")) else if (args[args.length - 1].equalsIgnoreCase("-ci"))
{ {
if (args[args.length - 1].equalsIgnoreCase("-c")) if (args[args.length - 1].equalsIgnoreCase("-ci"))
{ {
clearinv = true; clearinv = true;
} }

View File

@ -1,7 +1,8 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import java.util.Arrays;
import java.util.List; import java.util.List;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.player.PlayerData;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
@ -19,9 +20,6 @@ import org.bukkit.entity.Player;
public class Command_tag extends FreedomCommand public class Command_tag extends FreedomCommand
{ {
public static final List<String> FORBIDDEN_WORDS = Arrays.asList(
"admin", "owner", "moderator", "developer", "console", "dev", "staff", "mod", "sra", "tca", "sta", "sa");
@Override @Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{ {
@ -170,7 +168,7 @@ public class Command_tag extends FreedomCommand
if (!plugin.al.isAdmin(sender)) if (!plugin.al.isAdmin(sender))
{ {
for (String word : FORBIDDEN_WORDS) for (String word : ConfigEntry.FORBIDDEN_WORDS.getStringList())
{ {
if (rawTag.contains(word)) if (rawTag.contains(word))
{ {
@ -261,7 +259,7 @@ public class Command_tag extends FreedomCommand
if (!plugin.al.isAdmin(sender)) if (!plugin.al.isAdmin(sender))
{ {
for (String word : FORBIDDEN_WORDS) for (String word : ConfigEntry.FORBIDDEN_WORDS.getStringList())
{ {
if (rawTag.contains(word)) if (rawTag.contains(word))
{ {

View File

@ -1,5 +1,6 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
@ -43,7 +44,7 @@ public class Command_tagnyan extends FreedomCommand
if (!plugin.al.isAdmin(sender)) if (!plugin.al.isAdmin(sender))
{ {
for (String word : Command_tag.FORBIDDEN_WORDS) for (String word : ConfigEntry.FORBIDDEN_WORDS.getStringList())
{ {
if (rawTag.contains(word)) if (rawTag.contains(word))
{ {

View File

@ -1,5 +1,6 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
@ -33,7 +34,7 @@ public class Command_tagrainbow extends FreedomCommand
return true; return true;
} }
for (String word : Command_tag.FORBIDDEN_WORDS) for (String word : ConfigEntry.FORBIDDEN_WORDS.getStringList())
{ {
if (rawTag.contains(word)) if (rawTag.contains(word))
{ {

View File

@ -13,6 +13,8 @@ import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -44,6 +46,9 @@ public class Command_tempban extends FreedomCommand
} }
} }
final String username;
final List<String> ips = new ArrayList<>();
final Player player = getPlayer(args[0]); final Player player = getPlayer(args[0]);
final PlayerData entry; final PlayerData entry;
if (player == null) if (player == null)
@ -55,15 +60,18 @@ public class Command_tempban extends FreedomCommand
msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly."); msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly.");
return true; return true;
} }
username = entry.getName();
ips.addAll(entry.getIps());
} }
else else
{ {
entry = plugin.pl.getData(player); entry = plugin.pl.getData(player);
username = player.getName();
ips.add(FUtil.getIp(player));
} }
final List<String> ips = new ArrayList<>(entry.getIps());
assert player != null; final StringBuilder message = new StringBuilder("Temporarily banned " + username);
final StringBuilder message = new StringBuilder("Temporarily banned " + player.getName());
Date expires = FUtil.parseDateOffset("30m"); Date expires = FUtil.parseDateOffset("30m");
message.append(" until ").append(date_format.format(expires)); message.append(" until ").append(date_format.format(expires));
@ -80,7 +88,26 @@ public class Command_tempban extends FreedomCommand
message.append(", Reason: \"").append(reason).append("\""); message.append(", Reason: \"").append(reason).append("\"");
} }
Ban ban;
if (player != null)
{
ban = Ban.forPlayer(player, sender, expires, reason);
}
else
{
ban = Ban.forPlayerName(username, sender, expires, reason);
}
for (String ip : ips)
{
ban.addIp(ip);
}
plugin.bm.addBan(ban);
if (!quiet) if (!quiet)
{
if (player != null)
{ {
// Strike with lightning // Strike with lightning
final Location targetPos = player.getLocation(); final Location targetPos = player.getLocation();
@ -92,26 +119,28 @@ public class Command_tempban extends FreedomCommand
Objects.requireNonNull(targetPos.getWorld()).strikeLightningEffect(strike_pos); Objects.requireNonNull(targetPos.getWorld()).strikeLightningEffect(strike_pos);
} }
} }
}
FUtil.adminAction(sender.getName(), message.toString(), true); FUtil.adminAction(sender.getName(), message.toString(), true);
} }
else else
{ {
msg("Quietly temporarily banned " + player.getName() + "."); msg("Quietly temporarily banned " + username + ".");
} }
if (player != null)
Ban ban;
ban = Ban.forPlayer(player, sender, null, reason);
for (String ip : ips)
{ {
ban.addIp(ip);
}
plugin.bm.addBan(ban);
player.kickPlayer(ban.bakeKickMessage()); player.kickPlayer(ban.bakeKickMessage());
plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player), sender.getName(), PunishmentType.TEMPBAN, reason)); for (Player p : Bukkit.getOnlinePlayers())
{
if (FUtil.getIp(p).equals(FUtil.getIp(player)))
{
p.kickPlayer(ChatColor.RED + "You've been kicked because someone on your IP has been banned.");
}
}
}
plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.TEMPBAN, reason));
return true; return true;
} }
} }

View File

@ -3,6 +3,8 @@ package me.totalfreedom.totalfreedommod.command;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -15,14 +17,6 @@ import org.bukkit.entity.Player;
public class Command_wildcard extends FreedomCommand public class Command_wildcard extends FreedomCommand
{ {
public static final List<String> BLOCKED_COMMANDS = Arrays.asList(
"wildcard",
"gtfo",
"doom",
"slconfig",
"smite"
);
@Override @Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{ {
@ -52,7 +46,7 @@ public class Command_wildcard extends FreedomCommand
aliases = Arrays.asList(fCmd.getAliases().split(",")); aliases = Arrays.asList(fCmd.getAliases().split(","));
} }
for (String blockedCommand : BLOCKED_COMMANDS) for (String blockedCommand : ConfigEntry.WILDCARD_BLOCKED_COMMANDS.getStringList())
{ {
if (blockedCommand.equals(args[0].toLowerCase()) || aliases.contains(blockedCommand)) if (blockedCommand.equals(args[0].toLowerCase()) || aliases.contains(blockedCommand))
{ {

View File

@ -1,37 +0,0 @@
package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
@CommandPermissions(level = Rank.ADMIN, source = SourceType.ONLY_CONSOLE)
@CommandParameters(description = "Wipes the CoreProtect data for the flatlands", usage = "/<command>")
public class Command_wipecoreprotectdata extends FreedomCommand
{
@Override
public boolean run(final CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{
if (!plugin.cpb.isEnabled())
{
msg("CoreProtect is not enabled on this server");
return true;
}
FUtil.adminAction(sender.getName(), "Wiping CoreProtect data for the flatlands", true);
new BukkitRunnable()
{
@Override
public void run()
{
plugin.cpb.clearDatabase(plugin.wm.flatlands.getWorld());
}
}.runTaskAsynchronously(plugin);
return true;
}
}

View File

@ -1,53 +0,0 @@
package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.ChatColor;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.SENIOR_ADMIN, source = SourceType.ONLY_CONSOLE, blockHostConsole = true)
@CommandParameters(description = "Wipe the flatlands map. Requires manual restart after command is used.", usage = "/<command>")
public class Command_wipeflatlands extends FreedomCommand
{
@Override
public boolean run(final CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{
plugin.sf.setSavedFlag("do_wipe_flatlands", true);
if (!ConfigEntry.FLATLANDS_GENERATE.getBoolean())
{
msg("Flatlands generation is disabled, therefore it cannot be wiped.");
return true;
}
FUtil.bcastMsg("Server is going offline for flatlands wipe.", ChatColor.GRAY);
World flatlands = plugin.wm.flatlands.getWorld();
if (plugin.wgb.isEnabled())
{
plugin.wgb.wipeRegions(flatlands);
}
for (Player player : server.getOnlinePlayers())
{
player.kickPlayer("Server is going offline for flatlands wipe, come back in a few minutes.");
}
if (plugin.cpb.isEnabled())
{
plugin.cpb.clearDatabase(flatlands, true);
}
else
{
server.shutdown();
}
return true;
}
}

View File

@ -1,40 +0,0 @@
package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.SENIOR_ADMIN, source = SourceType.ONLY_CONSOLE, blockHostConsole = true)
@CommandParameters(description = "Wipes all logged punishments or punishments for a specific user.", usage = "/<command> <username | -a>")
public class Command_wipepunishments extends FreedomCommand
{
@Override
public boolean run(final CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{
if (args.length < 1)
{
return false;
}
if (args[0].equalsIgnoreCase("-a"))
{
FUtil.adminAction(sender.getName(), "Wiping the punishment history", true);
msg("Wiped " + plugin.pul.clear() + " punishments.");
}
else
{
String username = args[0];
FUtil.adminAction(sender.getName(), "Wiping the punishment history for " + username, true);
msg("Wiped " + plugin.pul.clear(username) + " punishments for " + username + ".");
}
return true;
}
}

View File

@ -1,73 +0,0 @@
package me.totalfreedom.totalfreedommod.command;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.ChatColor;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.SENIOR_ADMIN, source = SourceType.ONLY_CONSOLE)
@CommandParameters(description = "Wipe all WorldGuard regions for a specified world.", usage = "/<command> <world>")
public class Command_wiperegions extends FreedomCommand
{
@Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{
if (!plugin.wgb.isEnabled())
{
msg("WorldGuard is not enabled.");
return true;
}
if (args.length != 1)
{
return false;
}
World world = server.getWorld(args[0]);
if (world == null)
{
msg("There is no world named \"" + args[0] + "\"", ChatColor.RED);
return true;
}
int regionsWiped = plugin.wgb.wipeRegions(world);
if (regionsWiped != 0)
{
FUtil.adminAction(sender.getName(), "Wiped all regions in " + world.getName(), true);
msg("Wiped " + regionsWiped + " regions in " + world.getName());
}
else
{
msg(ChatColor.RED + "No regions were found in \"" + world.getName() + "\"");
}
return true;
}
public List<String> getAllWorldNames()
{
List<String> names = new ArrayList<>();
for (World world : server.getWorlds())
{
names.add(world.getName());
}
return names;
}
@Override
public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
{
if (args.length == 1)
{
return getAllWorldNames();
}
return Collections.emptyList();
}
}

View File

@ -1,34 +0,0 @@
package me.totalfreedom.totalfreedommod.command;
import com.earth2me.essentials.Essentials;
import java.io.File;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.SENIOR_ADMIN, source = SourceType.ONLY_CONSOLE, blockHostConsole = true)
@CommandParameters(description = "Removes all Essentials warps", usage = "/<command>")
public class Command_wipewarps extends FreedomCommand
{
@Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{
if (!plugin.esb.isEnabled())
{
msg("Essentials is not enabled on this server.");
return true;
}
Essentials essentials = plugin.esb.getEssentialsPlugin();
File warps = new File(essentials.getDataFolder(), "warps");
FUtil.adminAction(sender.getName(), "Wiping Essentials warps", true);
FUtil.deleteFolder(warps);
//noinspection ResultOfMethodCallIgnored
warps.mkdir();
essentials.reload();
msg("All warps deleted.");
return true;
}
}

View File

@ -83,6 +83,7 @@ public enum ConfigEntry
DISCORD_NEW_ADMIN_ROLE_ID(String.class, "discord.admin_role_id"), DISCORD_NEW_ADMIN_ROLE_ID(String.class, "discord.admin_role_id"),
DISCORD_SENIOR_ADMIN_ROLE_ID(String.class, "discord.senior_admin_role_id"), DISCORD_SENIOR_ADMIN_ROLE_ID(String.class, "discord.senior_admin_role_id"),
DISCORD_DEVELOPER_ROLE_ID(String.class, "discord.developer_role_id"), DISCORD_DEVELOPER_ROLE_ID(String.class, "discord.developer_role_id"),
DISCORD_ASSISTANT_EXECUTIVE_ROLE_ID(String.class, "discord.assistant_executive_role_id"),
DISCORD_EXECUTIVE_ROLE_ID(String.class, "discord.executive_role_id"), DISCORD_EXECUTIVE_ROLE_ID(String.class, "discord.executive_role_id"),
DISCORD_SERVER_OWNER_ROLE_ID(String.class, "discord.server_owner_role_id"), DISCORD_SERVER_OWNER_ROLE_ID(String.class, "discord.server_owner_role_id"),
// //
@ -154,7 +155,10 @@ public enum ConfigEntry
EXPLOSIVE_RADIUS(Double.class, "explosive_radius"), EXPLOSIVE_RADIUS(Double.class, "explosive_radius"),
FREECAM_TRIGGER_COUNT(Integer.class, "freecam_trigger_count"), FREECAM_TRIGGER_COUNT(Integer.class, "freecam_trigger_count"),
SERVICE_CHECKER_URL(String.class, "service_checker_url"), SERVICE_CHECKER_URL(String.class, "service_checker_url"),
BLOCKED_COMMANDS(List.class, "blocked_commands"), BLOCKED_COMMANDS(List.class, "blocked_commands.global"),
MUTED_BLOCKED_COMMANDS(List.class, "blocked_commands.muted"),
WILDCARD_BLOCKED_COMMANDS(List.class, "blocked_commands.wildcard"),
FORBIDDEN_WORDS(List.class, "forbidden_words"),
HOST_SENDER_NAMES(List.class, "host_sender_names"), HOST_SENDER_NAMES(List.class, "host_sender_names"),
FAMOUS_PLAYERS(List.class, "famous_players"), FAMOUS_PLAYERS(List.class, "famous_players"),
ADMIN_ONLY_MODE(Boolean.class, "admin_only_mode"), ADMIN_ONLY_MODE(Boolean.class, "admin_only_mode"),

View File

@ -119,6 +119,11 @@ public class DiscordToAdminChatListener extends ListenerAdapter
{ {
return Title.EXECUTIVE; return Title.EXECUTIVE;
} }
// Assistant Executives
else if (member.getRoles().contains(server.getRoleById(ConfigEntry.DISCORD_ASSISTANT_EXECUTIVE_ROLE_ID.getString())))
{
return Title.ASSTEXEC;
}
// Senior Admins // Senior Admins
else if (member.getRoles().contains(server.getRoleById(ConfigEntry.DISCORD_SENIOR_ADMIN_ROLE_ID.getString()))) else if (member.getRoles().contains(server.getRoleById(ConfigEntry.DISCORD_SENIOR_ADMIN_ROLE_ID.getString())))
{ {

View File

@ -84,6 +84,11 @@ public class DiscordToMinecraftListener extends ListenerAdapter
{ {
return Title.EXECUTIVE.getColoredTag(); return Title.EXECUTIVE.getColoredTag();
} }
// Assistant Executives
else if (member.getRoles().contains(server.getRoleById(ConfigEntry.DISCORD_ASSISTANT_EXECUTIVE_ROLE_ID.getString())))
{
return Title.ASSTEXEC.getColoredTag();
}
// Senior Admins // Senior Admins
else if (member.getRoles().contains(server.getRoleById(ConfigEntry.DISCORD_SENIOR_ADMIN_ROLE_ID.getString()))) else if (member.getRoles().contains(server.getRoleById(ConfigEntry.DISCORD_SENIOR_ADMIN_ROLE_ID.getString())))
{ {

View File

@ -97,7 +97,7 @@ public class Module_list extends HTTPDModule
responseObject.put("master_builders", masterbuilders); responseObject.put("master_builders", masterbuilders);
responseObject.put("operators", operators); responseObject.put("operators", operators);
responseObject.put("imposters", imposters); responseObject.put("imposters", imposters);
responseObject.put("online", server.getOnlinePlayers().size() - AdminList.vanished.size()); responseObject.put("online", FUtil.getFakePlayerCount());
responseObject.put("max", server.getMaxPlayers()); responseObject.put("max", server.getMaxPlayers());
final NanoHTTPD.Response response = new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, NanoHTTPD.MIME_JSON, responseObject.toString()); final NanoHTTPD.Response response = new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, NanoHTTPD.MIME_JSON, responseObject.toString());
@ -110,7 +110,8 @@ public class Module_list extends HTTPDModule
final Collection<? extends Player> onlinePlayers = Bukkit.getOnlinePlayers(); final Collection<? extends Player> onlinePlayers = Bukkit.getOnlinePlayers();
body.append("<p>There are ").append(onlinePlayers.size() - AdminList.vanished.size()).append("/") int count = onlinePlayers.size() - AdminList.vanished.size();
body.append("<p>There are ").append(count < 0 ? 0 : count).append("/")
.append(Bukkit.getMaxPlayers()).append(" players online:</p>\r\n"); .append(Bukkit.getMaxPlayers()).append(" players online:</p>\r\n");
body.append("<ul>\r\n"); body.append("<ul>\r\n");

View File

@ -227,7 +227,7 @@ public class Shop extends FreedomService
ItemStack itemStack = new ItemStack(Material.BLAZE_ROD); ItemStack itemStack = new ItemStack(Material.BLAZE_ROD);
ItemMeta itemMeta = itemStack.getItemMeta(); ItemMeta itemMeta = itemStack.getItemMeta();
assert itemMeta != null; assert itemMeta != null;
itemMeta.setDisplayName(FUtil.colorize("&bL&3i&bg&3h&bt&3i&bn&3g &b&bR&3o&bd")); itemMeta.setDisplayName(FUtil.colorize("&bL&3i&bg&3h&bt&3n&bi&3n&bg &3R&bo&3d"));
itemMeta.setLore(Arrays.asList(ChatColor.AQUA + "Strike others down with the power of lightning.", ChatColor.RED + ChatColor.ITALIC.toString() + "The classic way to exterminate annoyances.")); itemMeta.setLore(Arrays.asList(ChatColor.AQUA + "Strike others down with the power of lightning.", ChatColor.RED + ChatColor.ITALIC.toString() + "The classic way to exterminate annoyances."));
itemMeta.addEnchant(Enchantment.CHANNELING, 1, false); itemMeta.addEnchant(Enchantment.CHANNELING, 1, false);
itemStack.setItemMeta(itemMeta); itemStack.setItemMeta(itemMeta);

View File

@ -1,33 +1,5 @@
package me.totalfreedom.totalfreedommod.util; package me.totalfreedom.totalfreedommod.util;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.SplittableRandom;
import java.util.TimeZone;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
@ -48,6 +20,18 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
import java.io.*;
import java.lang.reflect.Field;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static org.bukkit.Bukkit.getServer; import static org.bukkit.Bukkit.getServer;
public class FUtil public class FUtil
@ -73,10 +57,10 @@ public class FUtil
"38ea7c82-7bdc-4f48-b7fd-0e93fc26813d", // AwesomePinch "38ea7c82-7bdc-4f48-b7fd-0e93fc26813d", // AwesomePinch
"ba5aafba-9012-418f-9819-a7020d591068", // TFTWPhoenix "ba5aafba-9012-418f-9819-a7020d591068", // TFTWPhoenix
"d6dd9740-40db-45f5-ab16-4ee16a633009", // Abhi "d6dd9740-40db-45f5-ab16-4ee16a633009", // Abhi
"2e06e049-24c8-42e4-8bcf-d35372af31e6", // unsuperiordev "2e06e049-24c8-42e4-8bcf-d35372af31e6", // NotInSync
"f97c0d7b-6413-4558-a409-88f09a8f9adb" // videogamesm12 "f97c0d7b-6413-4558-a409-88f09a8f9adb" // videogamesm12
); );
public static final List<String> DEVELOPER_NAMES = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "aggelosQQ", "scripthead", "CoolJWB", "elmon_", "speednt", "SupItsDillon", "Paldiu", "AwesomePinch", "TFTWPhoenix","abhithedev", "unsuperiordev", "videogamesm12"); public static final List<String> DEVELOPER_NAMES = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "aggelosQQ", "scripthead", "CoolJWB", "elmon_", "speednt", "SupItsDillon", "Paldiu", "AwesomePinch", "TFTWPhoenix", "abhithedev", "NotInSync", "videogamesm12");
public static final Map<String, ChatColor> CHAT_COLOR_NAMES = new HashMap<>(); public static final Map<String, ChatColor> CHAT_COLOR_NAMES = new HashMap<>();
public static final List<ChatColor> CHAT_COLOR_POOL = Arrays.asList( public static final List<ChatColor> CHAT_COLOR_POOL = Arrays.asList(
ChatColor.DARK_RED, ChatColor.DARK_RED,
@ -274,7 +258,7 @@ public class FUtil
public static Response sendRequest(String endpoint, String method, List<String> headers, String body) throws IOException public static Response sendRequest(String endpoint, String method, List<String> headers, String body) throws IOException
{ {
URL url = new URL(endpoint); URL url = new URL(endpoint);
HttpURLConnection connection = (HttpURLConnection)url.openConnection(); HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(method); connection.setRequestMethod(method);
@ -393,7 +377,8 @@ public class FUtil
} }
} }
private static final List<String> regxList = new ArrayList<String>(){{ private static final List<String> regxList = new ArrayList<String>()
{{
add("y"); add("y");
add("mo"); add("mo");
add("w"); add("w");
@ -403,11 +388,13 @@ public class FUtil
add("s"); add("s");
}}; }};
private static long a(String parse) { private static long a(String parse)
{
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
regxList.forEach(obj -> { regxList.forEach(obj -> {
if (parse.endsWith(obj)) { if (parse.endsWith(obj))
{
sb.append(parse.split(obj)[0]); sb.append(parse.split(obj)[0]);
} }
}); });
@ -415,7 +402,8 @@ public class FUtil
return Long.parseLong(sb.toString()); return Long.parseLong(sb.toString());
} }
private static TimeUnit verify(String arg) { private static TimeUnit verify(String arg)
{
TimeUnit unit = null; TimeUnit unit = null;
for (String c : regxList) for (String c : regxList)
{ {
@ -461,6 +449,16 @@ public class FUtil
return Date.from(instant); return Date.from(instant);
} }
public static long parseLongOffset(long unix, String... time)
{
Instant instant = Instant.ofEpochMilli(unix);
for (String arg : time)
{
instant = instant.plusSeconds(verify(arg).get() * a(arg));
}
return FUtil.getUnixTime(Date.from(instant));
}
public static String playerListToNames(Set<OfflinePlayer> players) public static String playerListToNames(Set<OfflinePlayer> players)
{ {
List<String> names = new ArrayList<>(); List<String> names = new ArrayList<>();
@ -553,7 +551,7 @@ public class FUtil
{ {
Field field = checkClass.getDeclaredField(name); Field field = checkClass.getDeclaredField(name);
field.setAccessible(true); field.setAccessible(true);
return (T)field.get(from); return (T) field.get(from);
} }
catch (NoSuchFieldException | IllegalAccessException ignored) catch (NoSuchFieldException | IllegalAccessException ignored)
@ -635,7 +633,7 @@ public class FUtil
public static int randomInteger(int min, int max) public static int randomInteger(int min, int max)
{ {
int range = max - min + 1; int range = max - min + 1;
return (int)(Math.random() * range) + min; return (int) (Math.random() * range) + min;
} }
public static String randomString(int length) public static String randomString(int length)
@ -773,7 +771,7 @@ public class FUtil
{ {
c1values[i] = Math.round(c1values[i] + factor * (c2values[i] - c1values[i])); c1values[i] = Math.round(c1values[i] + factor * (c2values[i] - c1values[i]));
} }
return Color.fromRGB((int)c1values[0], (int)c1values[1], (int)c1values[2]); return Color.fromRGB((int) c1values[0], (int) c1values[1], (int) c1values[2]);
} }
public static boolean isValidIPv4(String ip) public static boolean isValidIPv4(String ip)
@ -838,8 +836,22 @@ public class FUtil
}.runTaskLater(TotalFreedomMod.getPlugin(), delay); }.runTaskLater(TotalFreedomMod.getPlugin(), delay);
} }
public static int getFakePlayerCount()
{
int i = TotalFreedomMod.getPlugin().al.vanished.size();
for (String name : TotalFreedomMod.getPlugin().al.vanished)
{
if (Bukkit.getPlayer(name) == null)
{
i--;
}
}
return getServer().getOnlinePlayers().size() - i;
}
public static class PaginationList<T> extends ArrayList<T> public static class PaginationList<T> extends ArrayList<T>
{ {
private final int epp; private final int epp;
public PaginationList(int epp) public PaginationList(int epp)
@ -857,7 +869,7 @@ public class FUtil
public int getPageCount() public int getPageCount()
{ {
return (int)Math.ceil((double)size() / (double)epp); return (int) Math.ceil((double) size() / (double) epp);
} }
public List<T> getPage(int page) public List<T> getPage(int page)

View File

@ -1,102 +0,0 @@
package me.totalfreedom.totalfreedommod.world;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.WorldCreator;
import org.bukkit.WorldType;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
public final class HubWorld extends CustomWorld
{
private static final String GENERATION_PARAMETERS = ConfigEntry.FLATLANDS_GENERATE_PARAMS.getString();
//
private WorldWeather weather = WorldWeather.OFF;
private WorldTime time = WorldTime.INHERIT;
public HubWorld()
{
super("hubworld");
}
@Override
public void sendToWorld(Player player)
{
super.sendToWorld(player);
}
// TODO: Replace instances of org.bukkit.Sign with a non deprecated version. This might include more boilerplate.
@SuppressWarnings("deprecation")
@Override
protected World generateWorld()
{
final WorldCreator worldCreator = new WorldCreator(getName());
worldCreator.generateStructures(false);
worldCreator.type(WorldType.NORMAL);
worldCreator.environment(World.Environment.NORMAL);
worldCreator.generator(new CleanroomChunkGenerator(GENERATION_PARAMETERS));
final World world = server.createWorld(worldCreator);
assert world != null;
world.setSpawnFlags(false, false);
world.setSpawnLocation(0, 50, 0);
final Block welcomeSignBlock = world.getBlockAt(0, 50, 0);
welcomeSignBlock.setType(Material.OAK_SIGN);
org.bukkit.block.Sign welcomeSign = (org.bukkit.block.Sign)welcomeSignBlock.getState();
org.bukkit.material.Sign signData = (org.bukkit.material.Sign)welcomeSign.getData();
signData.setFacingDirection(BlockFace.NORTH);
welcomeSign.setLine(0, ChatColor.GREEN + "Hub World");
welcomeSign.setLine(1, ChatColor.DARK_GRAY + "---");
welcomeSign.setLine(2, ChatColor.YELLOW + "Spawn Point");
welcomeSign.setLine(3, ChatColor.DARK_GRAY + "---");
welcomeSign.update();
plugin.gr.commitGameRules();
return world;
}
public WorldWeather getWeatherMode()
{
return weather;
}
public void setWeatherMode(final WorldWeather weatherMode)
{
this.weather = weatherMode;
try
{
weatherMode.setWorldToWeather(getWorld());
}
catch (Exception ignored)
{
}
}
public WorldTime getTimeOfDay()
{
return time;
}
public void setTimeOfDay(final WorldTime timeOfDay)
{
this.time = timeOfDay;
try
{
timeOfDay.setWorldToTime(getWorld());
}
catch (Exception ignored)
{
}
}
}

View File

@ -20,14 +20,12 @@ public class WorldManager extends FreedomService
public Flatlands flatlands; public Flatlands flatlands;
public AdminWorld adminworld; public AdminWorld adminworld;
public MasterBuilderWorld masterBuilderWorld; public MasterBuilderWorld masterBuilderWorld;
public HubWorld hubworld;
public WorldManager() public WorldManager()
{ {
this.flatlands = new Flatlands(); this.flatlands = new Flatlands();
this.adminworld = new AdminWorld(); this.adminworld = new AdminWorld();
this.masterBuilderWorld = new MasterBuilderWorld(); this.masterBuilderWorld = new MasterBuilderWorld();
this.hubworld = new HubWorld();
} }
@Override @Override
@ -36,7 +34,6 @@ public class WorldManager extends FreedomService
flatlands.getWorld(); flatlands.getWorld();
adminworld.getWorld(); adminworld.getWorld();
masterBuilderWorld.getWorld(); masterBuilderWorld.getWorld();
hubworld.getWorld();
// Disable weather // Disable weather
if (ConfigEntry.DISABLE_WEATHER.getBoolean()) if (ConfigEntry.DISABLE_WEATHER.getBoolean())
@ -57,7 +54,6 @@ public class WorldManager extends FreedomService
flatlands.getWorld().save(); flatlands.getWorld().save();
adminworld.getWorld().save(); adminworld.getWorld().save();
masterBuilderWorld.getWorld().save(); masterBuilderWorld.getWorld().save();
hubworld.getWorld().save();
} }
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)
@ -73,10 +69,6 @@ public class WorldManager extends FreedomService
{ {
return; return;
} }
else if (event.getWorld().equals(hubworld.getWorld()) && hubworld.getWeatherMode() != WorldWeather.OFF)
{
return;
}
} }
catch (Exception ignored) catch (Exception ignored)
{ {
@ -101,10 +93,6 @@ public class WorldManager extends FreedomService
{ {
return; return;
} }
else if (event.getWorld().equals(hubworld.getWorld()) && hubworld.getWeatherMode() != WorldWeather.OFF)
{
return;
}
} }
catch (Exception ignored) catch (Exception ignored)
{ {

View File

@ -54,7 +54,7 @@ public class WorldRestrictions extends FreedomService
{ {
if (!plugin.pl.getData(player).isMasterBuilder() && plugin.pl.canManageMasterBuilders(player.getName())) if (!plugin.pl.getData(player).isMasterBuilder() && plugin.pl.canManageMasterBuilders(player.getName()))
{ {
if (player.getWorld().equals(plugin.wm.masterBuilderWorld.getWorld()) || player.getWorld().equals(plugin.wm.hubworld.getWorld())) if (player.getWorld().equals(plugin.wm.masterBuilderWorld.getWorld()))
{ {
return true; return true;
} }

View File

@ -78,6 +78,8 @@ discord:
senior_admin_role_id: '' senior_admin_role_id: ''
# Developer role ID # Developer role ID
developer_role_id: '' developer_role_id: ''
# Assistant Executive role ID
assistant_executive_role_id: ''
# Executive Admin role ID # Executive Admin role ID
executive_role_id: '' executive_role_id: ''
# Owner role ID # Owner role ID
@ -228,46 +230,47 @@ allow:
auto_clear: false auto_clear: false
gravity: false gravity: false
# Blocked commands:
#
# How blocked commands work:
# All sections described below are delimited by colon characters.
# Make sure that you block a command by its main command name, not an alias
# as all aliases are blocked by default. Commands are case-insensitive.
#
# * The first section is a letter which indicates which rank may use this command
# Valid ranks:
# n - Nobody (Completely disabled)
# a - Admins (Console)
# s - Senior Admins (Console)
# o - Ops (Non-Ops won't be able to use it)
#
# * The second section is a letter which indicates what to do when a player executes that command.
# Valid actions:
# b - Block the command
# a - Block the command and auto-eject that player (for ops and below)
# u - Block the command and Return an "Unknown command" message (Used to hide commands)
#
# * The third section is the command to be blocked, prefixed with a slash
#
# * The fourth section is the message to send to the player when executing that command.
# This should be omitted if unwanted. ChatColors are supported with the &-key. By default
# the starting ChatColor is set to gray. You can use the default 'That command is blocked.' message
# by using a single underscore.
#
# Examples:
# - 'n:b:/mail sendall:&4You can't send mails to everyone!'
# - 's:a:/stop'
# - 'n:b:/ban:_'
#
blocked_commands: blocked_commands:
# Core Protect Blocked and shows as an unknown command... #
# How globally blocked commands work:
# All sections described below are delimited by colon characters.
# Make sure that you block a command by its main command name, not an alias
# as all aliases are blocked by default. Commands are case-insensitive.
#
# * The first section is a letter which indicates which rank may use this command
# Valid ranks:
# n - Nobody (Completely disabled)
# a - Admins (Console)
# s - Senior Admins (Console)
# o - Ops (Non-Ops won't be able to use it)
#
# * The second section is a letter which indicates what to do when a player executes that command.
# Valid actions:
# b - Block the command
# a - Block the command and auto-eject that player (for ops and below)
# u - Block the command and Return an "Unknown command" message (Used to hide commands)
#
# * The third section is the command to be blocked, prefixed with a slash
#
# * The fourth section is the message to send to the player when executing that command.
# This should be omitted if unwanted. ChatColors are supported with the &-key. By default
# the starting ChatColor is set to gray. You can use the default 'That command is blocked.' message
# by using a single underscore.
#
# Examples:
# - 'n:b:/mail sendall:&4You can't send mails to everyone!'
# - 's:a:/stop'
# - 'n:b:/ban:_'
#
global:
# CoreProtect Blocked and shows as an unknown command...
- 'a:u:/co:_' - 'a:u:/co:_'
- 'n:u:/co purge:_' - 'n:u:/co purge:_'
- 'a:u:/coreprotect:_' - 'a:u:/coreprotect:_'
- 'n:u:/coreprotect purge:_' - 'n:u:/coreprotect purge:_'
- 'a:u:/core:_' - 'a:u:/core:_'
- 'n:u:/core purge:_' - 'n:u:/core purge:_'
# Disabled commands # Disabled commands
- 'n:b:/essentials:_' - 'n:b:/essentials:_'
- 'n:b:/time:Server-side time changing is disabled. Please use /ptime to set your own personal time.' - 'n:b:/time:Server-side time changing is disabled. Please use /ptime to set your own personal time.'
@ -290,7 +293,6 @@ blocked_commands:
- 'n:b:/bungeeguard:_' - 'n:b:/bungeeguard:_'
- 'n:b:/buycraft:_' - 'n:b:/buycraft:_'
- 'n:b:/spigot reload:_' - 'n:b:/spigot reload:_'
# - 'n:b:/setjail:_'
- 'n:b:/mail sendall:Sending mail to all players is not allowed.' - 'n:b:/mail sendall:Sending mail to all players is not allowed.'
- 'n:b:/entitydata:_' - 'n:b:/entitydata:_'
- 'n:b:/skins:_' - 'n:b:/skins:_'
@ -309,7 +311,6 @@ blocked_commands:
- 'n:b:/d minecart_command:_' - 'n:b:/d minecart_command:_'
- 'n:b:/loot:_' - 'n:b:/loot:_'
- 'n:b:/plan:_' - 'n:b:/plan:_'
# - 'n:b:/explosivearrows:&cDisabled until further notice'
- 'n:b://material:_' - 'n:b://material:_'
- 'n:b://mat:_' - 'n:b://mat:_'
- 'n:b:/mat:_' - 'n:b:/mat:_'
@ -319,7 +320,6 @@ blocked_commands:
- 'n:b:/data:_' - 'n:b:/data:_'
- 'n:b:/datapack:_' - 'n:b:/datapack:_'
- 'n:b://regen:_' - 'n:b://regen:_'
- 'n:b:/onlinemode:&cThis breaks UUIDs.'
- 'n:b:/execute:_' - 'n:b:/execute:_'
- 'n:b:/killall:_' - 'n:b:/killall:_'
- 'n:b:/createdisguise:_' - 'n:b:/createdisguise:_'
@ -403,14 +403,12 @@ blocked_commands:
- 'a:b:/bossbar:_' - 'a:b:/bossbar:_'
- 'a:b:/team:_' - 'a:b:/team:_'
- 'a:b:/spawner:_' - 'a:b:/spawner:_'
# - 'a:b:/getpos:_'
- 's:b:/istack:_' - 's:b:/istack:_'
- 'a:b:/getloc:_' - 'a:b:/getloc:_'
- 'a:b:/holo:_' - 'a:b:/holo:_'
- 'a:b:/hd:_' - 'a:b:/hd:_'
- 'a:b:/hologram:_' - 'a:b:/hologram:_'
- 'a:b:/holograms:_' - 'a:b:/holograms:_'
# - 'a:b:/whois:&cpeople like aurulim ruined the usage of this command, stop tp bypassing' # Blocking this is ridiculous. Instead of being lazy and just blocking whois, how about you disable the part where it reveals people's coords, like you did with disabling IPs?
- 's:b:/awe toggle:_' - 's:b:/awe toggle:_'
- 's:b:/tellraw:_' - 's:b:/tellraw:_'
- 's:b://awe toggle:_' - 's:b://awe toggle:_'
@ -436,6 +434,39 @@ blocked_commands:
- 's:b:/viaver:_' - 's:b:/viaver:_'
- 's:b:/viaversion:_' - 's:b:/viaversion:_'
- 's:b:/spark:_' - 's:b:/spark:_'
- 's:b://g:_'
# Commands that cannot be used by muted players
muted:
- say
- me
- msg
- tell
- reply
- mail
# Commands that cannot be used with /wildcard
wildcard:
- wildcard
- gtfo
- doom
- slconfig
- smite
# Words that cannot be used in tags
forbidden_words:
- admin
- owner
- moderator
- developer
- console
- dev
- staff
- mod
- sra
- tca
- sta
- sa
# Automatically wipe dropped objects # Automatically wipe dropped objects
auto_wipe: true auto_wipe: true