mirror of
https://github.com/danbulant/flying-squid
synced 2026-07-07 12:10:46 +00:00
Change serv.world to serv.worlds. Added playerPlugins/world.js and moved a lot of stuff from login.js there. Generating multiple worlds works and moving players there works as well. A few issues here and there.
This commit is contained in:
parent
24370e9d0f
commit
1917165caf
11 changed files with 278 additions and 154 deletions
38
doc/api.md
38
doc/api.md
|
|
@ -11,7 +11,7 @@
|
||||||
- [serv.entityMaxId](#serventitymaxid)
|
- [serv.entityMaxId](#serventitymaxid)
|
||||||
- [serv.players](#servplayers)
|
- [serv.players](#servplayers)
|
||||||
- [serv.uuidToPlayer](#servuuidtoplayer)
|
- [serv.uuidToPlayer](#servuuidtoplayer)
|
||||||
- [serv.world](#servworld)
|
- [serv.worlds](#servworlds)
|
||||||
- [serv.entities](#serventities)
|
- [serv.entities](#serventities)
|
||||||
- [serv.bannedPlayers](#servbannedplayers)
|
- [serv.bannedPlayers](#servbannedplayers)
|
||||||
- [serv.time](#servtime)
|
- [serv.time](#servtime)
|
||||||
|
|
@ -41,6 +41,7 @@
|
||||||
- [player.entity](#playerentity)
|
- [player.entity](#playerentity)
|
||||||
- [player.username](#playerusername)
|
- [player.username](#playerusername)
|
||||||
- [player.view](#playerview)
|
- [player.view](#playerview)
|
||||||
|
- [player.world](#playerworld)
|
||||||
- [Events](#events-1)
|
- [Events](#events-1)
|
||||||
- ["connected"](#connected)
|
- ["connected"](#connected)
|
||||||
- ["spawned"](#spawned)
|
- ["spawned"](#spawned)
|
||||||
|
|
@ -49,6 +50,7 @@
|
||||||
- ["chat" (message)](#chat-message)
|
- ["chat" (message)](#chat-message)
|
||||||
- ["kicked" (kicker,reason)](#kicked-kickerreason)
|
- ["kicked" (kicker,reason)](#kicked-kickerreason)
|
||||||
- ["positionChanged"](#positionchanged)
|
- ["positionChanged"](#positionchanged)
|
||||||
|
- ["teleport"](#teleport)
|
||||||
- [Methods](#methods-1)
|
- [Methods](#methods-1)
|
||||||
- [player.login()](#playerlogin)
|
- [player.login()](#playerlogin)
|
||||||
- [player.ban(reason)](#playerbanreason)
|
- [player.ban(reason)](#playerbanreason)
|
||||||
|
|
@ -62,6 +64,8 @@
|
||||||
- [player.setGameMode(gameMode)](#playersetgamemodegamemode)
|
- [player.setGameMode(gameMode)](#playersetgamemodegamemode)
|
||||||
- [player.handleCommand(command)](#playerhandlecommandcommand)
|
- [player.handleCommand(command)](#playerhandlecommandcommand)
|
||||||
- [player.updateHealth(health)](#playerupdatehealthhealth)
|
- [player.updateHealth(health)](#playerupdatehealthhealth)
|
||||||
|
- [player.sendPosition(position, opt)](#playersendpositionposition-opt)
|
||||||
|
- [player.changeWorld(worldNumber, opt)](#playerchangeworldworldnumber-opt)
|
||||||
- [Low level properties](#low-level-properties)
|
- [Low level properties](#low-level-properties)
|
||||||
- [player._client](#player_client)
|
- [player._client](#player_client)
|
||||||
- [Low level methods](#low-level-methods)
|
- [Low level methods](#low-level-methods)
|
||||||
|
|
@ -98,9 +102,9 @@ Array of connected players
|
||||||
|
|
||||||
Object uuid to players
|
Object uuid to players
|
||||||
|
|
||||||
#### serv.world
|
#### serv.worlds
|
||||||
|
|
||||||
The map
|
Array of all worlds. By default, 0 is Overworld, 1 is Nether, and 2 is the End, however any plugin may push more worlds (`serv.worlds.push(new World(...))`) and the player can be sent there with `player.changeWorld(worldNumber, opt)`.
|
||||||
|
|
||||||
#### serv.entities
|
#### serv.entities
|
||||||
|
|
||||||
|
|
@ -224,6 +228,10 @@ The username of the player
|
||||||
|
|
||||||
The view size of the player, for example 8 for 16x16
|
The view size of the player, for example 8 for 16x16
|
||||||
|
|
||||||
|
#### player.world
|
||||||
|
|
||||||
|
Which world the player is in. Get it by using `serv.worlds[player.world]`.
|
||||||
|
|
||||||
### Events
|
### Events
|
||||||
|
|
||||||
#### "connected"
|
#### "connected"
|
||||||
|
|
@ -252,7 +260,11 @@ Fires when the player says `message`.
|
||||||
|
|
||||||
#### "positionChanged"
|
#### "positionChanged"
|
||||||
|
|
||||||
fires when the position changed
|
fires when the position changes in small amounts (walking, running, or flying)
|
||||||
|
|
||||||
|
#### "teleport"
|
||||||
|
|
||||||
|
fires when the position changes in larger amounts (player's position set by `player.sendPosition()`)
|
||||||
|
|
||||||
### Methods
|
### Methods
|
||||||
|
|
||||||
|
|
@ -309,6 +321,24 @@ handle `command`
|
||||||
|
|
||||||
update the player health.
|
update the player health.
|
||||||
|
|
||||||
|
#### player.sendPosition(position, opt)
|
||||||
|
|
||||||
|
Teleport the player to any `position` in the same world. Use `player.changeWorld` to teleport to any world. Options:
|
||||||
|
|
||||||
|
- yaw: Set the yaw, default is the current yaw of the player
|
||||||
|
- pitch: Set the pitch, default is the current pitch of the player
|
||||||
|
|
||||||
|
#### player.changeWorld(worldNumber, opt)
|
||||||
|
|
||||||
|
Change which world the player is in (Overworld, Nether, End, or any other world added to `serv.worlds`). Options:
|
||||||
|
|
||||||
|
- gamemode: Gamemode of the world (Default is player gamemode)
|
||||||
|
- difficulty: Difficulty of world. Default is 0 (easiest)
|
||||||
|
- dimension: Dimension of world. 0 is Overworld, -1 is Nether, 1 is End (Default is 0)
|
||||||
|
- position: Position player spawns, default is their default spawn point
|
||||||
|
- yaw: Yaw in which they spawn, default is 0
|
||||||
|
- pitch: Pitch in which they spawn, default is 0
|
||||||
|
|
||||||
### Low level properties
|
### Low level properties
|
||||||
|
|
||||||
#### player._client
|
#### player._client
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,13 @@ module.exports=inject;
|
||||||
|
|
||||||
function inject(serv,player)
|
function inject(serv,player)
|
||||||
{
|
{
|
||||||
function changeBlock(position,blockType)
|
async function changeBlock(position,blockType)
|
||||||
{
|
{
|
||||||
player.getOthers().forEach(function(player) {
|
player.getOthers().forEach(function(p) {
|
||||||
player.sendBlock(position, blockType);
|
if (p.world != player.world) return;
|
||||||
|
p.sendBlock(position, blockType);
|
||||||
});
|
});
|
||||||
return serv.world.setBlockType(position,blockType);
|
return await player.world.setBlockType(position,blockType);
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendBlock(position, blockType) { // Call from serv.setBlock unless you want "local" fake blocks
|
function sendBlock(position, blockType) { // Call from serv.setBlock unless you want "local" fake blocks
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@ function inject(serv, player)
|
||||||
var referencePosition=new vec3(packet.location.x,packet.location.y,packet.location.z);
|
var referencePosition=new vec3(packet.location.x,packet.location.y,packet.location.z);
|
||||||
if (player.entity.crouching) return;
|
if (player.entity.crouching) return;
|
||||||
try {
|
try {
|
||||||
var id = await serv.world.getBlockType(referencePosition);
|
var id = await player.world.getBlockType(referencePosition);
|
||||||
var blockAbove = await serv.world.getBlockType(referencePosition.clone().add(new vec3(0, 1, 0)));
|
var blockAbove = await player.world.getBlockType(referencePosition.clone().add(new vec3(0, 1, 0)));
|
||||||
|
|
||||||
if (id == 54) {
|
if (id == 54) {
|
||||||
if (blockAbove) {
|
if (blockAbove) {
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ function inject(serv,player)
|
||||||
{
|
{
|
||||||
player._client.on("block_dig",function(packet){
|
player._client.on("block_dig",function(packet){
|
||||||
var pos=new Vec3(packet.location);
|
var pos=new Vec3(packet.location);
|
||||||
serv.world.getBlock(pos)
|
player.world.getBlock(pos)
|
||||||
.then(block => {
|
.then(block => {
|
||||||
currentlyDugBlock=block;
|
currentlyDugBlock=block;
|
||||||
if(currentlyDugBlock.type==0) return;
|
if(currentlyDugBlock.type==0) return;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
var Entity=require("prismarine-entity");
|
var Entity=require("prismarine-entity");
|
||||||
var spiralloop = require('spiralloop');
|
|
||||||
var Vec3=require("vec3");
|
var Vec3=require("vec3");
|
||||||
|
|
||||||
module.exports=inject;
|
module.exports=inject;
|
||||||
|
|
@ -15,6 +14,7 @@ function inject(serv,player)
|
||||||
player.entity.health = 20;
|
player.entity.health = 20;
|
||||||
player.entity.food = 20;
|
player.entity.food = 20;
|
||||||
player.view=8;
|
player.view=8;
|
||||||
|
player.world=serv.overworld;
|
||||||
player.username=player._client.username;
|
player.username=player._client.username;
|
||||||
serv.players.push(player);
|
serv.players.push(player);
|
||||||
serv.uuidToPlayer[player._client.uuid] = player;
|
serv.uuidToPlayer[player._client.uuid] = player;
|
||||||
|
|
@ -40,61 +40,16 @@ function inject(serv,player)
|
||||||
player.entity.position=toFixedPosition(player.spawnPoint);
|
player.entity.position=toFixedPosition(player.spawnPoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
function spiral(arr)
|
|
||||||
{
|
|
||||||
var t=[];
|
|
||||||
spiralloop(arr,function(x,z){
|
|
||||||
t.push([x,z]);
|
|
||||||
});
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function sendChunk(chunkX,chunkZ,column)
|
|
||||||
{
|
|
||||||
player._client.write('map_chunk', {
|
|
||||||
x: chunkX,
|
|
||||||
z: chunkZ,
|
|
||||||
groundUp: true,
|
|
||||||
bitMap: 0xffff,
|
|
||||||
chunkData: column.dump()
|
|
||||||
});
|
|
||||||
return Promise.resolve();
|
|
||||||
}
|
|
||||||
|
|
||||||
function sendChunksAroundPlayer(view)
|
|
||||||
{
|
|
||||||
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);
|
|
||||||
return spiral([view*2,view*2])
|
|
||||||
.map(t => ({
|
|
||||||
chunkX:playerChunkX+t[0]-view,
|
|
||||||
chunkZ:playerChunkZ+t[1]-view
|
|
||||||
}))
|
|
||||||
.filter(({chunkX,chunkZ}) => {
|
|
||||||
var key=chunkX+","+chunkZ;
|
|
||||||
var loaded=player.loadedChunks[key];
|
|
||||||
if(!loaded) player.loadedChunks[key]=1;
|
|
||||||
return !loaded;
|
|
||||||
})
|
|
||||||
.reduce((acc,{chunkX,chunkZ})=>
|
|
||||||
acc
|
|
||||||
//.then(() => sleep(100))
|
|
||||||
.then(() => serv.world.getColumn(chunkX,chunkZ))
|
|
||||||
.then((column) => sendChunk(chunkX,chunkZ,column))
|
|
||||||
,Promise.resolve());
|
|
||||||
}
|
|
||||||
|
|
||||||
function sendMap()
|
function sendMap()
|
||||||
{
|
{
|
||||||
return sendChunksAroundPlayer(3);
|
return player.sendNearbyChunks(3)
|
||||||
|
.catch((err) => setTimeout(function() { throw err; }), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendRestMap()
|
function sendRestMap()
|
||||||
{
|
{
|
||||||
player.sendingChunks=true;
|
player.sendingChunks=true;
|
||||||
sendChunksAroundPlayer(player.view)
|
player.sendNearbyChunks(player.view)
|
||||||
.then(() => player.sendingChunks=false)
|
.then(() => player.sendingChunks=false)
|
||||||
.catch((err)=> setTimeout(function(){throw err;},0));
|
.catch((err)=> setTimeout(function(){throw err;},0));
|
||||||
|
|
||||||
|
|
@ -102,20 +57,19 @@ function inject(serv,player)
|
||||||
if(!player.sendingChunks && player.entity.position.distanceTo(player.lastPositionChunkUpdated)>16*32)
|
if(!player.sendingChunks && player.entity.position.distanceTo(player.lastPositionChunkUpdated)>16*32)
|
||||||
{
|
{
|
||||||
player.sendingChunks=true;
|
player.sendingChunks=true;
|
||||||
sendChunksAroundPlayer(player.view)
|
player.sendNearbyChunks(player.view)
|
||||||
.then(() => player.sendingChunks=false)
|
.then(() => player.sendingChunks=false)
|
||||||
.catch((err)=> setTimeout(function(){throw err;},0));
|
.catch((err)=> setTimeout(function(){throw err;},0));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
player.on("teleport", function() {
|
||||||
|
player.sendingChunks=true;
|
||||||
|
player.sendNearbyChunks(player.view)
|
||||||
|
.then(() => player.sendingChunks=false)
|
||||||
|
.catch((err)=> setTimeout(function(){throw err;},0));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function sleep(ms = 0) {
|
|
||||||
return new Promise(r => setTimeout(r, ms));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function sendSpawnPosition()
|
function sendSpawnPosition()
|
||||||
{
|
{
|
||||||
console.log("setting spawn at "+player.spawnPoint);
|
console.log("setting spawn at "+player.spawnPoint);
|
||||||
|
|
@ -124,21 +78,6 @@ function inject(serv,player)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendInitialPosition()
|
|
||||||
{
|
|
||||||
player.entity.position=toFixedPosition(player.spawnPoint);
|
|
||||||
player.entity.yaw=0;
|
|
||||||
player.entity.pitch=0;
|
|
||||||
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,
|
|
||||||
flags: 0x00
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateTime()
|
function updateTime()
|
||||||
{
|
{
|
||||||
player._client.write('update_time', {
|
player._client.write('update_time', {
|
||||||
|
|
@ -182,41 +121,6 @@ function inject(serv,player)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function spawnOthers()
|
|
||||||
{
|
|
||||||
player.getOthers().forEach(function (otherPlayer) {
|
|
||||||
player._client.write('named_entity_spawn', {
|
|
||||||
entityId: otherPlayer.entity.id,
|
|
||||||
playerUUID: otherPlayer._client.uuid,
|
|
||||||
x: otherPlayer.entity.position.x,
|
|
||||||
y: otherPlayer.entity.position.y,
|
|
||||||
z: otherPlayer.entity.position.z,
|
|
||||||
yaw: otherPlayer.entity.yaw,
|
|
||||||
pitch: otherPlayer.entity.pitch,
|
|
||||||
currentItem: 0,
|
|
||||||
metadata: otherPlayer.entity.metadata
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function spawn()
|
|
||||||
{
|
|
||||||
player._writeOthers('named_entity_spawn',{
|
|
||||||
entityId: player.entity.id,
|
|
||||||
playerUUID: player._client.uuid,
|
|
||||||
x: player.entity.position.x,
|
|
||||||
y: player.entity.position.y,
|
|
||||||
z: player.entity.position.z,
|
|
||||||
yaw: player.entity.yaw,
|
|
||||||
pitch: player.entity.pitch,
|
|
||||||
currentItem: 0,
|
|
||||||
metadata: player.entity.metadata
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function announceJoin()
|
function announceJoin()
|
||||||
{
|
{
|
||||||
serv.broadcast(player.username + ' joined the game.', "yellow");
|
serv.broadcast(player.username + ' joined the game.', "yellow");
|
||||||
|
|
@ -238,7 +142,6 @@ function inject(serv,player)
|
||||||
sendLogin();
|
sendLogin();
|
||||||
await sendMap();
|
await sendMap();
|
||||||
sendSpawnPosition();
|
sendSpawnPosition();
|
||||||
sendInitialPosition();
|
|
||||||
player.updateHealth(player.entity.health);
|
player.updateHealth(player.entity.health);
|
||||||
|
|
||||||
player.emit("spawned");
|
player.emit("spawned");
|
||||||
|
|
@ -246,9 +149,8 @@ function inject(serv,player)
|
||||||
updateTime();
|
updateTime();
|
||||||
setGameMode(player.gameMode);
|
setGameMode(player.gameMode);
|
||||||
fillTabList();
|
fillTabList();
|
||||||
spawnOthers();
|
|
||||||
spawn();
|
|
||||||
|
|
||||||
|
player.spawn();
|
||||||
announceJoin();
|
announceJoin();
|
||||||
|
|
||||||
setTimeout(sendRestMap,100);
|
setTimeout(sendRestMap,100);
|
||||||
|
|
@ -256,6 +158,4 @@ function inject(serv,player)
|
||||||
|
|
||||||
player.setGameMode=setGameMode;
|
player.setGameMode=setGameMode;
|
||||||
player.login=login;
|
player.login=login;
|
||||||
player.sendInitialPosition=sendInitialPosition;
|
|
||||||
player.spawn=spawn;
|
|
||||||
}
|
}
|
||||||
|
|
@ -82,4 +82,24 @@ function inject(serv,player)
|
||||||
player.entity.onGround = onGround;
|
player.entity.onGround = onGround;
|
||||||
player.emit("positionChanged");
|
player.emit("positionChanged");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setPosition(pos, opt) {
|
||||||
|
opt = opt || {};
|
||||||
|
if (pos) player.entity.position = toFixedPosition(pos);
|
||||||
|
if (typeof opt.yaw != 'undefined') player.entity.yaw=opt.yaw;
|
||||||
|
if (typeof opt.pitch != 'undefined') player.entity.pitch=opt.pitch;
|
||||||
|
|
||||||
|
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,
|
||||||
|
flags: 0x00
|
||||||
|
});
|
||||||
|
player.spawnForOthers();
|
||||||
|
player.getNearbyPlayers();
|
||||||
|
player.emit('teleport');
|
||||||
|
}
|
||||||
|
player.setPosition = setPosition;
|
||||||
}
|
}
|
||||||
124
src/lib/playerPlugins/world.js
Normal file
124
src/lib/playerPlugins/world.js
Normal file
|
|
@ -0,0 +1,124 @@
|
||||||
|
var vec3=require("vec3");
|
||||||
|
var spiralloop = require('spiralloop');
|
||||||
|
|
||||||
|
module.exports = inject;
|
||||||
|
|
||||||
|
function inject(serv, player) {
|
||||||
|
function spawn() {
|
||||||
|
player.setPosition(player.spawnPoint, { yaw: 0, pitch: 0, exact: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
function spawnForOthers() {
|
||||||
|
player._writeOthers('named_entity_spawn',{ // _writeOthersWithinDistance?
|
||||||
|
entityId: player.entity.id,
|
||||||
|
playerUUID: player._client.uuid,
|
||||||
|
x: player.entity.position.x,
|
||||||
|
y: player.entity.position.y,
|
||||||
|
z: player.entity.position.z,
|
||||||
|
yaw: player.entity.yaw,
|
||||||
|
pitch: player.entity.pitch,
|
||||||
|
currentItem: 0,
|
||||||
|
metadata: player.entity.metadata
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNearbyPlayers() {
|
||||||
|
player.getOthers().forEach(function (otherPlayer) {
|
||||||
|
if (otherPlayer.world != player.world) return; // Also check distance from player?
|
||||||
|
player._client.write('named_entity_spawn', {
|
||||||
|
entityId: otherPlayer.entity.id,
|
||||||
|
playerUUID: otherPlayer._client.uuid,
|
||||||
|
x: otherPlayer.entity.position.x,
|
||||||
|
y: otherPlayer.entity.position.y,
|
||||||
|
z: otherPlayer.entity.position.z,
|
||||||
|
yaw: otherPlayer.entity.yaw,
|
||||||
|
pitch: otherPlayer.entity.pitch,
|
||||||
|
currentItem: 0,
|
||||||
|
metadata: otherPlayer.entity.metadata
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendChunk(chunkX,chunkZ,column)
|
||||||
|
{
|
||||||
|
player._client.write('map_chunk', {
|
||||||
|
x: chunkX,
|
||||||
|
z: chunkZ,
|
||||||
|
groundUp: true,
|
||||||
|
bitMap: 0xffff,
|
||||||
|
chunkData: column.dump()
|
||||||
|
});
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
function spiral(arr)
|
||||||
|
{
|
||||||
|
var t=[];
|
||||||
|
spiralloop(arr,function(x,z){
|
||||||
|
t.push([x,z]);
|
||||||
|
});
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendNearbyChunks(view, world)
|
||||||
|
{
|
||||||
|
world = world || player.world;
|
||||||
|
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);
|
||||||
|
|
||||||
|
return spiral([view*2,view*2])
|
||||||
|
.map(t => ({
|
||||||
|
chunkX:playerChunkX+t[0]-view,
|
||||||
|
chunkZ:playerChunkZ+t[1]-view
|
||||||
|
}))
|
||||||
|
.filter(({chunkX,chunkZ}) => {
|
||||||
|
var key=chunkX+","+chunkZ;
|
||||||
|
var loaded=player.loadedChunks[key];
|
||||||
|
if(!loaded) player.loadedChunks[key]=1;
|
||||||
|
return !loaded;
|
||||||
|
})
|
||||||
|
.reduce((acc,{chunkX,chunkZ})=>
|
||||||
|
acc
|
||||||
|
//.then(() => sleep(100))
|
||||||
|
.then(() => world.getColumn(chunkX,chunkZ))
|
||||||
|
.then((column) => player.sendChunk(chunkX,chunkZ,column))
|
||||||
|
,Promise.resolve());
|
||||||
|
}
|
||||||
|
|
||||||
|
function sleep(ms = 0) {
|
||||||
|
return new Promise(r => setTimeout(r, ms));
|
||||||
|
}
|
||||||
|
|
||||||
|
function changeWorld(world, opt) {
|
||||||
|
|
||||||
|
opt = opt || {};
|
||||||
|
player.world = world;
|
||||||
|
player.loadedChunks={};
|
||||||
|
if (typeof opt.gamemode != 'undefined') player.gameMode = opt.gamemode;
|
||||||
|
player._client.write("respawn",{
|
||||||
|
dimension: opt.dimension || 0,
|
||||||
|
difficulty: opt.difficulty || 0,
|
||||||
|
gamemode: opt.gamemode || player.gameMode,
|
||||||
|
levelType:'default'
|
||||||
|
});
|
||||||
|
player.emit('change_world');
|
||||||
|
player.setPosition(opt.position || player.spawnPoint, { yaw: opt.yaw || 0, pitch: opt.pitch || 0 }); // Automatically sends chunks around players
|
||||||
|
}
|
||||||
|
|
||||||
|
player.spawn = spawn;
|
||||||
|
player.spawnForOthers = spawnForOthers;
|
||||||
|
player.getNearbyPlayers = getNearbyPlayers;
|
||||||
|
player.sendNearbyChunks = sendNearbyChunks;
|
||||||
|
player.changeWorld = changeWorld;
|
||||||
|
player.sendChunk = sendChunk;
|
||||||
|
|
||||||
|
player.on('chat', function(message) {
|
||||||
|
if (message == 'world') {
|
||||||
|
player.changeWorld(serv.netherworld, {
|
||||||
|
position: new vec3(0, 60, 0),
|
||||||
|
dimension: -1
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
@ -2,22 +2,22 @@
|
||||||
module.exports = inject;
|
module.exports = inject;
|
||||||
|
|
||||||
function inject(serv, settings) {
|
function inject(serv, settings) {
|
||||||
serv.setTime = function(time) {
|
serv.setTime = function(time) {
|
||||||
serv.time = time;
|
serv.time = time;
|
||||||
serv._writeAll('update_time', {
|
serv._writeAll('update_time', {
|
||||||
age: [0, 0], // TODO
|
age: [0, 0], // TODO
|
||||||
time: [0, serv.time]
|
time: [0, serv.time]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
serv.doDaylightCycle = true;
|
serv.doDaylightCycle = true;
|
||||||
|
|
||||||
serv.time = 0;
|
serv.time = 0;
|
||||||
|
|
||||||
serv.on('tick', function(count) {
|
serv.on('tick', function(count) {
|
||||||
if (!serv.doDaylightCycle) return;
|
if (!serv.doDaylightCycle) return;
|
||||||
if (count % 20 == 0) {
|
if (count % 20 == 0) {
|
||||||
serv.setTime((serv.time + 20) % 24000); // Vanilla only does it every second
|
serv.setTime((serv.time + 20) % 24000); // Vanilla only does it every second
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -2,24 +2,24 @@
|
||||||
module.exports = inject;
|
module.exports = inject;
|
||||||
|
|
||||||
function inject(serv, settings) {
|
function inject(serv, settings) {
|
||||||
serv.setTickInterval = setTickInterval;
|
serv.setTickInterval = setTickInterval;
|
||||||
serv.stopTickInterval = stopTickInterval;
|
serv.stopTickInterval = stopTickInterval;
|
||||||
serv.tickCount = 0;
|
serv.tickCount = 0;
|
||||||
|
|
||||||
serv.setTickInterval(20);
|
serv.setTickInterval(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
function setTickInterval(ticksPerSecond) {
|
function setTickInterval(ticksPerSecond) {
|
||||||
var serv = this;
|
var serv = this;
|
||||||
serv.stopTickInterval();
|
serv.stopTickInterval();
|
||||||
|
|
||||||
serv.tickInterval = setInterval(function() {
|
serv.tickInterval = setInterval(function() {
|
||||||
serv.tickCount++;
|
serv.tickCount++;
|
||||||
serv.emit('tick', serv.tickCount);
|
serv.emit('tick', serv.tickCount);
|
||||||
}, 1000/ticksPerSecond);
|
}, 1000/ticksPerSecond);
|
||||||
}
|
}
|
||||||
|
|
||||||
function stopTickInterval() {
|
function stopTickInterval() {
|
||||||
if (this.tickInterval) clearInterval(serv.tickInterval);
|
if (this.tickInterval) clearInterval(serv.tickInterval);
|
||||||
this.tickInterval = null;
|
this.tickInterval = null;
|
||||||
}
|
}
|
||||||
|
|
@ -7,14 +7,32 @@ var generations={
|
||||||
'grass_field':require("../worldGenerations/grass_field"),
|
'grass_field':require("../worldGenerations/grass_field"),
|
||||||
'diamond_square':require("../worldGenerations/diamond_square"),
|
'diamond_square':require("../worldGenerations/diamond_square"),
|
||||||
'superflat':require("../worldGenerations/superflat"),
|
'superflat':require("../worldGenerations/superflat"),
|
||||||
'all_the_blocks':require("../worldGenerations/all_the_blocks")
|
'all_the_blocks':require("../worldGenerations/all_the_blocks"),
|
||||||
|
'nether':require("../worldGenerations/nether")
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = inject;
|
module.exports = inject;
|
||||||
|
|
||||||
function inject(serv,{regionFolder,generation={"name":"diamond_square","options":{"worldHeight":80}}}={}) {
|
function inject(serv,{generation={"name":"diamond_square","options":{"worldHeight":80}}}={}) {
|
||||||
generation.options.seed=generation.options.seed || Math.random()*Math.pow(2, 32);
|
generation.options.seed=generation.options.seed || Math.random()*Math.pow(2, 32);
|
||||||
serv.emit("seed",generation.options.seed);
|
serv.emit("seed",generation.options.seed);
|
||||||
serv.world = new World(generations[generation.name](generation.options),regionFolder);
|
serv.overworld = new World(generations[generation.name](generation.options));
|
||||||
serv._worldSync=new WorldSync(serv.world);
|
serv.netherworld = new World(generations["nether"]({}));
|
||||||
|
//serv.endworld = new World(generations["end"]({}));
|
||||||
|
|
||||||
|
//serv._worldSync=new WorldSync(serv.worlds[0]);
|
||||||
|
|
||||||
|
function pregenWorld(world, size=10) {
|
||||||
|
for (var x = -size; x < size; x++) {
|
||||||
|
for (var z = -size; z < size; z++) {
|
||||||
|
world.getColumn(x, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
serv.pregenWorld = pregenWorld;
|
||||||
|
|
||||||
|
serv.pregenWorld(serv.overworld);
|
||||||
|
serv.log('Pre-Generated Overworld');
|
||||||
|
serv.pregenWorld(serv.netherworld);
|
||||||
|
serv.log('Pre-Generated Nether');
|
||||||
}
|
}
|
||||||
31
src/lib/worldGenerations/nether.js
Normal file
31
src/lib/worldGenerations/nether.js
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
var Chunk = require('prismarine-chunk')(require("../version"));
|
||||||
|
var Vec3 = require('vec3');
|
||||||
|
|
||||||
|
function generation({level=50}={}) {
|
||||||
|
function generateChunk(chunkX, chunkZ) {
|
||||||
|
var chunk=new Chunk();
|
||||||
|
for (var x = 0; x < 16; x++) {
|
||||||
|
for (var z = 0; z < 16; z++) {
|
||||||
|
var bedrockheighttop = 1 + Math.round(Math.random()*3)
|
||||||
|
var bedrockheightbottom = 1 + Math.round(Math.random()*3)
|
||||||
|
for (var y = 0; y < 128; y++) { // Nether only goes up to 128
|
||||||
|
let block;
|
||||||
|
let data;
|
||||||
|
|
||||||
|
if (y < bedrockheightbottom) block = 7;
|
||||||
|
else if (y < 50) block = 87;
|
||||||
|
else if (y > 127 - bedrockheighttop) block = 7;
|
||||||
|
|
||||||
|
var pos = new Vec3(x, y, z);
|
||||||
|
if (block) chunk.setBlockType(pos, block);
|
||||||
|
if (data) chunk.setBlockData(pos, data);
|
||||||
|
// Don't need to set light data in nether
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return chunk;
|
||||||
|
}
|
||||||
|
return generateChunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = generation;
|
||||||
Loading…
Reference in a new issue