Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
135 changes: 85 additions & 50 deletions src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.util.Vector;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
Expand All @@ -14,6 +17,8 @@
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.util.RayTraceResult;

import vg.civcraft.mc.citadel.Citadel;
import vg.civcraft.mc.citadel.CitadelPermissionHandler;
import vg.civcraft.mc.citadel.CitadelUtility;
Expand All @@ -28,6 +33,7 @@
import vg.civcraft.mc.civmodcore.playersettings.PlayerSetting;
import vg.civcraft.mc.civmodcore.playersettings.SettingChangeListener;
import vg.civcraft.mc.civmodcore.playersettings.impl.DisplayLocationSetting;
import vg.civcraft.mc.civmodcore.ratelimiting.RateLimiter;
import vg.civcraft.mc.civmodcore.scoreboard.bottom.BottomLine;
import vg.civcraft.mc.civmodcore.scoreboard.bottom.BottomLineAPI;
import vg.civcraft.mc.civmodcore.scoreboard.side.CivScoreBoard;
Expand Down Expand Up @@ -198,60 +204,89 @@ public void handleInteractBlock(PlayerInteractEvent e) {
if (!settingMan.getInformationMode().getValue(e.getPlayer())) {
return;
}
Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getClickedBlock());
Player player = e.getPlayer();
boolean showChat = settingMan.shouldShowChatInCti(player.getUniqueId());
if (rein == null) {
if (showChat) {
CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.YELLOW, "Not reinforced");
}
return;
}
if (player.getGameMode() == GameMode.CREATIVE && e.getAction() == Action.LEFT_CLICK_BLOCK) {
e.setCancelled(true);
}
Location playerLoc = player.getEyeLocation();

RateLimiter raytrace_rateLimiter = settingMan.getRateLimiter();
boolean isRateLimited = !raytrace_rateLimiter.pullToken(player);
boolean showHolo = settingMan.shouldShowHologramInCti(player.getUniqueId());
if (!rein.hasPermission(player, CitadelPermissionHandler.getInfo())) {
if (showChat) {
Citadel.getInstance().getSettingManager().sendCtiEnemyMessage(player, rein);
}
if (showHolo) {
showHolo(rein, player);
}
return;
}
if (showChat) {
StringBuilder sb = new StringBuilder();
sb.append(String.format("Reinforced at %s%s health with %s%s %son %s%s ", formatHealth(rein),
ChatColor.GREEN, ChatColor.AQUA, rein.getType().getName(), ChatColor.GREEN, ChatColor.LIGHT_PURPLE,
rein.getGroup().getName()));
if (!rein.isMature()) {
sb.append(ChatColor.GOLD);
sb.append(formatProgress(rein.getCreationTime(), rein.getType().getMaturationTime(), "mature"));
sb.append(" ");
}
if (rein.isInsecure()) {
sb.append(ChatColor.AQUA);
sb.append("(Insecure) ");
}
if (ReinforcementLogic.getDecayDamage(rein) != 1) {
String ctiDecayAmountFormat = commaFormat.format(ReinforcementLogic.getDecayDamage(rein));
sb.append(String.format("%s(Decayed x%s) ", ChatColor.LIGHT_PURPLE, ctiDecayAmountFormat));
}
AcidManager acidMan = Citadel.getInstance().getAcidManager();
if (acidMan.isPossibleAcidBlock(e.getClickedBlock())) {
sb.append(ChatColor.GOLD);
long remainingTime = acidMan.getRemainingAcidMaturationTime(rein);
if (remainingTime == 0) {
sb.append("Acid ready");
} else {
sb.append(String.format("%sAcid block mature in %s", ChatColor.YELLOW, TextUtil.formatDuration(remainingTime, TimeUnit.MILLISECONDS)));
int xdist = settingMan.ctiXdist(player.getUniqueId());
int ydist = settingMan.ctiYdist(player.getUniqueId());
int zdist = settingMan.ctiZdist(player.getUniqueId());

for (int x = -xdist; x <=xdist; x++) {
for (int y = -ydist; y <=ydist; y++) {
for (int z = -zdist; z <=zdist; z++) {
final Block block = e.getClickedBlock().getRelative(x,y,z);
if (x == 0 && y == 0 && z == 0) {
final Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block);
boolean showChat = settingMan.shouldShowChatInCti(player.getUniqueId());
if (rein == null) {
if (showChat) {
CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.YELLOW, "Not reinforced");
}
continue;
}
if (player.getGameMode() == GameMode.CREATIVE && e.getAction() == Action.LEFT_CLICK_BLOCK) {
e.setCancelled(true);
}
if (!rein.hasPermission(player, CitadelPermissionHandler.getInfo())) {
if (showChat) {
Citadel.getInstance().getSettingManager().sendCtiEnemyMessage(player, rein);
}
if (showHolo) {
showHolo(rein, player);
}
continue;
}
if (showChat) {
StringBuilder sb = new StringBuilder();
sb.append(String.format("Reinforced at %s%s health with %s%s %son %s%s ", formatHealth(rein),
ChatColor.GREEN, ChatColor.AQUA, rein.getType().getName(), ChatColor.GREEN, ChatColor.LIGHT_PURPLE,
rein.getGroup().getName()));
if (!rein.isMature()) {
sb.append(ChatColor.GOLD);
sb.append(formatProgress(rein.getCreationTime(), rein.getType().getMaturationTime(), "mature"));
sb.append(" ");
}
if (rein.isInsecure()) {
sb.append(ChatColor.AQUA);
sb.append("(Insecure) ");
}
if (ReinforcementLogic.getDecayDamage(rein) != 1) {
String ctiDecayAmountFormat = commaFormat.format(ReinforcementLogic.getDecayDamage(rein));
sb.append(String.format("%s(Decayed x%s) ", ChatColor.LIGHT_PURPLE, ctiDecayAmountFormat));
}
AcidManager acidMan = Citadel.getInstance().getAcidManager();
if (acidMan.isPossibleAcidBlock(block)) {
sb.append(ChatColor.GOLD);
long remainingTime = acidMan.getRemainingAcidMaturationTime(rein);
if (remainingTime == 0) {
sb.append("Acid ready");
} else {
sb.append(String.format("%sAcid block mature in %s", ChatColor.YELLOW, TextUtil.formatDuration(remainingTime, TimeUnit.MILLISECONDS)));
}
}
CitadelUtility.sendAndLog(player, ChatColor.GREEN, sb.toString().trim());
}
if (showHolo) {
showHolo(rein, player);
}
} else if (showHolo && !isRateLimited && block.isSolid()) {
Vector blockLoc = block.getLocation().toVector().add(new Vector(0.5, 0.5, 0.5));
Vector direction = blockLoc.clone().subtract(playerLoc.toVector());
direction.normalize();

RayTraceResult ray = player.getWorld().rayTraceBlocks(playerLoc, direction, blockLoc.distance(playerLoc.toVector()));
if (ray != null && ray.getHitBlock() != null && ray.getHitBlock().equals(block)) {
Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block);
if (rein != null) {
showHolo(rein, player);
}
}
}
}
}
CitadelUtility.sendAndLog(player, ChatColor.GREEN, sb.toString().trim());
}
if (showHolo) {
showHolo(rein, player);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import vg.civcraft.mc.citadel.ReinforcementLogic;
import vg.civcraft.mc.citadel.listener.ModeListener;
import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType;
import vg.civcraft.mc.civmodcore.ratelimiting.RateLimiter;
import vg.civcraft.mc.civmodcore.ratelimiting.RateLimiting;
import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI;
import vg.civcraft.mc.civmodcore.playersettings.gui.MenuSection;
import vg.civcraft.mc.civmodcore.playersettings.impl.BooleanSetting;
Expand All @@ -34,6 +36,11 @@ public class CitadelSettingManager {
private BooleanSetting ctoDisableCtb;

private BoundedIntegerSetting hologramDuration;
private BoundedIntegerSetting ctiXdist;
private BoundedIntegerSetting ctiYdist;
private BoundedIntegerSetting ctiZdist;

private RateLimiter rateLimiter;

private CommandReplySetting ctiNotReinforced;
// private CommandReplySetting ctiAllied;
Expand Down Expand Up @@ -95,10 +102,18 @@ public boolean isInEasyMode(UUID uuid) {
return easyMode.getValue(uuid);
}

public int ctiXdist(UUID uuid) { return ctiXdist.getValue(uuid); }

public int ctiYdist(UUID uuid) { return ctiYdist.getValue(uuid); }

public int ctiZdist(UUID uuid) { return ctiZdist.getValue(uuid); }

public int getHologramDuration(UUID uuid) {
return hologramDuration.getValue(uuid);
}

public RateLimiter getRateLimiter() { return rateLimiter; }

void initSettings() {
MenuSection menu = PlayerSettingAPI.getMainMenu().createMenuSection("Citadel",
"Citadel and reinforcement related settings", new ItemStack(Material.IRON_INGOT));
Expand Down Expand Up @@ -127,6 +142,24 @@ void initSettings() {
"How long should holograms in information mode remain visible, measured in milli seconds", false, 1000,
30000);
PlayerSettingAPI.registerSetting(hologramDuration, menu);

ctiXdist = new BoundedIntegerSetting(Citadel.getInstance(), 0, "cti X distance",
"citadelCtiXdist", new ItemStack(Material.RED_BANNER),
"How far out from block clicked should cti holograms extend", false, 0,
2);
PlayerSettingAPI.registerSetting(ctiXdist, menu);

ctiYdist = new BoundedIntegerSetting(Citadel.getInstance(), 0, "cti Y distance",
"citadelCtiYdist", new ItemStack(Material.GREEN_BANNER),
"How far out from block clicked should cti holograms extend", false, 0,
2);
PlayerSettingAPI.registerSetting(ctiYdist, menu);

ctiZdist = new BoundedIntegerSetting(Citadel.getInstance(), 0, "cti Z distance",
"citadelCtiZdist", new ItemStack(Material.BLUE_BANNER),
"How far out from block clicked should cti holograms extend", false, 0,
2);
PlayerSettingAPI.registerSetting(ctiZdist, menu);

ctbLocationSetting = new DisplayLocationSetting(Citadel.getInstance(), DisplayLocation.NONE, "Bypass display location"
, "citadelBypassDisplayLocation", new ItemStack(Material.GOLDEN_PICKAXE), "bypass");
Expand Down Expand Up @@ -191,6 +224,8 @@ void initSettings() {
"a color representing the reinforcement health");
ctiEnemy.registerArgument("decay_string", "", "the decay of the reinforcement");
PlayerSettingAPI.registerSetting(ctiEnemy, commandSection);

rateLimiter = RateLimiting.createRateLimiter("cti_raytrace" , 6, 6, 1, 2000);
}

public void sendCtiEnemyMessage(Player player, Reinforcement reinforcement) {
Expand Down