]> git.lizzy.rs Git - dragonfireclient.git/log
dragonfireclient.git
12 months agoMerge pull request #59 from PrairieAstronomer/readme_irrlicht_change master
Cora de la Mouche [Mon, 10 Apr 2023 22:34:58 +0000 (00:34 +0200)]
Merge pull request #59 from PrairieAstronomer/readme_irrlicht_change

Add exact irrlichtmt version to the clone command

13 months agoAdd exact irrlichtmt version to the clone command 59/head
PrairieWind [Sat, 11 Mar 2023 20:20:00 +0000 (13:20 -0700)]
Add exact irrlichtmt version to the clone command

22 months agoFix upstream merge issues
Elias Fleckenstein [Tue, 7 Jun 2022 01:31:06 +0000 (03:31 +0200)]
Fix upstream merge issues

22 months agoMerge branch 'master' of https://github.com/minetest/minetest
Elias Fleckenstein [Tue, 7 Jun 2022 01:19:05 +0000 (03:19 +0200)]
Merge branch 'master' of https://github.com/minetest/minetest

22 months agocore.formspec_escape: Restore backwards compat
Lars Müller [Mon, 6 Jun 2022 16:32:28 +0000 (18:32 +0200)]
core.formspec_escape: Restore backwards compat

Support numbers as arguments by using `string.gsub(text, ...)` instead of `text:gsub(...)` which will coerce `text` to a string

22 months agoRemove invalid fps_max on Mac
paradust7 [Mon, 6 Jun 2022 03:05:42 +0000 (03:05 +0000)]
Remove invalid fps_max on Mac

22 months agoBug report template: ask contributors to provide a code snippet (#12405)
Zughy [Sun, 5 Jun 2022 20:12:39 +0000 (22:12 +0200)]
Bug report template: ask contributors to provide a code snippet (#12405)

22 months agoFix crash in commit a69b7abe00fb818fd88f3cd04e7f9997ffd21072
sfan5 [Sun, 5 Jun 2022 16:59:53 +0000 (18:59 +0200)]
Fix crash in commit a69b7abe00fb818fd88f3cd04e7f9997ffd21072

22 months agoAndroid: Add support for sharing debug.txt (#12370)
rubenwardy [Sun, 5 Jun 2022 16:42:09 +0000 (17:42 +0100)]
Android: Add support for sharing debug.txt (#12370)

22 months agoImprove LBMManager::applyLBMs() code
sfan5 [Sun, 5 Jun 2022 14:58:48 +0000 (16:58 +0200)]
Improve LBMManager::applyLBMs() code

Fixes a possible bug for lbms on content ID zero and removes unsafe casts.

22 months agoAdd register dialog to separate login/register (#12185)
rubenwardy [Sun, 5 Jun 2022 15:47:38 +0000 (16:47 +0100)]
Add register dialog to separate login/register (#12185)

New users find Minetest's account system confusing.
This change moves username/password to a new dialog,
with login and register buttons added to the Join Game tab.

The old registration confirmation dialog is removed in
favour of the new dialog.

Fixes #8138

22 months agoHide "Autosave Screen Size" on Android
ROllerozxa [Sun, 5 Jun 2022 13:20:39 +0000 (15:20 +0200)]
Hide "Autosave Screen Size" on Android

22 months agoFix BSD iconv declaration
savilli [Sun, 5 Jun 2022 13:20:29 +0000 (16:20 +0300)]
Fix BSD iconv declaration

22 months agoDocument itemstrings with metadata
Lars Mueller [Fri, 3 Jun 2022 11:09:03 +0000 (13:09 +0200)]
Document itemstrings with metadata

22 months agofix integer overflow in mapgen (#11641)
JosiahWI [Sat, 4 Jun 2022 00:51:58 +0000 (19:51 -0500)]
fix integer overflow in mapgen (#11641)

* fix integer overflow in mapgen

Some calculations involving the magic seed had overflow because the result of an intermediate arithmetic step could not fit in an s32. By making the magic seed unsigned, the other operand in the equation will be cast to unsigned, and possibly other operands or intermediate operands. This will result in unexpected behavior if an operand is negative, which is technically possible, but logically should not happen.

* comment noise2d bitshift

While working through the code I was momentarily concerned that the right bitshift in noise2d could fill ones in some cases. It turns out that with signed integers, this is indeed true, but this one is shifting an unsigned integer, so the behavior is as expected. I put a comment here to clarify this, in case someone else wonders the same thing down the line.

* noise2d and noise3d unittests

I have added 3 tests each for noise2d and noise3d, testing all zero inputs, a very large seed (case which caused UB in the old implementation) and some fun primes I picked for no particular reason. This should be sufficient to demonstrate that the behavior of the new implementation has not changed. I used uniform initialization because it is a good feature of C++11. Please do not explode.

* uncomment the noise2d bitshift

This reverts commit 583b77ee9f1ad6bb77340ebb5ba51eb9a88ff51c. It's a
well-defined language semantic; it doesn't need to be commented.

* code cleanliness

22 months agoProperly keep noclip state in Game and ClientMap
sfan5 [Sat, 21 May 2022 18:29:44 +0000 (20:29 +0200)]
Properly keep noclip state in Game and ClientMap

22 months agoRemove obsolete eye_height related workaround
sfan5 [Sat, 21 May 2022 17:27:35 +0000 (19:27 +0200)]
Remove obsolete eye_height related workaround

This was added a long time ago in 42bbd5c9ae06a8d8ffb7915599097ead6f848755
and meant to fix prevent the view becoming black when jumping into a
ceiling, this no longer happens today.

22 months agoAdd helper functions to make tool usable n times (#12047)
Wuzzy [Fri, 3 Jun 2022 19:47:04 +0000 (19:47 +0000)]
Add helper functions to make tool usable n times (#12047)

22 months agoRework main menu confirmation dialogs (#12356)
ROllerozxa [Fri, 3 Jun 2022 19:46:37 +0000 (21:46 +0200)]
Rework main menu confirmation dialogs (#12356)

22 months agoDocs: remove unimplemented `preserve` field in crafting recipes
Zughy [Fri, 3 Jun 2022 10:08:58 +0000 (12:08 +0200)]
Docs: remove unimplemented `preserve` field in crafting recipes

22 months agoMerge branch 'master' of https://github.com/minetest/minetest
Elias Fleckenstein [Thu, 2 Jun 2022 18:54:02 +0000 (20:54 +0200)]
Merge branch 'master' of https://github.com/minetest/minetest

23 months agoFix use-after-free in node meta cleanup
sfan5 [Sun, 29 May 2022 14:00:44 +0000 (16:00 +0200)]
Fix use-after-free in node meta cleanup

bug introduced in 8908a9101608d3343023b470743ef63f1c44b0b7

23 months agoReject registering node with empty name
sfan5 [Thu, 26 May 2022 20:28:33 +0000 (22:28 +0200)]
Reject registering node with empty name

fixes #10769

23 months agoMinor code improvements around active block keeping
sfan5 [Thu, 26 May 2022 20:22:48 +0000 (22:22 +0200)]
Minor code improvements around active block keeping

23 months agoImmediately activate blocks when a player joins
sfan5 [Thu, 26 May 2022 20:14:22 +0000 (22:14 +0200)]
Immediately activate blocks when a player joins

issue: #10884
This makes it possible for objects to immediately be activated,
but doesn't guarantee it since blocks may still need be emerged.

23 months agoRemove debug.get/setmetatable from security whitelist
stefan [Wed, 25 May 2022 09:46:12 +0000 (11:46 +0200)]
Remove debug.get/setmetatable from security whitelist

fixes #12216

23 months agoDon't allow banning in singleplayer
sfan5 [Thu, 26 May 2022 19:36:58 +0000 (21:36 +0200)]
Don't allow banning in singleplayer

fixes #11819

23 months agoHandle lua entity HP changes correctly (like punches)
sfan5 [Thu, 26 May 2022 19:32:51 +0000 (21:32 +0200)]
Handle lua entity HP changes correctly (like punches)

fixes #11975

23 months agoMake sure real disconnect reason isn't overwritten
sfan5 [Thu, 26 May 2022 18:47:16 +0000 (20:47 +0200)]
Make sure real disconnect reason isn't overwritten

bug introduced in 2f32044273d107e82fb1c35d4a0f616fa480cdf0

23 months agoFix linking with Postgres libs on older cmake versions
sfan5 [Thu, 26 May 2022 16:01:37 +0000 (18:01 +0200)]
Fix linking with Postgres libs on older cmake versions

closes #12149

23 months agoRemove remains of video mode querying
sfan5 [Thu, 26 May 2022 15:41:23 +0000 (17:41 +0200)]
Remove remains of video mode querying

23 months agoGet rid of node metadata when it becomes empty
sfan5 [Thu, 26 May 2022 13:45:34 +0000 (15:45 +0200)]
Get rid of node metadata when it becomes empty

fixes #8943

23 months agoOptimize Server::sendMetadataChanged a bit
sfan5 [Thu, 26 May 2022 12:40:00 +0000 (14:40 +0200)]
Optimize Server::sendMetadataChanged a bit

The distance check also never worked as intended, now fixed.

23 months agoAdd API function to invoke player respawn
sfan5 [Wed, 25 May 2022 17:29:11 +0000 (19:29 +0200)]
Add API function to invoke player respawn

closes #12272

23 months agoProtect a few more settings from being set from mods
sfan5 [Wed, 25 May 2022 17:07:49 +0000 (19:07 +0200)]
Protect a few more settings from being set from mods

Of those settings main_menu_script has concrete security impact, the rest are added out of abundance of caution.

23 months agoMap opaque waving leaves to allfaces drawtype
sfan5 [Wed, 25 May 2022 17:00:34 +0000 (19:00 +0200)]
Map opaque waving leaves to allfaces drawtype

fixes #9842

23 months agoImprove a translation string
sfan5 [Wed, 25 May 2022 16:27:34 +0000 (18:27 +0200)]
Improve a translation string

fixes #11442

23 months agoDefault settings, presets and configuration for dynamic shadows (#12359)
x2048 [Sun, 29 May 2022 11:58:57 +0000 (13:58 +0200)]
Default settings, presets and configuration for dynamic shadows (#12359)

23 months agoLua workflow: Use Leafo's Luarocks action
Lars Müller [Sat, 28 May 2022 09:31:56 +0000 (11:31 +0200)]
Lua workflow: Use Leafo's Luarocks action

instead of installing outdated packages which lead to failing workflows

23 months agoBuiltin: Optimize misc helpers (#12377)
Lars Müller [Fri, 27 May 2022 19:40:38 +0000 (21:40 +0200)]
Builtin: Optimize misc helpers (#12377)

Also add formspec_escape unit test

23 months agoDevTest: Add nodes and items for testing overlays (#12304)
Wuzzy [Fri, 27 May 2022 19:39:36 +0000 (19:39 +0000)]
DevTest: Add nodes and items for testing overlays (#12304)

23 months agoForce-update shadows when the world is changed (#12364)
x2048 [Thu, 26 May 2022 20:28:34 +0000 (22:28 +0200)]
Force-update shadows when the world is changed (#12364)

23 months agoReduce size of ContentFeatures structure
sfan5 [Mon, 9 May 2022 18:59:28 +0000 (20:59 +0200)]
Reduce size of ContentFeatures structure

On my system this is a reduction from 4664 to 3704 bytes.
This is not for the sake of saving RAM but ensuring
commonly used structures fit into caches better.

23 months agoGet rid of global buffer that would ruin concurrent MapBlock serialization
sfan5 [Mon, 9 May 2022 18:00:22 +0000 (20:00 +0200)]
Get rid of global buffer that would ruin concurrent MapBlock serialization

23 months agoImprove code in mapblock_mesh.cpp a bit
sfan5 [Mon, 9 May 2022 17:28:27 +0000 (19:28 +0200)]
Improve code in mapblock_mesh.cpp a bit

23 months agoQuantize light frustum calculations (#12357)
x2048 [Mon, 23 May 2022 21:45:18 +0000 (23:45 +0200)]
Quantize light frustum calculations (#12357)

* Quantize light frustum calculations

Reduces shadow flicker

* Fix function name to match conventions

23 months agoFormally drop support for building with upstream Irrlicht
sfan5 [Sat, 21 May 2022 22:52:11 +0000 (00:52 +0200)]
Formally drop support for building with upstream Irrlicht

It stopped working with (at least) the last commit.

23 months agoFix hash implementation for SerializedBlockCache
sfan5 [Sat, 21 May 2022 22:37:58 +0000 (00:37 +0200)]
Fix hash implementation for SerializedBlockCache

23 months agoUse unordered_map instead of map for MapSectors
Richard Try [Mon, 23 May 2022 20:50:49 +0000 (23:50 +0300)]
Use unordered_map instead of map for MapSectors

23 months agoAdd missing concurrency protection in logger (#12325)
paradust7 [Mon, 23 May 2022 20:50:25 +0000 (13:50 -0700)]
Add missing concurrency protection in logger (#12325)

23 months agoFix no_texture.png for unknown nodes with ID < 125 (#12329)
Wuzzy [Mon, 23 May 2022 20:50:10 +0000 (20:50 +0000)]
Fix no_texture.png for unknown nodes with ID < 125 (#12329)

23 months agoDocs: clarify spawn_by for decorations
Zughy [Mon, 23 May 2022 20:49:48 +0000 (22:49 +0200)]
Docs: clarify spawn_by for decorations

23 months agoAdd missing comma in example in lua_api.txt (#12339)
Wuzzy [Sun, 22 May 2022 19:23:04 +0000 (19:23 +0000)]
Add missing comma in example in lua_api.txt (#12339)

23 months agoAdd relative numbers for commands by prepending ~ (#9588)
Wuzzy [Sun, 22 May 2022 14:28:24 +0000 (14:28 +0000)]
Add relative numbers for commands by prepending ~ (#9588)

* Add relative numbers for commands by prepending ~

* Some builtin code cleanup

* Disallow nan and inf in minetest.string_to_area

* Remove unused local variable teleportee (makes Luacheck happy)

* Clean up core.string_to_pos

* Make area parsing less permissive

* Rewrite tests as busted tests

* /time: Fix negative minutes not working

Co-authored-by: Lars Mueller <appgurulars@gmx.de>
23 months agoMerge branch 'master' of https://github.com/minetest/minetest
Elias Fleckenstein [Sun, 22 May 2022 10:05:27 +0000 (12:05 +0200)]
Merge branch 'master' of https://github.com/minetest/minetest

23 months agoReplace all uses of core::list with std::list (#12313)
paradust7 [Sat, 21 May 2022 22:11:59 +0000 (15:11 -0700)]
Replace all uses of core::list with std::list (#12313)

23 months agoFixes needed to use irrArray backed by std::vector (#12263)
paradust7 [Sat, 21 May 2022 22:11:49 +0000 (15:11 -0700)]
Fixes needed to use irrArray backed by std::vector (#12263)

23 months agoBump IrrlichtMt version in CI
sfan5 [Sat, 21 May 2022 22:11:22 +0000 (00:11 +0200)]
Bump IrrlichtMt version in CI

23 months agoDon't ignore server disconnects in client code
sfan5 [Fri, 6 May 2022 18:13:45 +0000 (20:13 +0200)]
Don't ignore server disconnects in client code

If the server stops talking to us without saying bye we
should actually end the in-game session with an error message.

23 months agoFixes to Android build + option to turn LuaJIT on/off for testing purposes (#12334)
paradust7 [Sat, 21 May 2022 15:48:40 +0000 (08:48 -0700)]
Fixes to Android build + option to turn LuaJIT on/off for testing purposes (#12334)

23 months agoMake no_screenshot image more clear (#12346)
Zughy [Sat, 21 May 2022 15:48:28 +0000 (17:48 +0200)]
Make no_screenshot image more clear (#12346)

23 months agoPatch built-in Lua to fix miscompile on Android (#12347)
paradust7 [Sat, 21 May 2022 15:46:50 +0000 (08:46 -0700)]
Patch built-in Lua to fix miscompile on Android (#12347)

23 months agoOptimize JSON string (de)serialization routines
sfan5 [Sun, 1 May 2022 11:44:42 +0000 (13:44 +0200)]
Optimize JSON string (de)serialization routines

stringstreams were shown to be slow when reading/writing single characters
and there is lots of potential by having functions perform on existing
buffers whenever possible.

23 months agoImprove testSerializeJsonString unit tests
sfan5 [Sun, 1 May 2022 11:43:29 +0000 (13:43 +0200)]
Improve testSerializeJsonString unit tests

this also removes the requirement that / is escaped, there is
no reason for doing so.

23 months agoDeprecate game.conf name, use title instead (#12030)
rubenwardy [Sat, 21 May 2022 15:23:30 +0000 (16:23 +0100)]
Deprecate game.conf name, use title instead (#12030)

23 months agoImprove shadow filters (#12195)
x2048 [Sat, 21 May 2022 14:49:30 +0000 (16:49 +0200)]
Improve shadow filters (#12195)

* Rewrite shadow filtering for the new distortion
* Calculate penumbra radius using a single sample
* Avoid peter-panning effect due to filtering of short shadows
* Add adaptive filter quality for soft shadows
* Avoid sharp shadows on surfaces without normals (e.g. plants)
* Increase default and maximum soft shadow radius
* Make line numbers in shader errors match the code

23 months agoFix lighting of upright_sprite entities (#12336)
x2048 [Fri, 20 May 2022 20:35:03 +0000 (22:35 +0200)]
Fix lighting of upright_sprite entities (#12336)

Use MeshNode materials to set the light since ReadOnlyMaterials is now false

23 months agoFix lighting of the wield mesh (#12341)
x2048 [Fri, 20 May 2022 20:33:52 +0000 (22:33 +0200)]
Fix lighting of the wield mesh (#12341)

* Assign node light to player before final color blend.
  Fixes day/night lightbank ratio for wield meshes
* Update wield mesh light when changing mesh

23 months agoInstall lua_async dependency 2022.05
Elias Fleckenstein [Wed, 18 May 2022 15:44:02 +0000 (17:44 +0200)]
Install lua_async dependency

23 months agoDon't include client/game.h on server build
Elias Fleckenstein [Wed, 18 May 2022 14:57:14 +0000 (16:57 +0200)]
Don't include client/game.h on server build

23 months agoMerge branch 'master' of https://github.com/minetest/minetest
Elias Fleckenstein [Wed, 18 May 2022 14:00:53 +0000 (16:00 +0200)]
Merge branch 'master' of https://github.com/minetest/minetest

23 months agoShip dragonfireclient with selected high-quality mods
Elias Fleckenstein [Wed, 18 May 2022 13:57:17 +0000 (15:57 +0200)]
Ship dragonfireclient with selected high-quality mods

23 months agoUse std::map instead of core::map (#12301)
paradust7 [Wed, 18 May 2022 10:31:49 +0000 (03:31 -0700)]
Use std::map instead of core::map (#12301)

23 months agoFix build instructions
Elias Fleckenstein [Tue, 17 May 2022 20:13:17 +0000 (22:13 +0200)]
Fix build instructions

23 months agoMerge branch 'master' of https://github.com/minetest/minetest
Elias Fleckenstein [Tue, 17 May 2022 20:12:00 +0000 (22:12 +0200)]
Merge branch 'master' of https://github.com/minetest/minetest

23 months agoRemove confusing message in keybindings menu
savilli [Tue, 17 May 2022 18:11:08 +0000 (21:11 +0300)]
Remove confusing message in keybindings menu

23 months agoAdd vcs-browser and contribute URLs to Appdata
JakobDev [Tue, 17 May 2022 18:08:32 +0000 (20:08 +0200)]
Add vcs-browser and contribute URLs to Appdata

23 months agoDevTest: Fix broken PNG textures
Wuzzy [Tue, 17 May 2022 18:06:15 +0000 (18:06 +0000)]
DevTest: Fix broken PNG textures

23 months agoAdd spider
Elias Fleckenstein [Tue, 17 May 2022 18:05:52 +0000 (20:05 +0200)]
Add spider

23 months agoInitialize wield mesh color when wield_image is set
Dmitry Kostenko [Sun, 15 May 2022 19:44:55 +0000 (21:44 +0200)]
Initialize wield mesh color when wield_image is set

#12245

23 months agoUse native packer to transfer globals into async env(s)
sfan5 [Mon, 9 May 2022 16:20:10 +0000 (18:20 +0200)]
Use native packer to transfer globals into async env(s)

23 months agoSupport packing arbitrary graphs (#12289)
Jude Melton-Houghton [Tue, 10 May 2022 20:37:33 +0000 (16:37 -0400)]
Support packing arbitrary graphs (#12289)

23 months agoFix cooking and fuel crafts with aliases
Jude Melton-Houghton [Mon, 9 May 2022 22:21:08 +0000 (18:21 -0400)]
Fix cooking and fuel crafts with aliases

23 months agoAdd doc to list breaking changes for the next major release
Zughy [Tue, 10 May 2022 20:36:50 +0000 (22:36 +0200)]
Add doc to list breaking changes for the next major release

23 months agoFix possible unreliable behavior due to uninitialized variables
Octavian [Tue, 10 May 2022 10:34:59 +0000 (13:34 +0300)]
Fix possible unreliable behavior due to uninitialized variables

23 months agoAdd more Prometheus metrics (#12274)
sfan5 [Mon, 9 May 2022 19:20:58 +0000 (21:20 +0200)]
Add more Prometheus metrics (#12274)

23 months agoHUD: Update selection mesh every frame (#12270)
Lars Müller [Mon, 9 May 2022 18:43:47 +0000 (20:43 +0200)]
HUD: Update selection mesh every frame (#12270)

Fixes outdated selection boxes after entity property changes.

23 months agoFix Minetest blaming the wrong mod for errors (#12241)
Lars Müller [Mon, 9 May 2022 18:42:43 +0000 (20:42 +0200)]
Fix Minetest blaming the wrong mod for errors (#12241)

Covers the case where mods insert their callbacks manually into "minetest.registered_<callbacks>" (often to achieve a particular order of execution).

23 months agoDocs: Recommend `self.name` (#12239)
Lars Müller [Mon, 9 May 2022 18:41:47 +0000 (20:41 +0200)]
Docs: Recommend `self.name` (#12239)

23 months agoConsolidate some data structures in MapBlockMesh
sfan5 [Fri, 6 May 2022 07:54:04 +0000 (09:54 +0200)]
Consolidate some data structures in MapBlockMesh

23 months agoCache serialized mapblocks during sending
sfan5 [Thu, 5 May 2022 20:03:49 +0000 (22:03 +0200)]
Cache serialized mapblocks during sending

This reduces the
(absolute) time spent in Server::SendBlocks() from 700ms to 300ms
(relative) share of MapBlock::serialize() from 80% to 60%
in a test setup with 10 players and many block changes

23 months agoitem_entity: Cache collisionbox for use in on_step
sfan5 [Thu, 5 May 2022 18:49:57 +0000 (20:49 +0200)]
item_entity: Cache collisionbox for use in on_step

I don't have absolute numbers but if calls to get_properties() take up
30%+ of on_step() execution time that's bound to matter.

23 months agoFix mapblock geometry optimisation not working
ROllerozxa [Sat, 7 May 2022 17:41:11 +0000 (19:41 +0200)]
Fix mapblock geometry optimisation not working

Caused by the depth sorting PR marking not only transparent nodes to be ignored but also opaque ones with the TILE_MATERIAL_BASIC material type

23 months agoRemove unused variable WARN_INIT
Zughy [Sun, 8 May 2022 17:11:15 +0000 (19:11 +0200)]
Remove unused variable WARN_INIT

23 months agoEnable dependencies when enabling modpacks (#12202)
Jude Melton-Houghton [Sun, 8 May 2022 15:21:59 +0000 (11:21 -0400)]
Enable dependencies when enabling modpacks (#12202)

23 months agoFix enabling of dependencies with identical names (#12253)
Jude Melton-Houghton [Sun, 8 May 2022 13:14:14 +0000 (09:14 -0400)]
Fix enabling of dependencies with identical names (#12253)

23 months agoFix mods not being recursively enabled
rubenwardy [Sun, 8 May 2022 13:01:32 +0000 (14:01 +0100)]
Fix mods not being recursively enabled

Fixes #12290

23 months agoFix texture packs showing as "Nil (enabled)" in Content tab
rubenwardy [Sat, 7 May 2022 22:05:24 +0000 (23:05 +0100)]
Fix texture packs showing as "Nil (enabled)" in Content tab

Fixes #12285

23 months agoAdd benchmarks for json string serialize/deserialize (#12258)
paradust7 [Fri, 6 May 2022 20:17:16 +0000 (13:17 -0700)]
Add benchmarks for json string serialize/deserialize (#12258)

Co-authored-by: sfan5 <sfan5@live.de>
23 months agoEnable chat clickable weblinks by default (#12115)
Froggo [Fri, 6 May 2022 20:15:16 +0000 (15:15 -0500)]
Enable chat clickable weblinks by default (#12115)

Co-authored-by: rubenwardy <rw@rubenwardy.com>