revert dropping 1.7.10, adding 1.9.4 instead of 1.10/1.11
This commit is contained in:
parent
7818afc920
commit
79c9ac1572
|
@ -102,5 +102,3 @@ run/
|
|||
|
||||
\.floo
|
||||
\.flooignore
|
||||
|
||||
test\.sh
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
mc_version = 1.10.2
|
||||
mcp_mappings = stable_29
|
||||
forge_version = 12.18.3.2185
|
|
@ -1,108 +0,0 @@
|
|||
package matterlink
|
||||
|
||||
import matterlink.api.ApiMessage.Companion.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.entity.player.EntityPlayerMP
|
||||
import net.minecraft.server.dedicated.DedicatedServer
|
||||
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.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 EventHandler {
|
||||
|
||||
//MC-VERSION & FORGE DEPENDENT
|
||||
@SubscribeEvent
|
||||
@JvmStatic
|
||||
fun progressEvent(e: AchievementEvent) {
|
||||
val achievement = e.achievement
|
||||
val entityPlayer = e.entityPlayer as? EntityPlayerMP ?: return
|
||||
val statFile = entityPlayer.statFile
|
||||
|
||||
if (!statFile.canUnlockAchievement(achievement) || statFile.hasAchievementUnlocked(achievement)) {
|
||||
return
|
||||
}
|
||||
ProgressHandler.handleProgress(
|
||||
name = e.entityPlayer.displayName.unformattedText,
|
||||
message = "has earned the achievement",
|
||||
display = e.achievement.statName.unformattedText
|
||||
)
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
@JvmStatic
|
||||
fun chatEvent(e: ServerChatEvent) {
|
||||
if(e.isCanceled) return
|
||||
e.isCanceled = ChatProcessor.sendToBridge(
|
||||
user = e.player.displayName.unformattedText,
|
||||
msg = e.message,
|
||||
event = "",
|
||||
uuid = e.player.gameProfile.id
|
||||
)
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
@JvmStatic
|
||||
fun commandEvent(e: CommandEvent) {
|
||||
val sender = when {
|
||||
e.sender is DedicatedServer -> cfg.outgoing.systemUser
|
||||
else -> e.sender.displayName.unformattedText
|
||||
}
|
||||
val args = e.parameters.joinToString(" ")
|
||||
val type = when {
|
||||
e.command is CommandEmote -> USER_ACTION
|
||||
e.command.name == "me" -> USER_ACTION
|
||||
e.command is CommandBroadcast -> ""
|
||||
else -> return
|
||||
}
|
||||
ChatProcessor.sendToBridge(user = sender, msg = args, event = type)
|
||||
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
@JvmStatic
|
||||
fun deathEvent(e: LivingDeathEvent) {
|
||||
if (e.entityLiving is EntityPlayer) {
|
||||
DeathHandler.handleDeath(
|
||||
player = e.entityLiving.displayName.unformattedText,
|
||||
deathMessage = e.entityLiving.combatTracker.deathMessage.unformattedText,
|
||||
damageType = e.source.damageType
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
@JvmStatic
|
||||
fun joinEvent(e: PlayerEvent.PlayerLoggedInEvent) {
|
||||
JoinLeaveHandler.handleJoin(e.player.displayName.unformattedText)
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
@JvmStatic
|
||||
fun leaveEvent(e: PlayerEvent.PlayerLoggedOutEvent) {
|
||||
JoinLeaveHandler.handleLeave(e.player.displayName.unformattedText)
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
@JvmStatic
|
||||
fun serverTickEvent(e: TickEvent.ServerTickEvent) {
|
||||
if (e.phase == TickEvent.Phase.END)
|
||||
TickHandler.handleTick()
|
||||
}
|
||||
}
|
|
@ -1,146 +0,0 @@
|
|||
import net.minecraftforge.gradle.user.TaskSourceCopy
|
||||
|
||||
buildscript {
|
||||
repositories {
|
||||
jcenter()
|
||||
maven {
|
||||
url = 'http://files.minecraftforge.net/maven'
|
||||
}
|
||||
mavenCentral()
|
||||
maven {
|
||||
url = 'https://oss.sonatype.org/content/groups/public'
|
||||
}
|
||||
maven {
|
||||
url = 'https://plugins.gradle.org/m2/'
|
||||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '2.2-SNAPSHOT'
|
||||
classpath group: 'com.github.jengelman.gradle.plugins', name: 'shadow', version: shadow_version
|
||||
classpath group: 'gradle.plugin.com.matthewprenger', name: 'CurseGradle', version: cursegradle_version
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'net.minecraftforge.gradle.forge'
|
||||
apply plugin: 'com.github.johnrengelman.shadow'
|
||||
apply plugin: 'com.matthewprenger.cursegradle'
|
||||
|
||||
version = project.mc_version + '-' + project.mod_version
|
||||
|
||||
archivesBaseName = project.mod_name
|
||||
|
||||
sourceCompatibility = targetCompatibility = '1.8'
|
||||
|
||||
dependencies {
|
||||
compile project(':core')
|
||||
compile group: 'net.shadowfacts', name: 'Forgelin', version: project.forgelin_version
|
||||
}
|
||||
|
||||
shadowJar {
|
||||
classifier = ''
|
||||
|
||||
dependencies {
|
||||
include project(":core")
|
||||
include project(":api")
|
||||
include project(":Jankson")
|
||||
include dependency(group: 'com.elytradev.concrete', name: 'concrete-common', version: concrete_version)
|
||||
include dependency(group: 'com.elytradev.concrete', name: 'concrete-rulesengine', version: concrete_version)
|
||||
}
|
||||
|
||||
relocate 'blue.endless', 'matterlink.repack.blue.endless'
|
||||
relocate 'com.elytradev.concrete', 'matterlink.repack.com.elytradev.concrete'
|
||||
|
||||
exclude 'dummyThing'
|
||||
}
|
||||
|
||||
// Mad hacks to make source replacements work for Kotlin
|
||||
// source: https://github.com/PaleoCrafter/VanillaImmersion/blob/ee82ecafb76659cf7d7822a722c8f63f43f41d01/build.gradle#L119
|
||||
for (set in sourceSets) {
|
||||
def taskName = "source${set.name.capitalize()}Kotlin"
|
||||
def dir = new File(project.getBuildDir(), "sources/${set.name}/kotlin")
|
||||
task(taskName, type: TaskSourceCopy) {
|
||||
source = set.getKotlin()
|
||||
output = dir
|
||||
}
|
||||
def compileTask = tasks[set.getCompileTaskName('kotlin')]
|
||||
compileTask.source = dir
|
||||
compileTask.dependsOn taskName
|
||||
def dirPath = dir.toPath()
|
||||
compileKotlin.include {
|
||||
return it.file.toPath().startsWith(dirPath)
|
||||
}
|
||||
}
|
||||
sourceJar.from sourceSets.main.kotlin
|
||||
|
||||
minecraft {
|
||||
version = project.mc_version + '-' + project.forge_version
|
||||
runDir = 'run'
|
||||
|
||||
mappings = project.mcp_mappings
|
||||
|
||||
replaceIn 'Constants.kt'
|
||||
replace '@MODVERSION@', project.mod_version
|
||||
replace '@MCVERSION@', project.mc_version
|
||||
replace '@FORGELIN-VERSION@', project.forgelin_version
|
||||
replace '@FORGE-VERSION@', project.forge_version
|
||||
replace '-1//@BUILD_NUMBER@', System.env.BUILD_NUMBER ?: -1
|
||||
}
|
||||
|
||||
processResources {
|
||||
// this will ensure that this task is redone when the versions change.
|
||||
inputs.property 'version', project.mod_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.mod_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.shadowJar.finalizedBy reobfShadowJar
|
||||
|
||||
curseforge {
|
||||
if (project.hasProperty('CURSEFORGE_API_TOKEN') && project.hasProperty('release')) {
|
||||
apiKey = CURSEFORGE_API_TOKEN
|
||||
}
|
||||
project {
|
||||
id = project.curse_id
|
||||
releaseType = project.curse_release_type
|
||||
if (project.hasProperty('changelog_file')) {
|
||||
println("changelog = $changelog_file")
|
||||
changelogType = 'markdown'
|
||||
changelog = file(changelog_file)
|
||||
}
|
||||
relations {
|
||||
requiredLibrary 'shadowfacts-forgelin'
|
||||
}
|
||||
mainArtifact(shadowJar) {
|
||||
displayName = "MatterLink $version"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
mc_version = 1.11.2
|
||||
mcp_mappings = stable_32
|
||||
forge_version = 13.20.1.2386
|
|
@ -1,8 +0,0 @@
|
|||
package matterlink
|
||||
|
||||
const val MODID = "matterlink"
|
||||
const val NAME = "MatterLink"
|
||||
const val MODVERSION = "@MODVERSION@"
|
||||
const val MCVERSION = "@MCVERSION@"
|
||||
const val DEPENDENCIES = "required-after:forgelin@[@FORGELIN-VERSION@,);required-after:forge@[@FORGE-VERSION@,);"
|
||||
const val BUILD_NUMBER = -1//@BUILD_NUMBER@
|
|
@ -1,42 +0,0 @@
|
|||
package matterlink.command
|
||||
|
||||
import matterlink.logger
|
||||
import net.minecraft.command.CommandBase
|
||||
import net.minecraft.command.ICommandSender
|
||||
import net.minecraft.command.WrongUsageException
|
||||
import net.minecraft.entity.player.EntityPlayer
|
||||
import net.minecraft.server.MinecraftServer
|
||||
import net.minecraft.util.text.TextComponentString
|
||||
|
||||
|
||||
class AuthCommand : CommandBase() {
|
||||
override fun getName(): String {
|
||||
return CommandCoreAuth.name
|
||||
}
|
||||
|
||||
override fun getUsage(sender: ICommandSender): String {
|
||||
return CommandCoreAuth.usage
|
||||
}
|
||||
|
||||
override fun getAliases(): List<String> {
|
||||
return CommandCoreAuth.aliases
|
||||
}
|
||||
|
||||
override fun getRequiredPermissionLevel(): Int {
|
||||
return 0
|
||||
}
|
||||
|
||||
override fun execute(server: MinecraftServer, sender: ICommandSender, args: Array<String>) {
|
||||
if (args.isEmpty()) {
|
||||
throw WrongUsageException("Invalid command! Valid uses: ${this.getUsage(sender)}")
|
||||
}
|
||||
|
||||
val uuid = (sender as? EntityPlayer)?.uniqueID?.toString()
|
||||
val reply = CommandCoreAuth.execute(args, sender.name, uuid)
|
||||
|
||||
if (reply.isNotEmpty() && sender.sendCommandFeedback()) {
|
||||
sender.sendMessage(TextComponentString(reply))
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
package matterlink.command
|
||||
|
||||
import net.minecraft.command.CommandBase
|
||||
import net.minecraft.command.ICommandSender
|
||||
import net.minecraft.command.WrongUsageException
|
||||
import net.minecraft.entity.player.EntityPlayer
|
||||
import net.minecraft.server.MinecraftServer
|
||||
import net.minecraft.util.text.TextComponentString
|
||||
|
||||
|
||||
class MatterLinkCommand : CommandBase() {
|
||||
override fun getName(): String {
|
||||
return CommandCoreML.name
|
||||
}
|
||||
|
||||
override fun getUsage(sender: ICommandSender): String {
|
||||
return CommandCoreML.usage
|
||||
}
|
||||
|
||||
override fun getAliases(): List<String> {
|
||||
return CommandCoreML.aliases
|
||||
}
|
||||
|
||||
override fun execute(server: MinecraftServer, sender: ICommandSender, args: Array<String>) {
|
||||
if (args.isEmpty()) {
|
||||
throw WrongUsageException("Invalid command! Valid uses: ${this.getUsage(sender)}")
|
||||
}
|
||||
|
||||
val uuid = (sender as? EntityPlayer)?.uniqueID?.toString()
|
||||
val reply = CommandCoreML.execute(args, sender.name, uuid)
|
||||
|
||||
if (reply.isNotEmpty() && sender.sendCommandFeedback()) {
|
||||
sender.sendMessage(TextComponentString(reply))
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,66 +0,0 @@
|
|||
package matterlink.command
|
||||
|
||||
import matterlink.bridge.command.IBridgeCommand
|
||||
import matterlink.bridge.command.IMinecraftCommandSender
|
||||
import net.minecraft.command.CommandResultStats
|
||||
import net.minecraft.command.ICommandSender
|
||||
import net.minecraft.entity.Entity
|
||||
import net.minecraft.server.MinecraftServer
|
||||
import net.minecraft.util.math.BlockPos
|
||||
import net.minecraft.util.math.Vec3d
|
||||
import net.minecraft.util.text.ITextComponent
|
||||
import net.minecraft.util.text.TextComponentString
|
||||
import net.minecraft.world.World
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler
|
||||
import javax.annotation.Nonnull
|
||||
|
||||
class MatterLinkCommandSender(
|
||||
user: String,
|
||||
env: IBridgeCommand.CommandEnvironment,
|
||||
op: Boolean) : IMinecraftCommandSender(user, env, op), ICommandSender {
|
||||
|
||||
override fun execute(cmdString: String): Boolean {
|
||||
return 0 < FMLCommonHandler.instance().minecraftServerInstance.commandManager.executeCommand(
|
||||
this,
|
||||
cmdString
|
||||
).apply {
|
||||
sendReply(cmdString)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getDisplayName(): ITextComponent {
|
||||
return TextComponentString(displayName)
|
||||
}
|
||||
|
||||
override fun getName() = accountName
|
||||
|
||||
override fun getEntityWorld(): World {
|
||||
return FMLCommonHandler.instance().minecraftServerInstance.getWorld(0)
|
||||
}
|
||||
|
||||
override fun canUseCommand(permLevel: Int, commandName: String): Boolean {
|
||||
//we now do permissions checking on our end
|
||||
return canExecute(commandName)
|
||||
}
|
||||
|
||||
override fun getServer(): MinecraftServer? {
|
||||
return FMLCommonHandler.instance().minecraftServerInstance
|
||||
}
|
||||
|
||||
override fun sendMessage(@Nonnull component: ITextComponent?) {
|
||||
appendReply(component!!.unformattedComponentText)
|
||||
}
|
||||
|
||||
override fun sendCommandFeedback(): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
//WtfMojangWhy
|
||||
override fun getPosition(): BlockPos = BlockPos.ORIGIN
|
||||
|
||||
override fun setCommandStat(type: CommandResultStats.Type?, amount: Int) {}
|
||||
|
||||
override fun getPositionVector(): Vec3d = Vec3d.ZERO
|
||||
|
||||
override fun getCommandSenderEntity(): Entity? = null
|
||||
}
|
|
@ -14,41 +14,35 @@ buildscript {
|
|||
}
|
||||
dependencies {
|
||||
classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '2.3-SNAPSHOT'
|
||||
classpath group: 'com.github.jengelman.gradle.plugins', name: 'shadow', version: shadow_version
|
||||
classpath group: 'gradle.plugin.com.matthewprenger', name: 'CurseGradle', version: cursegradle_version
|
||||
classpath group: 'com.github.jengelman.gradle.plugins', name: 'shadow', version: shadowVersion
|
||||
classpath group: 'gradle.plugin.com.matthewprenger', name: 'CurseGradle', version: cursegradleVersion
|
||||
classpath group: 'com.vanniktech', name: 'gradle-dependency-graph-generator-plugin', version: '0.5.0'
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'net.minecraftforge.gradle.forge'
|
||||
apply plugin: 'com.github.johnrengelman.shadow'
|
||||
apply plugin: 'com.matthewprenger.cursegradle'
|
||||
apply plugin: "com.vanniktech.dependency.graph.generator"
|
||||
|
||||
version = project.mc_version + '-' + project.mod_version
|
||||
version = project.mc_version + '-' + project.modVersion
|
||||
|
||||
archivesBaseName = project.mod_name
|
||||
archivesBaseName = project.modName
|
||||
|
||||
sourceCompatibility = targetCompatibility = '1.8'
|
||||
|
||||
dependencies {
|
||||
compile project(':core')
|
||||
compile group: 'net.shadowfacts', name: 'Forgelin', version: project.forgelin_version
|
||||
shadow (project(path: ':core', configuration: 'shadow')) { transitive = false }
|
||||
|
||||
compile group: 'net.shadowfacts', name: 'Forgelin', version: project.forgelinVersion
|
||||
}
|
||||
|
||||
shadowJar {
|
||||
classifier = ''
|
||||
|
||||
dependencies {
|
||||
include project(":core")
|
||||
include project(":api")
|
||||
include project(":Jankson")
|
||||
include dependency(group: 'com.elytradev.concrete', name: 'concrete-common', version: concrete_version)
|
||||
include dependency(group: 'com.elytradev.concrete', name: 'concrete-rulesengine', version: concrete_version)
|
||||
}
|
||||
|
||||
relocate 'blue.endless', 'matterlink.repack.blue.endless'
|
||||
relocate 'com.elytradev.concrete', 'matterlink.repack.com.elytradev.concrete'
|
||||
|
||||
exclude 'dummyThing'
|
||||
configurations = [project.configurations.shadow]
|
||||
}
|
||||
|
||||
minecraft {
|
||||
|
@ -58,16 +52,16 @@ minecraft {
|
|||
mappings = project.mcp_mappings
|
||||
|
||||
replaceIn 'Constants.kt'
|
||||
replace '@MODVERSION@', project.mod_version
|
||||
replace '@MODVERSION@', project.modVersion
|
||||
replace '@MCVERSION@', project.mc_version
|
||||
replace '@FORGELIN-VERSION@', project.forgelin_version
|
||||
replace '@FORGELIN-VERSION@', project.forgelinVersion
|
||||
replace '@FORGE-VERSION@', project.forge_version
|
||||
replace '-1//@BUILD_NUMBER@', System.env.BUILD_NUMBER ?: -1
|
||||
}
|
||||
|
||||
processResources {
|
||||
// this will ensure that this task is redone when the versions change.
|
||||
inputs.property "version", project.mod_version
|
||||
inputs.property "version", project.modVersion
|
||||
inputs.property "mcversion", project.minecraft.version
|
||||
|
||||
// replace stuff in mcmod.info, nothing else
|
||||
|
@ -75,7 +69,7 @@ processResources {
|
|||
include 'mcmod.info'
|
||||
|
||||
// replace version and mcversion
|
||||
expand 'version': project.mod_version, 'mcversion': project.minecraft.version
|
||||
expand 'version': project.modVersion, 'mcversion': project.minecraft.version
|
||||
}
|
||||
|
||||
// copy everything else except the mcmod.info
|
||||
|
@ -99,7 +93,6 @@ sourceJar {
|
|||
reobf {
|
||||
shadowJar { mappingType = 'SEARGE' }
|
||||
}
|
||||
|
||||
tasks.shadowJar.finalizedBy reobfShadowJar
|
||||
|
||||
curseforge {
|
||||
|
@ -107,8 +100,8 @@ curseforge {
|
|||
apiKey = CURSEFORGE_API_TOKEN
|
||||
}
|
||||
project {
|
||||
id = project.curse_id
|
||||
releaseType = project.curse_release_type
|
||||
id = project.curseId
|
||||
releaseType = project.curseReleaseType
|
||||
if (project.hasProperty('changelog_file')) {
|
||||
println("changelog = $changelog_file")
|
||||
changelogType = 'markdown'
|
||||
|
|
|
@ -42,7 +42,16 @@ object MatterLink : IMatterLink() {
|
|||
|
||||
@Mod.EventHandler
|
||||
fun preInit(event: FMLPreInitializationEvent) {
|
||||
logger = event.modLog as org.apache.logging.log4j.core.Logger
|
||||
logger = with(event.modLog) {
|
||||
object : Logger {
|
||||
override fun info(message: String) = this@with.info(message)
|
||||
override fun debug(message: String) = this@with.debug(message)
|
||||
override fun error(message: String) = this@with.error(message)
|
||||
override fun warn(message: String) = this@with.warn(message)
|
||||
override fun trace(message: String) = this@with.trace(message)
|
||||
}
|
||||
}
|
||||
|
||||
logger.info("Building bridge!")
|
||||
|
||||
cfg = BaseConfig(event.modConfigurationDirectory).load()
|
||||
|
@ -56,8 +65,8 @@ object MatterLink : IMatterLink() {
|
|||
@Mod.EventHandler
|
||||
fun serverStarting(event: FMLServerStartingEvent) {
|
||||
logger.debug("Registering server commands")
|
||||
event.registerServerCommand(MatterLinkCommand())
|
||||
event.registerServerCommand(AuthCommand())
|
||||
event.registerServerCommand(MatterLinkCommand)
|
||||
event.registerServerCommand(AuthCommand)
|
||||
start()
|
||||
}
|
||||
|
||||
|
@ -115,8 +124,8 @@ object MatterLink : IMatterLink() {
|
|||
|
||||
override fun collectPlayers(area: Area): Set<UUID> {
|
||||
val players = FMLCommonHandler.instance().minecraftServerInstance.playerList.players.filter {
|
||||
( area.allDimensions || area.dimensions.contains(it.dimension) )
|
||||
&& area.testInBounds(it.posX.toInt(), it.posY.toInt(), it.posZ.toInt())
|
||||
(area.allDimensions || area.dimensions.contains(it.dimension))
|
||||
&& area.testInBounds(it.posX.toInt(), it.posY.toInt(), it.posZ.toInt())
|
||||
}
|
||||
return players.map { it.uniqueID }.toSet()
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package matterlink.command
|
||||
|
||||
import matterlink.logger
|
||||
import net.minecraft.command.CommandBase
|
||||
import net.minecraft.command.ICommandSender
|
||||
import net.minecraft.command.WrongUsageException
|
||||
|
@ -9,7 +8,7 @@ import net.minecraft.server.MinecraftServer
|
|||
import net.minecraft.util.text.TextComponentString
|
||||
|
||||
|
||||
class AuthCommand : CommandBase() {
|
||||
object AuthCommand : CommandBase() {
|
||||
override fun getName(): String {
|
||||
return CommandCoreAuth.name
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package matterlink.command
|
||||
|
||||
import matterlink.logger
|
||||
import net.minecraft.command.CommandBase
|
||||
import net.minecraft.command.ICommandSender
|
||||
import net.minecraft.command.WrongUsageException
|
||||
|
@ -9,7 +8,7 @@ import net.minecraft.server.MinecraftServer
|
|||
import net.minecraft.util.text.TextComponentString
|
||||
|
||||
|
||||
class MatterLinkCommand : CommandBase() {
|
||||
object MatterLinkCommand : CommandBase() {
|
||||
override fun getName(): String {
|
||||
return CommandCoreML.name
|
||||
}
|
||||
|
|
|
@ -0,0 +1,127 @@
|
|||
buildscript {
|
||||
repositories {
|
||||
jcenter()
|
||||
maven {
|
||||
url = 'http://files.minecraftforge.net/maven'
|
||||
}
|
||||
mavenCentral()
|
||||
maven {
|
||||
url = 'https://plugins.gradle.org/m2/'
|
||||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '1.2-SNAPSHOT'
|
||||
classpath group: 'com.github.jengelman.gradle.plugins', name: 'shadow', version: shadowVersion
|
||||
classpath group: 'gradle.plugin.com.matthewprenger', name: 'CurseGradle', version: cursegradleVersion
|
||||
classpath group: 'com.vanniktech', name: 'gradle-dependency-graph-generator-plugin', version: '0.5.0'
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'forge'
|
||||
//apply plugin: 'com.github.johnrengelman.shadow'
|
||||
apply plugin: 'com.matthewprenger.cursegradle'
|
||||
apply plugin: "com.vanniktech.dependency.graph.generator"
|
||||
|
||||
|
||||
version = project.mc_version + '-' + project.modVersion
|
||||
|
||||
archivesBaseName = project.modName
|
||||
|
||||
sourceCompatibility = targetCompatibility = '1.8'
|
||||
|
||||
configurations {
|
||||
shade
|
||||
compile.extendsFrom shade
|
||||
}
|
||||
|
||||
dependencies {
|
||||
shade (project(':core')) { transitive = false }
|
||||
shade (project(':Jankson')) { transitive = false }
|
||||
|
||||
shade group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib-jdk8', version: kotlinVersion
|
||||
|
||||
shade group: 'com.github.kittinunf.fuel', name: 'fuel', version: fuelVersion
|
||||
shade group: 'com.github.kittinunf.result', name: 'result', version: resultVersion
|
||||
}
|
||||
|
||||
|
||||
minecraft {
|
||||
version = project.mc_version + '-' + project.forge_version + '-' + project.mc_version
|
||||
runDir = 'run'
|
||||
|
||||
mappings = project.mcp_mappings
|
||||
|
||||
// srgExtra 'PK: kotlin matterlink/repack/kotlin'
|
||||
// srgExtra 'PK: org/jetbrains/annotations matterlink/repack/org/jetbrains/annotations'
|
||||
// srgExtra 'PK: org/intellij matterlink/repack/org/intellij'
|
||||
// srgExtra 'PK: blue/endless/ matterlink/repack/blue/endless/'
|
||||
|
||||
}
|
||||
|
||||
compileKotlin.doFirst {
|
||||
def target = 'src/main/kotlin/matterlink/gen'
|
||||
copy {
|
||||
from('src/templates/kotlin/matterlink/Constants.kt')
|
||||
into(target)
|
||||
}
|
||||
ant.replaceregexp(match: '@MODVERSION@', replace: project.modVersion, flags: 'g', byline: true) {
|
||||
fileset(dir: target, includes: 'Constants.kt')
|
||||
}
|
||||
ant.replaceregexp(match: '@MCVERSION@', replace: project.mc_version, flags: 'g', byline: true) {
|
||||
fileset(dir: target, includes: 'Constants.kt')
|
||||
}
|
||||
ant.replaceregexp(match: '@FORGELIN-VERSION@', replace: project.forgelinVersion, flags: 'g', byline: true) {
|
||||
fileset(dir: target, includes: 'Constants.kt')
|
||||
}
|
||||
ant.replaceregexp(match: '@FORGE-VERSION@', replace: project.forge_version, flags: 'g', byline: true) {
|
||||
fileset(dir: target, includes: 'Constants.kt')
|
||||
}
|
||||
ant.replaceregexp(match: '@BUILD_NUMBER@', replace: System.env.BUILD_NUMBER ?: -1, flags: 'g', byline: true) {
|
||||
fileset(dir: target, includes: 'Constants.kt')
|
||||
}
|
||||
}
|
||||
|
||||
processResources {
|
||||
// this will ensure that this task is redone when the versions change.
|
||||
inputs.property 'version', project.modVersion
|
||||
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.modVersion, 'mcversion': project.minecraft.version
|
||||
}
|
||||
|
||||
// copy everything else except the mcmod.info
|
||||
from(project(':core').sourceSets.main.resources.srcDirs) {
|
||||
exclude 'mcmod.info'
|
||||
}
|
||||
}
|
||||
|
||||
jar {
|
||||
configurations.shade.each { dep ->
|
||||
from(project.zipTree(dep)) {
|
||||
exclude 'META-INF', 'META-INF/**'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
curseforge {
|
||||
if (project.hasProperty('CURSEFORGE_API_TOKEN') && project.hasProperty('release')) {
|
||||
apiKey = CURSEFORGE_API_TOKEN
|
||||
}
|
||||
project {
|
||||
id = project.curseId
|
||||
releaseType = project.curseReleaseType
|
||||
if (project.hasProperty('changelog_file')) {
|
||||
println("changelog = $changelog_file")
|
||||
changelogType = 'markdown'
|
||||
changelog = file(changelog_file)
|
||||
}
|
||||
mainArtifact(jar) {
|
||||
displayName = "MatterLink $version"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
mc_version = 1.7.10
|
||||
mcp_mappings = stable_12
|
||||
forge_version = 10.13.4.1614
|
|
@ -0,0 +1,142 @@
|
|||
package matterlink
|
||||
|
||||
import cpw.mods.fml.common.eventhandler.SubscribeEvent
|
||||
import cpw.mods.fml.common.gameevent.PlayerEvent
|
||||
import cpw.mods.fml.common.gameevent.TickEvent
|
||||
import matterlink.api.ApiMessage.Companion.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.Entity
|
||||
import net.minecraft.entity.player.EntityPlayer
|
||||
import net.minecraft.entity.player.EntityPlayerMP
|
||||
import net.minecraft.server.dedicated.DedicatedServer
|
||||
import net.minecraftforge.event.CommandEvent
|
||||
import net.minecraftforge.event.ServerChatEvent
|
||||
import net.minecraftforge.event.entity.living.LivingDeathEvent
|
||||
import net.minecraftforge.event.entity.player.AchievementEvent
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
object EventHandler {
|
||||
|
||||
//MC-VERSION & FORGE DEPENDENT
|
||||
@SubscribeEvent
|
||||
fun progressEvent(e: AchievementEvent) {
|
||||
val achievement = e.achievement
|
||||
val entityPlayer = e.entityPlayer as? EntityPlayerMP ?: return
|
||||
val statFile = entityPlayer.statFile
|
||||
|
||||
if (!statFile.canUnlockAchievement(achievement) || statFile.hasAchievementUnlocked(achievement)) {
|
||||
return
|
||||
}
|
||||
|
||||
ProgressHandler.handleProgress(
|
||||
name = e.entityPlayer.displayName,
|
||||
message = "has earned the achievement",
|
||||
display = e.achievement.statName.unformattedText,
|
||||
x = e.entityPlayer.posX.toInt(),
|
||||
y = e.entityPlayer.posY.toInt(),
|
||||
z = e.entityPlayer.posZ.toInt(),
|
||||
dimension = e.entityPlayer.dimension
|
||||
)
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
fun chatEvent(e: ServerChatEvent) {
|
||||
if(e.isCanceled) return
|
||||
e.isCanceled = ChatProcessor.sendToBridge(
|
||||
user = e.player.displayName,
|
||||
msg = e.message,
|
||||
x = e.player.posX.toInt(),
|
||||
y = e.player.posY.toInt(),
|
||||
z = e.player.posZ.toInt(),
|
||||
dimension = e.player.dimension,
|
||||
event = ChatEvent.PLAIN,
|
||||
uuid = e.player.gameProfile.id
|
||||
)
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
fun commandEvent(e: CommandEvent) {
|
||||
val sender = when {
|
||||
e.sender is DedicatedServer -> cfg.outgoing.systemUser
|
||||
else -> e.sender.commandSenderName
|
||||
}
|
||||
val args = e.parameters.joinToString(" ")
|
||||
val type = with(e.command) {
|
||||
when {
|
||||
this is CommandEmote || commandName.equals("me", true) -> ChatEvent.ACTION
|
||||
this is CommandBroadcast || commandName.equals("say", true) -> ChatEvent.BROADCAST
|
||||
else -> return
|
||||
}
|
||||
}
|
||||
val s = e.sender
|
||||
val (x, y, z) = when(s) {
|
||||
is Entity -> Triple(s.posX.toInt(), s.posY.toInt(), s.posZ.toInt())
|
||||
else -> with(s.commandSenderPosition) { Triple(posX, posY, posZ) }
|
||||
}
|
||||
ChatProcessor.sendToBridge(
|
||||
user = sender,
|
||||
msg = args,
|
||||
event = type,
|
||||
x = x,
|
||||
y = y,
|
||||
z = z,
|
||||
dimension = when {
|
||||
e.sender is DedicatedServer -> null
|
||||
else -> e.sender.entityWorld.provider.dimensionId
|
||||
}
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
fun deathEvent(e: LivingDeathEvent) {
|
||||
if (e.entityLiving is EntityPlayer) {
|
||||
val player = e.entityLiving as EntityPlayer
|
||||
DeathHandler.handleDeath(
|
||||
player = player.displayName,
|
||||
deathMessage = e.entityLiving.combatTracker.func_151521_b().unformattedText,
|
||||
damageType = e.source.damageType,
|
||||
x = e.entityLiving.posX.toInt(),
|
||||
y = e.entityLiving.posY.toInt(),
|
||||
z = e.entityLiving.posZ.toInt(),
|
||||
dimension = e.entityLiving.dimension
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
fun joinEvent(e: PlayerEvent.PlayerLoggedInEvent) {
|
||||
JoinLeaveHandler.handleJoin(
|
||||
player = e.player.displayName,
|
||||
x = e.player.posX.toInt(),
|
||||
y = e.player.posY.toInt(),
|
||||
z = e.player.posZ.toInt(),
|
||||
dimension = e.player.dimension)
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
fun leaveEvent(e: PlayerEvent.PlayerLoggedOutEvent) {
|
||||
JoinLeaveHandler.handleLeave(
|
||||
player = e.player.displayName,
|
||||
x = e.player.posX.toInt(),
|
||||
y = e.player.posY.toInt(),
|
||||
z = e.player.posZ.toInt(),
|
||||
dimension = e.player.dimension
|
||||
)
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
fun serverTickEvent(e: TickEvent.ServerTickEvent) {
|
||||
if (e.phase == TickEvent.Phase.END)
|
||||
TickHandler.handleTick()
|
||||
}
|
||||
}
|
|
@ -1,43 +1,51 @@
|
|||
package matterlink
|
||||
|
||||
import com.mojang.authlib.GameProfile
|
||||
import jline.internal.Log.warn
|
||||
import cpw.mods.fml.common.FMLCommonHandler
|
||||
import cpw.mods.fml.common.Mod
|
||||
import cpw.mods.fml.common.event.FMLInitializationEvent
|
||||
import cpw.mods.fml.common.event.FMLPreInitializationEvent
|
||||
import cpw.mods.fml.common.event.FMLServerStartingEvent
|
||||
import cpw.mods.fml.common.event.FMLServerStoppingEvent
|
||||
import matterlink.bridge.command.IBridgeCommand
|
||||
import matterlink.command.AuthCommand
|
||||
import matterlink.command.MatterLinkCommand
|
||||
import matterlink.command.MatterLinkCommandSender
|
||||
import matterlink.config.BaseConfig
|
||||
import matterlink.config.cfg
|
||||
import net.minecraft.entity.ai.EntityMoveHelper
|
||||
import net.minecraft.entity.player.EntityPlayerMP
|
||||
import net.minecraft.util.text.TextComponentString
|
||||
import net.minecraft.server.MinecraftServer
|
||||
import net.minecraft.util.ChatComponentText
|
||||
import net.minecraftforge.common.ForgeVersion
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler
|
||||
import net.minecraftforge.fml.common.Mod
|
||||
import net.minecraftforge.fml.common.event.FMLInitializationEvent
|
||||
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent
|
||||
import net.minecraftforge.fml.common.event.FMLServerStartingEvent
|
||||
import net.minecraftforge.fml.common.event.FMLServerStoppingEvent
|
||||
import org.apache.logging.log4j.Level
|
||||
import org.apache.logging.log4j.Logger
|
||||
import net.minecraftforge.common.MinecraftForge
|
||||
import java.util.*
|
||||
|
||||
@Mod(
|
||||
modid = MODID,
|
||||
name = NAME, version = MODVERSION,
|
||||
serverSideOnly = true,
|
||||
useMetadata = true,
|
||||
acceptableRemoteVersions = "*",
|
||||
modLanguageAdapter = "net.shadowfacts.forgelin.KotlinAdapter",
|
||||
dependencies = DEPENDENCIES
|
||||
acceptableRemoteVersions = "*"
|
||||
)
|
||||
object MatterLink : IMatterLink() {
|
||||
class MatterLink : IMatterLink() {
|
||||
init {
|
||||
instance = this
|
||||
}
|
||||
|
||||
@Mod.EventHandler
|
||||
fun preInit(event: FMLPreInitializationEvent) {
|
||||
logger = event.modLog as org.apache.logging.log4j.core.Logger
|
||||
MinecraftForge.EVENT_BUS.register(EventHandler)
|
||||
FMLCommonHandler.instance().bus().register(EventHandler)
|
||||
|
||||
logger = with(event.modLog) {
|
||||
object : Logger {
|
||||
override fun info(message: String) = this@with.info(message)
|
||||
override fun debug(message: String) = this@with.debug(message)
|
||||
override fun error(message: String) = this@with.error(message)
|
||||
override fun warn(message: String) = this@with.warn(message)
|
||||
override fun trace(message: String) = this@with.trace(message)
|
||||
}
|
||||
}
|
||||
|
||||
logger.info("Building bridge!")
|
||||
|
||||
cfg = BaseConfig(event.modConfigurationDirectory).load()
|
||||
|
@ -51,7 +59,8 @@ object MatterLink : IMatterLink() {
|
|||
@Mod.EventHandler
|
||||
fun serverStarting(event: FMLServerStartingEvent) {
|
||||
logger.debug("Registering server commands")
|
||||
event.registerServerCommand(MatterLinkCommand())
|
||||
event.registerServerCommand(MatterLinkCommand)
|
||||
event.registerServerCommand(AuthCommand)
|
||||
start()
|
||||
}
|
||||
|
||||
|
@ -62,7 +71,7 @@ object MatterLink : IMatterLink() {
|
|||
|
||||
//FORGE-DEPENDENT
|
||||
override fun wrappedSendToPlayers(msg: String) {
|
||||
FMLCommonHandler.instance().minecraftServerInstance.playerList.sendMessage(TextComponentString(msg))
|
||||
MinecraftServer.getServer().configurationManager.sendChatMsg(ChatComponentText(msg))
|
||||
}
|
||||
|
||||
override fun wrappedSendToPlayer(username: String, msg: String) {
|
||||
|
@ -74,7 +83,7 @@ object MatterLink : IMatterLink() {
|
|||
logger.error("${profile.name} is not online")
|
||||
return
|
||||
}
|
||||
player.sendMessage(TextComponentString(msg))
|
||||
player.addChatMessage(ChatComponentText(msg))
|
||||
}
|
||||
|
||||
override fun wrappedSendToPlayer(uuid: UUID, msg: String) {
|
||||
|
@ -86,16 +95,18 @@ object MatterLink : IMatterLink() {
|
|||
logger.error("${profile.name} is not online")
|
||||
return
|
||||
}
|
||||
player.sendMessage(TextComponentString(msg))
|
||||
player.addChatMessage(ChatComponentText(msg))
|
||||
}
|
||||
|
||||
override fun isOnline(username: String) = FMLCommonHandler.instance().minecraftServerInstance.onlinePlayerNames.contains(username)
|
||||
|
||||
private fun playerByProfile(gameProfile: GameProfile): EntityPlayerMP? = FMLCommonHandler.instance().minecraftServerInstance.playerList.getPlayerByUUID(gameProfile.id)
|
||||
override fun isOnline(username: String) = (FMLCommonHandler.instance()
|
||||
.minecraftServerInstance.configurationManager.getPlayerByUsername(username) ?: null) != null
|
||||
|
||||
private fun playerByProfile(gameProfile: GameProfile): EntityPlayerMP? {
|
||||
return FMLCommonHandler.instance().minecraftServerInstance.configurationManager.createPlayerForUser(gameProfile)
|
||||
}
|
||||
|
||||
private fun profileByUUID(uuid: UUID): GameProfile? = try {
|
||||
FMLCommonHandler.instance().minecraftServerInstance.playerProfileCache.getProfileByUUID(uuid)
|
||||
FMLCommonHandler.instance().minecraftServerInstance.playerProfileCache.func_152652_a(uuid)
|
||||
} catch (e: IllegalArgumentException) {
|
||||
logger.warn("cannot find profile by uuid $uuid")
|
||||
null
|
||||
|
@ -108,6 +119,16 @@ object MatterLink : IMatterLink() {
|
|||
null
|
||||
}
|
||||
|
||||
override fun collectPlayers(area: Area): Set<UUID> {
|
||||
val players = MinecraftServer.getServer().configurationManager.playerEntityList
|
||||
.map { it as EntityPlayerMP }
|
||||
.filter {
|
||||
(area.allDimensions || area.dimensions.contains(it.dimension))
|
||||
&& area.testInBounds(it.posX.toInt(), it.posY.toInt(), it.posZ.toInt())
|
||||
}
|
||||
return players.map { it.uniqueID }.toSet()
|
||||
}
|
||||
|
||||
override fun nameToUUID(username: String): UUID? = profileByName(username)?.id
|
||||
|
||||
override fun uuidToName(uuid: UUID): String? = profileByUUID(uuid)?.name
|
|
@ -0,0 +1,35 @@
|
|||
package matterlink.command
|
||||
|
||||
import net.minecraft.command.CommandBase
|
||||
import net.minecraft.command.ICommandSender
|
||||
import net.minecraft.command.WrongUsageException
|
||||
import net.minecraft.entity.player.EntityPlayer
|
||||
import net.minecraft.util.ChatComponentText
|
||||
|
||||
|
||||
object AuthCommand : CommandBase() {
|
||||
override fun getCommandName(): String {
|
||||
return CommandCoreAuth.name
|
||||
}
|
||||
|
||||
override fun getCommandUsage(sender: ICommandSender): String {
|
||||
return CommandCoreAuth.usage
|
||||
}
|
||||
|
||||
override fun getCommandAliases(): List<String> {
|
||||
return CommandCoreAuth.aliases
|
||||
}
|
||||
|
||||
override fun processCommand(sender: ICommandSender, args: Array<String>) {
|
||||
if (args.isEmpty()) {
|
||||
throw WrongUsageException("Invalid command! Valid uses: ${this.getCommandUsage(sender)}")
|
||||
}
|
||||
|
||||
val uuid = (sender as? EntityPlayer)?.uniqueID?.toString()
|
||||
val reply = CommandCoreAuth.execute(args, sender.commandSenderName, uuid)
|
||||
|
||||
if (reply.isNotEmpty()) {
|
||||
sender.addChatMessage(ChatComponentText(reply))
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package matterlink.command
|
||||
|
||||
import net.minecraft.command.CommandBase
|
||||
import net.minecraft.command.ICommandSender
|
||||
import net.minecraft.command.WrongUsageException
|
||||
import net.minecraft.entity.player.EntityPlayer
|
||||
import net.minecraft.util.ChatComponentText
|
||||
|
||||
|
||||
object MatterLinkCommand : CommandBase() {
|
||||
override fun getCommandName(): String {
|
||||
return CommandCoreML.name
|
||||
}
|
||||
|
||||
override fun getCommandUsage(sender: ICommandSender): String {
|
||||
return CommandCoreML.usage
|
||||
}
|
||||
|
||||
override fun getCommandAliases(): List<String> {
|
||||
return CommandCoreML.aliases
|
||||
}
|
||||
|
||||
override fun processCommand(sender: ICommandSender, args: Array<String>) {
|
||||
if (args.isEmpty()) {
|
||||
throw WrongUsageException("Invalid command! Valid uses: ${this.getCommandUsage(sender)}")
|
||||
}
|
||||
|
||||
val uuid = (sender as? EntityPlayer)?.uniqueID?.toString()
|
||||
val reply = CommandCoreML.execute(args, sender.commandSenderName, uuid)
|
||||
|
||||
if (reply.isNotEmpty()) {
|
||||
sender.addChatMessage(ChatComponentText(reply))
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
package matterlink.command
|
||||
|
||||
import matterlink.bridge.command.IBridgeCommand
|
||||
import matterlink.bridge.command.IMinecraftCommandSender
|
||||
import net.minecraft.command.ICommandSender
|
||||
import net.minecraft.server.MinecraftServer
|
||||
import net.minecraft.util.ChatComponentText
|
||||
import net.minecraft.util.ChunkCoordinates
|
||||
import net.minecraft.util.IChatComponent
|
||||
import net.minecraft.world.World
|
||||
|
||||
class MatterLinkCommandSender(
|
||||
user: String,
|
||||
env: IBridgeCommand.CommandEnvironment,
|
||||
op: Boolean) : IMinecraftCommandSender(user, env, op), ICommandSender {
|
||||
|
||||
override fun execute(cmdString: String): Boolean {
|
||||
return 0 < MinecraftServer.getServer().commandManager.executeCommand(
|
||||
this,
|
||||
cmdString
|
||||
).apply {
|
||||
sendReply(cmdString)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getFormattedCommandSenderName(): IChatComponent {
|
||||
return ChatComponentText(displayName)
|
||||
}
|
||||
|
||||
override fun getCommandSenderName() = accountName
|
||||
|
||||
override fun getEntityWorld(): World {
|
||||
return MinecraftServer.getServer().worldServerForDimension(0)
|
||||
}
|
||||
|
||||
override fun canCommandSenderUseCommand(permLevel: Int, commandName: String): Boolean {
|
||||
//we do permission
|
||||
return canExecute(commandName)
|
||||
}
|
||||
|
||||
override fun addChatMessage(component: IChatComponent) {
|
||||
appendReply(component.unformattedText)
|
||||
}
|
||||
|
||||
override fun getCommandSenderPosition(): ChunkCoordinates = ChunkCoordinates(0, 0, 0)
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
package matterlink
|
||||
|
||||
const val MODID = "matterlink"
|
||||
const val NAME = "MatterLink"
|
||||
const val MODVERSION = "@MODVERSION@"
|
||||
const val MCVERSION = "@MCVERSION@"
|
||||
const val BUILD_NUMBER = @BUILD_NUMBER@
|
|
@ -11,8 +11,8 @@ buildscript {
|
|||
}
|
||||
dependencies {
|
||||
classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '2.2-SNAPSHOT'
|
||||
classpath group: 'com.github.jengelman.gradle.plugins', name: 'shadow', version: shadow_version
|
||||
classpath group: 'gradle.plugin.com.matthewprenger', name: 'CurseGradle', version: cursegradle_version
|
||||
classpath group: 'com.github.jengelman.gradle.plugins', name: 'shadow', version: shadowVersion
|
||||
classpath group: 'gradle.plugin.com.matthewprenger', name: 'CurseGradle', version: cursegradleVersion
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -20,35 +20,26 @@ apply plugin: 'net.minecraftforge.gradle.forge'
|
|||
apply plugin: 'com.github.johnrengelman.shadow'
|
||||
apply plugin: 'com.matthewprenger.cursegradle'
|
||||
|
||||
version = project.mc_version + '-' + project.mod_version
|
||||
version = project.mc_version + '-' + project.modVersion
|
||||
|
||||
archivesBaseName = project.mod_name
|
||||
archivesBaseName = project.modName
|
||||
|
||||
sourceCompatibility = targetCompatibility = '1.8'
|
||||
|
||||
dependencies {
|
||||
compile project(':core')
|
||||
compile group: 'net.shadowfacts', name: 'Forgelin', version: project.forgelin_version
|
||||
shadow (project(path: ':core', configuration: 'shadow')) { transitive = false }
|
||||
|
||||
compile group: 'net.shadowfacts', name: 'Forgelin', version: project.forgelinVersion
|
||||
}
|
||||
|
||||
shadowJar {
|
||||
classifier ''
|
||||
|
||||
dependencies {
|
||||
include project(":core")
|
||||
include project(":api")
|
||||
include project(":Jankson")
|
||||
include dependency(group: 'com.elytradev.concrete', name: 'concrete-common', version: concrete_version)
|
||||
include dependency(group: 'com.elytradev.concrete', name: 'concrete-rulesengine', version: concrete_version)
|
||||
}
|
||||
|
||||
relocate 'blue.endless', 'matterlink.repack.blue.endless'
|
||||
relocate 'com.elytradev.concrete', 'matterlink.repack.com.elytradev.concrete'
|
||||
classifier = ''
|
||||
|
||||
exclude 'dummyThing'
|
||||
configurations = [project.configurations.shadow]
|
||||
}
|
||||
|
||||
|
||||
import net.minecraftforge.gradle.user.TaskSourceCopy
|
||||
|
||||
// Mad hacks to make source replacements work for Kotlin
|
||||
|
@ -77,16 +68,16 @@ minecraft {
|
|||
mappings = project.mcp_mappings
|
||||
|
||||
replaceIn 'Constants.kt'
|
||||
replace '@MODVERSION@', project.mod_version
|
||||
replace '@MODVERSION@', project.modVersion
|
||||
replace '@MCVERSION@', project.mc_version
|
||||
replace '@FORGELIN-VERSION@', project.forgelin_version
|
||||
replace '@FORGELIN-VERSION@', project.forgelinVersion
|
||||
replace '@FORGE-VERSION@', project.forge_version
|
||||
replace '-1//@BUILD_NUMBER@', System.env.BUILD_NUMBER ?: -1
|
||||
}
|
||||
|
||||
processResources {
|
||||
// this will ensure that this task is redone when the versions change.
|
||||
inputs.property 'version', project.mod_version
|
||||
inputs.property 'version', project.modVersion
|
||||
inputs.property 'mcversion', project.minecraft.version
|
||||
|
||||
// replace stuff in mcmod.info, nothing else
|
||||
|
@ -94,7 +85,7 @@ processResources {
|
|||
include 'mcmod.info'
|
||||
|
||||
// replace version and mcversion
|
||||
expand 'version': project.mod_version, 'mcversion': project.minecraft.version
|
||||
expand 'version': project.modVersion, 'mcversion': project.minecraft.version
|
||||
}
|
||||
|
||||
// copy everything else except the mcmod.info
|
||||
|
@ -119,7 +110,6 @@ sourceJar {
|
|||
reobf {
|
||||
shadowJar { mappingType = 'SEARGE' }
|
||||
}
|
||||
|
||||
tasks.shadowJar.finalizedBy reobfShadowJar
|
||||
|
||||
curseforge {
|
||||
|
@ -127,8 +117,9 @@ curseforge {
|
|||
apiKey = CURSEFORGE_API_TOKEN
|
||||
}
|
||||
project {
|
||||
id = project.curse_id
|
||||
releaseType = project.curse_release_type
|
||||
id = project.curseId
|
||||
releaseType = project.curseReleaseType
|
||||
addGameVersion '1.10'
|
||||
if (project.hasProperty('changelog_file')) {
|
||||
println("changelog = $changelog_file")
|
||||
changelogType = 'markdown'
|
|
@ -0,0 +1,3 @@
|
|||
mc_version = 1.9.4
|
||||
mcp_mappings = stable_26
|
||||
forge_version = 12.17.0.2051
|
|
@ -1,6 +1,5 @@
|
|||
package matterlink
|
||||
|
||||
import matterlink.api.ApiMessage.Companion.USER_ACTION
|
||||
import matterlink.config.cfg
|
||||
import matterlink.handlers.*
|
||||
import net.minecraft.command.server.CommandBroadcast
|
||||
|
@ -12,18 +11,15 @@ 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.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 EventHandler {
|
||||
|
||||
//MC-VERSION & FORGE DEPENDENT
|
||||
@SubscribeEvent
|
||||
@JvmStatic
|
||||
fun progressEvent(e: AchievementEvent) {
|
||||
val achievement = e.achievement
|
||||
val entityPlayer = e.entityPlayer as? EntityPlayerMP ?: return
|
||||
|
@ -32,76 +28,104 @@ object EventHandler {
|
|||
if (!statFile.canUnlockAchievement(achievement) || statFile.hasAchievementUnlocked(achievement)) {
|
||||
return
|
||||
}
|
||||
|
||||
ProgressHandler.handleProgress(
|
||||
name = e.entityPlayer.displayName.unformattedText,
|
||||
message = "has earned the achievement",
|
||||
display = e.achievement.statName.unformattedText
|
||||
display = e.achievement.statName.unformattedText,
|
||||
x = e.entityPlayer.posX.toInt(),
|
||||
y = e.entityPlayer.posY.toInt(),
|
||||
z = e.entityPlayer.posZ.toInt(),
|
||||
dimension = e.entityPlayer.dimension
|
||||
)
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
@JvmStatic
|
||||
fun chatEvent(e: ServerChatEvent) {
|
||||
if(e.isCanceled) return
|
||||
e.isCanceled = ChatProcessor.sendToBridge(
|
||||
user = e.player.displayName.unformattedText,
|
||||
msg = e.message,
|
||||
event = "",
|
||||
x = e.player.posX.toInt(),
|
||||
y = e.player.posY.toInt(),
|
||||
z = e.player.posZ.toInt(),
|
||||
dimension = e.player.dimension,
|
||||
event = ChatEvent.PLAIN,
|
||||
uuid = e.player.gameProfile.id
|
||||
)
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
@JvmStatic
|
||||
fun commandEvent(e: CommandEvent) {
|
||||
val sender = when {
|
||||
e.sender is DedicatedServer -> cfg.outgoing.systemUser
|
||||
else -> e.sender.displayName.unformattedText
|
||||
}
|
||||
val args = e.parameters.joinToString(" ")
|
||||
val type = when {
|
||||
e.command is CommandEmote -> USER_ACTION
|
||||
e.command.name == "me" -> USER_ACTION
|
||||
e.command is CommandBroadcast -> ""
|
||||
else -> return
|
||||
val type = with(e.command) {
|
||||
when {
|
||||
this is CommandEmote || commandName.equals("me", true) -> ChatEvent.ACTION
|
||||
this is CommandBroadcast || commandName.equals("say", true) -> ChatEvent.BROADCAST
|
||||
else -> return
|
||||
}
|
||||
}
|
||||
ChatProcessor.sendToBridge(user = sender, msg = args, event = type)
|
||||
|
||||
ChatProcessor.sendToBridge(
|
||||
user = sender,
|
||||
msg = args,
|
||||
event = type,
|
||||
x = e.sender.position.x,
|
||||
y = e.sender.position.y,
|
||||
z = e.sender.position.z,
|
||||
dimension = when {
|
||||
e.sender is DedicatedServer -> null
|
||||
else -> e.sender.commandSenderEntity?.dimension ?: e.sender.entityWorld.provider.dimension
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
@JvmStatic
|
||||
fun deathEvent(e: LivingDeathEvent) {
|
||||
if (e.entityLiving is EntityPlayer) {
|
||||
DeathHandler.handleDeath(
|
||||
player = e.entityLiving.displayName.unformattedText,
|
||||
deathMessage = e.entityLiving.combatTracker.deathMessage.unformattedText,
|
||||
damageType = e.source.damageType
|
||||
damageType = e.source.damageType,
|
||||
x = e.entityLiving.posX.toInt(),
|
||||
y = e.entityLiving.posY.toInt(),
|
||||
z = e.entityLiving.posZ.toInt(),
|
||||
dimension = e.entityLiving.dimension
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
@JvmStatic
|
||||
fun joinEvent(e: PlayerEvent.PlayerLoggedInEvent) {
|
||||
JoinLeaveHandler.handleJoin(e.player.displayName.unformattedText)
|
||||
JoinLeaveHandler.handleJoin(
|
||||
player = e.player.displayName.unformattedText,
|
||||
x = e.player.posX.toInt(),
|
||||
y = e.player.posY.toInt(),
|
||||
z = e.player.posZ.toInt(),
|
||||
dimension = e.player.dimension
|
||||
)
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
@JvmStatic
|
||||
fun leaveEvent(e: PlayerEvent.PlayerLoggedOutEvent) {
|
||||
JoinLeaveHandler.handleLeave(e.player.displayName.unformattedText)
|
||||
JoinLeaveHandler.handleLeave(
|
||||
player = e.player.displayName.unformattedText,
|
||||
x = e.player.posX.toInt(),
|
||||
y = e.player.posY.toInt(),
|
||||
z = e.player.posZ.toInt(),
|
||||
dimension = e.player.dimension
|
||||
)
|
||||
}
|
||||
|
||||
//FORGE-DEPENDENT
|
||||
@SubscribeEvent
|
||||
@JvmStatic
|
||||
fun serverTickEvent(e: TickEvent.ServerTickEvent) {
|
||||
if (e.phase == TickEvent.Phase.END)
|
||||
TickHandler.handleTick()
|
|
@ -2,21 +2,22 @@ package matterlink
|
|||
|
||||
import com.mojang.authlib.GameProfile
|
||||
import matterlink.bridge.command.IBridgeCommand
|
||||
import matterlink.command.AuthCommand
|
||||
import matterlink.command.MatterLinkCommand
|
||||
import matterlink.command.MatterLinkCommandSender
|
||||
import matterlink.config.BaseConfig
|
||||
import matterlink.config.cfg
|
||||
import net.minecraft.entity.player.EntityPlayerMP
|
||||
import net.minecraft.server.MinecraftServer
|
||||
import net.minecraft.util.text.TextComponentString
|
||||
import net.minecraftforge.common.ForgeVersion
|
||||
import net.minecraftforge.common.MinecraftForge
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler
|
||||
import net.minecraftforge.fml.common.Mod
|
||||
import net.minecraftforge.fml.common.event.FMLInitializationEvent
|
||||
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent
|
||||
import net.minecraftforge.fml.common.event.FMLServerStartingEvent
|
||||
import net.minecraftforge.fml.common.event.FMLServerStoppingEvent
|
||||
import org.apache.logging.log4j.Level
|
||||
import org.apache.logging.log4j.Logger
|
||||
import java.util.*
|
||||
|
||||
@Mod(
|
||||
|
@ -35,7 +36,17 @@ object MatterLink : IMatterLink() {
|
|||
|
||||
@Mod.EventHandler
|
||||
fun preInit(event: FMLPreInitializationEvent) {
|
||||
logger = event.modLog as org.apache.logging.log4j.core.Logger
|
||||
MinecraftForge.EVENT_BUS.register(EventHandler)
|
||||
logger = with(event.modLog) {
|
||||
object : Logger {
|
||||
override fun info(message: String) = this@with.info(message)
|
||||
override fun debug(message: String) = this@with.debug(message)
|
||||
override fun error(message: String) = this@with.error(message)
|
||||
override fun warn(message: String) = this@with.warn(message)
|
||||
override fun trace(message: String) = this@with.trace(message)
|
||||
}
|
||||
}
|
||||
|
||||
logger.info("Building bridge!")
|
||||
|
||||
cfg = BaseConfig(event.modConfigurationDirectory).load()
|
||||
|
@ -49,7 +60,8 @@ object MatterLink : IMatterLink() {
|
|||
@Mod.EventHandler
|
||||
fun serverStarting(event: FMLServerStartingEvent) {
|
||||
logger.debug("Registering server commands")
|
||||
event.registerServerCommand(MatterLinkCommand())
|
||||
event.registerServerCommand(MatterLinkCommand)
|
||||
event.registerServerCommand(AuthCommand)
|
||||
start()
|
||||
}
|
||||
|
||||
|
@ -72,7 +84,7 @@ object MatterLink : IMatterLink() {
|
|||
error("${profile.name} is not online")
|
||||
return
|
||||
}
|
||||
player.sendMessage(TextComponentString(msg))
|
||||
player.addChatMessage(TextComponentString(msg))
|
||||
}
|
||||
|
||||
override fun wrappedSendToPlayer(uuid: UUID, msg: String) {
|
||||
|
@ -84,10 +96,10 @@ object MatterLink : IMatterLink() {
|
|||
logger.error("${profile.name} is not online")
|
||||
return
|
||||
}
|
||||
player.sendMessage(TextComponentString(msg))
|
||||
player.addChatMessage(TextComponentString(msg))
|
||||
}
|
||||
|
||||
override fun isOnline(username: String) = FMLCommonHandler.instance().minecraftServerInstance.onlinePlayerNames.contains(username)
|
||||
override fun isOnline(username: String) = FMLCommonHandler.instance().minecraftServerInstance.playerList.allUsernames.contains(username)
|
||||
|
||||
private fun playerByProfile(gameProfile: GameProfile): EntityPlayerMP? = FMLCommonHandler.instance().minecraftServerInstance.playerList.getPlayerByUUID(gameProfile.id)
|
||||
|
||||
|
@ -106,6 +118,17 @@ object MatterLink : IMatterLink() {
|
|||
null
|
||||
}
|
||||
|
||||
override fun collectPlayers(area: Area): Set<UUID> {
|
||||
val playerList = FMLCommonHandler.instance().minecraftServerInstance.playerList
|
||||
val players = playerList.allProfiles
|
||||
.map { playerList.getPlayerByUUID(it.id) }
|
||||
.filter {
|
||||
(area.allDimensions || area.dimensions.contains(it.dimension))
|
||||
&& area.testInBounds(it.posX.toInt(), it.posY.toInt(), it.posZ.toInt())
|
||||
}
|
||||
return players.map { it.uniqueID }.toSet()
|
||||
}
|
||||
|
||||
override fun nameToUUID(username: String): UUID? = profileByName(username)?.id
|
||||
|
||||
override fun uuidToName(uuid: UUID): String? = profileByUUID(uuid)?.name
|
|
@ -1,6 +1,5 @@
|
|||
package matterlink.command
|
||||
|
||||
import matterlink.logger
|
||||
import net.minecraft.command.CommandBase
|
||||
import net.minecraft.command.ICommandSender
|
||||
import net.minecraft.command.WrongUsageException
|
||||
|
@ -9,16 +8,16 @@ import net.minecraft.server.MinecraftServer
|
|||
import net.minecraft.util.text.TextComponentString
|
||||
|
||||
|
||||
class AuthCommand : CommandBase() {
|
||||
override fun getName(): String {
|
||||
object AuthCommand : CommandBase() {
|
||||
override fun getCommandName(): String {
|
||||
return CommandCoreAuth.name
|
||||
}
|
||||
|
||||
override fun getUsage(sender: ICommandSender): String {
|
||||
override fun getCommandUsage(sender: ICommandSender): String {
|
||||
return CommandCoreAuth.usage
|
||||
}
|
||||
|
||||
override fun getAliases(): List<String> {
|
||||
override fun getCommandAliases(): List<String> {
|
||||
return CommandCoreAuth.aliases
|
||||
}
|
||||
|
||||
|
@ -28,14 +27,14 @@ class AuthCommand : CommandBase() {
|
|||
|
||||
override fun execute(server: MinecraftServer, sender: ICommandSender, args: Array<String>) {
|
||||
if (args.isEmpty()) {
|
||||
throw WrongUsageException("Invalid command! Valid uses: ${this.getUsage(sender)}")
|
||||
throw WrongUsageException("Invalid command! Valid uses: ${this.getCommandUsage(sender)}")
|
||||
}
|
||||
|
||||
val uuid = (sender as? EntityPlayer)?.uniqueID?.toString()
|
||||
val reply = CommandCoreAuth.execute(args, sender.name, uuid)
|
||||
|
||||
if (reply.isNotEmpty() && sender.sendCommandFeedback()) {
|
||||
sender.sendMessage(TextComponentString(reply))
|
||||
sender.addChatMessage(TextComponentString(reply))
|
||||
}
|
||||
}
|
||||
|
|
@ -8,29 +8,29 @@ import net.minecraft.server.MinecraftServer
|
|||
import net.minecraft.util.text.TextComponentString
|
||||
|
||||
|
||||
class MatterLinkCommand : CommandBase() {
|
||||
override fun getName(): String {
|
||||
object MatterLinkCommand : CommandBase() {
|
||||
override fun getCommandName(): String {
|
||||
return CommandCoreML.name
|
||||
}
|
||||
|
||||
override fun getUsage(sender: ICommandSender): String {
|
||||
override fun getCommandUsage(sender: ICommandSender): String {
|
||||
return CommandCoreML.usage
|
||||
}
|
||||
|
||||
override fun getAliases(): List<String> {
|
||||
override fun getCommandAliases(): List<String> {
|
||||
return CommandCoreML.aliases
|
||||
}
|
||||
|
||||
override fun execute(server: MinecraftServer, sender: ICommandSender, args: Array<String>) {
|
||||
if (args.isEmpty()) {
|
||||
throw WrongUsageException("Invalid command! Valid uses: ${this.getUsage(sender)}")
|
||||
throw WrongUsageException("Invalid command! Valid uses: ${this.getCommandUsage(sender)}")
|
||||
}
|
||||
|
||||
val uuid = (sender as? EntityPlayer)?.uniqueID?.toString()
|
||||
val reply = CommandCoreML.execute(args, sender.name, uuid)
|
||||
|
||||
if (reply.isNotEmpty() && sender.sendCommandFeedback()) {
|
||||
sender.sendMessage(TextComponentString(reply))
|
||||
sender.addChatMessage(TextComponentString(reply))
|
||||
}
|
||||
}
|
||||
}
|
|
@ -18,8 +18,7 @@ class MatterLinkCommandSender(
|
|||
user: String,
|
||||
env: IBridgeCommand.CommandEnvironment,
|
||||
op: Boolean) : IMinecraftCommandSender(user, env, op), ICommandSender {
|
||||
|
||||
override fun execute(cmdString: String): Boolean {
|
||||
override fun execute(cmdString: String): Boolean {
|
||||
return 0 < FMLCommonHandler.instance().minecraftServerInstance.commandManager.executeCommand(
|
||||
this,
|
||||
cmdString
|
||||
|
@ -38,7 +37,7 @@ class MatterLinkCommandSender(
|
|||
return FMLCommonHandler.instance().minecraftServerInstance.worldServerForDimension(0)
|
||||
}
|
||||
|
||||
override fun canUseCommand(permLevel: Int, commandName: String): Boolean {
|
||||
override fun canCommandSenderUseCommand(permLevel: Int, commandName: String): Boolean {
|
||||
//we check user on our end
|
||||
return canExecute(commandName)
|
||||
}
|
||||
|
@ -47,7 +46,7 @@ class MatterLinkCommandSender(
|
|||
return FMLCommonHandler.instance().minecraftServerInstance
|
||||
}
|
||||
|
||||
override fun sendMessage(@Nonnull component: ITextComponent?) {
|
||||
override fun addChatMessage(@Nonnull component: ITextComponent?) {
|
||||
appendReply(component!!.unformattedComponentText)
|
||||
}
|
||||
|
|
@ -6,20 +6,20 @@ pipeline {
|
|||
sh 'git submodule update --init --recursive'
|
||||
}
|
||||
}
|
||||
stage("1.10.2") {
|
||||
stage("1.7.10") {
|
||||
steps {
|
||||
sh './gradlew :1.10.2:setupCiWorkspace'
|
||||
sh './gradlew :1.10.2:clean'
|
||||
sh './gradlew :1.10.2:build'
|
||||
archiveArtifacts artifacts: '1.10.2/build/libs/*jar'
|
||||
sh './gradlew :1.7.10:setupCiWorkspace'
|
||||
sh './gradlew :1.7.10:clean'
|
||||
sh './gradlew :1.7.10:build'
|
||||
archiveArtifacts artifacts: '1.7.10/build/libs/*jar'
|
||||
}
|
||||
}
|
||||
stage("1.11.2") {
|
||||
stage("1.9.4") {
|
||||
steps {
|
||||
sh './gradlew :1.11.2:setupCiWorkspace'
|
||||
sh './gradlew :1.11.2:clean'
|
||||
sh './gradlew :1.11.2:build'
|
||||
archiveArtifacts artifacts: '1.11.2/build/libs/*jar'
|
||||
sh './gradlew :1.9.4:setupCiWorkspace'
|
||||
sh './gradlew :1.9.4:clean'
|
||||
sh './gradlew :1.9.4:build'
|
||||
archiveArtifacts artifacts: '1.9.4/build/libs/*jar'
|
||||
}
|
||||
}
|
||||
stage("1.12.2") {
|
||||
|
|
|
@ -28,9 +28,7 @@ Chat with us on IRC: [#matterlink @ irc.esper.net](irc://irc.esper.net/matterlin
|
|||
|
||||
[![Download 1.12.2](https://curse.nikky.moe/api/img/287323?logo&style=for-the-badge&version=1.12.2)](https://curse.nikky.moe/api/url/287323?version=1.12.2)
|
||||
|
||||
[![Download 1.11.2](https://curse.nikky.moe/api/img/287323?logo&style=for-the-badge&version=1.11.2)](https://curse.nikky.moe/api/url/287323?version=1.11.2)
|
||||
|
||||
[![Download 1.10.2](https://curse.nikky.moe/api/img/287323?logo&style=for-the-badge&version=1.10.2)](https://curse.nikky.moe/api/url/287323?version=1.10.2)
|
||||
[![Download 1.9.4](https://curse.nikky.moe/api/img/287323?logo&style=for-the-badge&version=1.9.4)](https://curse.nikky.moe/api/url/287323?version=1.9.4)
|
||||
|
||||
## Dependencies
|
||||
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
\.idea/
|
||||
\.gradle/
|
||||
out/
|
||||
build/
|
||||
run/
|
|
@ -1,22 +0,0 @@
|
|||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2018
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -1 +0,0 @@
|
|||
MatterLinkApi
|
|
@ -1,49 +0,0 @@
|
|||
buildscript {
|
||||
ext.kotlin_version = '1.2.41'
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
}
|
||||
}
|
||||
group 'moe.nikky'
|
||||
version '1.0-SNAPSHOT'
|
||||
|
||||
apply plugin: 'kotlin'
|
||||
apply plugin: 'java'
|
||||
apply plugin: 'idea'
|
||||
|
||||
sourceCompatibility = 1.8
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
compileKotlin {
|
||||
kotlinOptions {
|
||||
languageVersion = "1.2"
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
}
|
||||
|
||||
compileTestKotlin {
|
||||
kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// https://mvnrepository.com/artifact/com.google.code.gson/gson
|
||||
compile group: 'com.google.code.gson', name: 'gson', version: '+'
|
||||
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '+'
|
||||
|
||||
testCompile group: 'junit', name: 'junit', version: '4.12'
|
||||
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
||||
}
|
||||
|
||||
idea {
|
||||
module {
|
||||
excludeDirs += [file("run")]
|
||||
}
|
||||
}
|
Binary file not shown.
|
@ -1,5 +0,0 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip
|
|
@ -1,172 +0,0 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS=""
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
NONSTOP* )
|
||||
nonstop=true
|
||||
;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
done
|
||||
case $i in
|
||||
(0) set -- ;;
|
||||
(1) set -- "$args0" ;;
|
||||
(2) set -- "$args0" "$args1" ;;
|
||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Escape application args
|
||||
save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=$(save "$@")
|
||||
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
|
||||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||
cd "$(dirname "$0")"
|
||||
fi
|
||||
|
||||
exec "$JAVACMD" "$@"
|
|
@ -1,84 +0,0 @@
|
|||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS=
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:init
|
||||
@rem Get command-line arguments, handling Windows variants
|
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||
|
||||
:win9xME_args
|
||||
@rem Slurp the command line arguments.
|
||||
set CMD_LINE_ARGS=
|
||||
set _SKIP=2
|
||||
|
||||
:win9xME_args_slurp
|
||||
if "x%~1" == "x" goto execute
|
||||
|
||||
set CMD_LINE_ARGS=%*
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
|
@ -1,2 +0,0 @@
|
|||
rootProject.name = 'MatterLinkApi'
|
||||
|
|
@ -1,92 +0,0 @@
|
|||
package matterlink.api
|
||||
|
||||
import com.google.gson.GsonBuilder
|
||||
import com.google.gson.annotations.SerializedName
|
||||
|
||||
/**
|
||||
* Created by nikky on 07/05/18.
|
||||
*
|
||||
* @author Nikky
|
||||
* @version 1.0
|
||||
*/
|
||||
class ApiMessage (
|
||||
username: String? = null,
|
||||
text: String? = null,
|
||||
gateway: String? = null,
|
||||
channel: String? = null,
|
||||
userid: String? = null,
|
||||
avatar: String? = null,
|
||||
account: String? = null,
|
||||
protocol: String? = null,
|
||||
event: String? = null,
|
||||
id: String? = null
|
||||
) {
|
||||
@SerializedName("username") private var _username: String? = username
|
||||
@SerializedName("text") private var _text: String? = text
|
||||
@SerializedName("gateway") private var _gateway: String? = gateway
|
||||
@SerializedName("channel") private var _channel: String? = channel
|
||||
@SerializedName("userid") private var _userid: String? = userid
|
||||
@SerializedName("avatar") private var _avatar: String? = avatar
|
||||
@SerializedName("account") private var _account: String? = account
|
||||
@SerializedName("protocol") private var _protocol: String? = protocol
|
||||
@SerializedName("event") private var _event: String? = event
|
||||
@SerializedName("id") private var _id: String? = id
|
||||
|
||||
var username: String
|
||||
get() = _username ?: ""
|
||||
set(username) { this._username = username }
|
||||
|
||||
var text: String
|
||||
get() = _text ?: ""
|
||||
set(text) { this._text = text }
|
||||
|
||||
var gateway: String
|
||||
get() = _gateway ?: ""
|
||||
set(gateway) { this._gateway = gateway }
|
||||
|
||||
var channel: String
|
||||
get() = _channel ?: ""
|
||||
set(channel) { this._channel = channel }
|
||||
|
||||
var userid: String
|
||||
get() = _userid ?: ""
|
||||
set(userid) { this._userid = userid }
|
||||
|
||||
var avatar: String
|
||||
get() = _avatar ?: ""
|
||||
set(avatar) { this._avatar = avatar }
|
||||
|
||||
var account: String
|
||||
get() = _account ?: ""
|
||||
set(account) { this._account = account }
|
||||
|
||||
var protocol: String
|
||||
get() = _protocol ?: ""
|
||||
set(protocol) { this._protocol = protocol }
|
||||
|
||||
var event: String
|
||||
get() = _event ?: ""
|
||||
set(event) { this._event = event }
|
||||
|
||||
var id: String
|
||||
get() = _id ?: ""
|
||||
set(id) { this._id = id }
|
||||
|
||||
fun encode(): String {
|
||||
return gson.toJson(this)
|
||||
}
|
||||
|
||||
override fun toString(): String = encode()
|
||||
|
||||
companion object {
|
||||
val USER_ACTION = "user_action"
|
||||
val JOIN_LEAVE = "join_leave"
|
||||
|
||||
private val gson = GsonBuilder()
|
||||
.create()
|
||||
|
||||
fun decode(json: String): ApiMessage {
|
||||
return gson.fromJson(json, ApiMessage::class.java)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
package matterlink.api
|
||||
|
||||
data class Config (
|
||||
var url: String = "",
|
||||
var token: String = "",
|
||||
var announceConnect: Boolean = true,
|
||||
var announceDisconnect: Boolean = true,
|
||||
var reconnectWait: Long = 500,
|
||||
var systemUser: String = "Server"
|
||||
)
|
||||
{
|
||||
fun sync(connection: StreamConnection) {
|
||||
connection.token = token
|
||||
connection.host = url
|
||||
}
|
||||
}
|
|
@ -1,201 +0,0 @@
|
|||
package matterlink.api
|
||||
|
||||
import org.apache.logging.log4j.Logger
|
||||
import java.io.BufferedReader
|
||||
import java.io.DataOutputStream
|
||||
import java.io.IOException
|
||||
import java.io.InputStreamReader
|
||||
import java.net.HttpURLConnection
|
||||
import java.net.MalformedURLException
|
||||
import java.net.ProtocolException
|
||||
import java.net.URL
|
||||
import java.util.concurrent.ConcurrentLinkedQueue
|
||||
|
||||
/**
|
||||
* Created by nikky on 07/05/18.
|
||||
*
|
||||
* @author Nikky
|
||||
* @version 1.0
|
||||
*/
|
||||
open class MessageHandler {
|
||||
private var enabled = false
|
||||
|
||||
private var connectErrors = 0
|
||||
private var reconnectCooldown = 0
|
||||
private var sendErrors = 0
|
||||
|
||||
var config: Config = Config()
|
||||
set(value) {
|
||||
field = value.apply {
|
||||
sync(streamConnection)
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: make callbacks: onConnect onDisconnect onError etc
|
||||
|
||||
var queue: ConcurrentLinkedQueue<ApiMessage> = ConcurrentLinkedQueue()
|
||||
private set
|
||||
private var streamConnection: StreamConnection = StreamConnection(queue)
|
||||
|
||||
var logger: Logger
|
||||
get() = streamConnection.logger
|
||||
set(l) {
|
||||
streamConnection.logger = l
|
||||
}
|
||||
|
||||
|
||||
private var nextCheck: Long = 0
|
||||
|
||||
init {
|
||||
streamConnection.addOnSuccess { success ->
|
||||
if (success) {
|
||||
logger.info("connected successfully")
|
||||
connectErrors = 0
|
||||
reconnectCooldown = 0
|
||||
} else {
|
||||
reconnectCooldown = connectErrors
|
||||
connectErrors++
|
||||
logger.error(String.format("connectErrors: %d", connectErrors))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun stop(message: String? = null) {
|
||||
if (message != null && config.announceDisconnect) {
|
||||
sendStatusUpdate(message)
|
||||
}
|
||||
enabled = false
|
||||
streamConnection.close()
|
||||
}
|
||||
|
||||
|
||||
fun start(message: String?, clear: Boolean) {
|
||||
config.sync(streamConnection)
|
||||
if (clear) {
|
||||
clear()
|
||||
}
|
||||
|
||||
enabled = true
|
||||
streamConnection.open()
|
||||
|
||||
if (message != null && config.announceConnect) {
|
||||
sendStatusUpdate(message)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private fun clear() {
|
||||
try {
|
||||
val url = URL(config.url + "/api/messages")
|
||||
val conn = url.openConnection() as HttpURLConnection
|
||||
|
||||
if (!config.token.isEmpty()) {
|
||||
val bearerAuth = "Bearer " + config.token
|
||||
conn.setRequestProperty("Authorization", bearerAuth)
|
||||
}
|
||||
|
||||
conn.requestMethod = "GET"
|
||||
|
||||
BufferedReader(InputStreamReader(conn.inputStream)).forEachLine { line ->
|
||||
logger.trace("skipping $line")
|
||||
}
|
||||
} catch (e: MalformedURLException) {
|
||||
e.printStackTrace()
|
||||
} catch (e: ProtocolException) {
|
||||
e.printStackTrace()
|
||||
} catch (e: IOException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
open fun sendStatusUpdate(message: String) {
|
||||
transmit(ApiMessage(text = message))
|
||||
}
|
||||
|
||||
open fun transmit(msg: ApiMessage) {
|
||||
if (streamConnection.isConnected || streamConnection.isConnecting) {
|
||||
if (msg.username.isEmpty())
|
||||
msg.username = config.systemUser
|
||||
if (msg.gateway.isEmpty()) {
|
||||
logger.fatal("missing gateway on message: $msg")
|
||||
return
|
||||
}
|
||||
logger.debug("Transmitting: $msg")
|
||||
transmitMessage(msg)
|
||||
}
|
||||
}
|
||||
|
||||
private fun transmitMessage(message: ApiMessage) {
|
||||
try {
|
||||
val url = URL(config.url + "/api/message")
|
||||
val conn = url.openConnection() as HttpURLConnection
|
||||
|
||||
if (!config.token.isEmpty()) {
|
||||
val bearerAuth = "Bearer " + config.token
|
||||
conn.setRequestProperty("Authorization", bearerAuth)
|
||||
}
|
||||
|
||||
val postData = message.encode()
|
||||
logger.trace(postData)
|
||||
|
||||
conn.requestMethod = "POST"
|
||||
conn.setRequestProperty("Content-Type", "application/json")
|
||||
conn.setRequestProperty("charset", "utf-8")
|
||||
conn.setRequestProperty("Content-Length", "" + postData.toByteArray().size)
|
||||
conn.doOutput = true
|
||||
conn.doInput = true
|
||||
|
||||
DataOutputStream(conn.outputStream).use { wr -> wr.write(postData.toByteArray()) }
|
||||
|
||||
// conn.getInputStream().close();
|
||||
conn.connect()
|
||||
val code = conn.responseCode
|
||||
if (code != 200) {
|
||||
logger.error("Server returned $code")
|
||||
sendErrors++
|
||||
if (sendErrors > 5) {
|
||||
logger.error("Interrupting Connection to matterbridge API due to status code $code")
|
||||
stop()
|
||||
}
|
||||
} else {
|
||||
sendErrors = 0
|
||||
}
|
||||
} catch (e: IOException) {
|
||||
e.printStackTrace()
|
||||
logger.error("sending message caused $e")
|
||||
sendErrors++
|
||||
if (sendErrors > 5) {
|
||||
logger.error("Caught too many errors, closing bridge")
|
||||
stop()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* clll this method every tick / cycle to make sure it is reconnecting
|
||||
*/
|
||||
fun checkConnection() {
|
||||
if (enabled && !streamConnection.isConnected && !streamConnection.isConnecting) {
|
||||
logger.trace("check connection")
|
||||
logger.trace("next: $nextCheck")
|
||||
logger.trace("now: " + System.currentTimeMillis())
|
||||
if (nextCheck > System.currentTimeMillis()) return
|
||||
nextCheck = System.currentTimeMillis() + config.reconnectWait
|
||||
|
||||
if (connectErrors >= 10) {
|
||||
logger.error("Caught too many errors, closing bridge")
|
||||
stop("Interrupting connection to matterbridge API due to accumulated connection errors")
|
||||
return
|
||||
}
|
||||
|
||||
if (reconnectCooldown <= 0) {
|
||||
logger.info("Trying to reconnect")
|
||||
start("Reconnecting to matterbridge API after connection error", false)
|
||||
} else {
|
||||
reconnectCooldown--
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,150 +0,0 @@
|
|||
package matterlink.api
|
||||
|
||||
import org.apache.logging.log4j.LogManager
|
||||
import java.io.IOException
|
||||
import java.io.InputStream
|
||||
import java.net.ConnectException
|
||||
import java.net.HttpURLConnection
|
||||
import java.net.MalformedURLException
|
||||
import java.net.URL
|
||||
import java.util.Arrays
|
||||
import java.util.LinkedList
|
||||
import java.util.concurrent.ConcurrentLinkedQueue
|
||||
|
||||
/**
|
||||
* Created by nikky on 07/05/18.
|
||||
*
|
||||
* @author Nikky
|
||||
* @version 1.0
|
||||
*/
|
||||
class StreamConnection(private val rcvQueue: ConcurrentLinkedQueue<ApiMessage>) : Runnable {
|
||||
private var thread: Thread = createThread()
|
||||
private var urlConnection: HttpURLConnection? = null
|
||||
private val onSuccessCallbacks = LinkedList<(Boolean) -> Unit>()
|
||||
|
||||
var logger = LogManager.getLogger("matterlink.api")
|
||||
var host = ""
|
||||
var token = ""
|
||||
|
||||
var isConnected = false
|
||||
private set
|
||||
var isConnecting = false
|
||||
private set
|
||||
var isCancelled = false
|
||||
private set
|
||||
|
||||
private fun createThread(): Thread {
|
||||
val thread = Thread(this)
|
||||
thread.name = "RcvThread"
|
||||
return thread
|
||||
}
|
||||
|
||||
fun addOnSuccess(callback: (Boolean) -> Unit) {
|
||||
onSuccessCallbacks.add(callback)
|
||||
}
|
||||
|
||||
fun removeOnSuccess(callback: (Boolean) -> Unit) {
|
||||
onSuccessCallbacks.remove(callback)
|
||||
}
|
||||
|
||||
private fun onSuccess(success: Boolean) {
|
||||
isConnecting = false
|
||||
isConnected = success
|
||||
for (callback in onSuccessCallbacks) {
|
||||
callback(success)
|
||||
}
|
||||
}
|
||||
|
||||
override fun run() {
|
||||
try {
|
||||
val serviceURL = "$host/api/stream"
|
||||
val myURL: URL
|
||||
|
||||
myURL = URL(serviceURL)
|
||||
urlConnection = myURL.openConnection() as HttpURLConnection
|
||||
urlConnection!!.requestMethod = "GET"
|
||||
if (!token.isEmpty()) {
|
||||
val bearerAuth = "Bearer $token"
|
||||
urlConnection!!.setRequestProperty("Authorization", bearerAuth)
|
||||
}
|
||||
try {
|
||||
urlConnection!!.inputStream.use { input ->
|
||||
logger.info("connection opened")
|
||||
onSuccess(true)
|
||||
// BufferedInputStream bufferedInput = new BufferedInputStream(input, 8 * 1024);
|
||||
val buffer = StringBuilder()
|
||||
while (!isCancelled) {
|
||||
val buf = ByteArray(1024)
|
||||
Thread.sleep(10)
|
||||
while (input.available() <= 0) {
|
||||
if (isCancelled) break
|
||||
Thread.sleep(10)
|
||||
}
|
||||
val chars = input.read(buf)
|
||||
|
||||
logger.trace( String.format("read %d chars", chars))
|
||||
if (chars > 0) {
|
||||
val added = String(Arrays.copyOfRange(buf, 0, chars))
|
||||
logger.debug("DEBUG", "json: $added")
|
||||
buffer.append(added)
|
||||
while (buffer.toString().contains("\n")) {
|
||||
val index = buffer.indexOf("\n")
|
||||
val line = buffer.substring(0, index)
|
||||
buffer.delete(0, index + 1)
|
||||
rcvQueue.add(ApiMessage.decode(line))
|
||||
}
|
||||
} else if (chars < 0) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
onClose()
|
||||
}
|
||||
} catch (e: MalformedURLException) {
|
||||
e.printStackTrace()
|
||||
} catch (e: ConnectException) {
|
||||
e.printStackTrace()
|
||||
onSuccess(false)
|
||||
} catch (e: IOException) {
|
||||
e.printStackTrace()
|
||||
onSuccess(false)
|
||||
} catch (e: InterruptedException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private fun onClose() {
|
||||
logger.info("Bridge connection closed!")
|
||||
isConnected = false
|
||||
isConnecting = false
|
||||
}
|
||||
|
||||
fun open() {
|
||||
if (!thread.isAlive) {
|
||||
thread = createThread()
|
||||
isConnecting = true
|
||||
isCancelled = false
|
||||
thread.start()
|
||||
logger.info("Starting Connection")
|
||||
}
|
||||
if (thread.isAlive) {
|
||||
logger.info("Bridge is connecting")
|
||||
}
|
||||
}
|
||||
|
||||
fun close() {
|
||||
try {
|
||||
isCancelled = true
|
||||
if (urlConnection != null) {
|
||||
urlConnection!!.disconnect()
|
||||
}
|
||||
thread.join()
|
||||
logger.info("Thread stopped")
|
||||
} catch (e: InterruptedException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -1,80 +0,0 @@
|
|||
package matterlink.api
|
||||
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.stream.JsonReader
|
||||
|
||||
import java.io.*
|
||||
import java.util.Scanner
|
||||
|
||||
/**
|
||||
* Created by nikky on 07/05/18.
|
||||
*
|
||||
* @author Nikky
|
||||
* @version 1.0
|
||||
*/
|
||||
object Main {
|
||||
@Throws(IOException::class)
|
||||
@JvmStatic
|
||||
fun main(vararg args: String) {
|
||||
|
||||
val handler = MessageHandler()
|
||||
val queue = handler.queue
|
||||
val config: Config
|
||||
|
||||
val gson = Gson()
|
||||
try {
|
||||
val reader = JsonReader(FileReader("config.json"))
|
||||
config = gson.fromJson(reader, Config::class.java)
|
||||
handler.config = config
|
||||
} catch (e: FileNotFoundException) {
|
||||
e.printStackTrace()
|
||||
FileWriter("config.json").use { writer -> gson.toJson(handler.config, writer) }
|
||||
}
|
||||
|
||||
// handler.logger = { level, msg -> System.out.printf("[%s] %s%n", level, msg) }
|
||||
handler.start("Connecting..", true)
|
||||
|
||||
Thread {
|
||||
while (true) {
|
||||
val next = queue.poll()
|
||||
if (next != null) {
|
||||
println(next)
|
||||
}
|
||||
try {
|
||||
Thread.sleep(200)
|
||||
} catch (e: InterruptedException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
|
||||
}
|
||||
}.start()
|
||||
|
||||
Thread {
|
||||
while (true) {
|
||||
handler.checkConnection()
|
||||
try {
|
||||
Thread.sleep(100)
|
||||
} catch (e: InterruptedException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
|
||||
}
|
||||
}.start()
|
||||
|
||||
val sc = Scanner(System.`in`)
|
||||
while (true) {
|
||||
val input = sc.nextLine()
|
||||
when (input) {
|
||||
"start" -> {
|
||||
handler.start("start", false)
|
||||
}
|
||||
"stop" -> {
|
||||
handler.stop("stop")
|
||||
}
|
||||
else -> {
|
||||
handler.transmit(ApiMessage(text = input))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
12
build.gradle
12
build.gradle
|
@ -3,7 +3,7 @@ buildscript {
|
|||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath group: "org.jetbrains.kotlin", name: "kotlin-gradle-plugin", version: kotlin_version
|
||||
classpath group: "org.jetbrains.kotlin", name: "kotlin-gradle-plugin", version: kotlinVersion
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -17,10 +17,10 @@ subprojects {
|
|||
apply plugin: "idea"
|
||||
|
||||
if (System.env.BUILD_NUMBER) {
|
||||
mod_version += "-${System.env.BUILD_NUMBER}"
|
||||
modVersion += "-${System.env.BUILD_NUMBER}"
|
||||
} else if (!project.hasProperty('release')) {
|
||||
// mod_version += "-dev"
|
||||
mod_version += "-dev"
|
||||
// modVersion += "-dev"
|
||||
modVersion += "-dev"
|
||||
}
|
||||
|
||||
idea {
|
||||
|
@ -35,6 +35,10 @@ subprojects {
|
|||
}
|
||||
repositories {
|
||||
jcenter()
|
||||
maven {
|
||||
name = "bintray"
|
||||
url = 'http://jcenter.bintray.com'
|
||||
}
|
||||
maven {
|
||||
name = "elytradev"
|
||||
url = 'http://unascribed.com/maven/releases'
|
||||
|
|
|
@ -4,30 +4,31 @@ buildscript {
|
|||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
// classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
classpath group: "com.github.jengelman.gradle.plugins", name: "shadow", version: shadow_version
|
||||
classpath group: "org.jetbrains.kotlin", name: "kotlin-gradle-plugin", version: kotlinVersion
|
||||
classpath group: "com.github.jengelman.gradle.plugins", name: "shadow", version: shadowVersion
|
||||
classpath group: 'com.vanniktech', name: 'gradle-dependency-graph-generator-plugin', version: '0.5.0'
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'kotlin'
|
||||
apply plugin: "com.github.johnrengelman.shadow"
|
||||
apply plugin: "com.vanniktech.dependency.graph.generator"
|
||||
|
||||
sourceCompatibility = targetCompatibility = '1.8' // Need this here so eclipse task generates correctly.
|
||||
|
||||
dependencies {
|
||||
compile project(':api')
|
||||
|
||||
compile project(":Jankson")
|
||||
shadow (project(':Jankson')) { transitive = false }
|
||||
|
||||
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '+'
|
||||
compile group: 'com.google.code.gson', name: 'gson', version: '+'
|
||||
compile group: 'com.google.guava', name: 'guava', version: '+'
|
||||
|
||||
compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '+'
|
||||
compile group: 'com.github.kittinunf.fuel', name: 'fuel', version: fuelVersion
|
||||
shadow (group: 'com.github.kittinunf.fuel', name: 'fuel', version: fuelVersion) { transitive = false }
|
||||
compile group: 'com.github.kittinunf.result', name: 'result', version: resultVersion
|
||||
shadow (group: 'com.github.kittinunf.result', name: 'result', version: resultVersion) { transitive = false }
|
||||
|
||||
// compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib-jdk8', version: project.kotlin_version
|
||||
|
||||
compile group: 'com.elytradev.concrete', name:'concrete-common', version: concrete_version
|
||||
compile group: 'com.elytradev.concrete', name:'concrete-rulesengine', version: concrete_version
|
||||
compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib-jdk8', version: kotlinVersion
|
||||
}
|
||||
|
||||
compileKotlin {
|
||||
|
@ -39,13 +40,9 @@ compileKotlin {
|
|||
shadowJar {
|
||||
classifier = ''
|
||||
|
||||
dependencies {
|
||||
include project(":api")
|
||||
include project(":Jankson")
|
||||
include dependency(group: 'com.elytradev.concrete', name: 'concrete-common', version: concrete_version)
|
||||
include dependency(group: 'com.elytradev.concrete', name: 'concrete-rulesengine', version: concrete_version)
|
||||
}
|
||||
|
||||
relocate 'blue.endless', 'matterlink.repack.blue.endless'
|
||||
relocate 'com.elytradev.concrete', 'matterlink.repack.com.elytradev.concrete'
|
||||
relocate 'com.github', 'matterlink.repack.com.github'
|
||||
configurations = [project.configurations.shadow]
|
||||
}
|
||||
|
||||
//tasks.build.dependsOn shadowJar
|
|
@ -1,42 +0,0 @@
|
|||
package matterlink
|
||||
|
||||
import matterlink.HttpClientUtil.client
|
||||
import org.apache.http.HttpResponse
|
||||
import org.apache.http.client.methods.HttpGet
|
||||
import org.apache.http.client.methods.HttpRequestBase
|
||||
import org.apache.http.impl.client.HttpClientBuilder
|
||||
|
||||
|
||||
/**
|
||||
* Created by nikky on 15/07/18.
|
||||
* @author Nikky
|
||||
*/
|
||||
|
||||
object HttpClientUtil {
|
||||
val client = HttpClientBuilder.create().build()
|
||||
}
|
||||
|
||||
fun String.httpGet(): HttpGet =
|
||||
HttpGet(this)
|
||||
|
||||
fun HttpGet.header(pair: Pair<String, String>): HttpGet = this.apply {
|
||||
addHeader(pair.first, pair.second)
|
||||
}
|
||||
|
||||
fun HttpGet.responseString(): Triple<HttpRequestBase, HttpResponse, Result> {
|
||||
val response = client.execute(this)
|
||||
|
||||
val result = response.entity.content.bufferedReader().use { it.readText() }
|
||||
|
||||
return Triple(this, response, Result.Success(result))
|
||||
}
|
||||
|
||||
sealed class Result {
|
||||
class Success(
|
||||
val value: String
|
||||
) : Result()
|
||||
|
||||
class Failure(
|
||||
val error: Throwable
|
||||
) : Result()
|
||||
}
|
|
@ -7,12 +7,12 @@ import matterlink.bridge.command.IMinecraftCommandSender
|
|||
import matterlink.config.BaseConfig
|
||||
import matterlink.config.cfg
|
||||
import matterlink.update.UpdateChecker
|
||||
import org.apache.logging.log4j.Logger
|
||||
import java.util.*
|
||||
|
||||
lateinit var instance: IMatterLink
|
||||
lateinit var logger: Logger
|
||||
|
||||
lateinit var instance: IMatterLink
|
||||
|
||||
abstract class IMatterLink {
|
||||
abstract val mcVersion: String
|
||||
abstract val modVersion: String
|
||||
|
@ -29,6 +29,10 @@ abstract class IMatterLink {
|
|||
abstract fun nameToUUID(username: String): UUID?
|
||||
abstract fun uuidToName(uuid: UUID): String?
|
||||
|
||||
init {
|
||||
|
||||
}
|
||||
|
||||
fun start() {
|
||||
// MessageHandlerInst.logger = { level, msg ->
|
||||
// when (level) {
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
package matterlink
|
||||
|
||||
interface Logger {
|
||||
fun info(message: String)
|
||||
fun debug(message: String)
|
||||
fun error(message: String)
|
||||
fun warn(message: String)
|
||||
fun trace(message: String)
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
package matterlink.api
|
||||
|
||||
import org.apache.logging.log4j.Logger
|
||||
import matterlink.Logger
|
||||
import java.io.BufferedReader
|
||||
import java.io.DataOutputStream
|
||||
import java.io.IOException
|
||||
|
@ -118,7 +118,7 @@ open class MessageHandler {
|
|||
if (msg.username.isEmpty())
|
||||
msg.username = config.systemUser
|
||||
if (msg.gateway.isEmpty()) {
|
||||
logger.fatal("missing gateway on message: $msg")
|
||||
logger.error("missing gateway on message: $msg")
|
||||
return
|
||||
}
|
||||
logger.debug("Transmitting: $msg")
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package matterlink.api
|
||||
|
||||
import org.apache.logging.log4j.LogManager
|
||||
import matterlink.Logger
|
||||
import java.io.IOException
|
||||
import java.io.InputStream
|
||||
import java.net.ConnectException
|
||||
|
@ -22,7 +22,13 @@ class StreamConnection(private val rcvQueue: ConcurrentLinkedQueue<ApiMessage>)
|
|||
private var urlConnection: HttpURLConnection? = null
|
||||
private val onSuccessCallbacks = LinkedList<(Boolean) -> Unit>()
|
||||
|
||||
var logger = LogManager.getLogger("matterlink.api")
|
||||
var logger = object : Logger {
|
||||
override fun info(message: String) = println("INFO: $message")
|
||||
override fun debug(message: String) = println("DEBUG: $message")
|
||||
override fun error(message: String) = println("ERROR: $message")
|
||||
override fun warn(message: String) = println("WARN: $message")
|
||||
override fun trace(message: String) = println("TRACE: $message")
|
||||
}
|
||||
var host = ""
|
||||
var token = ""
|
||||
|
||||
|
@ -85,7 +91,7 @@ class StreamConnection(private val rcvQueue: ConcurrentLinkedQueue<ApiMessage>)
|
|||
logger.trace( String.format("read %d chars", chars))
|
||||
if (chars > 0) {
|
||||
val added = String(Arrays.copyOfRange(buf, 0, chars))
|
||||
logger.debug("DEBUG", "json: $added")
|
||||
logger.debug("json: $added")
|
||||
buffer.append(added)
|
||||
while (buffer.toString().contains("\n")) {
|
||||
val index = buffer.indexOf("\n")
|
||||
|
|
|
@ -19,7 +19,7 @@ data class BaseConfig(val rootDir: File) {
|
|||
val configFile: File = cfgDirectory.resolve("matterlink.hjson")
|
||||
|
||||
init {
|
||||
logger.info("Reading bridge blueprints... from {}", rootDir)
|
||||
logger.info("Reading bridge blueprints... from $rootDir")
|
||||
baseCfg = this
|
||||
}
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ object ServerChatHandler {
|
|||
ApiMessage.JOIN_LEAVE -> location.incoming.join_leave ?: defaults.join_leave
|
||||
ApiMessage.USER_ACTION -> location.incoming.action ?: defaults.action
|
||||
else -> {
|
||||
logger.fatal("unknwon event type '${nextMessage.event}' on incoming message")
|
||||
logger.error("unknown event type '${nextMessage.event}' on incoming message")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
package matterlink.jenkins
|
||||
|
||||
import com.github.kittinunf.fuel.httpGet
|
||||
import com.github.kittinunf.result.Result
|
||||
import com.google.gson.Gson
|
||||
import matterlink.*
|
||||
import matterlink.Result
|
||||
import matterlink.header
|
||||
import matterlink.httpGet
|
||||
import matterlink.responseString
|
||||
import matterlink.logger
|
||||
|
||||
|
||||
/**
|
||||
* Created by nikky on 03/02/18.
|
||||
|
|
|
@ -1,11 +1,9 @@
|
|||
package matterlink.jenkins
|
||||
|
||||
|
||||
import com.github.kittinunf.fuel.httpGet
|
||||
import com.github.kittinunf.result.Result
|
||||
import com.google.gson.Gson
|
||||
import matterlink.Result
|
||||
import matterlink.header
|
||||
import matterlink.httpGet
|
||||
import matterlink.responseString
|
||||
import matterlink.logger
|
||||
|
||||
/**
|
||||
|
|
|
@ -4,6 +4,8 @@ import com.google.gson.GsonBuilder
|
|||
import matterlink.api.ApiMessage
|
||||
import matterlink.bridge.MessageHandlerInst
|
||||
import matterlink.config.cfg
|
||||
import matterlink.handlers.ChatEvent
|
||||
import matterlink.handlers.LocationHandler
|
||||
import matterlink.instance
|
||||
import matterlink.logger
|
||||
import matterlink.jenkins.JenkinsServer
|
||||
|
@ -42,10 +44,11 @@ class UpdateChecker : Thread() {
|
|||
number > instance.buildNumber -> {
|
||||
logger.warn("Mod out of date! New build $number available at $url")
|
||||
val difference = number - build.number
|
||||
MessageHandlerInst.transmit(
|
||||
ApiMessage(
|
||||
text = "MatterLink out of date! You are $difference builds behind! Please download new version from $url"
|
||||
)
|
||||
LocationHandler.sendToLocations(
|
||||
msg = "MatterLink out of date! You are $difference builds behind! Please download new version from $url",
|
||||
x = 0, y =0, z = 0, dimension = null,
|
||||
event = ChatEvent.STATUS,
|
||||
cause = "MatterLink update notice"
|
||||
)
|
||||
}
|
||||
number < instance.buildNumber -> logger.error("lastSuccessfulBuild: $number is older than installed build: ${instance.buildNumber}")
|
||||
|
@ -130,7 +133,7 @@ class UpdateChecker : Thread() {
|
|||
|
||||
logger.info("Matterlink out of date! You are $count $version behind")
|
||||
possibleUpdates.forEach {
|
||||
logger.info("version: {} download: {}", it.fileName, it.downloadURL)
|
||||
logger.info("version: ${it.fileName} download: ${it.downloadURL}")
|
||||
}
|
||||
|
||||
logger.warn("Mod out of date! New $version available at ${latest.downloadURL}")
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
mod_name = MatterLink
|
||||
mod_version = 1.6.3
|
||||
forgelin_version = 1.6.0
|
||||
concrete_version = 0.3.8-SNAPSHOT
|
||||
kotlin_version = 1.2.41
|
||||
shadow_version = 2.0.2
|
||||
cursegradle_version = 1.0.10
|
||||
curse_id = 287323
|
||||
curse_release_type = beta
|
||||
modName = MatterLink
|
||||
modVersion = 1.6.4
|
||||
forgelinVersion = 1.6.0
|
||||
kotlinVersion = 1.2.41
|
||||
shadowVersion = 2.0.2
|
||||
fuelVersion = 1.13.0
|
||||
resultVersion = 1.4.0
|
||||
cursegradleVersion = 1.0.10
|
||||
curseId = 287323
|
||||
curseReleaseType = beta
|
|
@ -0,0 +1,19 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
java -jar forge-installer.jar --installServer
|
||||
|
||||
FORGE_FILE=`grep "The server installed successfully, you should now be able to run the file " forge-installer.jar.log | tail -1`
|
||||
FORGE_FILE=${FORGE_FILE#"The server installed successfully, you should now be able to run the file "}
|
||||
echo FORGE_FILE
|
||||
|
||||
cp -f "$FORGE_FILE" forge.jar
|
||||
|
||||
echo "installed forge"
|
||||
|
||||
cp ../eula.txt .
|
||||
|
||||
mkdir -p config
|
||||
rm -rf config/matterlink
|
||||
cp -r ../matterlink_config config/matterlink
|
||||
|
||||
java -jar forge.jar
|
|
@ -0,0 +1,18 @@
|
|||
#!/usr/bin/env bash
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"
|
||||
|
||||
RUN="$PWD/run/1.12.2"
|
||||
|
||||
rm -rf "$RUN/mods"
|
||||
mkdir -p "$RUN/mods"
|
||||
|
||||
"$PWD/gradlew" :1.12.2:clean :1.12.2:build && cp -f 1.12.2/build/libs/MatterLink-1.12.2-*-dev.jar "$RUN/mods"
|
||||
|
||||
cd "$RUN"
|
||||
|
||||
curl -o forge-installer.jar "https://files.minecraftforge.net/maven/net/minecraftforge/forge/1.12.2-14.23.4.2705/forge-1.12.2-14.23.4.2705-installer.jar"
|
||||
curl -L -o "$RUN/mods/Forgelin.jar" "https://minecraft.curseforge.com/projects/shadowfacts-forgelin/files/2573311/download"
|
||||
|
||||
$DIR/scripts/start.sh
|
||||
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
#!/usr/bin/env bash
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"
|
||||
|
||||
RUN="$PWD/run/1.7.10"
|
||||
|
||||
rm -rf "$RUN/mods"
|
||||
mkdir -p "$RUN/mods"
|
||||
|
||||
"$PWD/gradlew" :1.7.10:clean :1.7.10:build && cp -f $DIR/1.7.10/build/libs/MatterLink-1.7.10-*-dev.jar "$RUN/mods"
|
||||
|
||||
cd "$RUN"
|
||||
|
||||
curl -o forge-installer.jar "https://files.minecraftforge.net/maven/net/minecraftforge/forge/1.7.10-10.13.4.1614-1.7.10/forge-1.7.10-10.13.4.1614-1.7.10-installer.jar"
|
||||
|
||||
$DIR/scripts/start.sh
|
|
@ -0,0 +1,18 @@
|
|||
#!/usr/bin/env bash
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"
|
||||
|
||||
RUN="$PWD/run/1.9.4"
|
||||
|
||||
rm -rf "$RUN/mods"
|
||||
mkdir -p "$RUN/mods"
|
||||
|
||||
"$PWD/gradlew" :1.9.4:clean :1.9.4:build && cp -f 1.9.4/build/libs/MatterLink-1.9.4-*-dev.jar "$RUN/mods"
|
||||
|
||||
cd "$RUN"
|
||||
|
||||
curl -o forge-installer.jar "https://files.minecraftforge.net/maven/net/minecraftforge/forge/1.9.4-12.17.0.2051/forge-1.9.4-12.17.0.2051-installer.jar"
|
||||
curl -L -o "$RUN/mods/Forgelin.jar" "https://minecraft.curseforge.com/projects/shadowfacts-forgelin/files/2505090/download" # "https://minecraft.curseforge.com/projects/shadowfacts-forgelin/files/2573311/download"
|
||||
|
||||
$DIR/scripts/start.sh
|
||||
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
rootProject.name = 'MatterLink'
|
||||
include 'core', 'api'
|
||||
include 'core'
|
||||
include 'Jankson'
|
||||
include '1.12.2', '1.11.2', '1.10.2'
|
||||
include '1.12.2', '1.9.4', '1.7.10'
|
Loading…
Reference in New Issue