Merge branch 'dev'
This commit is contained in:
commit
087d516e3e
|
@ -0,0 +1,92 @@
|
||||||
|
|
||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
jcenter()
|
||||||
|
maven { url = "http://files.minecraftforge.net/maven" }
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
classpath "net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id "com.github.johnrengelman.shadow" version "1.2.4"
|
||||||
|
}
|
||||||
|
|
||||||
|
apply plugin: 'net.minecraftforge.gradle.forge'
|
||||||
|
|
||||||
|
version = mc_version + "-" + mod_version
|
||||||
|
|
||||||
|
archivesBaseName = "MatterLink"
|
||||||
|
|
||||||
|
sourceCompatibility = targetCompatibility = '1.8'
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile project(':core')
|
||||||
|
compile group: "net.shadowfacts", name: "Forgelin", version: "1.6.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
shadowJar {
|
||||||
|
classifier ''
|
||||||
|
// configurations = [project.configurations.shadow]
|
||||||
|
|
||||||
|
relocate "org.apache.http", "matterlink.repack.org.apache.http"
|
||||||
|
relocate "org.apache.commons.logging", "matterlink.repack.org.apache.commons.logging"
|
||||||
|
dependencies {
|
||||||
|
include(project(":core"))
|
||||||
|
include(dependency("org.apache.httpcomponents:httpclient:4.3.3"))
|
||||||
|
include(dependency("org.apache.httpcomponents:httpcore:4.3.2"))
|
||||||
|
include(dependency('commons-logging:commons-logging:1.1.3'))
|
||||||
|
}
|
||||||
|
|
||||||
|
exclude 'dummyThing'
|
||||||
|
}
|
||||||
|
|
||||||
|
minecraft {
|
||||||
|
version = mc_version + "-" + forge_version
|
||||||
|
runDir = "run"
|
||||||
|
|
||||||
|
mappings = mcp_mappings
|
||||||
|
|
||||||
|
replaceIn 'MatterLink.kt'
|
||||||
|
replace '@VERSION@', mod_version
|
||||||
|
}
|
||||||
|
|
||||||
|
processResources {
|
||||||
|
// this will ensure that this task is redone when the versions change.
|
||||||
|
inputs.property "version", project.version
|
||||||
|
inputs.property "mcversion", project.minecraft.version
|
||||||
|
|
||||||
|
// replace stuff in mcmod.info, nothing else
|
||||||
|
from(project(":core").sourceSets.main.resources.srcDirs) {
|
||||||
|
include 'mcmod.info'
|
||||||
|
|
||||||
|
// replace version and mcversion
|
||||||
|
expand 'version': project.version, 'mcversion': project.minecraft.version
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy everything else except the mcmod.info
|
||||||
|
from(project(":core").sourceSets.main.resources.srcDirs) {
|
||||||
|
exclude 'mcmod.info'
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceJar {
|
||||||
|
classifier 'sources'
|
||||||
|
// copy all the minecraftforge specific classes
|
||||||
|
from sourceSets.main.allSource
|
||||||
|
|
||||||
|
// copy everything else except the mcmod.info
|
||||||
|
from (project(":core").sourceSets.main.allSource) {
|
||||||
|
exclude 'mcmod.info'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
reobf {
|
||||||
|
shadowJar { mappingType = 'SEARGE' }
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.reobfShadowJar.mustRunAfter shadowJar
|
|
@ -0,0 +1,4 @@
|
||||||
|
mc_version = 1.11.2
|
||||||
|
mcp_mappings = stable_32
|
||||||
|
forge_version = 13.20.1.2386
|
||||||
|
forgegradle_version = 2.3-SNAPSHOT
|
|
@ -0,0 +1,97 @@
|
||||||
|
package matterlink
|
||||||
|
|
||||||
|
import matterlink.bridge.ServerChatHandler
|
||||||
|
import matterlink.bridge.USER_ACTION
|
||||||
|
import matterlink.config.cfg
|
||||||
|
import matterlink.handlers.*
|
||||||
|
import net.minecraft.command.server.CommandBroadcast
|
||||||
|
import net.minecraft.command.server.CommandEmote
|
||||||
|
import net.minecraft.entity.player.EntityPlayer
|
||||||
|
import net.minecraft.server.dedicated.DedicatedServer
|
||||||
|
import net.minecraft.tileentity.TileEntityCommandBlock
|
||||||
|
import net.minecraftforge.event.CommandEvent
|
||||||
|
import net.minecraftforge.event.ServerChatEvent
|
||||||
|
import net.minecraftforge.event.entity.living.LivingDeathEvent
|
||||||
|
import net.minecraftforge.event.entity.player.AchievementEvent
|
||||||
|
import net.minecraftforge.fml.common.FMLCommonHandler
|
||||||
|
import net.minecraftforge.fml.common.Mod
|
||||||
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
|
||||||
|
import net.minecraftforge.fml.common.gameevent.PlayerEvent
|
||||||
|
import net.minecraftforge.fml.common.gameevent.TickEvent
|
||||||
|
|
||||||
|
//FORGE-DEPENDENT
|
||||||
|
@Mod.EventBusSubscriber
|
||||||
|
object EventWrapper {
|
||||||
|
|
||||||
|
//MC-VERSION & FORGE DEPENDENT
|
||||||
|
@SubscribeEvent
|
||||||
|
@JvmStatic
|
||||||
|
fun progressEvent(e: AchievementEvent) {
|
||||||
|
val name = e.entityPlayer.name
|
||||||
|
val text = "has earned the achievement ${e.achievement.statName.unformattedText}"
|
||||||
|
ProgressHandler.handleProgress(name, text)
|
||||||
|
}
|
||||||
|
|
||||||
|
//FORGE-DEPENDENT
|
||||||
|
@SubscribeEvent
|
||||||
|
@JvmStatic
|
||||||
|
fun chatEvent(e: ServerChatEvent) {
|
||||||
|
val user = e.username
|
||||||
|
val msg = e.message
|
||||||
|
ChatHandler.handleChat(user, msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
//FORGE-DEPENDENT
|
||||||
|
@SubscribeEvent
|
||||||
|
@JvmStatic
|
||||||
|
fun commandEvent(e: CommandEvent) {
|
||||||
|
val sender =
|
||||||
|
when {
|
||||||
|
e.sender is EntityPlayer -> e.sender.name
|
||||||
|
e.sender is DedicatedServer -> cfg!!.relay.systemUser
|
||||||
|
e.sender is TileEntityCommandBlock -> "CommandBlock"
|
||||||
|
else -> return
|
||||||
|
}
|
||||||
|
val args = e.parameters.joinToString(" ")
|
||||||
|
val type = when {
|
||||||
|
e.command is CommandEmote -> USER_ACTION
|
||||||
|
e.command is CommandBroadcast -> ""
|
||||||
|
else -> return
|
||||||
|
}
|
||||||
|
CommandHandler.handleCommand(sender, args, type)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//FORGE-DEPENDENT
|
||||||
|
@SubscribeEvent
|
||||||
|
@JvmStatic
|
||||||
|
fun deathEvent(e: LivingDeathEvent) {
|
||||||
|
if (e.entityLiving is EntityPlayer) {
|
||||||
|
DeathHandler.handleDeath(
|
||||||
|
e.entityLiving.name,
|
||||||
|
e.entityLiving.combatTracker.deathMessage.unformattedText
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//FORGE-DEPENDENT
|
||||||
|
@SubscribeEvent
|
||||||
|
@JvmStatic
|
||||||
|
fun joinEvent(e: PlayerEvent.PlayerLoggedInEvent) {
|
||||||
|
JoinLeaveHandler.handleJoin(e.player.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
//FORGE-DEPENDENT
|
||||||
|
@SubscribeEvent
|
||||||
|
@JvmStatic
|
||||||
|
fun leaveEvent(e: PlayerEvent.PlayerLoggedOutEvent) {
|
||||||
|
JoinLeaveHandler.handleLeave(e.player.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
//FORGE-DEPENDENT
|
||||||
|
@SubscribeEvent
|
||||||
|
@JvmStatic
|
||||||
|
fun serverTickEvent(e: TickEvent.ServerTickEvent) {
|
||||||
|
ServerChatHandler.writeIncomingToChat(FMLCommonHandler.instance().minecraftServerInstance.tickCounter)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
package matterlink
|
||||||
|
|
||||||
|
import matterlink.bridge.MessageHandler
|
||||||
|
import matterlink.bridge.command.BridgeCommandRegistry
|
||||||
|
import matterlink.bridge.command.HelpCommand
|
||||||
|
import matterlink.bridge.command.PlayerListCommand
|
||||||
|
import matterlink.command.CommandMatterlink
|
||||||
|
import net.minecraft.util.text.TextComponentString
|
||||||
|
import net.minecraftforge.fml.common.FMLCommonHandler
|
||||||
|
import net.minecraftforge.fml.common.Mod
|
||||||
|
import net.minecraftforge.fml.common.event.*
|
||||||
|
import org.apache.logging.log4j.Logger
|
||||||
|
|
||||||
|
const val MODID = "matterlink"
|
||||||
|
const val NAME = "MatterLink"
|
||||||
|
const val VERSION = "@VERSION@"
|
||||||
|
|
||||||
|
lateinit var logger: Logger
|
||||||
|
|
||||||
|
@Mod(
|
||||||
|
modid = MODID,
|
||||||
|
name = NAME, version = VERSION,
|
||||||
|
serverSideOnly = true,
|
||||||
|
useMetadata = true,
|
||||||
|
acceptableRemoteVersions = "*",
|
||||||
|
modLanguageAdapter = "net.shadowfacts.forgelin.KotlinAdapter"
|
||||||
|
)
|
||||||
|
object MatterLink : IMatterLink() {
|
||||||
|
init {
|
||||||
|
instance = this
|
||||||
|
}
|
||||||
|
|
||||||
|
@Mod.EventHandler
|
||||||
|
fun preInit(event: FMLPreInitializationEvent) {
|
||||||
|
logger = event.modLog
|
||||||
|
logger.info("Building bridge!")
|
||||||
|
|
||||||
|
MatterLinkConfig(event.suggestedConfigurationFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Mod.EventHandler
|
||||||
|
fun init(event: FMLInitializationEvent) {
|
||||||
|
BridgeCommandRegistry.registerAll(PlayerListCommand, HelpCommand)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Mod.EventHandler
|
||||||
|
fun serverAboutToStart(event: FMLServerAboutToStartEvent) {
|
||||||
|
MessageHandler.start(clear = true)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Mod.EventHandler
|
||||||
|
fun serverStarting(event: FMLServerStartingEvent) {
|
||||||
|
logger.debug("Registering server commands")
|
||||||
|
event.registerServerCommand(CommandMatterlink())
|
||||||
|
|
||||||
|
connect()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Mod.EventHandler
|
||||||
|
fun serverStopping(event: FMLServerStoppingEvent) {
|
||||||
|
disconnect()
|
||||||
|
}
|
||||||
|
|
||||||
|
//FORGE-DEPENDENT
|
||||||
|
override fun wrappedSendToPlayers(msg: String) {
|
||||||
|
FMLCommonHandler.instance().minecraftServerInstance.playerList.sendMessage(TextComponentString(msg))
|
||||||
|
}
|
||||||
|
|
||||||
|
//FORGE-DEPENDENT
|
||||||
|
override fun wrappedPlayerList(): Array<String> {
|
||||||
|
return FMLCommonHandler.instance().minecraftServerInstance.playerList.onlinePlayerNames
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,128 @@
|
||||||
|
package matterlink
|
||||||
|
|
||||||
|
import matterlink.config.IMatterLinkConfig
|
||||||
|
import matterlink.config.cfg
|
||||||
|
import net.minecraftforge.common.config.Configuration
|
||||||
|
import java.io.File
|
||||||
|
import java.util.regex.Pattern
|
||||||
|
|
||||||
|
class MatterLinkConfig(file: File) : IMatterLinkConfig() {
|
||||||
|
init {
|
||||||
|
logger.info("Reading bridge blueprints... from {}", file)
|
||||||
|
val config = Configuration(file)
|
||||||
|
|
||||||
|
config.addCustomCategoryComment(CATEGORY_RELAY_OPTIONS, "Relay options")
|
||||||
|
relay = RelayOptions(
|
||||||
|
|
||||||
|
systemUser = config.getString(
|
||||||
|
"systemUser",
|
||||||
|
CATEGORY_RELAY_OPTIONS,
|
||||||
|
relay.systemUser,
|
||||||
|
"Name of the server user (used by death and advancement messages and the /say command)"
|
||||||
|
),
|
||||||
|
deathEvents = config.getBoolean(
|
||||||
|
"deathEvents",
|
||||||
|
CATEGORY_RELAY_OPTIONS,
|
||||||
|
relay.deathEvents,
|
||||||
|
"Relay player death messages"
|
||||||
|
),
|
||||||
|
advancements = config.getBoolean(
|
||||||
|
"advancements",
|
||||||
|
CATEGORY_RELAY_OPTIONS,
|
||||||
|
relay.advancements,
|
||||||
|
"Relay player advancements"
|
||||||
|
),
|
||||||
|
joinLeave = config.getBoolean(
|
||||||
|
"joinLeave",
|
||||||
|
CATEGORY_RELAY_OPTIONS,
|
||||||
|
relay.joinLeave,
|
||||||
|
"Relay when a player joins or leaves the game"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
config.addCustomCategoryComment(CATEGORY_COMMAND, "User commands")
|
||||||
|
command = CommandOptions(
|
||||||
|
enable = config.getBoolean(
|
||||||
|
"enable",
|
||||||
|
CATEGORY_COMMAND,
|
||||||
|
command.enable,
|
||||||
|
"Enable MC bridge commands"
|
||||||
|
),
|
||||||
|
prefix = config.getString(
|
||||||
|
"prefix",
|
||||||
|
CATEGORY_COMMAND,
|
||||||
|
command.prefix,
|
||||||
|
"Prefix for MC bridge commands. Accepts a single character (not alphanumeric or /)",
|
||||||
|
Pattern.compile("^[^0-9A-Za-z/]$")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
config.addCustomCategoryComment(CATEGORY_FORMATTING_INCOMING, "Gateway -> Server" +
|
||||||
|
"Formatting options: " +
|
||||||
|
"Available variables: {username}, {text}, {gateway}, {channel}, {protocol}, {username:antiping}")
|
||||||
|
formatting = FormattingOptions(
|
||||||
|
chat = config.getString(
|
||||||
|
"chat",
|
||||||
|
CATEGORY_FORMATTING_INCOMING,
|
||||||
|
formatting.chat,
|
||||||
|
"Generic chat event, just talking"
|
||||||
|
),
|
||||||
|
joinLeave = config.getString(
|
||||||
|
"joinLeave",
|
||||||
|
CATEGORY_FORMATTING_INCOMING,
|
||||||
|
formatting.joinLeave,
|
||||||
|
"Join and leave events from other gateways"
|
||||||
|
),
|
||||||
|
action = config.getString(
|
||||||
|
"action",
|
||||||
|
CATEGORY_FORMATTING_INCOMING,
|
||||||
|
formatting.action,
|
||||||
|
"User actions (/me) sent by users from other gateways"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
config.addCustomCategoryComment(CATEGORY_FORMATTING_JOIN_LEAVE, "Server -> Gateway" +
|
||||||
|
"Formatting options: " +
|
||||||
|
"Available variables: {username}, {username:antiping}")
|
||||||
|
formattingJoinLeave = FormattingJoinLeave(
|
||||||
|
joinServer = config.getString(
|
||||||
|
"joinServer",
|
||||||
|
CATEGORY_FORMATTING_JOIN_LEAVE,
|
||||||
|
formattingJoinLeave.joinServer,
|
||||||
|
"user join message sent to other gateways, available variables: {username}, {username:antiping}"
|
||||||
|
),
|
||||||
|
leaveServer = config.getString(
|
||||||
|
"leaveServer",
|
||||||
|
CATEGORY_FORMATTING_JOIN_LEAVE,
|
||||||
|
formattingJoinLeave.leaveServer,
|
||||||
|
"user leave message sent to other gateways, available variables: {username}, {username:antiping}"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
config.addCustomCategoryComment(CATEGORY_CONNECTION, "Connection settings")
|
||||||
|
connect = ConnectOptions(
|
||||||
|
url = config.getString(
|
||||||
|
"connectURL",
|
||||||
|
CATEGORY_CONNECTION,
|
||||||
|
connect.url,
|
||||||
|
"The URL or IP address of the bridge server"
|
||||||
|
),
|
||||||
|
authToken = config.getString(
|
||||||
|
"authToken",
|
||||||
|
CATEGORY_CONNECTION,
|
||||||
|
connect.authToken,
|
||||||
|
"Auth token used to connect to the bridge server"
|
||||||
|
),
|
||||||
|
gateway = config.getString(
|
||||||
|
"gateway",
|
||||||
|
CATEGORY_CONNECTION,
|
||||||
|
connect.gateway,
|
||||||
|
"MatterBridge gateway"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if (config.hasChanged()) config.save()
|
||||||
|
|
||||||
|
cfg = this
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
package matterlink.command
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists
|
||||||
|
import matterlink.MODID
|
||||||
|
import matterlink.bridge.MessageHandler
|
||||||
|
import matterlink.bridge.ServerChatHandler
|
||||||
|
import matterlink.instance
|
||||||
|
import matterlink.logger
|
||||||
|
import net.minecraft.command.CommandBase
|
||||||
|
import net.minecraft.command.ICommandSender
|
||||||
|
import net.minecraft.server.MinecraftServer
|
||||||
|
|
||||||
|
|
||||||
|
class CommandMatterlink : CommandBase() {
|
||||||
|
private val aliases: List<String>
|
||||||
|
|
||||||
|
init {
|
||||||
|
aliases = Lists.newArrayList(MODID, "bridge", "BRIDGE")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getName(): String {
|
||||||
|
return "bridge"
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getUsage(sender: ICommandSender): String {
|
||||||
|
return "bridge <connect|disconnect>"
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getAliases(): List<String> {
|
||||||
|
return aliases
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun execute(server: MinecraftServer, sender: ICommandSender, args: Array<String>) /*throws CommandException*/ {
|
||||||
|
if (args.isEmpty()) {
|
||||||
|
//throw new WrongUsageException("")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//TODO: check if sender is OP or test if normal users cannot send this
|
||||||
|
|
||||||
|
|
||||||
|
val cmd = args[0].toLowerCase()
|
||||||
|
when (cmd) {
|
||||||
|
"connect" -> {
|
||||||
|
instance.connect()
|
||||||
|
}
|
||||||
|
"disconnect" -> {
|
||||||
|
instance.disconnect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,91 @@
|
||||||
|
|
||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
jcenter()
|
||||||
|
maven { url = "http://files.minecraftforge.net/maven" }
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
classpath "net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id "com.github.johnrengelman.shadow" version "1.2.4"
|
||||||
|
}
|
||||||
|
|
||||||
|
apply plugin: 'net.minecraftforge.gradle.forge'
|
||||||
|
|
||||||
|
version = mc_version + "-" + mod_version
|
||||||
|
|
||||||
|
archivesBaseName = "MatterLink"
|
||||||
|
|
||||||
|
sourceCompatibility = targetCompatibility = '1.8'
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile project(':core')
|
||||||
|
compile group: "net.shadowfacts", name: "Forgelin", version: "1.6.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
shadowJar {
|
||||||
|
classifier ''
|
||||||
|
// configurations = [project.configurations.shadow]
|
||||||
|
|
||||||
|
relocate "org.apache.http", "matterlink.repack.org.apache.http"
|
||||||
|
relocate "org.apache.commons.logging", "matterlink.repack.org.apache.commons.logging"
|
||||||
|
dependencies {
|
||||||
|
include(project(":core"))
|
||||||
|
include(dependency("org.apache.httpcomponents:httpclient:4.3.3"))
|
||||||
|
include(dependency("org.apache.httpcomponents:httpcore:4.3.2"))
|
||||||
|
include(dependency('commons-logging:commons-logging:1.1.3'))
|
||||||
|
}
|
||||||
|
|
||||||
|
exclude 'dummyThing'
|
||||||
|
}
|
||||||
|
|
||||||
|
minecraft {
|
||||||
|
version = mc_version + "-" + forge_version
|
||||||
|
runDir = "run"
|
||||||
|
|
||||||
|
mappings = mcp_mappings
|
||||||
|
|
||||||
|
replaceIn 'MatterLink.kt'
|
||||||
|
replace '@VERSION@', mod_version
|
||||||
|
}
|
||||||
|
|
||||||
|
processResources {
|
||||||
|
// this will ensure that this task is redone when the versions change.
|
||||||
|
inputs.property "version", project.version
|
||||||
|
inputs.property "mcversion", project.minecraft.version
|
||||||
|
|
||||||
|
// replace stuff in mcmod.info, nothing else
|
||||||
|
from(project(":core").sourceSets.main.resources.srcDirs) {
|
||||||
|
include 'mcmod.info'
|
||||||
|
|
||||||
|
// replace version and mcversion
|
||||||
|
expand 'version': project.version, 'mcversion': project.minecraft.version
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy everything else except the mcmod.info
|
||||||
|
from(project(":core").sourceSets.main.resources.srcDirs) {
|
||||||
|
exclude 'mcmod.info'
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceJar {
|
||||||
|
classifier 'sources'
|
||||||
|
// copy all the minecraftforge specific classes
|
||||||
|
from sourceSets.main.allSource
|
||||||
|
|
||||||
|
// copy everything else except the mcmod.info
|
||||||
|
from (project(":core").sourceSets.main.allSource) {
|
||||||
|
exclude 'mcmod.info'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reobf {
|
||||||
|
shadowJar { mappingType = 'SEARGE' }
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.reobfShadowJar.mustRunAfter shadowJar
|
|
@ -1,4 +1,4 @@
|
||||||
group = matterbridge
|
|
||||||
mc_version = 1.12.2
|
mc_version = 1.12.2
|
||||||
mcp_mappings = snapshot_20171003
|
mcp_mappings = snapshot_20171003
|
||||||
forge_version = 14.23.1.2599
|
forge_version = 14.23.1.2599
|
||||||
|
forgegradle_version = 2.3-SNAPSHOT
|
|
@ -13,6 +13,7 @@ import net.minecraftforge.event.CommandEvent
|
||||||
import net.minecraftforge.event.ServerChatEvent
|
import net.minecraftforge.event.ServerChatEvent
|
||||||
import net.minecraftforge.event.entity.living.LivingDeathEvent
|
import net.minecraftforge.event.entity.living.LivingDeathEvent
|
||||||
import net.minecraftforge.event.entity.player.AdvancementEvent
|
import net.minecraftforge.event.entity.player.AdvancementEvent
|
||||||
|
import net.minecraftforge.fml.common.FMLCommonHandler
|
||||||
import net.minecraftforge.fml.common.Mod
|
import net.minecraftforge.fml.common.Mod
|
||||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
|
||||||
import net.minecraftforge.fml.common.gameevent.PlayerEvent
|
import net.minecraftforge.fml.common.gameevent.PlayerEvent
|
||||||
|
@ -92,6 +93,6 @@ object EventWrapper {
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun serverTickEvent(e: TickEvent.ServerTickEvent) {
|
fun serverTickEvent(e: TickEvent.ServerTickEvent) {
|
||||||
ServerChatHandler.writeIncomingToChat()
|
ServerChatHandler.writeIncomingToChat(FMLCommonHandler.instance().minecraftServerInstance.tickCounter)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -9,11 +9,14 @@ import net.minecraft.util.text.TextComponentString
|
||||||
import net.minecraftforge.fml.common.FMLCommonHandler
|
import net.minecraftforge.fml.common.FMLCommonHandler
|
||||||
import net.minecraftforge.fml.common.Mod
|
import net.minecraftforge.fml.common.Mod
|
||||||
import net.minecraftforge.fml.common.event.*
|
import net.minecraftforge.fml.common.event.*
|
||||||
|
import org.apache.logging.log4j.Logger
|
||||||
|
|
||||||
const val MODID = "matterlink"
|
const val MODID = "matterlink"
|
||||||
const val NAME = "MatterLink"
|
const val NAME = "MatterLink"
|
||||||
const val VERSION = "@VERSION@"
|
const val VERSION = "@VERSION@"
|
||||||
|
|
||||||
|
lateinit var logger: Logger
|
||||||
|
|
||||||
@Mod(
|
@Mod(
|
||||||
modid = MODID,
|
modid = MODID,
|
||||||
name = NAME, version = VERSION,
|
name = NAME, version = VERSION,
|
||||||
|
|
|
@ -1,5 +1,21 @@
|
||||||
node {
|
pipeline {
|
||||||
checkout scm
|
agent any
|
||||||
sh './gradlew :1.12.2:setupCiWorkspace :1.12.2:clean :1.12.2:build'
|
stages {
|
||||||
|
stage("1.11.2") {
|
||||||
|
steps {
|
||||||
|
sh './gradlew :1.11.2:setupCiWorkspace'
|
||||||
|
sh './gradlew :1.11.2:clean'
|
||||||
|
sh './gradlew :1.11.2:build'
|
||||||
|
archive '1.11.2/build/libs/*jar'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage("1.12.2") {
|
||||||
|
steps {
|
||||||
|
sh './gradlew :1.12.2:setupCiWorkspace'
|
||||||
|
sh './gradlew :1.12.2:clean'
|
||||||
|
sh './gradlew :1.12.2:build'
|
||||||
archive '1.12.2/build/libs/*jar'
|
archive '1.12.2/build/libs/*jar'
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
86
build.gradle
86
build.gradle
|
@ -1,22 +1,12 @@
|
||||||
buildscript {
|
|
||||||
repositories {
|
|
||||||
jcenter()
|
|
||||||
maven { url = "http://files.minecraftforge.net/maven" }
|
|
||||||
mavenCentral()
|
|
||||||
}
|
|
||||||
dependencies {
|
|
||||||
classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
plugins {
|
plugins {
|
||||||
id "org.jetbrains.kotlin.jvm" version '1.2.21'
|
id "org.jetbrains.kotlin.jvm" version '1.2.21'
|
||||||
id "com.github.johnrengelman.shadow" version "1.2.4"
|
|
||||||
id 'idea'
|
id 'idea'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
subprojects {
|
subprojects {
|
||||||
apply plugin: "kotlin"
|
apply plugin: "kotlin"
|
||||||
apply plugin: 'idea'
|
apply plugin: "idea"
|
||||||
|
|
||||||
idea {
|
idea {
|
||||||
module {
|
module {
|
||||||
|
@ -25,83 +15,17 @@ subprojects {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name != "core") {
|
if (name != "core") {
|
||||||
apply plugin: 'net.minecraftforge.gradle.forge'
|
|
||||||
apply plugin: 'com.github.johnrengelman.shadow'
|
|
||||||
|
|
||||||
version = mc_version + "-" + mod_version
|
|
||||||
|
|
||||||
archivesBaseName = "MatterLink"
|
|
||||||
|
|
||||||
sourceCompatibility = targetCompatibility = '1.8' // Need this here so eclipse task generates correctly.
|
|
||||||
compileJava {
|
|
||||||
sourceCompatibility = targetCompatibility = '1.8'
|
|
||||||
}
|
|
||||||
|
|
||||||
minecraft {
|
|
||||||
version = mc_version + "-" + forge_version
|
|
||||||
runDir = "../run"
|
|
||||||
|
|
||||||
mappings = mcp_mappings
|
|
||||||
|
|
||||||
replaceIn 'MatterLink.kt'
|
|
||||||
replace '@VERSION@', mod_version
|
|
||||||
}
|
|
||||||
|
|
||||||
processResources {
|
|
||||||
// this will ensure that this task is redone when the versions change.
|
|
||||||
inputs.property "version", project.version
|
|
||||||
inputs.property "mcversion", project.minecraft.version
|
|
||||||
|
|
||||||
// replace stuff in mcmod.info, nothing else
|
|
||||||
from(project(":core").sourceSets.main.resources.srcDirs) {
|
|
||||||
include 'mcmod.info'
|
|
||||||
|
|
||||||
// replace version and mcversion
|
|
||||||
expand 'version':project.version, 'mcversion':project.minecraft.version
|
|
||||||
}
|
|
||||||
|
|
||||||
// copy everything else except the mcmod.info
|
|
||||||
from(project(":core").sourceSets.main.resources.srcDirs) {
|
|
||||||
exclude 'mcmod.info'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
jcenter()
|
jcenter()
|
||||||
maven {
|
maven {
|
||||||
|
name = "unascribed"
|
||||||
url = 'http://unascribed.com/maven/releases'
|
url = 'http://unascribed.com/maven/releases'
|
||||||
}
|
}
|
||||||
maven {
|
maven {
|
||||||
url "http://maven.shadowfacts.net/"
|
name = "shadowfacts"
|
||||||
|
url = "http://maven.shadowfacts.net/"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
|
||||||
compile project(':core')
|
|
||||||
compile group: "net.shadowfacts", name: "Forgelin", version: "1.6.0"
|
|
||||||
}
|
|
||||||
|
|
||||||
shadowJar {
|
|
||||||
classifier ''
|
|
||||||
// configurations = [project.configurations.shadow]
|
|
||||||
|
|
||||||
relocate "org.apache.http", "matterlink.repack.org.apache.http"
|
|
||||||
relocate "org.apache.commons.logging", "matterlink.repack.org.apache.commons.logging"
|
|
||||||
dependencies {
|
|
||||||
include(project(":core"))
|
|
||||||
include(dependency("org.apache.httpcomponents:httpclient:4.3.3"))
|
|
||||||
include(dependency("org.apache.httpcomponents:httpcore:4.3.2"))
|
|
||||||
include(dependency('commons-logging:commons-logging:1.1.3'))
|
|
||||||
}
|
|
||||||
|
|
||||||
exclude 'dummyThing'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
reobf {
|
|
||||||
shadowJar { mappingType = 'SEARGE' }
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.reobfShadowJar.mustRunAfter shadowJar
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -20,7 +20,7 @@ repositories {
|
||||||
dependencies {
|
dependencies {
|
||||||
compile 'org.apache.httpcomponents:httpclient:4.3.3'
|
compile 'org.apache.httpcomponents:httpclient:4.3.3'
|
||||||
compile 'commons-logging:commons-logging:1.1.3'
|
compile 'commons-logging:commons-logging:1.1.3'
|
||||||
compile group: "org.apache.logging.log4j", name: "log4j-api", version: '2.8.1'
|
// compile group: "org.apache.logging.log4j", name: "log4j-api", version: '2.8.1'
|
||||||
compile 'com.google.code.gson:gson:2.8.0'
|
compile 'com.google.code.gson:gson:2.8.0'
|
||||||
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,25 +1,39 @@
|
||||||
package matterlink
|
package matterlink
|
||||||
|
|
||||||
import matterlink.bridge.MessageHandler
|
import matterlink.bridge.MessageHandler
|
||||||
import org.apache.logging.log4j.Logger
|
//import org.apache.logging.log4j.Logger
|
||||||
|
|
||||||
lateinit var instance: IMatterLink
|
lateinit var instance: IMatterLink
|
||||||
lateinit var logger: Logger
|
//lateinit var logger: Logger
|
||||||
|
|
||||||
abstract class IMatterLink {
|
abstract class IMatterLink {
|
||||||
|
var interrupted: Boolean = false
|
||||||
|
|
||||||
abstract fun wrappedSendToPlayers(msg: String)
|
abstract fun wrappedSendToPlayers(msg: String)
|
||||||
|
|
||||||
abstract fun wrappedPlayerList(): Array<String>
|
abstract fun wrappedPlayerList(): Array<String>
|
||||||
|
|
||||||
fun connect() {
|
fun connect() {
|
||||||
if (MessageHandler.start(clear = true)) {
|
if (MessageHandler.start(clear = true)) {
|
||||||
logger.info("Connected to matterbridge relay")
|
println("Connected to matterbridge relay")
|
||||||
} else {
|
} else {
|
||||||
logger.error("Connection to matterbridge relay failed.")
|
System.err.println("Connection to matterbridge relay failed.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun disconnect () {
|
fun disconnect () {
|
||||||
MessageHandler.stop()
|
MessageHandler.stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun reconnect(tick: Int) {
|
||||||
|
if(tick % 20 == 0 && interrupted) {
|
||||||
|
println("Trying to reconnect")
|
||||||
|
if (MessageHandler.start(clear = false)) {
|
||||||
|
println("Reconnected to matterbridge relay")
|
||||||
|
} else {
|
||||||
|
System.err.println("Reconnection to matterbridge relay failed.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
package matterlink.bridge;
|
package matterlink.bridge;
|
||||||
|
|
||||||
import matterlink.logger
|
import matterlink.instance
|
||||||
|
//import matterlink.logger
|
||||||
import org.apache.http.client.methods.HttpGet
|
import org.apache.http.client.methods.HttpGet
|
||||||
import org.apache.http.impl.client.HttpClients
|
import org.apache.http.impl.client.HttpClients
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
|
@ -19,10 +20,11 @@ class HttpStreamConnection(getClosure: () -> HttpGet, clearClosure: () -> HttpGe
|
||||||
|
|
||||||
|
|
||||||
override fun run() {
|
override fun run() {
|
||||||
|
instance.interrupted = false
|
||||||
if (clear) {
|
if (clear) {
|
||||||
val r = client.execute(clearGet)
|
val r = client.execute(clearGet)
|
||||||
r.entity.content.bufferedReader().forEachLine {
|
r.entity.content.bufferedReader().forEachLine {
|
||||||
logger.debug("skipping $it")
|
println("DEBUG: skipping $it")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val response = client.execute(get)
|
val response = client.execute(get)
|
||||||
|
@ -37,7 +39,7 @@ class HttpStreamConnection(getClosure: () -> HttpGet, clearClosure: () -> HttpGe
|
||||||
if (chars > 0) {
|
if (chars > 0) {
|
||||||
buffer += String(buf.dropLast(buf.count() - chars).toByteArray())
|
buffer += String(buf.dropLast(buf.count() - chars).toByteArray())
|
||||||
|
|
||||||
logger.debug(buffer)
|
println("DEBUG: " + buffer)
|
||||||
|
|
||||||
while (buffer.contains("\n")) {
|
while (buffer.contains("\n")) {
|
||||||
val line = buffer.substringBefore("\n")
|
val line = buffer.substringBefore("\n")
|
||||||
|
@ -49,11 +51,15 @@ class HttpStreamConnection(getClosure: () -> HttpGet, clearClosure: () -> HttpGe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e: SocketException) {
|
} catch (e: SocketException) {
|
||||||
// MatterLink.logger.error("Bridge Connection interrupted...")
|
if (!cancelled) {
|
||||||
|
System.err.println("Bridge Connection interrupted...")
|
||||||
|
instance.interrupted = true
|
||||||
|
//TODO: mark connection as interrupted and try to reconnect
|
||||||
}
|
}
|
||||||
logger.debug("closing stream")
|
}
|
||||||
|
println("DEBUG: closing stream")
|
||||||
content.close()
|
content.close()
|
||||||
logger.debug("thread finished")
|
println("DEBUG: thread finished")
|
||||||
onClose()
|
onClose()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package matterlink.bridge
|
package matterlink.bridge
|
||||||
|
|
||||||
import matterlink.config.cfg
|
import matterlink.config.cfg
|
||||||
import matterlink.logger
|
//import matterlink.logger
|
||||||
import org.apache.http.client.methods.HttpGet
|
import org.apache.http.client.methods.HttpGet
|
||||||
import org.apache.http.client.methods.HttpPost
|
import org.apache.http.client.methods.HttpPost
|
||||||
import org.apache.http.client.methods.HttpRequestBase
|
import org.apache.http.client.methods.HttpRequestBase
|
||||||
|
@ -30,7 +30,7 @@ object MessageHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createThread(clear: Boolean = true): HttpStreamConnection {
|
private fun createThread(clear: Boolean = true): HttpStreamConnection {
|
||||||
logger.info("Attempting to open bridge connection.")
|
println("Attempting to open bridge connection.")
|
||||||
return HttpStreamConnection(
|
return HttpStreamConnection(
|
||||||
{
|
{
|
||||||
HttpGet(cfg!!.connect.url + "/api/stream").apply {
|
HttpGet(cfg!!.connect.url + "/api/stream").apply {
|
||||||
|
@ -46,10 +46,10 @@ object MessageHandler {
|
||||||
rcvQueue.add(
|
rcvQueue.add(
|
||||||
ApiMessage.decode(it)
|
ApiMessage.decode(it)
|
||||||
)
|
)
|
||||||
logger.debug("Received: " + it)
|
// println("Received: " + it)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
logger.info("Bridge connection closed!")
|
println("Bridge connection closed!")
|
||||||
connected = false
|
connected = false
|
||||||
},
|
},
|
||||||
clear
|
clear
|
||||||
|
@ -58,13 +58,13 @@ object MessageHandler {
|
||||||
|
|
||||||
fun transmit(msg: ApiMessage) {
|
fun transmit(msg: ApiMessage) {
|
||||||
if (connected && streamConnection.isAlive) {
|
if (connected && streamConnection.isAlive) {
|
||||||
logger.debug("Transmitting: " + msg)
|
println("Transmitting: " + msg)
|
||||||
transmitMessage(msg)
|
transmitMessage(msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun stop() {
|
fun stop() {
|
||||||
logger.info("Closing bridge connection...")
|
println("Closing bridge connection...")
|
||||||
// MessageHandler.transmit(ApiMessage(text="bridge closing", username="Server"))
|
// MessageHandler.transmit(ApiMessage(text="bridge closing", username="Server"))
|
||||||
streamConnection.close()
|
streamConnection.close()
|
||||||
}
|
}
|
||||||
|
@ -93,14 +93,14 @@ object MessageHandler {
|
||||||
val response = client.execute(post)
|
val response = client.execute(post)
|
||||||
val code = response.statusLine.statusCode
|
val code = response.statusLine.statusCode
|
||||||
if (code != 200) {
|
if (code != 200) {
|
||||||
logger.error("Server returned $code for $post")
|
System.err.println("Server returned $code for $post")
|
||||||
}
|
}
|
||||||
sendErrors = 0
|
sendErrors = 0
|
||||||
} catch (e: IOException) {
|
} catch (e: IOException) {
|
||||||
logger.error("sending message caused $e")
|
System.err.println("sending message caused $e")
|
||||||
sendErrors++
|
sendErrors++
|
||||||
if (sendErrors > 5) {
|
if (sendErrors > 5) {
|
||||||
logger.error("caught too many errors, closing bridge")
|
System.err.println("caught too many errors, closing bridge")
|
||||||
stop()
|
stop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package matterlink.bridge
|
package matterlink.bridge
|
||||||
|
|
||||||
import matterlink.logger
|
//import matterlink.logger
|
||||||
import matterlink.instance
|
import matterlink.instance
|
||||||
import matterlink.bridge.command.BridgeCommandRegistry
|
import matterlink.bridge.command.BridgeCommandRegistry
|
||||||
import matterlink.config.cfg
|
import matterlink.config.cfg
|
||||||
|
@ -10,9 +10,10 @@ object ServerChatHandler {
|
||||||
/**
|
/**
|
||||||
* This method must be called every server tick with no arguments.
|
* This method must be called every server tick with no arguments.
|
||||||
*/
|
*/
|
||||||
fun writeIncomingToChat() {
|
fun writeIncomingToChat(tick: Int) {
|
||||||
|
instance.reconnect(tick)
|
||||||
if (MessageHandler.rcvQueue.isNotEmpty())
|
if (MessageHandler.rcvQueue.isNotEmpty())
|
||||||
logger.debug("incoming: " + MessageHandler.rcvQueue.toString())
|
println("incoming: " + MessageHandler.rcvQueue.toString())
|
||||||
val nextMessage = MessageHandler.rcvQueue.poll()
|
val nextMessage = MessageHandler.rcvQueue.poll()
|
||||||
|
|
||||||
if (nextMessage != null && nextMessage.gateway == cfg!!.connect.gateway) {
|
if (nextMessage != null && nextMessage.gateway == cfg!!.connect.gateway) {
|
||||||
|
@ -29,11 +30,11 @@ object ServerChatHandler {
|
||||||
val user = nextMessage.username
|
val user = nextMessage.username
|
||||||
val text = nextMessage.text
|
val text = nextMessage.text
|
||||||
val json = nextMessage.encode()
|
val json = nextMessage.encode()
|
||||||
logger.debug("Threw out message with unhandled event: ${nextMessage.event}")
|
println("Threw out message with unhandled event: ${nextMessage.event}")
|
||||||
logger.debug(" Message contents:")
|
println(" Message contents:")
|
||||||
logger.debug(" User: $user")
|
println(" User: $user")
|
||||||
logger.debug(" Text: $text")
|
println(" Text: $text")
|
||||||
logger.debug(" JSON: $json")
|
println(" JSON: $json")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package matterlink.bridge.command
|
package matterlink.bridge.command
|
||||||
|
|
||||||
import matterlink.config.cfg
|
import matterlink.config.cfg
|
||||||
import matterlink.logger
|
//import matterlink.logger
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
object BridgeCommandRegistry {
|
object BridgeCommandRegistry {
|
||||||
|
@ -23,7 +23,7 @@ object BridgeCommandRegistry {
|
||||||
|
|
||||||
fun register(cmd: IBridgeCommand): Boolean {
|
fun register(cmd: IBridgeCommand): Boolean {
|
||||||
if (cmd.name.isBlank() || commandMap.containsKey(cmd.name)) {
|
if (cmd.name.isBlank() || commandMap.containsKey(cmd.name)) {
|
||||||
logger.error("Failed to register command: '${cmd.name}'")
|
System.out.println("Failed to register command: '${cmd.name}'")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
commandMap[cmd.name] = cmd
|
commandMap[cmd.name] = cmd
|
||||||
|
|
|
@ -2,7 +2,7 @@ package matterlink.handlers
|
||||||
|
|
||||||
import matterlink.bridge.ApiMessage
|
import matterlink.bridge.ApiMessage
|
||||||
import matterlink.bridge.MessageHandler
|
import matterlink.bridge.MessageHandler
|
||||||
import matterlink.logger
|
//import matterlink.logger
|
||||||
|
|
||||||
object ChatHandler {
|
object ChatHandler {
|
||||||
fun handleChat(user: String, msg: String) {
|
fun handleChat(user: String, msg: String) {
|
||||||
|
@ -12,7 +12,7 @@ object ChatHandler {
|
||||||
username = user,
|
username = user,
|
||||||
text = message
|
text = message
|
||||||
))
|
))
|
||||||
else -> logger.warn("dropped blank message by '$user'")
|
else -> println("WARN: dropped blank message by '$user'")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
mod_version = 1.1.2
|
mod_version = 1.2
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
rootProject.name = 'MatterLink'
|
rootProject.name = 'MatterLink'
|
||||||
include 'core', '1.12.2'
|
include 'core', '1.12.2', '1.11.2'
|
Loading…
Reference in New Issue