diff --git a/src/lib/behavior.js b/src/lib/behavior.js new file mode 100644 index 0000000..73ee180 --- /dev/null +++ b/src/lib/behavior.js @@ -0,0 +1,16 @@ +module.exports = (obj) => { + return (eventName, data, func, opt) => { + var hiddenCancelled = false; + var cancelled = false; + var cancel = (hidden) => { // Hidden shouldn't be used often but it's not hard to implement so meh + if (hidden) hiddenCancelled = true; + else cancelled = true; + } + obj.emit(eventName + '_cancel', data, cancel); + obj.emit(eventName, data, cancelled); + + if (!hiddenCancelled && !cancelled) func(data); + + obj.emit(eventName + '_done', data, cancelled); + } +} \ No newline at end of file diff --git a/src/lib/entity.js b/src/lib/entity.js new file mode 100644 index 0000000..239d754 --- /dev/null +++ b/src/lib/entity.js @@ -0,0 +1,14 @@ +var EventEmitter = require('events').EventEmitter; +var PrismarineEntity = require("prismarine-entity"); +var util = require('util'); +util.inherits(PrismarineEntity, EventEmitter); + +class Entity extends PrismarineEntity +{ + constructor(id) { + super(id); + EventEmitter.call(this); + } +} + +module.exports = Entity; \ No newline at end of file diff --git a/src/lib/player.js b/src/lib/player.js deleted file mode 100644 index 6196015..0000000 --- a/src/lib/player.js +++ /dev/null @@ -1,13 +0,0 @@ -var EventEmitter = require('events').EventEmitter; - - -class Player extends EventEmitter -{ - constructor() { - super(); - this._client=null; - this.entity=null; - } -} - -module.exports = Player; \ No newline at end of file diff --git a/src/lib/plugins/animations.js b/src/lib/plugins/animations.js index 8b3999a..35bc7a5 100644 --- a/src/lib/plugins/animations.js +++ b/src/lib/plugins/animations.js @@ -2,30 +2,21 @@ module.exports.player=function(player) { player._client.on("arm_animation", () => player._writeOthersNearby("animation", { - entityId: player.entity.id, + entityId: player.id, animation: 0 })); - function setMetadata(metadata) - { - player.entity.metadata = metadata; - player._writeOthersNearby("entity_metadata", { - entityId: player.entity.id, - metadata: player.entity.metadata - }); - } - player._client.on("entity_action", ({actionId} = {}) => { if(actionId == 3) { - setMetadata([{"key":0,"type":0,"value": 0x08}]); + player.setMetadata([{"key":0,"type":0,"value": 0x08}]); } else if(actionId == 4) { - setMetadata([{"key":0,"type":0,"value": 0x00}]); + player.setMetadata([{"key":0,"type":0,"value": 0x00}]); } else if(actionId == 0) { - setMetadata([{"key":0,"type":0,"value": 0x02}]); - player.entity.crouching = true; + player.setMetadata([{"key":0,"type":0,"value": 0x02}]); + player.crouching = true; } else if(actionId == 1) { - setMetadata([{"key":0,"type":0,"value": 0x00}]); - player.entity.crouching = false; + player.setMetadata([{"key":0,"type":0,"value": 0x00}]); + player.crouching = false; } }); }; \ No newline at end of file diff --git a/src/lib/plugins/communication.js b/src/lib/plugins/communication.js index 2d7060e..f4d0490 100644 --- a/src/lib/plugins/communication.js +++ b/src/lib/plugins/communication.js @@ -11,7 +11,7 @@ module.exports.server=function(serv) serv.getNearby= ({world,position,radius=8*16*32}) => serv.players.filter( player => player.world == world && - player.entity.position.distanceTo(position) <= radius + player.position.distanceTo(position) <= radius ); serv.getNearbyEntities= ({world,position,radius=8*16*32}) => Object.keys(serv.entities) @@ -34,13 +34,12 @@ module.exports.player=function(player,serv) player.getOthers = () => serv.players.filter((otherPlayer) => otherPlayer != player); - player.getNearbyPlayers = (radius=player.entity.viewDistance*32) => serv.getNearby({ + player.getNearbyPlayers = (radius=player.viewDistance*32) => serv.getNearby({ world: player.world, position: player.position, radius: radius }); - player.nearbyPlayers = (radius=player.entity.viewDistance*32) => player.entity.nearbyEntities - .filter(e => e.type == 'player') - .map(e => e.player); + player.nearbyPlayers = (radius=player.viewDistance*32) => player.nearbyEntities + .filter(e => e.type == 'player'); }; \ No newline at end of file diff --git a/src/lib/plugins/digging.js b/src/lib/plugins/digging.js index 04dbce8..5e541e0 100644 --- a/src/lib/plugins/digging.js +++ b/src/lib/plugins/digging.js @@ -93,6 +93,7 @@ module.exports.player=function(player,serv) function creativeDigging(location) { + console.log('creative'); return player.changeBlock(location,0,0); } diff --git a/src/lib/plugins/entities.js b/src/lib/plugins/entities.js index 5efc0c8..4cda009 100644 --- a/src/lib/plugins/entities.js +++ b/src/lib/plugins/entities.js @@ -1,7 +1,4 @@ -var Entity=require("prismarine-entity"); -var util = require('util'); -var EventEmitter = require('events').EventEmitter; -util.inherits(Entity, EventEmitter); +var Entity=require("../entity"); var Vec3 = require("vec3").Vec3; var entitiesByName=require("minecraft-data")(require("../version")).entitiesByName; @@ -14,7 +11,6 @@ module.exports.server=function(serv,options) { serv.initEntity = (type, entityType, world, position) => { serv.entityMaxId++; var entity = new Entity(serv.entityMaxId); - EventEmitter.call(entity); Object.keys(plugins) .filter(pluginName => plugins[pluginName].entity!=undefined) @@ -99,7 +95,7 @@ module.exports.player=function(player,serv){ } }, action({id}) { - serv.spawnMob(id, player.world, player.entity.position.scaled(1/32), { + serv.spawnMob(id, player.world, player.position.scaled(1/32), { velocity: Vec3((Math.random() - 0.5) * 10, Math.random()*10 + 10, (Math.random() - 0.5) * 10) }); } @@ -117,7 +113,7 @@ module.exports.player=function(player,serv){ } }, action({id}) { - serv.spawnObject(id, player.world, player.entity.position.scaled(1/32), { + serv.spawnObject(id, player.world, player.position.scaled(1/32), { velocity: Vec3((Math.random() - 0.5) * 10, Math.random()*10 + 10, (Math.random() - 0.5) * 10) }); } @@ -133,7 +129,7 @@ module.exports.player=function(player,serv){ player.chat("No entity named "+name); return; } - serv.spawnMob(entity.id, player.world, player.entity.position.scaled(1/32), { + serv.spawnMob(entity.id, player.world, player.position.scaled(1/32), { velocity: Vec3((Math.random() - 0.5) * 10, Math.random()*10 + 10, (Math.random() - 0.5) * 10) }); } @@ -171,6 +167,7 @@ module.exports.entity=function(entity,serv){ entityId: entity.id, metadata: data }, entity); + entity.metadata = data; }; entity.destroy = () => { @@ -182,7 +179,7 @@ module.exports.entity=function(entity,serv){ if (entity.type == 'player') { return { entityId: entity.id, - playerUUID: entity.player._client.uuid, + playerUUID: entity._client.uuid, x: entity.position.x, y: entity.position.y, z: entity.position.z, @@ -238,9 +235,9 @@ module.exports.entity=function(entity,serv){ var entitiesToAdd=updatedEntities.filter(e => entity.nearbyEntities.indexOf(e)==-1); var entitiesToRemove=entity.nearbyEntities.filter(e => updatedEntities.indexOf(e)==-1); if (entity.type == 'player') { - entity.player.despawnEntities(entitiesToRemove); - entitiesToAdd.forEach(entity.player.spawnEntity); - entity.player.lastPositionPlayersUpdated=entity.position.clone(); + entity.despawnEntities(entitiesToRemove); + entitiesToAdd.forEach(entity.spawnEntity); + entity.lastPositionPlayersUpdated=entity.position.clone(); } else { entity.lastPositionPlayersUpdated=entity.position.clone(); } diff --git a/src/lib/plugins/inventory.js b/src/lib/plugins/inventory.js index 754626c..15866e7 100644 --- a/src/lib/plugins/inventory.js +++ b/src/lib/plugins/inventory.js @@ -13,7 +13,7 @@ module.exports.player=function(player) } player.heldItem = player.inventory[36+player.heldItemSlot]; player._writeOthersNearby("entity_equipment",{ - entityId:player.entity.id, + entityId:player.id, slot:0, item:player.heldItem }); @@ -23,31 +23,31 @@ module.exports.player=function(player) player.inventory[slot]=item; if (slot==36) player._writeOthersNearby("entity_equipment",{ - entityId:player.entity.id, + entityId:player.id, slot:0, item:item }); if (slot==5) player._writeOthersNearby("entity_equipment",{ - entityId:player.entity.id, + entityId:player.id, slot:4, item:item }); if (slot==6) player._writeOthersNearby("entity_equipment",{ - entityId:player.entity.id, + entityId:player.id, slot:3, item:item }); if (slot==7) player._writeOthersNearby("entity_equipment",{ - entityId:player.entity.id, + entityId:player.id, slot:2, item:item }); if (slot==8) player._writeOthersNearby("entity_equipment",{ - entityId:player.entity.id, + entityId:player.id, slot:1, item:item }); diff --git a/src/lib/plugins/login.js b/src/lib/plugins/login.js index cc85a21..f4c704d 100644 --- a/src/lib/plugins/login.js +++ b/src/lib/plugins/login.js @@ -4,7 +4,6 @@ var Vec3 = require("vec3").Vec3 var path = require('path'); var requireIndex = require('requireindex'); var plugins = requireIndex(path.join(__dirname,'..', 'plugins')); -var Player=require("../player"); var Command = require('../command'); module.exports.server=function(serv,options) @@ -13,7 +12,7 @@ module.exports.server=function(serv,options) client.on('error',error => serv.emit('clientError',client,error))); serv._server.on('login', async (client) => { - var player=new Player(); + var player = serv.initEntity('player', null, serv.overworld, new Vec3(0,0,0)); player._client=client; player.commands = new Command({}); Object.keys(plugins) @@ -34,14 +33,10 @@ module.exports.player=function(player,serv) { function addPlayer() { - player.entity=serv.initEntity('player', null, serv.overworld, new Vec3(0,0,0)); - player.entity.type = 'player'; - player.entity.player=player; - player.entity.health = 20; - player.entity.food = 20; - player.entity.crouching = false; // Needs added in prismarine-entity later - player.view=10; - player.world=serv.overworld; + player.type = 'player'; + player.health = 20; + player.food = 20; + player.crouching = false; // Needs added in prismarine-entity later player.username=player._client.username; serv.players.push(player); serv.uuidToPlayer[player._client.uuid] = player; @@ -51,8 +46,8 @@ module.exports.player=function(player,serv) function sendPlayersWhenMove() { player.on("positionChanged",() => { - if(player.entity.position.distanceTo(player.lastPositionPlayersUpdated)>2*32) - player.entity.updateAndSpawn(); + if(player.position.distanceTo(player.lastPositionPlayersUpdated)>2*32) + player.updateAndSpawn(); }); } @@ -60,7 +55,7 @@ module.exports.player=function(player,serv) { // send init data so client will start rendering world player._client.write('login', { - entityId: player.entity.id, + entityId: player.id, levelType: 'default', gameMode: player.gameMode, dimension: 0, @@ -68,13 +63,13 @@ module.exports.player=function(player,serv) reducedDebugInfo: false, maxPlayers: serv._server.maxPlayers }); - player.entity.position=player.spawnPoint.toFixedPosition(); + player.position=player.spawnPoint.toFixedPosition(); } function sendChunkWhenMove() { player.on("positionChanged", () => { - if(!player.sendingChunks && player.entity.position.distanceTo(player.lastPositionChunkUpdated)>16*32) + if(!player.sendingChunks && player.position.distanceTo(player.lastPositionChunkUpdated)>16*32) player.sendRestMap(); }); } @@ -150,7 +145,7 @@ module.exports.player=function(player,serv) player.login = async () => - { + { if (serv.uuidToPlayer[player._client.uuid]) { player._client.end("You are already connected"); return; @@ -165,12 +160,12 @@ module.exports.player=function(player,serv) await player.sendMap(); player.sendSpawnPosition(); player.sendPosition(); - player.updateHealth(player.entity.health); + player.updateHealth(player.health); updateTime(); fillTabList(); - player.entity.updateAndSpawn(); + player.updateAndSpawn(); announceJoin(); player.emit("spawned"); diff --git a/src/lib/plugins/logout.js b/src/lib/plugins/logout.js index ab8c6c2..7e618a0 100644 --- a/src/lib/plugins/logout.js +++ b/src/lib/plugins/logout.js @@ -11,7 +11,7 @@ module.exports.player=function(player,serv) }); player._client.on('end', () => { - if(player.entity) { + if(player) { serv.broadcast(player.username + ' quit the game.', "yellow"); player._writeOthers('player_info', { action: 4, @@ -20,7 +20,7 @@ module.exports.player=function(player,serv) }] }); player.nearbyPlayers().forEach(otherPlayer => otherPlayer.despawnPlayers([player])); - delete serv.entities[player.entity.id]; + delete serv.entities[player.id]; player.emit('disconnected'); var index = serv.players.indexOf(player); if (index > -1) { diff --git a/src/lib/plugins/modpe.js b/src/lib/plugins/modpe.js index 16a3691..d5b3c09 100644 --- a/src/lib/plugins/modpe.js +++ b/src/lib/plugins/modpe.js @@ -61,15 +61,15 @@ function modpeApi() { } function getPlayerX() { - return player.entity.position.x/32; + return player.position.x/32; } function getPlayerY() { - return player.entity.position.y/32; + return player.position.y/32; } function getPlayerZ() { - return player.entity.position.z/32; + return player.position.z/32; } function getPlayerEnt() { diff --git a/src/lib/plugins/particle.js b/src/lib/plugins/particle.js index b9b6982..5710246 100644 --- a/src/lib/plugins/particle.js +++ b/src/lib/plugins/particle.js @@ -47,7 +47,7 @@ module.exports.player=function(player,serv){ return; } player.chat('Emitting "' + particle + '" (count: ' + amount + ', size: ' + size.toString() + ')'); - serv.emitParticle(particle, player.world, player.entity.position.scaled(1/32), {count: amount,size: size}); + serv.emitParticle(particle, player.world, player.position.scaled(1/32), {count: amount,size: size}); } }); }; \ No newline at end of file diff --git a/src/lib/plugins/pvp.js b/src/lib/plugins/pvp.js index b49a30d..60e9309 100644 --- a/src/lib/plugins/pvp.js +++ b/src/lib/plugins/pvp.js @@ -2,11 +2,11 @@ module.exports.player=function(player,serv) { player.updateHealth = (health) => { - player.entity.health = health; + player.health = health; player._client.write('update_health', { - food: player.entity.food, + food: player.food, foodSaturation: 0.0, - health: player.entity.health + health: player.health }); }; @@ -15,17 +15,17 @@ module.exports.player=function(player,serv) if (!serv.entities[entityId]) return; // ????? var attackedPlayer = serv.entities[entityId].player; if(!attackedPlayer || attackedPlayer.gameMode!=0) return; - attackedPlayer.updateHealth(attackedPlayer.entity.health - 1); - serv.playSound('game.player.hurt', player.world, attackedPlayer.entity.position.scaled(1/32)); + attackedPlayer.updateHealth(attackedplayer.health - 1); + serv.playSound('game.player.hurt', player.world, attackedplayer.position.scaled(1/32)); - if(attackedPlayer.entity.health==0) + if(attackedplayer.health==0) attackedPlayer._writeOthers('entity_status',{ - entityId:attackedPlayer.entity.id, + entityId:attackedplayer.id, entityStatus:3 }); else attackedPlayer._writeOthers('animation',{ - entityId:attackedPlayer.entity.id, + entityId:attackedplayer.id, animation:1 }); } diff --git a/src/lib/plugins/respawn.js b/src/lib/plugins/respawn.js index f2cfecd..bacc817 100644 --- a/src/lib/plugins/respawn.js +++ b/src/lib/plugins/respawn.js @@ -10,8 +10,8 @@ module.exports.player=function(player) }); player.sendPosition(); player.updateHealth(20); - player.entity.nearbyEntities=[]; - player.entity.updateAndSpawn(); + player.nearbyEntities=[]; + player.updateAndSpawn(); } }); }; \ No newline at end of file diff --git a/src/lib/plugins/sound.js b/src/lib/plugins/sound.js index a8be48c..649de64 100644 --- a/src/lib/plugins/sound.js +++ b/src/lib/plugins/sound.js @@ -9,7 +9,7 @@ module.exports.server=function(serv) { })); players.filter(player => blacklist.indexOf(player) == -1) .forEach(player => { - var pos = (position || player.entity.position.scaled(1/32)).scaled(8).floored(); + var pos = (position || player.position.scaled(1/32)).scaled(8).floored(); player._client.write('named_sound_effect', { soundName: sound, x: pos.x, @@ -39,7 +39,7 @@ module.exports.player=function(player,serv) { }; player._client.on('block_place', ({location}={}) => { - if (player.entity.crouching) return; + if (player.crouching) return; var pos=new Vec3(location.x,location.y,location.z); player.world.getBlockType(pos).then((id) => { if (id != 25) return; @@ -99,7 +99,7 @@ module.exports.player=function(player,serv) { }, action({sound_name,volume,pitch}) { player.chat('Playing "'+sound_name+'" (volume: ' + volume + ', pitch: ' + pitch + ')'); - serv.playSound(sound_name, player.world, player.entity.position.scaled(1/32), {volume: volume,pitch: pitch}); + serv.playSound(sound_name, player.world, player.position.scaled(1/32), {volume: volume,pitch: pitch}); } }); }; \ No newline at end of file diff --git a/src/lib/plugins/updatePositions.js b/src/lib/plugins/updatePositions.js index 97cec23..d440e4b 100644 --- a/src/lib/plugins/updatePositions.js +++ b/src/lib/plugins/updatePositions.js @@ -19,18 +19,18 @@ module.exports.player=function(player) { var convYaw=conv(yaw); var convPitch=conv(pitch); - if (convYaw == player.entity.yaw && convPitch == player.entity.pitch) return; + if (convYaw == player.yaw && convPitch == player.pitch) return; player._writeOthersNearby("entity_look", { - entityId: player.entity.id, + entityId: player.id, yaw: convYaw, pitch: convPitch, onGround: onGround }); - player.entity.yaw = convYaw; - player.entity.pitch = convPitch; - player.entity.onGround = onGround; + player.yaw = convYaw; + player.pitch = convPitch; + player.onGround = onGround; player._writeOthersNearby("entity_head_rotation", { - entityId: player.entity.id, + entityId: player.id, headYaw: convYaw }); } @@ -44,23 +44,23 @@ module.exports.player=function(player) }); function sendRelativePositionChange(newPosition, onGround) { - if (player.entity.position.distanceTo(new Vec3(0, 0, 0)) != 0) { - var diff = newPosition.minus(player.entity.position); + if (player.position.distanceTo(new Vec3(0, 0, 0)) != 0) { + var diff = newPosition.minus(player.position); if(diff.abs().x>127 || diff.abs().y>127 || diff.abs().z>127) { player._writeOthersNearby('entity_teleport', { - entityId:player.entity.id, + entityId:player.id, x: newPosition.x, y: newPosition.y, z: newPosition.z, - yaw: player.entity.yaw, - pitch: player.entity.pitch, + yaw: player.yaw, + pitch: player.pitch, onGround: onGround }); } else if (diff.distanceTo(new Vec3(0, 0, 0)) != 0) { player._writeOthersNearby('rel_entity_move', { - entityId: player.entity.id, + entityId: player.id, dX: diff.x, dY: diff.y, dZ: diff.z, @@ -68,18 +68,18 @@ module.exports.player=function(player) }); } } - player.entity.position = newPosition; - player.entity.onGround = onGround; + player.position = newPosition; + player.onGround = onGround; player.emit("positionChanged"); } player.sendPosition = () => { player._client.write('position', { - x: player.entity.position.x/32, - y: player.entity.position.y/32, - z: player.entity.position.z/32, - yaw: player.entity.yaw, - pitch: player.entity.pitch, + x: player.position.x/32, + y: player.position.y/32, + z: player.position.z/32, + yaw: player.yaw, + pitch: player.pitch, flags: 0x00 }); }; diff --git a/src/lib/plugins/world.js b/src/lib/plugins/world.js index 210a76c..3338c8c 100644 --- a/src/lib/plugins/world.js +++ b/src/lib/plugins/world.js @@ -91,9 +91,9 @@ module.exports.player=function(player,serv) { player.sendNearbyChunks = (view,group) => { - player.lastPositionChunkUpdated=player.entity.position; - var playerChunkX=Math.floor(player.entity.position.x/16/32); - var playerChunkZ=Math.floor(player.entity.position.z/16/32); + player.lastPositionChunkUpdated=player.position; + var playerChunkX=Math.floor(player.position.x/16/32); + var playerChunkZ=Math.floor(player.position.z/16/32); return spiral([view*2,view*2]) .map(t => ({ @@ -145,7 +145,7 @@ module.exports.player=function(player,serv) { if(player.world == world) return Promise.resolve(); opt = opt || {}; player.world = world; - player.entity.world = world; + player.world = world; player.loadedChunks={}; if (typeof opt.gamemode != 'undefined') player.gameMode = opt.gamemode; player._client.write("respawn",{ @@ -154,9 +154,9 @@ module.exports.player=function(player,serv) { gamemode: opt.gamemode || player.gameMode, levelType:'default' }); - player.entity.position=player.spawnPoint.toFixedPosition(); + player.position=player.spawnPoint.toFixedPosition(); player.sendSpawnPosition(); - player.entity.updateAndSpawn(); + player.updateAndSpawn(); await player.sendMap();