From 180799e0455a545bcf138b376df64b3c512ca3aa Mon Sep 17 00:00:00 2001 From: DemiPixel Date: Thu, 19 Nov 2015 17:14:39 -0800 Subject: [PATCH 1/5] Attempting to convert Player into Entity --- src/lib/behavior.js | 16 +++++++++++++ src/lib/entity.js | 14 +++++++++++ src/lib/player.js | 13 ---------- src/lib/plugins/animations.js | 23 ++++++------------ src/lib/plugins/communication.js | 9 ++++--- src/lib/plugins/digging.js | 1 + src/lib/plugins/entities.js | 21 +++++++---------- src/lib/plugins/inventory.js | 12 +++++----- src/lib/plugins/login.js | 31 ++++++++++-------------- src/lib/plugins/logout.js | 4 ++-- src/lib/plugins/modpe.js | 6 ++--- src/lib/plugins/particle.js | 2 +- src/lib/plugins/pvp.js | 16 ++++++------- src/lib/plugins/respawn.js | 4 ++-- src/lib/plugins/sound.js | 6 ++--- src/lib/plugins/updatePositions.js | 38 +++++++++++++++--------------- src/lib/plugins/world.js | 12 +++++----- 17 files changed, 114 insertions(+), 114 deletions(-) create mode 100644 src/lib/behavior.js create mode 100644 src/lib/entity.js delete mode 100644 src/lib/player.js 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(); From a02983c2bd861bfeac59658d46a1c134de0033fe Mon Sep 17 00:00:00 2001 From: DemiPixel Date: Thu, 19 Nov 2015 17:46:54 -0800 Subject: [PATCH 2/5] Fixing metadata, almost done! --- src/lib/plugins/animations.js | 8 ++++---- src/lib/plugins/digging.js | 1 - src/lib/plugins/entities.js | 8 ++++++-- src/lib/plugins/world.js | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/lib/plugins/animations.js b/src/lib/plugins/animations.js index 35bc7a5..19f3a3f 100644 --- a/src/lib/plugins/animations.js +++ b/src/lib/plugins/animations.js @@ -8,14 +8,14 @@ module.exports.player=function(player) player._client.on("entity_action", ({actionId} = {}) => { if(actionId == 3) { - player.setMetadata([{"key":0,"type":0,"value": 0x08}]); + player.setAndUpdateMetadata([{"key":0,"type":0,"value": 0x08}]); } else if(actionId == 4) { - player.setMetadata([{"key":0,"type":0,"value": 0x00}]); + player.setAndUpdateMetadata([{"key":0,"type":0,"value": 0x00}]); } else if(actionId == 0) { - player.setMetadata([{"key":0,"type":0,"value": 0x02}]); + player.setAndUpdateMetadata([{"key":0,"type":0,"value": 0x02}]); player.crouching = true; } else if(actionId == 1) { - player.setMetadata([{"key":0,"type":0,"value": 0x00}]); + player.setAndUpdateMetadata([{"key":0,"type":0,"value": 0x00}]); player.crouching = false; } }); diff --git a/src/lib/plugins/digging.js b/src/lib/plugins/digging.js index 5e541e0..04dbce8 100644 --- a/src/lib/plugins/digging.js +++ b/src/lib/plugins/digging.js @@ -93,7 +93,6 @@ 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 4cda009..c3ec18c 100644 --- a/src/lib/plugins/entities.js +++ b/src/lib/plugins/entities.js @@ -162,14 +162,18 @@ module.exports.entity=function(entity,serv){ entity.updateAndSpawn(); }); - entity.setMetadata = (data) => { + entity.sendMetadata = (data) => { serv._writeNearby('entity_metadata', { entityId: entity.id, metadata: data }, entity); - entity.metadata = data; }; + entity.setAndUpdateMetadata = (data) => { + entity.metadata = data; + entity.sendMetadata(data); + } + entity.destroy = () => { serv.destroyEntity(entity); }; diff --git a/src/lib/plugins/world.js b/src/lib/plugins/world.js index 3338c8c..041ec82 100644 --- a/src/lib/plugins/world.js +++ b/src/lib/plugins/world.js @@ -56,7 +56,7 @@ module.exports.player=function(player,serv) { player.spawnEntity = entity => { player._client.write(entity.spawnPacketName, entity.getSpawnPacket()); if (typeof entity.itemId != 'undefined') { - entity.setMetadata([{ + entity.sendMetadata([{ "key": 10, "type": 5, "value": { From 2a376626e6db6902c3480c0e0a132d5aeb23a857 Mon Sep 17 00:00:00 2001 From: DemiPixel Date: Thu, 19 Nov 2015 21:16:27 -0800 Subject: [PATCH 3/5] Fix stuff, add a small implementation of picking up blocks (doesn't go into inventory) --- src/lib/plugins/blocks.js | 4 +--- src/lib/plugins/chest.js | 2 +- src/lib/plugins/digging.js | 2 +- src/lib/plugins/entities.js | 34 +++++++++++++++++++++++++++------- src/lib/plugins/sound.js | 6 ++++++ 5 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/lib/plugins/blocks.js b/src/lib/plugins/blocks.js index 3095ca7..fc14ab2 100644 --- a/src/lib/plugins/blocks.js +++ b/src/lib/plugins/blocks.js @@ -1,5 +1,3 @@ -var Vec3 = require("vec3").Vec3; - module.exports.player=function(player,serv) { player.changeBlock=async (position,blockType,blockData) => @@ -33,7 +31,7 @@ module.exports.player=function(player,serv) action(params) { var res = params.map((num, i) => { // parseInt paramaters if (num.indexOf('~') == 0) { - return (player.entity.position[['', 'x', 'y', 'z'][i]] >> 5) + parseInt(num.slice(1) || 0); + return (player.position[['', 'x', 'y', 'z'][i]] >> 5) + parseInt(num.slice(1) || 0); } else { return parseInt(num); // return parseInt>>5 if position, not id } diff --git a/src/lib/plugins/chest.js b/src/lib/plugins/chest.js index 62d7de4..7b475fd 100644 --- a/src/lib/plugins/chest.js +++ b/src/lib/plugins/chest.js @@ -4,7 +4,7 @@ module.exports.player=function(player) { player._client.on('block_place', async ({location} = {}) => { var referencePosition=new Vec3(location.x,location.y,location.z); - if (player.entity.crouching) return; + if (player.crouching) return; try { var id = await player.world.getBlockType(referencePosition); var blockAbove = await player.world.getBlockType(referencePosition.clone().add(new Vec3(0, 1, 0))); diff --git a/src/lib/plugins/digging.js b/src/lib/plugins/digging.js index 04dbce8..52c9103 100644 --- a/src/lib/plugins/digging.js +++ b/src/lib/plugins/digging.js @@ -76,7 +76,7 @@ module.exports.player=function(player,serv) player.changeBlock(location,0,0); // Drop block serv.spawnObject(2, player.world, location.offset(0.5, 0.5, 0.5), { - velocity: Vec3(Math.random()*4 - 2, Math.random()*2 + 2, Math.random()*4 - 2), + velocity: new Vec3(Math.random()*4 - 2, Math.random()*2 + 2, Math.random()*4 - 2), itemId: currentlyDugBlock.type, itemDamage: currentlyDugBlock.metadata }); diff --git a/src/lib/plugins/entities.js b/src/lib/plugins/entities.js index c3ec18c..4280a39 100644 --- a/src/lib/plugins/entities.js +++ b/src/lib/plugins/entities.js @@ -34,6 +34,7 @@ module.exports.server=function(serv,options) { object.friction = (new Vec3(10*32, 0, 10*32)).floored(); object.size = new Vec3(0.25*32, 0.25*32, 0.25*32); // Hardcoded, will be dependent on type! object.deathTime = 60*1000; // 60 seconds + object.pickupTime = 200; object.itemId = itemId; object.itemDamage = itemDamage; @@ -72,6 +73,16 @@ module.exports.server=function(serv,options) { if (entity.deathTime && Date.now() - entity.bornTime >= entity.deathTime) { entity.destroy(); return; + } else if (entity.pickupTime && Date.now() - entity.bornTime >= entity.pickupTime) { + var players = serv.getNearby({ + world: entity.world, + position: entity.position, + radius: 1.5*32 // Seems good for now + }); + if (players.length) { + players[0].collect(entity); + entity.destroy(); + } } if (!entity.velocity || !entity.size) return; var oldPosAndOnGround = await entity.calculatePhysics(delta); @@ -241,19 +252,28 @@ module.exports.entity=function(entity,serv){ if (entity.type == 'player') { entity.despawnEntities(entitiesToRemove); entitiesToAdd.forEach(entity.spawnEntity); - entity.lastPositionPlayersUpdated=entity.position.clone(); - } else { - entity.lastPositionPlayersUpdated=entity.position.clone(); } + entity.lastPositionPlayersUpdated=entity.position.clone(); - var playersToAdd = entitiesToAdd.filter(e => e.type == 'player').map(e => e.player); - var playersToRemove = entitiesToRemove.filter(e => e.type == 'player').map(e => e.player); + var playersToAdd = entitiesToAdd.filter(e => e.type == 'player'); + var playersToRemove = entitiesToRemove.filter(e => e.type == 'player'); playersToRemove.forEach(p => p.despawnEntities([entity])); - playersToRemove.forEach(p => p.entity.nearbyEntities=p.entity.getNearby()); + playersToRemove.forEach(p => p.nearbyEntities=p.getNearby()); playersToAdd.forEach(p => p.spawnEntity(entity)); - playersToAdd.forEach(p => p.entity.nearbyEntities=p.entity.getNearby()); + playersToAdd.forEach(p => p.nearbyEntities=p.getNearby()); entity.nearbyEntities=updatedEntities; }; + + entity.collect = (collectEntity) => { + if (entity.type != 'player') serv.emit('error', 'Non-player entity (ttype ' + entity.type + ') cannot collect another entity'); + else { + serv._writeNearby('collect', { + collectedEntityId: collectEntity.id, + collectorEntityId: entity.id + }, collectEntity); + entity.playSoundAtSelf('random.pop'); + } + } }; \ No newline at end of file diff --git a/src/lib/plugins/sound.js b/src/lib/plugins/sound.js index 649de64..a194532 100644 --- a/src/lib/plugins/sound.js +++ b/src/lib/plugins/sound.js @@ -102,4 +102,10 @@ module.exports.player=function(player,serv) { serv.playSound(sound_name, player.world, player.position.scaled(1/32), {volume: volume,pitch: pitch}); } }); +}; + +module.exports.entity=function(entity,serv) { + entity.playSoundAtSelf = (sound, opt={}) => { + serv.playSound(sound, entity.world, entity.position.scaled(1/32), opt); + } }; \ No newline at end of file From 8215985f7f8829b92e5667656d210aeb42fba351 Mon Sep 17 00:00:00 2001 From: DemiPixel Date: Fri, 20 Nov 2015 13:52:19 -0800 Subject: [PATCH 4/5] Fix a lot of communication things, added lots of semicolons, started on entity knockback (hehe, doesn't work well, needs improvement) --- src/lib/plugins/blocks.js | 2 ++ src/lib/plugins/communication.js | 38 ++++++++++++---------- src/lib/plugins/digging.js | 2 +- src/lib/plugins/entities.js | 51 +++++++++++++++++++----------- src/lib/plugins/login.js | 2 +- src/lib/plugins/modpe.js | 2 +- src/lib/plugins/particle.js | 34 ++++++++++---------- src/lib/plugins/physics.js | 2 +- src/lib/plugins/pvp.js | 36 ++++++++++++++------- src/lib/plugins/updatePositions.js | 6 ++-- src/lib/plugins/world.js | 2 +- 11 files changed, 106 insertions(+), 71 deletions(-) diff --git a/src/lib/plugins/blocks.js b/src/lib/plugins/blocks.js index fc14ab2..909673c 100644 --- a/src/lib/plugins/blocks.js +++ b/src/lib/plugins/blocks.js @@ -1,3 +1,5 @@ +var Vec3 = require("vec3").Vec3; + module.exports.player=function(player,serv) { player.changeBlock=async (position,blockType,blockData) => diff --git a/src/lib/plugins/communication.js b/src/lib/plugins/communication.js index f4d0490..6018302 100644 --- a/src/lib/plugins/communication.js +++ b/src/lib/plugins/communication.js @@ -22,24 +22,30 @@ module.exports.server=function(serv) ); }; -module.exports.player=function(player,serv) +module.exports.entity=function(entity,serv) { - player._writeOthers= (packetName, packetFields) => - player - .getOthers() - .forEach((otherPlayer) => otherPlayer._client.write(packetName, packetFields)); + + entity.getNearby = () => serv + .getNearbyEntities({ + world: entity.world, + position: entity.position, + radius: entity.viewDistance*32 + }) + .filter((e) => e != entity); - player._writeOthersNearby = (packetName, packetFields) => - serv._writeArray(packetName, packetFields, player.nearbyPlayers()); + entity.getOtherPlayers = () => serv.players.filter((p) => p != entity); - player.getOthers = () => serv.players.filter((otherPlayer) => otherPlayer != player); + entity.getOthers = () => serv.entities.filter((e) => e != entity); - player.getNearbyPlayers = (radius=player.viewDistance*32) => serv.getNearby({ - world: player.world, - position: player.position, - radius: radius - }); + entity.getNearbyPlayers = (radius=entity.viewDistance*32) => entity.getNearby() + .filter((e) => e.type == 'player'); - player.nearbyPlayers = (radius=player.viewDistance*32) => player.nearbyEntities - .filter(e => e.type == 'player'); -}; \ No newline at end of file + entity.nearbyPlayers = (radius=entity.viewDistance*32) => entity.nearbyEntities + .filter(e => e.type == 'player') + + entity._writeOthers = (packetName, packetFields) => + serv._writeArray(packetName, packetFields, entity.getOtherPlayers()); + + entity._writeOthersNearby = (packetName, packetFields) => + serv._writeArray(packetName, packetFields, entity.getNearbyPlayers()); +} \ No newline at end of file diff --git a/src/lib/plugins/digging.js b/src/lib/plugins/digging.js index 52c9103..54a252c 100644 --- a/src/lib/plugins/digging.js +++ b/src/lib/plugins/digging.js @@ -1,4 +1,4 @@ -var Vec3 = require("vec3").Vec3 +var Vec3 = require("vec3").Vec3; module.exports.player=function(player,serv) { diff --git a/src/lib/plugins/entities.js b/src/lib/plugins/entities.js index 4280a39..c5fb3fb 100644 --- a/src/lib/plugins/entities.js +++ b/src/lib/plugins/entities.js @@ -31,7 +31,7 @@ module.exports.server=function(serv,options) { object.yaw = yaw; object.gravity = new Vec3(0, -20*32, 0); object.terminalvelocity = new Vec3(27*32, 27*32, 27*32); - object.friction = (new Vec3(10*32, 0, 10*32)).floored(); + object.friction = new Vec3(15*32, 0, 15*32); object.size = new Vec3(0.25*32, 0.25*32, 0.25*32); // Hardcoded, will be dependent on type! object.deathTime = 60*1000; // 60 seconds object.pickupTime = 200; @@ -49,7 +49,7 @@ module.exports.server=function(serv,options) { mob.yaw = yaw; mob.gravity = new Vec3(0, -20*32, 0); mob.terminalvelocity = new Vec3(27*32, 27*32, 27*32); - mob.friction = new Vec3(10*32, 0, 10*32); + mob.friction = new Vec3(15*32, 0, 15*32); mob.size = new Vec3(0.75, 1.75, 0.75); mob.metadata = metadata; @@ -57,11 +57,8 @@ module.exports.server=function(serv,options) { }; serv.destroyEntity = entity => { - serv._writeNearby('entity_destroy', { + entity._writeOthersNearby('entity_destroy', { entityIds: [entity.id] - }, { - position: entity.position, - world: entity.world }); delete serv.entities[entity.id]; }; @@ -174,10 +171,10 @@ module.exports.entity=function(entity,serv){ }); entity.sendMetadata = (data) => { - serv._writeNearby('entity_metadata', { + entity._writeOthersNearby('entity_metadata', { entityId: entity.id, metadata: data - }, entity); + }); }; entity.setAndUpdateMetadata = (data) => { @@ -237,14 +234,6 @@ module.exports.entity=function(entity,serv){ } }; - entity.getNearby = () => serv - .getNearbyEntities({ - world: entity.world, - position: entity.position, - radius: entity.viewDistance*32 - }) - .filter((e) => e != entity); - entity.updateAndSpawn = () => { var updatedEntities=entity.getNearby(); var entitiesToAdd=updatedEntities.filter(e => entity.nearbyEntities.indexOf(e)==-1); @@ -269,11 +258,37 @@ module.exports.entity=function(entity,serv){ entity.collect = (collectEntity) => { if (entity.type != 'player') serv.emit('error', 'Non-player entity (ttype ' + entity.type + ') cannot collect another entity'); else { - serv._writeNearby('collect', { + collectEntity._writeOthersNearby('collect', { collectedEntityId: collectEntity.id, collectorEntityId: entity.id - }, collectEntity); + }); entity.playSoundAtSelf('random.pop'); } } + + entity.sendVelocity = (vel, maxVel) => { + var velocity = vel.scaled(32).floored(); // Make fixed point + var maxVelocity = maxVel.scaled(32).floored(); + var scaledVelocity = velocity.scaled(8000/32/20).floored(); // from fixed-position/second to unit => 1/8000 blocks per tick + entity._writeOthersNearby('entity_velocity', { + entityId: entity.id, + velocityX: scaledVelocity.x, + velocityY: scaledVelocity.y, + velocityZ: scaledVelocity.z + }); + if (entity.type != 'player') { + if (maxVelocity) entity.velocity = addVelocityWithMax(entity.velocity, velocity, maxVelocity); + else entity.velocity.add(velocity); + } + } + function addVelocityWithMax(current, newVel, max) { + var x, y, z; + if (current.x > max.x || current.x < -max.x) x = current.x; + else x = Math.max(-max.x, Math.min(max.x, current.x + newVel.x)); + if (current.y > max.y || current.y < -max.y) y = current.y; + else y = Math.max(-max.y, Math.min(max.y, current.y + newVel.y)); + if (current.z > max.z || current.z < -max.z) z = current.z; + else z = Math.max(-max.z, Math.min(max.z, current.z + newVel.z)); + return new Vec3(x, y, z); + } }; \ No newline at end of file diff --git a/src/lib/plugins/login.js b/src/lib/plugins/login.js index f4c704d..5807181 100644 --- a/src/lib/plugins/login.js +++ b/src/lib/plugins/login.js @@ -1,5 +1,5 @@ var Entity=require("prismarine-entity"); -var Vec3 = require("vec3").Vec3 +var Vec3 = require("vec3").Vec3; var path = require('path'); var requireIndex = require('requireindex'); diff --git a/src/lib/plugins/modpe.js b/src/lib/plugins/modpe.js index d5b3c09..ad70f83 100644 --- a/src/lib/plugins/modpe.js +++ b/src/lib/plugins/modpe.js @@ -1,4 +1,4 @@ -var Vec3 = require("vec3").Vec3 +var Vec3 = require("vec3").Vec3; var dir = require("node-dir"); var fs = require("fs"); diff --git a/src/lib/plugins/particle.js b/src/lib/plugins/particle.js index 5710246..77ae7ed 100644 --- a/src/lib/plugins/particle.js +++ b/src/lib/plugins/particle.js @@ -1,29 +1,27 @@ -var Vec3 = require("vec3").Vec3 +var Vec3 = require("vec3").Vec3; module.exports.server=function(serv) { - serv.emitParticle = (particle, world, position, {whitelist,blacklist=[],radius=32*32,longDistance,size,count}={}) => { + serv.emitParticle = (particle, world, position, {whitelist,blacklist=[],radius=32*32,longDistance=true,size,count=1}={}) => { var players = (typeof whitelist != 'undefined' ? (typeof whitelist == 'array' ? whitelist : [whitelist]) : serv.getNearby({ world: world, position: position.scaled(32).floored(), radius: radius // 32 blocks, fixed position })); if (!size) size = new Vec3(1.0, 1.0, 1.0); - players.filter(player => blacklist.indexOf(player) == -1) - .forEach(player => { - player._client.write('world_particles', { - particleId: particle, - longDistance: longDistance || true, - x: position.x, - y: position.y, - z: position.z, - offsetX: size.x, - offsetY: size.y, - offsetZ: size.z, - particleData: 1.0, - particles: count || 1, - data: [] - }); - }); + + serv._writeNearby('world_particles', { + particleId: particle, + longDistance: longDistance, + x: position.x, + y: position.y, + z: position.z, + offsetX: size.x, + offsetY: size.y, + offsetZ: size.z, + particleData: 1.0, + particles: count, + data: [] + }, players.filter(p => blacklist.indexOf(p) == -1)); } }; diff --git a/src/lib/plugins/physics.js b/src/lib/plugins/physics.js index a7662ff..792f7b1 100644 --- a/src/lib/plugins/physics.js +++ b/src/lib/plugins/physics.js @@ -1,5 +1,5 @@ var blocks=require("minecraft-data")(require("../version")).blocks; -var Vec3 = require("vec3").Vec3 +var Vec3 = require("vec3").Vec3; module.exports.entity=function(entity){ entity.calculatePhysics = async (delta) => { diff --git a/src/lib/plugins/pvp.js b/src/lib/plugins/pvp.js index 60e9309..18262e8 100644 --- a/src/lib/plugins/pvp.js +++ b/src/lib/plugins/pvp.js @@ -1,3 +1,5 @@ +var Vec3 = require("vec3").Vec3; + module.exports.player=function(player,serv) { @@ -12,20 +14,23 @@ module.exports.player=function(player,serv) function attackEntity(entityId) { - if (!serv.entities[entityId]) return; // ????? - var attackedPlayer = serv.entities[entityId].player; - if(!attackedPlayer || attackedPlayer.gameMode!=0) return; - attackedPlayer.updateHealth(attackedplayer.health - 1); - serv.playSound('game.player.hurt', player.world, attackedplayer.position.scaled(1/32)); + var attackedEntity = serv.entities[entityId]; + if(!attackedEntity || (attackedEntity.gameMode != 0 && attackedEntity.type == 'player')) return; - if(attackedplayer.health==0) - attackedPlayer._writeOthers('entity_status',{ - entityId:attackedplayer.id, + attackedEntity.updateHealth(attackedEntity.health - 1); + serv.playSound('game.player.hurt', player.world, attackedEntity.position.scaled(1/32)); + + var attackVelocity = attackedEntity.position.minus(player.position).plus(new Vec3(0, 0.5, 0)).scaled(5/32); + attackedEntity.sendVelocity(attackVelocity, new Vec3(4, 4, 4)); + + if(attackedEntity.health<=0) + attackedEntity._writeOthers('entity_status',{ + entityId:attackedEntity.id, entityStatus:3 }); else - attackedPlayer._writeOthers('animation',{ - entityId:attackedplayer.id, + attackedEntity._writeOthers('animation',{ + entityId:attackedEntity.id, animation:1 }); } @@ -35,4 +40,13 @@ module.exports.player=function(player,serv) attackEntity(target); }); -}; \ No newline at end of file +}; + +module.exports.entity=function(entity,serv) +{ + if (entity.type != 'player') { + entity.updateHealth = (health) => { + entity.health = health; + } + } +} \ No newline at end of file diff --git a/src/lib/plugins/updatePositions.js b/src/lib/plugins/updatePositions.js index d440e4b..749f41d 100644 --- a/src/lib/plugins/updatePositions.js +++ b/src/lib/plugins/updatePositions.js @@ -1,4 +1,4 @@ -var Vec3 = require("vec3").Vec3 +var Vec3 = require("vec3").Vec3; Vec3.prototype.toFixedPosition=function() { return this.scaled(32).floored(); @@ -90,7 +90,7 @@ module.exports.entity=function(entity,serv){ var diff = entity.position.minus(oldPos); if(diff.abs().x>127 || diff.abs().y>127 || diff.abs().z>127) - serv._writeNearby('entity_teleport', { + entity._writeOthersNearby('entity_teleport', { entityId: entity.id, x: entity.position.x, y: entity.position.y, @@ -98,7 +98,7 @@ module.exports.entity=function(entity,serv){ yaw: entity.yaw, pitch: entity.pitch, onGround: onGround - }, entity); + }); else if (diff.distanceTo(new Vec3(0, 0, 0)) != 0) serv._writeNearby('rel_entity_move', { entityId: entity.id, dX: diff.x, diff --git a/src/lib/plugins/world.js b/src/lib/plugins/world.js index 041ec82..9fab63d 100644 --- a/src/lib/plugins/world.js +++ b/src/lib/plugins/world.js @@ -1,4 +1,4 @@ -var Vec3 = require("vec3").Vec3 +var Vec3 = require("vec3").Vec3; var spiralloop = require('spiralloop'); var Chunk = require('prismarine-chunk')(require("../version")); From 4d7f000b61def60bc095293cb19e1ad8a39a961c Mon Sep 17 00:00:00 2001 From: DemiPixel Date: Fri, 20 Nov 2015 14:38:05 -0800 Subject: [PATCH 5/5] Last fixes --- src/lib/plugins/entities.js | 1 + src/lib/plugins/logout.js | 2 +- src/lib/plugins/particle.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib/plugins/entities.js b/src/lib/plugins/entities.js index c5fb3fb..2384f28 100644 --- a/src/lib/plugins/entities.js +++ b/src/lib/plugins/entities.js @@ -51,6 +51,7 @@ module.exports.server=function(serv,options) { mob.terminalvelocity = new Vec3(27*32, 27*32, 27*32); mob.friction = new Vec3(15*32, 0, 15*32); mob.size = new Vec3(0.75, 1.75, 0.75); + mob.health = 20; mob.metadata = metadata; mob.updateAndSpawn(); diff --git a/src/lib/plugins/logout.js b/src/lib/plugins/logout.js index 7e618a0..97fe191 100644 --- a/src/lib/plugins/logout.js +++ b/src/lib/plugins/logout.js @@ -2,7 +2,7 @@ module.exports.player=function(player,serv) { player.despawnPlayers = despawnedPlayers => { player._client.write('entity_destroy', { - 'entityIds': despawnedPlayers.map(p => p.entity.id) + 'entityIds': despawnedPlayers.map(p => p.id) }); }; diff --git a/src/lib/plugins/particle.js b/src/lib/plugins/particle.js index 77ae7ed..53216c7 100644 --- a/src/lib/plugins/particle.js +++ b/src/lib/plugins/particle.js @@ -9,7 +9,7 @@ module.exports.server=function(serv) { })); if (!size) size = new Vec3(1.0, 1.0, 1.0); - serv._writeNearby('world_particles', { + serv._writeArray('world_particles', { particleId: particle, longDistance: longDistance, x: position.x,