diff --git a/package.json b/package.json index 4cf77bd..2b7a958 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "minecraft-protocol": "^1.5.2", "mkdirp": "^0.5.1", "moment": "^2.10.6", - "node-uuid": "^1.4.3", "prismarine-chunk": "^1.9.0", "prismarine-entity": "^0.2.0", "prismarine-item": "^1.0.1", @@ -44,6 +43,7 @@ "request": "^2.83.0", "request-promise": "^4.1.0", "spiralloop": "^1.0.2", + "uuid-1345": "^0.99.6", "vec3": "^0.1.3" }, "repository": { diff --git a/src/lib/features.json b/src/lib/features.json index 8dbc55e..838e6e8 100644 --- a/src/lib/features.json +++ b/src/lib/features.json @@ -28,5 +28,15 @@ "name": "fixedPointDelta128", "description": "Delta of position are represented with fixed point numbers times 128", "versions": ["1.12"] + }, + { + "name": "entityCamelCase", + "description": "entity names are in camel case", + "versions": ["1.8"] + }, + { + "name": "entitySnakeCase", + "description": "entity name are in snake case", + "versions": ["1.12"] } ] \ No newline at end of file diff --git a/src/lib/plugins/entities.js b/src/lib/plugins/entities.js index 430a785..1fd1fdf 100644 --- a/src/lib/plugins/entities.js +++ b/src/lib/plugins/entities.js @@ -13,7 +13,7 @@ module.exports.server = function (serv) { const players = serv.getNearby({ world: entity.world, position: entity.position, - radius: 1.5 * 32 // Seems good for now + radius: 1.5 // Seems good for now }) if (players.length) { players[0].collect(entity) diff --git a/src/lib/plugins/login.js b/src/lib/plugins/login.js index 820f4e6..c68e282 100644 --- a/src/lib/plugins/login.js +++ b/src/lib/plugins/login.js @@ -38,8 +38,9 @@ module.exports.player = function (player, serv, settings) { player.crouching = false // Needs added in prismarine-entity later player.op = settings['everybody-op'] // REMOVE THIS WHEN OUT OF TESTING player.username = player._client.username + player.uuid = player._client.uuid serv.players.push(player) - serv.uuidToPlayer[player._client.uuid] = player + serv.uuidToPlayer[player.uuid] = player player.heldItemSlot = 0 player.loadedChunks = {} } @@ -80,7 +81,7 @@ module.exports.player = function (player, serv, settings) { serv._writeAll('player_info', { action: 1, data: [{ - UUID: player._client.uuid, + UUID: player.uuid, gamemode: player.gameMode }] }) @@ -91,7 +92,7 @@ module.exports.player = function (player, serv, settings) { player._writeOthers('player_info', { action: 0, data: [{ - UUID: player._client.uuid, + UUID: player.uuid, name: player.username, properties: player.profileProperties, gamemode: player.gameMode, @@ -102,7 +103,7 @@ module.exports.player = function (player, serv, settings) { player._client.write('player_info', { action: 0, data: serv.players.map((otherPlayer) => ({ - UUID: otherPlayer._client.uuid, + UUID: otherPlayer.uuid, name: otherPlayer.username, properties: otherPlayer.profileProperties, gamemode: otherPlayer.gameMode, @@ -112,7 +113,7 @@ module.exports.player = function (player, serv, settings) { setInterval(() => player._client.write('player_info', { action: 2, data: serv.players.map(otherPlayer => ({ - UUID: otherPlayer._client.uuid, + UUID: otherPlayer.uuid, ping: otherPlayer._client.latency })) }), 5000) @@ -135,12 +136,12 @@ module.exports.player = function (player, serv, settings) { } player.login = async () => { - if (serv.uuidToPlayer[player._client.uuid]) { + if (serv.uuidToPlayer[player.uuid]) { player.kick('You are already connected') return } - if (serv.bannedPlayers[player._client.uuid]) { - player.kick(serv.bannedPlayers[player._client.uuid].reason) + if (serv.bannedPlayers[player.uuid]) { + player.kick(serv.bannedPlayers[player.uuid].reason) return } if (serv.bannedIPs[player._client.socket.remoteAddress]) { diff --git a/src/lib/plugins/logout.js b/src/lib/plugins/logout.js index 605010e..0977415 100644 --- a/src/lib/plugins/logout.js +++ b/src/lib/plugins/logout.js @@ -22,7 +22,7 @@ module.exports.player = function (player, serv) { player._writeOthers('player_info', { action: 4, data: [{ - UUID: player._client.uuid + UUID: player.uuid }] }) player.nearbyPlayers().forEach(otherPlayer => otherPlayer.despawnEntities([player])) @@ -32,7 +32,7 @@ module.exports.player = function (player, serv) { if (index > -1) { serv.players.splice(index, 1) } - delete serv.uuidToPlayer[player._client.uuid] + delete serv.uuidToPlayer[player.uuid] } }) } diff --git a/src/lib/plugins/moderation.js b/src/lib/plugins/moderation.js index 4e8633b..46cb785 100644 --- a/src/lib/plugins/moderation.js +++ b/src/lib/plugins/moderation.js @@ -1,6 +1,6 @@ const moment = require('moment') const rp = require('request-promise') -const nodeUuid = require('node-uuid') +const UUID = require('uuid-1345') module.exports.server = function (serv) { serv.ban = (uuid, reason) => { @@ -20,7 +20,7 @@ module.exports.server = function (serv) { } function uuidInParts (plainUUID) { - return nodeUuid.unparse(nodeUuid.parse(plainUUID)) + return UUID.stringify(UUID.parse(plainUUID)) } serv.getUUIDFromUsername = username => { @@ -65,7 +65,7 @@ module.exports.player = function (player, serv) { player.ban = reason => { reason = reason || 'You were banned!' player.kick(reason) - const uuid = player._client.uuid + const uuid = player.uuid serv.ban(uuid, reason) } player.banIP = reason => { @@ -74,7 +74,7 @@ module.exports.player = function (player, serv) { serv.banIP(player._client.socket.remoteAddress) } - player.pardon = () => serv.pardon(player._client.uuid) + player.pardon = () => serv.pardon(player.uuid) player.commands.add({ base: 'kick', diff --git a/src/lib/plugins/physics.js b/src/lib/plugins/physics.js index ecee264..d19e2e8 100644 --- a/src/lib/plugins/physics.js +++ b/src/lib/plugins/physics.js @@ -60,9 +60,9 @@ module.exports.entity = function (entity, serv, {version}) { function getMoveAmount (dir, block, entity, delta, sizeSigned) { if (block) { entity.velocity[dir] = 0 - return Math.floor(-1 * (entity.position[dir] + sizeSigned / 2 - floorInDirection(entity.position[dir], -sizeSigned))) + return -1 * (entity.position[dir] + sizeSigned / 2 - entity.position[dir]) } else { - return Math.floor(entity.velocity[dir] * delta) + return entity.velocity[dir] * delta } } @@ -70,10 +70,6 @@ module.exports.entity = function (entity, serv, {version}) { return new Vec3(Math.sign(vec.x), Math.sign(vec.y), Math.sign(vec.z)) } - function floorInDirection (a, b) { - return b < 0 ? Math.floor(a) : Math.ceil(a) - } - function addGravity (entity, dir, delta) { if (entity.velocity[dir] < entity.terminalvelocity[dir] && entity.velocity[dir] > -entity.terminalvelocity[dir]) { entity.velocity[dir] = clamp(-entity.terminalvelocity[dir], entity.velocity[dir] + entity.gravity[dir] * delta, entity.terminalvelocity[dir]) diff --git a/src/lib/plugins/spawn.js b/src/lib/plugins/spawn.js index 874450f..46e49df 100644 --- a/src/lib/plugins/spawn.js +++ b/src/lib/plugins/spawn.js @@ -3,7 +3,7 @@ const path = require('path') const requireIndex = require('../requireindex') const plugins = requireIndex(path.join(__dirname, '..', 'plugins')) const UserError = require('flying-squid').UserError - +const UUID = require('uuid-1345') const Vec3 = require('vec3').Vec3 module.exports.server = function (serv, options) { @@ -30,6 +30,7 @@ module.exports.server = function (serv, options) { serv.spawnObject = (type, world, position, {pitch = 0, yaw = 0, velocity = new Vec3(0, 0, 0), data = 1, itemId, itemDamage = 0, pickupTime = undefined, deathTime = undefined}) => { const object = serv.initEntity('object', type, world, position) + object.uuid = UUID.v4() object.name = objectsById[type].name object.data = data object.velocity = velocity @@ -49,6 +50,7 @@ module.exports.server = function (serv, options) { serv.spawnMob = (type, world, position, {pitch = 0, yaw = 0, headPitch = 0, velocity = new Vec3(0, 0, 0), metadata = []} = {}) => { const mob = serv.initEntity('mob', type, world, position) + mob.uuid = UUID.v4() mob.name = mobsById[type].name mob.velocity = velocity mob.pitch = pitch @@ -250,7 +252,7 @@ module.exports.entity = function (entity, serv) { if (entity.type === 'player') { return { entityId: entity.id, - playerUUID: entity._client.uuid, + playerUUID: entity.uuid, x: entityPosition.x, y: entityPosition.y, z: entityPosition.z, @@ -262,6 +264,7 @@ module.exports.entity = function (entity, serv) { } else if (entity.type === 'object') { return { entityId: entity.id, + objectUUID: entity.uuid, type: entity.entityType, x: entityPosition.x, y: entityPosition.y, @@ -278,6 +281,7 @@ module.exports.entity = function (entity, serv) { } else if (entity.type === 'mob') { return { entityId: entity.id, + entityUUID: entity.uuid, type: entity.entityType, x: entityPosition.x, y: entityPosition.y, diff --git a/test/mineflayer.test.js b/test/mineflayer.test.js index a92684c..3b5a059 100644 --- a/test/mineflayer.test.js +++ b/test/mineflayer.test.js @@ -28,6 +28,7 @@ squid.supportedVersions.forEach((supportedVersion, i) => { let bot let bot2 let serv + let entityName async function onGround (bot) { await new Promise((resolve) => { @@ -81,6 +82,11 @@ squid.supportedVersions.forEach((supportedVersion, i) => { options['version'] = version.minecraftVersion serv = squid.createMCServer(options) + if (serv.supportFeature('entityCamelCase')) { + entityName = 'EnderDragon' + } else { + entityName = 'ender_dragon' + } await once(serv, 'listening') const port = serv._server.socketServer.address().port @@ -159,7 +165,7 @@ squid.supportedVersions.forEach((supportedVersion, i) => { }) describe('commands', () => { - jest.setTimeout(10 * 1000) + jest.setTimeout(20 * 1000) test('has an help command', async () => { await waitLoginMessage(bot) bot.chat('/help') @@ -177,7 +183,7 @@ squid.supportedVersions.forEach((supportedVersion, i) => { function waitDragon () { return new Promise((resolve) => { const listener = (entity) => { - if (entity.name === 'EnderDragon') { + if (entity.name === entityName) { bot.removeListener('entitySpawn', listener) resolve() } @@ -187,15 +193,15 @@ squid.supportedVersions.forEach((supportedVersion, i) => { } test('can use /summon', async () => { - bot.chat('/summon EnderDragon') + bot.chat('/summon ' + entityName) await waitDragon() }) test('can use /kill', async () => { - bot.chat('/summon EnderDragon') + bot.chat('/summon ' + entityName) await waitDragon() - bot.chat('/kill @e[type=EnderDragon]') + bot.chat('/kill @e[type=' + entityName + ']') const entity = await once(bot, 'entityDead') - expect(entity.name).toEqual('EnderDragon') + expect(entity.name).toEqual(entityName) }) describe('can use /tp', () => { test('can tp myself', async () => {