Skip to content

Commit

Permalink
Dev (#32)
Browse files Browse the repository at this point in the history
* Resolve issues with null repairs

* Add debug for sign text

* Add config option to disable save double click

* Add /repairreport command

* Add repair cancel command

* Add /repairinventory

* Fix #34

* Add the /repairbar command

Command toggles visibility of repair progress boss bars
  • Loading branch information
TylerS1066 authored May 25, 2024
1 parent 6db16c6 commit 30f4a76
Show file tree
Hide file tree
Showing 18 changed files with 652 additions and 87 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@
import com.sk89q.worldedit.bukkit.WorldEditPlugin;

import net.countercraft.movecraft.craft.type.TypeData.InvalidValueException;
import net.countercraft.movecraft.repair.commands.RepairInventoryCommand;
import net.countercraft.movecraft.repair.bar.RepairBarManager;
import net.countercraft.movecraft.repair.bar.config.PlayerManager;
import net.countercraft.movecraft.repair.commands.RepairBarCommand;
import net.countercraft.movecraft.repair.commands.RepairCancelCommand;
import net.countercraft.movecraft.repair.commands.RepairListCommand;
import net.countercraft.movecraft.repair.commands.RepairReportCommand;
import net.countercraft.movecraft.repair.config.Config;
import net.countercraft.movecraft.repair.localisation.I18nSupport;
import net.countercraft.movecraft.repair.types.blobs.ListBlob;
Expand All @@ -39,8 +46,15 @@ public static MovecraftRepair getInstance() {
public void onEnable() {
instance = this;

// Save default config, create default userdata and language if needed
saveDefaultConfig();

File folder = new File(getDataFolder(), "userdata");
if (!folder.exists()) {
getLogger().info("Created userdata directory");
folder.mkdirs();
}

String[] languages = { "en" };
for (String s : languages) {
if (!new File(getDataFolder() + "/localisation/mc-repairlang_" + s + ".properties").exists()) {
Expand Down Expand Up @@ -82,14 +96,21 @@ public void onEnable() {
protoRepairCache = new ProtoRepairCache();
protoRepairCache.runTaskTimerAsynchronously(this, 10, 200);

var playerManager = new PlayerManager();
getServer().getPluginManager().registerEvents(playerManager, this);

// Startup repair bar manager (every second)
RepairBarManager repairBarManager = new RepairBarManager();
RepairBarManager repairBarManager = new RepairBarManager(playerManager);
repairBarManager.runTaskTimerAsynchronously(this, 15, 20);
getServer().getPluginManager().registerEvents(repairBarManager, this);

getServer().getPluginManager().registerEvents(new RepairSign(), this);

getCommand("repairbar").setExecutor(new RepairBarCommand(playerManager));
getCommand("repaircancel").setExecutor(new RepairCancelCommand());
getCommand("repairinventory").setExecutor(new RepairInventoryCommand());
getCommand("repairlist").setExecutor(new RepairListCommand());
getCommand("repairreport").setExecutor(new RepairReportCommand());
}

private static void loadConfig(FileConfiguration config) {
Expand All @@ -102,6 +123,7 @@ private static void loadConfig(FileConfiguration config) {
Config.RepairMaxBlocksPerTick = config.getInt("RepairMaxBlocksPerTick", 2);
Config.RepairMoneyPerBlock = config.getDouble("RepairMoneyPerBlock", 0.0);
Config.RepairMaxPercent = config.getDouble("RepairMaxPercent", 50);
Config.DisableDoubleClick = config.getBoolean("DisableDoubleClick", false);
Config.RepairTool = Material.valueOf(config.getString("RepairTool", "firework_rocket").toUpperCase());
Object entry = config.get("RepairBlobs");
if (!(entry instanceof List)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.bukkit.Bukkit;
import org.bukkit.scheduler.BukkitRunnable;
import net.countercraft.movecraft.repair.config.Config;
import net.countercraft.movecraft.repair.events.RepairCancelledEvent;
import net.countercraft.movecraft.repair.events.RepairFinishedEvent;
import net.countercraft.movecraft.repair.events.RepairStartedEvent;
import net.countercraft.movecraft.repair.types.Repair;
Expand Down Expand Up @@ -55,6 +56,13 @@ public void start(Repair repair) {
repairs.add(repair);
}

public void cancel(Repair repair) {
Bukkit.getPluginManager().callEvent(new RepairCancelledEvent(repair));

MovecraftRepair.getInstance().getLogger().info(() -> String.format("%s has cancelled repair %s with the cost of %.2f", repair.getPlayerUUID(), repair.getName(), repair.getCost()));
repairs.remove(repair);
}

private void end(Repair repair) {
Bukkit.getPluginManager().callEvent(new RepairFinishedEvent(repair));

Expand Down
73 changes: 38 additions & 35 deletions src/main/java/net/countercraft/movecraft/repair/RepairSign.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ public void onSignClick(PlayerInteractEvent event) {
event.setCancelled(true);
Player player = event.getPlayer();
if (Config.RepairTicksPerBlock == 0) {
player.sendMessage(I18nSupport.getInternationalisedString("Repair functionality is disabled or WorldEdit was not detected"));
player.sendMessage(I18nSupport
.getInternationalisedString("Repair functionality is disabled or WorldEdit was not detected"));
return;
}

Expand All @@ -78,7 +79,7 @@ public void onSignClick(PlayerInteractEvent event) {
player.sendMessage(I18nSupport.getInternationalisedString("Insufficient Permissions"));
return;
}

if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
onRightClick(sign, player, craft);
} else if (event.getAction() == Action.LEFT_CLICK_BLOCK) {
Expand All @@ -103,39 +104,38 @@ public void onRightClick(Sign sign, Player player, PlayerCraft craft) {
Repair repair = null;
try {
repair = protoRepair.execute(craft, sign);
}
catch (ProtoRepair.NotEnoughMoneyException e) {
} catch (ProtoRepair.NotEnoughMoneyException e) {
// Not enough money, tell the player
player.sendMessage(I18nSupport.getInternationalisedString("Economy - Not Enough Money"));
}
catch (ProtoRepair.NotEnoughItemsException e) {
} catch (ProtoRepair.NotEnoughItemsException e) {
// Not enough items, tell the player
for (RepairBlob blob : e.getRemaining().getKeySet()) {
player.sendMessage(
I18nSupport.getInternationalisedString("Repair - Need more of material")
+ String.format(
": %s - %d",
blob.getName(),
(int) Math.ceil(e.getRemaining().get(blob))
)
);
I18nSupport.getInternationalisedString("Repair - Need more of material")
+ String.format(
": %s - %d",
blob.getName(),
(int) Math.ceil(e.getRemaining().get(blob))));
}
return;
}
catch (ProtoRepair.ProtoRepairExpiredException | ProtoRepair.ProtoRepairLocationException e) {
} catch (ProtoRepair.ProtoRepairExpiredException | ProtoRepair.ProtoRepairLocationException e) {
// Expired or wrong location, go back to first click
// ItemRemovalException shouldn't happen, but go back to first click regardless
createProtoRepair(sign, uuid, player, craft);
return;
}
catch (Exception e) {
} catch (Exception e) {
// Something weird went wrong, let it fail silently
e.printStackTrace();
return;
}

// Release the craft, and start the repair
CraftManager.getInstance().release(craft, CraftReleaseEvent.Reason.REPAIR, true); // Note: This change is "temporary" and means that repairs allow the player to repilot and could have damaging effects on combat releases
CraftManager.getInstance().release(craft, CraftReleaseEvent.Reason.REPAIR, true); // Note: This change is
// "temporary" and means that
// repairs allow the player to
// repilot and could have
// damaging effects on combat
// releases
MovecraftRepair.getInstance().getRepairManager().start(repair);
}

Expand All @@ -146,8 +146,7 @@ private void createProtoRepair(Sign sign, UUID uuid, Player player, PlayerCraft
RepairState state;
try {
state = new RepairState(uuid, stateName);
}
catch (IOException e) {
} catch (IOException e) {
player.sendMessage(I18nSupport.getInternationalisedString("Repair - State not found"));
return;
}
Expand All @@ -156,8 +155,7 @@ private void createProtoRepair(Sign sign, UUID uuid, Player player, PlayerCraft
ProtoRepair protoRepair;
try {
protoRepair = state.execute(sign);
}
catch (WorldEditException e) {
} catch (WorldEditException e) {
player.sendMessage(I18nSupport.getInternationalisedString("Repair - State not found"));
return;
}
Expand All @@ -166,38 +164,43 @@ private void createProtoRepair(Sign sign, UUID uuid, Player player, PlayerCraft
return;
}

player.sendMessage(I18nSupport.getInternationalisedString("Repair - Total damaged blocks") + ": " + protoRepair.getDamagedBlockCount());
player.sendMessage(I18nSupport.getInternationalisedString("Repair - Total damaged blocks") + ": "
+ protoRepair.getDamagedBlockCount());
double percent = 100.0 * protoRepair.getDamagedBlockCount() / craft.getHitBox().size();
player.sendMessage(I18nSupport.getInternationalisedString("Repair - Percentage of craft") + String.format(": %.2f", percent));
player.sendMessage(I18nSupport.getInternationalisedString("Repair - Percentage of craft")
+ String.format(": %.2f", percent));
if (percent > Config.RepairMaxPercent) {
player.sendMessage(I18nSupport.getInternationalisedString("Repair - Failed Craft Too Damaged"));
return;
}

for (RepairBlob blob : protoRepair.getMaterials().getKeySet()) {
player.sendMessage(String.format(
"%s : %d",
blob.getName(),
(int) Math.ceil(protoRepair.getMaterials().get(blob))
));
"%s : %d",
blob.getName(),
(int) Math.ceil(protoRepair.getMaterials().get(blob))));
}

long duration = (long) Math.ceil(protoRepair.getQueue().size() * Config.RepairTicksPerBlock / 20.0);
player.sendMessage(I18nSupport.getInternationalisedString("Repair - Seconds to complete repair") + String.format(": %d", duration));
player.sendMessage(I18nSupport.getInternationalisedString("Repair - Seconds to complete repair")
+ String.format(": %d", duration));

player.sendMessage(I18nSupport.getInternationalisedString("Repair - Money to complete repair") + String.format(": %.2f", protoRepair.getQueue().size() * Config.RepairMoneyPerBlock));
player.sendMessage(I18nSupport.getInternationalisedString("Repair - Money to complete repair")
+ String.format(": %.2f", protoRepair.getQueue().size() * Config.RepairMoneyPerBlock));

// Add to cache only if not empty
if (!protoRepair.getQueue().isEmpty())
MovecraftRepair.getInstance().getProtoRepairCache().add(protoRepair);
}

public void onLeftClick(Sign sign, Player player, PlayerCraft craft) {
Long lastLeftClick = leftClickCache.get(player.getUniqueId());
if (lastLeftClick == null || (System.currentTimeMillis() - lastLeftClick.longValue() > 5000)) {
// First click, just add to the map
leftClickCache.put(player.getUniqueId(), System.currentTimeMillis());
return;
if (!Config.DisableDoubleClick) {
Long lastLeftClick = leftClickCache.get(player.getUniqueId());
if (lastLeftClick == null || (System.currentTimeMillis() - lastLeftClick.longValue() > 5000)) {
// First click, just add to the map
leftClickCache.put(player.getUniqueId(), System.currentTimeMillis());
return;
}
}

if (!WEUtils.saveCraftSchematic(craft, sign)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.countercraft.movecraft.repair;
package net.countercraft.movecraft.repair.bar;

import java.util.HashMap;
import java.util.Map;
Expand All @@ -13,23 +13,43 @@
import org.bukkit.scheduler.BukkitRunnable;
import org.jetbrains.annotations.NotNull;

import net.countercraft.movecraft.repair.bar.config.PlayerManager;
import net.countercraft.movecraft.repair.events.RepairCancelledEvent;
import net.countercraft.movecraft.repair.events.RepairFinishedEvent;
import net.countercraft.movecraft.repair.events.RepairStartedEvent;
import net.countercraft.movecraft.repair.localisation.I18nSupport;
import net.countercraft.movecraft.repair.types.Repair;

public class RepairBarManager extends BukkitRunnable implements Listener {
@NotNull
private final PlayerManager manager;
private Map<Repair, BossBar> bossBars = new HashMap<>();

public RepairBarManager(@NotNull PlayerManager manager) {
this.manager = manager;
}

@Override
public void run() {
if (bossBars.get(null) != null) {
// If we have a null key, remove the bossbar
BossBar bossBar = bossBars.get(null);
bossBars.remove(null);
bossBar.setVisible(false);
bossBar.removeAll();
}

for (Map.Entry<Repair, BossBar> entry : bossBars.entrySet()) {
Repair repair = entry.getKey();
BossBar bossBar = entry.getValue();

Player player = Bukkit.getPlayer(repair.getPlayerUUID());
if (player != null) {
bossBar.addPlayer(player);
if (manager.getBarSetting(player)) {
bossBar.addPlayer(player);
} else {
bossBar.removePlayer(player);
}
}

int remaining = repair.remaining();
Expand All @@ -45,28 +65,42 @@ public void run() {
public void onRepairStart(@NotNull RepairStartedEvent event) {
Repair repair = event.getRepair();

BossBar bossBar = Bukkit.createBossBar(null, BarColor.WHITE, BarStyle.SOLID);
BossBar bossBar = Bukkit.createBossBar(repair.getName(), BarColor.WHITE, BarStyle.SOLID);
bossBar.setProgress(0.0);
bossBars.put(repair, bossBar);

Player player = Bukkit.getPlayer(repair.getPlayerUUID());
if (player != null) {
bossBar.addPlayer(player);
player.sendMessage(I18nSupport.getInternationalisedString("Repair - Repairs underway"));
if (manager.getBarSetting(player)) {
bossBar.addPlayer(player);
} else {
bossBar.removePlayer(player);
}
}
}

@EventHandler
public void onRepairFinished(@NotNull RepairFinishedEvent event) {
Repair repair = event.getRepair();
BossBar bossBar = bossBars.get(repair);

bossBars.remove(repair);
bossBar.setVisible(false);
remove(event.getRepair());

Player player = Bukkit.getPlayer(repair.getPlayerUUID());
Player player = Bukkit.getPlayer(event.getRepair().getPlayerUUID());
if (player == null)
return;

player.sendMessage(I18nSupport.getInternationalisedString("Repair - Repairs complete"));
}

@EventHandler
public void onRepairCancelled(@NotNull RepairCancelledEvent event) {
remove(event.getRepair());
}

private void remove(Repair repair) {
BossBar bossBar = bossBars.get(repair);

bossBars.remove(repair);
bossBar.setVisible(false);
bossBar.removeAll();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package net.countercraft.movecraft.repair.bar.config;

import org.jetbrains.annotations.Nullable;

import java.util.UUID;

public class PlayerConfig {
@Nullable
private UUID owner;
private boolean barSetting = true;

public PlayerConfig() {
}

public PlayerConfig(UUID owner) {
this.owner = owner;
}

@Nullable
public UUID getOwner() {
return owner;
}

public boolean getBarSetting() {
return barSetting;
}

public void toggleBarSetting() {
barSetting = !barSetting;
}
}
Loading

0 comments on commit 30f4a76

Please sign in to comment.