前言
这是我最近在搞的一个先研究,关于tshock的,原因是我不熟悉C#懒得学(其实以前学过一点),但是又想做插件
首先是简简单单装个tshock
直接wget下来解压,或者自己下载下来也行,链接从这里找 https://github.com/Pryaxis/TShock/releases
然后,我觉得服务器启动我应该不用说(),如果像我一样比较懒的话可以次次用TShock.Installer启动,byd连个环境变量都懒得设是罢,是这样的
第一次用TShock.Installer它会自动给你装dotnet,所以你不用自己手动装NET了,不过我以前学C#装过Mono就是了
跑题了,本篇不教怎么装tshock
似乎已经是正文了
实现互相通讯,我是基于tshock的RESTAPI弄的,在tshock/config.json的第140行,将RestApiEnabled改为true就行了
然后在第146行找到ApplicationRestTokens,然后添加你的永久token
这里的Token名称你应该可以随便设,如果为了省事可以用1
示例:
- "ApplicationRestTokens": {
- "1": {
- "Username": "name",
- "UserGroupName": "superadmin"
- }
- }
复制代码
建议把权限组设置为superadmin而不是owner,owner无法正常使用/v3/server/rawcmd接口,superadmin的权限相当于游戏内的/sudo命令
当然,如果仅通讯其实Token是不必要的,但是如果要做一些特殊的东西可以用token
Minecraft部分只通信就选择WebSocket就好了,我用的是库socket-be,这个库相对方便一些
对了,Terraria那边我选择了一个插件,ChattyBridge,这个插件本用于泰拉服务器之间的互相通信,基于restAPI,所以用这个简单些,用exec命令然后监听stdout也可以,但是太过于麻烦了
使用这个插件,我们只需要写一个假的REST服务器接收信息并返回status: 200就好了
联系上文,每当服务器获取到请求的数据(ChattyBridge定义了一个REST接口,即/chat,GET请求),获取分析然后使用wss转发就可以了!
Mc2tr呢,通过ws监听再扔回给REST接口就可以了!
我写了一个小东西,提供现成的类与米涩的(Method)
github.com/Love-Kogasa/trc.js
然后就大功告成了
我这里直接给我写的代码了w
开始随地拉屎
var {Server, ServerEvent} = require( "socket-be" )
var {VRestServer, EventChatMsg} = require( "./index" )
var mc = new Server({ port: 7979 })
var terraria = new VRestServer(
7171, "localhost", "private-token-for-lovekogasa"
), rdt
var replyer = new EventChatMsg(({msg: JSON.stringify(rdt = {
server_name: "Minecraft",
name: "n", prefix: null,
group: "owner", rgb: "///",
type: "player_chat"
}), verify: ""}), terraria)
terraria.on( "chat", (message) => {
var msg = `<TERRARIA:${message.sender}> ${message.toString()}`
mc.broadcastMessage( msg )
console.log( msg )
})
terraria.on( "player_join", (message) => {
var msg = `<TERRARIA:${message.sender}> 进入了游戏`
mc.broadcastMessage( msg )
console.log( msg )
})
terraria.on( "player_leave", (message) => {
var msg = `<TERRARIA:${message.sender}> 退出了游戏`
mc.broadcastMessage( msg )
console.log( msg )
})
mc.on( ServerEvent.PlayerChat, e => {
if( e.sender.name == "外部" ) return;
replyer.reply( e.message, e.sender.name )
})
mc.on( ServerEvent.PlayerJoin, e => {
var join = {...rdt}
join.name = e.players.join( " " )
join.type = "player_join"
terraria._r( "/chat", join )
})
mc.on( ServerEvent.PlayerLeave, e => {
var join = {...rdt}
join.name = e.players.join( " " )
join.type = "player_join"
terraria._r( "/chat", join )
})
terraria.listen( 7373, () => {
console.log( "/connect 127.0.0.1:7979" )
})
其实还可以再写写互通命令什么的,其实是可以实现的,需要把ChattyBridge.json里的forward_command改为true,然后做一个检测+适配,或者自己手搓一种命令格式也可以
我写了一个工具字库,见TRModule/ccommand,可以轻松的创建自定义命令
另外这个时候要写具体功能,比如烟花什么的,就需要上面的token了
草,我要说什么来着()
想不起来了啊w,emmm,那就结个尾吧,这个代码我没有专门建一个仓库,然后我不知道各位感不感兴趣,如果有兴趣的话我就专门整个项目实现TR与MC交互(我猜没有())
然后是,哦,我是不是忘放图
我找找啊,亡了亡了,我没有史莱姆ang啊,我光录视频没截屏,那这里就给大家放个终端截屏吧

最后,祝大家周末快乐w
|