RuneHive-Game
Loading...
Searching...
No Matches
Overrides.java
Go to the documentation of this file.
1package com.runehive.content.overrides;
2
3import com.runehive.game.world.entity.combat.attack.FightStyle;
4import com.runehive.game.world.entity.combat.attack.FightType;
5import com.runehive.game.world.entity.combat.weapon.WeaponInterface;
6import com.runehive.game.world.entity.mob.UpdateFlag;
7import com.runehive.game.world.entity.mob.player.Player;
8import com.runehive.game.world.items.Item;
9import com.runehive.game.world.items.containers.equipment.Equipment;
10import com.runehive.game.world.items.containers.equipment.EquipmentType;
11import com.runehive.game.world.position.Area;
12import com.runehive.net.packet.out.*;
13
14import java.util.*;
15
16public class Overrides {
17
18 private final Player player;
20 this.player = player;
21 }
22
23 public record OverridePreset(Item... items) {}
24 public Map<String, OverridePreset> presets = new HashMap<>();
25
26 public List<Integer> allOverrides = new ArrayList<>();
27 public Map<Integer, Item> currentOverrides = new HashMap<>();
28
29 final Map<Integer, Integer> buttons = new HashMap<>();
30 final Map<Integer, String> presetButtons = new HashMap<>();
31
33 String filterName = "All";
34 boolean managingOverrides = false;
35
36 public void openInterface() {
38 player.message("You can't do this in the wilderness.");
39 return;
40 }
42 filterName = "All";
43 drawText();
45 player.interfaceManager.open(OVERRIDE_INTERFACE);
46 }
47
48 private void drawText() {
50 player.send(new SendString(filterName + " Overrides", 60113));
51
52 if (filterName.equals("Preset")) {
54 return;
55 }
56
57 int slot = 0;
58 for (int i = 0; i < allOverrides.size(); i++) {
59 final var equipmentSlot = new Item(allOverrides.get(i)).getDefinition().getEquipmentType().getNewItemDefName();
60 if (!Objects.equals(equipmentSlot, filter.getNewItemDefName()) && filter != EquipmentType.NOT_WIELDABLE) {
61 continue;
62 }
63
64 final var itemName = new Item(allOverrides.get(i)).getName();
65 player.send(new SendString(itemName, 60146 + (slot * 2)));
66 buttons.put(-5391 + (slot * 2), allOverrides.get(i));
67 slot++;
68 }
69 }
70
71 private void drawPresets() {
72 for (int i = 0; i < presets.size(); i++) {
73 final var presetName = presets.keySet().toArray()[i].toString();
74 player.send(new SendString(presetName, 60146 + (i * 2)));
75 presetButtons.put(-5391 + (i * 2), presetName);
76 }
77 }
78
79 private void wipeInterface() {
80 for (int i = 0; i < allOverrides.size() + 1; i++) {
81 player.send(new SendString("", 60146 + (i * 2)));
82 }
83 buttons.clear();
84 presetButtons.clear();
85 }
86
87 public void addOverride(int itemId) {
88 final var item = new Item(itemId);
89 final var canEquipItem = item.isEquipable();
90 if (!canEquipItem) {
91 player.dialogueFactory.sendItem("Keepsake Overrides", "You can only keepsake equipable items.", itemId).execute();
92 return;
93 }
94 final var unallowedSlot = item.getEquipmentType() == EquipmentType.RING || item.getEquipmentType() == EquipmentType.ARROWS;
95 if (unallowedSlot) {
96 player.dialogueFactory.sendItem("Keepsake Overrides", "You cannot keepsake this item.", itemId).execute();
97 return;
98 }
99 if (allOverrides.contains(itemId)) {
100 player.dialogueFactory.sendItem("Keepsake Overrides", "You already have this as an override.", itemId).execute();
101 return;
102 }
103 if (allOverrides.size() > 44) {
104 player.dialogueFactory.sendItem("Keepsake Overrides", "You can only have 45 overrides.", itemId).execute();
105 return;
106 }
107 if (Area.inWilderness(player)) {
108 player.message("You can't do this in the wilderness.");
109 return;
110 }
111
112 player.dialogueFactory.sendStatement(
113 "Are you sure you want to keepsake the " + item.getName() + "?", "You will @red@not@bla@ be able to reclaim it.").sendOption(
114 "Yes, keepsake the " + item.getName(), () -> {
115 allOverrides.add(itemId);
116 player.inventory.remove(2399, 1);
117 player.inventory.remove(itemId, 1);
118 },
119 "Nevermind", () -> player.dialogueFactory.clear()).execute();
120 }
121
122 private void deleteOverride(Item item) {
123 if (!allOverrides.contains(item.getId())) {
124 player.message("Error deleting override.");
125 return;
126 }
127
128 allOverrides.remove(Integer.valueOf(item.getId()));
129
130 //Remove override if it is currently equipped
131 if (currentOverrides.containsValue(item)) {
132 removeOverride(item.getId());
133 }
134
135 //Remove preset if it contains the deleted override
136 for (int i = 0; i < presets.size(); i++) {
137 final var preset = presets.get(presets.keySet().toArray()[i].toString());
138 if (Arrays.stream(preset.items).anyMatch(presetItem -> presetItem != null && presetItem.getId() == item.getId())) {
139 presets.remove(presets.keySet().toArray()[i].toString());
140 player.message("A preset has been deleted as it contained a deleted override.");
141 }
142 }
143
144 drawText();
145 }
146
147 public boolean hasOverride(int slot) {
148 if (Area.inWilderness(player)) {
149 return false;
150 }
151 if (Area.inDuelArena(player)) {
152 return false;
153 }
154 if (!currentOverrides.containsKey(slot)) {
155 return false;
156 }
157
158 if (slot == Equipment.WEAPON_SLOT) {
159 return hasWeaponOverride();
160 /*if (player.equipment.get(Equipment.WEAPON_SLOT) != null) {
161 final var wornWeapon = player.equipment.get(Equipment.WEAPON_SLOT).getRangedDefinition();
162 final var overrideWeapon = currentOverrides.get(Equipment.WEAPON_SLOT).getRangedDefinition();
163 return (wornWeapon.isPresent() || overrideWeapon.isEmpty()) && (overrideWeapon.isPresent() || wornWeapon.isEmpty());
164 } else {
165 return true;
166 }*/
167 }
168
169 if (slot == Equipment.SHIELD_SLOT) {
170 return hasShieldOverride();
171 /* if (player.equipment.get(Equipment.WEAPON_SLOT) != null) {
172 final var wornWeapon = player.equipment.get(Equipment.WEAPON_SLOT);
173 if (currentOverrides.containsKey(Equipment.WEAPON_SLOT)) {
174 if (wornWeapon.getRangedDefinition().isPresent() && wornWeapon.isTwoHanded() && currentOverrides.get(Equipment.WEAPON_SLOT).getRangedDefinition().isEmpty()) {
175 return false;
176 }
177 return !currentOverrides.get(Equipment.WEAPON_SLOT).isTwoHanded();
178 }
179 return !wornWeapon.isTwoHanded();
180 } else if (currentOverrides.containsKey(Equipment.WEAPON_SLOT)) {
181 return !currentOverrides.get(Equipment.WEAPON_SLOT).isTwoHanded();
182 } else {
183 return true;
184 }*/
185 }
186
187 return currentOverrides.containsKey(slot);
188 }
189
190 private boolean hasWeaponOverride() {
191 final var hasWeapon = player.equipment.get(Equipment.WEAPON_SLOT) != null;
192 final var weaponIs2h = hasWeapon && player.equipment.get(Equipment.WEAPON_SLOT).isTwoHanded();
193 final var weaponIsRanged = hasWeapon && player.equipment.get(Equipment.WEAPON_SLOT).getRangedDefinition().isPresent();
194
195 final var hasOverride = currentOverrides.containsKey(Equipment.WEAPON_SLOT);
196 final var overrideIs2h = hasOverride && currentOverrides.get(Equipment.WEAPON_SLOT).isTwoHanded();
197 final var overrideIsRanged = hasOverride && currentOverrides.get(Equipment.WEAPON_SLOT).getRangedDefinition().isPresent();
198
199 if (hasWeapon) {
200 if (weaponIs2h && !overrideIs2h || overrideIs2h && !weaponIs2h) {
201 return false;
202 }
203 if (weaponIsRanged && !overrideIsRanged || overrideIsRanged && !weaponIsRanged) {
204 return false;
205 }
206 }
207
208 return hasOverride;
209 }
210
211 private boolean hasShieldOverride() {
212 final var hasWeapon = player.equipment.get(Equipment.WEAPON_SLOT) != null;
213 final var weaponIs2h = hasWeapon && player.equipment.get(Equipment.WEAPON_SLOT).isTwoHanded();
214
215 final var hasOverrideWeapon = currentOverrides.containsKey(Equipment.WEAPON_SLOT);
216 final var overrideIs2h = hasOverrideWeapon && currentOverrides.get(Equipment.WEAPON_SLOT).isTwoHanded();
217
218 if (weaponIs2h) {
219 return false;
220 }
221 if (overrideIs2h) {
222 return false;
223 }
224
225 return currentOverrides.containsKey(Equipment.SHIELD_SLOT);
226 }
227
228 public Item get(int slot) {
229 return currentOverrides.get(slot);
230 }
231
232 private void createPreset(String presetName) {
233 if (presets.containsKey(presetName)) {
234 player.message("You already have a preset named " + presetName + ".");
235 return;
236 }
237 Item[] presetItems = new Item[11];
238 currentOverrides.forEach((k, v) -> presetItems[k] = v);
239
240 presets.put(presetName, new OverridePreset(presetItems));
241 drawText();
242 }
243
244 private void loadPreset(String presetName) {
245 if (!presets.containsKey(presetName)) {
246 player.message("Error loading preset: " + presetName);
247 return;
248 }
249
251
252 for (Item item : presets.get(presetName).items) {
253 if (item == null) {
254 continue;
255 }
256 equipOverride(item);
257 }
258 }
259
260 private void renamePreset(String currentName, String newName) {
261 if (!presets.containsKey(currentName)) {
262 player.message("Error renaming preset: " + currentName);
263 return;
264 }
265 if (presets.containsKey(newName)) {
266 player.message("You already have a preset named " + newName + ".");
267 return;
268 }
269
270 presets.put(newName, presets.get(currentName));
271 presets.remove(currentName);
272 player.message("Preset renamed to " + newName + ".");
273 drawText();
274 }
275
276 private void deletePreset(String presetName) {
277 if (!presets.containsKey(presetName)) {
278 player.message("Error deleting preset: " + presetName);
279 return;
280 }
281
282 presets.remove(presetName);
283 player.message("Preset deleted.");
284 drawText();
285 }
286
288 WeaponInterface weapon = item == null ? null : item.getWeaponInterface();
289 if (weapon == null) weapon = WeaponInterface.UNARMED;
290
291 FightType[] oldTypes = player.getWeapon().getFightTypes();
292 FightType[] newTypes = weapon.getFightTypes();
293 FightType result = null;
294
295 for (int index = 0; index < oldTypes.length; index++) {
296 if (newTypes.length == index) {
297 break;
298 }
299
300 if (newTypes[index].getStyle().equals(FightStyle.DEFENSIVE)
301 && player.getCombat().getFightType().getStyle().equals(FightStyle.DEFENSIVE)) {
302 result = newTypes[index];
303 break;
304 }
305
306 if (oldTypes[index] == player.getCombat().getFightType()) {
307 boolean oldControlled = oldTypes[index].getStyle().equals(FightStyle.CONTROLLED);
308 boolean newControlled = newTypes[index].getStyle().equals(FightStyle.CONTROLLED);
309 if (newControlled != oldControlled) {
310 continue;
311 }
312 result = newTypes[index];
313 break;
314 }
315 }
316
317 if (result == null) {
318 if (player.getCombat().getFightType().getStyle().equals(FightStyle.DEFENSIVE)) {
319 result = newTypes[newTypes.length - 1];
320 } else {
321 result = newTypes[1];
322 }
323 }
324 return result;
325 }
326
327 public boolean handleButtons(int button) {
328 if (presetButtons.containsKey(button)) {
329 final var presetName = presetButtons.get(button);
330 if (managingOverrides) {
331 managePresetDialogue(presetName);
332 return true;
333 }
334 loadPreset(presetName);
335 return true;
336 }
337 if (buttons.containsKey(button)) {
338 final var item = new Item(buttons.get(button));
339 if (managingOverrides) {
340 manageItemDialogue(item);
341 return true;
342 }
343 equipOverride(item);
344 return true;
345 }
346 switch (button) {
347 case INFO_BTN -> player.interfaceManager.open(INFO_INTERFACE);
348 case INFO_CLOSE_BTN -> player.interfaceManager.close();
350 case HEAD_SLOT_BTN -> setFilter(EquipmentType.HELM, "Head");
352 case BODY_SLOT_BTN -> setFilter(EquipmentType.BODY, "Body");
355 case CAPE_SLOT_BTN -> setFilter(EquipmentType.CAPE, "Cape");
361
362 case SAVE_PRESET_BTN -> {
363 if (presets.size() > 4) {
364 player.message("You already have the maximum amount of presets saved.");
365 return true;
366 }
367 player.send(new SendInputMessage("Enter name for preset:", 30, this::createPreset));
368 return true;
369 }
370 }
371 return false;
372 }
373
374 private void manageModeDialogue() {
375 player.dialogueFactory.sendOption(
376 "Toggle manage mode to " + (managingOverrides ? "@red@off@bla@" : "@gre@on@bla@"), () -> managingOverrides = !managingOverrides,
377
378 "What is manage mode?", () -> player.dialogueFactory.sendStatement(
379 "Manage mode allows you to manage your overrides and presets.",
380 "When manage mode is on, clicking an override or preset will",
381 "open a menu allowing you to equip, delete, or rename it."),
382
383 "Nevermind", () -> player.dialogueFactory.clear()).execute();
384 }
385
386 private void manageItemDialogue(Item item) {
387 player.dialogueFactory.sendOption(
388 "Equip <col=255>" + item.getName()+"</col>", () -> equipOverride(item),
389
390 "@red@Delete " + item.getName(), () -> player.dialogueFactory.sendStatement(
391 "Are you sure you want to delete this override?", "The item will be @red@permanently lost@bla@.").sendOption(
392 "Yes, permanently delete " + item.getName(), () -> deleteOverride(item),
393 "Nevermind", () -> player.dialogueFactory.clear()),
394
395 "Nevermind", () -> player.dialogueFactory.clear()).execute();
396 }
397
398 private void managePresetDialogue(String presetName) {
399 player.dialogueFactory.sendOption(
400 "Equip <col=255>" + presetName + "</col>", () -> loadPreset(presetName),
401
402 "Rename preset", () -> {
403 player.dialogueFactory.clear();
404 player.dialogueFactory.onAction(() -> player.send(new SendInputMessage("Enter new preset name:", 30, input -> renamePreset(presetName, input))));
405 },
406
407 "@red@Delete " + presetName, () -> player.dialogueFactory.sendStatement(
408 "Are you sure you want to delete this preset?").sendOption(
409 "Yes, delete " + presetName, () -> deletePreset(presetName),
410 "Nevermind", () -> player.dialogueFactory.clear()),
411
412 "Nevermind", () -> player.dialogueFactory.clear()).execute();
413 }
414
415 private void setFilter(EquipmentType equipmentType, String name) {
416 filter = equipmentType;
417 filterName = name;
418 drawText();
419 }
420
421 public void removeOverride(int itemId) {
422 player.send(toggleConfig(itemId, "on"));
423 player.send(new SendItemOnInterface(determineContainer(itemId), new Item(-1)));
424
425 final var equipmentType = new Item(itemId).getDefinition().getEquipmentType();
426 currentOverrides.remove(equipmentType.getSlot());
427 player.updateFlags.add(UpdateFlag.APPEARANCE);
428 player.equipment.updateAnimation();
429 }
430
431 private void removeAllOverrides() {
432 while (!currentOverrides.isEmpty()) {
433 removeOverride(currentOverrides.get(currentOverrides.keySet().iterator().next()).getId());
434 }
435 }
436
437 private void equipOverride(Item item) {
438 player.send(toggleConfig(item.getId(), "off"));
439 player.send(new SendItemOnInterface(determineContainer(item.getId()), item));
440
441 final var equipmentType = item.getDefinition().getEquipmentType();
442 currentOverrides.remove(equipmentType.getSlot());
443 currentOverrides.put(equipmentType.getSlot(), item);
444 player.updateFlags.add(UpdateFlag.APPEARANCE);
445 player.equipment.updateAnimation();
446 }
447
448 /* This is used to reload the equipment config buttons & item containers. This is because if a player closes
449 * their client and reopens, the configs/items will not show even if they have overrides active. */
450 private void loadContainers() {
451 currentOverrides.forEach((slot, item) -> {
452 player.send(toggleConfig(item.getId(), "off"));
453 player.send(new SendItemOnInterface(determineContainer(item.getId()), item));
454 });
455 }
456
457 private SendConfig toggleConfig(int itemId, String toggle) {
458 final var configValue = toggle.equals("on") ? 0 : 1;
459 final var equipmentSlot = new Item(itemId).getDefinition().getEquipmentType();
460 return switch (equipmentSlot) {
461 case HAT, HELM, MASK, FACE -> new SendConfig(1300, configValue);
462 case CAPE -> new SendConfig(1301, configValue);
463 case AMULET -> new SendConfig(1302, configValue);
464 case WEAPON -> new SendConfig(1303, configValue);
465 case BODY, TORSO -> new SendConfig(1304, configValue);
466 case SHIELD -> new SendConfig(1305, configValue);
467 case LEGS -> new SendConfig(1306, configValue);
468 case BOOTS -> new SendConfig(1307, configValue);
469 case GLOVES -> new SendConfig(1308, configValue);
470 default -> null;
471 };
472 }
473
474 private int determineContainer(int itemId) {
475 final var equipmentSlot = new Item(itemId).getDefinition().getEquipmentType();
476 return switch (equipmentSlot) {
477 case HAT, HELM, MASK, FACE -> HEAD_CONTAINER;
478 case CAPE -> CAPE_CONTAINER;
479 case AMULET -> AMULET_CONTAINER;
480 case WEAPON -> WEAPON_CONTAINER;
481 case BODY, TORSO -> BODY_CONTAINER;
482 case SHIELD -> SHIELD_CONTAINER;
483 case LEGS -> LEGS_CONTAINER;
484 case GLOVES -> GLOVES_CONTAINER;
485 case BOOTS -> BOOTS_CONTAINER;
486 default -> -1;
487 };
488 }
489
490 //Constants - eliminate magic numbers
491 final int HEAD_CONTAINER = 60131;
492 final int BODY_CONTAINER = 60135;
493 final int LEGS_CONTAINER = 60137;
494 final int AMULET_CONTAINER = 60133;
495 final int CAPE_CONTAINER = 60132;
496 final int GLOVES_CONTAINER = 60138;
497 final int BOOTS_CONTAINER = 60139;
498 final int WEAPON_CONTAINER = 60134;
499 final int SHIELD_CONTAINER = 60136;
500 final int OVERRIDE_INTERFACE = 60106;
501 final int INFO_INTERFACE = 60260;
502 final int INFO_BTN = -5286;
503 final int INFO_CLOSE_BTN = -5270;
504 final int INFO_GO_BACK_BTN = -5267;
505 final int MANAGE_BTN = -5395;
506 final int HEAD_SLOT_BTN = -5415;
507 final int AMULET_SLOT_BTN = -5413;
508 final int BODY_SLOT_BTN = -5410;
509 final int LEGS_SLOT_BTN = -5408;
510 final int BOOTS_SLOT_BTN = -5407;
511 final int CAPE_SLOT_BTN = -5414;
512 final int WEAPON_SLOT_BTN = -5411;
513 final int GLOVES_SLOT_BTN = -5406;
514 final int SHIELD_SLOT_BTN = -5409;
515 final int VIEW_PRESET_BTN = -5417;
516 final int SAVE_PRESET_BTN = -5422;
517 final int VIEW_ALL_BTN = -5428;
518 final int OPEN_OVERRIDE_BTN = 27659;
519}
Map< String, OverridePreset > presets
void renamePreset(String currentName, String newName)
void managePresetDialogue(String presetName)
final Map< Integer, String > presetButtons
final Map< Integer, Integer > buttons
void setFilter(EquipmentType equipmentType, String name)
SendConfig toggleConfig(int itemId, String toggle)
This class represents a character controlled by a player.
Definition Player.java:125
The container class that represents an item that can be interacted with.
Definition Item.java:21
final int getId()
Gets the identification of this item.
Definition Item.java:324
ItemDefinition getDefinition()
Gets the item definition for the item identifier.
Definition Item.java:315
WeaponInterface getWeaponInterface()
Definition Item.java:488
The container that manages the equipment for a player.
Handles checking if mobs are in a certain area.
Definition Area.java:13
static boolean inDuelArena(Interactable entity)
Definition Area.java:311
static boolean inWilderness(Position position)
Definition Area.java:272
The OutgoingPacket responsible for changing settings on a client.
Sends a chatbox input prompt that accepts full text with spaces.
The OutgoingPacket that sends a string to a Players itemcontainer in the client.
The enumerated type whose elements represent the fighting styles.
The enumerated type whose elements represent the fighting types.
final FightStyle getStyle()
Gets the style active when this type is active.
The enumerated type whose elements represent the weapon interfaces.
final FightType[] getFightTypes()
Gets the fight types that correspond with this interface.
The enumerated types of a players equipped item slots.