summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2010-12-20 14:04:31 +0200
committerPerttu Ahola <celeron55@gmail.com>2010-12-20 14:04:31 +0200
commit5a36956f75959887f75fda90c39d56181cd1f196 (patch)
tree7532418d0f0343bde620932e226446bb75408f86
parentab7477c4c3e2a3647dc4fb65c71567946d33b0e3 (diff)
downloadminetest-5a36956f75959887f75fda90c39d56181cd1f196.tar.gz
minetest-5a36956f75959887f75fda90c39d56181cd1f196.tar.bz2
minetest-5a36956f75959887f75fda90c39d56181cd1f196.zip
working time-of-day sending from server to client
-rw-r--r--Makefile18
-rw-r--r--minetest.conf.example7
-rw-r--r--src/client.cpp78
-rw-r--r--src/client.h5
-rw-r--r--src/clientserver.h17
-rw-r--r--src/defaultsettings.cpp60
-rw-r--r--src/main.cpp44
-rw-r--r--src/server.cpp59
-rw-r--r--src/server.h22
-rw-r--r--src/servermain.cpp36
10 files changed, 198 insertions, 148 deletions
diff --git a/Makefile b/Makefile
index 08107718c..38a59c2de 100644
--- a/Makefile
+++ b/Makefile
@@ -2,18 +2,18 @@
# It's usually sufficient to change just the target name and source file list
# and be sure that CXX is set to a valid compiler
TARGET = test
-SOURCE_FILES = guiPauseMenu.cpp mapnode.cpp tile.cpp voxel.cpp mapblockobject.cpp inventory.cpp debug.cpp serialization.cpp light.cpp filesys.cpp connection.cpp environment.cpp client.cpp server.cpp socket.cpp mapblock.cpp mapsector.cpp heightmap.cpp map.cpp player.cpp utility.cpp main.cpp test.cpp
+SOURCE_FILES = guiPauseMenu.cpp defaultsettings.cpp mapnode.cpp tile.cpp voxel.cpp mapblockobject.cpp inventory.cpp debug.cpp serialization.cpp light.cpp filesys.cpp connection.cpp environment.cpp client.cpp server.cpp socket.cpp mapblock.cpp mapsector.cpp heightmap.cpp map.cpp player.cpp utility.cpp main.cpp test.cpp
SOURCES = $(addprefix src/, $(SOURCE_FILES))
-BUILD_DIR = build
+BUILD_DIR = build/
OBJECTS = $(addprefix $(BUILD_DIR)/, $(SOURCE_FILES:.cpp=.o))
#OBJECTS = $(SOURCES:.cpp=.o)
FAST_TARGET = fasttest
SERVER_TARGET = server
-SERVER_SOURCE_FILES = mapnode.cpp voxel.cpp mapblockobject.cpp inventory.cpp debug.cpp serialization.cpp light.cpp filesys.cpp connection.cpp environment.cpp server.cpp socket.cpp mapblock.cpp mapsector.cpp heightmap.cpp map.cpp player.cpp utility.cpp servermain.cpp test.cpp
+SERVER_SOURCE_FILES = defaultsettings.cpp mapnode.cpp voxel.cpp mapblockobject.cpp inventory.cpp debug.cpp serialization.cpp light.cpp filesys.cpp connection.cpp environment.cpp server.cpp socket.cpp mapblock.cpp mapsector.cpp heightmap.cpp map.cpp player.cpp utility.cpp servermain.cpp test.cpp
SERVER_SOURCES = $(addprefix src/, $(SERVER_SOURCE_FILES))
-SERVER_BUILD_DIR = serverbuild
+SERVER_BUILD_DIR = serverbuild/
SERVER_OBJECTS = $(addprefix $(SERVER_BUILD_DIR)/, $(SERVER_SOURCE_FILES:.cpp=.o))
#SERVER_OBJECTS = $(SERVER_SOURCES:.cpp=.o)
@@ -57,13 +57,13 @@ SERVER_DESTPATH = bin/$(SERVER_TARGET)$(SUF)
# Build commands
-all_linux all_win32: make_build_dir $(DESTPATH)
-fast_linux: make_build_dir $(FAST_DESTPATH)
-server_linux: make_server_build_dir $(SERVER_DESTPATH)
+all_linux all_win32: $(BUILD_DIR) $(DESTPATH)
+fast_linux: $(BUILD_DIR) $(FAST_DESTPATH)
+server_linux: $(SERVER_BUILD_DIR) $(SERVER_DESTPATH)
-make_build_dir:
+$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
-make_server_build_dir:
+$(SERVER_BUILD_DIR):
mkdir -p $(SERVER_BUILD_DIR)
$(DESTPATH): $(OBJECTS)
diff --git a/minetest.conf.example b/minetest.conf.example
index df0ff1e7c..20392e56d 100644
--- a/minetest.conf.example
+++ b/minetest.conf.example
@@ -60,3 +60,10 @@
# Note that this gets applied at map generation time
#endless_water = true
+# 20 min/day
+#time_speed = 72
+# 1 min/day
+#time_speed = 1440
+
+#time_send_interval = 5
+
diff --git a/src/client.cpp b/src/client.cpp
index 37482ba91..b612c9c44 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -91,10 +91,7 @@ Client::Client(
m_server_ser_ver(SER_FMT_VER_INVALID),
m_step_dtime(0.0),
m_inventory_updated(false),
- m_time(0),
- m_time_counter(0.0)
- //m_daynight_i(0)
- //m_daynight_ratio(1000)
+ m_time_of_day(0)
{
m_packetcounter_timer = 0.0;
m_delete_unused_sectors_timer = 0.0;
@@ -165,48 +162,29 @@ void Client::step(float dtime)
Day/night
*/
{
- m_time_counter += dtime;
- int seconds = (int)m_time_counter;
- m_time_counter -= (float)seconds;
- m_time += seconds;
- if(seconds > 0)
+ s32 d = 8;
+ s32 t = (((m_time_of_day.get() + 24000/d/2)%24000)/(24000/d));
+ s32 dn = 0;
+ if(t == d/4 || t == (d-d/4))
+ dn = 1;
+ else if(t < d/4 || t > (d-d/4))
+ dn = 2;
+ else
+ dn = 0;
+
+ u32 dr = 1000;
+ if(dn == 0)
+ dr = 1000;
+ if(dn == 1)
+ dr = 600;
+ if(dn == 2)
+ dr = 300;
+
+ if(dr != m_env.getDayNightRatio())
{
- //dstream<<"m_time="<<m_time<<std::endl;
- /*JMutexAutoLock envlock(m_env_mutex);
- u32 dr = 500+500*sin((float)((m_time/10)%7)/7.*2.*PI);
- if(dr != m_env.getDayNightRatio())
- {
- dstream<<"dr="<<dr<<std::endl;
- m_env.setDayNightRatio(dr);
- m_env.expireMeshes();
- }*/
-#if 1
- s32 d = 4;
- s32 t = (m_time/10)%d;
- s32 dn = 0;
- if(t == d/2-1 || t == d-1)
- dn = 1;
- else if(t < d/2-1)
- dn = 0;
- else
- dn = 2;
-
- u32 dr = 1000;
- if(dn == 0)
- dr = 1000;
- if(dn == 1)
- dr = 600;
- if(dn == 2)
- dr = 300;
-#else
- u32 dr = 1000;
-#endif
- if(dr != m_env.getDayNightRatio())
- {
- dstream<<"dr="<<dr<<std::endl;
- m_env.setDayNightRatio(dr);
- m_env.expireMeshes(true);
- }
+ //dstream<<"dr="<<dr<<std::endl;
+ m_env.setDayNightRatio(dr);
+ m_env.expireMeshes(true);
}
}
@@ -1034,6 +1012,16 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
} //envlock
}
+ else if(command == TOCLIENT_TIME_OF_DAY)
+ {
+ if(datasize < 4)
+ return;
+
+ u16 time = readU16(&data[2]);
+ time = time % 24000;
+ m_time_of_day.set(time);
+ //dstream<<"Client: time="<<time<<std::endl;
+ }
// Default to queueing it (for slow commands)
else
{
diff --git a/src/client.h b/src/client.h
index 4720bd720..a1ee3f762 100644
--- a/src/client.h
+++ b/src/client.h
@@ -290,9 +290,8 @@ private:
PacketCounter m_packetcounter;
- // Access these only in main thread.
- u32 m_time;
- float m_time_counter;
+ // Received from the server. 0-23999
+ MutexedVariable<u32> m_time_of_day;
// 0 <= m_daynight_i < DAYNIGHT_CACHE_COUNT
//s32 m_daynight_i;
diff --git a/src/clientserver.h b/src/clientserver.h
index 4526083da..5e919b2f7 100644
--- a/src/clientserver.h
+++ b/src/clientserver.h
@@ -20,6 +20,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef CLIENTSERVER_HEADER
#define CLIENTSERVER_HEADER
+#include "utility.h"
+
#define PROTOCOL_ID 0x4f457403
enum ToClientCommand
@@ -90,6 +92,12 @@ enum ToClientCommand
v3s16 blockpos
block objects
*/
+
+ TOCLIENT_TIME_OF_DAY = 0x29,
+ /*
+ u16 command
+ u16 time (0-23999)
+ */
};
enum ToServerCommand
@@ -185,8 +193,13 @@ enum ToServerCommand
*/
};
-// Flags for TOSERVER_GETBLOCK
-#define TOSERVER_GETBLOCK_FLAG_OPTIONAL (1<<0)
+inline SharedBuffer<u8> makePacket_TOCLIENT_TIME_OF_DAY(u16 time)
+{
+ SharedBuffer<u8> data(2+2);
+ writeU16(&data[0], TOCLIENT_TIME_OF_DAY);
+ writeU16(&data[2], time);
+ return data;
+}
#endif
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
new file mode 100644
index 000000000..2dbbaada7
--- /dev/null
+++ b/src/defaultsettings.cpp
@@ -0,0 +1,60 @@
+/*
+Minetest-c55
+Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "utility.h"
+
+extern Settings g_settings;
+
+void set_default_settings()
+{
+ // Client stuff
+ g_settings.setDefault("wanted_fps", "30");
+ g_settings.setDefault("fps_max", "60");
+ g_settings.setDefault("viewing_range_nodes_max", "300");
+ g_settings.setDefault("viewing_range_nodes_min", "35");
+ g_settings.setDefault("screenW", "");
+ g_settings.setDefault("screenH", "");
+ g_settings.setDefault("host_game", "");
+ g_settings.setDefault("port", "");
+ g_settings.setDefault("address", "");
+ g_settings.setDefault("name", "");
+ g_settings.setDefault("random_input", "false");
+ g_settings.setDefault("client_delete_unused_sectors_timeout", "1200");
+ g_settings.setDefault("enable_fog", "true");
+
+ // Server stuff
+ g_settings.setDefault("creative_mode", "false");
+ g_settings.setDefault("heightmap_blocksize", "32");
+ g_settings.setDefault("height_randmax", "constant 50.0");
+ g_settings.setDefault("height_randfactor", "constant 0.6");
+ g_settings.setDefault("height_base", "linear 0 0 0");
+ g_settings.setDefault("plants_amount", "1.0");
+ g_settings.setDefault("ravines_amount", "1.0");
+ g_settings.setDefault("objectdata_interval", "0.2");
+ g_settings.setDefault("active_object_range", "2");
+ g_settings.setDefault("max_simultaneous_block_sends_per_client", "1");
+ g_settings.setDefault("max_simultaneous_block_sends_server_total", "4");
+ g_settings.setDefault("disable_water_climb", "true");
+ g_settings.setDefault("endless_water", "true");
+ g_settings.setDefault("max_block_send_distance", "5");
+ g_settings.setDefault("max_block_generate_distance", "4");
+ g_settings.setDefault("time_send_interval", "20");
+ g_settings.setDefault("time_speed", "144");
+}
+
diff --git a/src/main.cpp b/src/main.cpp
index b747da66a..7d146835f 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -172,10 +172,6 @@ TODO: Check what goes wrong with caching map to disk (Kray)
TODO: Remove LazyMeshUpdater. It is not used as supposed.
-TODO: Node cracking animation when digging
- - TODO: A way to generate new textures by combining textures
- - TODO: Mesh update to fetch cracked faces from the former
-
TODO: Add server unused sector deletion settings to settings
TODO: TOSERVER_LEAVE
@@ -183,6 +179,10 @@ TODO: TOSERVER_LEAVE
Doing now:
======================================================================
+TODO: Node cracking animation when digging
+ - TODO: A way to generate new textures by combining textures
+ - TODO: Mesh update to fetch cracked faces from the former
+
======================================================================
*/
@@ -298,41 +298,7 @@ bool g_viewing_range_all = false;
Settings g_settings;
-// Sets default settings
-void set_default_settings()
-{
- // Client stuff
- g_settings.setDefault("wanted_fps", "30");
- g_settings.setDefault("fps_max", "60");
- g_settings.setDefault("viewing_range_nodes_max", "300");
- g_settings.setDefault("viewing_range_nodes_min", "35");
- g_settings.setDefault("screenW", "");
- g_settings.setDefault("screenH", "");
- g_settings.setDefault("host_game", "");
- g_settings.setDefault("port", "");
- g_settings.setDefault("address", "");
- g_settings.setDefault("name", "");
- g_settings.setDefault("random_input", "false");
- g_settings.setDefault("client_delete_unused_sectors_timeout", "1200");
- g_settings.setDefault("enable_fog", "true");
-
- // Server stuff
- g_settings.setDefault("creative_mode", "false");
- g_settings.setDefault("heightmap_blocksize", "32");
- g_settings.setDefault("height_randmax", "constant 50.0");
- g_settings.setDefault("height_randfactor", "constant 0.6");
- g_settings.setDefault("height_base", "linear 0 0 0");
- g_settings.setDefault("plants_amount", "1.0");
- g_settings.setDefault("ravines_amount", "1.0");
- g_settings.setDefault("objectdata_interval", "0.2");
- g_settings.setDefault("active_object_range", "2");
- g_settings.setDefault("max_simultaneous_block_sends_per_client", "1");
- g_settings.setDefault("max_simultaneous_block_sends_server_total", "4");
- g_settings.setDefault("disable_water_climb", "true");
- g_settings.setDefault("endless_water", "true");
- g_settings.setDefault("max_block_send_distance", "5");
- g_settings.setDefault("max_block_generate_distance", "4");
-}
+extern void set_default_settings();
/*
Random stuff
diff --git a/src/server.cpp b/src/server.cpp
index a2dfc8269..7260e21d3 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -31,6 +31,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "constants.h"
#include "voxel.h"
+#define BLOCK_EMERGE_FLAG_FROMDISK (1<<0)
+
void * ServerThread::Thread()
{
ThreadStarted();
@@ -121,7 +123,7 @@ void * EmergeThread::Thread()
// Check flags
u8 flags = i.getNode()->getValue();
- if((flags & TOSERVER_GETBLOCK_FLAG_OPTIONAL) == false)
+ if((flags & BLOCK_EMERGE_FLAG_FROMDISK) == false)
optional = false;
}
@@ -541,7 +543,7 @@ void RemoteClient::GetNextBlocks(Server *server, float dtime,
u8 flags = 0;
if(generate == false)
- flags |= TOSERVER_GETBLOCK_FLAG_OPTIONAL;
+ flags |= BLOCK_EMERGE_FLAG_FROMDISK;
server->m_emerge_queue.addBlock(peer_id, p, flags);
server->m_emergethread.trigger();
@@ -757,7 +759,7 @@ void RemoteClient::SendObjectData(
m_num_blocks_in_emerge_queue.m_value++;*/
// Add to queue as an anonymous fetch from disk
- u8 flags = TOSERVER_GETBLOCK_FLAG_OPTIONAL;
+ u8 flags = BLOCK_EMERGE_FLAG_FROMDISK;
server->m_emerge_queue.addBlock(0, p, flags);
server->m_emergethread.trigger();
}
@@ -926,7 +928,10 @@ Server::Server(
m_env(new ServerMap(mapsavedir, hm_params, map_params), dout_server),
m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, this),
m_thread(this),
- m_emergethread(this)
+ m_emergethread(this),
+ m_time_of_day(12000),
+ m_time_counter(0),
+ m_time_of_day_send_timer(0)
{
m_flowwater_timer = 0.0;
m_print_info_timer = 0.0;
@@ -1025,6 +1030,45 @@ void Server::AsyncRunStep()
JMutexAutoLock lock1(m_step_dtime_mutex);
m_step_dtime -= dtime;
}
+
+ /*
+ Update m_time_of_day
+ */
+ {
+ m_time_counter += dtime;
+ f32 speed = g_settings.getFloat("time_speed") * 24000./(24.*3600);
+ u32 units = (u32)(m_time_counter*speed);
+ m_time_counter -= (f32)units / speed;
+ m_time_of_day.set((m_time_of_day.get() + units) % 24000);
+
+ //dstream<<"Server: m_time_of_day = "<<m_time_of_day.get()<<std::endl;
+
+ /*
+ Send to clients at constant intervals
+ */
+
+ m_time_of_day_send_timer -= dtime;
+ if(m_time_of_day_send_timer < 0.0)
+ {
+ m_time_of_day_send_timer = g_settings.getFloat("time_send_interval");
+
+ //JMutexAutoLock envlock(m_env_mutex);
+ JMutexAutoLock conlock(m_con_mutex);
+
+ for(core::map<u16, RemoteClient*>::Iterator
+ i = m_clients.getIterator();
+ i.atEnd() == false; i++)
+ {
+ RemoteClient *client = i.getNode()->getValue();
+ //Player *player = m_env.getPlayer(client->peer_id);
+
+ SharedBuffer<u8> data = makePacket_TOCLIENT_TIME_OF_DAY(
+ m_time_of_day.get());
+ // Send as reliable
+ m_con.Send(client->peer_id, 0, data, true);
+ }
+ }
+ }
//dstream<<"Server steps "<<dtime<<std::endl;
@@ -1434,6 +1478,13 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
// Send inventory to player
SendInventory(peer->id);
+
+ // Send time of day
+ {
+ SharedBuffer<u8> data = makePacket_TOCLIENT_TIME_OF_DAY(
+ m_time_of_day.get());
+ m_con.Send(peer->id, 0, data, true);
+ }
return;
}
diff --git a/src/server.h b/src/server.h
index c20189eb1..fddb097d0 100644
--- a/src/server.h
+++ b/src/server.h
@@ -265,9 +265,11 @@ public:
void GetNextBlocks(Server *server, float dtime,
core::array<PrioritySortedBlockTransfer> &dest);
- // Connection and environment should be locked when this is called
- // steps() objects of blocks not found in active_blocks, then
- // adds those blocks to active_blocks
+ /*
+ Connection and environment should be locked when this is called.
+ steps() objects of blocks not found in active_blocks, then
+ adds those blocks to active_blocks
+ */
void SendObjectData(
Server *server,
float dtime,
@@ -281,14 +283,6 @@ public:
void SetBlockNotSent(v3s16 p);
void SetBlocksNotSent(core::map<v3s16, MapBlock*> &blocks);
- //void BlockEmerged();
-
- /*bool IsSendingBlock(v3s16 p)
- {
- JMutexAutoLock lock(m_blocks_sending_mutex);
- return (m_blocks_sending.find(p) != NULL);
- }*/
-
s32 SendingCount()
{
JMutexAutoLock lock(m_blocks_sending_mutex);
@@ -457,6 +451,12 @@ private:
// Nodes that are destinations of flowing liquid at the moment
core::map<v3s16, u8> m_flow_active_nodes;
+
+ // 0-23999
+ MutexedVariable<u32> m_time_of_day;
+ // Used to buffer dtime for adding to m_time_of_day
+ float m_time_counter;
+ float m_time_of_day_send_timer;
friend class EmergeThread;
friend class RemoteClient;
diff --git a/src/servermain.cpp b/src/servermain.cpp
index e8d7c471d..5edc8ac7c 100644
--- a/src/servermain.cpp
+++ b/src/servermain.cpp
@@ -86,41 +86,7 @@ IrrlichtDevice *g_device = NULL;
Settings g_settings;
-// Sets default settings
-void set_default_settings()
-{
- // Client stuff
- g_settings.setDefault("wanted_fps", "30");
- g_settings.setDefault("fps_max", "60");
- g_settings.setDefault("viewing_range_nodes_max", "300");
- g_settings.setDefault("viewing_range_nodes_min", "35");
- g_settings.setDefault("screenW", "");
- g_settings.setDefault("screenH", "");
- g_settings.setDefault("host_game", "");
- g_settings.setDefault("port", "");
- g_settings.setDefault("address", "");
- g_settings.setDefault("name", "");
- g_settings.setDefault("random_input", "false");
- g_settings.setDefault("client_delete_unused_sectors_timeout", "1200");
- g_settings.setDefault("enable_fog", "true");
-
- // Server stuff
- g_settings.setDefault("creative_mode", "false");
- g_settings.setDefault("heightmap_blocksize", "32");
- g_settings.setDefault("height_randmax", "constant 50.0");
- g_settings.setDefault("height_randfactor", "constant 0.6");
- g_settings.setDefault("height_base", "linear 0 0 0");
- g_settings.setDefault("plants_amount", "1.0");
- g_settings.setDefault("ravines_amount", "1.0");
- g_settings.setDefault("objectdata_interval", "0.2");
- g_settings.setDefault("active_object_range", "2");
- g_settings.setDefault("max_simultaneous_block_sends_per_client", "1");
- g_settings.setDefault("max_simultaneous_block_sends_server_total", "4");
- g_settings.setDefault("disable_water_climb", "true");
- g_settings.setDefault("endless_water", "true");
- g_settings.setDefault("max_block_send_distance", "5");
- g_settings.setDefault("max_block_generate_distance", "4");
-}
+extern void set_default_settings();
/*
Debug streams