Compare commits
10 Commits
41b68d45c5
...
v1.0.1
| Author | SHA1 | Date | |
|---|---|---|---|
| 0112bde962 | |||
| b3f24d9828 | |||
| 0e6377fce1 | |||
| b0501acfcd | |||
| 5f366792c3 | |||
| 8a969bc843 | |||
| 71dc665ef1 | |||
| fb233cee93 | |||
| 77a44be34b | |||
| 153d85602c |
16
.drone.yml
16
.drone.yml
@@ -6,6 +6,7 @@ trigger:
|
||||
event:
|
||||
- push
|
||||
- pull_request
|
||||
- tag
|
||||
|
||||
steps:
|
||||
- name: gradle-build
|
||||
@@ -15,3 +16,18 @@ steps:
|
||||
commands:
|
||||
- gradle --no-daemon clean build
|
||||
- ls -la build/libs
|
||||
|
||||
- name: gitea-release
|
||||
image: plugins/gitea-release
|
||||
settings:
|
||||
api_key:
|
||||
from_secret: gitea_token
|
||||
base_url: https://git.nevetime.ru
|
||||
files:
|
||||
- build/libs/*.jar
|
||||
title: ${DRONE_TAG}
|
||||
checksum:
|
||||
- sha256
|
||||
when:
|
||||
event:
|
||||
- tag
|
||||
|
||||
25
README.md
25
README.md
@@ -30,7 +30,7 @@
|
||||
|
||||
Дата релиза `Minecraft 26.2`: `2026-06-16`.
|
||||
|
||||
Для этой версии я использую official Mojang mappings через Loom, потому что стандартный Yarn endpoint для `26.2` на момент правки ещё не отдавал mappings.
|
||||
Начиная с `26.1` Mojang перестал обфусцировать клиент, а Yarn и Intermediary перестали публиковаться после `1.21.11`. Поэтому в `build.gradle` нет блока `mappings` вообще: исходники Minecraft уже в человекочитаемых именах Mojang, и Loom собирает мод напрямую против них.
|
||||
|
||||
Если в CI стоит старый Loom вроде `1.10.5`, сборка `26.2` упадёт с ошибкой `Unsupported class file major version 69`. Для `26.2` нужен новый Loom из актуальной ветки Fabric.
|
||||
|
||||
@@ -144,6 +144,27 @@ gradle build
|
||||
|
||||
- запуск Docker pipeline;
|
||||
- `gradle clean build`;
|
||||
- вывод содержимого `build/libs`.
|
||||
- вывод содержимого `build/libs`;
|
||||
- по тегу — публикует jar-ы из `build/libs/*.jar` как Gitea Release.
|
||||
|
||||
Для работы Drone runner должен иметь доступ в интернет, чтобы скачать зависимости Gradle/Fabric.
|
||||
|
||||
### Автоматический релиз по тегу
|
||||
|
||||
Чтобы Drone выложил собранный мод в раздел Releases репозитория, нужны две разовые настройки и одна команда на каждую новую версию.
|
||||
|
||||
**Один раз:**
|
||||
|
||||
1. В Gitea: `Settings → Applications → Generate New Token`. Дать токену права `write:repository`. Скопировать.
|
||||
2. В Drone, на странице репозитория: `Settings → Secrets → New Secret`. Имя — `gitea_token`, значение — токен из шага 1. Поставить галку `Allow Pull Requests` снять (релизы только из push/tag).
|
||||
|
||||
**На каждую новую версию:**
|
||||
|
||||
```bash
|
||||
git tag v1.0.0
|
||||
git push origin v1.0.0
|
||||
```
|
||||
|
||||
Drone поднимет тег как событие, соберёт мод и положит `client-irc-chat-<версия>.jar` в `https://git.nevetime.ru/Arkon/fdgdfg/releases/tag/v1.0.0`. Версия в имени jar-а берётся из `mod_version` в `gradle.properties` — обычно её стоит поднимать вместе с тегом, чтобы они совпадали.
|
||||
|
||||
Если что-то идёт не так, посмотреть лог конкретного шага `gitea-release` в Drone — плагин печатает HTTP-ответ Gitea, по нему сразу видно, проблема в токене, URL или путях к файлам.
|
||||
|
||||
@@ -6,7 +6,6 @@ org.gradle.configuration-cache=false
|
||||
minecraft_version=26.2
|
||||
loader_version=0.19.3
|
||||
fabric_version=0.152.2+26.2
|
||||
loom_version=1.17-SNAPSHOT
|
||||
|
||||
mod_version=1.0.0
|
||||
maven_group=ru.nevetime
|
||||
|
||||
@@ -11,12 +11,21 @@ import net.minecraft.network.chat.Component;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
public final class ClientIrcMod implements ClientModInitializer {
|
||||
public static final String MOD_ID = "clientirc";
|
||||
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
|
||||
|
||||
private static final String COMMAND_PREFIX = ".irc";
|
||||
|
||||
private static final ExecutorService IO_EXECUTOR = Executors.newSingleThreadExecutor(runnable -> {
|
||||
Thread thread = new Thread(runnable, "clientirc-io");
|
||||
thread.setDaemon(true);
|
||||
return thread;
|
||||
});
|
||||
|
||||
private static IrcConfig config;
|
||||
private static IrcService service;
|
||||
|
||||
@@ -27,10 +36,16 @@ public final class ClientIrcMod implements ClientModInitializer {
|
||||
|
||||
ClientLifecycleEvents.CLIENT_STARTED.register(client -> {
|
||||
if (config.autoConnect) {
|
||||
service.connect(resolvePlayerName(client));
|
||||
String playerName = resolvePlayerName(client);
|
||||
IO_EXECUTOR.execute(() -> service.connect(playerName));
|
||||
}
|
||||
});
|
||||
|
||||
ClientLifecycleEvents.CLIENT_STOPPING.register(client -> {
|
||||
service.disconnect();
|
||||
IO_EXECUTOR.shutdownNow();
|
||||
});
|
||||
|
||||
ClientTickEvents.END_CLIENT_TICK.register(client -> {
|
||||
IrcService.DisplayLine line;
|
||||
while ((line = service.pollLine()) != null) {
|
||||
@@ -63,9 +78,12 @@ public final class ClientIrcMod implements ClientModInitializer {
|
||||
}
|
||||
|
||||
if ("reconnect".equalsIgnoreCase(argument)) {
|
||||
boolean connected = service.reconnect(resolvePlayerName(client));
|
||||
ChatFormatting color = connected ? ChatFormatting.GREEN : ChatFormatting.RED;
|
||||
pushClientChat(client, Component.literal("[IRC] reconnect " + (connected ? "ok" : "failed")).withStyle(color));
|
||||
String playerName = resolvePlayerName(client);
|
||||
IO_EXECUTOR.execute(() -> {
|
||||
boolean connected = service.reconnect(playerName);
|
||||
ChatFormatting color = connected ? ChatFormatting.GREEN : ChatFormatting.RED;
|
||||
pushClientChat(client, Component.literal("[IRC] reconnect " + (connected ? "ok" : "failed")).withStyle(color));
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -76,15 +94,16 @@ public final class ClientIrcMod implements ClientModInitializer {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!service.ensureConnected(resolvePlayerName(client))) {
|
||||
pushClientChat(client, Component.literal("[IRC] server is offline or config is wrong").withStyle(ChatFormatting.RED));
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean sent = service.sendChat(resolvePlayerName(client), argument);
|
||||
if (!sent) {
|
||||
pushClientChat(client, Component.literal("[IRC] send failed").withStyle(ChatFormatting.RED));
|
||||
}
|
||||
String playerName = resolvePlayerName(client);
|
||||
IO_EXECUTOR.execute(() -> {
|
||||
if (!service.ensureConnected(playerName)) {
|
||||
pushClientChat(client, Component.literal("[IRC] server is offline or config is wrong").withStyle(ChatFormatting.RED));
|
||||
return;
|
||||
}
|
||||
if (!service.sendChat(playerName, argument)) {
|
||||
pushClientChat(client, Component.literal("[IRC] send failed").withStyle(ChatFormatting.RED));
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -93,15 +112,17 @@ public final class ClientIrcMod implements ClientModInitializer {
|
||||
return;
|
||||
}
|
||||
client.execute(() -> {
|
||||
if (client.gui != null && client.gui.getChat() != null) {
|
||||
client.gui.getChat().addMessage(text);
|
||||
if (client.player != null) {
|
||||
client.player.sendSystemMessage(text);
|
||||
} else {
|
||||
LOGGER.info(text.getString());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static String resolvePlayerName(Minecraft client) {
|
||||
if (client != null && client.player != null) {
|
||||
return client.player.getGameProfile().getName();
|
||||
return client.player.getGameProfile().name();
|
||||
}
|
||||
if (client != null && client.getUser() != null) {
|
||||
return client.getUser().getName();
|
||||
|
||||
Reference in New Issue
Block a user