Day-Night

The day-night effect, also called day-night-cycle, is changing the color and brightness of the game to simulate day and night: at night everything is darker and lamps are lightened up.

In the game this is configured with the ambient variables:

To change the colors throught the day, an NPC is calculating the new ambient color each few seconds and sends it to all players and also to players who just logged in:

NPC Daynight:

function onUpdated() {
    this.onCreated();
}
function onCreated() {
    this.name = "";
    this.name = "DaynightControl"
    this.dayLength = 4*3600;
    this.dayOffset = 0;
    if (!this.ambient)
        this.ambient = [1,1,1];
    this.times = [
        {hour: 0,   ambient: [0.4,  0.4,  0.8]},
        {hour: 5,   ambient: [0.45, 0.45, 0.8]},
        {hour: 6,   ambient: [0.55, 0.5,  0.8]},
        {hour: 7,   ambient: [0.8,  0.7,  0.8]},
        {hour: 8,   ambient: [1,    1,    1]},
        {hour:16,   ambient: [0.95, 1,    1]},
        {hour:17,   ambient: [0.8,  0.9,  1]},
        {hour:18,   ambient: [0.65, 0.65, 0.95]},
        {hour:19,   ambient: [0.6,  0.6,  0.9]},
        {hour:20,   ambient: [0.5,  0.5,  0.8]},
        {hour:21,   ambient: [0.4,  0.4,  0.8]}
    ];
    this.onTimeout();
}
function onTimeout() {
    this.calculateAmbientColor();
    this.settimeout(5);
}
function calculateAmbientColor() {
    let currentTime = ((new Date().getTime() / 1000 + this.dayOffset) % (24*3600)) % this.dayLength;
    let hour = Math.floor(48 * currentTime / this.dayLength) / 2;
    this.ambient = [1,1,1];
    for (let i = 0; i < this.times.length; i++) {
        if (hour >= this.times[i].hour)
            this.ambient = this.times[i].ambient;
        else
            break;
    }
    Server.setambient(this.ambient[0], this.ambient[1], this.ambient[2]);
    Server.hour = Math.floor(hour); // for other scripts
}
function onPlayerLogin(pl) {
    // Called from player class
    pl.setambient(this.ambient[0], this.ambient[1], this.ambient[2]);
}

players class:

function onPlayerLogin(pl) {
    let npc = Server.searchnpcs({name:"DaynightControl"})[0];
    npc.scheduleevent(0, "playerlogin", player);
}