Fixed the bug where an NPC would show up on an item dialogue

Refactored both item and double item dialogues
This commit is contained in:
Oven Bread 2025-04-06 08:18:17 +00:00 committed by Ryan
parent 300b714048
commit 7c74bfcb71
4 changed files with 73 additions and 71 deletions

View file

@ -172,7 +172,7 @@ public class IslwynDialogue extends DialoguePlugin {
stage = 21; stage = 21;
break; break;
case 21: case 21:
interpreter.sendDoubleItemMessage(RovingElves.CRYSTAL_BOW_FULL, RovingElves.CRYSTAL_SHIELD_FULL, "Islwyn shows you a crystal bow and a crystal shield."); interpreter.sendDoubleItemMessage(RovingElves.CRYSTAL_BOW_FULL.getId(), RovingElves.CRYSTAL_SHIELD_FULL.getId(), "Islwyn shows you a crystal bow and a crystal shield.");
stage = 22; stage = 22;
break; break;
case 22: case 22:

View file

@ -1842,8 +1842,8 @@ fun sendItemDialogue(player: Player, item: Any, message: String) {
*/ */
fun sendDoubleItemDialogue(player: Player, item1: Any, item2: Any, message: String) { fun sendDoubleItemDialogue(player: Player, item1: Any, item2: Any, message: String) {
when (item1) { when (item1) {
is Item -> player.dialogueInterpreter.sendDoubleItemMessage(item1, item2 as Item, message) is Item -> player.dialogueInterpreter.sendDoubleItemMessage(item1, item2 as Item, *splitLines(message))
is Int -> player.dialogueInterpreter.sendDoubleItemMessage(item1, item2 as Int, message) is Int -> player.dialogueInterpreter.sendDoubleItemMessage(item1, item2 as Int, *splitLines(message))
} }
} }

View file

@ -326,61 +326,37 @@ public final class DialogueInterpreter {
* @param itemId The item id. * @param itemId The item id.
*/ */
public Component sendItemMessage(int itemId, String... messages) { public Component sendItemMessage(int itemId, String... messages) {
if(1 <= messages.length && messages.length < 4) { // Select interface based on number of messages - 241 (1 line) to 244 (4 lines)
ArrayList<String> packedMessages = new ArrayList(); int interfaceId = 240 + messages.length;
for(int i = 0; i < messages.length/2; i++) { player.getInterfaceManager().openChatbox(interfaceId);
packedMessages.add(messages[i] + "<br>" + messages[i+1]); player.getPacketDispatch().sendInterfaceConfig(interfaceId, 1, false);
} player.getPacketDispatch().sendInterfaceConfig(interfaceId, 2, false);
if(messages.length % 2 == 1) { // Hide or empty the title, since double item messages do not have them. (Child 3)
packedMessages.add(messages[messages.length-1]); player.getPacketDispatch().sendString("", interfaceId, 3);
} // Loop and print messages on Child 4,5,6,7 based on messages count.
for(int i = 0; i < messages.length; i++) {
int interfaceId = 241 + (packedMessages.size() - 1); player.getPacketDispatch().sendString(messages[i], interfaceId, 4+i);
player.getInterfaceManager().openChatbox(interfaceId);
player.getPacketDispatch().sendItemOnInterface(itemId, 1, interfaceId, 1);
ItemDefinition itemDef = ItemDefinition.forId(itemId);
player.getPacketDispatch().sendAngleOnInterface(interfaceId, 1, itemDef.getModelZoom() / 2, itemDef.getModelRotationX(), itemDef.getModelRotationY());
player.getPacketDispatch().sendString("", interfaceId, 3);
for(int i = 0; i < packedMessages.size(); i++) {
//System.out.printf("sendItemMessage[%d]: %s\n", i, packedMessages[i]);
player.getPacketDispatch().sendString(packedMessages.get(i), interfaceId, 4+i);
}
} else {
int interfaceId = 131;
//int interfaceId = 173;
//int interfaceId = 519;
//int interfaceId = 757;
//int interfaceId = 760;
player.getInterfaceManager().openChatbox(interfaceId);
String message = messages[0];
for (int i = 1; i < messages.length; i++) {
message += "<br>" + messages[i];
}
switch(interfaceId) {
case 131:
player.getPacketDispatch().sendString(message, 131, 1);
player.getPacketDispatch().sendItemOnInterface(itemId, 1, 131, 2);
break;
case 173:
player.getPacketDispatch().sendString(message, 173, 4);
player.getPacketDispatch().sendString("", 173, 3);
player.getPacketDispatch().sendItemOnInterface(itemId, 1, 173, 1);
break;
case 519:
player.getPacketDispatch().sendString(message, 519, 1);
player.getPacketDispatch().sendItemOnInterface(itemId, 1, 519, 0);
break;
case 757:
player.getPacketDispatch().sendString(message, 757, 2);
player.getPacketDispatch().sendString("", 757, 1);
player.getPacketDispatch().sendItemOnInterface(itemId, 1, 757, 0);
break;
case 760:
player.getPacketDispatch().sendString(message, 760, 0);
player.getPacketDispatch().sendItemOnInterface(itemId, 1, 760, 1);
break;
}
} }
// Set the first Item (child 1)
ItemDefinition itemDef = ItemDefinition.forId(itemId);
player.getPacketDispatch().sendItemOnInterface(itemId, 1, interfaceId, 2);
player.getPacketDispatch().sendAngleOnInterface(interfaceId, 2, itemDef.getModelZoom() / 2, itemDef.getModelRotationX(), itemDef.getModelRotationY());
player.getPacketDispatch().sendRepositionOnInterface(interfaceId, 2, 45, 46);
// Hide the second item which seems to be used for double items (child 1)
player.getPacketDispatch().sendInterfaceConfig(interfaceId, 1, true);
// These are old interfaces which made no sense to use them.
// player.getPacketDispatch().sendString(message, 131, 1);
// player.getPacketDispatch().sendItemOnInterface(itemId, 1, 131, 2);
// player.getPacketDispatch().sendString(message, 173, 4);
// player.getPacketDispatch().sendString("", 173, 3);
// player.getPacketDispatch().sendItemOnInterface(itemId, 1, 173, 1);
// player.getPacketDispatch().sendString(message, 519, 1);
// player.getPacketDispatch().sendItemOnInterface(itemId, 1, 519, 0);
// player.getPacketDispatch().sendString(message, 757, 2);
// player.getPacketDispatch().sendString("", 757, 1);
// player.getPacketDispatch().sendItemOnInterface(itemId, 1, 757, 0);
// player.getPacketDispatch().sendString(message, 760, 0);
// player.getPacketDispatch().sendItemOnInterface(itemId, 1, 760, 1);
return player.getInterfaceManager().getChatbox(); return player.getInterfaceManager().getChatbox();
} }
@ -395,23 +371,40 @@ public final class DialogueInterpreter {
* Send a message with an item next to it. * Send a message with an item next to it.
* @param message The message. * @param message The message.
*/ */
public Component sendDoubleItemMessage(int first, int second, String message) { public Component sendDoubleItemMessage(int first, int second, String... message) {
player.getInterfaceManager().openChatbox(131); return sendDoubleItemMessage(new Item(first), new Item(second), message);
player.getPacketDispatch().sendString(message, 131, 1);
player.getPacketDispatch().sendItemOnInterface(first, 1, 131, 0);
player.getPacketDispatch().sendItemOnInterface(second, 1, 131, 2);
return player.getInterfaceManager().getChatbox();
} }
/** /**
* Send a message with an item next to it. * Send a message with two items next to it.
* @param message The message. * Note that interface 241 to 244 contains 2 childs for images, which is used for sendDoubleItemMessage.
* @param first The first item to display.
* @param second The second item to display.
* @param messages The array of messages, one message per line.
*/ */
public Component sendDoubleItemMessage(Item first, Item second, String message) { public Component sendDoubleItemMessage(Item first, Item second, String... messages) {
player.getInterfaceManager().openChatbox(131); // Select interface based on number of messages - 241 (1 line) to 244 (4 lines)
player.getPacketDispatch().sendString(message, 131, 1); int interfaceId = 240 + messages.length;
player.getPacketDispatch().sendItemOnInterface(first.getId(), first.getAmount(), 131, 0); player.getInterfaceManager().openChatbox(interfaceId);
player.getPacketDispatch().sendItemOnInterface(second.getId(), second.getAmount(), 131, 2); player.getPacketDispatch().sendInterfaceConfig(interfaceId, 1, false);
player.getPacketDispatch().sendInterfaceConfig(interfaceId, 2, false);
// Hide or empty the title, since double item messages do not have them.
player.getPacketDispatch().sendString("", interfaceId, 3);
// Loop and print messages on child 4,5,6,7 based on messages count.
for(int i = 0; i < messages.length; i++) {
player.getPacketDispatch().sendString(messages[i], interfaceId, 4+i);
}
// Set the first item
ItemDefinition itemDef = ItemDefinition.forId(first.getId());
player.getPacketDispatch().sendItemOnInterface(first.getId(), first.getAmount(), interfaceId, 1);
player.getPacketDispatch().sendAngleOnInterface(interfaceId, 1, (int)(itemDef.getModelZoom() / 1.5), itemDef.getModelRotationX(), itemDef.getModelRotationY());
player.getPacketDispatch().sendRepositionOnInterface(interfaceId, 1, 40, 40);
// Set the second items
ItemDefinition itemDef2 = ItemDefinition.forId(second.getId());
player.getPacketDispatch().sendItemOnInterface(second.getId(), second.getAmount(), interfaceId, 2);
player.getPacketDispatch().sendAngleOnInterface(interfaceId, 2, (int)(itemDef2.getModelZoom() / 1.5), itemDef2.getModelRotationX(), itemDef2.getModelRotationY());
player.getPacketDispatch().sendRepositionOnInterface(interfaceId, 2, 60, 65);
return player.getInterfaceManager().getChatbox(); return player.getInterfaceManager().getChatbox();
} }
@ -525,19 +518,24 @@ public final class DialogueInterpreter {
if (expression == -1) { if (expression == -1) {
expression = FacialExpression.HALF_GUILTY.getAnimationId(); expression = FacialExpression.HALF_GUILTY.getAnimationId();
} }
player.getInterfaceManager().openChatbox(interfaceId);
player.getPacketDispatch().sendInterfaceConfig(interfaceId, 1, true);
player.getPacketDispatch().sendInterfaceConfig(interfaceId, 2, false);
player.getPacketDispatch().sendAnimationInterface(expression, interfaceId, 2); player.getPacketDispatch().sendAnimationInterface(expression, interfaceId, 2);
player.getPacketDispatch().sendItemOnInterface(-1, 1, interfaceId, 1); player.getPacketDispatch().sendItemOnInterface(-1, 1, interfaceId, 1);
if (npc) { if (npc) {
player.getPacketDispatch().sendItemOnInterface(-1, 1, interfaceId, 1);
player.getPacketDispatch().sendRepositionOnInterface(interfaceId, 2, 45, 45);
player.getPacketDispatch().sendNpcOnInterface(npcId, interfaceId, 2); player.getPacketDispatch().sendNpcOnInterface(npcId, interfaceId, 2);
player.getPacketDispatch().sendString(NPCDefinition.forId(npcId).getName(), interfaceId, 3); player.getPacketDispatch().sendString(NPCDefinition.forId(npcId).getName(), interfaceId, 3);
} else { } else {
player.getPacketDispatch().sendRepositionOnInterface(interfaceId, 2, 426, 45); // 423 is 47 * 9
player.getPacketDispatch().sendPlayerOnInterface(interfaceId, 2); player.getPacketDispatch().sendPlayerOnInterface(interfaceId, 2);
player.getPacketDispatch().sendString(player.getUsername(), interfaceId, 3); player.getPacketDispatch().sendString(player.getUsername(), interfaceId, 3);
} }
for (int i = 0; i < messages.length; i++) { for (int i = 0; i < messages.length; i++) {
player.getPacketDispatch().sendString(doSubstitutions(player, messages[i]), interfaceId, (i + 4)); player.getPacketDispatch().sendString(doSubstitutions(player, messages[i]), interfaceId, (i + 4));
} }
player.getInterfaceManager().openChatbox(interfaceId);
player.getPacketDispatch().sendInterfaceConfig(player.getInterfaceManager().getChatbox().getId(), 3, false); player.getPacketDispatch().sendInterfaceConfig(player.getInterfaceManager().getChatbox().getId(), 3, false);
return player.getInterfaceManager().getChatbox(); return player.getInterfaceManager().getChatbox();
} }

View file

@ -224,6 +224,10 @@ public final class PacketDispatch {
PacketRepository.send(DisplayModel.class, new DisplayModelContext(player, ModelType.MODEL, modelID,zoom,interfaceId,childId,new Object())); PacketRepository.send(DisplayModel.class, new DisplayModelContext(player, ModelType.MODEL, modelID,zoom,interfaceId,childId,new Object()));
} }
public void sendRepositionOnInterface(int interfaceId, int childId, int positionX, int positionY){
PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, interfaceId, childId, positionX, positionY));
}
public void sendAngleOnInterface(int interfaceId, int childId, int zoom, int pitch, int yaw){ public void sendAngleOnInterface(int interfaceId, int childId, int zoom, int pitch, int yaw){
PacketRepository.send(InterfaceSetAngle.class, new DefaultContext(player, pitch, zoom, yaw, interfaceId, childId)); PacketRepository.send(InterfaceSetAngle.class, new DefaultContext(player, pitch, zoom, yaw, interfaceId, childId));
} }