RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
MysteryBoxEvent.java
1package com.osroyale.content.mysterybox;
2
3import com.osroyale.game.task.TickableTask;
4import com.osroyale.game.world.World;
5import com.osroyale.game.world.entity.mob.player.Player;
6import com.osroyale.net.packet.out.SendColor;
7import com.osroyale.net.packet.out.SendString;
8import com.osroyale.util.Utility;
9
10import java.util.*;
11
12
44
45public class MysteryBoxEvent extends TickableTask {
46 private final Player player;
47 private List<MysteryItem> items;
48 private List<MysteryItem> allItems;
49 private int speed;
50 private final MysteryBoxManager mysteryBox;
51
52
53 MysteryBoxEvent(Player player) {
54 super(false, 1);
55 this.player = player;
56 this.items = new ArrayList<>();
57 this.allItems = new ArrayList<>();
58 this.speed = Utility.random(30, 40);
59 this.mysteryBox = player.mysteryBox;
60 }
61
62 private void move() {
63 allItems.add(items.get(0));
64 items.remove(0);
65 MysteryItem next = getNextItem();
66 allItems.remove(next);
67 items.add(next);
68 }
69
70 private MysteryItem getNextItem() {
71 MysteryItem next = null;
72 for (MysteryItem item : allItems) {
73 if (!items.contains(item)) {
74 next = item;
75 break;
76 }
77 }
78 return next;
79 }
80
81 private double getItemProbability(MysteryItem item) {
82 switch (item.rarity) {
83 case COMMON:
84 return 0.40;
85 case UNCOMMON:
86 return 0.35;
87 case RARE:
88 return 0.15;
89 case EXOTIC:
90 return 0.10;
91 default:
92 return 0;
93 }
94 }
95
96
97
98 private void reward() {
99 double randomValue = Math.random();
100 double cumulativeProbability = 0.0;
101 MysteryItem reward = null;
102
103 Collections.sort(items, Comparator.comparingDouble(this::getItemProbability).reversed());
104
105 for (MysteryItem item : items) {
106 double itemProbability = getItemProbability(item);
107 cumulativeProbability += itemProbability;
108 if (randomValue <= cumulativeProbability) {
109 reward = item;
110 break;
111 }
112 }
113
114 if(reward == null) {
115 reward = items.get(0);
116 }
117 if (reward.rarity == MysteryRarity.EXOTIC) {
118 World.sendMessage("<icon=17><col=5739B3> Tarnish: <col=" + player.right.getColor() + ">" + player.getName() + " </col>has won " + Utility.getAOrAn(reward.getName()) + " <col=5739B3>" + reward.getName() + " </col>from the <col=5739B3>" + mysteryBox.box.name() + "</col>.");
119 }
120
121 player.locking.unlock();
122 player.inventory.add(reward.getId(), reward.getAmount());
123 player.message("Congratulations! You have won @red@" + Utility.getAOrAn(reward.getName()) + " " + reward.getName() + "!\nThis item falls in the rarity of " + reward.rarity.name().toLowerCase() + ".");
124 System.out.println("Rarity: " + reward.rarity.name().toLowerCase());
125 }
126 @Override
127 protected boolean canSchedule() {
128 return player.mysteryBox.box != null;
129 }
130 @Override
131 protected void onSchedule() {
132 player.dialogueFactory.clear();
133 player.locking.lock();
134 allItems.addAll(Arrays.asList(mysteryBox.box.rewards()));
135 player.inventory.remove(mysteryBox.box.item(), 1);
136 mysteryBox.count = player.inventory.computeAmountForId(mysteryBox.box.item());
137 Collections.shuffle(allItems);
138 for (int index = 0; index < 11; index++) {
139 if (index >= allItems.size())
140 continue;
141 MysteryItem item = allItems.get(index);
142 items.add(item);
143 allItems.remove(index);
144 }
145
146 player.send(new SendColor(59508, 0xF01616));
147 player.send(new SendString("You have " + mysteryBox.count + " mystery box available!", 59507));
148 }
149
150 @Override
151 protected void tick() {
152 cancel();
153 }
154
155 @Override
156 protected void onCancel(boolean logout) {
157 if (logout) {
158 player.inventory.add(mysteryBox.box.item(), 1);
159 } else {
160 reward();
161 }
162 }
163}
synchronized final void cancel()
Definition Task.java:147
static void sendMessage(String... messages)
Definition World.java:433
static String getAOrAn(String nextWord)
Definition Utility.java:153