forked from me/e4mc_minecraft
Compare commits
13 commits
Author | SHA1 | Date | |
---|---|---|---|
b8af07aa4e | |||
65f33361c2 | |||
90bf86654d | |||
914ec34792 | |||
03bf7973d9 | |||
0fa970ba64 | |||
db702f60ff | |||
d802ff27d8 | |||
7f646312b9 | |||
82d7d802ff | |||
be472b16a4 | |||
ab56f6dc19 | |||
df7ceb5911 |
12 changed files with 193 additions and 16 deletions
23
README.md
Normal file
23
README.md
Normal file
|
@ -0,0 +1,23 @@
|
|||
# [e4mc_minecraft](https://e4mc.link)
|
||||
|
||||
[](https://modrinth.com/project/qANg5Jrr)
|
||||
[](https://modrinth.com/project/qANg5Jrr)
|
||||
[](https://curseforge.com/minecraft/mc-mods/e4mc)
|
||||
|
||||
Open a LAN server to anyone, anywhere, anytime.
|
||||
|
||||
## Install
|
||||
|
||||
[Modrinth](https://modrinth.com/project/qANg5Jrr)
|
||||
|
||||
## Usage
|
||||
|
||||
Open to LAN as normal
|
||||
|
||||
## Contributing
|
||||
|
||||
Please contribute
|
||||
|
||||
## License
|
||||
|
||||
[MIT](LICENSE)
|
|
@ -3,5 +3,5 @@ org.gradle.jvmargs=-Xmx2G
|
|||
|
||||
mod.name=e4mc
|
||||
mod.id=e4mc_minecraft
|
||||
mod.version=2.1.0
|
||||
mod.version=3.0.0
|
||||
mod.group=vg.skye
|
|
@ -13,6 +13,7 @@ import org.spongepowered.asm.mixin.injection.At;
|
|||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
import vg.skye.e4mc_minecraft.E4mcClient;
|
||||
import vg.skye.e4mc_minecraft.E4mcRelayHandler;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
@ -22,7 +23,6 @@ import java.net.InetAddress;
|
|||
@Mixin(ServerNetworkIo.class)
|
||||
public abstract class ServerNetworkIoMixin {
|
||||
private static final ThreadLocal<Boolean> initializingE4mc = ThreadLocal.withInitial(() -> false);
|
||||
private static E4mcRelayHandler e4mcHandler = null;
|
||||
|
||||
@Shadow
|
||||
public abstract void bind(@Nullable InetAddress address, int port) throws IOException;
|
||||
|
@ -40,7 +40,7 @@ public abstract class ServerNetworkIoMixin {
|
|||
}
|
||||
} else {
|
||||
E4mcRelayHandler handler = new E4mcRelayHandler();
|
||||
e4mcHandler = handler;
|
||||
E4mcClient.HANDLER = handler;
|
||||
handler.connect();
|
||||
}
|
||||
}
|
||||
|
@ -56,8 +56,10 @@ public abstract class ServerNetworkIoMixin {
|
|||
}
|
||||
|
||||
@Inject(method = "stop", at = @At("HEAD"))
|
||||
private void bind(CallbackInfo ci) {
|
||||
e4mcHandler.close();
|
||||
private void stop(CallbackInfo ci) {
|
||||
if (E4mcClient.HANDLER != null) {
|
||||
E4mcClient.HANDLER.close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -2,27 +2,100 @@ package vg.skye.e4mc_minecraft
|
|||
|
||||
//#if FABRIC==1
|
||||
import net.fabricmc.api.ModInitializer
|
||||
//#if MC>=11904
|
||||
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback
|
||||
//#else
|
||||
//$$ import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback
|
||||
//#endif
|
||||
//#else
|
||||
//$$ import net.minecraftforge.fml.common.Mod
|
||||
//$$ import net.minecraftforge.eventbus.api.SubscribeEvent
|
||||
//$$ import net.minecraftforge.event.RegisterCommandsEvent
|
||||
//#endif
|
||||
import net.minecraft.server.command.CommandManager.*
|
||||
//#if MC>=11904
|
||||
import net.minecraft.text.Text
|
||||
//#elseif FABRIC==1
|
||||
//$$ import net.minecraft.text.TranslatableText
|
||||
//#else
|
||||
//$$ import net.minecraft.network.chat.TranslatableComponent
|
||||
//#endif
|
||||
import org.slf4j.Logger
|
||||
import org.slf4j.LoggerFactory
|
||||
|
||||
|
||||
//#if FORGE==1
|
||||
//$$ @Mod("e4mc_minecraft")
|
||||
//$$ @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE)
|
||||
//$$ object E4mcClient {
|
||||
//#else
|
||||
object E4mcClient : ModInitializer {
|
||||
//#endif
|
||||
const val NAME = "e4mc"
|
||||
const val ID = "e4mc_minecraft"
|
||||
const val VERSION = "2.1.0"
|
||||
const val VERSION = "3.0.0"
|
||||
@JvmField
|
||||
val LOGGER: Logger = LoggerFactory.getLogger("e4mc")
|
||||
@JvmField
|
||||
var HANDLER: E4mcRelayHandler? = null
|
||||
|
||||
//#if FABRIC==1
|
||||
override fun onInitialize() {
|
||||
// nothing needed
|
||||
//#if MC>=11904
|
||||
CommandRegistrationCallback.EVENT.register { dispatcher, _, _ ->
|
||||
//#else
|
||||
//$$ CommandRegistrationCallback.EVENT.register { dispatcher, _ ->
|
||||
//#endif
|
||||
dispatcher.register(literal("e4mc")
|
||||
.then(
|
||||
literal("stop")
|
||||
.executes { context ->
|
||||
if (HANDLER != null) {
|
||||
HANDLER!!.close()
|
||||
HANDLER = null
|
||||
//#if MC>=11904
|
||||
context.source.sendMessage(Text.translatable("text.e4mc_minecraft.closeServer"))
|
||||
//#else
|
||||
//$$ context.source.sendFeedback(TranslatableText("text.e4mc_minecraft.closeServer"), false)
|
||||
//#endif
|
||||
} else {
|
||||
//#if MC>=11904
|
||||
context.source.sendMessage(Text.translatable("text.e4mc_minecraft.serverAlreadyClosed"))
|
||||
//#else
|
||||
//$$ context.source.sendFeedback(TranslatableText("text.e4mc_minecraft.serverAlreadyClosed"), false)
|
||||
//#endif
|
||||
}
|
||||
1
|
||||
}
|
||||
))
|
||||
}
|
||||
}
|
||||
//#else
|
||||
//$$ @SubscribeEvent
|
||||
//$$ fun onRegisterCommandEvent(event: RegisterCommandsEvent) {
|
||||
//$$ val commandDispatcher = event.getDispatcher()
|
||||
//$$ commandDispatcher.register(literal("e4mc")
|
||||
//$$ .then(
|
||||
//$$ literal("stop")
|
||||
//$$ .executes { context ->
|
||||
//$$ if (HANDLER != null) {
|
||||
//$$ HANDLER!!.close()
|
||||
//$$ HANDLER = null
|
||||
//$$ //#if MC>=11904
|
||||
//$$ context.source.sendSuccess(Component.translatable("text.e4mc_minecraft.closeServer"), false)
|
||||
//$$ //#else
|
||||
//$$ //$$ context.source.sendSuccess(TranslatableComponent("text.e4mc_minecraft.closeServer"), false)
|
||||
//$$ //#endif
|
||||
//$$ } else {
|
||||
//$$ //#if MC>=11904
|
||||
//$$ context.source.sendFailure(Component.translatable("text.e4mc_minecraft.serverAlreadyClosed"))
|
||||
//$$ //#else
|
||||
//$$ //$$ context.source.sendFailure(TranslatableComponent("text.e4mc_minecraft.serverAlreadyClosed"))
|
||||
//$$ //#endif
|
||||
//$$ }
|
||||
//$$ 1
|
||||
//$$ }
|
||||
//$$ ))
|
||||
//$$ }
|
||||
//#endif
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ data class DomainAssignedMessage(val DomainAssigned: String)
|
|||
data class ChannelOpenMessage(val ChannelOpen: List<Any>)
|
||||
data class ChannelClosedMessage(val ChannelClosed: Number)
|
||||
|
||||
class E4mcRelayHandler: WebSocketClient(URI("wss://ingress.e4mc.link")) {
|
||||
class E4mcRelayHandler: WebSocketClient(URI(System.getProperty("vg.skye.e4mc_minecraft.ingress_uri", "wss://ingress.e4mc.link"))) {
|
||||
private val gson = Gson()
|
||||
private val childChannels = mutableMapOf<Int, LocalChannel>()
|
||||
private val messageQueue = mutableMapOf<Int, ArrayBlockingQueue<ByteBuffer>>()
|
||||
|
@ -122,28 +122,46 @@ class E4mcRelayHandler: WebSocketClient(URI("wss://ingress.e4mc.link")) {
|
|||
private fun createMessage(domain: String): Text {
|
||||
//#if MC>=11900
|
||||
return Text.translatable(
|
||||
"text.e4mc_quilt.domainAssigned",
|
||||
"text.e4mc_minecraft.domainAssigned",
|
||||
Text.literal(domain).styled {
|
||||
it
|
||||
.withClickEvent(ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, domain))
|
||||
.withColor(Formatting.GREEN)
|
||||
.withHoverEvent(HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.translatable("chat.copy.click")))
|
||||
}
|
||||
).append(
|
||||
Text.translatable("text.e4mc_minecraft.clickToStop").styled {
|
||||
it
|
||||
.withClickEvent(ClickEvent(ClickEvent.Action.RUN_COMMAND, "/e4mc stop"))
|
||||
.withColor(Formatting.GRAY)
|
||||
}
|
||||
)
|
||||
//#elseif FABRIC==1
|
||||
//$$ return TranslatableText("text.e4mc_quilt.domainAssigned", LiteralText(domain).styled {
|
||||
//$$ return TranslatableText("text.e4mc_minecraft.domainAssigned", LiteralText(domain).styled {
|
||||
//$$ return@styled it
|
||||
//$$ .withClickEvent(ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, domain))
|
||||
//$$ .withColor(Formatting.GREEN)
|
||||
//$$ .withHoverEvent(HoverEvent(HoverEvent.Action.SHOW_TEXT, TranslatableText("chat.copy.click")))
|
||||
//$$ })
|
||||
//$$ }).append(
|
||||
//$$ TranslatableText("text.e4mc_minecraft.clickToStop").styled {
|
||||
//$$ return@styled it
|
||||
//$$ .withClickEvent(ClickEvent(ClickEvent.Action.RUN_COMMAND, "/e4mc stop"))
|
||||
//$$ .withColor(Formatting.GRAY)
|
||||
//$$ }
|
||||
//$$ )
|
||||
//#else
|
||||
//$$ return TranslatableComponent("text.e4mc_quilt.domainAssigned", TextComponent(domain).withStyle {
|
||||
//$$ return TranslatableComponent("text.e4mc_minecraft.domainAssigned", TextComponent(domain).withStyle {
|
||||
//$$ return@withStyle it
|
||||
//$$ .withClickEvent(ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, domain))
|
||||
//$$ .withColor(ChatFormatting.GREEN)
|
||||
//$$ .withHoverEvent(HoverEvent(HoverEvent.Action.SHOW_TEXT, TranslatableComponent("chat.copy.click")))
|
||||
//$$ })
|
||||
//$$ }).append(
|
||||
//$$ TranslatableComponent("text.e4mc_minecraft.clickToStop").withStyle {
|
||||
//$$ return@withStyle it
|
||||
//$$ .withClickEvent(ClickEvent(ClickEvent.Action.RUN_COMMAND, "/e4mc stop"))
|
||||
//$$ .withColor(ChatFormatting.GRAY)
|
||||
//$$ }
|
||||
//$$ )
|
||||
//#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
{
|
||||
"text.e4mc_quilt.domainAssigned": "Τοπικό παιχνίδι εξυπηρετήται στη διεύθηνση [%s]"
|
||||
"text.e4mc_minecraft.domainAssigned": "Τοπικό παιχνίδι εξυπηρετήται στη διεύθηνση [%s]",
|
||||
"text.e4mc_minecraft.closeServer": "Το τοπικό παιχνίδι δεν εξυπηρετήται δημόσια πλέον",
|
||||
"text.e4mc_minecraft.serverAlreadyClosed": "Το τοπικό παιχνίδι δεν εξυπηρετήται δημόσια",
|
||||
"text.e4mc_minecraft.clickToStop": " (Πατήστε εδώ για απενεργοποίηση)"
|
||||
}
|
|
@ -1,3 +1,6 @@
|
|||
{
|
||||
"text.e4mc_quilt.domainAssigned": "Local game hosted on domain [%s]"
|
||||
"text.e4mc_minecraft.domainAssigned": "Local game hosted on domain [%s]",
|
||||
"text.e4mc_minecraft.closeServer": "Local game no longer publicly hosted",
|
||||
"text.e4mc_minecraft.serverAlreadyClosed": "Local game not publicly hosted",
|
||||
"text.e4mc_minecraft.clickToStop": " (Click here to stop)"
|
||||
}
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
{
|
||||
"text.e4mc_quilt.domainAssigned": "Kohalik mäng on üles seatud domeenil [%s]"
|
||||
"text.e4mc_minecraft.domainAssigned": "Kohalik mäng on üles seatud domeenil [%s]",
|
||||
"text.e4mc_minecraft.closeServer": "Kohalik mäng ei ole enam avalikult hostitud",
|
||||
"text.e4mc_minecraft.serverAlreadyClosed": "Kohalik mäng ei ole avalikult hostitud",
|
||||
"text.e4mc_minecraft.clickToStop": " (Klõpsa lõpetamiseks)"
|
||||
}
|
6
src/main/resources/assets/e4mc_quilt/lang/ko_kr.json
Normal file
6
src/main/resources/assets/e4mc_quilt/lang/ko_kr.json
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"text.e4mc_minecraft.domainAssigned": "로컬 게임을 도메인 [%s]에서 호스트합니다",
|
||||
"text.e4mc_minecraft.closeServer": "로컬 게임이 더이상 공개되지 않습니다",
|
||||
"text.e4mc_minecraft.serverAlreadyClosed": "로컬 게임이 이미 공개중이 아닙니다",
|
||||
"text.e4mc_minecraft.clickToStop": " (멉추려면 여기를 클릭하세요)"
|
||||
}
|
6
src/main/resources/assets/e4mc_quilt/lang/zh_cn.json
Normal file
6
src/main/resources/assets/e4mc_quilt/lang/zh_cn.json
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"text.e4mc_minecraft.domainAssigned": "将本地游戏托管在域名[%s]上",
|
||||
"text.e4mc_minecraft.closeServer": "不再公开托管本地游戏",
|
||||
"text.e4mc_minecraft.serverAlreadyClosed": "本地游戏没有被公开托管",
|
||||
"text.e4mc_minecraft.clickToStop": "(点击这里以停止)"
|
||||
}
|
6
src/main/resources/assets/e4mc_quilt/lang/zh_tw.json
Normal file
6
src/main/resources/assets/e4mc_quilt/lang/zh_tw.json
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"text.e4mc_minecraft.domainAssigned": "本地遊戲已託管在網域 [%s]",
|
||||
"text.e4mc_minecraft.closeServer": "本地遊戲不再公開託管",
|
||||
"text.e4mc_minecraft.serverAlreadyClosed": "本地遊戲未公開託管",
|
||||
"text.e4mc_minecraft.clickToStop": "(點擊此處停止)"
|
||||
}
|
|
@ -1,6 +1,9 @@
|
|||
import com.modrinth.minotaur.dependencies.DependencyType
|
||||
import com.modrinth.minotaur.dependencies.ModDependency
|
||||
import org.gradle.configurationcache.extensions.capitalized
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||
import xyz.deftu.gradle.tools.minecraft.CurseRelation
|
||||
import xyz.deftu.gradle.tools.minecraft.CurseRelationType
|
||||
|
||||
plugins {
|
||||
java
|
||||
|
@ -25,6 +28,20 @@ loomHelper {
|
|||
}
|
||||
|
||||
releases {
|
||||
gameVersions.set(when (mcData.version) {
|
||||
11904 -> listOf("1.19", "1.19.1", "1.19.2", "1.19.3", "1.19.4")
|
||||
11802 -> listOf("1.17", "1.17.1", "1.18", "1.18.1", "1.18.2")
|
||||
else -> listOf()
|
||||
})
|
||||
version.set("${modData.version}+${mcData.versionStr}-${mcData.loader.name}")
|
||||
releaseName.set("[${when (mcData.version) {
|
||||
11904 -> "1.19-"
|
||||
11802 -> "1.17-1.18.2"
|
||||
else -> mcData.versionStr
|
||||
}}] [${mcData.loader.name.capitalized()}] ${modData.version}")
|
||||
if (mcData.isFabric) {
|
||||
loaders.set(listOf("fabric", "quilt"))
|
||||
}
|
||||
modrinth {
|
||||
projectId.set("qANg5Jrr")
|
||||
if (mcData.isFabric) {
|
||||
|
@ -42,6 +59,23 @@ releases {
|
|||
)
|
||||
}
|
||||
}
|
||||
curseforge {
|
||||
projectId.set("849519")
|
||||
if (mcData.isFabric) {
|
||||
relations.set(
|
||||
listOf(
|
||||
CurseRelation("fabric-api", CurseRelationType.REQUIRED),
|
||||
CurseRelation("fabric-language-kotlin", CurseRelationType.REQUIRED)
|
||||
)
|
||||
)
|
||||
} else {
|
||||
relations.set(
|
||||
listOf(
|
||||
CurseRelation("kotlin-for-forge", CurseRelationType.REQUIRED)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
|
|
Loading…
Reference in a new issue