diff options
Diffstat (limited to 'src/main/java/net/uomc/mineshaft/farm')
6 files changed, 310 insertions, 12 deletions
diff --git a/src/main/java/net/uomc/mineshaft/farm/Campfire.java b/src/main/java/net/uomc/mineshaft/farm/Campfire.java new file mode 100644 index 0000000..d7d25c7 --- /dev/null +++ b/src/main/java/net/uomc/mineshaft/farm/Campfire.java @@ -0,0 +1,24 @@ +package net.uomc.mineshaft.farm; + +import net.uomc.mineshaft.Mineshaft; +import net.uomc.mineshaft.MineshaftItem; + +class Campfire extends Farm { + + private MineshaftItem cookedItem; + private long cookingTime; + + public Campfire(Mineshaft bot, MineshaftItem item, MineshaftItem cookedItem, long cookingTime) { + super(bot, item); + this.cookedItem = cookedItem; + this.cookingTime = cookingTime; + } + + public MineshaftItem getCookedItem() { + return cookedItem; + } + + public long getCookingTime() { + return cookingTime; + } +} diff --git a/src/main/java/net/uomc/mineshaft/farm/CampfireCommand.java b/src/main/java/net/uomc/mineshaft/farm/CampfireCommand.java new file mode 100644 index 0000000..e3138dc --- /dev/null +++ b/src/main/java/net/uomc/mineshaft/farm/CampfireCommand.java @@ -0,0 +1,258 @@ +package net.uomc.mineshaft.farm; + +import static net.uomc.mineshaft.PlayerHealths.HP_EMOJI; + +import java.awt.Color; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicLong; +import java.util.stream.Stream; + +import com.mouldycheerio.dbot.CustomBot; +import com.mouldycheerio.dbot.commands.CommandDetails; +import com.mouldycheerio.dbot.commands.CommandFail; +import com.mouldycheerio.dbot.commands.DetailedCommand; +import com.mouldycheerio.dbot.util.PeelingUtils; +import com.vdurmont.emoji.EmojiParser; + +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.uomc.mineshaft.Mineshaft; +import net.uomc.mineshaft.MineshaftItem; + +public class CampfireCommand extends DetailedCommand { + + private static final Color COMMAND_COLOUR = PeelingUtils.hex2Rgb("#a45802"); + private static final String COMMAND_TITLE = "Campfire"; + private static final String COMMAND_IMAGE = "https://minecraft.wiki/images/Campfire_%28S%29_JE2_BE2.gif"; + public static final int ITEMS_PER_CAMPFIRE = 4; + public static final long POTATO_COOKING_TIME = 1000l * 40l; + public static final long FISH_COOKING_TIME = 1000l * 90l; + + Mineshaft bot; + List<Campfire> farms; + + public CampfireCommand(Mineshaft bot) { + setCommandDetails(CommandDetails.from("campfire", "cook your food", "farm")); + this.bot = bot; + + farms = new ArrayList<>(); + farms.add(new Campfire(bot, MineshaftItem.FISH, MineshaftItem.COOKED_FISH, FISH_COOKING_TIME)); + farms.add(new Campfire(bot, MineshaftItem.POTATO, MineshaftItem.BAKED_POTATO, POTATO_COOKING_TIME)); + + bot.getCommandController().addCommand("cook", (e, b, args) -> { + execute(e, bot, Stream.concat(Stream.of("cook"), Arrays.stream(args)).toArray(String[]::new)); + }); + } + + @Override + public void execute(MessageReceivedEvent e, CustomBot b, String[] args) throws CommandFail { + Member m = e.getMember(); + List<String> argList = Arrays.asList(args); + + long campfires = bot.getItem(m, MineshaftItem.CAMPFIRE); + + if (campfires < 1) { + b.sendErrorMessage(e, ":x: You need to have at least **" + + bot.getItem(MineshaftItem.CAMPFIRE).prettyValue(1) + + "** to use this!"); + return; + } + + update(m); + + if (args.length > 1 && "cook".equalsIgnoreCase(args[0])) { + if (!cook(e, argList)) + bot.sendErrorMessage(e, String.format(":x: Usage `%scook [potato|fish] [amount] `", bot.getPrefixManager().getPrefix(e.getGuild()))); + return; + } + + StringBuilder description = new StringBuilder(); + description.append(String.format("This is your campfire. You currently have %s\nUse `%scook [potato|fish] [amount]` to cook your food.\n\n", + bot.prettyValue(MineshaftItem.CAMPFIRE, campfires), + bot.getPrefixManager().getPrefix(e.getGuild()) + )); + + Map<MineshaftItem, Long> award = new HashMap<>(); + + List<String> cooking = new ArrayList<>(); + AtomicLong waitingAmount = new AtomicLong(); + + // remove items if there are too many items for the num of campfires + // + long already = farms.stream().mapToLong(f -> f.getPlanted(m) + f.getQuantity(m)).sum(); + if (already > campfires * ITEMS_PER_CAMPFIRE) { + AtomicLong toRemove = new AtomicLong(already - (campfires * ITEMS_PER_CAMPFIRE)); + while (toRemove.get() > 0) { + long amountEach = toRemove.get(); + farms.forEach(f -> { + long amount = amountEach; + if (amount == 0 || toRemove.get() < 1) + return; // we already removed enough + + + if (f.getQuantity(m) >= amount) { + // count the cooked as removed + toRemove.addAndGet(-f.getQuantity(m)); + return; + } + + if (f.getPlanted(m) < amount) { + amount = f.getPlanted(m); + + } + // otherwise remove from planted + toRemove.addAndGet(-amount); + f.setPlanted(m, f.getPlanted(m) - amount); + award.put(f.getItem(), amount); + }); + } + } + + // add the cooked items to the award + // + farms.forEach(farm -> { + long cooked = farm.getQuantity(m); + long waiting = farm.getPlanted(m); + + if (cooked > 0) { + award.put(farm.getCookedItem(), cooked); + farm.setQuantity(m, 0); + cooked = 0; + } + + if (waiting < 1) + return; + + cooking.add(String.format("%s%s", waiting, bot.getItem(farm.getItem()).getSymbol())); + waitingAmount.addAndGet(waiting); + }); + + + if (waitingAmount.get() == 0) { + description.append("*You have nothing on your campfire*\n"); + } else { + description.append("You are currently cooking: " + String.join(",", cooking) + "\n"); + } + + if (award.size() > 0) { + description.append("\n"); + description.append(bot.createItemList(award, "+%s")); + } + + EmbedBuilder em = new EmbedBuilder(); + em.setTitle(COMMAND_TITLE); + em.setThumbnail(COMMAND_IMAGE); + em.setDescription(description); + em.setColor(COMMAND_COLOUR); + + bot.addItems(m, award); + + if (campfires <= 1) { + em.setFooter(EmojiParser.parseToUnicode(":bulb:") + "Get more campfires to cook more food at a time"); + } else { + em.setFooter(EmojiParser.parseToUnicode(":bulb:") + String.format("Cooking food increases the amount of %s it gives when you %seat it.", "HP", bot.getPrefixManager().getPrefix(e.getGuild()))); + } + + e.getMessage().replyEmbeds(em.build()).queue(); + } + + public boolean cook(MessageReceivedEvent e, List<String> args) { + if (args.size() > 3) + return false; + + Optional<String> resourceName = args.stream().filter(s -> !s.equalsIgnoreCase("all") && !s.equalsIgnoreCase("cook") && !PeelingUtils.isLong(s)).findFirst(); + if (resourceName.isEmpty()) + return false; + + MineshaftItem item = MineshaftItem.valueOf(resourceName.get().toUpperCase()); + if (item == null) { + bot.sendErrorMessage(e, ":x: Please provide a valid item!"); + return true; + } + + long campfires = bot.getItem(e.getMember(), MineshaftItem.CAMPFIRE); + + long already = farms.stream().mapToLong(f -> f.getPlanted(e.getMember()) + f.getQuantity(e.getMember())).sum(); + + long q = 0; + Optional<String> all = args.stream().filter(s -> s.equals("all")).findFirst(); + if (all.isEmpty()) { + Optional<Long> quantity = args.stream().filter(s -> PeelingUtils.isLong(s)).map(s -> Long.parseLong(s)).findFirst(); + if (quantity.isEmpty()) + return false; + + q = Math.abs(quantity.get()); + } else { + q = Math.min(bot.getItem(item).get(e.getMember()), (campfires * ITEMS_PER_CAMPFIRE) - already ) ; + } + + + if (already + q > campfires * ITEMS_PER_CAMPFIRE) { + bot.sendErrorMessage(e, String.format(":x: You can only have %s items cooking at the same time!", campfires * ITEMS_PER_CAMPFIRE)); + return true; + } + + Optional<Campfire> farm = farms.stream().filter(f -> f.getItem() == item).findFirst(); + if (farm.isEmpty()) { + bot.sendErrorMessage(e, ":x: This item cannot be cooked"); + return true; + } + + if (q > bot.getItem(item).get(e.getMember())) { + bot.sendErrorMessage(e, ":x: You dont have enough " + bot.getItem(item).getSymbol()); + return true; + } + + if (farm.get().getPlanted(e.getMember()) == 0) { + farm.get().setNextUpdate(e.getMember(), System.currentTimeMillis() + farm.get().getCookingTime()); + } + + bot.removeItem(e.getMember(), item, q); + farm.get().setPlanted(e.getMember(), farm.get().getPlanted(e.getMember()) + q); + + bot.sendSuccessMessage(e, String.format("You put %s on your campfire%s! Come back later when they have finished cooking", bot.getItem(item).prettyValue(q), campfires > 1 ? "s" : "")); + return true; + } + + public void update(Member m) { + farms.forEach(farm -> { + update(farm, m); + }); + } + + public void update(Campfire farm, Member m) { + long next = farm.getNextUpdate(m); + long now = System.currentTimeMillis(); + if (next == 0) { + next = now; + } + + if (next > now) + return; + + long since = now - next; + long updates = since / farm.getCookingTime(); + //System.out.printf("[farm %s] updates is %d\n", farm.getItem(), updates); + + long campfires = bot.getItem(m, MineshaftItem.CAMPFIRE); + + long planted = farm.getPlanted(m); + + if (planted > 0) { + long toCook = (campfires * updates); + if (toCook > planted) { + toCook = planted; + } + + farm.setQuantity(m, farm.getQuantity(m) + toCook); + farm.setPlanted(m, planted - toCook); + } + farm.setNextUpdate(m, farm.getNextUpdate(m) + farm.getCookingTime()*updates); + } +} diff --git a/src/main/java/net/uomc/mineshaft/farm/CompostCommand.java b/src/main/java/net/uomc/mineshaft/farm/CompostCommand.java index 0da607d..ce5deea 100644 --- a/src/main/java/net/uomc/mineshaft/farm/CompostCommand.java +++ b/src/main/java/net/uomc/mineshaft/farm/CompostCommand.java @@ -73,7 +73,7 @@ public class CompostCommand extends CooldownCommand { long itemAmount = getMaxCompostable(e.getMember(), composters, i); long bonemealAmount = (long) (itemAmount / COMPOST_LEVEL); - description.append(String.format("%s->%s\n", bot.getItem(i).prettyValue(itemAmount), bot.getItem(MineshaftItem.BONEMEAL).prettyValue(bonemealAmount))); + description.append(String.format("%s🡒%s\n", bot.getItem(i).prettyValue(itemAmount), bot.getItem(MineshaftItem.BONEMEAL).prettyValue(bonemealAmount))); }); if (amount.get() == 0) { @@ -120,7 +120,7 @@ public class CompostCommand extends CooldownCommand { bot.addItem(e.getMember(), MineshaftItem.BONEMEAL, bonemealAmount); String content = String.format(":white_check_mark: You turned %s into %s", bot.getItem(item).prettyValue(itemAmount), bot.getItem(MineshaftItem.BONEMEAL).prettyValue(bonemealAmount)); - if (bot.getPickaxes().getFarmLevel(e.getMember()) < 1) { + if (bot.getPlayerStats().getFarmLevel(e.getMember()) < 1) { content += "\nUse your bonemeal to expand your `m!farm`"; } bot.sendSuccessMessage(e, content); diff --git a/src/main/java/net/uomc/mineshaft/farm/Farm.java b/src/main/java/net/uomc/mineshaft/farm/Farm.java index d990216..5326df1 100644 --- a/src/main/java/net/uomc/mineshaft/farm/Farm.java +++ b/src/main/java/net/uomc/mineshaft/farm/Farm.java @@ -9,7 +9,7 @@ import net.dv8tion.jda.api.entities.Member; import net.uomc.mineshaft.Mineshaft; import net.uomc.mineshaft.MineshaftItem; -class Farm{ +public class Farm { private MineshaftItem item; @@ -87,7 +87,7 @@ class Farm{ } catch (SQLException e) { e.printStackTrace(); } - return 0l; + return System.currentTimeMillis(); } public void incrementPlanted(Member member, long d) { @@ -103,6 +103,10 @@ class Farm{ return q; } + public Mineshaft getBot() { + return bot; + } + public MineshaftItem getItem() { return item; } diff --git a/src/main/java/net/uomc/mineshaft/farm/FarmCommand.java b/src/main/java/net/uomc/mineshaft/farm/FarmCommand.java index 43b7576..bf700ab 100644 --- a/src/main/java/net/uomc/mineshaft/farm/FarmCommand.java +++ b/src/main/java/net/uomc/mineshaft/farm/FarmCommand.java @@ -11,6 +11,7 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.atomic.AtomicLong; import java.util.stream.IntStream; +import java.util.stream.Stream; import com.mouldycheerio.dbot.CustomBot; import com.mouldycheerio.dbot.commands.CommandDetails; @@ -44,13 +45,23 @@ public class FarmCommand extends DetailedCommand { farms.add(new Farm(bot, MineshaftItem.CANE)); farms.add(new Farm(bot, MineshaftItem.CARROT)); farms.add(new Farm(bot, MineshaftItem.POTATO)); + + bot.getCommandController().addCommand("plant", (e, b, args) -> { + execute(e, bot, Stream.concat(Stream.of("plant"), Arrays.stream(args)).toArray(String[]::new)); + }); + bot.getCommandController().addCommand("harvest", (e, b, args) -> { + execute(e, bot, Stream.concat(Stream.of("harvest"), Arrays.stream(args)).toArray(String[]::new)); + }); + bot.getCommandController().addCommand("expand", (e, b, args) -> { + execute(e, bot, Stream.concat(Stream.of("expand"), Arrays.stream(args)).toArray(String[]::new)); + }); } @Override public void execute(MessageReceivedEvent e, CustomBot b, String[] args) throws CommandFail { List<String> argList = Arrays.asList(args); - if (bot.getPickaxes().isNether(e.getMember())) { + if (bot.getPlayerStats().isNether(e.getMember())) { bot.sendErrorMessage(e, ":x: You cannot access your farm from the nether"); return; } @@ -72,7 +83,7 @@ public class FarmCommand extends DetailedCommand { return; } - long farmLevel = bot.getPickaxes().getFarmLevel(e.getMember()); + long farmLevel = bot.getPlayerStats().getFarmLevel(e.getMember()); StringBuilder description = new StringBuilder(); description.append(String.format("This is your farm.\nUse `%sfarm plant [carrot|potato|cane] [amount]` to plant\nUse `%sfarm harvest` to harvest your crops\nUse %s to expand your farm with `%sfarm expand`\n\n", bot.getPrefixManager().getPrefix(e.getGuild()), @@ -126,9 +137,9 @@ public class FarmCommand extends DetailedCommand { } bot.removeItem(e.getMember(), item, q); - long farmLevel = bot.getPickaxes().getFarmLevel(e.getMember()); - bot.getPickaxes().setFarmLevel(e.getMember(), farmLevel + q); - farmLevel = bot.getPickaxes().getFarmLevel(e.getMember()); + long farmLevel = bot.getPlayerStats().getFarmLevel(e.getMember()); + bot.getPlayerStats().setFarmLevel(e.getMember(), farmLevel + q); + farmLevel = bot.getPlayerStats().getFarmLevel(e.getMember()); bot.sendSuccessMessage(e, ":white_check_mark: You expanded your farm. Now it can hold " + farmLevel + " crops"); return true; @@ -254,7 +265,7 @@ public class FarmCommand extends DetailedCommand { } public long plant(Farm farm, Member member, long amount) { - long farmLevel = bot.getPickaxes().getFarmLevel(member); + long farmLevel = bot.getPlayerStats().getFarmLevel(member); long totalPlanted = getTotalPlanted(member); if (totalPlanted + amount > farmLevel) { amount = farmLevel - totalPlanted; diff --git a/src/main/java/net/uomc/mineshaft/farm/TradeCommand.java b/src/main/java/net/uomc/mineshaft/farm/TradeCommand.java index f512afe..ad3a1be 100644 --- a/src/main/java/net/uomc/mineshaft/farm/TradeCommand.java +++ b/src/main/java/net/uomc/mineshaft/farm/TradeCommand.java @@ -45,12 +45,13 @@ public class TradeCommand extends CooldownCommand { MineshaftItem.BOOK, MineshaftItem.LAPIS, MineshaftItem.COAL, + MineshaftItem.WOOL, }; public static MineshaftItem[] buyingItems = { MineshaftItem.CARROT, MineshaftItem.CANE, - MineshaftItem.POTATO + MineshaftItem.POTATO, }; Mineshaft bot; @@ -98,7 +99,7 @@ public class TradeCommand extends CooldownCommand { long userGive = bot.getItem(e.getMember(), giveItem); long userGet = bot.getItem(e.getMember(), getItem); - description += String.format("**%s**->**%s**", bot.getItem(giveItem).prettyValue(p), bot.getItem(getItem).prettyValue(q)); + description += String.format("**%s**🡒**%s**", bot.getItem(giveItem).prettyValue(p), bot.getItem(getItem).prettyValue(q)); description += String.format( "\n\n:warning:Warning this offer expires in %s and you will need to wait `%s` before trading again", |
