diff --git a/lib/plugins/game.js b/lib/plugins/game.js index c992d1f74..daf9533b4 100644 --- a/lib/plugins/game.js +++ b/lib/plugins/game.js @@ -25,7 +25,12 @@ function inject (bot, options) { function handleRespawnPacketData (packet) { bot.game.levelType = packet.levelType ?? (packet.isFlat ? 'flat' : 'default') bot.game.hardcore = packet.isHardcore ?? Boolean(packet.gameMode & 0b100) - bot.game.gameMode = packet.gamemode || parseGameMode(packet.gameMode) + // Either a respawn packet or a login packet. Depending on the packet it can be "gamemode" or "gameMode" + if (bot.registry.isNewerOrEqualTo('1.20.5')) { + bot.game.gameMode = packet.gamemode || parseGameMode(packet.gameMode) + } else { + bot.game.gameMode = parseGameMode(packet.gamemode ?? packet.gameMode) + } if (bot.supportFeature('segmentedRegistryCodecData')) { // 1.20.5 if (typeof packet.dimension === 'number') { bot.game.dimension = bot.registry.dimensionsArray[packet.dimension]?.name?.replace('minecraft:', '') diff --git a/test/externalTests/gamemode.js b/test/externalTests/gamemode.js index d4cc45a04..ebf2d1487 100644 --- a/test/externalTests/gamemode.js +++ b/test/externalTests/gamemode.js @@ -1,10 +1,29 @@ // test to see if bot retains creative gamemode in bot object on death const assert = require('assert') +const { onceWithCleanup } = require('../../lib/promise_utils') -module.exports = async (bot) => { - bot.test.becomeCreative() - bot.chat(`/kill ${bot.username}`) - await new Promise((resolve, reject) => setTimeout(resolve, 5000)) - assert.strictEqual(bot.game.gameMode, 'creative', 'Failed to parse respawn packet') +module.exports = () => { + const tests = [] + + function addTest (name, f) { + tests[name] = (bot) => f(bot) + } + + addTest('change', async (bot) => { + await bot.test.becomeSurvival() + assert.strictEqual(bot.game.gameMode, 'survival', 'Wrong gamemode after switching gamemode') + await bot.test.becomeCreative() + assert.strictEqual(bot.game.gameMode, 'creative', 'Wrong gamemode after switching gamemode') + }) + + addTest('after respawn', async (bot) => { + await bot.test.becomeCreative() + bot.test.selfKill() + await onceWithCleanup(bot, 'respawn', { timeout: 5000 }) + // Respawn packets send the gamemode. If the bot is in creative mode, it should respawn in creative mode. Tested <1.20 + assert.strictEqual(bot.game.gameMode, 'creative', 'Wrong gamemode after respawn') + }) + + return tests } diff --git a/test/externalTests/plugins/testCommon.js b/test/externalTests/plugins/testCommon.js index 0309fa4bf..0b25a918e 100644 --- a/test/externalTests/plugins/testCommon.js +++ b/test/externalTests/plugins/testCommon.js @@ -25,6 +25,7 @@ function inject (bot) { bot.test.placeBlock = placeBlock bot.test.runExample = runExample bot.test.tellAndListen = tellAndListen + bot.test.selfKill = selfKill bot.test.wait = function (ms) { return new Promise((resolve) => { setTimeout(resolve, ms) }) } @@ -232,4 +233,8 @@ function inject (bot) { } return closeExample() } + + function selfKill () { + bot.chat('/kill @p') + } }