aboutsummaryrefslogtreecommitdiff
path: root/builtin/game/misc.lua
Commit message (Collapse)AuthorAge
* Builtin: Replace deprecated function calls (#7561)SmallJoker2018-07-17
|
* Builtin/../misc.lua: Replace minetest. with core., improve codestyle (#7540)ClobberXD2018-07-09
|
* Make the server status message customizable (#7357)SmallJoker2018-07-01
| | | | Remove now redundant setting show_statusline_on_connect Improve documentation of `minetest.get_server_status`
* is_area_protected: Rename from intersects_protection (#7073)SmallJoker2018-02-25
| | | | | | * is_area_protected: Rename from intersects_protection Return first protected position Clarify docs: Mods may overwrite the function
* Add minetest.is_player (#7013)you2018-02-05
| | | | | | * Add minetest.is_player * First use for is_player
* Intersects_protection(): Move from Minetest Game to builtin (#6952)Paramat2018-01-23
| | | | | A useful function that applies 'core.is_protected()' to a 3D lattice of points evenly spaced throughout a defined volume, with a parameter for the maximum spacing of points.
* Allow the join/leave message to be overridden by mods.red-0012017-09-11
|
* Use a settings object for the main settingsShadowNinja2017-05-06
| | | | | | | This unifies the settings APIs. This also unifies the sync and async registration APIs, since the async registration API did not support adding non-functions to the API table.
* Implement delayed server shutdown with cancelation (#4664)Loïc Blot2017-04-15
|
* Give CSM access to use `core.colorize()` (#5113)red-0012017-03-17
|
* [CSM] sound_play & sound_stop support + client_lua_api doc (#5096)Loïc Blot2017-03-13
| | | | | | | | | | * squashed: CSM: Implement register_globalstep * Re-use fatal error mechanism from server to disconnect client on CSM error * Little client functions cleanups * squashed: CSM: add core.after function * core.after is shared code between client & server * ModApiUtil get_us_time feature enabled for client
* Add minetest.player_exists() (#5064)rubenwardy2017-01-18
|
* Don't send a join message in singleplayer mode.red-0012016-12-03
|
* Make supplying empty formspec strings close the formspec (#4737)orwell962016-11-23
| | | This will only happen if the formname matches or if formname is "".
* Fix typo in core.after (#4560)Rui2016-10-01
|
* Move on join and on leave messages to lua (#4460)Xunto2016-08-22
|
* Builtin: Fix check for a player object in core.check_player_privsTim2016-07-26
| | | | | | | core.check_player_privs accepts as first argument a name or player object, but just tested for a string. This caused crashes inside builtin, when being passed any unexpected types. This provides a better (duck-typing like) test, better error reporting.
* Add colored text (not only colored chat).Ekdohibs2016-05-31
| | | | | Add documentation, move files to a proper place and avoid memory leaks. Make it work with most kind of texts, and allow backgrounds too.
* Colored chat working as expected for both freetype and non-freetype builds. ↵TriBlade92016-05-31
| | | | @nerzhul improvements * Add unit tests * Fix coding style * move guiChatConsole.hpp to client/
* Fix timer initialization.Auke Kok2016-04-21
| | | | | | | This fixes the problem that the first timer tick is an overrun and causes all timers to expire immediately. replaces #4003
* Faster insertion into tableRui9142016-03-06
|
* Add Lua interface to HTTPFetchRequestJeija2016-02-22
| | | | | | | | | | This allows mods to perform both asynchronous and synchronous HTTP requests. Mods are only granted access to HTTP APIs if either mod security is disabled or if they are whitelisted in any of the the secure.http_mods and secure.trusted_mods settings. Adds httpfetch_caller_alloc_secure to generate random, non-predictable caller IDs so that lua mods cannot spy on each others HTTP queries.
* New timer design.Auke Kok2016-01-29
| | | | | | | | | | | | | | | | | | | | | | | I could honestly not make much sense of the timer implementation that was here. Instead I've implemented the type of timer algorithm that I've used before, and tested it instead. The concept is extremely simple: all timers are put in an ordered list. We check every server tick if any of the timers have elapsed, and execute the function associated with this timer. We know that many timers by themselves cause new timers to be added to this list, so we iterate *backwards* over the timer list. This means that new timers being added while timers are being executed, can never be executed in the same function pass, as they are always appended to the table *after* the end of the table, which we will never reach in the current pass over all the table elements. We switch time keeping to minetest.get_us_time(). dtime is likely unreliable and we have our own high-res timer that we can fix if it is indeed broken. This removes the need to do any sort of time keeping.
* Add more ways to pass data to check_player_privsRobert Zenz2015-10-22
| | | | | | | | | | | The callback can now be invoked with either the player object or name as the first parameter, and with either a table or a list of strings, like this: minetest.check_player_privs(player_name, { shout = true, fly = true }) minetest.check_player_privs(player_name, "shout", "fly") minetest.check_player_privs(player, { shout = true, fly = true }) minetest.check_player_privs(player, "shout", "fly")
* Add /emergeblocks command and core.emerge_area() Lua APIkwolekr2015-09-23
|
* SAPI: Track last executed mod and include in error messageskwolekr2015-08-12
|
* Decrease minetest.after globalstep lagHybridDog2015-06-06
| | | | | | * abort if theres no active timer * only reduce the timer.time of all timers when its necessary * move updating timers_to_add into a seperate function
* Add code to support raillike group namesNovatux2015-05-12
|
* Simplify deleteblocks chat command argument parsingkwolekr2015-01-15
| | | | | Add optional core.pos_to_string decimal place rounding Move core.string_to_pos to builtin/common/misc_helpers.lua for consistency
* Fix indexing error in timer processingZefram2014-07-16
|
* Use "core" namespace internallyShadowNinja2014-05-08
|
* Organize builtin into subdirectoriesShadowNinja2014-05-07
hl opt">) {} ~CGUITTGlyphPage() { if (texture) { if (driver) driver->removeTexture(texture); else texture->drop(); } } //! Create the actual page texture, bool createPageTexture(const u8& pixel_mode, const core::dimension2du& texture_size) { if( texture ) return false; bool flgmip = driver->getTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS); driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false); #if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8 bool flgcpy = driver->getTextureCreationFlag(video::ETCF_ALLOW_MEMORY_COPY); driver->setTextureCreationFlag(video::ETCF_ALLOW_MEMORY_COPY, true); #endif // Set the texture color format. switch (pixel_mode) { case FT_PIXEL_MODE_MONO: texture = driver->addTexture(texture_size, name, video::ECF_A1R5G5B5); break; case FT_PIXEL_MODE_GRAY: default: texture = driver->addTexture(texture_size, name, video::ECF_A8R8G8B8); break; } // Restore our texture creation flags. driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, flgmip); #if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8 driver->setTextureCreationFlag(video::ETCF_ALLOW_MEMORY_COPY, flgcpy); #endif return texture ? true : false; } //! Add the glyph to a list of glyphs to be paged. //! This collection will be cleared after updateTexture is called. void pushGlyphToBePaged(const SGUITTGlyph* glyph) { glyph_to_be_paged.push_back(glyph); } //! Updates the texture atlas with new glyphs. void updateTexture() { if (!dirty) return; void* ptr = texture->lock(); video::ECOLOR_FORMAT format = texture->getColorFormat(); core::dimension2du size = texture->getOriginalSize(); video::IImage* pageholder = driver->createImageFromData(format, size, ptr, true, false); for (u32 i = 0; i < glyph_to_be_paged.size(); ++i) { const SGUITTGlyph* glyph = glyph_to_be_paged[i]; if (glyph && glyph->isLoaded) { if (glyph->surface) { glyph->surface->copyTo(pageholder, glyph->source_rect.UpperLeftCorner); glyph->surface->drop(); glyph->surface = 0; } else { ; // TODO: add error message? //currently, if we failed to create the image, just ignore this operation. } } } pageholder->drop(); texture->unlock(); glyph_to_be_paged.clear(); dirty = false; } video::ITexture* texture; u32 available_slots; u32 used_slots; bool dirty; core::array<core::vector2di> render_positions; core::array<core::recti> render_source_rects; private: core::array<const SGUITTGlyph*> glyph_to_be_paged; video::IVideoDriver* driver; io::path name; }; //! Class representing a TrueType font. class CGUITTFont : public IGUIFont { public: //! Creates a new TrueType font and returns a pointer to it. The pointer must be drop()'ed when finished. //! \param env The IGUIEnvironment the font loads out of. //! \param filename The filename of the font. //! \param size The size of the font glyphs in pixels. Since this is the size of the individual glyphs, the true height of the font may change depending on the characters used. //! \param antialias set the use_monochrome (opposite to antialias) flag //! \param transparency set the use_transparency flag //! \return Returns a pointer to a CGUITTFont. Will return 0 if the font failed to load. static CGUITTFont* createTTFont(IGUIEnvironment *env, const io::path& filename, const u32 size, const bool antialias = true, const bool transparency = true, const u32 shadow = 0, const u32 shadow_alpha = 255); static CGUITTFont* createTTFont(IrrlichtDevice *device, const io::path& filename, const u32 size, const bool antialias = true, const bool transparency = true); static CGUITTFont* create(IGUIEnvironment *env, const io::path& filename, const u32 size, const bool antialias = true, const bool transparency = true); static CGUITTFont* create(IrrlichtDevice *device, const io::path& filename, const u32 size, const bool antialias = true, const bool transparency = true); //! Destructor virtual ~CGUITTFont(); //! Sets the amount of glyphs to batch load. virtual void setBatchLoadSize(u32 batch_size) { batch_load_size = batch_size; } //! Sets the maximum texture size for a page of glyphs. virtual void setMaxPageTextureSize(const core::dimension2du& texture_size) { max_page_texture_size = texture_size; } //! Get the font size. virtual u32 getFontSize() const { return size; } //! Check the font's transparency. virtual bool isTransparent() const { return use_transparency; } //! Check if the font auto-hinting is enabled. //! Auto-hinting is FreeType's built-in font hinting engine. virtual bool useAutoHinting() const { return use_auto_hinting; } //! Check if the font hinting is enabled. virtual bool useHinting() const { return use_hinting; } //! Check if the font is being loaded as a monochrome font. //! The font can either be a 256 color grayscale font, or a 2 color monochrome font. virtual bool useMonochrome() const { return use_monochrome; } //! Tells the font to allow transparency when rendering. //! Default: true. //! \param flag If true, the font draws using transparency. virtual void setTransparency(const bool flag); //! Tells the font to use monochrome rendering. //! Default: false. //! \param flag If true, the font draws using a monochrome image. If false, the font uses a grayscale image. virtual void setMonochrome(const bool flag); //! Enables or disables font hinting. //! Default: Hinting and auto-hinting true. //! \param enable If false, font hinting is turned off. If true, font hinting is turned on. //! \param enable_auto_hinting If true, FreeType uses its own auto-hinting algorithm. If false, it tries to use the algorithm specified by the font. virtual void setFontHinting(const bool enable, const bool enable_auto_hinting = true); //! Draws some text and clips it to the specified rectangle if wanted. virtual void draw(const core::stringw& text, const core::rect<s32>& position, video::SColor color, bool hcenter=false, bool vcenter=false, const core::rect<s32>* clip=0); virtual void draw(const EnrichedString& text, const core::rect<s32>& position, video::SColor color, bool hcenter=false, bool vcenter=false, const core::rect<s32>* clip=0); //! Returns the dimension of a character produced by this font. virtual core::dimension2d<u32> getCharDimension(const wchar_t ch) const; //! Returns the dimension of a text string. virtual core::dimension2d<u32> getDimension(const wchar_t* text) const; virtual core::dimension2d<u32> getDimension(const core::ustring& text) const; //! Calculates the index of the character in the text which is on a specific position. virtual s32 getCharacterFromPos(const wchar_t* text, s32 pixel_x) const; virtual s32 getCharacterFromPos(const core::ustring& text, s32 pixel_x) const; //! Sets global kerning width for the font. virtual void setKerningWidth(s32 kerning); //! Sets global kerning height for the font. virtual void setKerningHeight(s32 kerning); //! Gets kerning values (distance between letters) for the font. If no parameters are provided, virtual s32 getKerningWidth(const wchar_t* thisLetter=0, const wchar_t* previousLetter=0) const; virtual s32 getKerningWidth(const uchar32_t thisLetter=0, const uchar32_t previousLetter=0) const; //! Returns the distance between letters virtual s32 getKerningHeight() const; //! Define which characters should not be drawn by the font. virtual void setInvisibleCharacters(const wchar_t *s); virtual void setInvisibleCharacters(const core::ustring& s); //! Get the last glyph page if there's still available slots. //! If not, it will return zero. CGUITTGlyphPage* getLastGlyphPage() const; //! Create a new glyph page texture. //! \param pixel_mode the pixel mode defined by FT_Pixel_Mode //should be better typed. fix later. CGUITTGlyphPage* createGlyphPage(const u8& pixel_mode); //! Get the last glyph page's index. u32 getLastGlyphPageIndex() const { return Glyph_Pages.size() - 1; } //! Create corresponding character's software image copy from the font, //! so you can use this data just like any ordinary video::IImage. //! \param ch The character you need virtual video::IImage* createTextureFromChar(const uchar32_t& ch); //! This function is for debugging mostly. If the page doesn't exist it returns zero. //! \param page_index Simply return the texture handle of a given page index. virtual video::ITexture* getPageTextureByIndex(const u32& page_index) const; //! Add a list of scene nodes generated by putting font textures on the 3D planes. virtual core::array<scene::ISceneNode*> addTextSceneNode (const wchar_t* text, scene::ISceneManager* smgr, scene::ISceneNode* parent = 0, const video::SColor& color = video::SColor(255, 0, 0, 0), bool center = false ); protected: bool use_monochrome; bool use_transparency; bool use_hinting; bool use_auto_hinting; u32 size; u32 batch_load_size; core::dimension2du max_page_texture_size; private: // Manages the FreeType library. static FT_Library c_library; static core::map<io::path, SGUITTFace*> c_faces; static bool c_libraryLoaded; static scene::IMesh* shared_plane_ptr_; static scene::SMesh shared_plane_; CGUITTFont(IGUIEnvironment *env); bool load(const io::path& filename, const u32 size, const bool antialias, const bool transparency); void reset_images(); void update_glyph_pages() const; void update_load_flags() { // Set up our loading flags. load_flags = FT_LOAD_DEFAULT | FT_LOAD_RENDER; if (!useHinting()) load_flags |= FT_LOAD_NO_HINTING; if (!useAutoHinting()) load_flags |= FT_LOAD_NO_AUTOHINT; if (useMonochrome()) load_flags |= FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO | FT_RENDER_MODE_MONO; else load_flags |= FT_LOAD_TARGET_NORMAL; } u32 getWidthFromCharacter(wchar_t c) const; u32 getWidthFromCharacter(uchar32_t c) const; u32 getHeightFromCharacter(wchar_t c) const; u32 getHeightFromCharacter(uchar32_t c) const; u32 getGlyphIndexByChar(wchar_t c) const; u32 getGlyphIndexByChar(uchar32_t c) const; core::vector2di getKerning(const wchar_t thisLetter, const wchar_t previousLetter) const; core::vector2di getKerning(const uchar32_t thisLetter, const uchar32_t previousLetter) const; core::dimension2d<u32> getDimensionUntilEndOfLine(const wchar_t* p) const; void createSharedPlane(); irr::IrrlichtDevice* Device; gui::IGUIEnvironment* Environment; video::IVideoDriver* Driver; io::path filename; FT_Face tt_face; FT_Size_Metrics font_metrics; FT_Int32 load_flags; mutable core::array<CGUITTGlyphPage*> Glyph_Pages; mutable core::array<SGUITTGlyph> Glyphs; s32 GlobalKerningWidth; s32 GlobalKerningHeight; core::ustring Invisible; u32 shadow_offset; u32 shadow_alpha; }; } // end namespace gui } // end namespace irr #endif // __C_GUI_TTFONT_H_INCLUDED__