129 lines
3.2 KiB
JavaScript
129 lines
3.2 KiB
JavaScript
const assert = require('assert')
|
|
const { ProtoDef } = require('protodef')
|
|
|
|
module.exports = inject
|
|
|
|
function inject (bot) {
|
|
function setCommandBlock (pos, command, options = {}) {
|
|
assert.strictEqual(bot.player.gamemode, 1, new Error('The bot has to be in creative mode to open the command block window'))
|
|
assert.notStrictEqual(pos, null)
|
|
assert.notStrictEqual(command, null)
|
|
assert.strictEqual(bot.blockAt(pos).name.includes('command_block'), true, new Error("The block isn't a command block"))
|
|
|
|
// Default values when a command block is placed in vanilla minecraft
|
|
options.trackOutput = options.trackOutput ?? false
|
|
options.conditional = options.conditional ?? false
|
|
options.alwaysActive = options.alwaysActive ?? false
|
|
options.mode = options.mode ?? 2 // Possible values: 0: SEQUENCE, 1: AUTO and 2: REDSTONE
|
|
|
|
let flags = 0
|
|
flags |= +options.trackOutput << 0 // 0x01
|
|
flags |= +options.conditional << 1 // 0x02
|
|
flags |= +options.alwaysActive << 2 // 0x04
|
|
|
|
if (bot.supportFeature('usesAdvCmd') || bot.supportFeature('usesAdvCdm')) {
|
|
const pluginChannelName = bot.supportFeature('usesAdvCdm') ? 'MC|AdvCdm' : 'MC|AdvCmd'
|
|
|
|
const proto = new ProtoDef()
|
|
|
|
proto.addType('string', [
|
|
'pstring',
|
|
{
|
|
countType: 'varint'
|
|
}])
|
|
|
|
proto.addType(pluginChannelName, [
|
|
'container',
|
|
[
|
|
{
|
|
name: 'mode',
|
|
type: 'i8'
|
|
},
|
|
{
|
|
name: 'x',
|
|
type: [
|
|
'switch',
|
|
{
|
|
compareTo: 'mode',
|
|
fields: {
|
|
0: 'i32'
|
|
},
|
|
default: 'void'
|
|
}
|
|
]
|
|
},
|
|
{
|
|
name: 'y',
|
|
type: [
|
|
'switch',
|
|
{
|
|
compareTo: 'mode',
|
|
fields: {
|
|
0: 'i32'
|
|
},
|
|
default: 'void'
|
|
}
|
|
]
|
|
},
|
|
{
|
|
name: 'z',
|
|
type: [
|
|
'switch',
|
|
{
|
|
compareTo: 'mode',
|
|
fields: {
|
|
0: 'i32'
|
|
},
|
|
default: 'void'
|
|
}
|
|
]
|
|
},
|
|
{
|
|
name: 'eid',
|
|
type: [
|
|
'switch',
|
|
{
|
|
compareTo: 'mode',
|
|
fields: {
|
|
1: 'i32'
|
|
},
|
|
default: 'void'
|
|
}
|
|
]
|
|
},
|
|
{
|
|
name: 'command',
|
|
type: 'string'
|
|
},
|
|
{
|
|
name: 'trackOutput',
|
|
type: 'bool'
|
|
}
|
|
]
|
|
])
|
|
|
|
const buffer = proto.createPacketBuffer(pluginChannelName, {
|
|
mode: 0,
|
|
x: pos.x,
|
|
y: pos.y,
|
|
z: pos.z,
|
|
command,
|
|
trackOutput: options.trackOutput
|
|
})
|
|
bot._client.write('custom_payload', {
|
|
channel: pluginChannelName,
|
|
data: buffer
|
|
})
|
|
} else {
|
|
bot._client.write('update_command_block', {
|
|
location: pos,
|
|
command,
|
|
mode: options.mode,
|
|
flags
|
|
})
|
|
}
|
|
}
|
|
|
|
bot.setCommandBlock = setCommandBlock
|
|
}
|