summaryrefslogtreecommitdiff
path: root/src/main/java/net/uomc/mineshaft/farm
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/net/uomc/mineshaft/farm')
-rw-r--r--src/main/java/net/uomc/mineshaft/farm/Campfire.java24
-rw-r--r--src/main/java/net/uomc/mineshaft/farm/CampfireCommand.java258
-rw-r--r--src/main/java/net/uomc/mineshaft/farm/CompostCommand.java4
-rw-r--r--src/main/java/net/uomc/mineshaft/farm/Farm.java8
-rw-r--r--src/main/java/net/uomc/mineshaft/farm/FarmCommand.java23
-rw-r--r--src/main/java/net/uomc/mineshaft/farm/TradeCommand.java5
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",