mirror of
https://github.com/minetest/minetest.git
synced 2024-11-30 03:23:45 +01:00
added dedicated server build without irrlicht
This commit is contained in:
parent
0ca9423b8b
commit
ab7477c4c3
65
Makefile
65
Makefile
@ -4,25 +4,28 @@
|
|||||||
TARGET = test
|
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 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))
|
SOURCES = $(addprefix src/, $(SOURCE_FILES))
|
||||||
OBJECTS = $(SOURCES:.cpp=.o)
|
BUILD_DIR = build
|
||||||
FASTTARGET = fasttest
|
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_SOURCES = $(addprefix src/, $(SERVER_SOURCE_FILES))
|
||||||
|
SERVER_BUILD_DIR = serverbuild
|
||||||
|
SERVER_OBJECTS = $(addprefix $(SERVER_BUILD_DIR)/, $(SERVER_SOURCE_FILES:.cpp=.o))
|
||||||
|
#SERVER_OBJECTS = $(SERVER_SOURCES:.cpp=.o)
|
||||||
|
|
||||||
IRRLICHTPATH = ../irrlicht/irrlicht-1.7.1
|
IRRLICHTPATH = ../irrlicht/irrlicht-1.7.1
|
||||||
JTHREADPATH = ../jthread/jthread-1.2.1
|
JTHREADPATH = ../jthread/jthread-1.2.1
|
||||||
|
|
||||||
CPPFLAGS = -I$(IRRLICHTPATH)/include -I/usr/X11R6/include -I$(JTHREADPATH)/src
|
|
||||||
|
|
||||||
#CXXFLAGS = -O2 -ffast-math -Wall -fomit-frame-pointer -pipe
|
#CXXFLAGS = -O2 -ffast-math -Wall -fomit-frame-pointer -pipe
|
||||||
CXXFLAGS = -O2 -ffast-math -Wall -g -pipe
|
CXXFLAGS = -O2 -ffast-math -Wall -g -pipe
|
||||||
#CXXFLAGS = -O1 -ffast-math -Wall -g
|
#CXXFLAGS = -O1 -ffast-math -Wall -g
|
||||||
#CXXFLAGS = -Wall -g -O0
|
#CXXFLAGS = -Wall -g -O0
|
||||||
|
|
||||||
#CXXFLAGS = -O3 -ffast-math -Wall
|
#FAST_CXXFLAGS = -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops -mtune=i686
|
||||||
#CXXFLAGS = -O3 -ffast-math -Wall -g
|
|
||||||
#CXXFLAGS = -O2 -ffast-math -Wall -g
|
|
||||||
|
|
||||||
FASTCXXFLAGS = -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops -mtune=i686
|
|
||||||
#FASTCXXFLAGS = -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops -mtune=i686 -fwhole-program
|
|
||||||
|
|
||||||
#Default target
|
#Default target
|
||||||
|
|
||||||
@ -35,8 +38,13 @@ endif
|
|||||||
# Target specific settings
|
# Target specific settings
|
||||||
|
|
||||||
all_linux fast_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L$(IRRLICHTPATH)/lib/Linux -L$(JTHREADPATH)/src/.libs -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -ljthread -lz
|
all_linux fast_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L$(IRRLICHTPATH)/lib/Linux -L$(JTHREADPATH)/src/.libs -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -ljthread -lz
|
||||||
|
all_linux fast_linux: CPPFLAGS = -I$(IRRLICHTPATH)/include -I/usr/X11R6/include -I$(JTHREADPATH)/src
|
||||||
|
fast_linux server_linux: CXXFLAGS = -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops -mtune=i686
|
||||||
|
server_linux: LDFLAGS = -L$(JTHREADPATH)/src/.libs -ljthread -lz -lpthread
|
||||||
|
server_linux: CPPFLAGS = -I$(IRRLICHTPATH)/include -I/usr/X11R6/include -I$(JTHREADPATH)/src -DSERVER
|
||||||
all_linux fast_linux clean_linux: SYSTEM=Linux
|
all_linux fast_linux clean_linux: SYSTEM=Linux
|
||||||
|
|
||||||
|
# These are out of date
|
||||||
all_win32: LDFLAGS = -L$(IRRLICHTPATH)/lib/Win32-gcc -L$(JTHREADPATH)/Debug -lIrrlicht -lopengl32 -lm -ljthread
|
all_win32: LDFLAGS = -L$(IRRLICHTPATH)/lib/Win32-gcc -L$(JTHREADPATH)/Debug -lIrrlicht -lopengl32 -lm -ljthread
|
||||||
all_win32 clean_win32: SYSTEM=Win32-gcc
|
all_win32 clean_win32: SYSTEM=Win32-gcc
|
||||||
all_win32 clean_win32: SUF=.exe
|
all_win32 clean_win32: SUF=.exe
|
||||||
@ -44,31 +52,44 @@ all_win32 clean_win32: SUF=.exe
|
|||||||
# Name of the binary - only valid for targets which set SYSTEM
|
# Name of the binary - only valid for targets which set SYSTEM
|
||||||
|
|
||||||
DESTPATH = bin/$(TARGET)$(SUF)
|
DESTPATH = bin/$(TARGET)$(SUF)
|
||||||
FASTDESTPATH = bin/$(FASTTARGET)$(SUF)
|
FAST_DESTPATH = bin/$(FAST_TARGET)$(SUF)
|
||||||
|
SERVER_DESTPATH = bin/$(SERVER_TARGET)$(SUF)
|
||||||
|
|
||||||
# Build commands
|
# Build commands
|
||||||
|
|
||||||
all_linux all_win32: $(DESTPATH)
|
all_linux all_win32: make_build_dir $(DESTPATH)
|
||||||
|
fast_linux: make_build_dir $(FAST_DESTPATH)
|
||||||
|
server_linux: make_server_build_dir $(SERVER_DESTPATH)
|
||||||
|
|
||||||
fast_linux: $(FASTDESTPATH)
|
make_build_dir:
|
||||||
|
mkdir -p $(BUILD_DIR)
|
||||||
$(FASTDESTPATH): $(SOURCES)
|
make_server_build_dir:
|
||||||
$(CXX) -o $(FASTDESTPATH) $(SOURCES) $(CPPFLAGS) $(FASTCXXFLAGS) $(LDFLAGS) -DUNITTEST_DISABLE
|
mkdir -p $(SERVER_BUILD_DIR)
|
||||||
@# Errno doesn't work ("error: ‘__errno_location’ was not declared in this scope")
|
|
||||||
@#cat $(SOURCES) | $(CXX) -o $(FASTDESTPATH) -x c++ - -Isrc/ $(CPPFLAGS) $(FASTCXXFLAGS) $(LDFLAGS) -DUNITTEST_DISABLE -DDISABLE_ERRNO
|
|
||||||
|
|
||||||
$(DESTPATH): $(OBJECTS)
|
$(DESTPATH): $(OBJECTS)
|
||||||
$(CXX) -o $@ $(OBJECTS) $(LDFLAGS)
|
$(CXX) -o $@ $(OBJECTS) $(LDFLAGS)
|
||||||
|
|
||||||
.cpp.o:
|
$(FAST_DESTPATH): $(SOURCES)
|
||||||
|
$(CXX) -o $@ $(OBJECTS) $(LDFLAGS) -DUNITTEST_DISABLE
|
||||||
|
|
||||||
|
$(SERVER_DESTPATH): $(SERVER_OBJECTS)
|
||||||
|
$(CXX) -o $@ $(SERVER_OBJECTS) $(LDFLAGS) -DSERVER -DUNITTEST_DISABLE
|
||||||
|
|
||||||
|
$(BUILD_DIR)/%.o: src/%.cpp
|
||||||
$(CXX) -c -o $@ $< $(CPPFLAGS) $(CXXFLAGS)
|
$(CXX) -c -o $@ $< $(CPPFLAGS) $(CXXFLAGS)
|
||||||
|
|
||||||
clean: clean_linux clean_win32 clean_fast_linux
|
$(SERVER_BUILD_DIR)/%.o: src/%.cpp
|
||||||
|
$(CXX) -c -o $@ $< $(CPPFLAGS) $(CXXFLAGS)
|
||||||
|
|
||||||
|
clean: clean_linux clean_win32 clean_fast_linux clean_server_linux
|
||||||
|
|
||||||
clean_linux clean_win32:
|
clean_linux clean_win32:
|
||||||
@$(RM) $(OBJECTS) $(DESTPATH)
|
@$(RM) $(OBJECTS) $(DESTPATH)
|
||||||
|
|
||||||
clean_fast_linux:
|
clean_fast_linux:
|
||||||
@$(RM) $(FASTDESTPATH)
|
@$(RM) $(OBJECTS) $(FAST_DESTPATH)
|
||||||
|
|
||||||
.PHONY: all all_win32 clean clean_linux clean_win32
|
clean_server_linux:
|
||||||
|
@$(RM) $(SERVER_OBJECTS) $(SERVER_DESTPATH)
|
||||||
|
|
||||||
|
.PHONY: all all_win32 clean clean_linux clean_win32 clean_fast_linux clean_server_linux
|
||||||
|
@ -70,10 +70,17 @@ void * ClientUpdateThread::Thread()
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Client::Client(IrrlichtDevice *device,
|
Client::Client(
|
||||||
const char *playername):
|
IrrlichtDevice *device,
|
||||||
|
const char *playername,
|
||||||
|
JMutex &range_mutex,
|
||||||
|
s16 &viewing_range_nodes,
|
||||||
|
bool &viewing_range_all):
|
||||||
m_thread(this),
|
m_thread(this),
|
||||||
m_env(new ClientMap(this,
|
m_env(new ClientMap(this,
|
||||||
|
range_mutex,
|
||||||
|
viewing_range_nodes,
|
||||||
|
viewing_range_all,
|
||||||
device->getSceneManager()->getRootSceneNode(),
|
device->getSceneManager()->getRootSceneNode(),
|
||||||
device->getSceneManager(), 666),
|
device->getSceneManager(), 666),
|
||||||
dout_client),
|
dout_client),
|
||||||
|
15
src/client.h
15
src/client.h
@ -20,6 +20,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#ifndef CLIENT_HEADER
|
#ifndef CLIENT_HEADER
|
||||||
#define CLIENT_HEADER
|
#define CLIENT_HEADER
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
|
|
||||||
#include "connection.h"
|
#include "connection.h"
|
||||||
#include "environment.h"
|
#include "environment.h"
|
||||||
#include "common_irrlicht.h"
|
#include "common_irrlicht.h"
|
||||||
@ -137,7 +139,14 @@ public:
|
|||||||
/*
|
/*
|
||||||
NOTE: Every public method should be thread-safe
|
NOTE: Every public method should be thread-safe
|
||||||
*/
|
*/
|
||||||
Client(IrrlichtDevice *device, const char *playername);
|
Client(
|
||||||
|
IrrlichtDevice *device,
|
||||||
|
const char *playername,
|
||||||
|
JMutex &range_mutex,
|
||||||
|
s16 &viewing_range_nodes,
|
||||||
|
bool &viewing_range_all
|
||||||
|
);
|
||||||
|
|
||||||
~Client();
|
~Client();
|
||||||
/*
|
/*
|
||||||
The name of the local player should already be set when
|
The name of the local player should already be set when
|
||||||
@ -290,5 +299,7 @@ private:
|
|||||||
//u32 m_daynight_ratio;
|
//u32 m_daynight_ratio;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif // !SERVER
|
||||||
|
|
||||||
|
#endif // !CLIENT_HEADER
|
||||||
|
|
||||||
|
@ -149,7 +149,7 @@ void Environment::step(float dtime)
|
|||||||
{
|
{
|
||||||
n.d = CONTENT_GRASS_FOOTSTEPS;
|
n.d = CONTENT_GRASS_FOOTSTEPS;
|
||||||
m_map->setNode(bottompos, n);
|
m_map->setNode(bottompos, n);
|
||||||
|
#ifndef SERVER
|
||||||
// Update mesh on client
|
// Update mesh on client
|
||||||
if(m_map->mapType() == MAPTYPE_CLIENT)
|
if(m_map->mapType() == MAPTYPE_CLIENT)
|
||||||
{
|
{
|
||||||
@ -157,6 +157,7 @@ void Environment::step(float dtime)
|
|||||||
MapBlock *b = m_map->getBlockNoCreate(p_blocks);
|
MapBlock *b = m_map->getBlockNoCreate(p_blocks);
|
||||||
b->updateMesh(m_daynight_ratio);
|
b->updateMesh(m_daynight_ratio);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch(InvalidPositionException &e)
|
catch(InvalidPositionException &e)
|
||||||
@ -179,7 +180,9 @@ void Environment::addPlayer(Player *player)
|
|||||||
{
|
{
|
||||||
DSTACK(__FUNCTION_NAME);
|
DSTACK(__FUNCTION_NAME);
|
||||||
//Check that only one local player exists and peer_ids are unique
|
//Check that only one local player exists and peer_ids are unique
|
||||||
|
#ifndef SERVER
|
||||||
assert(player->isLocal() == false || getLocalPlayer() == NULL);
|
assert(player->isLocal() == false || getLocalPlayer() == NULL);
|
||||||
|
#endif
|
||||||
assert(getPlayer(player->peer_id) == NULL);
|
assert(getPlayer(player->peer_id) == NULL);
|
||||||
m_players.push_back(player);
|
m_players.push_back(player);
|
||||||
}
|
}
|
||||||
@ -203,6 +206,7 @@ re_search:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
LocalPlayer * Environment::getLocalPlayer()
|
LocalPlayer * Environment::getLocalPlayer()
|
||||||
{
|
{
|
||||||
for(core::list<Player*>::Iterator i = m_players.begin();
|
for(core::list<Player*>::Iterator i = m_players.begin();
|
||||||
@ -214,6 +218,7 @@ LocalPlayer * Environment::getLocalPlayer()
|
|||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
Player * Environment::getPlayer(u16 peer_id)
|
Player * Environment::getPlayer(u16 peer_id)
|
||||||
{
|
{
|
||||||
@ -243,6 +248,7 @@ void Environment::printPlayers(std::ostream &o)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
void Environment::updateMeshes(v3s16 blockpos)
|
void Environment::updateMeshes(v3s16 blockpos)
|
||||||
{
|
{
|
||||||
m_map->updateMeshes(blockpos, m_daynight_ratio);
|
m_map->updateMeshes(blockpos, m_daynight_ratio);
|
||||||
@ -252,6 +258,7 @@ void Environment::expireMeshes(bool only_daynight_diffed)
|
|||||||
{
|
{
|
||||||
m_map->expireMeshes(only_daynight_diffed);
|
m_map->expireMeshes(only_daynight_diffed);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void Environment::setDayNightRatio(u32 r)
|
void Environment::setDayNightRatio(u32 r)
|
||||||
{
|
{
|
||||||
|
@ -55,13 +55,17 @@ public:
|
|||||||
*/
|
*/
|
||||||
void addPlayer(Player *player);
|
void addPlayer(Player *player);
|
||||||
void removePlayer(u16 peer_id);
|
void removePlayer(u16 peer_id);
|
||||||
|
#ifndef SERVER
|
||||||
LocalPlayer * getLocalPlayer();
|
LocalPlayer * getLocalPlayer();
|
||||||
|
#endif
|
||||||
Player * getPlayer(u16 peer_id);
|
Player * getPlayer(u16 peer_id);
|
||||||
core::list<Player*> getPlayers();
|
core::list<Player*> getPlayers();
|
||||||
void printPlayers(std::ostream &o);
|
void printPlayers(std::ostream &o);
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
void updateMeshes(v3s16 blockpos);
|
void updateMeshes(v3s16 blockpos);
|
||||||
void expireMeshes(bool only_daynight_diffed);
|
void expireMeshes(bool only_daynight_diffed);
|
||||||
|
#endif
|
||||||
void setDayNightRatio(u32 r);
|
void setDayNightRatio(u32 r);
|
||||||
u32 getDayNightRatio();
|
u32 getDayNightRatio();
|
||||||
|
|
||||||
|
@ -84,6 +84,7 @@ public:
|
|||||||
{
|
{
|
||||||
return new MaterialItem(m_content, m_count);
|
return new MaterialItem(m_content, m_count);
|
||||||
}
|
}
|
||||||
|
#ifndef SERVER
|
||||||
video::ITexture * getImage()
|
video::ITexture * getImage()
|
||||||
{
|
{
|
||||||
/*if(m_content == CONTENT_TORCH)
|
/*if(m_content == CONTENT_TORCH)
|
||||||
@ -97,6 +98,7 @@ public:
|
|||||||
|
|
||||||
return g_texturecache.get(g_content_inventory_textures[m_content]);
|
return g_texturecache.get(g_content_inventory_textures[m_content]);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
std::string getText()
|
std::string getText()
|
||||||
{
|
{
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
|
@ -1509,7 +1509,10 @@ int main(int argc, char *argv[])
|
|||||||
Create client
|
Create client
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Client client(device, playername);
|
Client client(device, playername,
|
||||||
|
g_range_mutex,
|
||||||
|
g_viewing_range_nodes,
|
||||||
|
g_viewing_range_all);
|
||||||
|
|
||||||
Address connect_address(0,0,0,0, port);
|
Address connect_address(0,0,0,0, port);
|
||||||
try{
|
try{
|
||||||
|
16
src/main.h
16
src/main.h
@ -26,11 +26,6 @@ extern std::string getTimestamp();
|
|||||||
|
|
||||||
#include <jmutex.h>
|
#include <jmutex.h>
|
||||||
|
|
||||||
extern JMutex g_range_mutex;
|
|
||||||
extern s16 g_viewing_range_nodes;
|
|
||||||
//extern s16 g_actual_viewing_range_nodes;
|
|
||||||
extern bool g_viewing_range_all;
|
|
||||||
|
|
||||||
// Settings
|
// Settings
|
||||||
extern Settings g_settings;
|
extern Settings g_settings;
|
||||||
|
|
||||||
@ -51,13 +46,10 @@ extern std::ostream *derr_server_ptr;
|
|||||||
#define dout_server (*dout_server_ptr)
|
#define dout_server (*dout_server_ptr)
|
||||||
#define derr_server (*derr_server_ptr)
|
#define derr_server (*derr_server_ptr)
|
||||||
|
|
||||||
// TODO: Move somewhere else? materials.h?
|
#ifndef SERVER
|
||||||
// This header is only for MATERIALS_COUNT
|
#include "utility.h"
|
||||||
//#include "mapnode.h"
|
extern TextureCache g_texturecache;
|
||||||
//extern video::SMaterial g_materials[MATERIALS_COUNT];
|
#endif
|
||||||
|
|
||||||
#include "utility.h"
|
|
||||||
extern TextureCache g_texturecache;
|
|
||||||
|
|
||||||
extern IrrlichtDevice *g_device;
|
extern IrrlichtDevice *g_device;
|
||||||
|
|
||||||
|
20
src/map.cpp
20
src/map.cpp
@ -1062,6 +1062,7 @@ void Map::removeNodeAndUpdate(v3s16 p,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
void Map::expireMeshes(bool only_daynight_diffed)
|
void Map::expireMeshes(bool only_daynight_diffed)
|
||||||
{
|
{
|
||||||
TimeTaker timer("expireMeshes()", g_device);
|
TimeTaker timer("expireMeshes()", g_device);
|
||||||
@ -1128,6 +1129,8 @@ void Map::updateMeshes(v3s16 blockpos, u32 daynight_ratio)
|
|||||||
catch(InvalidPositionException &e){}
|
catch(InvalidPositionException &e){}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
bool Map::dayNightDiffed(v3s16 blockpos)
|
bool Map::dayNightDiffed(v3s16 blockpos)
|
||||||
{
|
{
|
||||||
try{
|
try{
|
||||||
@ -2678,12 +2681,17 @@ void ServerMap::PrintInfo(std::ostream &out)
|
|||||||
out<<"ServerMap: ";
|
out<<"ServerMap: ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ClientMap
|
ClientMap
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ClientMap::ClientMap(
|
ClientMap::ClientMap(
|
||||||
Client *client,
|
Client *client,
|
||||||
|
JMutex &range_mutex,
|
||||||
|
s16 &viewing_range_nodes,
|
||||||
|
bool &viewing_range_all,
|
||||||
scene::ISceneNode* parent,
|
scene::ISceneNode* parent,
|
||||||
scene::ISceneManager* mgr,
|
scene::ISceneManager* mgr,
|
||||||
s32 id
|
s32 id
|
||||||
@ -2691,7 +2699,10 @@ ClientMap::ClientMap(
|
|||||||
Map(dout_client),
|
Map(dout_client),
|
||||||
scene::ISceneNode(parent, mgr, id),
|
scene::ISceneNode(parent, mgr, id),
|
||||||
m_client(client),
|
m_client(client),
|
||||||
mesh(NULL)
|
mesh(NULL),
|
||||||
|
m_range_mutex(range_mutex),
|
||||||
|
m_viewing_range_nodes(viewing_range_nodes),
|
||||||
|
m_viewing_range_all(viewing_range_all)
|
||||||
{
|
{
|
||||||
mesh_mutex.Init();
|
mesh_mutex.Init();
|
||||||
|
|
||||||
@ -2805,9 +2816,9 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
|
|||||||
s16 viewing_range_nodes;
|
s16 viewing_range_nodes;
|
||||||
bool viewing_range_all;
|
bool viewing_range_all;
|
||||||
{
|
{
|
||||||
JMutexAutoLock lock(g_range_mutex);
|
JMutexAutoLock lock(m_range_mutex);
|
||||||
viewing_range_nodes = g_viewing_range_nodes;
|
viewing_range_nodes = m_viewing_range_nodes;
|
||||||
viewing_range_all = g_viewing_range_all;
|
viewing_range_all = m_viewing_range_all;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_camera_mutex.Lock();
|
m_camera_mutex.Lock();
|
||||||
@ -3042,6 +3053,7 @@ void ClientMap::PrintInfo(std::ostream &out)
|
|||||||
out<<"ClientMap: ";
|
out<<"ClientMap: ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // !SERVER
|
||||||
|
|
||||||
/*
|
/*
|
||||||
MapVoxelManipulator
|
MapVoxelManipulator
|
||||||
|
17
src/map.h
17
src/map.h
@ -376,13 +376,15 @@ public:
|
|||||||
void removeNodeAndUpdate(v3s16 p,
|
void removeNodeAndUpdate(v3s16 p,
|
||||||
core::map<v3s16, MapBlock*> &modified_blocks);
|
core::map<v3s16, MapBlock*> &modified_blocks);
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
|
void expireMeshes(bool only_daynight_diffed);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Updates the faces of the given block and blocks on the
|
Updates the faces of the given block and blocks on the
|
||||||
leading edge.
|
leading edge.
|
||||||
*/
|
*/
|
||||||
void updateMeshes(v3s16 blockpos, u32 daynight_ratio);
|
void updateMeshes(v3s16 blockpos, u32 daynight_ratio);
|
||||||
|
#endif
|
||||||
void expireMeshes(bool only_daynight_diffed);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Takes the blocks at the trailing edges into account
|
Takes the blocks at the trailing edges into account
|
||||||
@ -535,6 +537,8 @@ private:
|
|||||||
bool m_map_saving_enabled;
|
bool m_map_saving_enabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
|
|
||||||
class Client;
|
class Client;
|
||||||
|
|
||||||
class ClientMap : public Map, public scene::ISceneNode
|
class ClientMap : public Map, public scene::ISceneNode
|
||||||
@ -542,6 +546,9 @@ class ClientMap : public Map, public scene::ISceneNode
|
|||||||
public:
|
public:
|
||||||
ClientMap(
|
ClientMap(
|
||||||
Client *client,
|
Client *client,
|
||||||
|
JMutex &range_mutex,
|
||||||
|
s16 &viewing_range_nodes,
|
||||||
|
bool &viewing_range_all,
|
||||||
scene::ISceneNode* parent,
|
scene::ISceneNode* parent,
|
||||||
scene::ISceneManager* mgr,
|
scene::ISceneManager* mgr,
|
||||||
s32 id
|
s32 id
|
||||||
@ -600,8 +607,14 @@ private:
|
|||||||
// This is the master heightmap mesh
|
// This is the master heightmap mesh
|
||||||
scene::SMesh *mesh;
|
scene::SMesh *mesh;
|
||||||
JMutex mesh_mutex;
|
JMutex mesh_mutex;
|
||||||
|
|
||||||
|
JMutex &m_range_mutex;
|
||||||
|
s16 &m_viewing_range_nodes;
|
||||||
|
bool &m_viewing_range_all;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
class MapVoxelManipulator : public VoxelManipulator
|
class MapVoxelManipulator : public VoxelManipulator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
111
src/mapblock.cpp
111
src/mapblock.cpp
@ -34,7 +34,6 @@ MapBlock::MapBlock(NodeContainer *parent, v3s16 pos, bool dummy):
|
|||||||
m_pos(pos),
|
m_pos(pos),
|
||||||
changed(true),
|
changed(true),
|
||||||
is_underground(false),
|
is_underground(false),
|
||||||
m_mesh_expired(false),
|
|
||||||
m_day_night_differs(false),
|
m_day_night_differs(false),
|
||||||
m_objects(this)
|
m_objects(this)
|
||||||
{
|
{
|
||||||
@ -42,17 +41,16 @@ MapBlock::MapBlock(NodeContainer *parent, v3s16 pos, bool dummy):
|
|||||||
if(dummy == false)
|
if(dummy == false)
|
||||||
reallocate();
|
reallocate();
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
|
m_mesh_expired = false;
|
||||||
mesh_mutex.Init();
|
mesh_mutex.Init();
|
||||||
|
|
||||||
mesh = NULL;
|
mesh = NULL;
|
||||||
/*for(s32 i=0; i<DAYNIGHT_CACHE_COUNT; i++)
|
#endif
|
||||||
{
|
|
||||||
mesh[i] = NULL;
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MapBlock::~MapBlock()
|
MapBlock::~MapBlock()
|
||||||
{
|
{
|
||||||
|
#ifndef SERVER
|
||||||
{
|
{
|
||||||
JMutexAutoLock lock(mesh_mutex);
|
JMutexAutoLock lock(mesh_mutex);
|
||||||
|
|
||||||
@ -61,15 +59,8 @@ MapBlock::~MapBlock()
|
|||||||
mesh->drop();
|
mesh->drop();
|
||||||
mesh = NULL;
|
mesh = NULL;
|
||||||
}
|
}
|
||||||
/*for(s32 i=0; i<DAYNIGHT_CACHE_COUNT; i++)
|
|
||||||
{
|
|
||||||
if(mesh[i] != NULL)
|
|
||||||
{
|
|
||||||
mesh[i]->drop();
|
|
||||||
mesh[i] = NULL;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if(data)
|
if(data)
|
||||||
delete[] data;
|
delete[] data;
|
||||||
@ -136,6 +127,52 @@ MapNode MapBlock::getNodeParentNoEx(v3s16 p)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Parameters must consist of air and !air.
|
||||||
|
Order doesn't matter.
|
||||||
|
|
||||||
|
If either of the nodes doesn't exist, light is 0.
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
daynight_ratio: 0...1000
|
||||||
|
n: getNodeParent(p)
|
||||||
|
n2: getNodeParent(p + face_dir)
|
||||||
|
face_dir: axis oriented unit vector from p to p2
|
||||||
|
*/
|
||||||
|
u8 MapBlock::getFaceLight(u32 daynight_ratio, MapNode n, MapNode n2,
|
||||||
|
v3s16 face_dir)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
u8 light;
|
||||||
|
u8 l1 = n.getLightBlend(daynight_ratio);
|
||||||
|
u8 l2 = n2.getLightBlend(daynight_ratio);
|
||||||
|
if(l1 > l2)
|
||||||
|
light = l1;
|
||||||
|
else
|
||||||
|
light = l2;
|
||||||
|
|
||||||
|
// Make some nice difference to different sides
|
||||||
|
|
||||||
|
/*if(face_dir.X == 1 || face_dir.Z == 1 || face_dir.Y == -1)
|
||||||
|
light = diminish_light(diminish_light(light));
|
||||||
|
else if(face_dir.X == -1 || face_dir.Z == -1)
|
||||||
|
light = diminish_light(light);*/
|
||||||
|
|
||||||
|
if(face_dir.X == 1 || face_dir.X == -1 || face_dir.Y == -1)
|
||||||
|
light = diminish_light(diminish_light(light));
|
||||||
|
else if(face_dir.Z == 1 || face_dir.Z == -1)
|
||||||
|
light = diminish_light(light);
|
||||||
|
|
||||||
|
return light;
|
||||||
|
}
|
||||||
|
catch(InvalidPositionException &e)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
|
|
||||||
void MapBlock::makeFastFace(TileSpec tile, u8 light, v3f p,
|
void MapBlock::makeFastFace(TileSpec tile, u8 light, v3f p,
|
||||||
v3s16 dir, v3f scale, v3f posRelative_f,
|
v3s16 dir, v3f scale, v3f posRelative_f,
|
||||||
core::array<FastFace> &dest)
|
core::array<FastFace> &dest)
|
||||||
@ -229,50 +266,6 @@ void MapBlock::makeFastFace(TileSpec tile, u8 light, v3f p,
|
|||||||
//return f;
|
//return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Parameters must consist of air and !air.
|
|
||||||
Order doesn't matter.
|
|
||||||
|
|
||||||
If either of the nodes doesn't exist, light is 0.
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
daynight_ratio: 0...1000
|
|
||||||
n: getNodeParent(p)
|
|
||||||
n2: getNodeParent(p + face_dir)
|
|
||||||
face_dir: axis oriented unit vector from p to p2
|
|
||||||
*/
|
|
||||||
u8 MapBlock::getFaceLight(u32 daynight_ratio, MapNode n, MapNode n2,
|
|
||||||
v3s16 face_dir)
|
|
||||||
{
|
|
||||||
try{
|
|
||||||
u8 light;
|
|
||||||
u8 l1 = n.getLightBlend(daynight_ratio);
|
|
||||||
u8 l2 = n2.getLightBlend(daynight_ratio);
|
|
||||||
if(l1 > l2)
|
|
||||||
light = l1;
|
|
||||||
else
|
|
||||||
light = l2;
|
|
||||||
|
|
||||||
// Make some nice difference to different sides
|
|
||||||
|
|
||||||
/*if(face_dir.X == 1 || face_dir.Z == 1 || face_dir.Y == -1)
|
|
||||||
light = diminish_light(diminish_light(light));
|
|
||||||
else if(face_dir.X == -1 || face_dir.Z == -1)
|
|
||||||
light = diminish_light(light);*/
|
|
||||||
|
|
||||||
if(face_dir.X == 1 || face_dir.X == -1 || face_dir.Y == -1)
|
|
||||||
light = diminish_light(diminish_light(light));
|
|
||||||
else if(face_dir.Z == 1 || face_dir.Z == -1)
|
|
||||||
light = diminish_light(light);
|
|
||||||
|
|
||||||
return light;
|
|
||||||
}
|
|
||||||
catch(InvalidPositionException &e)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Gets node tile from any place relative to block.
|
Gets node tile from any place relative to block.
|
||||||
Returns TILE_NODE if doesn't exist or should not be drawn.
|
Returns TILE_NODE if doesn't exist or should not be drawn.
|
||||||
@ -844,6 +837,8 @@ void MapBlock::updateMesh(u32 daynight_ratio)
|
|||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
#endif // !SERVER
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Propagates sunlight down through the block.
|
Propagates sunlight down through the block.
|
||||||
Doesn't modify nodes that are not affected by sunlight.
|
Doesn't modify nodes that are not affected by sunlight.
|
||||||
|
@ -88,11 +88,6 @@ public:
|
|||||||
class MapBlock : public NodeContainer
|
class MapBlock : public NodeContainer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//scene::SMesh *mesh[DAYNIGHT_CACHE_COUNT];
|
|
||||||
scene::SMesh *mesh;
|
|
||||||
JMutex mesh_mutex;
|
|
||||||
|
|
||||||
MapBlock(NodeContainer *parent, v3s16 pos, bool dummy=false);
|
MapBlock(NodeContainer *parent, v3s16 pos, bool dummy=false);
|
||||||
~MapBlock();
|
~MapBlock();
|
||||||
|
|
||||||
@ -131,7 +126,7 @@ public:
|
|||||||
{
|
{
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
#ifndef SERVER
|
||||||
void setMeshExpired(bool expired)
|
void setMeshExpired(bool expired)
|
||||||
{
|
{
|
||||||
m_mesh_expired = expired;
|
m_mesh_expired = expired;
|
||||||
@ -141,7 +136,7 @@ public:
|
|||||||
{
|
{
|
||||||
return m_mesh_expired;
|
return m_mesh_expired;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
v3s16 getPos()
|
v3s16 getPos()
|
||||||
{
|
{
|
||||||
return m_pos;
|
return m_pos;
|
||||||
@ -273,10 +268,6 @@ public:
|
|||||||
setNode(x0+x, y0+y, z0+z, node);
|
setNode(x0+x, y0+y, z0+z, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void makeFastFace(TileSpec tile, u8 light, v3f p,
|
|
||||||
v3s16 dir, v3f scale, v3f posRelative_f,
|
|
||||||
core::array<FastFace> &dest);
|
|
||||||
|
|
||||||
u8 getFaceLight(u32 daynight_ratio, MapNode n, MapNode n2,
|
u8 getFaceLight(u32 daynight_ratio, MapNode n, MapNode n2,
|
||||||
v3s16 face_dir);
|
v3s16 face_dir);
|
||||||
|
|
||||||
@ -288,6 +279,11 @@ public:
|
|||||||
face_dir);
|
face_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
|
static void makeFastFace(TileSpec tile, u8 light, v3f p,
|
||||||
|
v3s16 dir, v3f scale, v3f posRelative_f,
|
||||||
|
core::array<FastFace> &dest);
|
||||||
|
|
||||||
TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 face_dir);
|
TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 face_dir);
|
||||||
u8 getNodeContent(v3s16 p, MapNode mn);
|
u8 getNodeContent(v3s16 p, MapNode mn);
|
||||||
|
|
||||||
@ -311,6 +307,7 @@ public:
|
|||||||
/*void updateMesh(s32 daynight_i);
|
/*void updateMesh(s32 daynight_i);
|
||||||
// Updates all DAYNIGHT_CACHE_COUNT meshes
|
// Updates all DAYNIGHT_CACHE_COUNT meshes
|
||||||
void updateMeshes(s32 first_i=0);*/
|
void updateMeshes(s32 first_i=0);*/
|
||||||
|
#endif // !SERVER
|
||||||
|
|
||||||
bool propagateSunlight(core::map<v3s16, bool> & light_sources);
|
bool propagateSunlight(core::map<v3s16, bool> & light_sources);
|
||||||
|
|
||||||
@ -388,7 +385,8 @@ public:
|
|||||||
{
|
{
|
||||||
return m_objects.getCount();
|
return m_objects.getCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
/*
|
/*
|
||||||
Methods for setting temporary modifications to nodes for
|
Methods for setting temporary modifications to nodes for
|
||||||
drawing
|
drawing
|
||||||
@ -406,6 +404,7 @@ public:
|
|||||||
{
|
{
|
||||||
m_temp_mods.clear();
|
m_temp_mods.clear();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Day-night lighting difference
|
Day-night lighting difference
|
||||||
@ -431,6 +430,16 @@ public:
|
|||||||
|
|
||||||
void deSerialize(std::istream &is, u8 version);
|
void deSerialize(std::istream &is, u8 version);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Public member variables
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
|
//scene::SMesh *mesh[DAYNIGHT_CACHE_COUNT];
|
||||||
|
scene::SMesh *mesh;
|
||||||
|
JMutex mesh_mutex;
|
||||||
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -468,19 +477,22 @@ private:
|
|||||||
/*
|
/*
|
||||||
Used for some initial lighting stuff.
|
Used for some initial lighting stuff.
|
||||||
At least /has been/ used. 8)
|
At least /has been/ used. 8)
|
||||||
|
It's probably useless now.
|
||||||
*/
|
*/
|
||||||
bool is_underground;
|
bool is_underground;
|
||||||
|
|
||||||
bool m_mesh_expired;
|
|
||||||
|
|
||||||
// Whether day and night lighting differs
|
// Whether day and night lighting differs
|
||||||
bool m_day_night_differs;
|
bool m_day_night_differs;
|
||||||
|
|
||||||
MapBlockObjectList m_objects;
|
MapBlockObjectList m_objects;
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
|
bool m_mesh_expired;
|
||||||
|
|
||||||
// Temporary modifications to nodes
|
// Temporary modifications to nodes
|
||||||
// These are only used when drawing
|
// These are only used when drawing
|
||||||
core::map<v3s16, NodeMod> m_temp_mods;
|
core::map<v3s16, NodeMod> m_temp_mods;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool blockpos_over_limit(v3s16 p)
|
inline bool blockpos_over_limit(v3s16 p)
|
||||||
|
@ -135,6 +135,12 @@ public:
|
|||||||
// A return value of true requests deletion of the object by the caller.
|
// A return value of true requests deletion of the object by the caller.
|
||||||
// NOTE: Only server calls this.
|
// NOTE: Only server calls this.
|
||||||
virtual bool serverStep(float dtime) { return false; };
|
virtual bool serverStep(float dtime) { return false; };
|
||||||
|
|
||||||
|
#ifdef SERVER
|
||||||
|
void clientStep(float dtime) {};
|
||||||
|
void addToScene(void *smgr) {};
|
||||||
|
void removeFromScene() {};
|
||||||
|
#else
|
||||||
// This should do slight animations only or so
|
// This should do slight animations only or so
|
||||||
virtual void clientStep(float dtime) {};
|
virtual void clientStep(float dtime) {};
|
||||||
|
|
||||||
@ -147,6 +153,7 @@ public:
|
|||||||
// Should return silently if there is nothing to remove
|
// Should return silently if there is nothing to remove
|
||||||
// NOTE: This has to be called before calling destructor
|
// NOTE: This has to be called before calling destructor
|
||||||
virtual void removeFromScene() {};
|
virtual void removeFromScene() {};
|
||||||
|
#endif
|
||||||
|
|
||||||
virtual std::string infoText() { return ""; }
|
virtual std::string infoText() { return ""; }
|
||||||
|
|
||||||
@ -270,8 +277,8 @@ public:
|
|||||||
virtual bool serverStep(float dtime) { return false; };
|
virtual bool serverStep(float dtime) { return false; };
|
||||||
virtual void clientStep(float dtime) {};
|
virtual void clientStep(float dtime) {};
|
||||||
|
|
||||||
virtual void addToScene(scene::ISceneManager *smgr) = 0;
|
/*virtual void addToScene(scene::ISceneManager *smgr) = 0;
|
||||||
virtual void removeFromScene() = 0;
|
virtual void removeFromScene() = 0;*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Special methods
|
Special methods
|
||||||
@ -375,7 +382,7 @@ public:
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#ifndef SERVER
|
||||||
virtual void clientStep(float dtime)
|
virtual void clientStep(float dtime)
|
||||||
{
|
{
|
||||||
m_pos += m_speed * dtime;
|
m_pos += m_speed * dtime;
|
||||||
@ -424,6 +431,7 @@ public:
|
|||||||
m_node = NULL;
|
m_node = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
virtual std::string getInventoryString()
|
virtual std::string getInventoryString()
|
||||||
{
|
{
|
||||||
@ -520,6 +528,7 @@ public:
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#ifndef SERVER
|
||||||
virtual void addToScene(scene::ISceneManager *smgr)
|
virtual void addToScene(scene::ISceneManager *smgr)
|
||||||
{
|
{
|
||||||
if(m_node != NULL)
|
if(m_node != NULL)
|
||||||
@ -587,6 +596,7 @@ public:
|
|||||||
m_node = NULL;
|
m_node = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
virtual std::string infoText()
|
virtual std::string infoText()
|
||||||
{
|
{
|
||||||
@ -601,14 +611,15 @@ public:
|
|||||||
/*
|
/*
|
||||||
Special methods
|
Special methods
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void updateSceneNode()
|
void updateSceneNode()
|
||||||
{
|
{
|
||||||
|
#ifndef SERVER
|
||||||
if(m_node != NULL)
|
if(m_node != NULL)
|
||||||
{
|
{
|
||||||
m_node->setPosition(getAbsolutePos());
|
m_node->setPosition(getAbsolutePos());
|
||||||
m_node->setRotation(v3f(0, m_yaw, 0));
|
m_node->setRotation(v3f(0, m_yaw, 0));
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void setText(std::string text)
|
void setText(std::string text)
|
||||||
|
@ -607,6 +607,7 @@ ServerMapSector* ServerMapSector::deSerialize(
|
|||||||
return sector;
|
return sector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
/*
|
/*
|
||||||
ClientMapSector
|
ClientMapSector
|
||||||
*/
|
*/
|
||||||
@ -667,5 +668,6 @@ void ClientMapSector::deSerialize(std::istream &is)
|
|||||||
m_corners[2] = c2;
|
m_corners[2] = c2;
|
||||||
m_corners[3] = c3;
|
m_corners[3] = c3;
|
||||||
}
|
}
|
||||||
|
#endif // !SERVER
|
||||||
|
|
||||||
//END
|
//END
|
||||||
|
@ -309,6 +309,7 @@ private:
|
|||||||
core::map<v3s16, u8> *m_objects;
|
core::map<v3s16, u8> *m_objects;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
class ClientMapSector : public MapSector
|
class ClientMapSector : public MapSector
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -331,6 +332,7 @@ private:
|
|||||||
// The ground height of the corners is stored in here
|
// The ground height of the corners is stored in here
|
||||||
s16 m_corners[4];
|
s16 m_corners[4];
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -228,6 +228,8 @@ void Player::accelerate(v3f target_speed, f32 max_increase)
|
|||||||
RemotePlayer
|
RemotePlayer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
|
|
||||||
RemotePlayer::RemotePlayer(
|
RemotePlayer::RemotePlayer(
|
||||||
scene::ISceneNode* parent,
|
scene::ISceneNode* parent,
|
||||||
IrrlichtDevice *device,
|
IrrlichtDevice *device,
|
||||||
@ -236,7 +238,7 @@ RemotePlayer::RemotePlayer(
|
|||||||
m_text(NULL)
|
m_text(NULL)
|
||||||
{
|
{
|
||||||
m_box = core::aabbox3d<f32>(-BS/2,0,-BS/2,BS/2,BS*2,BS/2);
|
m_box = core::aabbox3d<f32>(-BS/2,0,-BS/2,BS/2,BS*2,BS/2);
|
||||||
|
|
||||||
if(parent != NULL && device != NULL)
|
if(parent != NULL && device != NULL)
|
||||||
{
|
{
|
||||||
// ISceneNode stores a member called SceneManager
|
// ISceneNode stores a member called SceneManager
|
||||||
@ -320,6 +322,9 @@ void RemotePlayer::updateName(const char *name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
/*
|
/*
|
||||||
LocalPlayer
|
LocalPlayer
|
||||||
*/
|
*/
|
||||||
@ -399,5 +404,5 @@ void LocalPlayer::applyControl(float dtime)
|
|||||||
// Accelerate to target speed with maximum increment
|
// Accelerate to target speed with maximum increment
|
||||||
accelerate(speed, inc);
|
accelerate(speed, inc);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
24
src/player.h
24
src/player.h
@ -109,6 +109,26 @@ protected:
|
|||||||
v3f m_position;
|
v3f m_position;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ServerRemotePlayer : public Player
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ServerRemotePlayer()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
virtual ~ServerRemotePlayer()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isLocal() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
|
|
||||||
class RemotePlayer : public Player, public scene::ISceneNode
|
class RemotePlayer : public Player, public scene::ISceneNode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -165,6 +185,9 @@ private:
|
|||||||
core::aabbox3d<f32> m_box;
|
core::aabbox3d<f32> m_box;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
struct PlayerControl
|
struct PlayerControl
|
||||||
{
|
{
|
||||||
PlayerControl()
|
PlayerControl()
|
||||||
@ -225,6 +248,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
};
|
};
|
||||||
|
#endif // !SERVER
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2082,7 +2082,7 @@ void Server::peerAdded(con::Peer *peer)
|
|||||||
// The player shouldn't already exist
|
// The player shouldn't already exist
|
||||||
assert(player == NULL);
|
assert(player == NULL);
|
||||||
|
|
||||||
player = new RemotePlayer();
|
player = new ServerRemotePlayer();
|
||||||
player->peer_id = peer->id;
|
player->peer_id = peer->id;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
421
src/servermain.cpp
Normal file
421
src/servermain.cpp
Normal file
@ -0,0 +1,421 @@
|
|||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================== NOTES ==============================
|
||||||
|
|
||||||
|
TODO: Move the default settings into some separate file
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SERVER
|
||||||
|
#ifdef _WIN32
|
||||||
|
#else
|
||||||
|
#error "For a server build, SERVER must be defined globally"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef UNITTEST_DISABLE
|
||||||
|
#ifdef _WIN32
|
||||||
|
#pragma message ("Disabling unit tests")
|
||||||
|
#else
|
||||||
|
#warning "Disabling unit tests"
|
||||||
|
#endif
|
||||||
|
// Disable unit tests
|
||||||
|
#define ENABLE_TESTS 0
|
||||||
|
#else
|
||||||
|
// Enable unit tests
|
||||||
|
#define ENABLE_TESTS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma comment(lib, "jthread.lib")
|
||||||
|
#pragma comment(lib, "zlibwapi.lib")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
#define sleep_ms(x) Sleep(x)
|
||||||
|
#else
|
||||||
|
#include <unistd.h>
|
||||||
|
#define sleep_ms(x) usleep(x*1000)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <time.h>
|
||||||
|
#include <jmutexautolock.h>
|
||||||
|
#include <locale.h>
|
||||||
|
#include "common_irrlicht.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "map.h"
|
||||||
|
#include "player.h"
|
||||||
|
#include "main.h"
|
||||||
|
#include "test.h"
|
||||||
|
#include "environment.h"
|
||||||
|
#include "server.h"
|
||||||
|
#include "serialization.h"
|
||||||
|
#include "constants.h"
|
||||||
|
#include "strfnd.h"
|
||||||
|
#include "porting.h"
|
||||||
|
|
||||||
|
// Dummy variable
|
||||||
|
IrrlichtDevice *g_device = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Settings.
|
||||||
|
These are loaded from the config file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Debug streams
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Connection
|
||||||
|
std::ostream *dout_con_ptr = &dummyout;
|
||||||
|
std::ostream *derr_con_ptr = &dstream_no_stderr;
|
||||||
|
|
||||||
|
// Server
|
||||||
|
std::ostream *dout_server_ptr = &dstream;
|
||||||
|
std::ostream *derr_server_ptr = &dstream;
|
||||||
|
|
||||||
|
// Client
|
||||||
|
std::ostream *dout_client_ptr = &dstream;
|
||||||
|
std::ostream *derr_client_ptr = &dstream;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Timestamp stuff
|
||||||
|
*/
|
||||||
|
|
||||||
|
JMutex g_timestamp_mutex;
|
||||||
|
|
||||||
|
std::string getTimestamp()
|
||||||
|
{
|
||||||
|
if(g_timestamp_mutex.IsInitialized()==false)
|
||||||
|
return "";
|
||||||
|
JMutexAutoLock lock(g_timestamp_mutex);
|
||||||
|
time_t t = time(NULL);
|
||||||
|
struct tm *tm = localtime(&t);
|
||||||
|
char cs[20];
|
||||||
|
strftime(cs, 20, "%H:%M:%S", tm);
|
||||||
|
return cs;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Low-level initialization
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool disable_stderr = false;
|
||||||
|
#ifdef _WIN32
|
||||||
|
disable_stderr = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Initialize debug streams
|
||||||
|
debugstreams_init(disable_stderr, DEBUGFILE);
|
||||||
|
// Initialize debug stacks
|
||||||
|
debug_stacks_init();
|
||||||
|
|
||||||
|
DSTACK(__FUNCTION_NAME);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
Parse command line
|
||||||
|
*/
|
||||||
|
|
||||||
|
// List all allowed options
|
||||||
|
core::map<std::string, ValueSpec> allowed_options;
|
||||||
|
allowed_options.insert("help", ValueSpec(VALUETYPE_FLAG));
|
||||||
|
allowed_options.insert("config", ValueSpec(VALUETYPE_STRING,
|
||||||
|
"Load configuration from specified file"));
|
||||||
|
allowed_options.insert("port", ValueSpec(VALUETYPE_STRING));
|
||||||
|
allowed_options.insert("disable-unittests", ValueSpec(VALUETYPE_FLAG));
|
||||||
|
allowed_options.insert("enable-unittests", ValueSpec(VALUETYPE_FLAG));
|
||||||
|
|
||||||
|
Settings cmd_args;
|
||||||
|
|
||||||
|
bool ret = cmd_args.parseCommandLine(argc, argv, allowed_options);
|
||||||
|
|
||||||
|
if(ret == false || cmd_args.getFlag("help"))
|
||||||
|
{
|
||||||
|
dstream<<"Allowed options:"<<std::endl;
|
||||||
|
for(core::map<std::string, ValueSpec>::Iterator
|
||||||
|
i = allowed_options.getIterator();
|
||||||
|
i.atEnd() == false; i++)
|
||||||
|
{
|
||||||
|
dstream<<" --"<<i.getNode()->getKey();
|
||||||
|
if(i.getNode()->getValue().type == VALUETYPE_FLAG)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dstream<<" <value>";
|
||||||
|
}
|
||||||
|
dstream<<std::endl;
|
||||||
|
|
||||||
|
if(i.getNode()->getValue().help != NULL)
|
||||||
|
{
|
||||||
|
dstream<<" "<<i.getNode()->getValue().help
|
||||||
|
<<std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return cmd_args.getFlag("help") ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Basic initialization
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Initialize default settings
|
||||||
|
set_default_settings();
|
||||||
|
|
||||||
|
// Print startup message
|
||||||
|
dstream<<DTIME<<"minetest-c55 server"
|
||||||
|
" with SER_FMT_VER_HIGHEST="<<(int)SER_FMT_VER_HIGHEST
|
||||||
|
<<", ENABLE_TESTS="<<ENABLE_TESTS
|
||||||
|
<<std::endl;
|
||||||
|
|
||||||
|
// Set locale. This is for forcing '.' as the decimal point.
|
||||||
|
std::locale::global(std::locale("C"));
|
||||||
|
// This enables printing all characters in bitmap font
|
||||||
|
setlocale(LC_CTYPE, "en_US");
|
||||||
|
|
||||||
|
// Initialize sockets
|
||||||
|
sockets_init();
|
||||||
|
atexit(sockets_cleanup);
|
||||||
|
|
||||||
|
// Initialize timestamp mutex
|
||||||
|
g_timestamp_mutex.Init();
|
||||||
|
|
||||||
|
/*
|
||||||
|
Initialization
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Read config file
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Path of configuration file in use
|
||||||
|
std::string configpath = "";
|
||||||
|
|
||||||
|
if(cmd_args.exists("config"))
|
||||||
|
{
|
||||||
|
bool r = g_settings.readConfigFile(cmd_args.get("config").c_str());
|
||||||
|
if(r == false)
|
||||||
|
{
|
||||||
|
dstream<<"Could not read configuration from \""
|
||||||
|
<<cmd_args.get("config")<<"\""<<std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
configpath = cmd_args.get("config");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const char *filenames[2] =
|
||||||
|
{
|
||||||
|
"../minetest.conf",
|
||||||
|
"../../minetest.conf"
|
||||||
|
};
|
||||||
|
|
||||||
|
for(u32 i=0; i<2; i++)
|
||||||
|
{
|
||||||
|
bool r = g_settings.readConfigFile(filenames[i]);
|
||||||
|
if(r)
|
||||||
|
{
|
||||||
|
configpath = filenames[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize random seed
|
||||||
|
srand(time(0));
|
||||||
|
|
||||||
|
/*
|
||||||
|
Run unit tests
|
||||||
|
*/
|
||||||
|
if((ENABLE_TESTS && cmd_args.getFlag("disable-unittests") == false)
|
||||||
|
|| cmd_args.getFlag("enable-unittests") == true)
|
||||||
|
{
|
||||||
|
run_tests();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read map parameters from settings
|
||||||
|
|
||||||
|
HMParams hm_params;
|
||||||
|
hm_params.blocksize = g_settings.getU16("heightmap_blocksize");
|
||||||
|
hm_params.randmax = g_settings.get("height_randmax");
|
||||||
|
hm_params.randfactor = g_settings.get("height_randfactor");
|
||||||
|
hm_params.base = g_settings.get("height_base");
|
||||||
|
|
||||||
|
MapParams map_params;
|
||||||
|
map_params.plants_amount = g_settings.getFloat("plants_amount");
|
||||||
|
map_params.ravines_amount = g_settings.getFloat("ravines_amount");
|
||||||
|
|
||||||
|
/*
|
||||||
|
Check parameters
|
||||||
|
*/
|
||||||
|
|
||||||
|
std::cout<<std::endl<<std::endl;
|
||||||
|
|
||||||
|
std::cout
|
||||||
|
<<" .__ __ __ "<<std::endl
|
||||||
|
<<" _____ |__| ____ _____/ |_ ____ _______/ |_ "<<std::endl
|
||||||
|
<<" / \\| |/ \\_/ __ \\ __\\/ __ \\ / ___/\\ __\\"<<std::endl
|
||||||
|
<<"| Y Y \\ | | \\ ___/| | \\ ___/ \\___ \\ | | "<<std::endl
|
||||||
|
<<"|__|_| /__|___| /\\___ >__| \\___ >____ > |__| "<<std::endl
|
||||||
|
<<" \\/ \\/ \\/ \\/ \\/ "<<std::endl
|
||||||
|
<<std::endl
|
||||||
|
<<"Now with more waterish water!"
|
||||||
|
<<std::endl;
|
||||||
|
|
||||||
|
std::cout<<std::endl;
|
||||||
|
|
||||||
|
// Port?
|
||||||
|
u16 port = 30000;
|
||||||
|
if(cmd_args.exists("port"))
|
||||||
|
{
|
||||||
|
port = cmd_args.getU16("port");
|
||||||
|
}
|
||||||
|
else if(g_settings.exists("port"))
|
||||||
|
{
|
||||||
|
port = g_settings.getU16("port");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dstream<<"Please specify port (in config or on command line)"
|
||||||
|
<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
DSTACK("Dedicated server branch");
|
||||||
|
|
||||||
|
std::cout<<std::endl;
|
||||||
|
std::cout<<"========================"<<std::endl;
|
||||||
|
std::cout<<"Running dedicated server"<<std::endl;
|
||||||
|
std::cout<<"========================"<<std::endl;
|
||||||
|
std::cout<<std::endl;
|
||||||
|
|
||||||
|
Server server("../map", hm_params, map_params);
|
||||||
|
server.start(port);
|
||||||
|
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
// This is kind of a hack but can be done like this
|
||||||
|
// because server.step() is very light
|
||||||
|
sleep_ms(30);
|
||||||
|
server.step(0.030);
|
||||||
|
|
||||||
|
static int counter = 0;
|
||||||
|
counter--;
|
||||||
|
if(counter <= 0)
|
||||||
|
{
|
||||||
|
counter = 10;
|
||||||
|
|
||||||
|
core::list<PlayerInfo> list = server.getPlayerInfo();
|
||||||
|
core::list<PlayerInfo>::Iterator i;
|
||||||
|
static u32 sum_old = 0;
|
||||||
|
u32 sum = PIChecksum(list);
|
||||||
|
if(sum != sum_old)
|
||||||
|
{
|
||||||
|
std::cout<<DTIME<<"Player info:"<<std::endl;
|
||||||
|
for(i=list.begin(); i!=list.end(); i++)
|
||||||
|
{
|
||||||
|
i->PrintLine(&std::cout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sum_old = sum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Update configuration file
|
||||||
|
*/
|
||||||
|
if(configpath != "")
|
||||||
|
{
|
||||||
|
g_settings.updateConfigFile(configpath.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
} //try
|
||||||
|
catch(con::PeerNotFoundException &e)
|
||||||
|
{
|
||||||
|
dstream<<DTIME<<"Connection timed out."<<std::endl;
|
||||||
|
}
|
||||||
|
#if CATCH_UNHANDLED_EXCEPTIONS
|
||||||
|
/*
|
||||||
|
This is what has to be done in every thread to get suitable debug info
|
||||||
|
*/
|
||||||
|
catch(std::exception &e)
|
||||||
|
{
|
||||||
|
dstream<<std::endl<<DTIME<<"An unhandled exception occurred: "
|
||||||
|
<<e.what()<<std::endl;
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
debugstreams_deinit();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//END
|
Loading…
Reference in New Issue
Block a user