Search in sources :

Example 16 with Level

use of cn.nukkit.level.Level in project Nukkit by Nukkit.

the class Server method loadLevel.

public boolean loadLevel(String name) {
    if (Objects.equals(name.trim(), "")) {
        throw new LevelException("Invalid empty level name");
    }
    if (this.isLevelLoaded(name)) {
        return true;
    } else if (!this.isLevelGenerated(name)) {
        this.logger.notice(this.getLanguage().translateString("nukkit.level.notFound", name));
        return false;
    }
    String path;
    if (name.contains("/") || name.contains("\\")) {
        path = name;
    } else {
        path = this.getDataPath() + "worlds/" + name + "/";
    }
    Class<? extends LevelProvider> provider = LevelProviderManager.getProvider(path);
    if (provider == null) {
        this.logger.error(this.getLanguage().translateString("nukkit.level.loadError", new String[] { name, "Unknown provider" }));
        return false;
    }
    Level level;
    try {
        level = new Level(this, name, path, provider);
    } catch (Exception e) {
        this.logger.error(this.getLanguage().translateString("nukkit.level.loadError", new String[] { name, e.getMessage() }));
        this.logger.logException(e);
        return false;
    }
    this.levels.put(level.getId(), level);
    level.initLevel();
    this.getPluginManager().callEvent(new LevelLoadEvent(level));
    level.setTickRate(this.baseTickRate);
    return true;
}
Also used : LevelLoadEvent(cn.nukkit.event.level.LevelLoadEvent) Level(cn.nukkit.level.Level)

Example 17 with Level

use of cn.nukkit.level.Level in project Nukkit by Nukkit.

the class Server method tick.

private boolean tick() {
    long tickTime = System.currentTimeMillis();
    // TODO
    long sleepTime = tickTime - this.nextTick;
    if (sleepTime < -25) {
        try {
            Thread.sleep(Math.max(5, -sleepTime - 25));
        } catch (InterruptedException e) {
            Server.getInstance().getLogger().logException(e);
        }
    }
    long tickTimeNano = System.nanoTime();
    if ((tickTime - this.nextTick) < -25) {
        return false;
    }
    Timings.fullServerTickTimer.startTiming();
    ++this.tickCounter;
    Timings.connectionTimer.startTiming();
    this.network.processInterfaces();
    if (this.rcon != null) {
        this.rcon.check();
    }
    Timings.connectionTimer.stopTiming();
    Timings.schedulerTimer.startTiming();
    this.scheduler.mainThreadHeartbeat(this.tickCounter);
    Timings.schedulerTimer.stopTiming();
    this.checkTickUpdates(this.tickCounter, tickTime);
    for (Player player : new ArrayList<>(this.players.values())) {
        player.checkNetwork();
    }
    if ((this.tickCounter & 0b1111) == 0) {
        this.titleTick();
        this.network.resetStatistics();
        this.maxTick = 20;
        this.maxUse = 0;
        if ((this.tickCounter & 0b111111111) == 0) {
            try {
                this.getPluginManager().callEvent(this.queryRegenerateEvent = new QueryRegenerateEvent(this, 5));
                if (this.queryHandler != null) {
                    this.queryHandler.regenerateInfo();
                }
            } catch (Exception e) {
                this.logger.logException(e);
            }
        }
        this.getNetwork().updateName();
    }
    if (this.autoSave && ++this.autoSaveTicker >= this.autoSaveTicks) {
        this.autoSaveTicker = 0;
        this.doAutoSave();
    }
    if (this.sendUsageTicker > 0 && --this.sendUsageTicker == 0) {
        this.sendUsageTicker = 6000;
    // todo sendUsage
    }
    if (this.tickCounter % 100 == 0) {
        for (Level level : this.levelArray) {
            level.doChunkGarbageCollection();
        }
    }
    Timings.fullServerTickTimer.stopTiming();
    // long now = System.currentTimeMillis();
    long nowNano = System.nanoTime();
    // float tick = Math.min(20, 1000 / Math.max(1, now - tickTime));
    // float use = Math.min(1, (now - tickTime) / 50);
    float tick = (float) Math.min(20, 1000000000 / Math.max(1000000, ((double) nowNano - tickTimeNano)));
    float use = (float) Math.min(1, ((double) (nowNano - tickTimeNano)) / 50000000);
    if (this.maxTick > tick) {
        this.maxTick = tick;
    }
    if (this.maxUse < use) {
        this.maxUse = use;
    }
    System.arraycopy(this.tickAverage, 1, this.tickAverage, 0, this.tickAverage.length - 1);
    this.tickAverage[this.tickAverage.length - 1] = tick;
    System.arraycopy(this.useAverage, 1, this.useAverage, 0, this.useAverage.length - 1);
    this.useAverage[this.useAverage.length - 1] = use;
    if ((this.nextTick - tickTime) < -1000) {
        this.nextTick = tickTime;
    } else {
        this.nextTick += 50;
    }
    return true;
}
Also used : QueryRegenerateEvent(cn.nukkit.event.server.QueryRegenerateEvent) Level(cn.nukkit.level.Level)

Example 18 with Level

use of cn.nukkit.level.Level in project Nukkit by Nukkit.

the class Server method doAutoSave.

public void doAutoSave() {
    if (this.getAutoSave()) {
        Timings.levelSaveTimer.startTiming();
        for (Player player : new ArrayList<>(this.players.values())) {
            if (player.isOnline()) {
                player.save(true);
            } else if (!player.isConnected()) {
                this.removePlayer(player);
            }
        }
        for (Level level : this.levelArray) {
            level.save();
        }
        Timings.levelSaveTimer.stopTiming();
    }
}
Also used : Level(cn.nukkit.level.Level)

Example 19 with Level

use of cn.nukkit.level.Level in project Nukkit by Nukkit.

the class SetWorldSpawnCommand method execute.

@Override
public boolean execute(CommandSender sender, String commandLabel, String[] args) {
    if (!this.testPermission(sender)) {
        return true;
    }
    Level level;
    Vector3 pos;
    if (args.length == 0) {
        if (sender instanceof Player) {
            level = ((Player) sender).getLevel();
            pos = ((Player) sender).round();
        } else {
            sender.sendMessage(new TranslationContainer("commands.generic.ingame"));
            return true;
        }
    } else if (args.length == 3) {
        level = sender.getServer().getDefaultLevel();
        try {
            pos = new Vector3(Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2]));
        } catch (NumberFormatException e1) {
            sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage));
            return true;
        }
    } else {
        sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage));
        return true;
    }
    level.setSpawnLocation(pos);
    DecimalFormat round2 = new DecimalFormat("##0.00");
    Command.broadcastCommandMessage(sender, new TranslationContainer("commands.setworldspawn.success", new String[] { round2.format(pos.x), round2.format(pos.y), round2.format(pos.z) }));
    return true;
}
Also used : Player(cn.nukkit.Player) TranslationContainer(cn.nukkit.lang.TranslationContainer) DecimalFormat(java.text.DecimalFormat) Level(cn.nukkit.level.Level) Vector3(cn.nukkit.math.Vector3)

Example 20 with Level

use of cn.nukkit.level.Level in project Nukkit by Nukkit.

the class SpawnpointCommand method execute.

@Override
public boolean execute(CommandSender sender, String commandLabel, String[] args) {
    if (!this.testPermission(sender)) {
        return true;
    }
    Player target;
    if (args.length == 0) {
        if (sender instanceof Player) {
            target = (Player) sender;
        } else {
            sender.sendMessage(new TranslationContainer("commands.generic.ingame"));
            return true;
        }
    } else {
        target = sender.getServer().getPlayer(args[0]);
        if (target == null) {
            sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.player.notFound"));
            return true;
        }
    }
    Level level = target.getLevel();
    DecimalFormat round2 = new DecimalFormat("##0.00");
    if (args.length == 4) {
        if (level != null) {
            int x;
            int y;
            int z;
            try {
                x = Integer.parseInt(args[1]);
                y = Integer.parseInt(args[2]);
                z = Integer.parseInt(args[3]);
            } catch (NumberFormatException e1) {
                sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage));
                return true;
            }
            if (y < 0)
                y = 0;
            if (y > 256)
                y = 256;
            target.setSpawn(new Position(x, y, z, level));
            Command.broadcastCommandMessage(sender, new TranslationContainer("commands.spawnpoint.success", new String[] { target.getName(), round2.format(x), round2.format(y), round2.format(z) }));
            return true;
        }
    } else if (args.length <= 1) {
        if (sender instanceof Player) {
            Position pos = (Position) sender;
            target.setSpawn(pos);
            Command.broadcastCommandMessage(sender, new TranslationContainer("commands.spawnpoint.success", new String[] { target.getName(), round2.format(pos.x), round2.format(pos.y), round2.format(pos.z) }));
            return true;
        } else {
            sender.sendMessage(new TranslationContainer("commands.generic.ingame"));
            return true;
        }
    }
    sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage));
    return true;
}
Also used : Player(cn.nukkit.Player) Position(cn.nukkit.level.Position) TranslationContainer(cn.nukkit.lang.TranslationContainer) DecimalFormat(java.text.DecimalFormat) Level(cn.nukkit.level.Level)

Aggregations

Level (cn.nukkit.level.Level)24 Player (cn.nukkit.Player)6 TranslationContainer (cn.nukkit.lang.TranslationContainer)6 BlockEventPacket (cn.nukkit.network.protocol.BlockEventPacket)6 BaseFullChunk (cn.nukkit.level.format.generic.BaseFullChunk)3 BlockEnderChest (cn.nukkit.block.BlockEnderChest)2 LevelLoadEvent (cn.nukkit.event.level.LevelLoadEvent)2 Vector3 (cn.nukkit.math.Vector3)2 DecimalFormat (java.text.DecimalFormat)2 Server (cn.nukkit.Server)1 LevelInitEvent (cn.nukkit.event.level.LevelInitEvent)1 QueryRegenerateEvent (cn.nukkit.event.server.QueryRegenerateEvent)1 Position (cn.nukkit.level.Position)1 SourceInterface (cn.nukkit.network.SourceInterface)1 ContainerClosePacket (cn.nukkit.network.protocol.ContainerClosePacket)1 ContainerOpenPacket (cn.nukkit.network.protocol.ContainerOpenPacket)1 BanEntry (cn.nukkit.permission.BanEntry)1 TextFormat (cn.nukkit.utils.TextFormat)1 Random (java.util.Random)1