mirror of
https://github.com/EssentialsX/Essentials.git
synced 2025-01-20 23:21:29 +01:00
Add option to only count online jailed time (#3705)
Adds `jail-online-time` config option to only count a player's online time to the jail cap. This also fixes memory leak in `EssentialsTimer` which I found in the process of testing. Closes #429.
This commit is contained in:
parent
8177893e28
commit
026d279556
@ -44,6 +44,7 @@ public class EssentialsTimer implements Runnable {
|
|||||||
}
|
}
|
||||||
lastPoll = startTime;
|
lastPoll = startTime;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
onlineUsers.clear();
|
||||||
for (final Player player : ess.getOnlinePlayers()) {
|
for (final Player player : ess.getOnlinePlayers()) {
|
||||||
count++;
|
count++;
|
||||||
if (skip1 > 0) {
|
if (skip1 > 0) {
|
||||||
|
@ -355,6 +355,8 @@ public interface ISettings extends IConf {
|
|||||||
|
|
||||||
boolean isTeleportBackWhenFreedFromJail();
|
boolean isTeleportBackWhenFreedFromJail();
|
||||||
|
|
||||||
|
boolean isJailOnlineTime();
|
||||||
|
|
||||||
boolean isCompassTowardsHomePerm();
|
boolean isCompassTowardsHomePerm();
|
||||||
|
|
||||||
boolean isAllowWorldInBroadcastworld();
|
boolean isAllowWorldInBroadcastworld();
|
||||||
|
@ -1610,6 +1610,11 @@ public class Settings implements net.ess3.api.ISettings {
|
|||||||
return teleportBackWhenFreedFromJail;
|
return teleportBackWhenFreedFromJail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isJailOnlineTime() {
|
||||||
|
return config.getBoolean("jail-online-time", false);
|
||||||
|
}
|
||||||
|
|
||||||
private boolean _isCompassTowardsHomePerm() {
|
private boolean _isCompassTowardsHomePerm() {
|
||||||
return config.getBoolean("compass-towards-home-perm", false);
|
return config.getBoolean("compass-towards-home-perm", false);
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ import com.earth2me.essentials.messaging.SimpleMessageRecipient;
|
|||||||
import com.earth2me.essentials.register.payment.Method;
|
import com.earth2me.essentials.register.payment.Method;
|
||||||
import com.earth2me.essentials.register.payment.Methods;
|
import com.earth2me.essentials.register.payment.Methods;
|
||||||
import com.earth2me.essentials.utils.DateUtil;
|
import com.earth2me.essentials.utils.DateUtil;
|
||||||
|
import com.earth2me.essentials.utils.EnumUtil;
|
||||||
import com.earth2me.essentials.utils.FormatUtil;
|
import com.earth2me.essentials.utils.FormatUtil;
|
||||||
import com.earth2me.essentials.utils.NumberUtil;
|
import com.earth2me.essentials.utils.NumberUtil;
|
||||||
import com.earth2me.essentials.utils.VersionUtil;
|
import com.earth2me.essentials.utils.VersionUtil;
|
||||||
@ -18,6 +19,7 @@ import net.ess3.api.events.UserBalanceUpdateEvent;
|
|||||||
import net.essentialsx.api.v2.events.TransactionEvent;
|
import net.essentialsx.api.v2.events.TransactionEvent;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.Statistic;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
||||||
@ -41,6 +43,7 @@ import java.util.logging.Logger;
|
|||||||
import static com.earth2me.essentials.I18n.tl;
|
import static com.earth2me.essentials.I18n.tl;
|
||||||
|
|
||||||
public class User extends UserData implements Comparable<User>, IMessageRecipient, net.ess3.api.IUser {
|
public class User extends UserData implements Comparable<User>, IMessageRecipient, net.ess3.api.IUser {
|
||||||
|
private static final Statistic PLAY_ONE_TICK = EnumUtil.getStatistic("PLAY_ONE_MINUTE", "PLAY_ONE_TICK");
|
||||||
private static final Logger logger = Logger.getLogger("Essentials");
|
private static final Logger logger = Logger.getLogger("Essentials");
|
||||||
private final IMessageRecipient messageRecipient;
|
private final IMessageRecipient messageRecipient;
|
||||||
private transient final AsyncTeleport teleport;
|
private transient final AsyncTeleport teleport;
|
||||||
@ -595,12 +598,21 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
|
|||||||
|
|
||||||
//Returns true if status expired during this check
|
//Returns true if status expired during this check
|
||||||
public boolean checkJailTimeout(final long currentTime) {
|
public boolean checkJailTimeout(final long currentTime) {
|
||||||
if (getJailTimeout() > 0 && getJailTimeout() < currentTime && isJailed()) {
|
if (getJailTimeout() > 0) {
|
||||||
|
|
||||||
|
if (getOnlineJailedTime() > 0) {
|
||||||
|
if (getOnlineJailedTime() > getBase().getStatistic(PLAY_ONE_TICK)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getJailTimeout() < currentTime && isJailed() ) {
|
||||||
final JailStatusChangeEvent event = new JailStatusChangeEvent(this, null, false);
|
final JailStatusChangeEvent event = new JailStatusChangeEvent(this, null, false);
|
||||||
ess.getServer().getPluginManager().callEvent(event);
|
ess.getServer().getPluginManager().callEvent(event);
|
||||||
|
|
||||||
if (!event.isCancelled()) {
|
if (!event.isCancelled()) {
|
||||||
setJailTimeout(0);
|
setJailTimeout(0);
|
||||||
|
setOnlineJailedTime(0);
|
||||||
setJailed(false);
|
setJailed(false);
|
||||||
sendMessage(tl("haveBeenReleased"));
|
sendMessage(tl("haveBeenReleased"));
|
||||||
setJail(null);
|
setJail(null);
|
||||||
@ -615,6 +627,7 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,6 +122,7 @@ public abstract class UserData extends PlayerExtension implements IConf {
|
|||||||
muteReason = _getMuteReason();
|
muteReason = _getMuteReason();
|
||||||
jailed = _getJailed();
|
jailed = _getJailed();
|
||||||
jailTimeout = _getJailTimeout();
|
jailTimeout = _getJailTimeout();
|
||||||
|
onlineJailed = _getOnlineJailedTime();
|
||||||
lastLogin = _getLastLogin();
|
lastLogin = _getLastLogin();
|
||||||
lastLogout = _getLastLogout();
|
lastLogout = _getLastLogout();
|
||||||
lastLoginAddress = _getLastLoginAddress();
|
lastLoginAddress = _getLastLoginAddress();
|
||||||
@ -660,6 +661,22 @@ public abstract class UserData extends PlayerExtension implements IConf {
|
|||||||
config.save();
|
config.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private long onlineJailed;
|
||||||
|
|
||||||
|
private long _getOnlineJailedTime() {
|
||||||
|
return config.getLong("timestamps.onlinejail", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getOnlineJailedTime() {
|
||||||
|
return onlineJailed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnlineJailedTime(long onlineJailed) {
|
||||||
|
this.onlineJailed = onlineJailed;
|
||||||
|
config.setProperty("timestamps.onlinejail", onlineJailed);
|
||||||
|
config.save();
|
||||||
|
}
|
||||||
|
|
||||||
private long _getLastLogin() {
|
private long _getLastLogin() {
|
||||||
return config.getLong("timestamps.login", 0);
|
return config.getLong("timestamps.login", 0);
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,10 @@ package com.earth2me.essentials.commands;
|
|||||||
import com.earth2me.essentials.CommandSource;
|
import com.earth2me.essentials.CommandSource;
|
||||||
import com.earth2me.essentials.User;
|
import com.earth2me.essentials.User;
|
||||||
import com.earth2me.essentials.utils.DateUtil;
|
import com.earth2me.essentials.utils.DateUtil;
|
||||||
|
import com.earth2me.essentials.utils.EnumUtil;
|
||||||
import net.ess3.api.events.JailStatusChangeEvent;
|
import net.ess3.api.events.JailStatusChangeEvent;
|
||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
|
import org.bukkit.Statistic;
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -15,6 +17,8 @@ import java.util.concurrent.CompletableFuture;
|
|||||||
import static com.earth2me.essentials.I18n.tl;
|
import static com.earth2me.essentials.I18n.tl;
|
||||||
|
|
||||||
public class Commandtogglejail extends EssentialsCommand {
|
public class Commandtogglejail extends EssentialsCommand {
|
||||||
|
private static final Statistic PLAY_ONE_TICK = EnumUtil.getStatistic("PLAY_ONE_MINUTE", "PLAY_ONE_TICK");
|
||||||
|
|
||||||
public Commandtogglejail() {
|
public Commandtogglejail() {
|
||||||
super("togglejail");
|
super("togglejail");
|
||||||
}
|
}
|
||||||
@ -44,13 +48,15 @@ public class Commandtogglejail extends EssentialsCommand {
|
|||||||
ess.getServer().getPluginManager().callEvent(event);
|
ess.getServer().getPluginManager().callEvent(event);
|
||||||
|
|
||||||
if (!event.isCancelled()) {
|
if (!event.isCancelled()) {
|
||||||
|
long displayTime = 0;
|
||||||
long preTimeDiff = 0;
|
long preTimeDiff = 0;
|
||||||
if (args.length > 2) {
|
if (args.length > 2) {
|
||||||
final String time = getFinalArg(args, 2);
|
final String time = getFinalArg(args, 2);
|
||||||
preTimeDiff = DateUtil.parseDateDiff(time, true);
|
displayTime = DateUtil.parseDateDiff(time, true);
|
||||||
|
preTimeDiff = DateUtil.parseDateDiff(time, true, ess.getSettings().isJailOnlineTime());
|
||||||
}
|
}
|
||||||
final long timeDiff = preTimeDiff;
|
final long timeDiff = preTimeDiff;
|
||||||
|
final long finalDisplayTime = displayTime;
|
||||||
final CompletableFuture<Boolean> future = getNewExceptionFuture(sender, commandLabel);
|
final CompletableFuture<Boolean> future = getNewExceptionFuture(sender, commandLabel);
|
||||||
future.thenAccept(success -> {
|
future.thenAccept(success -> {
|
||||||
if (success) {
|
if (success) {
|
||||||
@ -60,8 +66,9 @@ public class Commandtogglejail extends EssentialsCommand {
|
|||||||
player.setJail(args[1]);
|
player.setJail(args[1]);
|
||||||
if (args.length > 2) {
|
if (args.length > 2) {
|
||||||
player.setJailTimeout(timeDiff);
|
player.setJailTimeout(timeDiff);
|
||||||
|
player.setOnlineJailedTime(ess.getSettings().isJailOnlineTime() ? ((player.getBase().getStatistic(PLAY_ONE_TICK)) + (timeDiff / 50)) : 0);
|
||||||
}
|
}
|
||||||
sender.sendMessage(timeDiff > 0 ? tl("playerJailedFor", player.getName(), DateUtil.formatDateDiff(timeDiff)) : tl("playerJailed", player.getName()));
|
sender.sendMessage(timeDiff > 0 ? tl("playerJailedFor", player.getName(), DateUtil.formatDateDiff(finalDisplayTime)) : tl("playerJailed", player.getName()));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (player.getBase().isOnline()) {
|
if (player.getBase().isOnline()) {
|
||||||
|
@ -18,7 +18,11 @@ public final class DateUtil {
|
|||||||
return timePattern.matcher(input).replaceFirst("").trim();
|
return timePattern.matcher(input).replaceFirst("").trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long parseDateDiff(final String time, final boolean future) throws Exception {
|
public static long parseDateDiff(String time, boolean future) throws Exception {
|
||||||
|
return parseDateDiff(time, future, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long parseDateDiff(String time, boolean future, boolean emptyEpoch) throws Exception {
|
||||||
final Matcher m = timePattern.matcher(time);
|
final Matcher m = timePattern.matcher(time);
|
||||||
int years = 0;
|
int years = 0;
|
||||||
int months = 0;
|
int months = 0;
|
||||||
@ -67,6 +71,11 @@ public final class DateUtil {
|
|||||||
throw new Exception(tl("illegalDate"));
|
throw new Exception(tl("illegalDate"));
|
||||||
}
|
}
|
||||||
final Calendar c = new GregorianCalendar();
|
final Calendar c = new GregorianCalendar();
|
||||||
|
|
||||||
|
if (emptyEpoch) {
|
||||||
|
c.setTimeInMillis(0);
|
||||||
|
}
|
||||||
|
|
||||||
if (years > 0) {
|
if (years > 0) {
|
||||||
if (years > maxYears) {
|
if (years > maxYears) {
|
||||||
years = maxYears;
|
years = maxYears;
|
||||||
|
@ -628,6 +628,10 @@ default-enabled-confirm-commands:
|
|||||||
# Whether or not to teleport a player back to their previous position after they have been freed from jail.
|
# Whether or not to teleport a player back to their previous position after they have been freed from jail.
|
||||||
teleport-back-when-freed-from-jail: true
|
teleport-back-when-freed-from-jail: true
|
||||||
|
|
||||||
|
# Whether or not jail time should only be counted while the user is online.
|
||||||
|
# If true, a jailed player's time will only decrement when they are online.
|
||||||
|
jail-online-time: false
|
||||||
|
|
||||||
# Set the timeout, in seconds for players to accept a tpa before the request is cancelled.
|
# Set the timeout, in seconds for players to accept a tpa before the request is cancelled.
|
||||||
# Set to 0 for no timeout.
|
# Set to 0 for no timeout.
|
||||||
tpa-accept-cancellation: 120
|
tpa-accept-cancellation: 120
|
||||||
|
Loading…
Reference in New Issue
Block a user