Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Прочее IRC exp 3.1

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
16 Апр 2026
Сообщения
54
Реакции
0
Выберите загрузчик игры
  1. OptiFine
не знаю что говорить просто ирс чат.библиотека:
Пожалуйста, авторизуйтесь для просмотра ссылки.
кидать в libraries.ss:
Пожалуйста, авторизуйтесь для просмотра ссылки.

package DickRecode.functions.impl.misc;

import DickRecode.functions.api.Category;
import DickRecode.functions.api.Function;
import DickRecode.functions.api.FunctionRegister;
import DickRecode.functions.settings.impl.StringSetting;
import DickRecode.functions.settings.impl.BindSetting;
import DickRecode.events.EventDisplay;
import DickRecode.events.EventKey;
import DickRecode.events.EventTarget;
import DickRecode.utils.render.ColorUtils;
import DickRecode.utils.render.DisplayUtils;
import DickRecode.utils.render.FontTest.Fonts;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.event.ClickEvent;
import net.minecraft.util.text.event.HoverEvent;
import org.jibble.pircbot.*;

import java.util.*;

@FunctionRegister(name = "IRC", description = "Общий чат", type = Category.Miscellaneous)
public class IRCModule extends Function {

private final StringSetting nickname = new StringSetting("Ник", mc.getSession().getUsername(), "Ваш ник в IRC");
private final BindSetting waypointKey = new BindSetting("Метка", -1);

private final String MAIN_CHANNEL = "#expensive";

private static class Waypoint {
String owner;
double x, y, z;
Waypoint(String owner, double x, double y, double z) {
this.owner = owner; this.x = x; this.y = y; this.z = z;
}
}
private final Map<String, Waypoint> waypoints = new HashMap<>();

private IRCBot bot;
private boolean connected = false;
private String currentRoom = MAIN_CHANNEL;
private final Map<String, List<String>> rooms = new HashMap<>();

private long lastMessageTime = 0;
private final int MESSAGE_DELAY = 3000;

private final String ADMIN_NICK = "soulleddan";
private final String IRC_COLOR_START = "§9§l";
private final String IRC_COLOR_END = "§5§l";

private String pendingInvite = null;
private String pendingInviter = null;

public IRCModule() {
super();
addSettings(nickname, waypointKey);
rooms.put(MAIN_CHANNEL, new ArrayList<>());
}

@Override
public void onEnable() {
super.onEnable();
if (!connected) {
new Thread(() -> {
try {
String desiredNick = nickname.get();
bot = new IRCBot(desiredNick);
bot.connect("irc.libera.chat");
bot.joinChannel(MAIN_CHANNEL);
connected = true;
currentRoom = MAIN_CHANNEL;
sendMessageToChat("§a[IRC] Подключён!");
} catch (Exception e) {
sendMessageToChat("§c[IRC] Ошибка: " + e.getMessage());
e.printStackTrace();
}
}).start();
}
}

@Override
public void onDisable() {
super.onDisable();
if (connected && bot != null) {
bot.disconnect();
connected = false;
sendMessageToChat("§c[IRC] Отключён");
}
}

public void sendMessage(String message) {
if (!connected || bot == null) {
sendMessageToChat("§c[IRC] Не подключён");
return;
}

long currentTime = System.currentTimeMillis();

if (lastMessageTime != 0 && currentTime - lastMessageTime < MESSAGE_DELAY) {
long waitTime = (MESSAGE_DELAY - (currentTime - lastMessageTime)) / 1000;
sendMessageToChat("§c[IRC] Подожди " + waitTime + " сек");
return;
}

bot.sendMessage(currentRoom, message);
lastMessageTime = currentTime;

String roomName = currentRoom.equals(MAIN_CHANNEL) ? "Глобал" : currentRoom.substring(1);
String currentNick = mc.getSession().getUsername();
String role = currentNick.equals(ADMIN_NICK) ? "Админ" : "Юзер";
String roleColor = role.equals("Админ") ? "§c" : "§7";

sendMessageToChat("§7[IRC] " + roleColor + "[" + role + "] §fВы [" + roomName + "]: §7" + message);
}

public void sendPrivateMessage(String target, String message) {
if (!connected || bot == null) {
sendMessageToChat("§c[IRC] Не подключён");
return;
}
bot.sendMessage(target, message);
sendMessageToChat("§7[IRC] §b[ЛС] §fВы -> §d" + target + "§f: §7" + message);
}

public void createRoom(String roomName) {
if (!connected || bot == null) {
sendMessageToChat("§c[IRC] Не подключён");
return;
}

String channel = "#" + roomName;
bot.joinChannel(channel);
rooms.put(channel, new ArrayList<>());

if (!currentRoom.equals(channel)) {
currentRoom = channel;
sendMessageToChat("§a[IRC] Создана комната: §e" + roomName);
sendMessageToChat("§a[IRC] Ты теперь в комнате §e" + roomName);
} else {
sendMessageToChat("§a[IRC] Комната §e" + roomName + " §aуже существует");
}
}

public void joinRoom(String roomName) {
if (!connected || bot == null) {
sendMessageToChat("§c[IRC] Не подключён");
return;
}

if (pendingInvite != null && pendingInvite.equals(roomName)) {
sendMessageToChat("§a[IRC] Вы приняли приглашение от §e" + pendingInviter);
pendingInvite = null;
pendingInviter = null;
}

String channel = "#" + roomName;
if (!rooms.containsKey(channel)) {
rooms.put(channel, new ArrayList<>());
}

if (!currentRoom.equals(channel)) {
bot.joinChannel(channel);
currentRoom = channel;
sendMessageToChat("§a[IRC] Перешёл в комнату: §e" + roomName);
} else {
sendMessageToChat("§c[IRC] Ты уже в этой комнате");
}
}

public void leaveRoom() {
if (!connected || bot == null) {
sendMessageToChat("§c[IRC] Не подключён");
return;
}

if (currentRoom.equals(MAIN_CHANNEL)) {
sendMessageToChat("§c[IRC] Ты уже в глобальном чате");
return;
}

bot.partChannel(currentRoom);
currentRoom = MAIN_CHANNEL;
waypoints.clear();
sendMessageToChat("§a[IRC] Вернулся в глобальный чат");
}

public void listRooms() {
if (rooms.isEmpty()) {
sendMessageToChat("§c[IRC] Нет созданных комнат");
return;
}

sendMessageToChat("§7[IRC] Доступные комнаты:");
for (String room : rooms.keySet()) {
String roomName = room.substring(1);
String current = currentRoom.equals(room) ? " §a(текущая)" : "";
sendMessageToChat("§7- §e" + roomName + current);
}
}

public void inviteToRoom(String playerName, String roomName) {
if (!connected || bot == null) {
sendMessageToChat("§c[IRC] Не подключён");
return;
}

String channel = "#" + roomName;
if (!rooms.containsKey(channel)) {
sendMessageToChat("§c[IRC] Комната §e" + roomName + " §cне существует");
return;
}

bot.sendMessage(playerName, "INVITE:" + roomName + ":" + mc.getSession().getUsername());
sendMessageToChat("§a[IRC] Приглашение отправлено игроку §e" + playerName);
}

public void denyInvite() {
if (pendingInvite == null) {
sendMessageToChat("§c[IRC] Нет активных приглашений");
return;
}
sendMessageToChat("§c[IRC] Приглашение в комнату §e" + pendingInvite + " §cотклонено");
pendingInvite = null;
pendingInviter = null;
}

private void sendMessageToChat(String message) {
if (mc.player != null) {
String coloredMessage = message.replace("[IRC]", IRC_COLOR_START + "[IR" + IRC_COLOR_END + "C]" + "§r");
mc.player.sendMessage(new StringTextComponent(coloredMessage), mc.player.getUniqueID());
}
}

private void sendClickableInvite(String inviter, String roomName) {
if (mc.player == null) return;

StringTextComponent message = new StringTextComponent(IRC_COLOR_START + "[IR" + IRC_COLOR_END + "C]" + "§r §a[IRC] §e" + inviter + " §fприглашает тебя в комнату §b" + roomName + "§f. ");

StringTextComponent acceptButton = new StringTextComponent("§a[Принять]");
acceptButton.getStyle().setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/irc accept " + roomName));
acceptButton.getStyle().setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new StringTextComponent("Нажми, чтобы войти в комнату")));

StringTextComponent denyButton = new StringTextComponent("§c[Отклонить]");
denyButton.getStyle().setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/irc deny"));
denyButton.getStyle().setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new StringTextComponent("Нажми, чтобы отклонить приглашение")));

message.getSiblings().add(acceptButton);
message.getSiblings().add(new StringTextComponent(" "));
message.getSiblings().add(denyButton);

mc.player.sendMessage(message, mc.player.getUniqueID());
}

@EventTarget
public void onKey(EventKey e) {
if (waypointKey.get() != -1 && e.getKey() == waypointKey.get()) {
if (!connected || bot == null || mc.player == null) return;
double wx = mc.player.getPosX();
double wy = mc.player.getPosY();
double wz = mc.player.getPosZ();
String myNick = mc.getSession().getUsername();
waypoints.put(myNick, new Waypoint(myNick, wx, wy, wz));
String msg = "WAYPOINT:" + wx + ":" + wy + ":" + wz;
bot.sendMessage(currentRoom, msg);
sendMessageToChat("§a[IRC] Метка установлена на " + String.format("%.0f", wx) + " " + String.format("%.0f", wy) + " " + String.format("%.0f", wz));
}
}

@EventTarget
public void onRender(EventDisplay e) {
if (e.getType() != EventDisplay.Type.POST) return;
if (mc.player == null || waypoints.isEmpty()) return;

MatrixStack ms = e.getMatrixStack();

for (Waypoint wp : waypoints.values()) {
double x = wp.x - mc.getRenderManager().info.getProjectedView().getX();
double y = wp.y - mc.getRenderManager().info.getProjectedView().getY();
double z = wp.z - mc.getRenderManager().info.getProjectedView().getZ();

double cos = Math.cos(Math.toRadians(mc.gameRenderer.getActiveRenderInfo().getYaw()));
double sin = Math.sin(Math.toRadians(mc.gameRenderer.getActiveRenderInfo().getYaw()));
double rotY = -(z * cos - x * sin);
double rotX = -(x * cos + z * sin);

float angle = (float)(Math.atan2(rotY, rotX) * 180.0 / Math.PI);
if (angle < 0.0F) angle += 360.0F;

float offset = 60.0F;
double screenX = mc.getMainWindow().scaledWidth() / 2.0F + offset * MathHelper.cos((float)Math.atan2(rotY, rotX));
double screenY = mc.getMainWindow().scaledHeight() / 2.0F + offset * MathHelper.sin((float)Math.atan2(rotY, rotX));

GlStateManager.pushMatrix();
GlStateManager.translated(screenX, screenY, 0);
GlStateManager.rotatef(angle, 0, 0, 1);

Fonts.ICONS.get(16.0F).draw(ms, "F", -8, -8, ColorUtils.rgb(255, 200, 50));

GlStateManager.rotatef(-angle, 0, 0, 1);

double dist = Math.sqrt(x * x + y * y + z * z);
String text = wp.owner + " " + String.format("%.0f", dist) + "m";
Fonts.SF_REGULAR.get(6.0F).drawCenter(ms, text, 0, 12, ColorUtils.rgb(255, 255, 255));

GlStateManager.popMatrix();
}
}

private class IRCBot extends PircBot { public IRCBot(String nick) {
setName(nick);
}

@Override
public void onMessage(String channel, String sender, String login, String hostname, String message) {
if (mc.player == null) return;

String roomName = channel.equals(MAIN_CHANNEL) ? "Глобал" : channel.substring(1);

String role = sender.equals(ADMIN_NICK) ? "Админ" : "Юзер";
String roleColor = role.equals("Админ") ? "§c" : "§7";

if (message.startsWith("LEAVE:")) {
String leaver = message.substring(6);
if (currentRoom.equals(channel)) {
mc.player.sendMessage(new StringTextComponent(IRC_COLOR_START + "[IR" + IRC_COLOR_END + "C]" + "§r §c[IRC] §e" + leaver + " §fвышел из комнаты"), mc.player.getUniqueID());
}
return;
}

if (message.startsWith("WAYPOINT:")) {
try {
String[] parts = message.split(":");
double wx = Double.parseDouble(parts[1]);
double wy = Double.parseDouble(parts[2]);
double wz = Double.parseDouble(parts[3]);
waypoints.put(sender, new Waypoint(sender, wx, wy, wz));
sendMessageToChat("§a[IRC] §e" + sender + " §fпоставил метку");
} catch (Exception ignored) {}
return;
}

if (message.startsWith("INVITE:") && channel.equals(MAIN_CHANNEL)) {
String[] parts = message.split(":");
if (parts.length >= 3) {
String room = parts[1];
String inviter = parts[2];
pendingInvite = room;
pendingInviter = inviter;
sendClickableInvite(inviter, room);
}
return;
}

if (currentRoom.equals(MAIN_CHANNEL) || channel.equals(currentRoom)) {
String colored = IRC_COLOR_START + "[IR" + IRC_COLOR_END + "C]" + "§r " + roleColor + "[" + role + "] §f" + sender + " [" + roomName + "]: §7" + message;
mc.player.sendMessage(new StringTextComponent(colored), mc.player.getUniqueID());
}
}

@Override
public void onPrivateMessage(String sender, String login, String hostname, String message) {
if (mc.player == null) return;

if (message.startsWith("INVITE:")) {
String[] parts = message.split(":");
if (parts.length >= 3) {
String roomName = parts[1];
String inviter = parts[2];
pendingInvite = roomName;
pendingInviter = inviter;
sendClickableInvite(inviter, roomName);
}
return;
}

String colored = IRC_COLOR_START + "[IR" + IRC_COLOR_END + "C]" + "§r §b[ЛС] §d" + sender + "§f: §7" + message;
mc.player.sendMessage(new StringTextComponent(colored), mc.player.getUniqueID());
}
}
} Потом добавляем команду
package DickRecode.commands;

import DickRecode.Dick;
import DickRecode.functions.impl.misc.IRCModule;
import DickRecode.utils.client.ClientUtil;
import net.minecraft.util.text.TextFormatting;

@CommandInfo(name = "irc", description = "")
public class IRCCommand extends Command {

@Override
public void run(String[] args) throws Exception {
IRCModule irc = Dick.getInstance().getFunctionRegistry().getIRC();

if (irc == null) {
sendMessage(TextFormatting.RED + "[IRC] Модуль не найден");
return;
}

if (!irc.isState()) {
sendMessage(TextFormatting.RED + "[IRC] Модуль выключен. Используй .toggle IRC");
return;
}

if (args.length == 1) {
sendMessage(TextFormatting.RED + "Используй .irc help для справки");
return;
}

String subCommand = args[1].toLowerCase();

switch (subCommand) {
case "accept":
if (args.length < 3) {
sendMessage(TextFormatting.RED + "Использование: .irc accept <название комнаты>");
return;
}
irc.joinRoom(args[2]);
break;

case "deny":
irc.denyInvite();
break;

case "msg":
if (args.length < 4) {
sendMessage(TextFormatting.RED + "Использование: .irc msg <ник> <сообщение>");
return;
}
String target = args[2];
StringBuilder message = new StringBuilder();
for (int i = 3; i < args.length; i++) {
message.append(args).append(" ");
}
irc.sendPrivateMessage(target, message.toString().trim());

break;

case "create":
if (args.length < 3) {
sendMessage(TextFormatting.RED + "Использование: .irc create <название>");

return;
}
irc.createRoom(args[2]);

break;

case "join":
if (args.length < 3) {
sendMessage(TextFormatting.RED + "Использование: .irc join <название>");

return;
}
irc.joinRoom(args[2]);

break;

case "leave":
irc.leaveRoom();

break;

case "rooms":
irc.listRooms();

break;

case "invite":
if (args.length < 4) {
sendMessage(TextFormatting.RED + "Использование: .irc invite <ник> <название комнаты>");

return;
}
irc.inviteToRoom(args[2], args[3]);

break;

case "help":
sendMessage(TextFormatting.GRAY + "=== IRC Команды ===");
sendMessage(TextFormatting.WHITE + ".irc <текст>" + TextFormatting.GRAY + " - Отправить сообщение");
sendMessage(TextFormatting.WHITE + ".irc msg <ник> <текст>" + TextFormatting.GRAY + " - Личное сообщение");
sendMessage(TextFormatting.WHITE + ".irc create <название>" + TextFormatting.GRAY + " - Создать комнату");
sendMessage(TextFormatting.WHITE + ".irc join <название>" + TextFormatting.GRAY + " - Войти в комнату");
sendMessage(TextFormatting.WHITE + ".irc leave" + TextFormatting.GRAY + " - Выйти из комнаты");
sendMessage(TextFormatting.WHITE + ".irc rooms" + TextFormatting.GRAY + " - Список комнат");
sendMessage(TextFormatting.WHITE + ".irc invite <ник> <комната>" + TextFormatting.GRAY + " - Пригласить игрока");
sendMessage(TextFormatting.WHITE + ".irc accept <комната>" + TextFormatting.GRAY + " - Принять приглашение");
sendMessage(TextFormatting.WHITE + ".irc deny" + TextFormatting.GRAY + " - Отклонить приглашение");

break;

default:
StringBuilder msg = new StringBuilder();
for (int i = 1; i < args.length; i++) {
msg.append(args).append(" ");
}
irc.sendMessage(msg.toString().trim());

break;
}
}

@Override
public void error() {
sendMessage(TextFormatting.RED + "Ошибка в команде .irc");
}
}
 
Назад
Сверху Снизу