RuneHive-Game
Loading...
Searching...
No Matches
Mining.java
Go to the documentation of this file.
1package com.runehive.content.skill.impl.mining;
2
3import com.runehive.content.event.impl.ObjectInteractionEvent;
4import com.runehive.content.skill.SkillRepository;
5import com.runehive.game.world.World;
6import com.runehive.game.world.entity.mob.player.Player;
7import com.runehive.game.world.entity.skill.Skill;
8import com.runehive.game.world.items.Item;
9import com.runehive.game.world.object.GameObject;
10import com.runehive.net.packet.out.SendMessage;
11import com.runehive.util.Utility;
12import com.runehive.util.chance.Chance;
13import com.runehive.util.chance.WeightedChance;
14
15import java.util.Arrays;
16
17/**
18 * Handles the mining skill.
19 *
20 * @author Daniel
21 */
22public final class Mining extends Skill {
23 static final Chance<Item> GEM_ITEMS = new Chance<>(Arrays.asList(
24 new WeightedChance<>(6, new Item(1623, 1)), // SAPPHIRE
25 new WeightedChance<>(5, new Item(1621, 1)), // EMERALD
26 new WeightedChance<>(4, new Item(1619, 1)), // RUBY
27 new WeightedChance<>(3, new Item(1617, 1)), // DIAMOND
28 new WeightedChance<>(1, new Item(1631, 1)) // DRAGON_STONE
29 ));
30
31 public static double getBonus(Player player) {
32 double bonus = 0;
33 if(player.equipment.getId(0) == 12013 || player.equipment.getId(0) == 25549)
34 bonus += 0.4;
35 if(player.equipment.getId(4) == 12014 || player.equipment.getId(0) == 25551)
36 bonus += 0.8;
37 if(player.equipment.getId(7) == 12015 || player.equipment.getId(0) == 25553)
38 bonus += 0.6;
39 if(player.equipment.getId(10) == 12016 || player.equipment.getId(0) == 25555)
40 bonus += 0.2;
41
42 var wornPieces = 0;
43 int[] pieces = {12013, 12014, 12015, 12016, 25549, 25551, 25553, 25555};
44 for (int piece : pieces) {
45 if (player.equipment.contains(piece)) {
46 wornPieces++;
47 }
48 }
49
50 if (wornPieces > 3) {
51 bonus = 2.5;
52 }
53
54 return bonus;
55 }
56
57
58 /** Constructs a new {@link Mining} skill. */
59 public Mining(int level, double experience) {
60 super(Skill.MINING, level, experience);
61 }
62
63 @Override
64 protected boolean clickObject(Player player, ObjectInteractionEvent event) {
65 GameObject object = event.getObject();
66 OreData ore = OreData.forId(object.getDefinition().getId());
67
68 if (ore == null) {
69 return false;
70 }
71
72 if (!object.active()) {
73 return false;
74 }
75
76 switch (event.getType()) {
77 case FIRST_CLICK_OBJECT:
78 attempt(player, object, ore);
79
80 break;
81 case SECOND_CLICK_OBJECT:
82 player.send(new SendMessage("You examine the rock for ores..."));
83 World.schedule(2, () -> player.send(new SendMessage("This rock contains " + Utility.formatEnum(ore.name()) + ".")));
84 break;
85 }
86 return true;
87 }
88
89 private void attempt(Player player, GameObject object, OreData ore) {
90 PickaxeData pickaxe = PickaxeData.getBestPickaxe(player).orElse(null);
91
92 if (pickaxe == null) {
93 player.message("You don't have a pickaxe.");
94 return;
95 }
96
97 if (!player.skills.get(Skill.MINING).reqLevel(pickaxe.level)) {
98 player.message("You need a level of " + pickaxe.level + " to use this pickaxe!");
99 return;
100 }
101
102 if (!player.skills.get(Skill.MINING).reqLevel(ore.level)) {
103 player.message("You need a mining level of " + ore.level + " to mine this ore!");
104 return;
105 }
106
107
108 start(player, object, ore, pickaxe);
109 }
110
111 private void start(Player player, GameObject object, OreData ore, PickaxeData pickaxe) {
112 if (!object.getGenericAttributes().has("ores")) {
113 object.getGenericAttributes().set("ores", ore.oreCount);
114 }
115 player.walkTo(object.getPosition(), () -> {
116 player.face(object.getPosition());
117 });
118 World.schedule(1, () -> {
119 player.animate(pickaxe.animation);
120 player.action.execute(new MiningAction(player, object, ore, pickaxe));
121 player.skills.get(Skill.MINING).setDoingSkill(true);
122 });
123 player.message(true, "You swing your pick at the rock...");
124 }
125
126 public static boolean success(Player player, OreData ore, PickaxeData pickaxe) {
127 var playerMiningLevel = player.skills.getMaxLevel(Skill.MINING);
128 //Mining boost for celestial rings
129 if (player.equipment.containsAny(25539, 25541, 25543, 25545)) {
130 playerMiningLevel += 4;
131 }
132 double level = (playerMiningLevel + pickaxe.level) / 2.0D;
133 double successChance = Math.ceil((((level * 50.0D) - ((double) ore.level * 15.0D)) / (double) ore.level / 3.0D) * 4.0D);
134 int roll = Utility.random(99);
135 return successChance >= roll;
136 }
137
138 public static boolean success(Player player, int level, PickaxeData pickaxe) {
139 return SkillRepository.isSuccess(player, Skill.MINING, level, pickaxe.level);
140 }
141}
static boolean isSuccess(int skill, int levelRequired)
boolean clickObject(Player player, ObjectInteractionEvent event)
Definition Mining.java:64
void attempt(Player player, GameObject object, OreData ore)
Definition Mining.java:89
static final Chance< Item > GEM_ITEMS
Definition Mining.java:23
void start(Player player, GameObject object, OreData ore, PickaxeData pickaxe)
Definition Mining.java:111
static double getBonus(Player player)
Definition Mining.java:31
static boolean success(Player player, OreData ore, PickaxeData pickaxe)
Definition Mining.java:126
Mining(int level, double experience)
Constructs a new Mining skill.
Definition Mining.java:59
static boolean success(Player player, int level, PickaxeData pickaxe)
Definition Mining.java:138
public< A extends Action<?> > void execute(A action)
Represents the game world.
Definition World.java:46
static void schedule(Task task)
Submits a new event.
Definition World.java:247
void face(GameObject object)
Sets the client update flag to face a certain direction.
Definition Mob.java:289
void walkTo(Position position)
Definition Mob.java:374
This class represents a character controlled by a player.
Definition Player.java:125
double experience
The current skill experience.
Definition Skill.java:179
boolean reqLevel(int level)
Determines if your level is greater than or equal to level.
Definition Skill.java:270
int level
The current level of the skill.
Definition Skill.java:173
void setDoingSkill(boolean doingSkill)
Definition Skill.java:489
Skill(int skill, int level, double experience)
Constructs a new Skill.
Definition Skill.java:184
int getMaxLevel(int id)
Gets the highest possible level of a skill.
Skill get(int id)
Gets the skill for an id.
The container class that represents an item that can be interacted with.
Definition Item.java:21
final int getId(int index)
Gets the item id located on index.
final boolean containsAny(int... identifiers)
Determines if this container contains any identifiers.
boolean contains(int[] bowsWithNoArrowsRequired)
The OutgoingPacket that sends a message to a Players chatbox in the client.
Handles miscellaneous methods.
Definition Utility.java:27
static int random(int bound)
Definition Utility.java:239
static String formatEnum(final String string)
Formats name of enum.
Definition Utility.java:89
Handles a random chance.
Definition Chance.java:14
static OreData forId(int id)
Gets the ore data.
Definition OreData.java:72
final int oreCount
The amount of ores that this ore can give.
Definition OreData.java:47
final int level
The minimum level to mine this node.
Definition OreData.java:32
static Optional< PickaxeData > getBestPickaxe(Player player)
Gets the definition for this pickaxe.