RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
StakeSession.java
1package com.osroyale.game.world.entity.mob.player.exchange.duel;
2
3import com.osroyale.content.activity.Activity;
4import com.osroyale.content.activity.impl.duelarena.DuelArenaActivity;
5import com.osroyale.content.activity.impl.duelarena.DuelRule;
6import com.osroyale.content.activity.impl.duelarena.DuelUtils;
7import com.osroyale.game.world.InterfaceConstants;
8import com.osroyale.game.world.entity.mob.player.Player;
9import com.osroyale.game.world.entity.mob.player.PlayerRight;
10import com.osroyale.game.world.entity.mob.player.exchange.ExchangeCompletionType;
11import com.osroyale.game.world.entity.mob.player.exchange.ExchangeSession;
12import com.osroyale.game.world.entity.mob.player.exchange.ExchangeSessionType;
13import com.osroyale.game.world.items.Item;
14import com.osroyale.net.packet.out.*;
15import com.osroyale.util.MessageColor;
16import com.osroyale.util.Utility;
17
18import java.util.EnumSet;
19import java.util.Optional;
20import java.util.stream.IntStream;
21
59
60public final class StakeSession extends ExchangeSession {
61
62 private DuelArenaActivity activity;
63 public boolean accepted;
64
65 public StakeSession(Player owner, Player other) {
66 super(owner, other, ExchangeSessionType.DUEL);
67 }
68
69 @Override
70 public boolean onRequest() {
71// if (true) {
72// DuelArenaActivity2.create(this, player, other).cooldown(-1);
73// return true;
74// }
75 if(player.playTime < 6000) {
76 player.message("You must have at least 1 hour of play time before duelling.");
77 return false;
78 }
79 if(other.playTime < 6000) {
80 player.message("The other player must have at least 1 hour of play time before duelling.");
81 return false;
82 }
83 // face player they are requesting to duel
84 player.face(other.getPosition());
85 player.exchangeSession.requested_players.add(other);
86
87 if (!other.exchangeSession.requested_players.contains(player)) {
88 player.send(new SendMessage("Sending duel request..."));
89 other.send(new SendMessage(player.getName() + ":duelreq:", MessageColor.BRONZE));
90 return false;
91 }
92
93 SESSIONS.add(this);
94
95 activity = DuelArenaActivity.create(this, player, other);
96
97 forEach(player -> {
98 player.exchangeSession.resetRequests();
100 player.send(new SendConfig(655, 0)); // stake removal notification
101 // reset duel rule configs
102 IntStream.range(631, 644).forEach(i -> player.send(new SendConfig(i, 0)));
103 player.send(new SendToggle(286, 0));
104 player.attributes.set("DUEL_KEY", true);
105 });
106 updateMainComponents("FIRST_SCREEN");
107 return true;
108 }
109
110 @Override
111 public void accept(Player player, String component) {
113 switch (component) {
114 case "FIRST_SCREEN":
115 if (!player.inventory.hasCapacityFor(item_containers.get(other).toArray())) {
116 player.send(new SendMessage("You don't have enough free slots for this many items.", MessageColor.RED));
117 break;
118 }
119
120 if (!other.inventory.hasCapacityFor(item_containers.get(player).toArray())) {
121 String username = other.getName();
122 player.send(new SendMessage(username + " doesn't have enough free slots for this many items", MessageColor.RED));
123 break;
124 }
125
126 if (hasAttachment() && !getAttachment().equals(player)) {
127 setAttachment(null);
128 updateMainComponents("SECOND_SCREEN");
129 return;
130 }
131
133 player.send(new SendString("<col=ffffff>Waiting for other player...", 31009));
134 other.send(new SendString("<col=ffffff>Other player has accepted", 31009));
135 break;
136
137 case "SECOND_SCREEN":
138 if (hasAttachment() && !getAttachment().equals(player)) {
139 setAttachment(null);
140 accepted = true;
142 activity.setPause(false);
143 return;
144 }
145
147 player.send(new SendString("<col=ffffff>Waiting for other player...", 31526));
148 other.send(new SendString("<col=ffffff>Other player has accepted", 31526));
149 break;
150
151 }
152 }
153
154 @Override
155 public boolean canAddItem(Player player, Item item, int slot) {
156 return true;
157 }
158
159 @Override
160 public boolean canRemoveItem(Player player, Item item, int slot) {
161 return true;
162 }
163
164 @Override
165 public boolean onButtonClick(Player player, int button) {
166 Optional<DuelRule> rule = DuelRule.forButton(button);
167 rule.ifPresent(r -> r.set(player, true));
168
169 switch (button) {
170 case 31018:
171 case 31008:
172 case 31002:
173 case 31523:
174 case 31502:
175 player.exchangeSession.reset(ExchangeSessionType.DUEL);
176 return true;
177
178 case 31061: // save
179 if (!player.interfaceManager.isInterfaceOpen(InterfaceConstants.FIRST_DUEL_SCREEN)) {
180 return false;
181 }
182
183 if (activity != null) {
184 EnumSet<DuelRule> flags = activity.rules.getFlags();
185 player.attributes.put("duel_rules", flags);
186 }
187 return true;
188
189 case 31065: // load
190 if (!player.interfaceManager.isInterfaceOpen(InterfaceConstants.FIRST_DUEL_SCREEN)) {
191 return false;
192 }
193
194 if (player.attributes.has("duel_rules") && activity != null) {
195 EnumSet<DuelRule> flags = player.attributes.get("duel_rules");
196 activity.rules.reset();
197 flags.forEach(it -> it.set(player, true));
198 DuelRule.showRules(activity, this.player, other);
199 }
200 return true;
201
202 case 31520:
203 if (!player.interfaceManager.isInterfaceOpen(InterfaceConstants.SECOND_DUEL_SCREEN)) {
204 return false;
205 }
206
207 accept(player, "SECOND_SCREEN");
208 return true;
209
210 case 31015:
211 if (!player.interfaceManager.isInterfaceOpen(InterfaceConstants.FIRST_DUEL_SCREEN)) {
212 return false;
213 }
214
215 accept(player, "FIRST_SCREEN");
216 return true;
217
218 }
219 return false;
220 }
221
222 @Override
223 public void updateMainComponents(String component) {
224 switch (component) {
225
226 case "FIRST_SCREEN":
228 break;
229
230 case "SECOND_SCREEN":
231 forEach(p -> {
232 Player recipient = p.getName().equals(player.getName()) ? this.other : this.player;
233
234 p.send(new SendString("Some worn items will be taken off.", 31505));
235 p.send(new SendString("Boosted stats will be restored.", 31506));
236 p.send(new SendString("Existing prayers will be stopped.", 31507));
237 IntStream.range(31509, 31520).forEach(i -> p.send(new SendString("", i))); // rules
238 showDuelRulesOnSecondScreen(p);
239 IntStream.range(31531, 31560).forEach(i -> p.send(new SendString("", i)));
240 IntStream.range(31561, 31589).forEach(i -> p.send(new SendString("", i)));
241 p.send(new SendString(DuelUtils.getItemNames(this.item_containers.get(p).toArray()), 31531));
242 p.send(new SendString(DuelUtils.getItemNames(this.item_containers.get(recipient).toArray()), 31561));
243 p.send(new SendString("", 31526));
244 p.send(new SendItemOnInterface(3322, this.item_containers.get(p).toArray()));
245 p.interfaceManager.open(InterfaceConstants.SECOND_DUEL_SCREEN);
246 });
247 break;
248 }
249 }
250
251 @Override
252 public void updateOfferComponents() {
253 setAttachment(null);
254 forEach(p -> {
255 Player recipient = p.getName().equals(player.getName()) ? this.other : this.player;
256
257 p.send(new SendItemOnInterface(3322, p.inventory.toArray()));
258 item_containers.get(p).refresh(p, InterfaceConstants.PLAYER_STAKE_CONTAINER);
259 item_containers.get(p).refresh(recipient, InterfaceConstants.OTHER_STAKE_CONTAINER);
260
261 p.send(new SendString("Dueling with: " + PlayerRight.getCrown(recipient) + " " + Utility.formatName(recipient.getUsername()), 31005));
262 p.send(new SendString("Opponent's combat level: <col=ff7000>" + other.skills.getCombatLevel(), 31006));
263
264 p.send(new SendString("", 31009));
265 p.interfaceManager.openInventory(InterfaceConstants.FIRST_DUEL_SCREEN, 3321);
266 });
267 }
268
269 @Override
270 public void onReset() {
271 forEach(player -> {
273 player.resetFace();
274 player.attributes.set("DUEL_KEY", false);
275 if (!accepted) {
276 activity.remove(player);
277 }
278 });
279 }
280
281 private void showDuelRulesOnSecondScreen(Player p) {
282 Optional<DuelArenaActivity> result = Activity.search(p, DuelArenaActivity.class);
283
284 if (!result.isPresent()) {
285 return;
286 }
287
288 DuelArenaActivity activity = result.get();
289
290 int count = 0;
291 for (DuelRule rule : DuelRule.values()) {
292 if (activity.rules.contains(rule)) {
293 p.send(new SendString(DuelUtils.getRuleText(rule), 31509 + count));
294 count++;
295 }
296 }
297 }
298
299}
ExchangeSession(Player player, Player other, ExchangeSessionType type)