summaryrefslogtreecommitdiff
path: root/src/main/java/net/uomc/mineshaft/MineCommand.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/net/uomc/mineshaft/MineCommand.java')
-rw-r--r--src/main/java/net/uomc/mineshaft/MineCommand.java135
1 files changed, 98 insertions, 37 deletions
diff --git a/src/main/java/net/uomc/mineshaft/MineCommand.java b/src/main/java/net/uomc/mineshaft/MineCommand.java
index ecee140..730ae85 100644
--- a/src/main/java/net/uomc/mineshaft/MineCommand.java
+++ b/src/main/java/net/uomc/mineshaft/MineCommand.java
@@ -46,9 +46,13 @@ public class MineCommand extends CooldownCommand {
private static final double DIAMOND_SPAWN_AMOUNT = 1;
private static final double OBSIDIAN_SPAWN_AMOUNT = 1;
private static final double XP_SPAWN_AMOUNT = 1000;
+ private static final double QUARTZ_SPAWN_AMOUNT = 16;
+ private static final double SKULL_SPAWN_AMOUNT = 1;
+ private static final double NETHERITE_SPAWN_AMOUNT = 1;
private Map<String, String> ores;
private List<String> oresList;
+ private List<String> netherOresList;
private Mineshaft bot;
@@ -57,14 +61,15 @@ public class MineCommand extends CooldownCommand {
this.bot = bot;
setCooldown(15l * 1000l);
+
setDetails(CommandDetails.from("mine", "mine diamonds"));
this.ores = loadOreImages();
oresList = loadOreOrder();
+ netherOresList = loadNetherOreOrder();
}
public List<String> loadOreOrder() {
- // lololol no
return List.of(
"coal",
"copper",
@@ -74,10 +79,44 @@ public class MineCommand extends CooldownCommand {
"gold",
"diamond",
"emerald",
+ "obsidian",
"obsidian"
);
}
+ public List<String> loadNetherOreOrder() {
+ return List.of(
+ "quartz",
+ "quartz",
+ "quartz",
+ "quartz",
+ "gold",
+ "gold",
+ "skull",
+ "skull",
+ "netherite",
+ "netherite"
+ );
+ }
+
+ private int levelToMaxOre(int pickaxe) {
+ switch (pickaxe) {
+ case 0: // stone pickaxe
+ return 2; // copper
+ case 1: // copper pickaxe
+ return 4; // lapis
+ case 2: // iron pickaxe
+ return 6; // gold
+ case 3: // gold pickaxe
+ return 8; // diamond
+ case 4: // diamond pickaxe
+ return 9; // obsidian
+ case 5: // netherite pickaxe
+ return 10; // obsidian, 2
+ }
+ return 9;
+ }
+
public Map<String, String> loadOreImages() {
Map<String, String> ores = new LinkedHashMap<String, String>();
JSONObject config = bot.getConfig();
@@ -94,12 +133,22 @@ public class MineCommand extends CooldownCommand {
return ores;
}
- public MineshaftItem getOre(int pickaxe) {
+ public MineshaftItem getOre(Member m) {
+ return getOre(m, false);
+ }
+
+ public MineshaftItem getOre(Member m, boolean nether) {
+ int pickaxe = bot.getPickaxes().getPickaxeLevel(m);
double random = Math.random();
int maxOre = levelToMaxOre(pickaxe);
- int i = (int) Math.floor(Math.pow(random, 2) * maxOre);
- String oreName = oresList.get(i);
+
+ List<String> list = oresList;
+ if(nether) list = netherOresList;
+
+ double c = getEfficiencyCurve(m);
+ int i = (int) Math.floor(Math.pow(random, c) * maxOre);
+ String oreName = list.get(i);
MineshaftItem ore = MineshaftItem.valueOf(oreName.toUpperCase());
return ore;
}
@@ -107,34 +156,23 @@ public class MineCommand extends CooldownCommand {
@Override
public boolean trigger(MessageReceivedEvent e) {
- int pickaxe = bot.getPickaxes().getPickaxeLevel(e.getMember());
- MineshaftItem ore = getOre(pickaxe);
- int i = oresList.indexOf(ore.toString().toLowerCase());
+ boolean nether = bot.getPickaxes().isNether(e.getMember());
+ MineshaftItem ore = getOre(e.getMember(), nether);
+ int i;
+ if (nether) {
+ i = oresList.indexOf(ore.toString().toLowerCase());
+ } else {
+ i = netherOresList.indexOf(ore.toString().toLowerCase());
+ }
- spawnDrop(e.getChannel(), ore, i, m -> {});
+ spawnDrop(e.getChannel(), ore, i, nether, m -> {});
e.getMessage().addReaction(Emoji.fromUnicode(EmojiParser.parseToUnicode(":pick:"))).queue();
return true;
}
- private int levelToMaxOre(int pickaxe) {
- switch (pickaxe) {
- case 0: // stone pickaxe
- return 2; // copper
- case 1: // copper pickaxe
- return 4; // lapis
- case 2: // iron pickaxe
- return 6; // gold
- case 3: // gold pickaxe
- return 8; // diamond
- case 4: // diamond pickaxe
- return 9; // obsidian
- // TODO for obsidian u can make nether portal
- }
- return 9;
- }
- public void spawnDrop(MessageChannel channel, MineshaftItem ore, int oreLevel, Consumer<MessageChannel> then) {
- sendDrop(channel, ore, m -> {
+ public void spawnDrop(MessageChannel channel, MineshaftItem ore, int oreLevel, boolean nether, Consumer<MessageChannel> then) {
+ sendDrop(channel, ore, nether, m -> {
EventWaiter eventWaiter = new EventWaiter();
channel.getJDA().addEventListener(eventWaiter);
@@ -155,14 +193,14 @@ public class MineCommand extends CooldownCommand {
});
}, DROP_DURATION_SECONDS, TimeUnit.SECONDS, () -> {
cleanup(channel, m, ore);
- endDrop(m, ore);
});
});
}
public void cleanup(MessageChannel channel, Message message, MineshaftItem ore) {
- message.delete().queue();
+
+ message.delete().queue(a -> {}, x -> {});
channel.getHistoryAfter(message, 100).queueAfter(5, TimeUnit.SECONDS, h -> {
ArrayList<Message> msgs = new ArrayList<Message>();
@@ -176,11 +214,11 @@ public class MineCommand extends CooldownCommand {
;
}
- public void sendDrop(MessageChannel channel, MineshaftItem ore, Consumer<Message> callback) {
+ public void sendDrop(MessageChannel channel, MineshaftItem ore, boolean nether, Consumer<Message> callback) {
EmbedBuilder embedBuilder = new EmbedBuilder();
embedBuilder.setColor(bot.getColor());
- embedBuilder.setImage(getOreUrl(ore));
+ embedBuilder.setImage(getOreUrl(ore, nether));
embedBuilder.setTitle(String.format(DROP_TITLE));
embedBuilder.setDescription(String.format(DROP_DESCRIPTION, getPickString(ore), PeelingUtils.formatTimeRelativeFromNow(DROP_DURATION_SECONDS * 1000l)));
@@ -195,10 +233,6 @@ public class MineCommand extends CooldownCommand {
embedBuilder.setColor(bot.getColor());
Map<MineshaftItem, Long> awards = getAwards(member, ore);
- int fortune = bot.getPickaxes().getPickaxeFortune(member);
- if (fortune > 0) {
- bot.multiply(awards, fortune + 1);
- }
bot.addItems(member, awards);
String awardsList = bot.createItemList(awards, "+%s");
@@ -208,6 +242,7 @@ public class MineCommand extends CooldownCommand {
channel.sendMessageEmbeds(embedBuilder.build()).queue(callback);
}
+
public void endDrop(Message message, MineshaftItem ore) {
EmbedBuilder embedBuilder = new EmbedBuilder();
@@ -221,8 +256,12 @@ public class MineCommand extends CooldownCommand {
});
}
- public String getOreUrl(MineshaftItem ore) {
- String oreName = ore.toString();
+ public String getOreUrl(MineshaftItem ore, boolean nether) {
+ String prefix = "";
+ if (nether)
+ prefix = "nether_";
+
+ String oreName = prefix + ore.toString();
if (ores.containsKey(oreName))
return ores.get(oreName);
@@ -262,6 +301,7 @@ public class MineCommand extends CooldownCommand {
break;
case EMERALD:
award.put(MineshaftItem.EMERALD, (long) Math.ceil(Math.random() * EMERALD_SPAWN_AMOUNT));
+ award.put(MineshaftItem.XP, (long) Math.ceil(Math.random() * XP_SPAWN_AMOUNT * 5l));
break;
case DIAMOND:
award.put(MineshaftItem.DIAMOND, (long) Math.ceil(Math.random() * DIAMOND_SPAWN_AMOUNT));
@@ -269,12 +309,33 @@ public class MineCommand extends CooldownCommand {
break;
case OBSIDIAN:
award.put(MineshaftItem.OBSIDIAN, (long) Math.ceil(Math.random() * OBSIDIAN_SPAWN_AMOUNT));
+ break;
+ case QUARTZ:
+ award.put(MineshaftItem.QUARTZ, (long) Math.ceil(Math.random() * QUARTZ_SPAWN_AMOUNT));
+ award.put(MineshaftItem.XP, (long) Math.ceil(Math.random() * XP_SPAWN_AMOUNT * 5l));
+ break;
+ case SKULL:
+ award.put(MineshaftItem.SKULL, (long) Math.ceil(Math.random() * SKULL_SPAWN_AMOUNT));
+ award.put(MineshaftItem.XP, (long) Math.ceil(Math.random() * XP_SPAWN_AMOUNT * 10l));
+ break;
+ case NETHERITE:
+ award.put(MineshaftItem.NETHERITE, (long) Math.ceil(Math.random() * NETHERITE_SPAWN_AMOUNT));
award.put(MineshaftItem.XP, (long) Math.ceil(Math.random() * XP_SPAWN_AMOUNT * 10l));
break;
default:
break;
}
+ return bot.multiply(award, getPickaxeFortuneCurve(member));
+ }
+
+ public double getEfficiencyCurve(Member m) {
+ return 1 + Math.pow(0.5, bot.getPickaxes().getPickaxeEfficiency(m) / 2);
- return award;
}
+ private double getPickaxeFortuneCurve(Member m) {
+ int fortune = bot.getPickaxes().getPickaxeFortune(m);
+ return fortune + Math.pow(1.2, fortune + 1);
+ }
+
+
}