introduced AntiInventoryMove appliance with related listeners and optimized admin notification logic in AcInform
This commit is contained in:
@@ -5,15 +5,10 @@ import eu.mhsl.craftattack.spawn.core.Main;
|
|||||||
import eu.mhsl.craftattack.spawn.core.appliance.Appliance;
|
import eu.mhsl.craftattack.spawn.core.appliance.Appliance;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Boat;
|
import org.bukkit.entity.Boat;
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public class AntiBoatFreecam extends Appliance {
|
public class AntiBoatFreecam extends Appliance {
|
||||||
private static final float MAX_YAW_OFFSET = 106.0f;
|
private static final float MAX_YAW_OFFSET = 106.0f;
|
||||||
private final Map<Player, Float> violatedPlayers = new HashMap<>();
|
|
||||||
|
|
||||||
public AntiBoatFreecam() {
|
public AntiBoatFreecam() {
|
||||||
Bukkit.getScheduler().runTaskTimerAsynchronously(
|
Bukkit.getScheduler().runTaskTimerAsynchronously(
|
||||||
@@ -27,14 +22,12 @@ public class AntiBoatFreecam extends Appliance {
|
|||||||
float yawDelta = wrapDegrees(playerYaw - boatYaw);
|
float yawDelta = wrapDegrees(playerYaw - boatYaw);
|
||||||
if(Math.abs(yawDelta) <= MAX_YAW_OFFSET) return;
|
if(Math.abs(yawDelta) <= MAX_YAW_OFFSET) return;
|
||||||
|
|
||||||
this.violatedPlayers.merge(player, 1f, Float::sum);
|
Main.instance().getAppliance(AcInform.class).slowedNotifyAdmins(
|
||||||
float violationCount = this.violatedPlayers.get(player);
|
|
||||||
if(violationCount != 1 && violationCount % 100 != 0) return;
|
|
||||||
Main.instance().getAppliance(AcInform.class).notifyAdmins(
|
|
||||||
"internal",
|
"internal",
|
||||||
player.getName(),
|
player.getName(),
|
||||||
"illegalBoatLookYaw",
|
"illegalBoatLookYaw",
|
||||||
violationCount
|
yawDelta,
|
||||||
|
3000
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
1L,
|
1L,
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package eu.mhsl.craftattack.spawn.common.appliances.security.antiInventoryMove;
|
||||||
|
|
||||||
|
import eu.mhsl.craftattack.spawn.core.appliance.Appliance;
|
||||||
|
import net.kyori.adventure.util.Ticks;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
public class AntiInventoryMove extends Appliance {
|
||||||
|
private static final long errorTimeMargin = Ticks.SINGLE_TICK_DURATION_MS * 2;
|
||||||
|
|
||||||
|
private final Map<UUID, Long> invOpen = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
public void setInvOpen(Player player, boolean open) {
|
||||||
|
if(open)
|
||||||
|
this.invOpen.put(player.getUniqueId(), System.currentTimeMillis());
|
||||||
|
else
|
||||||
|
this.invOpen.remove(player.getUniqueId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasInventoryOpen(Player player) {
|
||||||
|
if(!this.invOpen.containsKey(player.getUniqueId())) return false;
|
||||||
|
return this.invOpen.get(player.getUniqueId()) < System.currentTimeMillis() - errorTimeMargin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @NotNull List<Listener> listeners() {
|
||||||
|
return List.of(
|
||||||
|
new InventoryTrackerListener(),
|
||||||
|
new InInventoryMoveListener()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package eu.mhsl.craftattack.spawn.common.appliances.security.antiInventoryMove;
|
||||||
|
|
||||||
|
import eu.mhsl.craftattack.spawn.common.appliances.tooling.acInform.AcInform;
|
||||||
|
import eu.mhsl.craftattack.spawn.core.Main;
|
||||||
|
import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.player.PlayerInputEvent;
|
||||||
|
|
||||||
|
class InInventoryMoveListener extends ApplianceListener<AntiInventoryMove> {
|
||||||
|
@EventHandler
|
||||||
|
public void onInput(PlayerInputEvent event) {
|
||||||
|
if(!this.getAppliance().hasInventoryOpen(event.getPlayer())) return;
|
||||||
|
Main.instance().getAppliance(AcInform.class).slowedNotifyAdmins(
|
||||||
|
"internal",
|
||||||
|
event.getPlayer().getName(),
|
||||||
|
"inInventoryMove",
|
||||||
|
-1f,
|
||||||
|
3000
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package eu.mhsl.craftattack.spawn.common.appliances.security.antiInventoryMove;
|
||||||
|
|
||||||
|
import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||||
|
import org.bukkit.event.inventory.InventoryOpenEvent;
|
||||||
|
|
||||||
|
class InventoryTrackerListener extends ApplianceListener<AntiInventoryMove> {
|
||||||
|
@EventHandler
|
||||||
|
public void onOpen(InventoryOpenEvent event) {
|
||||||
|
if(!(event.getPlayer() instanceof Player player)) return;
|
||||||
|
this.getAppliance().setInvOpen(player, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onClose(InventoryCloseEvent event) {
|
||||||
|
if(!(event.getPlayer() instanceof Player player)) return;
|
||||||
|
this.getAppliance().setInvOpen(player, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,14 +11,20 @@ import org.bukkit.Bukkit;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
public class AcInform extends Appliance {
|
public class AcInform extends Appliance {
|
||||||
|
private final Map<String, Map<String, Long>> violationSlowdowns = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
public void processCommand(@NotNull String[] args) {
|
public void processCommand(@NotNull String[] args) {
|
||||||
String anticheatName = null;
|
String anticheatName = null;
|
||||||
String playerName = null;
|
String playerName = null;
|
||||||
String checkName = null;
|
String checkName = null;
|
||||||
Float violationCount = null;
|
Float violationCount = null;
|
||||||
|
int notifyEvery = 0;
|
||||||
|
|
||||||
for(int i = 0; i < args.length; i++) {
|
for(int i = 0; i < args.length; i++) {
|
||||||
if(!args[i].startsWith("--")) continue;
|
if(!args[i].startsWith("--")) continue;
|
||||||
@@ -36,13 +42,32 @@ public class AcInform extends Appliance {
|
|||||||
case "--playerName" -> playerName = value;
|
case "--playerName" -> playerName = value;
|
||||||
case "--check" -> checkName = value;
|
case "--check" -> checkName = value;
|
||||||
case "--violationCount" -> violationCount = value.isEmpty() ? null : Float.valueOf(value);
|
case "--violationCount" -> violationCount = value.isEmpty() ? null : Float.valueOf(value);
|
||||||
|
case "--notifyEvery" -> notifyEvery = Integer.parseInt(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(notifyEvery == 0) {
|
||||||
|
this.notifyAdmins(anticheatName, playerName, checkName, violationCount);
|
||||||
|
} else {
|
||||||
|
this.slowedNotifyAdmins(anticheatName, playerName, checkName, violationCount, notifyEvery);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void slowedNotifyAdmins(@Nullable String anticheatName, @Nullable String playerName, @Nullable String checkName, @Nullable Float violationCount, int notifyEvery) {
|
||||||
|
this.violationSlowdowns.putIfAbsent(playerName, new HashMap<>());
|
||||||
|
|
||||||
|
var slowdowns = this.violationSlowdowns.get(playerName);
|
||||||
|
if(slowdowns.containsKey(checkName)) {
|
||||||
|
if(slowdowns.get(checkName) > System.currentTimeMillis() - notifyEvery) return;
|
||||||
|
}
|
||||||
|
|
||||||
this.notifyAdmins(anticheatName, playerName, checkName, violationCount);
|
this.notifyAdmins(anticheatName, playerName, checkName, violationCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void notifyAdmins(@Nullable String anticheatName, @Nullable String playerName, @Nullable String checkName, @Nullable Float violationCount) {
|
public void notifyAdmins(@Nullable String anticheatName, @Nullable String playerName, @Nullable String checkName, @Nullable Float violationCount) {
|
||||||
|
this.violationSlowdowns.putIfAbsent(playerName, new HashMap<>());
|
||||||
|
this.violationSlowdowns.get(playerName).put(checkName, System.currentTimeMillis());
|
||||||
|
|
||||||
ComponentBuilder<TextComponent, TextComponent.Builder> component = Component.text();
|
ComponentBuilder<TextComponent, TextComponent.Builder> component = Component.text();
|
||||||
NamedTextColor textColor = NamedTextColor.GRAY;
|
NamedTextColor textColor = NamedTextColor.GRAY;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user