#include "mods.h"
#include "inventorymanager.h"
#include "subgame.h"
+#include "sound.h"
struct LuaState;
typedef struct lua_State lua_State;
class IWritableItemDefManager;
class IWritableNodeDefManager;
class IWritableCraftDefManager;
+class EventManager;
class ServerError : public std::exception
{
u16 peer_id;
};
-struct TextureRequest
+struct MediaRequest
{
std::string name;
- TextureRequest(const std::string &name_=""):
+ MediaRequest(const std::string &name_=""):
name(name_)
{}
};
-struct TextureInformation
+struct MediaInfo
{
std::string path;
std::string sha1_digest;
- TextureInformation(const std::string path_="",
+ MediaInfo(const std::string path_="",
const std::string sha1_digest_=""):
path(path_),
sha1_digest(sha1_digest_)
}
};
+struct ServerSoundParams
+{
+ float gain;
+ std::string to_player;
+ enum Type{
+ SSP_LOCAL=0,
+ SSP_POSITIONAL=1,
+ SSP_OBJECT=2
+ } type;
+ v3f pos;
+ u16 object;
+ float max_hear_distance;
+ bool loop;
+
+ ServerSoundParams():
+ gain(1.0),
+ to_player(""),
+ type(SSP_LOCAL),
+ pos(0,0,0),
+ object(0),
+ max_hear_distance(32*BS),
+ loop(false)
+ {}
+
+ v3f getPos(ServerEnvironment *env, bool *pos_exists) const
+ {
+ if(pos_exists) *pos_exists = false;
+ switch(type){
+ case SSP_LOCAL:
+ return v3f(0,0,0);
+ case SSP_POSITIONAL:
+ if(pos_exists) *pos_exists = true;
+ return pos;
+ case SSP_OBJECT: {
+ if(object == 0)
+ return v3f(0,0,0);
+ ServerActiveObject *sao = env->getActiveObject(object);
+ if(!sao)
+ return v3f(0,0,0);
+ if(pos_exists) *pos_exists = true;
+ return sao->getBasePosition(); }
+ }
+ return v3f(0,0,0);
+ }
+};
+
+struct ServerPlayingSound
+{
+ ServerSoundParams params;
+ std::set<u16> clients; // peer ids
+};
+
class RemoteClient
{
public:
core::list<PlayerInfo> getPlayerInfo();
- /*u32 getDayNightRatio()
- {
- return time_to_daynight_ratio(m_time_of_day.get());
- }*/
-
// Environment must be locked when called
void setTimeOfDay(u32 time)
{
m_shutdown_requested = true;
}
-
// Envlock and conlock should be locked when calling this
void SendMovePlayer(Player *player);
- u64 getPlayerAuthPrivs(const std::string &name)
- {
- try{
- return m_authmanager.getPrivs(name);
- }
- catch(AuthNotFoundException &e)
- {
- dstream<<"WARNING: Auth not found for "<<name<<std::endl;
- return 0;
- }
- }
-
- void setPlayerAuthPrivs(const std::string &name, u64 privs)
- {
- try{
- return m_authmanager.setPrivs(name, privs);
- }
- catch(AuthNotFoundException &e)
- {
- dstream<<"WARNING: Auth not found for "<<name<<std::endl;
- }
- }
+ // Returns -1 if failed, sound handle on success
+ // Envlock + conlock
+ s32 playSound(const SimpleSoundSpec &spec, const ServerSoundParams ¶ms);
+ void stopSound(s32 handle);
+
+ // Thread-safe
+ u64 getPlayerAuthPrivs(const std::string &name);
+ void setPlayerAuthPrivs(const std::string &name, u64 privs);
+ u64 getPlayerEffectivePrivs(const std::string &name);
// Changes a player's password, password must be given as plaintext
// If the player doesn't exist, a new entry is added to the auth manager
virtual ICraftDefManager* getCraftDefManager();
virtual ITextureSource* getTextureSource();
virtual u16 allocateUnknownNodeId(const std::string &name);
+ virtual ISoundManager* getSoundManager();
+ virtual MtEventManager* getEventManager();
IWritableItemDefManager* getWritableItemDefManager();
IWritableNodeDefManager* getWritableNodeDefManager();
// Sends blocks to clients (locks env and con on its own)
void SendBlocks(float dtime);
- void PrepareTextures();
-
- void SendTextureAnnouncement(u16 peer_id);
-
- void SendTexturesRequested(u16 peer_id,core::list<TextureRequest> tosend);
+ void fillMediaCache();
+ void sendMediaAnnouncement(u16 peer_id);
+ void sendRequestedMedia(u16 peer_id,
+ const core::list<MediaRequest> &tosend);
/*
Something random
// functionality
bool m_simple_singleplayer_mode;
- // Equivalent of /usr/share/minetest/server
- std::string m_path_share;
-
// Thread can set; step() will throw as ServerError
MutexedVariable<std::string> m_async_fatal_error;
// Craft definition manager
IWritableCraftDefManager *m_craftdef;
+ // Event manager
+ EventManager *m_event;
+
// Mods
core::list<ModSpec> m_mods;
Time related stuff
*/
- // 0-23999
- //MutexedVariable<u32> m_time_of_day;
- // Used to buffer dtime for adding to m_time_of_day
- float m_time_counter;
// Timer for sending time of day over network
float m_time_of_day_send_timer;
// Uptime of server in seconds
friend class EmergeThread;
friend class RemoteClient;
- std::map<std::string,TextureInformation> m_Textures;
+ std::map<std::string,MediaInfo> m_media;
+
+ /*
+ Sounds
+ */
+ std::map<s32, ServerPlayingSound> m_playing_sounds;
+ s32 m_next_sound_id;
};
/*