mirror of
https://github.com/minetest/minetest.git
synced 2025-02-17 10:23:47 +01:00
Add player:set_sky() with simple skybox support
This commit is contained in:
@ -1812,6 +1812,14 @@ Player-only: (no-op for other objects)
|
|||||||
^ sets background image for hotbar
|
^ sets background image for hotbar
|
||||||
- hud_set_hotbar_selected_image(texturename)
|
- hud_set_hotbar_selected_image(texturename)
|
||||||
^ sets image for selected item of hotbar
|
^ sets image for selected item of hotbar
|
||||||
|
- set_sky(bgcolor, type, {texture names})
|
||||||
|
^ bgcolor: {r=0...255, g=0...255, b=0...255} or nil, defaults to white
|
||||||
|
^ Available types:
|
||||||
|
- "regular": Uses 0 textures, bgcolor ignored
|
||||||
|
- "skybox": Uses 6 textures, bgcolor used
|
||||||
|
- "plain": Uses 0 textures, bgcolor used
|
||||||
|
^ Note: currently does not work directly in on_joinplayer; use
|
||||||
|
minetest.after(0) in there.
|
||||||
|
|
||||||
InvRef: Reference to an inventory
|
InvRef: Reference to an inventory
|
||||||
methods:
|
methods:
|
||||||
|
@ -2026,6 +2026,25 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
|
|||||||
((LocalPlayer *) player)->hotbar_selected_image = value;
|
((LocalPlayer *) player)->hotbar_selected_image = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(command == TOCLIENT_SET_SKY)
|
||||||
|
{
|
||||||
|
std::string datastring((char *)&data[2], datasize - 2);
|
||||||
|
std::istringstream is(datastring, std::ios_base::binary);
|
||||||
|
|
||||||
|
video::SColor *bgcolor = new video::SColor(readARGB8(is));
|
||||||
|
std::string *type = new std::string(deSerializeString(is));
|
||||||
|
u16 count = readU16(is);
|
||||||
|
std::vector<std::string> *params = new std::vector<std::string>;
|
||||||
|
for(size_t i=0; i<count; i++)
|
||||||
|
params->push_back(deSerializeString(is));
|
||||||
|
|
||||||
|
ClientEvent event;
|
||||||
|
event.type = CE_SET_SKY;
|
||||||
|
event.set_sky.bgcolor = bgcolor;
|
||||||
|
event.set_sky.type = type;
|
||||||
|
event.set_sky.params = params;
|
||||||
|
m_client_event_queue.push_back(event);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
infostream<<"Client: Ignoring unknown command "
|
infostream<<"Client: Ignoring unknown command "
|
||||||
|
@ -133,7 +133,8 @@ enum ClientEventType
|
|||||||
CE_DELETE_PARTICLESPAWNER,
|
CE_DELETE_PARTICLESPAWNER,
|
||||||
CE_HUDADD,
|
CE_HUDADD,
|
||||||
CE_HUDRM,
|
CE_HUDRM,
|
||||||
CE_HUDCHANGE
|
CE_HUDCHANGE,
|
||||||
|
CE_SET_SKY,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ClientEvent
|
struct ClientEvent
|
||||||
@ -217,6 +218,11 @@ struct ClientEvent
|
|||||||
u32 data;
|
u32 data;
|
||||||
v3f *v3fdata;
|
v3f *v3fdata;
|
||||||
} hudchange;
|
} hudchange;
|
||||||
|
struct{
|
||||||
|
video::SColor *bgcolor;
|
||||||
|
std::string *type;
|
||||||
|
std::vector<std::string> *params;
|
||||||
|
} set_sky;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -507,6 +507,18 @@ enum ToClientCommand
|
|||||||
u16 command
|
u16 command
|
||||||
u16 breath
|
u16 breath
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
TOCLIENT_SET_SKY = 0x4f,
|
||||||
|
/*
|
||||||
|
u16 command
|
||||||
|
u8[4] color (ARGB)
|
||||||
|
u8 len
|
||||||
|
u8[len] type
|
||||||
|
u16 count
|
||||||
|
foreach count:
|
||||||
|
u8 len
|
||||||
|
u8[len] param
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ToServerCommand
|
enum ToServerCommand
|
||||||
|
36
src/game.cpp
36
src/game.cpp
@ -1337,6 +1337,8 @@ void the_game(
|
|||||||
|
|
||||||
Sky *sky = NULL;
|
Sky *sky = NULL;
|
||||||
sky = new Sky(smgr->getRootSceneNode(), smgr, -1, client.getEnv().getLocalPlayer());
|
sky = new Sky(smgr->getRootSceneNode(), smgr, -1, client.getEnv().getLocalPlayer());
|
||||||
|
|
||||||
|
scene::ISceneNode* skybox = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
A copy of the local inventory
|
A copy of the local inventory
|
||||||
@ -2462,6 +2464,40 @@ void the_game(
|
|||||||
delete event.hudchange.v2fdata;
|
delete event.hudchange.v2fdata;
|
||||||
delete event.hudchange.sdata;
|
delete event.hudchange.sdata;
|
||||||
}
|
}
|
||||||
|
else if (event.type == CE_SET_SKY)
|
||||||
|
{
|
||||||
|
sky->setVisible(false);
|
||||||
|
if(skybox){
|
||||||
|
skybox->drop();
|
||||||
|
skybox = NULL;
|
||||||
|
}
|
||||||
|
// Handle according to type
|
||||||
|
if(*event.set_sky.type == "regular"){
|
||||||
|
sky->setVisible(true);
|
||||||
|
}
|
||||||
|
else if(*event.set_sky.type == "skybox" &&
|
||||||
|
event.set_sky.params->size() == 6){
|
||||||
|
sky->setFallbackBgColor(*event.set_sky.bgcolor);
|
||||||
|
skybox = smgr->addSkyBoxSceneNode(
|
||||||
|
tsrc->getTexture((*event.set_sky.params)[0]),
|
||||||
|
tsrc->getTexture((*event.set_sky.params)[1]),
|
||||||
|
tsrc->getTexture((*event.set_sky.params)[2]),
|
||||||
|
tsrc->getTexture((*event.set_sky.params)[3]),
|
||||||
|
tsrc->getTexture((*event.set_sky.params)[4]),
|
||||||
|
tsrc->getTexture((*event.set_sky.params)[5]));
|
||||||
|
}
|
||||||
|
// Handle everything else as plain color
|
||||||
|
else {
|
||||||
|
if(*event.set_sky.type != "plain")
|
||||||
|
infostream<<"Unknown sky type: "
|
||||||
|
<<(*event.set_sky.type)<<std::endl;
|
||||||
|
sky->setFallbackBgColor(*event.set_sky.bgcolor);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete event.set_sky.bgcolor;
|
||||||
|
delete event.set_sky.type;
|
||||||
|
delete event.set_sky.params;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1090,6 +1090,45 @@ int ObjectRef::l_hud_set_hotbar_selected_image(lua_State *L)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set_sky(self, bgcolor, type, list)
|
||||||
|
int ObjectRef::l_set_sky(lua_State *L)
|
||||||
|
{
|
||||||
|
ObjectRef *ref = checkobject(L, 1);
|
||||||
|
Player *player = getplayer(ref);
|
||||||
|
if (player == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
video::SColor bgcolor(255,255,255,255);
|
||||||
|
if (!lua_isnil(L, 2))
|
||||||
|
bgcolor = readARGB8(L, 2);
|
||||||
|
|
||||||
|
std::string type = luaL_checkstring(L, 3);
|
||||||
|
|
||||||
|
std::vector<std::string> params;
|
||||||
|
if (lua_istable(L, 4)) {
|
||||||
|
int table = lua_gettop(L);
|
||||||
|
lua_pushnil(L);
|
||||||
|
while (lua_next(L, table) != 0) {
|
||||||
|
// key at index -2 and value at index -1
|
||||||
|
if (lua_isstring(L, -1))
|
||||||
|
params.push_back(lua_tostring(L, -1));
|
||||||
|
else
|
||||||
|
params.push_back("");
|
||||||
|
// removes value, keeps key for next iteration
|
||||||
|
lua_pop(L, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type == "skybox" && params.size() != 6)
|
||||||
|
throw LuaError(L, "skybox expects 6 textures");
|
||||||
|
|
||||||
|
if (!getServer(L)->setSky(player, bgcolor, type, params))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
lua_pushboolean(L, true);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
ObjectRef::ObjectRef(ServerActiveObject *object):
|
ObjectRef::ObjectRef(ServerActiveObject *object):
|
||||||
m_object(object)
|
m_object(object)
|
||||||
{
|
{
|
||||||
@ -1207,5 +1246,6 @@ const luaL_reg ObjectRef::methods[] = {
|
|||||||
luamethod(ObjectRef, hud_set_hotbar_itemcount),
|
luamethod(ObjectRef, hud_set_hotbar_itemcount),
|
||||||
luamethod(ObjectRef, hud_set_hotbar_image),
|
luamethod(ObjectRef, hud_set_hotbar_image),
|
||||||
luamethod(ObjectRef, hud_set_hotbar_selected_image),
|
luamethod(ObjectRef, hud_set_hotbar_selected_image),
|
||||||
|
luamethod(ObjectRef, set_sky),
|
||||||
{0,0}
|
{0,0}
|
||||||
};
|
};
|
||||||
|
@ -225,6 +225,9 @@ private:
|
|||||||
// hud_set_hotbar_selected_image(self, name)
|
// hud_set_hotbar_selected_image(self, name)
|
||||||
static int l_hud_set_hotbar_selected_image(lua_State *L);
|
static int l_hud_set_hotbar_selected_image(lua_State *L);
|
||||||
|
|
||||||
|
// set_sky(self, type, list)
|
||||||
|
static int l_set_sky(lua_State *L);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ObjectRef(ServerActiveObject *object);
|
ObjectRef(ServerActiveObject *object);
|
||||||
|
|
||||||
|
@ -3271,6 +3271,26 @@ void Server::SendHUDSetParam(u16 peer_id, u16 param, const std::string &value)
|
|||||||
m_clients.send(peer_id, 0, data, true);
|
m_clients.send(peer_id, 0, data, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Server::SendSetSky(u16 peer_id, const video::SColor &bgcolor,
|
||||||
|
const std::string &type, const std::vector<std::string> ¶ms)
|
||||||
|
{
|
||||||
|
std::ostringstream os(std::ios_base::binary);
|
||||||
|
|
||||||
|
// Write command
|
||||||
|
writeU16(os, TOCLIENT_SET_SKY);
|
||||||
|
writeARGB8(os, bgcolor);
|
||||||
|
os<<serializeString(type);
|
||||||
|
writeU16(os, params.size());
|
||||||
|
for(size_t i=0; i<params.size(); i++)
|
||||||
|
os<<serializeString(params[i]);
|
||||||
|
|
||||||
|
// Make data buffer
|
||||||
|
std::string s = os.str();
|
||||||
|
SharedBuffer<u8> data((u8 *)s.c_str(), s.size());
|
||||||
|
// Send as reliable
|
||||||
|
m_clients.send(peer_id, 0, data, true);
|
||||||
|
}
|
||||||
|
|
||||||
void Server::SendTimeOfDay(u16 peer_id, u16 time, f32 time_speed)
|
void Server::SendTimeOfDay(u16 peer_id, u16 time, f32 time_speed)
|
||||||
{
|
{
|
||||||
DSTACK(__FUNCTION_NAME);
|
DSTACK(__FUNCTION_NAME);
|
||||||
@ -4435,6 +4455,16 @@ void Server::hudSetHotbarSelectedImage(Player *player, std::string name) {
|
|||||||
SendHUDSetParam(player->peer_id, HUD_PARAM_HOTBAR_SELECTED_IMAGE, name);
|
SendHUDSetParam(player->peer_id, HUD_PARAM_HOTBAR_SELECTED_IMAGE, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Server::setSky(Player *player, const video::SColor &bgcolor,
|
||||||
|
const std::string &type, const std::vector<std::string> ¶ms)
|
||||||
|
{
|
||||||
|
if (!player)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
SendSetSky(player->peer_id, bgcolor, type, params);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void Server::notifyPlayers(const std::wstring msg)
|
void Server::notifyPlayers(const std::wstring msg)
|
||||||
{
|
{
|
||||||
SendChatMessage(PEER_ID_INEXISTENT,msg);
|
SendChatMessage(PEER_ID_INEXISTENT,msg);
|
||||||
|
@ -319,6 +319,9 @@ public:
|
|||||||
|
|
||||||
inline Address getPeerAddress(u16 peer_id)
|
inline Address getPeerAddress(u16 peer_id)
|
||||||
{ return m_con.GetPeerAddress(peer_id); }
|
{ return m_con.GetPeerAddress(peer_id); }
|
||||||
|
|
||||||
|
bool setSky(Player *player, const video::SColor &bgcolor,
|
||||||
|
const std::string &type, const std::vector<std::string> ¶ms);
|
||||||
|
|
||||||
/* con::PeerHandler implementation. */
|
/* con::PeerHandler implementation. */
|
||||||
void peerAdded(con::Peer *peer);
|
void peerAdded(con::Peer *peer);
|
||||||
@ -355,7 +358,9 @@ private:
|
|||||||
void SendHUDChange(u16 peer_id, u32 id, HudElementStat stat, void *value);
|
void SendHUDChange(u16 peer_id, u32 id, HudElementStat stat, void *value);
|
||||||
void SendHUDSetFlags(u16 peer_id, u32 flags, u32 mask);
|
void SendHUDSetFlags(u16 peer_id, u32 flags, u32 mask);
|
||||||
void SendHUDSetParam(u16 peer_id, u16 param, const std::string &value);
|
void SendHUDSetParam(u16 peer_id, u16 param, const std::string &value);
|
||||||
|
void SendSetSky(u16 peer_id, const video::SColor &bgcolor,
|
||||||
|
const std::string &type, const std::vector<std::string> ¶ms);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Send a node removal/addition event to all clients except ignore_id.
|
Send a node removal/addition event to all clients except ignore_id.
|
||||||
Additionally, if far_players!=NULL, players further away than
|
Additionally, if far_players!=NULL, players further away than
|
||||||
|
@ -14,6 +14,8 @@
|
|||||||
//! constructor
|
//! constructor
|
||||||
Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id, LocalPlayer* player):
|
Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id, LocalPlayer* player):
|
||||||
scene::ISceneNode(parent, mgr, id),
|
scene::ISceneNode(parent, mgr, id),
|
||||||
|
m_visible(true),
|
||||||
|
m_fallback_bg_color(255,255,255,255),
|
||||||
m_first_update(true),
|
m_first_update(true),
|
||||||
m_brightness(0.5),
|
m_brightness(0.5),
|
||||||
m_cloud_brightness(0.5),
|
m_cloud_brightness(0.5),
|
||||||
@ -77,6 +79,9 @@ const core::aabbox3d<f32>& Sky::getBoundingBox() const
|
|||||||
//! renders the node.
|
//! renders the node.
|
||||||
void Sky::render()
|
void Sky::render()
|
||||||
{
|
{
|
||||||
|
if(!m_visible)
|
||||||
|
return;
|
||||||
|
|
||||||
video::IVideoDriver* driver = SceneManager->getVideoDriver();
|
video::IVideoDriver* driver = SceneManager->getVideoDriver();
|
||||||
scene::ICameraSceneNode* camera = SceneManager->getActiveCamera();
|
scene::ICameraSceneNode* camera = SceneManager->getActiveCamera();
|
||||||
|
|
||||||
|
18
src/sky.h
18
src/sky.h
@ -53,12 +53,22 @@ public:
|
|||||||
float direct_brightness, bool sunlight_seen);
|
float direct_brightness, bool sunlight_seen);
|
||||||
|
|
||||||
float getBrightness(){ return m_brightness; }
|
float getBrightness(){ return m_brightness; }
|
||||||
video::SColor getBgColor(){ return m_bgcolor; }
|
|
||||||
video::SColor getSkyColor(){ return m_skycolor; }
|
video::SColor getBgColor(){
|
||||||
|
return m_visible ? m_bgcolor : m_fallback_bg_color;
|
||||||
|
}
|
||||||
|
video::SColor getSkyColor(){
|
||||||
|
return m_visible ? m_skycolor : m_fallback_bg_color;
|
||||||
|
}
|
||||||
|
|
||||||
bool getCloudsVisible(){ return m_clouds_visible; }
|
bool getCloudsVisible(){ return m_clouds_visible && m_visible; }
|
||||||
video::SColorf getCloudColor(){ return m_cloudcolor_f; }
|
video::SColorf getCloudColor(){ return m_cloudcolor_f; }
|
||||||
|
|
||||||
|
void setVisible(bool visible){ m_visible = visible; }
|
||||||
|
void setFallbackBgColor(const video::SColor &fallback_bg_color){
|
||||||
|
m_fallback_bg_color = fallback_bg_color;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
core::aabbox3d<f32> Box;
|
core::aabbox3d<f32> Box;
|
||||||
video::SMaterial m_materials[SKY_MATERIAL_COUNT];
|
video::SMaterial m_materials[SKY_MATERIAL_COUNT];
|
||||||
@ -98,6 +108,8 @@ private:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool m_visible;
|
||||||
|
video::SColor m_fallback_bg_color; // Used when m_visible=false
|
||||||
bool m_first_update;
|
bool m_first_update;
|
||||||
float m_time_of_day;
|
float m_time_of_day;
|
||||||
float m_time_brightness;
|
float m_time_brightness;
|
||||||
|
Reference in New Issue
Block a user