#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:
// Envlock and conlock should be locked when calling this
void SendMovePlayer(Player *player);
+ // 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);
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;
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;
};
/*