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:
|
event:
|
||||||
- push
|
- push
|
||||||
- pull_request
|
- pull_request
|
||||||
|
- tag
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: gradle-build
|
- name: gradle-build
|
||||||
@@ -15,3 +16,18 @@ steps:
|
|||||||
commands:
|
commands:
|
||||||
- gradle --no-daemon clean build
|
- gradle --no-daemon clean build
|
||||||
- ls -la build/libs
|
- 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`.
|
Дата релиза `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.
|
Если в 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;
|
- запуск Docker pipeline;
|
||||||
- `gradle clean build`;
|
- `gradle clean build`;
|
||||||
- вывод содержимого `build/libs`.
|
- вывод содержимого `build/libs`;
|
||||||
|
- по тегу — публикует jar-ы из `build/libs/*.jar` как Gitea Release.
|
||||||
|
|
||||||
Для работы Drone runner должен иметь доступ в интернет, чтобы скачать зависимости Gradle/Fabric.
|
Для работы 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
|
minecraft_version=26.2
|
||||||
loader_version=0.19.3
|
loader_version=0.19.3
|
||||||
fabric_version=0.152.2+26.2
|
fabric_version=0.152.2+26.2
|
||||||
loom_version=1.17-SNAPSHOT
|
|
||||||
|
|
||||||
mod_version=1.0.0
|
mod_version=1.0.0
|
||||||
maven_group=ru.nevetime
|
maven_group=ru.nevetime
|
||||||
|
|||||||
@@ -11,12 +11,21 @@ import net.minecraft.network.chat.Component;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
public final class ClientIrcMod implements ClientModInitializer {
|
public final class ClientIrcMod implements ClientModInitializer {
|
||||||
public static final String MOD_ID = "clientirc";
|
public static final String MOD_ID = "clientirc";
|
||||||
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
|
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
|
||||||
|
|
||||||
private static final String COMMAND_PREFIX = ".irc";
|
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 IrcConfig config;
|
||||||
private static IrcService service;
|
private static IrcService service;
|
||||||
|
|
||||||
@@ -27,10 +36,16 @@ public final class ClientIrcMod implements ClientModInitializer {
|
|||||||
|
|
||||||
ClientLifecycleEvents.CLIENT_STARTED.register(client -> {
|
ClientLifecycleEvents.CLIENT_STARTED.register(client -> {
|
||||||
if (config.autoConnect) {
|
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 -> {
|
ClientTickEvents.END_CLIENT_TICK.register(client -> {
|
||||||
IrcService.DisplayLine line;
|
IrcService.DisplayLine line;
|
||||||
while ((line = service.pollLine()) != null) {
|
while ((line = service.pollLine()) != null) {
|
||||||
@@ -63,9 +78,12 @@ public final class ClientIrcMod implements ClientModInitializer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ("reconnect".equalsIgnoreCase(argument)) {
|
if ("reconnect".equalsIgnoreCase(argument)) {
|
||||||
boolean connected = service.reconnect(resolvePlayerName(client));
|
String playerName = resolvePlayerName(client);
|
||||||
|
IO_EXECUTOR.execute(() -> {
|
||||||
|
boolean connected = service.reconnect(playerName);
|
||||||
ChatFormatting color = connected ? ChatFormatting.GREEN : ChatFormatting.RED;
|
ChatFormatting color = connected ? ChatFormatting.GREEN : ChatFormatting.RED;
|
||||||
pushClientChat(client, Component.literal("[IRC] reconnect " + (connected ? "ok" : "failed")).withStyle(color));
|
pushClientChat(client, Component.literal("[IRC] reconnect " + (connected ? "ok" : "failed")).withStyle(color));
|
||||||
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,15 +94,16 @@ public final class ClientIrcMod implements ClientModInitializer {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!service.ensureConnected(resolvePlayerName(client))) {
|
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));
|
pushClientChat(client, Component.literal("[IRC] server is offline or config is wrong").withStyle(ChatFormatting.RED));
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!service.sendChat(playerName, argument)) {
|
||||||
boolean sent = service.sendChat(resolvePlayerName(client), argument);
|
|
||||||
if (!sent) {
|
|
||||||
pushClientChat(client, Component.literal("[IRC] send failed").withStyle(ChatFormatting.RED));
|
pushClientChat(client, Component.literal("[IRC] send failed").withStyle(ChatFormatting.RED));
|
||||||
}
|
}
|
||||||
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,15 +112,17 @@ public final class ClientIrcMod implements ClientModInitializer {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
client.execute(() -> {
|
client.execute(() -> {
|
||||||
if (client.gui != null && client.gui.getChat() != null) {
|
if (client.player != null) {
|
||||||
client.gui.getChat().addMessage(text);
|
client.player.sendSystemMessage(text);
|
||||||
|
} else {
|
||||||
|
LOGGER.info(text.getString());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String resolvePlayerName(Minecraft client) {
|
private static String resolvePlayerName(Minecraft client) {
|
||||||
if (client != null && client.player != null) {
|
if (client != null && client.player != null) {
|
||||||
return client.player.getGameProfile().getName();
|
return client.player.getGameProfile().name();
|
||||||
}
|
}
|
||||||
if (client != null && client.getUser() != null) {
|
if (client != null && client.getUser() != null) {
|
||||||
return client.getUser().getName();
|
return client.getUser().getName();
|
||||||
|
|||||||
Reference in New Issue
Block a user