RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
DialogueFactory.java
1package com.osroyale.content.dialogue;
2
3import com.osroyale.game.world.entity.mob.npc.definition.NpcDefinition;
4import com.osroyale.game.world.entity.mob.player.Player;
5import com.osroyale.game.world.items.Item;
6import com.osroyale.net.packet.out.*;
7import com.osroyale.util.Utility;
8import org.apache.logging.log4j.LogManager;
9import org.apache.logging.log4j.Logger;
10
11import java.util.*;
12
50
51* Represents a factory class that contains important functions for building
52 * dialogues.
53 *
54 * @author nshusa
55 */
56public final class DialogueFactory {
57
58 private static final Logger logger = LogManager.getLogger(DialogueFactory.class);
59
61 private final Queue<Chainable> CHAIN = new ArrayDeque<>();
62
64 private static final int MAXIMUM_LENGTH = 100;
65
67 private final Player player;
68
70 private boolean active;
71
73 private Optional<Runnable> nextAction = Optional.empty();
74 private boolean locked;
75
81 public DialogueFactory(Player player) {
82 this.player = player;
83 }
84
90 public final DialogueFactory sendDialogue(Dialogue dialogue) {
91 player.dialogue = Optional.of(dialogue);
92 dialogue.sendDialogues(this);
93 return this;
94 }
95
103 public final DialogueFactory onAction(Runnable action) {
104 setNextAction(Optional.of(action));
105 return this;
106 }
107
108 public void lock(boolean lock) {
109 this.locked = lock;
110 }
111
118 if (getChain().peek() != null) {
119 Chainable chain = getChain().poll();
120 chain.accept(this);
121 } else {
122 player.interfaceManager.close();
123 }
124 return this;
125 }
126
133 public final DialogueFactory executeOption(int type, Optional<OptionDialogue> result) {
134 if (result.isPresent()) {
135 OptionDialogue optionDialogue = result.get();
136
137 if (type < 0 || type >= optionDialogue.getActions().size()) {
138 return this;
139 }
140
141 optionDialogue.getActions().get(type).run();
142 }
143 execute();
144 return this;
145 }
146
152 public void clear() {
153 CHAIN.clear();
154 nextAction = Optional.empty();
155 player.dialogue = Optional.empty();
156 player.optionDialogue = Optional.empty();
157 setActive(false);
158 player.interfaceManager.setDialogue(-1);
159 player.send(new SendRemoveInterface(false));
160 }
161
167 private final DialogueFactory append(Chainable chain) {
168 this.CHAIN.add(chain);
169 return this;
170 }
171
177 public final Queue<Chainable> getChain() {
178 return CHAIN;
179 }
180
186 public boolean isOption() {
187 Chainable next = getChain().peek();
188 return next instanceof OptionDialogue;
189 }
190
196 public final DialogueFactory execute() {
197 if (locked)
198 return this;
199 if (player.movement.isMoving()) {
200 player.movement.reset();
201 }
202 // check to see if there are anymore dialogues.
203 if (getChain().peek() != null) {
204
205 // there is so, grab the next dialogue.
206 Chainable entry = getChain().poll();
207
208 // is this an option dialogue?
209 if (entry instanceof OptionDialogue) {
210 OptionDialogue option = (OptionDialogue) entry;
211 player.optionDialogue = Optional.of(option);
212 } else {
213 player.optionDialogue = Optional.empty();
214 }
215
216 player.interfaceManager.setDialogue(1);
217 setActive(true);
218 // whatever dialogue it is, accept it.
219 entry.accept(this);
220 } else {
221 // there are no dialogues in this chain.
222 // is there an action?
223 if (getNextAction().isPresent()) {
224 // there is so, execute it.
225 getNextAction().ifPresent($it -> $it.run());
226 // we just used this action so empty it so it can't be used
227 // again.
228 setNextAction(Optional.empty());
229 player.optionDialogue = Optional.empty();
230 return this;
231 }
232 // there are no more dialogues, so clear the screen.
233 player.dialogueFactory.clear();
234 }
235 return this;
236 }
237
243 private final String appendKeywords(String line) {
244 if (line.contains("#username")) {
245 line = line.replace("#username", Utility.formatName((player.getName())));
246 }
247 if (line.contains("#name")) {
248 line = line.replace("#name", Utility.formatName((player.getName())));
249 }
250 return line;
251 }
252
259 public final DialogueFactory sendPlayerChat(String... lines) {
260 return append(new PlayerDialogue(lines));
261 }
262
270 public final DialogueFactory sendPlayerChat(Expression expression, String... lines) {
271 return append(new PlayerDialogue(expression, lines));
272 }
273
281 Expression expression = dialogue.getExpression();
282 String[] lines = dialogue.getLines();
283 validateLength(lines);
284 switch (lines.length) {
285 case 1:
286 player.send(new SendInterfaceAnimation(969, expression.getId()));
287 player.send(new SendString(Utility.formatName(player.getName()), 970));
288 player.send(new SendString(appendKeywords(lines[0]), 971));
289 player.send(new SendPlayerDialogueHead(969));
290 player.send(new SendChatBoxInterface(968));
291 break;
292 case 2:
293 player.send(new SendInterfaceAnimation(974, expression.getId()));
294 player.send(new SendString(Utility.formatName(player.getName()), 975));
295 player.send(new SendString(appendKeywords(lines[0]), 976));
296 player.send(new SendString(appendKeywords(lines[1]), 977));
297 player.send(new SendPlayerDialogueHead(974));
298 player.send(new SendChatBoxInterface(973));
299 break;
300 case 3:
301 player.send(new SendInterfaceAnimation(980, expression.getId()));
302 player.send(new SendString(Utility.formatName(player.getName()), 981));
303 player.send(new SendString(appendKeywords(lines[0]), 982));
304 player.send(new SendString(appendKeywords(lines[1]), 983));
305 player.send(new SendString(appendKeywords(lines[2]), 984));
306 player.send(new SendPlayerDialogueHead(980));
307 player.send(new SendChatBoxInterface(979));
308 break;
309 case 4:
310 player.send(new SendInterfaceAnimation(987, expression.getId()));
311 player.send(new SendString(Utility.formatName(player.getName()), 988));
312 player.send(new SendString(appendKeywords(lines[0]), 989));
313 player.send(new SendString(appendKeywords(lines[1]), 990));
314 player.send(new SendString(appendKeywords(lines[2]), 991));
315 player.send(new SendString(appendKeywords(lines[3]), 992));
316 player.send(new SendPlayerDialogueHead(987));
317 player.send(new SendChatBoxInterface(986));
318 break;
319 default:
320 logger.error(String.format("Invalid player dialogue line length: %s", lines.length));
321 break;
322 }
323 return this;
324 }
325
333 public final DialogueFactory sendNpcChat(int id, String... lines) {
334 return append(new NpcDialogue(id, Expression.DEFAULT, lines));
335 }
336
345 public final DialogueFactory sendNpcChat(int id, Expression expression, String... lines) {
346 return append(new NpcDialogue(id, expression, lines));
347 }
348
355 final DialogueFactory sendNpcChat(NpcDialogue dialogue) {
356 Expression expression = dialogue.getExpression();
357 String[] lines = dialogue.getLines();
358 validateLength(lines);
359 int id = dialogue.getId();
360 final NpcDefinition npcDef = NpcDefinition.get(id);
361
362 if (npcDef == null) return this;
363 switch (lines.length) {
364 case 1:
365 player.send(new SendInterfaceAnimation(4883, expression.getId()));
366 player.send(new SendString(npcDef.getName(), 4884));
367 player.send(new SendString(appendKeywords(lines[0]), 4885));
368 player.send(new SendNpcHead(npcDef.getId(), 4883));
369 player.send(new SendChatBoxInterface(4882));
370 break;
371 case 2:
372 player.send(new SendInterfaceAnimation(4888, expression.getId()));
373 player.send(new SendString(npcDef.getName(), 4889));
374 player.send(new SendString(appendKeywords(lines[0]), 4890));
375 player.send(new SendString(appendKeywords(lines[1]), 4891));
376 player.send(new SendNpcHead(npcDef.getId(), 4888));
377 player.send(new SendChatBoxInterface(4887));
378 break;
379 case 3:
380 player.send(new SendInterfaceAnimation(4894, expression.getId()));
381 player.send(new SendString(npcDef.getName(), 4895));
382 player.send(new SendString(appendKeywords(lines[0]), 4896));
383 player.send(new SendString(appendKeywords(lines[1]), 4897));
384 player.send(new SendString(appendKeywords(lines[2]), 4898));
385 player.send(new SendNpcHead(npcDef.getId(), 4894));
386 player.send(new SendChatBoxInterface(4893));
387 break;
388 case 4:
389 player.send(new SendInterfaceAnimation(4901, expression.getId()));
390 player.send(new SendString(npcDef.getName(), 4902));
391 player.send(new SendString(appendKeywords(lines[0]), 4903));
392 player.send(new SendString(appendKeywords(lines[1]), 4904));
393 player.send(new SendString(appendKeywords(lines[2]), 4905));
394 player.send(new SendString(appendKeywords(lines[3]), 4906));
395 player.send(new SendNpcHead(npcDef.getId(), 4901));
396 player.send(new SendChatBoxInterface(4900));
397 break;
398 default:
399 logger.error(String.format("Invalid npc dialogue line length: %s", lines.length));
400 break;
401 }
402 return this;
403 }
404
413 public final DialogueFactory sendOption(String option1, Runnable action1, String option2, Runnable action2) {
414 return append(new OptionDialogue(option1, action1, option2, action2));
415 }
416
427 public final DialogueFactory sendOption(String option1, Runnable action1, String option2, Runnable action2, String option3, Runnable action3) {
428 return append(new OptionDialogue(option1, action1, option2, action2, option3, action3));
429 }
430
443 public final DialogueFactory sendOption(String option1, Runnable action1, String option2, Runnable action2, String option3, Runnable action3, String option4, Runnable action4) {
444 return append(new OptionDialogue(option1, action1, option2, action2, option3, action3, option4, action4));
445 }
446
461 public final DialogueFactory sendOption(String option1, Runnable action1, String option2, Runnable action2, String option3, Runnable action3, String option4, Runnable action4, String option5, Runnable action5) {
462 return append(new OptionDialogue(option1, action1, option2, action2, option3, action3, option4, action4, option5, action5));
463 }
464
472 String[] options = dialogue.getLines();
473 validateLength(options);
474 switch (options.length) {
475 case 2:
476 player.send(new SendString("Select an Option", 2460));
477 player.send(new SendString(options[0], 2461));
478 player.send(new SendTooltip("</col>Select <col=A89590>" + options[0], 2461));
479 player.send(new SendString(options[1], 2462));
480 player.send(new SendTooltip("</col>Select <col=A89590>" + options[1], 2461));
481 player.send(new SendChatBoxInterface(2459));
482 return this;
483 case 3:
484 player.send(new SendString("Select an Option", 2470));
485 player.send(new SendString(options[0], 2471));
486 player.send(new SendTooltip("</col>Select <col=A89590>" + options[0], 2471));
487 player.send(new SendString(options[1], 2472));
488 player.send(new SendTooltip("</col>Select <col=A89590>" + options[1], 2472));
489 player.send(new SendString(options[2], 2473));
490 player.send(new SendTooltip("</col>Select <col=A89590>" + options[2], 2473));
491 player.send(new SendChatBoxInterface(2469));
492 return this;
493 case 4:
494 player.send(new SendString("Select an Option", 2481));
495 player.send(new SendString(options[0], 2482));
496 player.send(new SendTooltip("</col>Select <col=A89590>" + options[0], 2482));
497 player.send(new SendString(options[1], 2483));
498 player.send(new SendTooltip("</col>Select <col=A89590>" + options[1], 2483));
499 player.send(new SendString(options[2], 2484));
500 player.send(new SendTooltip("</col>Select <col=A89590>" + options[2], 2484));
501 player.send(new SendString(options[3], 2485));
502 player.send(new SendTooltip("</col>Select <col=A89590>" + options[3], 2485));
503 player.send(new SendChatBoxInterface(2480));
504 return this;
505 case 5:
506 player.send(new SendString("Select an Option", 2493));
507 player.send(new SendString(options[0], 2494));
508 player.send(new SendTooltip("</col>Select <col=A89590>" + options[0], 2494));
509 player.send(new SendString(options[1], 2495));
510 player.send(new SendTooltip("</col>Select <col=A89590>" + options[1], 2495));
511 player.send(new SendString(options[2], 2496));
512 player.send(new SendTooltip("</col>Select <col=A89590>" + options[2], 2496));
513 player.send(new SendString(options[3], 2497));
514 player.send(new SendTooltip("</col>Select <col=A89590>" + options[3], 2497));
515 player.send(new SendString(options[4], 2498));
516 player.send(new SendTooltip("</col>Select <col=A89590>" + options[4], 2498));
517 player.send(new SendChatBoxInterface(2492));
518 return this;
519 }
520 return this;
521 }
522
529 public final DialogueFactory sendStatement(String... lines) {
530 validateLength(lines);
531 append(new StatementDialogue(lines));
532 return this;
533 }
534
541 validateLength(dialogue.getLines());
542 switch (dialogue.getLines().length) {
543 case 1:
544 player.send(new SendString(dialogue.getLines()[0], 357));
545 player.send(new SendChatBoxInterface(356));
546 break;
547 case 2:
548 player.send(new SendString(dialogue.getLines()[0], 360));
549 player.send(new SendString(dialogue.getLines()[1], 361));
550 player.send(new SendChatBoxInterface(359));
551 break;
552 case 3:
553 player.send(new SendString(dialogue.getLines()[0], 364));
554 player.send(new SendString(dialogue.getLines()[1], 365));
555 player.send(new SendString(dialogue.getLines()[2], 366));
556 player.send(new SendChatBoxInterface(363));
557 break;
558 case 4:
559 player.send(new SendString(dialogue.getLines()[0], 369));
560 player.send(new SendString(dialogue.getLines()[1], 370));
561 player.send(new SendString(dialogue.getLines()[2], 371));
562 player.send(new SendString(dialogue.getLines()[3], 372));
563 player.send(new SendChatBoxInterface(368));
564 break;
565 case 5:
566 player.send(new SendString(dialogue.getLines()[0], 375));
567 player.send(new SendString(dialogue.getLines()[1], 376));
568 player.send(new SendString(dialogue.getLines()[2], 377));
569 player.send(new SendString(dialogue.getLines()[3], 378));
570 player.send(new SendString(dialogue.getLines()[4], 379));
571 player.send(new SendChatBoxInterface(374));
572 break;
573 default:
574 logger.error(String.format("Invalid statement dialogue line length: %s", dialogue.getLines().length));
575 break;
576 }
577 return this;
578 }
579
580 public final DialogueFactory sendItem(String title, String text, Item item) {
581 validateLength(text);
582 append(new ItemDialogue(title, text, item.getId()));
583 return this;
584 }
585
586 public final DialogueFactory sendItem(String title, String text, int item) {
587 validateLength(text);
588 append(new ItemDialogue(title, text, item));
589 return this;
590 }
591
592 final DialogueFactory sendItem(ItemDialogue dialogue) {
593 validateLength(dialogue.getContext());
594 player.send(new SendInterfaceAnimation(4883, 591));
595 player.send(new SendString(dialogue.getTitle(), 4884));
596 player.send(new SendString(dialogue.getContext(), 4885));
597 player.send(new SendString("Click here to continue.", 4886));
598 player.send(new SendItemModelOnInterface(4883, 250, dialogue.getItem()));
599 player.send(new SendChatBoxInterface(4882));
600 return this;
601 }
602
603 public final DialogueFactory sendInformationBox(String title, String...lines) {
604 validateLength(lines);
605 append(new InformationDialogue(title, lines));
606 return this;
607 }
608
609 final DialogueFactory sendInformationBox(InformationDialogue dialogue) {
610 validateLength(dialogue.getLines());
611 switch (dialogue.getLines().length) {
612 case 1:
613 player.send(new SendString(dialogue.getTitle(), 6180));
614 player.send(new SendString("", 6181));
615 player.send(new SendString(dialogue.getLines()[0], 6182));
616 player.send(new SendString("", 6183));
617 player.send(new SendString("", 6184));
618 player.send(new SendChatBoxInterface(6179));
619 break;
620 case 2:
621 player.send(new SendString(dialogue.getTitle(), 6180));
622 player.send(new SendString("", 6181));
623 player.send(new SendString(dialogue.getLines()[0], 6182));
624 player.send(new SendString(dialogue.getLines()[1], 6183));
625 player.send(new SendString("", 6184));
626 player.send(new SendChatBoxInterface(6179));
627 break;
628 case 3:
629 player.send(new SendString(dialogue.getTitle(), 6180));
630 player.send(new SendString("", 6181));
631 player.send(new SendString(dialogue.getLines()[0], 6182));
632 player.send(new SendString(dialogue.getLines()[1], 6183));
633 player.send(new SendString(dialogue.getLines()[2], 6184));
634 player.send(new SendChatBoxInterface(6179));
635 break;
636 case 4:
637 player.send(new SendString(dialogue.getTitle(), 6180));
638 player.send(new SendString(dialogue.getLines()[0], 6181));
639 player.send(new SendString(dialogue.getLines()[1], 6182));
640 player.send(new SendString(dialogue.getLines()[2], 6183));
641 player.send(new SendString(dialogue.getLines()[3], 6184));
642 player.send(new SendChatBoxInterface(6179));
643 break;
644 default:
645 logger.error(String.format("Invalid information dialogue line length: %s", dialogue.getLines().length));
646 break;
647 }
648 return this;
649 }
650
657 private final void validateLength(String... text) {
658 if (Arrays.stream(text).filter(Objects::nonNull).anyMatch(s -> s.length() > MAXIMUM_LENGTH)) {
659 throw new IllegalStateException("Dialogue length too long, maximum length is: " + MAXIMUM_LENGTH);
660 }
661 }
662
668 public Player getPlayer() {
669 return player;
670 }
671
678 public Optional<Runnable> getNextAction() {
679 return nextAction;
680 }
681
687 public void setNextAction(Optional<Runnable> nextAction) {
688 this.nextAction = nextAction;
689 }
690
691 public boolean isActive() {
692 return active;
693 }
694
695 public void setActive(boolean active) {
696 this.active = active;
697 }
698
699}
final DialogueFactory sendOption(String option1, Runnable action1, String option2, Runnable action2, String option3, Runnable action3, String option4, Runnable action4, String option5, Runnable action5)
final DialogueFactory sendStatement(String... lines)
final DialogueFactory executeOption(int type, Optional< OptionDialogue > result)
void setNextAction(Optional< Runnable > nextAction)
final DialogueFactory sendDialogue(Dialogue dialogue)
final DialogueFactory sendOption(String option1, Runnable action1, String option2, Runnable action2, String option3, Runnable action3, String option4, Runnable action4)
final DialogueFactory sendOption(String option1, Runnable action1, String option2, Runnable action2, String option3, Runnable action3)
final DialogueFactory sendOption(String option1, Runnable action1, String option2, Runnable action2)
final DialogueFactory onAction(Runnable action)
final DialogueFactory sendPlayerChat(String... lines)
final DialogueFactory sendNpcChat(int id, String... lines)
final DialogueFactory sendNpcChat(int id, Expression expression, String... lines)
final DialogueFactory sendPlayerChat(Expression expression, String... lines)