+/*
+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.
+*/
+
/*
(c) 2010 Perttu Ahola <celeron55@gmail.com>
*/
#include "environment.h"
#include "common_irrlicht.h"
#include <string>
+#include "utility.h"
#ifdef _WIN32
#include <windows.h>
*/
void addBlock(u16 peer_id, v3s16 pos, u8 flags)
{
+ DSTACK(__FUNCTION_NAME);
+
JMutexAutoLock lock(m_mutex);
if(peer_id != 0)
JMutexAutoLock lock(m_mutex);
return m_queue.size();
}
-
-private:
- core::list<QueuedBlockEmerge*> m_queue;
- JMutex m_mutex;
-};
-
-class SimpleThread : public JThread
-{
- bool run;
- JMutex run_mutex;
-
-public:
-
- SimpleThread():
- JThread(),
- run(true)
+
+ u32 peerItemCount(u16 peer_id)
{
- run_mutex.Init();
- }
+ JMutexAutoLock lock(m_mutex);
- virtual ~SimpleThread()
- {}
+ u32 count = 0;
- virtual void * Thread() = 0;
+ core::list<QueuedBlockEmerge*>::Iterator i;
+ for(i=m_queue.begin(); i!=m_queue.end(); i++)
+ {
+ QueuedBlockEmerge *q = *i;
+ if(q->peer_ids.find(peer_id) != NULL)
+ count++;
+ }
- bool getRun()
- {
- JMutexAutoLock lock(run_mutex);
- return run;
- }
- void setRun(bool a_run)
- {
- JMutexAutoLock lock(run_mutex);
- run = a_run;
+ return count;
}
- void stop()
- {
- setRun(false);
- while(IsRunning())
- sleep_ms(100);
- }
+private:
+ core::list<QueuedBlockEmerge*> m_queue;
+ JMutex m_mutex;
};
class Server;
u8 pending_serialization_version;
RemoteClient():
- m_time_from_building(0.0),
- m_num_blocks_in_emerge_queue(0)
+ m_time_from_building(9999)
{
peer_id = 0;
serialization_version = SER_FMT_VER_INVALID;
pending_serialization_version = SER_FMT_VER_INVALID;
m_nearest_unsent_d = 0;
+ m_nearest_unsent_reset_timer = 0.0;
m_blocks_sent_mutex.Init();
m_blocks_sending_mutex.Init();
+
+ m_dig_mutex.Init();
+ m_dig_time_remaining = 0;
+ m_dig_tool_item = -1;
}
~RemoteClient()
{
void SetBlockNotSent(v3s16 p);
void SetBlocksNotSent(core::map<v3s16, MapBlock*> &blocks);
- void BlockEmerged();
+ //void BlockEmerged();
/*bool IsSendingBlock(v3s16 p)
{
JMutexAutoLock l2(m_blocks_sent_mutex);
JMutexAutoLock l3(m_blocks_sending_mutex);
o<<"RemoteClient "<<peer_id<<": "
- <<"m_num_blocks_in_emerge_queue="
- <<m_num_blocks_in_emerge_queue.get()
<<", m_blocks_sent.size()="<<m_blocks_sent.size()
<<", m_blocks_sending.size()="<<m_blocks_sending.size()
<<", m_nearest_unsent_d="<<m_nearest_unsent_d
// Time from last placing or removing blocks
MutexedVariable<float> m_time_from_building;
+ JMutex m_dig_mutex;
+ float m_dig_time_remaining;
+ // -1 = not digging
+ s16 m_dig_tool_item;
+ v3s16 m_dig_position;
+
private:
/*
All members that are accessed by many threads should
*/
//TODO: core::map<v3s16, MapBlock*> m_active_blocks
+ //NOTE: Not here, it should be server-wide!
// Number of blocks in the emerge queue that have this client as
// a receiver. Used for throttling network usage.
- MutexedVariable<s16> m_num_blocks_in_emerge_queue;
+ //MutexedVariable<s16> m_num_blocks_in_emerge_queue;
/*
Blocks that have been sent to client.
core::map<v3s16, bool> m_blocks_sent;
s16 m_nearest_unsent_d;
v3s16 m_last_center;
+ float m_nearest_unsent_reset_timer;
JMutex m_blocks_sent_mutex;
/*
Blocks that are currently on the line.
NOTE: Every public method should be thread-safe
*/
Server(
- std::string mapsavedir,
- bool creative_mode,
- HMParams hm_params,
- MapParams map_params,
- float objectdata_inverval,
- u16 active_object_range
- );
+ std::string mapsavedir,
+ HMParams hm_params,
+ MapParams map_params
+ );
~Server();
void start(unsigned short port);
void stop();
+ // This is mainly a way to pass the time to the server.
+ // Actual processing is done in an another thread.
void step(float dtime);
+ // This is run by ServerThread and does the actual processing
void AsyncRunStep();
void Receive();
void ProcessData(u8 *data, u32 datasize, u16 peer_id);
// Environment and Connection must be locked when called
void SendBlockNoLock(u16 peer_id, MapBlock *block, u8 ver);
- //void SendBlock(u16 peer_id, MapBlock *block, u8 ver);
//TODO: Sending of many blocks in a single packet
// Environment and Connection must be locked when called
// When called, connection mutex should be locked
RemoteClient* getClient(u16 peer_id);
+
+ /*
+ Update water pressure.
+ This also adds suitable nodes to active_nodes.
+
+ environment has to be locked when calling.
+ */
+ void UpdateBlockWaterPressure(MapBlock *block,
+ core::map<v3s16, MapBlock*> &modified_blocks);
+
+ float m_flowwater_timer;
+ float m_print_info_timer;
+ float m_objectdata_timer;
+ float m_emergethread_trigger_timer;
+ float m_savemap_timer;
// NOTE: If connection and environment are both to be locked,
// environment shall be locked first.
-
JMutex m_env_mutex;
Environment m_env;
BlockEmergeQueue m_emerge_queue;
- // Settings
- bool m_creative_mode;
- float m_objectdata_interval;
- u16 m_active_object_range;
-
+ // Nodes that are destinations of flowing liquid at the moment
+ core::map<v3s16, u8> m_flow_active_nodes;
+
friend class EmergeThread;
friend class RemoteClient;
};