- 6
- 1
- 2
Нужна помощь: получение конкретного слова из чата, на которое кликнул человек.
Идея (в paint схематично нарисовал ожидаемое поведение): человек просто открывает чат и кликает на какое-то слово из сообщения в чате. Это слово должно затем неким образом обрабатываться (обработка не является частью вопроса, до нее еще дойти надо).
Вопрос: каким образом возможно вытащить это конкретное слово, на которое кликнул человек?
Мои действия: я создал обработчик GuiScreenEvent.MouseInputEvent события, после чего я получил GuiNewChat и вытащил строку по координатам, которые я узнал за счет Mouse.getX/Y(). Это работает, но проблема в том, что я получил всю строку целиком, а не конкретное слово, на которое нажал человек. Что следует сделать дальше, чтобы вытащить именно слово, на которое кликнул игрок?
Я думал попробовать расплитать строку и как то ее обработать или использовать все те же полученные от Mouse координаты, чтобы что то со строкой сделать, но, во первых, не думаю, что это будет работать, во вторых, похоже на какой то костыль ведь.
Код:
P.S. еще вопрос: почему в чат отправляется два (или даже больше) сообщений, когда я нажимаю на сообщение в чате?
Идея (в paint схематично нарисовал ожидаемое поведение): человек просто открывает чат и кликает на какое-то слово из сообщения в чате. Это слово должно затем неким образом обрабатываться (обработка не является частью вопроса, до нее еще дойти надо).
Вопрос: каким образом возможно вытащить это конкретное слово, на которое кликнул человек?
Мои действия: я создал обработчик GuiScreenEvent.MouseInputEvent события, после чего я получил GuiNewChat и вытащил строку по координатам, которые я узнал за счет Mouse.getX/Y(). Это работает, но проблема в том, что я получил всю строку целиком, а не конкретное слово, на которое нажал человек. Что следует сделать дальше, чтобы вытащить именно слово, на которое кликнул игрок?
Я думал попробовать расплитать строку и как то ее обработать или использовать все те же полученные от Mouse координаты, чтобы что то со строкой сделать, но, во первых, не думаю, что это будет работать, во вторых, похоже на какой то костыль ведь.
Код:
Обработчик нажатия на слово в чате:
package com.s0qva.easypunishment.client.handler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiNewChat;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentString;
import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.lwjgl.input.Mouse;
import java.util.Objects;
public class SelectedChatWordEventHandler {
private static final Logger LOGGER = LogManager.getLogger();
private static final int LEFT_MOUSE_BUTTON_INDEX = 0;
@SubscribeEvent
public void extractSelectedChatWord(GuiScreenEvent.MouseInputEvent event) {
ITextComponent selectedMessageLine;
ITextComponent messageToSend;
String selectedMessage;
GuiNewChat chatGUI = getGuiNewChat();
boolean isLeftMouseButton = Mouse.isButtonDown(LEFT_MOUSE_BUTTON_INDEX);
int xSelectedCord = Mouse.getX();
int ySelectedCord = Mouse.getY();
if (!isLeftMouseButton || !chatGUI.getChatOpen()) {
return;
}
LOGGER.info("X: {}, Y: {}", xSelectedCord, ySelectedCord);
selectedMessageLine = chatGUI.getChatComponent(xSelectedCord, ySelectedCord);
if (Objects.isNull(selectedMessageLine)) {
LOGGER.warn("Failed to obtain a chat message");
return;
}
selectedMessage = selectedMessageLine.getUnformattedText();
LOGGER.info("Obtained message: {}", selectedMessage);
messageToSend = new TextComponentString("You've selected: " + selectedMessage);
LOGGER.info("Message to send: {}", messageToSend);
sendMessage(messageToSend);
}
private GuiNewChat getGuiNewChat() {
return Minecraft.getMinecraft()
.ingameGUI
.getChatGUI();
}
private void sendMessage(ITextComponent message) {
Minecraft.getMinecraft()
.player
.sendMessage(message);
}
}
P.S. еще вопрос: почему в чат отправляется два (или даже больше) сообщений, когда я нажимаю на сообщение в чате?