#ifndef SERVER
video::ITexture * getImage()
{
+ std::string basename;
if(m_toolname == "WPick")
- return g_irrlicht->getTexture("../data/tool_wpick.png");
- if(m_toolname == "STPick")
- return g_irrlicht->getTexture("../data/tool_stpick.png");
+ basename = "../data/tool_wpick.png";
+ else if(m_toolname == "STPick")
+ basename = "../data/tool_stpick.png";
// Default to cloud texture
- return g_irrlicht->getTexture(tile_texture_path_get(TILE_CLOUD));
+ else
+ basename = tile_texture_path_get(TILE_CLOUD);
+
+ /*
+ Calculate some progress value with sane amount of
+ maximum states
+ */
+ u32 maxprogress = 30;
+ u32 toolprogress = (65535-m_wear)/(65535/maxprogress);
+
+ // Make texture name for the new texture with a progress bar
+ std::ostringstream os;
+ os<<basename<<"-toolprogress-"<<toolprogress;
+ std::string finalname = os.str();
+
+ float value_f = (float)toolprogress / (float)maxprogress;
+
+ // Get such a texture
+ TextureMod *mod = new ProgressBarTextureMod(value_f);
+ return g_irrlicht->getTexture(TextureSpec(finalname, basename, mod));
}
#endif
std::string getText()
{
- std::ostringstream os;
+ return "";
+
+ /*std::ostringstream os;
u16 f = 4;
u16 d = 65535/f;
u16 i;
os<<'X';
for(; i<f; i++)
os<<'-';
- return os.str();
+ return os.str();*/
/*std::ostringstream os;
os<<m_toolname;
return newtexture;
}
-#if 0
-video::ITexture * createAlphaBlitTexture(const char *name, video::ITexture *base,
- video::ITexture *other, v2u32 size, v2s32 pos_base, v2s32 pos_other)
+video::ITexture * ProgressBarTextureMod::make(video::ITexture *original,
+ const char *newname, video::IVideoDriver* driver)
{
- if(g_device == NULL)
- return NULL;
- video::IVideoDriver* driver = g_device->getVideoDriver();
-
- core::dimension2d<u32> dim(size.X, size.Y);
+ core::position2d<s32> pos_base(0, 0);
+ core::dimension2d<u32> dim = original->getOriginalSize();
- video::IImage *baseimage = driver->createImage(
- base,
- core::position2d<s32>(pos_base.X, pos_base.Y),
- dim);
+ video::IImage *baseimage = driver->createImage(original, pos_base, dim);
assert(baseimage);
-
- video::IImage *otherimage = driver->createImage(
- other,
- core::position2d<s32>(pos_other.X, pos_other.Y),
- dim);
- assert(sourceimage);
- otherimage->copyToWithAlpha(baseimage, v2s32(0,0),
- core::rect<s32>(v2s32(0,0), dim),
- video::SColor(255,255,255,255),
- core::rect<s32>(v2s32(0,0), dim));
- otherimage->drop();
+ core::dimension2d<u32> size = baseimage->getDimension();
- video::ITexture *newtexture = driver->addTexture(name, baseimage);
+ u32 barheight = 1;
+ u32 barpad_x = 1;
+ u32 barpad_y = 1;
+ u32 barwidth = size.Width - barpad_x*2;
+ v2u32 barpos(barpad_x, size.Height - barheight - barpad_y);
+
+ u32 barvalue_i = round((float)barwidth * value);
+
+ video::SColor active(255,255,0,0);
+ video::SColor inactive(255,0,0,0);
+ for(u32 x0=0; x0<barwidth; x0++)
+ {
+ video::SColor *c;
+ if(x0 < barvalue_i)
+ c = &active;
+ else
+ c = &inactive;
+ u32 x = x0 + barpos.X;
+ for(u32 y=barpos.Y; y<barpos.Y+barheight; y++)
+ {
+ baseimage->setPixel(x,y, *c);
+ }
+ }
+
+ video::ITexture *newtexture = driver->addTexture(newname, baseimage);
baseimage->drop();
return newtexture;
}
-#endif
u16 progression;
};
+struct ProgressBarTextureMod: public TextureMod
+{
+ // value is from 0.0 to 1.0
+ ProgressBarTextureMod(float a_value)
+ {
+ value = a_value;
+ }
+
+ virtual video::ITexture * make(video::ITexture *original,
+ const char *newname, video::IVideoDriver* driver);
+
+ float value;
+};
+
/*
A class for specifying a requested texture
*/
Doing now:\r
======================================================================\r
\r
-TODO: Tool capability table\r
+TODO: Tool capability table: Which materials, at what speed, how much\r
+ wearing\r
TODO: Transferring of the table from server to client\r
\r
======================================================================\r
}\r
}\r
}\r
+ else if(n.d == CONTENT_TORCH)\r
+ {\r
+ dig_time_complete = 0.0;\r
+ }\r
\r
- dig_index = (u16)((float)CRACK_ANIMATION_LENGTH\r
- * dig_time/dig_time_complete);\r
+ if(dig_time_complete >= 0.001)\r
+ {\r
+ dig_index = (u16)((float)CRACK_ANIMATION_LENGTH\r
+ * dig_time/dig_time_complete);\r
+ }\r
+ // This is for torches\r
+ else\r
+ {\r
+ dig_index = CRACK_ANIMATION_LENGTH;\r
+ }\r
\r
if(dig_index < CRACK_ANIMATION_LENGTH)\r
{\r
\r
nodig_delay_counter = dig_time_complete\r
/ (float)CRACK_ANIMATION_LENGTH;\r
+\r
+ // We don't want a corresponding delay to\r
+ // very time consuming nodes\r
+ if(nodig_delay_counter > 0.5)\r
+ {\r
+ nodig_delay_counter = 0.5;\r
+ }\r
+ // We want a slight delay to very little\r
+ // time consuming nodes\r
+ if(nodig_delay_counter < 0.15)\r
+ {\r
+ nodig_delay_counter = 0.15;\r
+ }\r
}\r
\r
dig_time += dtime;\r
coal_rareness = 1;
if(rand()%coal_rareness == 0)
{
- for(s16 i=0; i<coal_amount; i++)
+ u16 a = rand() % 16;
+ u16 amount = coal_amount * a*a*a / 1000;
+ for(s16 i=0; i<amount; i++)
{
v3s16 cp(
(rand()%(MAP_BLOCKSIZE-2))+1,
#ifndef SERVER
virtual void clientStep(float dtime)
{
- m_yaw += dtime * 90;
+ m_yaw += dtime * 60;
if(m_yaw >= 360.)
m_yaw -= 360.;
/*
3: Digging completed
*/
- if(action == 3)
+ else if(action == 3)
{
// Mandatory parameter; actually used for nothing
core::map<v3s16, MapBlock*> modified_blocks;