120 Commits

Author SHA1 Message Date
978d57a301 remove typo translation 2022-07-24 12:26:24 +02:00
70773359ad fix typo 2022-07-24 12:22:28 +02:00
0a1a02b8c4 translate client-side 2022-07-23 23:00:20 +02:00
c6151abbe9 fix issue nalc/nalc-server-mods#109
Torch name change if placed on wall/ceiling and break torch awards
2022-07-05 15:49:18 +02:00
c27d527cfc Merge remote-tracking branch 'upstream/master' 2021-01-12 21:43:50 +01:00
37082d1186 Rename background to hud_background 2021-01-10 17:55:42 +00:00
6dc91cf893 Fix error due to unchecked JSON parsing 2021-01-10 17:17:57 +00:00
9c74a3f85a Update docs 2021-01-10 16:30:05 +00:00
b4a4a1fd74 Improve API: add awards.get_award_states() 2021-01-10 16:25:20 +00:00
8702b6cdd8 Merge remote-tracking branch 'upstream/master' into nalc-1.2-dev 2020-06-16 20:49:49 +02:00
4e8d175714 Fixed a couple typos.
- The Mesecons-related award claimed to be awarded when placing mesecon wires, but instead was coded to be awarded when placing pipes from Pipeworks. Fixed code to match description.
 - The Basic-Materials-related award claimed to require crafting flint and steel one hundred times, but instead was coded to require crafting oil extract five hundred times. Fixed description to match code.
2020-06-16 07:47:41 +00:00
c7b60be880 player:getpos() is deprecated and calling it causes the game to halt if deprecated_lua_api_handling is set to "error" in minetest.conf. Call player:get_pos() instead to prevent the game from halting. 2020-04-19 19:05:06 +00:00
ce58720493 Fix group total, fix item increment count argument, add player checks, resize award icon, fix log output 2020-04-05 16:00:33 +00:00
d542042a50 Interpret group ratings of zero as not in group.
The MT API docs instruct to interpret `nil` and `0` as the same rating.
2020-04-04 17:40:48 -04:00
7e3064ef93 Check for valid players in default triggers instead of crashing. 2020-04-04 17:03:45 -04:00
9d98f950b8 Fix eat trigger to actually notify awards on item eat. 2020-04-04 15:35:14 -04:00
8a34ea8055 Add awards.add_defaults setting to control adding default awards.
Useful for games not based on MTG but using some of its mods.
2020-04-04 13:47:20 -04:00
baf79bf9bf Merge branch 'master' of yunohost.local:mtcontrib/awards into nalc-1.2-dev 2019-12-21 13:09:58 +01:00
da3d9b3980 Add awards for death, pipeworks, and mesecons 2019-09-15 18:14:58 +01:00
8f46d5b37d Add icons for awards 2019-08-20 11:28:15 +01:00
4f5260da5f Corrige la commande /awards.
Corrige l'affige des awards d'un joueur donné.
Empêche le retour de l'inventaire sfinv quand on active ou desactive
les awards d'un joueur.
2019-03-03 22:40:11 +01:00
89d4a93f3b Ajoute le privilège awards_admin
Modifie la commande /awards en conséquence
2019-03-03 13:24:28 +01:00
cae2c1ee3b Tente la correction d'un crash 2019-03-02 21:08:02 +01:00
54db6ce0c0 Suppression de minetest.register_on_craft
Cette fonction a été réécrite dans nalc_awards
2019-03-02 19:49:08 +01:00
Max
1ffa8f10ac Add missing german translations 2019-01-26 15:26:53 +00:00
fb1670abc6 Fix typo in documentation for craft trigger 2018-09-14 10:59:59 +01:00
38b7d9aa91 Fix progress exceeding target 2018-09-14 10:55:55 +01:00
805720b4af Fix sfinv page not updating on award unlock 2018-09-13 17:39:52 +01:00
29a1b97b38 Improve code structure and awards formspec size 2018-09-13 17:33:04 +01:00
b856aea54d Fix typo in custom trigger type example 2018-08-22 15:26:24 +01:00
570fd3a206 Fix incorrect description documentation 2018-08-22 15:19:38 +01:00
417ac0fe46 Fix mistakes in award definition documentation 2018-08-22 15:17:14 +01:00
1ab08d68c9 Add portuguese translations 2018-08-03 12:35:18 +01:00
32150bdd66 Fix crash for invalid award index selection 2018-07-15 13:17:06 +01:00
8c0bb00b1a Improve documentation 2018-06-14 00:20:30 +01:00
237525b518 Add support for groups in triggers 2018-06-13 22:52:55 +01:00
21e1ce6675 Fix convert_data crash when craft data is missing
Crash occurs when no data for "craft" is available in the old data, fixed with a additional check.
2018-05-31 15:06:56 +01:00
0ae58ad0c3 Fix locked awards not taking difficulty into account 2018-04-17 22:37:09 +01:00
7d462c6aa5 Add difficulty multiplers to default mod awards 2018-04-17 22:29:13 +01:00
f0052386c8 Add award difficulty multipler 2018-04-17 22:25:53 +01:00
08f654cf94 Remove debug prints
Fixes #57
2018-04-17 22:10:40 +01:00
3fc12eb689 Update README.md 2018-04-06 22:12:56 +01:00
98fca7914b Add on_unlock() documentation 2018-04-06 22:11:08 +01:00
37275963df Fix notification positioning
Fixes #55, also fixes @Fixer-007
2018-04-06 00:24:56 +01:00
75c01a188a Replace all mentions of achievements with awards 2018-04-05 17:56:01 +01:00
a5768efbc0 Fix awards disabling
Fixes #33
2018-04-05 17:24:42 +01:00
4e6ade249e Use awards for technical things, and achievements for user facing things
Fixes #18
2018-04-05 17:11:51 +01:00
e110bbbc7a Add award unlock requirements
Fixes #52
2018-04-05 17:00:48 +01:00
2f49d895ed Fix typo in previous commit 2018-04-05 16:48:33 +01:00
d67d19ec50 Improve sorting algorithm
Fixes #28
2018-04-05 16:44:22 +01:00
4764568f6d Fix off-by-one error in counted_key award types 2018-04-05 16:21:44 +01:00
ee4931ae6e Add assert to awards.player() 2018-04-05 13:06:09 +01:00
51ccb8c1b6 Fix crash caused by typo in method name
Fixes #51
2018-04-05 09:48:35 +01:00
7f156db0df Add check for nyancat mod before registering the award
Fixes #44
2018-04-04 23:05:25 +01:00
0017a174bd Change license to MIT 2018-04-04 22:57:27 +01:00
0574d0375e Merge dev branch into master 2018-04-04 22:15:43 +01:00
07997a54f4 Readd awards 2018-04-04 21:11:40 +01:00
f84e6d8db5 Fix conversion error 2018-04-04 21:04:54 +01:00
f571f9d6eb Add support for death reasons 2018-04-04 20:55:33 +01:00
6c79a2f73f Use mod_storage and add converter for awards.txt 2018-04-04 19:01:33 +01:00
f7956d97e2 Add default_def for trigger prototype 2018-04-04 18:39:06 +01:00
cca278024d Remove datakey and use trigger names instead 2018-04-04 18:36:47 +01:00
eaab883e71 Readd triggers 2018-04-04 18:35:28 +01:00
28c59340ea Implement conted_key trigger type 2018-04-04 18:30:47 +01:00
d82972b448 Update README.md 2018-04-04 18:02:43 +01:00
72cc346c35 Rename awards.def to awards.registered_awards 2018-04-04 17:43:44 +01:00
5de9dcb797 Move api_helpers.lua in api.lua 2018-04-04 17:42:12 +01:00
7c5fd79b57 Clean up formspec related code 2018-04-04 17:37:43 +01:00
c579f862b6 Reduce awards.player() calls 2018-04-04 17:32:37 +01:00
eeee4a8398 Clean up player data validation 2018-04-04 17:23:46 +01:00
ef19940edc Add trigger definitions rather than register function 2018-04-04 17:01:55 +01:00
8b024accdd Add register_trigger_counted for homogenous events 2018-04-04 16:03:34 +01:00
dd2a5d2d1f Remove formspec notification 2018-04-04 15:46:11 +01:00
2c4da0b88a Add luacheck 2018-04-04 15:36:27 +01:00
81aa0f1c82 Fix broken achievement image (On The Way) 2017-10-05 19:04:02 +01:00
81590b5773 Fix deprecated setting call 2017-10-02 09:11:51 +01:00
3854565fa2 Update readme.md 2017-06-16 21:38:41 +01:00
096fe16c97 Update and make minor corrections to the French translation 2017-02-25 22:15:23 +00:00
3dd7a5e66a Add French translation. 2017-02-23 22:48:13 +00:00
9a02873b59 Add Spanish translation. 2017-02-23 22:48:13 +00:00
e919355bec Add helper script to update translations. 2017-02-23 22:48:13 +00:00
ccd9a01424 Update catalogs. 2017-02-23 22:48:13 +00:00
1049280eeb Update to new intllib API. 2017-02-23 22:48:13 +00:00
7fd56ac3d0 Resize formspec and HUD to fit bigger strings 2017-02-19 17:21:37 +00:00
c994978683 Update sfinv support to match stable version 2016-12-27 19:23:46 +00:00
38c504e938 Add eat trigger, extend existing triggers, add 9 awards (#35)
* Add eat trigger and 2 new awards
* Add mushroom eating awards
* Add support for counting any eat/dig/craft/place
* Update readme
* Add 4 builder awards
* Update German locale
* Update dependencies
* Fix mistake in German translation
* Revert removal of background
2016-11-15 01:57:01 +01:00
ab7206e150 Fix mod not working with mod security and intllib 2016-11-14 21:13:32 +00:00
f4a5eb25f6 Fix mod not working with mod security and intllib 2016-11-09 02:42:36 +01:00
43da09620e Fix bugs when mod is run outside of Minetest Game (#34) 2016-11-06 11:05:13 +00:00
ae01ea01dd Show error messages when there are no awards 2016-09-10 15:38:01 +01:00
a04f3df1e2 Check for existance of default mod 2016-09-10 15:20:38 +01:00
90bf9b061a Add notification sound
License of default sound: CC-0
Source: https://www.freesound.org/people/Kastenfrosch/sounds/162482/
2016-09-01 16:32:05 +01:00
0e48cd8675 Add German translation 2016-09-01 16:22:37 +01:00
ed09abd868 Automatic line breaks for long award desc. 2016-09-01 16:22:37 +01:00
13eb5dcdae Add optional default description for triggers 2016-09-01 16:22:37 +01:00
67946bf0c4 Improve strings and make them translatable 2016-09-01 16:21:41 +01:00
50349917e5 Remove outdated /cawards command for real 2016-09-01 16:37:05 +02:00
963c5772df Fix crash when opening awards after clearing 2016-09-01 16:36:42 +02:00
92c43d1c04 Fix style issues 2016-08-30 01:05:43 +01:00
0692d1cc85 Remove some redundant “ ~= nil”s in init.lua 2016-08-11 10:00:07 +02:00
1bd96e662b More consistent code style in init.lua 2016-08-11 09:55:56 +02:00
5b416c61c4 Fix/change some achievements backgrounds 2016-08-11 09:49:47 +02:00
d4c47775c9 Add custom icon for Firefighter 2016-08-10 20:13:39 +02:00
20eaf3b34f Add Lava Miner award (digging close to lava) 2016-08-10 14:06:59 +02:00
cdf59bb9fd Fix typo in firefighter award ID 2016-08-10 13:11:08 +02:00
743cb4ce8d Add craft 10 mese lamps award 2016-08-10 12:53:57 +02:00
9264c75f0a Add Pyromaniac and Firefighter awards 2016-08-10 12:45:16 +02:00
fd79fe6521 Add snow award (proof for visiting snow land) 2016-08-10 11:52:51 +02:00
7767cff0bf Add 2 new stone brick crafting awards
To give a reason to do something with all that stockpiled cobblestone ;-)
2016-08-10 11:32:13 +02:00
94304a4a90 Heavily nerf lumberjack awards, 1296 trees max.
Playing lumberjack gets repetitive pretty soon,
it's not fun at all to do it for long.
Let's do some calculations:
Digging 100 trees w/ diamond axe takes ca. 3.5 min.
1 diamond axe lasts for 200-300 trees and needs 3 diamonds.
Meaning, to get L337 Lumberjack (100000) trees you
need 58 hours only digging trees! Plus the time to
find ca. 1000 diamonds (100000/300*3) only for the
axes. So much nope.

New awards are factors of 6, capped capped at 1296
because it gets boring at about that point and already
with 1000 trees in your storage you have enough wood
for a long time.

Also, award names were slightly changed.
2016-08-10 09:39:27 +02:00
ae09298ea2 More consistent award icons, add “level” icons 2016-08-10 09:19:45 +02:00
6a7ea1a70d Add a lot of awards 2016-08-10 09:19:36 +02:00
d38ba4e8a0 Release 2.3.0 2016-08-02 00:09:43 +01:00
f5ea95ad35 Add new awards, remove death awards 2016-08-01 23:56:06 +01:00
9b6e93dd9a Announce secret awards as secret awards 2016-08-01 23:46:49 +01:00
49f251136e Make secret awards darker in list + other tweaks 2016-08-01 23:46:15 +01:00
9308b95163 Add sfinv support 2016-08-01 22:39:32 +01:00
f6515c12b8 Stop progress bars going out of bounds
Fixes #21
2016-08-01 21:04:00 +01:00
00eeeb3eef Add support for Unified Inventory 2016-08-01 20:38:19 +01:00
5dec2fd60b Make textures follow naming conventions 2016-08-01 20:34:23 +01:00
210 changed files with 4298 additions and 1944 deletions

14
.luacheckrc Normal file
View File

@ -0,0 +1,14 @@
unused_args = false
allow_defined_top = true
globals = {
"minetest", "awards",
}
read_globals = {
string = {fields = {"split"}},
table = {fields = {"copy", "getn"}},
"vector", "default", "ItemStack",
"dump", "sfinv", "intllib",
"unified_inventory",
}

12
.travis.yml Normal file
View File

@ -0,0 +1,12 @@
language: generic
sudo: false
addons:
apt:
packages:
- luarocks
before_install:
- luarocks install --local luacheck
script:
- $HOME/.luarocks/bin/luacheck --no-color .
notifications:
email: false

View File

@ -1,502 +1,19 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
Copyright (c) 2013-8 rubenwardy
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

328
README.md Normal file
View File

@ -0,0 +1,328 @@
# Awards
Adds awards/achievements to Minetest (plus a very good API).
by [rubenwardy](https://rubenwardy.com), licensed under MIT.
With thanks to Wuzzy, kaeza, and MrIbby.
Majority of awards are back ported from Calinou's old fork in Carbone, under same license.
# Introduction
## Awards and Triggers
An award is a single unlockable unit, registered like so:
```lua
awards.register_award("mymod:award", {
description = "My Example Award",
})
```
Awards are unlocked either using `awards.unlock()` or by a trigger being
fullfilled. A trigger is a condition which unlocks an award. Triggers are
registered at the same time as an award is registered:
```lua
awards.register_award("mymod:award", {
description = "My Example Award",
trigger = {
type = "dig",
node = "default:stone",
target = 10,
},
})
```
The above trigger type is an example of a counted_key trigger:
rather than a single counter there's a counter per key - in this
case the key is the value of the `node` field.
If you leave out the key in a `counted_key` trigger, then the total will be used
instead. For example, here is an award which unlocks after you've placed 10
nodes of any type:
```lua
awards.register_award("mymod:award", {
description = "Place 10 nodes!",
trigger = {
type = "place",
target = 10,
},
})
```
You can also register an *Unlock Function*, which can return the name of an
award to unlock it:
```lua
awards.register_award("mymod:award", {
title = "Lava Miner",
description = "Mine any block while being very close to lava.",
})
awards.register_on_dig(function(player, data)
local pos = player:get_pos()
if pos and (minetest.find_node_near(pos, 1, "default:lava_source") or
minetest.find_node_near(pos, 1, "default:lava_flowing")) then
return "mymod:award"
end
return nil
end)
```
The above is a bad example as you don't actually need the stats data given.
It would be better to register a `dignode` callback and call `awards.unlock()`
if the condition is met.
## Trigger Types
The trigger type is used to determine which event will cause the trigger will be
fulfilled. The awards mod comes with a number of predefined types, documented
in [Builtin Trigger Types](#builtin-trigger-types).
Trigger types are registered like so:
```lua
awards.register_trigger("chat", {
type = "counted",
progress = "@1/@2 chat messages",
auto_description = { "Send a chat message", "Chat @1 times" },
})
minetest.register_on_chat_message(function(name, message)
local player = minetest.get_player_by_name(name)
if not player or string.find(message, "/") then
return
end
awards.notify_chat(player)
end)
```
A trigger type has a type as well, which determines how the data is stored and
also how the trigger is fulfilled.
**Trigger Type Types:**
* **custom** requires you handle the calling of awards.unlock() yourself. You also
need to implement on_register() yourself. You'll also probably want to implement
`on_register()` to catch awards registered with your trigger type.
* **counted** stores a single counter for each player which is incremented by calling
`trigger:notify(player)`. Good for homogenous actions like number of chat messages,
joins, and the like.
* **counted_key** stores a table of counters each indexed by a key. There is also
a total field (`__total`) which stores the sum of all counters. A counter is
incremented by calling `trigger:notify(player, key)`. This is good for things like
placing nodes or crafting items, where the key will be the item or node name.
If `key` is an item, then you should also add `key_is_item = true` to the
trigger type definition.
As said, you could use a custom trigger if none of the other ones match your needs.
Here's an example.
```lua
awards.register_trigger("foo", {
type = "custom",
progress = "@1/@2 foos",
auto_description = { "Do a foo", "Foo @1 times" },
on_register = function(self, award)
print(award.name .. " was registered with foo trigger type")
end,
})
minetest.register_on_foo(function()
for _, trigger in pairs(awards.on.foo) do
-- trigger is either a trigger tables or
-- or an unlock function.
-- some complex logic
if condition then
awards.unlock(trigger)
end
end
end)
```
## Award Difficulty
Difficulty is used to determine how awards are sorted in awards lists.
If the award trigger is counted, ie: the trigger requires a `target` property,
then the difficulty multipler is timesd by `target` to get the overall difficulty.
If the award isn't a counted type then the difficulty multiplier is used as the
overal difficulty. Award difficulty affects how awards are sorted in a list -
more difficult awards are further down the list.
In real terms, `difficulty` is a relative difficulty to do one unit of the trigger
if its counted, otherwise it's the relative difficulty of completely doing the
award (if not-counted). For the `dig` trigger type, 1 unit would be 1 node dug.
Actual code used to calculate award difficulty:
```lua
local difficulty = def.difficulty or 1
if def.trigger and def.trigger.target then
difficulty = difficulty * def.trigger.target
end
```
# API
## Awards
* `awards.register_award(name, def)`, the def table has the following fields:
* `title` - title of the award (defaults to name)
* `description` - longer description of the award, displayed in Awards tab
* `difficulty` - see [Award Difficulty](#award-difficulty).
* `requires` - list of awards that need to be unlocked before this one
is visible.
* `prizes` - list of items to give when you earn the award
* `secret` - boolean if this award is secret (i.e. showed on awards list)
* `sound` - `SimpleSoundSpec` table to play on unlock.
`false` to disable unlock sound.
* `icon` - the icon image. Defaults to `awards_unknown.png`.
* `hud_background` - the background image used in the HUD to contain the text and icon.
Defaults to `awards_bg_default.png`.
* `trigger` - trigger definition, see [Builtin Trigger Types](#builtin-trigger-types).
* `on_unlock(name, def)` - callback on unlock.
* `awards.registered_awards` - table of award name to definition.
* `awards.register_on_unlock(func(name, def))`
* `name` is the player name
* `def` is the award def.
* return true to cancel HUD from appearing.
* `awards.unlock(player_name, award_name)`
* gives an award to a player
* `awards.get_award_states(player_name)`
* Returns list of tables, sorted by `score`, each having the fields:
```lua
{
name = "mymod:awardname",
def = {}, -- Award definition
unlocked = true, -- Whether award has been unlocked
started = true, -- Whether any progress has been made
score = 0, -- Score used in sorting
-- Either a table or nil
-- Will be nil if progress is indeterminable or
-- if the award is unlocked
progress = {
current = 5,
target = 10,
label = "label", -- Label to show over progress bar
}
}
```
## Triggers
* `awards.register_trigger(name, def)`, the def table has the following fields:
* `type` - see trigger type types in [Trigger Types](#trigger-types).
* `progress` - used to format progress, defaults to "%1/%2".
* `auto_description` - a table of two elements. Each element is a format string. Element 1 is singular, element 2 is plural. Used for the award description (not title) if none is given.
* `on_register(self, award_def)` - called when an award registers with this type.
* "counted_key" only:
* `auto_description_total` - Used if the trigger is for the total.
* `get_key(self, def)` - get key for particular award, return nil for a total.
* `key_is_item` - true if the key is an item name. On notify(),
any watched groups will also be notified as `group:groupname` keys.
* `awards.registered_triggers` - table of trigger name to definition.
## Builtin Trigger Types
Callbacks (register a function to be run)
* dig type: Dig a node.
* node: the dug node type. If nil, all dug nodes are counted
* place type: Place a node.
* node: the placed node type. If nil, all placed nodes are counted
* craft type: Craft something.
* item: the crafted item type. If nil, all crafted items are counted
* death type: Die.
* reason: the death reason, one of the types in PlayerHPChangeReason (see lua_api.txt)
or nil for total deaths.
* chat type: Write a chat message.
* join type: Join the server.
* eat type: Eat an item.
* item: the eaten item type. If nil, all eaten items are counted
(for all types) target - how many times to dig/place/craft/etc.
Each type has a register function like so:
* awards.register_on_TRIGGERTYPE(func(player, data))
* data is the player stats data
* return award name or null
### dig
```lua
trigger = {
type = "dig",
node = "default:dirt", -- item, alias, or group
target = 50,
}
```
### place
```lua
trigger = {
type = "place",
node = "default:dirt", -- item, alias, or group
target = 50,
}
```
### craft
```lua
trigger = {
type = "craft",
item = "default:dirt", -- item, alias, or group
target = 50,
}
```
### death
```lua
trigger = {
type = "death",
reason = "fall",
target = 5,
}
```
### chat
```lua
trigger = {
type = "chat",
target = 100,
}
```
### join
```lua
trigger = {
type = "join",
target = 100,
}
```
### eat
```lua
trigger = {
type = "eat",
item = "default:apple",
target = 100,
}
```

446
api.lua
View File

@ -1,446 +0,0 @@
-- AWARDS
--
-- Copyright (C) 2013-2015 rubenwardy
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU Lesser General Public License as published by
-- the Free Software Foundation; either version 2.1 of the License, or
-- (at your option) any later version.
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU Lesser General Public License for more details.
-- You should have received a copy of the GNU Lesser General Public License along
-- with this program; if not, write to the Free Software Foundation, Inc.,
-- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--
-- The global award namespace
awards = {
show_mode = "hud"
}
dofile(minetest.get_modpath("awards").."/api_helpers.lua")
-- Table Save Load Functions
function awards.save()
local file = io.open(minetest.get_worldpath().."/awards.txt", "w")
if file then
file:write(minetest.serialize(awards.players))
file:close()
end
end
local S = function(s) return s end
function awards.set_intllib(locale)
S = locale
end
function awards.init()
awards.players = awards.load()
awards.def = {}
awards.trigger_types = {}
awards.on = {}
awards.on_unlock = {}
end
function awards.load()
local file = io.open(minetest.get_worldpath().."/awards.txt", "r")
if file then
local table = minetest.deserialize(file:read("*all"))
if type(table) == "table" then
return table
end
end
return {}
end
function awards.register_trigger(name, func)
awards.trigger_types[name] = func
awards.on[name] = {}
awards['register_on_'..name] = function(func)
table.insert(awards.on[name], func)
end
end
function awards.run_trigger_callbacks(player, data, trigger, table_func)
for i = 1, #awards.on[trigger] do
local res = nil
local entry = awards.on[trigger][i]
if type(entry) == "function" then
res = entry(player, data)
elseif type(entry) == "table" and entry.award then
res = table_func(entry)
end
if res then
awards.unlock(player:get_player_name(), res)
end
end
end
function awards.increment_item_counter(data, field, itemname, count)
local name_split = string.split(itemname, ":")
if #name_split ~= 2 then
return false
end
local mod = name_split[1]
local item = name_split[2]
if data and field and mod and item then
awards.assertPlayer(data)
awards.tbv(data, field)
awards.tbv(data[field], mod)
awards.tbv(data[field][mod], item, 0)
data[field][mod][item] = data[field][mod][item] + (count or 1)
return true
else
return false
end
end
function awards.get_item_count(data, field, itemname)
local name_split = string.split(itemname, ":")
if #name_split ~= 2 then
return false
end
local mod = name_split[1]
local item = name_split[2]
if data and field and mod and item then
awards.assertPlayer(data)
awards.tbv(data, field)
awards.tbv(data[field], mod)
awards.tbv(data[field][mod], item, 0)
return data[field][mod][item]
end
end
function awards.register_on_unlock(func)
table.insert(awards.on_unlock, func)
end
-- API Functions
function awards._additional_triggers(name, def)
-- Depreciated!
end
function awards.register_achievement(name, def)
def.name = name
-- Add Triggers
if def.trigger and def.trigger.type then
local func = awards.trigger_types[def.trigger.type]
if func then
func(def)
else
awards._additional_triggers(name, def)
end
end
-- Add Award
awards.def[name] = def
end
function awards.enable(name)
local data = awards.player(name)
if data then
data.disabled = nil
end
end
function awards.disable(name)
local data = awards.player(name)
if data then
data.disabled = true
end
end
function awards.clear_player(name)
awards.players[name] = nil
end
-- This function is called whenever a target condition is met.
-- It checks if a player already has that achievement, and if they do not,
-- it gives it to them
----------------------------------------------
--awards.unlock(name, award)
-- name - the name of the player
-- award - the name of the award to give
function awards.unlock(name, award)
-- Access Player Data
local data = awards.players[name]
local awdef = awards.def[award]
-- Perform checks
if not data then
return
end
if not awdef then
return
end
if data.disabled then
return
end
awards.tbv(data,"unlocked")
-- Don't give the achievement if it has already been given
if data.unlocked[award] and data.unlocked[award] == award then
return
end
-- Unlock Award
minetest.log("action", name.." has unlocked award "..name)
data.unlocked[award] = award
awards.save()
-- Give Prizes
if awdef and awdef.prizes then
for i = 1, #awdef.prizes do
local itemstack = ItemStack(awdef.prizes[i])
if not itemstack:is_empty() then
local receiverref = minetest.get_player_by_name(name)
if receiverref then
receiverref:get_inventory():add_item("main", itemstack)
end
end
end
end
-- Run callbacks
if awdef.on_unlock and awdef.on_unlock(name, awdef) then
return
end
for _, callback in pairs(awards.on_unlock) do
if callback(name, awdef) then
return
end
end
-- Get Notification Settings
local title = awdef.title or award
local desc = awdef.description or ""
local background = awdef.background or "bg_default.png"
local icon = awdef.icon or "unknown.png"
local custom_announce = awdef.custom_announce or S("Achievement Unlocked:")
-- Do Notification
if awards.show_mode == "formspec" then
-- use a formspec to send it
minetest.show_formspec(name, "achievements:unlocked", "size[4,2]"..
"image_button_exit[0,0;4,2;"..background..";close1; ]"..
"image_button_exit[0.2,0.8;1,1;"..icon..";close2; ]"..
"label[1.1,1;"..title.."]"..
"label[0.3,0.1;"..custom_announce.."]")
elseif awards.show_mode == "chat" then
-- use the chat console to send it
minetest.chat_send_player(name, S("Achievement Unlocked:")..title)
if desc~="" then
minetest.chat_send_player(name, desc)
end
else
local player = minetest.get_player_by_name(name)
local one = player:hud_add({
hud_elem_type = "image",
name = "award_bg",
scale = {x = 1, y = 1},
text = background,
position = {x = 0.5, y = 0},
offset = {x = 0, y = 138},
alignment = {x = 0, y = -1}
})
local two = player:hud_add({
hud_elem_type = "text",
name = "award_au",
number = 0xFFFFFF,
scale = {x = 100, y = 20},
text = "Achievement Unlocked!",
position = {x = 0.5, y = 0},
offset = {x = 0, y = 40},
alignment = {x = 0, y = -1}
})
local three = player:hud_add({
hud_elem_type = "text",
name = "award_title",
number = 0xFFFFFF,
scale = {x = 100, y = 20},
text = title,
position = {x = 0.5, y = 0},
offset = {x = 30, y = 100},
alignment = {x = 0, y = -1}
})
local four = player:hud_add({
hud_elem_type = "image",
name = "award_icon",
scale = {x = 4, y = 4},
text = icon,
position = {x = 0.5, y = 0},
offset = {x = -81.5, y = 126},
alignment = {x = 0, y = -1}
})
minetest.after(3, function()
player:hud_remove(one)
player:hud_remove(two)
player:hud_remove(three)
player:hud_remove(four)
end)
end
end
-- Backwards compatibility
awards.give_achievement = awards.unlock
--[[minetest.register_chatcommand("gawd", {
params = "award name",
description = "gawd: give award to self",
func = function(name, param)
awards.unlock(name,param)
end
})]]--
function awards.getFormspec(name, to, sid)
local formspec = "size[11,5]"
local listofawards = awards._order_awards(name)
local playerdata = awards.players[name]
-- Sidebar
if sid then
local item = listofawards[sid+0]
local def = awards.def[item.name]
if def and def.secret and not item.got then
formspec = formspec .. "label[1,2.75;Secret Award]"..
"image[1,0;3,3;unknown.png]"
if def and def.description then
formspec = formspec .. "label[0,3.25;Unlock this award to find out what it is]"
end
else
local title = item.name
if def and def.title then
title = def.title
end
local status = ""
if item.got then
status = " (got)"
end
formspec = formspec .. "label[1,2.75;" .. title .. status .. "]"
if def and def.icon then
formspec = formspec .. "image[1,0;3,3;" .. def.icon .. "]"
end
local barwidth = 4.6
local perc = nil
local label = nil
if def.getProgress and playerdata then
local res = def:getProgress(playerdata)
perc = res.perc
label = res.label
end
if perc then
formspec = formspec .. "background[0,4.80;" .. barwidth ..",0.25;awards_progress_gray.png]"
formspec = formspec .. "background[0,4.80;" .. (barwidth * perc) ..",0.25;awards_progress_green.png]"
if label then
formspec = formspec .. "label[1.75,4.63;" .. label .. "]"
end
end
if def and def.description then
formspec = formspec .. "label[0,3.25;"..def.description.."]"
end
end
end
-- Create list box
formspec = formspec .. "textlist[4.75,0;6,5;awards;"
local first = true
for _,award in pairs(listofawards) do
local def = awards.def[award.name]
if def then
if not first then
formspec = formspec .. ","
end
first = false
if def.secret and not award.got then
formspec = formspec .. "#ACACACSecret Award"
else
local title = award.name
if def and def.title then
title = def.title
end
if award.got then
formspec = formspec .. minetest.formspec_escape(title)
else
formspec = formspec .. "#ACACAC".. minetest.formspec_escape(title)
end
end
end
end
return formspec .. ";"..sid.."]"
end
function awards.show_to(name, to, sid, text)
if name == "" or name == nil then
name = to
end
if name == to and awards.player(to).disabled then
minetest.chat_send_player("You've disabled awards. Type /awards" ..
" enable to reenable")
return
end
if text then
if not awards.players[name] or not awards.players[name].unlocked then
minetest.chat_send_player(to, "You have not unlocked any awards")
return
end
minetest.chat_send_player(to, name.."'s awards:")
for _, str in pairs(awards.players[name].unlocked) do
local def = awards.def[str]
if def then
if def.title then
if def.description then
minetest.chat_send_player(to, def.title..": "..def.description)
else
minetest.chat_send_player(to, def.title)
end
else
minetest.chat_send_player(to, str)
end
end
end
else
if sid == nil or sid < 1 then
sid = 1
end
-- Show formspec to user
minetest.show_formspec(to,"awards:awards", awards.getFormspec(name, to, sid))
end
end
awards.showto = awards.show_to
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "awards:awards" then
return false
end
if fields.quit then
return true
end
local name = player:get_player_name()
if fields.awards then
local event = minetest.explode_textlist_event(fields.awards)
if event.type == "CHG" then
awards.show_to(name, name, event.index, false)
end
end
return true
end)
awards.init()
minetest.register_on_newplayer(function(player)
local playern = player:get_player_name()
awards.assertPlayer(playern)
end)
minetest.register_on_shutdown(function()
awards.save()
end)

View File

@ -1,57 +0,0 @@
function awards.tbv(tb,value,default)
if not default then
default = {}
end
if not tb or type(tb) ~= "table" then
if not value then
value = "[NULL]"
end
minetest.log("error", "awards.tbv - table "..dump(value).." is null, or not a table! Dump: "..dump(tb))
return
end
if not value then
error("[ERROR] awards.tbv was not used correctly!\n"..
"Value: '"..dump(value).."'\n"..
"Dump:"..dump(tb))
return
end
if not tb[value] then
tb[value] = default
end
end
function awards.assertPlayer(playern)
awards.tbv(awards.players, playern)
awards.tbv(awards.players[playern], "name", playern)
awards.tbv(awards.players[playern], "unlocked")
awards.tbv(awards.players[playern], "place")
awards.tbv(awards.players[playern], "count")
awards.tbv(awards.players[playern], "craft")
awards.tbv(awards.players[playern], "deaths", 0)
awards.tbv(awards.players[playern], "joins", 0)
awards.tbv(awards.players[playern], "chats", 0)
end
function awards.player(name)
return awards.players[name]
end
function awards._order_awards(name)
local done = {}
local retval = {}
local player = awards.player(name)
if player and player.unlocked then
for _,got in pairs(player.unlocked) do
if awards.def[got] then
done[got] = true
table.insert(retval,{name=got,got=true})
end
end
end
for _,def in pairs(awards.def) do
if not done[def.name] then
table.insert(retval,{name=def.name,got=false})
end
end
return retval
end

View File

@ -1,75 +0,0 @@
-- AWARDS
--
-- Copyright (C) 2013-2015 rubenwardy
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU Lesser General Public License as published by
-- the Free Software Foundation; either version 2.1 of the License, or
-- (at your option) any later version.
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU Lesser General Public License for more details.
-- You should have received a copy of the GNU Lesser General Public License along
-- with this program; if not, write to the Free Software Foundation, Inc.,
-- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--
minetest.register_chatcommand("awards", {
params = "",
description = "awards: list awards",
func = function(name, param)
if param == "clear" then
awards.clear_player(name)
minetest.chat_send_player(name, "All your awards and statistics " ..
" have been cleared. You can now start again.")
elseif param == "disable" then
awards.disable(name)
minetest.chat_send_player(name, "You have disabled awards. (only affects you)")
elseif param == "enable" then
awards.enable(name)
minetest.chat_send_player(name, "You have enabled awards. (only affects you)")
elseif param == "c" then
awards.show_to(name, name, nil, true)
else
awards.show_to(name, name, nil, false)
end
end
})
minetest.register_chatcommand("cawards", {
params = "",
description = "awards: list awards in chat",
func = function(name, param)
awards.show_to(name, name, nil, true)
minetest.chat_send_player(name, "/cawards has been depreciated," ..
" use /awards c instead")
end
})
minetest.register_chatcommand("awd", {
params = "award name",
description = "awd: Details of awd gotten",
func = function(name, param)
local def = awards.def[param]
if def then
minetest.chat_send_player(name,def.title..": "..def.description)
else
minetest.chat_send_player(name,"Award not found.")
end
end
})
minetest.register_chatcommand("awpl", {
privs = {
server = true
},
description = "awpl: Get the statistics for the player given",
func = function(name, param)
if not param or param == "" then
param = name
end
minetest.chat_send_player(name, param)
local player = awards.player(param)
minetest.chat_send_player(name, dump(player))
end
})

View File

@ -1 +0,0 @@
intllib?

View File

@ -1 +0,0 @@
Adds achievements to Minetest, and an API to register new ones.

443
init.lua
View File

@ -1,410 +1,45 @@
-- AWARDS
--
-- Copyright (C) 2013-2015 rubenwardy
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU Lesser General Public License as published by
-- the Free Software Foundation; either version 2.1 of the License, or
-- (at your option) any later version.
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU Lesser General Public License for more details.
-- You should have received a copy of the GNU Lesser General Public License along
-- with this program; if not, write to the Free Software Foundation, Inc.,
-- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--
-- Copyright (c) 2013-18 rubenwardy. MIT.
-- The global award namespace
awards = {
show_mode = "hud",
registered_awards = {},
registered_triggers = {},
on_unlock = {},
}
local S
if (intllib) then
dofile(minetest.get_modpath("intllib").."/intllib.lua")
S = intllib.Getter(minetest.get_current_modname())
else
S = function ( s ) return s end
-- Internationalization support.
awards.gettext, awards.ngettext = dofile(minetest.get_modpath("awards").."/src/intllib.lua")
local S = minetest.get_translator("awards")
awards.get_translator = S
-- Load files
dofile(minetest.get_modpath("awards").."/src/data.lua")
dofile(minetest.get_modpath("awards").."/src/api_awards.lua")
dofile(minetest.get_modpath("awards").."/src/api_triggers.lua")
dofile(minetest.get_modpath("awards").."/src/chat_commands.lua")
dofile(minetest.get_modpath("awards").."/src/gui.lua")
dofile(minetest.get_modpath("awards").."/src/triggers.lua")
-- Optionally add default awards.
if minetest.settings:get_bool("awards.add_defaults", true) then
dofile(minetest.get_modpath("awards").."/src/awards.lua")
end
dofile(minetest.get_modpath("awards").."/api.lua")
dofile(minetest.get_modpath("awards").."/chat_commands.lua")
dofile(minetest.get_modpath("awards").."/triggers.lua")
awards.set_intllib(S)
-- Light it up
awards.register_achievement("award_lightitup",{
title = S("Light It Up"),
description = S("Place 100 torches."),
icon = "novicebuilder.png",
trigger = {
type = "place",
node = "default:torch",
target = 100
}
})
-- Light ALL the things!
awards.register_achievement("award_well_lit",{
title = S("Well Lit"),
description = S("Place 1,000 torches."),
icon = "novicebuilder.png",
trigger = {
type = "place",
node = "default:torch",
target = 1000
}
})
awards.load()
minetest.register_on_shutdown(awards.save)
-- Saint-Maclou
if minetest.get_modpath("moreblocks") then
awards.register_achievement("award_saint_maclou",{
title = S("Saint-Maclou"),
description = S("Place 20 coal checkers."),
icon = "novicebuilder.png",
trigger = {
type = "place",
node = "moreblocks:coal_checker",
target = 20
}
})
-- Castorama
awards.register_achievement("award_castorama",{
title = S("Castorama"),
description = S("Place 20 iron checkers."),
icon = "novicebuilder.png",
trigger = {
type = "place",
node = "moreblocks:iron_checker",
target = 20
}
})
-- Sam the Trapper
awards.register_achievement("award_sam_the_trapper",{
title = S("Sam the Trapper"),
description = S("Place 2 trap stones."),
icon = "novicebuilder.png",
trigger = {
type = "place",
node = "moreblocks:trap_stone",
target = 2
}
})
end
-- Obsessed with Obsidian
awards.register_achievement("award_obsessed_with_obsidian",{
title = S("Obsessed with Obsidian"),
description = S("Mine 50 obsidian."),
icon = "miniminer.png",
background = "bg_mining.png",
trigger = {
type = "dig",
node = "default:obsidian",
target = 50
}
})
-- On the way
awards.register_achievement("award_on_the_way", {
title = S("On The Way"),
description = S("Place 100 rails."),
icon = "novicebuilder.png",
trigger = {
type = "place",
node = "default:rail",
target = 100
}
})
-- Lumberjack
awards.register_achievement("award_lumberjack", {
title = S("Lumberjack"),
description = S("Dig 100 tree blocks."),
icon = "default_tree.png",
trigger = {
type = "dig",
node = "default:tree",
target = 100
}
})
-- Semi-pro Lumberjack
awards.register_achievement("award_lumberjack_semipro", {
title = S("Semi-pro Lumberjack"),
description = S("Dig 1,000 tree blocks."),
icon = "default_tree.png",
trigger = {
type = "dig",
node = "default:tree",
target = 1000
}
})
-- Professional Lumberjack
awards.register_achievement("award_lumberjack_professional", {
title = S("Professional Lumberjack"),
description = S("Dig 10,000 tree blocks."),
icon = "default_tree.png",
trigger = {
type = "dig",
node = "default:tree",
target = 10000
}
})
-- L33T Lumberjack
awards.register_achievement("award_lumberjack_leet", {
title = S("L33T Lumberjack"),
description = S("Dig 100,000 tree blocks."),
icon = "default_tree.png",
trigger = {
type = "dig",
node = "default:tree",
target = 100000
}
})
-- Junglebaby
awards.register_achievement("award_junglebaby", {
title = S("Junglebaby"),
description = S("Dig 100 jungle tree blocks."),
icon = "default_jungletree.png",
trigger = {
type = "dig",
node = "default:jungletree",
target = 100
}
})
-- Jungleman
awards.register_achievement("award_jungleman", {
title = S("Jungleman"),
description = S("Dig 1,000 jungle tree blocks."),
icon = "default_jungletree.png",
trigger = {
type = "dig",
node = "default:jungletree",
target = 1000
}
})
-- Found some Mese!
awards.register_achievement("award_mesefind", {
title = S("First Mese Find"),
description = S("Find some Mese."),
icon = "default_mese_block.png",
background = "bg_mining.png",
trigger = {
type = "dig",
node = "default:stone_with_mese",
target = 1
}
})
-- You're a copper
awards.register_achievement("award_youre_a_copper", {
title = S("You're a copper"),
description = S("Dig 1,000 copper ores."),
icon = "miniminer.png",
background = "bg_mining.png",
trigger = {
type = "dig",
node = "default:stone_with_copper",
target = 1000
}
})
-- Found a Nyan cat!
awards.register_achievement("award_nyanfind", {
title = S("OMG, Nyan Cat!"),
description = S("Find a nyan cat."),
icon = "nyancat_front.png",
trigger = {
type = "dig",
node = "default:nyancat",
target = 1
}
})
-- Mini Miner
awards.register_achievement("award_mine2", {
title = S("Mini Miner"),
description = S("Dig 100 stone blocks."),
icon = "miniminer.png",
background = "bg_mining.png",
trigger = {
type = "dig",
node = "default:stone",
target = 100
}
})
-- Hardened Miner
awards.register_achievement("award_mine3", {
title = S("Hardened Miner"),
description = S("Dig 1,000 stone blocks"),
icon = "miniminer.png",
background = "bg_mining.png",
trigger = {
type = "dig",
node = "default:stone",
target = 1000
}
})
-- Master Miner
awards.register_achievement("award_mine4", {
title = S("Master Miner"),
description = S("Dig 10,000 stone blocks."),
icon = "miniminer.png",
background = "bg_mining.png",
trigger = {
type = "dig",
node = "default:stone",
target = 10000
}
})
-- Marchand de sable
awards.register_achievement("award_marchand_de_sable", {
title = S("Marchand De Sable"),
description = S("Dig 1,000 sand."),
background = "bg_mining.png",
trigger = {
type = "dig",
node = "default:sand",
target = 1000
}
})
awards.register_achievement("awards_crafter_of_sticks", {
title = S("Crafter of Sticks"),
description = S("Create 100 Sticks"),
trigger = {
type = "craft",
item = "default:stick",
target = 100
}
})
-- Join
awards.register_achievement("award_join2", {
title = S("Frequent Visitor"),
description = S("Connect to the server 50 times."),
trigger = {
type = "join",
target = 50
},
secret = true
})
-- Dying Spree
awards.register_achievement("award_dying_spree", {
title = S("Dying Spree"),
description = S("Die 5 times."),
trigger = {
type = "death",
target = 5
}
})
-- Bot-like
awards.register_achievement("award_bot_like", {
title = S("Bot-like"),
description = S("Die 10 times."),
trigger = {
type = "death",
target = 10
}
})
-- You Suck!
awards.register_achievement("award_you_suck", {
title = S("You Suck!"),
description = S("Die 100 times."),
trigger = {
type = "death",
target = 100
},
secret = true
})
-- Burned to death
awards.register_achievement("award_burn", {
title = S("You're a witch!"),
description = S("Burn to death in a fire.")
})
awards.register_onDeath(function(player,data)
local pos = player:getpos()
if pos and minetest.find_node_near(pos, 2, "fire:basic_flame") ~= nil then
return "award_burn"
end
return nil
end)
-- Died in flowing lava
awards.register_achievement("award_in_the_flow", {
title = S("In the Flow"),
description = S("Die in flowing lava.")
})
awards.register_onDeath(function(player,data)
local pos = player:getpos()
if pos and minetest.find_node_near(pos, 2, "default:lava_flowing") ~= nil then
return "award_in_the_flow"
end
return nil
end)
-- Die near diamond ore
awards.register_achievement("award_this_is_sad", {
title = S("This is Sad"),
description = S("Die near diamond ore.")
})
awards.register_on_death(function(player,data)
local pos = player:getpos()
if pos and minetest.find_node_near(pos, 5, "default:stone_with_diamond") ~= nil then
return "award_this_is_sad"
end
return nil
end)
-- Die near diamond ore
awards.register_achievement("award_the_stack", {
title = S("The Stack"),
description = S("Die near bones.")
})
awards.register_on_death(function(player,data)
local pos = player:getpos()
if pos and minetest.find_node_near(pos, 5, "bones:bones") ~= nil then
return "award_the_stack"
end
return nil
end)
-- Die near diamond ore
awards.register_achievement("award_deep_down", {
title = S("Deep Down"),
description = S("Die below -10000"),
secret = true
})
awards.register_on_death(function(player,data)
local pos = player:getpos()
if pos and pos.y < -10000 then
return "award_deep_down"
end
return nil
end)
-- Die near diamond ore
awards.register_achievement("award_no_screen", {
title = S("In space, no one can hear you scream"),
description = S("Die above 10000"),
secret = true
})
awards.register_on_death(function(player,data)
local pos = player:getpos()
if pos and pos.y > 10000 then
return "award_no_screen"
end
return nil
end)
-- Backwards compatibility
awards.give_achievement = awards.unlock
awards.getFormspec = awards.get_formspec
awards.showto = awards.show_to
awards.register_onDig = awards.register_on_dig
awards.register_onPlace = awards.register_on_place
awards.register_onDeath = awards.register_on_death
awards.register_onChat = awards.register_on_chat
awards.register_onJoin = awards.register_on_join
awards.register_onCraft = awards.register_on_craft
awards.def = awards.registered_awards
awards.register_achievement = awards.register_award

254
locale/awards.de.tr Normal file
View File

@ -0,0 +1,254 @@
# textdomain: awards
### api_awards.lua ###
Secret Award Unlocked: @1=
Award Unlocked: @1=
Secret Award Unlocked!=
Award Unlocked!=
### awards.lua ###
Saint-Maclou=Saint-Maclou
Place 20 coal checkers.=Platzieren Sie 20 Kohlenschachbrettmuster.
Castorama=Gießmeister
Place 20 iron checkers.=Platzieren Sie 20 Eisenschachbrettmuster.
Sam the Trapper=Sam der Fallensteller
Place 2 trap stones.=Platzieren Sie 2 Fallensteine.
Backpacker=Rucksacktourist
Craft 4 large bags.=Fertigen Sie 4 große Taschen.
Pyromaniac=Pyromane
Craft 8 times flint and steel.=Fertigen Sie 8 mal einen Feuerstein und Stahl an.
Firefighter=Feuerwehr
Put out 1000 fires.=Löschen Sie 1000 Flammen.
You're a witch!=
Burn to death in a fire.=
You Suck!=
Die 100 times.=
Death in the Deeps=
Die below -10000=
In space, no one can hear you scream=
Die above 10000=
Light It Up=Licht an!
Place 100 torches.=Platzieren Sie 100 Fackeln.
Well Lit=Gut ausgeleuchtet
Place 1,000 torches.=Platzieren Sie 1000 Fackeln.
Really Well Lit=Sehr gute Beleuchtung
Craft 10 mese lamps.=Fertigen Sie 10 Meselampen.
Outpost=Außenposten
Craft 200 stone bricks.=Fertigen Sie 200 Steinziegel.
Watchtower=Wachturm
Craft 800 stone bricks.=Fertigen Sie 800 Steinziegel an.
Fortress=Burg
Craft 3,200 stone bricks.=Fertigen Sie 3200 Steinziegel.
Desert Dweller=Wüstenbewohner
Craft 400 desert stone bricks.=Fertigen Sie 400 Wüstensteinziegel.
Pharaoh=Pharao
Craft 100 sandstone bricks.=Fertigen Sie 100 Sandsteinziegel.
Little Library=Kleine Bücherei
Craft 7 bookshelves.=Fertigen Sie 7 Bücherregale.
Lava and Water=Lava und Wasser
Mine your first obsidian.=Bauen Sie Ihr erstes Obsidian ab.
Obsessed with Obsidian=Von Obsidian besessen
Mine 50 obsidian.=Bauen Sie 50 Obsidian ab.
Lava Miner=Lavagräber
Mine any block while being very close to lava.=
On The Way=Auf dem Weg
Place 100 rails.=Platzieren Sie 100 Gleise.
First Day in the Woods=Erster Tag im Wald
Dig 6 tree blocks.=Bauen Sie 6 Baumblöcke ab.
Lumberjack=Holzfäller
Dig 36 tree blocks.=Bauen Sie 36 Baumblöcke ab.
Semi-pro Lumberjack=Fortgeschrittener Holzfäller
Dig 216 tree blocks.=Bauen Sie 216 Baumblöcke ab.
Professional Lumberjack=Profiholzfäller
Dig 1,296 tree blocks.=Bauen Sie 1296 Baumblöcke ab.
Junglebaby=Dschungelbaby
Dig 100 jungle tree blocks.=Bauen Sie 100 Dschungelbaumblöcke ab.
Jungleman=Dschungelmann
Dig 1,000 jungle tree blocks.=Bauen Sie 1000 Dschungelbaumblöcke ab.
First Mese Find=Erster Mesefund
Mine your first mese ore.=Bauen Sie Ihr erstes Meseerz ab.
Mese Mastery=Mesemeister
Mine a mese block.=Bauen Sie einen Meseblock ab.
Youre a copper=Du Kupfer!
Dig 1,000 copper ores.=Bauen Sie 1000 Kupfererze ab.
Mini Miner=Berganfänger
Dig 100 stone blocks.=Bauen Sie 100 Steinblöcke ab.
Hardened Miner=Abhehärteter Bergarbeiter
Dig 1,000 stone blocks.=Bauen Sie 1000 Steine ab.
Master Miner=Profibergarbeiter
Dig 10,000 stone blocks.=Bauen Sie 10000 Steine ab.
SandMan=
Dig 1,000 sand.=Bauen Sie 1000 Sand ab.
Crafter of Sticks=Stockmacher
Craft 100 sticks.=Fertigen Sie 100 Stöcke.
Jungle Discoverer=Dschungelerkunder
Mine your first jungle grass.=Bauen Sie Ihr erstes Dschungelgras ab.
Grasslands Discoverer=Prärieerkunder
Mine some grass.=Bauen Sie etwas Gras ab.
Savannah Discoverer=Savannenerkunder
Mine some dry grass.=Bauen Sie etwas trockenes Gras ab.
Desert Discoverer=Wüstenerkunder
Mine your first cactus.=Bauen Sie Ihren ersten Kaktus ab.
Far Lands=Ferne Lande
Mine your first dry shrub.=Bauen Sie Ihren ersten vertrockneten Strauch ab.
Glacier Discoverer=Gletschererkunder
Mine your first ice.=Bauen Sie Ihr erstes Eis ab.
Very Simple Snow Man=Sehr simpler Schneemann
Place two snow blocks.=Platzieren Sie zwei Schneeblöcke.
First Gold Find=Erster Goldfund
Mine your first gold ore.=Bauen Sie Ihr erstes Golderz ab.
Gold Rush=Goldrausch
Mine 45 gold ores.=Bauen Sie 18 Diamanterze ab.
Wow, I am Diamonds!=Wow, ich bin Diamanten!
Mine your first diamond ore.=Bauen Sie Ihr erstes Diamanterz ab.
Girl's Best Friend=Bester Freund der Mädchen
Mine 18 diamond ores.=Bauen Sie 18 Diamanterze ab.
Hardest Block on Earth=Härtester Block der Welt
Craft a diamond block.=Fertigen Sie einen Diamantblock an.
In the Dungeon=Im Verlies
Mine a mossy cobblestone.=Bauen Sie ein bemoostes Kopfsteinpflaster ab.
Smelter=Schmelzer
Craft 10 furnaces.=Fertigen Sie 10 Öfen.
Treasurer=Schatzmeister
Craft 15 chests.=Fertigen Sie 15 Truhen.
Banker=
Craft 30 locked chests.=Fertigen Sie 30 abgeschlossene Truhen.
Bricker=Ziegler
Craft 200 brick blocks.=Fertigen Sie 200 Ziegelblöcke.
House of Obsidian=Haus aus Obsidian
Craft 100 obsidian bricks.=Fertigen Sie 100 Obsidianziegel.
Build a Cave=Höhlenbauer
Place 100 stone.=Platzieren Sie 100 Steine.
Long Ladder=Lange Leiter
Place 400 wooden ladders.=Platzieren Sie 400 Holzleitern.
Industrial Age=Industriezeitalter
Place 40 steel ladders.=Platzieren Sie 40 Stahlleitern.
Yummy!=Lecker!
Eat 80 apples.=Essen Sie 80 Äpfel.
In the Flow=
Die in flowing lava.=
This is Sad=
Die near diamond ore.=
Graveyard=
Die near bones.=
Glasser=Glasmacher
Craft 14 vessels shelves.=Fertigen Sie 14 Gefäßregale.
Farming Skills Acquired=Landwirtschaft erlernt
Harvest a fully grown wheat plant.=Ernten Sie eine voll ausgewachsene Getreidepflanze.
Field Worker=Feldarbeiter
Harvest 25 fully grown wheat plants.=Ernten Sie 25 voll ausgewachsene Getreidepflanzen.
Aspiring Farmer=Aufstrebender Bauer
Harvest 125 fully grown wheat plants.=Ernten Sie 125 voll ausgewachsene Getreidepflanzen.
Wheat Magnate=Getreidemagnat
Harvest 625 fully grown wheat plants.=Ernten Sie 625 voll ausgewachsene Getreidepflanzen.
Baker=Bäcker
Eat 10 loaves of bread.=Essen Sie 10 Brote.
Wool Over Your Eyes=Wollige Augen
Craft 250 white wool.=Fertigen Sie 250 weiße Wolle.
Hotelier=Hotelier
Craft 15 fancy beds.=Fertigen Sie 15 schicke Betten.
Filthy Rich=Stinkreich
Craft 24 gold block stairs.=Fertigen Sie 24 Goldblockstufen.
Roses Are Red=Rosen sind rot
Craft 400 red dyes.=Fertigen Sie 400 rote Farbstoffe.
Dandelions are Yellow=Löwenzahn ist gelb
Craft 400 yellow dyes.=Fertigen Sie 400 gelbe Farbstoffe.
Geraniums are Blue=Geranien sind blau
Craft 400 blue dyes.=Fertigen Sie 400 blaue Farbstoffe.
White Color Stock=Weißer Farbstoffvorrat
Craft 100 white dyes.=Fertigen Sie 100 weiße Farbstoffe.
Tasty Mushrooms=Leckere Pilze
Eat 3 brown mushrooms.=Essen Sie 3 braune Pilze.
Mushroom Lover=Pilzfreund
Eat 33 brown mushrooms.=Essen Sie 33 braune Pilze.
Underground Mushroom Farmer=Unterirdischer Pilzbauer
Eat 333 brown mushrooms.=Essen Sie 333 braune Pilze.
Builder=Bauarbeiter
Engineer=
Architect=Architekt
Master Architect=Meisterarchitekt
A Cat in a Pop-Tart?!=Eine Katze im Pop-Tart?!
Mine a nyan cat.=Bauen Sie eine Nyan Cat ab.
Item transporter=
Place 10000 tubes.=
Factory=
Place 5 autocrafters.=
Electical Engineer=
Place 500 mesecon wires.=
Oil Typhoon=
Craft 500 times oil extract.=
### chat_commands.lua ###
Can manage awards of given player=
Show, clear, disable or enable player's awards=
You need awards_admin privilege!=
All your awards and statistics have been cleared. You can now start again.=
All awards and statistics of @1 have been cleared.=
Your awards are disabled.=
You have disabled awards of @1.=
Your awards are enabled.=
You have enabled awards of @1.=
<award ID>=
Show details of an award=
Award not found.=
<name>=<Name>
Get the awards statistics for the given player or yourself=
### gui.lua ###
Error: No achivements available.=
OK=OK
(Secret Award)=(Geheime Auszeichnung)
Unlock this award to find out what it is.=Verdienen Sie sich diese Auszeichnung, um herauszufinden, was sie ist.
(unlocked)=
You've disabled awards. Type /awards enable to reenable.=
Error: No award available.=
You have not unlocked any awards.=Sie haben noch keine Auszeichnungen.
@1s awards:=
Awards=Auszeichnungen
### triggers.lua ###
@1/@2 chat messages=@1/@2 Chatnachrichten
Send a chat message=
Chat @1 times=
@1/@2 joins=
Join once=
Join @1 times=
@1/@2 deaths=@1/@2 Tode
Die once of @2=
Die @1 times of @2=
Die @1 time.=Sterben Sie @1 mal.
Die @1 times.=Sterben Sie @1 mal.
@1/@2 dug=@1/@2 abgebaut
Mine: @2=Bauen Sie einen Block ab: @2
Mine: @1×@2=Bauen Sie Blöcke ab: @1×@2
Mine @1 block.=Bauen Sie einen @1 Block ab.
Mine @1 blocks.=Bauen Sie @1 Blöcke ab.
@1/@2 placed=@1/@2 platziert
Place: @2=Platzieren Sie einen Block: @2
Place: @1×@2=Platzieren Sie Blöcke: @1×@2
Place @1 block.=
Place @1 blocks.=Platzieren Sie @1 Blöcke.
@1/@2 crafted=@1/@2 gefertigt
Craft: @2=Fertigen Sie an: @2
Craft: @1×@2=Fertigen Sie an: @1×@2
Craft @1 item.=
Craft @1 items.=
@1/@2 eaten=@1/@2 gegessen
Eat @2=
Eat @1×@2=
Eat @1 item.=
Eat @1 items.=

249
locale/awards.es.tr Normal file
View File

@ -0,0 +1,249 @@
# textdomain: awards
### api_awards.lua ###
Secret Award Unlocked: @1=
Award Unlocked: @1=
Secret Award Unlocked!=
Award Unlocked!=
### awards.lua ###
Saint-Maclou=Saint-Maclou
Place 20 coal checkers.=Colocar 20 baldosas de ajedrez de carbón.
Castorama=Castorama
Place 20 iron checkers.=Colocar 20 baldosas de ajedrez de hierro.
Sam the Trapper=Sam el Atrapador
Place 2 trap stones.=Colocar 2 piedras trampa.
Backpacker=Mochilero
Craft 4 large bags.=Elaborar 4 bolsas grandes.
Pyromaniac=Piromaníaco
Craft 8 times flint and steel.=Elaborar pedernal y hierro 8 veces.
Firefighter=Bombero
Put out 1000 fires.=Apagar 1000 incendios.
You're a witch!=
Burn to death in a fire.=
You Suck!=
Die 100 times.=
Death in the Deeps=
Die below -10000=
In space, no one can hear you scream=
Die above 10000=
Light It Up=Ilumínalo
Place 100 torches.=Colocar 100 antorchas.
Well Lit=Bien Iluminado
Place 1,000 torches.=Colocar 1.000 antorchas.
Really Well Lit=Realmente Bien Iluminado
Craft 10 mese lamps.=Elaborar 10 lámparas de MESE.
Outpost=Puesto de avanzada
Craft 200 stone bricks.=Elaborar 200 ladrillos de piedra.
Watchtower=Torre del vigía
Craft 800 stone bricks.=Elaborar 800 ladrillos de piedra.
Fortress=Fortaleza
Craft 3,200 stone bricks.=Elaborar 3.200 ladrillos de piedra.
Desert Dweller=Morador Desértico
Craft 400 desert stone bricks.=Elaborar 400 ladrillos de piedra desértica.
Pharaoh=Faraón
Craft 100 sandstone bricks.=Elaborar 200 ladrillos de arenisca.
Little Library=Pequeña Biblioteca
Craft 7 bookshelves.=Elaborar 7 libreros.
Lava and Water=Lava y Agua
Mine your first obsidian.=Excavar tu primera obsidiana.
Obsessed with Obsidian=Obsesionado con la Obsidiana
Mine 50 obsidian.=Excavar 50 obsidianas.
Lava Miner=Minero de Lava
Mine any block while being very close to lava.=Excavar un bloque cerca de lava.
On The Way=En Camino
Place 100 rails.=Colocar 100 rieles.
First Day in the Woods=Primer Día en el Bosque
Dig 6 tree blocks.=Cortar 6 árboles.
Lumberjack=Leñador
Dig 36 tree blocks.=Cortar 36 árboles.
Semi-pro Lumberjack=Leñador semi-profesional
Dig 216 tree blocks.=Cortar 216 árboles.
Professional Lumberjack=Leñador profesional
Dig 1,296 tree blocks.=Cortar 1.296 árboles.
Junglebaby=Bebé de la Selva
Dig 100 jungle tree blocks.=Cortar 100 árboles selváticos.
Jungleman=Hombre de la Selva
Dig 1,000 jungle tree blocks.=Cortar 1.000 árboles selváticos.
First Mese Find=Primer Encuentro de MESE
Mine your first mese ore.=Excava tu primer mineral de MESE.
Mese Mastery=Maestría de MESE
Mine a mese block.=Excava tu primer bloque de MESE.
Youre a copper=Eres un cobre
Dig 1,000 copper ores.=Excavar 1.000 minerales de cobre
Mini Miner=Mini Minero
Dig 100 stone blocks.=Excavar 100 bloques de piedra.
Hardened Miner=Minero Curtido
Dig 1,000 stone blocks.=Excavar 1.000 bloques de piedra.
Master Miner=Minero Maestro
Dig 10,000 stone blocks.=Excavar 10.000 bloques de piedra.
SandMan=Marchand De Sable
Dig 1,000 sand.=Cavar 1.000 bloques de arena.
Crafter of Sticks=Elaborador de Varitas
Craft 100 sticks.=Elaborar 100 varitas.
Jungle Discoverer=Descubridor de Selva
Mine your first jungle grass.=Cortar tu primer pasto de selva.
Grasslands Discoverer=Descubridor de Praderas
Mine some grass.=Cortar un poco de pasto.
Savannah Discoverer=Descubridor de Savana
Mine some dry grass.=Cortar un poco de pasto seco.
Desert Discoverer=Descubridor del Desierto
Mine your first cactus.=Cortar tu primer cácto.
Far Lands=Tierras Lejanas
Mine your first dry shrub.=Cortar tu primer arbusto seco
Glacier Discoverer=Descubridor del Glaciar
Mine your first ice.=Romper tu primer bloque de hielo.
Very Simple Snow Man=Muñeco de Nieve Muy Simple
Place two snow blocks.=Colocar dos bloques de nieve.
First Gold Find=Primer Encuentro de Oro
Mine your first gold ore.=Excavar tu primer pepita de oro.
Gold Rush=Fiebre del Oro
Mine 45 gold ores.=Excavar 45 pepitas de oro.
Wow, I am Diamonds!=¡Guau, Soy Diamantes!
Mine your first diamond ore.=Excava tu primer diamante.
Girl's Best Friend=El Mejor Amigo de Las Mujeres
Mine 18 diamond ores.=Excava 10 diamantes.
Hardest Block on Earth=El Bloque Más Duro Sobre La Tierra
Craft a diamond block.=Elaborar un bloque de diamante.
In the Dungeon=En Las Mazmorras
Mine a mossy cobblestone.=Excavar unos adoquines musgosos.
Smelter=Fundidor
Craft 10 furnaces.=Elaborar 10 hornos.
Treasurer=Tesorero
Craft 15 chests.=Elaborar 15 cofres.
Banker=
Craft 30 locked chests.=Elaborar 30 bloques cerrados.
Bricker=Ladrillero
Craft 200 brick blocks.=Elaborar 200 bloques de ladrillo.
House of Obsidian=Casa de Obsidiana
Craft 100 obsidian bricks.=Elaborar 100 ladrillos de obsidiana.
Build a Cave=Construye Una Cueva
Place 100 stone.=Coloca 100 piedras.
Long Ladder=Escalerilla Larga
Place 400 wooden ladders.=Coloca 400 escalerillas de madera.
Industrial Age=Era Industrial
Place 40 steel ladders.=Coloca 40 escalerillas de acero.
Yummy!=¡Qué Rico!
Eat 80 apples.=Come 80 manzanas.
In the Flow=
Die in flowing lava.=
This is Sad=
Die near diamond ore.=
Graveyard=
Die near bones.=
Glasser=Vidriero
Craft 14 vessels shelves.=Elabora 14 estanterías para botellas.
Farming Skills Acquired=Habilidades de Granja Adquiridas
Harvest a fully grown wheat plant.=Cosecha una plantas de trigo madura.
Field Worker=Trabajador de Campo
Harvest 25 fully grown wheat plants.=Cosecha 25 plantas de trigo maduras.
Aspiring Farmer=Aspirante a Granjero
Harvest 125 fully grown wheat plants.=Cosecha 125 plantas de trigo maduras.
Wheat Magnate=Magnate del Maíz
Harvest 625 fully grown wheat plants.=Cosecha 625 plantas de trigo maduras.
Baker=Panadero
Eat 10 loaves of bread.=Come 10 rebanadas de pan.
Wool Over Your Eyes=Lana Sobre Tus Ojos
Craft 250 white wool.=Elabora 250 bloques de lana blanca.
Hotelier=Hotelero
Craft 15 fancy beds.=Elabora 15 camas de lujo.
Filthy Rich=Sucio Rico
Craft 24 gold block stairs.=Elabora 24 escaleras de bloque de oro.
Roses Are Red=Las Rosas Son Rojas
Craft 400 red dyes.=Elabora 400 colorantes rojos.
Dandelions are Yellow=Los Dientes de León Son Amarillos
Craft 400 yellow dyes.=Elabora 400 colorantes amarillos.
Geraniums are Blue=Los Geranios Son Azules
Craft 400 blue dyes.=Elabora 400 colorantes azules.
White Color Stock=Reserva de Color Blanco
Craft 100 white dyes.=Elabora 100 colorantes blancos.
Tasty Mushrooms=Ricos Hongos
Eat 3 brown mushrooms.=Come 3 hongos marrones.
Mushroom Lover=Amante de los Hongos
Eat 33 brown mushrooms.=Come 33 hongos marrones.
Underground Mushroom Farmer=Granjero de Hongos Subterráneo
Eat 333 brown mushrooms.=Come 333 hongos marrones.
Builder=Hacedor
Engineer=
Architect=Arquitecto
Master Architect=Maestro Arquitecto
A Cat in a Pop-Tart?!=¡¿Un Gato en un Pop-Tart?!
Mine a nyan cat.=Excavar un Gato Nyan.
Item transporter=
Place 10000 tubes.=
Factory=
Place 5 autocrafters.=
Electical Engineer=
Place 500 mesecon wires.=
Oil Typhoon=
Craft 500 times oil extract.=
### chat_commands.lua ###
Can manage awards of given player=
Show, clear, disable or enable player's awards=
You need awards_admin privilege!=
All your awards and statistics have been cleared. You can now start again.=
All awards and statistics of @1 have been cleared.=
Your awards are disabled.=
You have disabled awards of @1.=
Your awards are enabled.=
You have enabled awards of @1.=
<award ID>=
Show details of an award=
Award not found.=
<name>=<nombre>
Get the awards statistics for the given player or yourself=
### gui.lua ###
Error: No achivements available.=
OK=Aceptar
(Secret Award)=(Logro secreto)
Unlock this award to find out what it is.=Desbloquea éste logro para saber qué es.
(unlocked)=
You've disabled awards. Type /awards enable to reenable.=
Error: No award available.=
You have not unlocked any awards.=No has desbloqueado ningún logro.
@1s awards:=
Awards=Logros
### triggers.lua ###
@1/@2 chat messages=@1/@2 conversaciones
Send a chat message=
Chat @1 times=
@1/@2 joins=
Join once=
Join @1 times=
@1/@2 deaths=@1/@2 muertes
Die once of @2=
Die @1 times of @2=
Die @1 time.=Morir @1 vez.
Die @1 times.=Morir @1 veces.
@1/@2 dug=@1/@2 excavados
Mine: @2=Excavar: @2
Mine: @1×@2=Excavar: @1×@2
Mine @1 block.=Excavar un bloque.
Mine @1 blocks.=Excavar @1 bloques.
@1/@2 placed=@1/@2 colocados
Place: @2=Colocar: @2
Place: @1×@2=Colocar: @1×@2
Place @1 block.=
Place @1 blocks.=Colocar @1 bloques.
@1/@2 crafted=@1/@2 elaborado
Craft: @2=Elaborar: @2
Craft: @1×@2=Elaborar: @1×@2
Craft @1 item.=
Craft @1 items.=Elaborar @1 objetos.
@1/@2 eaten=@1/@2 comidos
Eat @2=
Eat @1×@2=
Eat @1 item.=
Eat @1 items.=Comer @1 objetos.

248
locale/awards.fr.tr Normal file
View File

@ -0,0 +1,248 @@
# textdomain: awards
### api_awards.lua ###
Secret Award Unlocked: @1=Succès secret débloqué: @1
Award Unlocked: @1=Succès débloqué: @1
Secret Award Unlocked!=Succès Secrète Débloqué!
Award Unlocked!=Succès Débloqué!
### awards.lua ###
Saint-Maclou=Saint-Maclou
Place 20 coal checkers.=Place 20 damiers de charbon.
Castorama=Castorama
Place 20 iron checkers.=Place 20 damiers de fer.
Sam the Trapper=Sam le Trappeur
Place 2 trap stones.=Place 2 pièges de pierre.
Backpacker=Randonneu·r·se
Craft 4 large bags.=Confectionne 4 grands sacs
Pyromaniac=Pyromane
Craft 8 times flint and steel.=Fabrique 8 silex et aciers.
Firefighter=Pompier
Put out 1000 fires.=Éteint 1000 feux.
You're a witch!=Vous êtes un·e sorci·er·ère!
Burn to death in a fire.=Brûler à mort dans un feu.
You Suck!=Tu crains!
Die 100 times.=Mourir 100 fois.
Death in the Deeps=Mort dans les profondeurs
Die below -10000=Mourir en dessous de -10000
In space, no one can hear you scream=Dans l'espace, personne ne peut t'entendre crier
Die above 10000=Mourir au dessus de 10000
Light It Up=Eclairé·e
Place 100 torches.=Place 100 torches.
Well Lit=Bien Éclairé
Place 1,000 torches.=Place 1000 torches.
Really Well Lit=Vraiment Bien Éclairé
Craft 10 mese lamps.=Fabrique 10 lampes de mese.
Outpost=Poste Avancé
Craft 200 stone bricks.=Confectionne 200 briques de pierre.
Watchtower=Tour de Garde
Craft 800 stone bricks.=Confectionne 800 briques de pierre.
Fortress=Forteresse
Craft 3,200 stone bricks.=Confectionne 3200 briques de pierre.
Desert Dweller=Habitant·e du Désert
Craft 400 desert stone bricks.=Confectionne 400 briques de pierre du désert.
Pharaoh=Pharaon
Craft 100 sandstone bricks.=Confectionne 100 briques de roche de sable.
Little Library=Petite Bibliothèque
Craft 7 bookshelves.=Fabrique 7 bibliothèques.
Lava and Water=La Lave et l'Eau
Mine your first obsidian.=Mine ton premier bloc d'obsidienne.
Obsessed with Obsidian=Obsédé·e par l'obsidienne
Mine 50 obsidian.=Mine 50 pierres d'obsidienne.
Lava Miner=Mineu·r·se de lave
Mine any block while being very close to lava.=Mine n'importe quel bloc à proximité de la lave.
On The Way=Sur La Voie
Place 100 rails.=Place 100 rails.
First Day in the Woods=Premier Jour dans les Bois
Dig 6 tree blocks.=Creuse 6 blocs d'arbre.
Lumberjack=Bûcheron·ne
Dig 36 tree blocks.=Creuse 36 blocs d'arbre.
Semi-pro Lumberjack=Bûcheron.ne. Semi-Professionnel.le.
Dig 216 tree blocks.=Creuse 216 blocs d'arbre.
Professional Lumberjack=Bûcheron·ne Professionnel·le
Dig 1,296 tree blocks.=Creuse 1296 blocs d'arbre.
Junglebaby=Enfant de la Jungle
Dig 100 jungle tree blocks.=Creuse 100 blocs d'arbres de jungle.
Jungleman=Personne de la Jungle
Dig 1,000 jungle tree blocks.=Creuse 1000 blocs d'arbre de jungle.
First Mese Find=Première Pépite : Mese
Mine your first mese ore.=Mine ton premier minerai de mese.
Mese Mastery=Maîtrise de Mese
Mine a mese block.=Mine un bloc de mese.
Youre a copper=Faîtes Jouer les Cuivres
Dig 1,000 copper ores.=Creuse 1000 minerais de cuivre.
Mini Miner=Mini Mineu·r·se
Dig 100 stone blocks.=Creuse 100 blocs de pierre.
Hardened Miner=Mineu·r·se Endurci·e
Dig 1,000 stone blocks.=Creuse 1000 blocs de pierre.
Master Miner=Maître·sse Mineu·r·se
Dig 10,000 stone blocks.=Creuse 10000 blocs de pierre.
SandMan=Marchand·e de Sable
Dig 1,000 sand.=Creuse 1000 blocs de sable.
Crafter of Sticks=Fabriquant·e de Bâtons.
Craft 100 sticks.=Confectionne 100 bâtons.
Jungle Discoverer=Explorat·eur·rice de la Jungle
Mine your first jungle grass.=Ramasse ta première herbe de jungle.
Grasslands Discoverer=Découvreu·r·se de prairies
Mine some grass.=Ramasse de l'herbe.
Savannah Discoverer=Explorat·eur·rice de la Savanne
Mine some dry grass.=Ramasse de l'herbe sèche.
Desert Discoverer=Expolrat·eur·rice du Désert.
Mine your first cactus.=Mine ton premier catus.
Far Lands=Terres Lointaines
Mine your first dry shrub.=Coupe ton premier arbuste sec.
Glacier Discoverer=Découvreu·r·se de glacier
Mine your first ice.=Creuse ton premier bloc de glace.
Very Simple Snow Man=Bonhomme de Neige Rudimentaire
Place two snow blocks.=Place deux blocs de neige.
First Gold Find=Première Pépite : Or
Mine your first gold ore.=Mine ton premier minerai d'or.
Gold Rush=Ruée vers l'Or
Mine 45 gold ores.=Mine 45 minerais d'or.
Wow, I am Diamonds!=Wow, Je suis Diamants!
Mine your first diamond ore.=Mine ton premier diamant.
Girl's Best Friend=Girl's Best Friend
Mine 18 diamond ores.=Mine 18 diamants.
Hardest Block on Earth=Le Bloc le Plus Dur du Monde
Craft a diamond block.=Confectionne un bloc de diamant.
In the Dungeon=Dans le Donjon
Mine a mossy cobblestone.=Mine un bloc de pavés moussus.
Smelter=Fondeu·r·se
Craft 10 furnaces.=Construis 10 fours.
Treasurer=Trésori·er·ère
Craft 15 chests.=Fabrique 15 coffres.
Banker=Banqui·er·ère
Craft 30 locked chests.=Fabrique 30 coffres Verrouillés.
Bricker=Briqueu·r·se
Craft 200 brick blocks.=Confectionne 200 blocs de brique.
House of Obsidian=La Maison de L'Obsidienne
Craft 100 obsidian bricks.=Confectionne 100 briques d'obsidienne.
Build a Cave=Construis une grotte
Place 100 stone.=Place 100 pierres.
Long Ladder=Longue Echelle
Place 400 wooden ladders.=Place 400 échelles en bois.
Industrial Age=Âge Industriel
Place 40 steel ladders.=Place 40 échelles métalliques.
Yummy!=Miam !
Eat 80 apples.=Mange 80 pommes.
In the Flow=Dans le flux
Die in flowing lava.=Mourir dans la lave qui coule.
This is Sad=C'est triste
Die near diamond ore.=Mourir près du minerai de diamant.
Graveyard=Cimetière
Die near bones.=Mourir près des os.
Glasser=Verri·er·ère
Craft 14 vessels shelves.=Fabrique 14 vaisseliers.
Farming Skills Acquired=Compétences Paysannes Acquises
Harvest a fully grown wheat plant.=Récolte un plant de blé à maturité.
Field Worker=Travailleu·r·se Agricole
Harvest 25 fully grown wheat plants.=Récolte 25 plants de blé à maturité.
Aspiring Farmer=Apprenti·e Fermi·er·ère
Harvest 125 fully grown wheat plants.=Récolte 125 plants de blé à maturité.
Wheat Magnate=Magnat·e du Blé
Harvest 625 fully grown wheat plants.=Récolte 625 plants de blé à maturité.
Baker=Boulang·er·ère
Eat 10 loaves of bread.=Mange 10 miches de pain.
Wool Over Your Eyes=De la Laines dans Tes Yeux
Craft 250 white wool.=Confectionne 250 blocs de laine blanche.
Hotelier=Hoteli·er·ère
Craft 15 fancy beds.=Construis 15 lits chics.
Filthy Rich=Richissime
Craft 24 gold block stairs.=Construis 24 escaliers en or.
Roses Are Red=Les Roses Sont Rouges
Craft 400 red dyes.=Prépare 400 teintures rouges.
Dandelions are Yellow=Les Pissenlits sont Jaunes.
Craft 400 yellow dyes.=Prépare 400 teintures jaunes.
Geraniums are Blue=Les Geraniums Sont Bleus
Craft 400 blue dyes.=Prépare 400 teintures bleues.
White Color Stock=Chaussettes Blanches
Craft 100 white dyes.=Prépare 100 teintures blanches.
Tasty Mushrooms=Délicieux Champignons
Eat 3 brown mushrooms.=Mange 3 champignons marrons.
Mushroom Lover=Adorat·eur·rice de Champignons
Eat 33 brown mushrooms.=Mange 33 champignons marrons.
Underground Mushroom Farmer=Culture de Champignons en Cave
Eat 333 brown mushrooms.=Mange 333 champignons marrons.
Builder=Bâtisseu·r·se
Engineer=Ingénieur·e
Architect=Architecte
Master Architect=Maître·sse Architecte
A Cat in a Pop-Tart?!=Un Chat dans un Pop-Tart ?!
Mine a nyan cat.=Mine un nyan cat.
Item transporter=Transporteur d'objets
Place 10000 tubes.=Placez 10000 tubes.
Factory=Usine
Place 5 autocrafters.=Placez 5 autocrafters.
Electical Engineer=Ingénieur éléctricien
Place 500 mesecon wires.=Placez 500 mesecon wires.
Oil Typhoon=Typhon pétrolier
Craft 500 times oil extract.=Fabriquez 500 fois l'extrait d'huile.
### chat_commands.lua ###
Can manage awards of given player=Peut gérer les récompenses d'un joueur donné
Show, clear, disable or enable player's awards=Afficher, effacer, désactiver ou activer les récompenses des joueurs
You need awards_admin privilege!=Vous avez besoin du privilège awards_admin!
All your awards and statistics have been cleared. You can now start again.=Tous vos succès et statistiques ont été réinitialisés. Vous pouvez recommencer à nouveau.
All awards and statistics of @1 have been cleared.=Toutes les récompenses et statistiques de @1 ont été effacées.
Your awards are disabled.=Vos succès sont désactivés.
You have disabled awards of @1.=Vous avez déactivé les succès de @1.
Your awards are enabled.=Vos succès sont activés.
You have enabled awards of @1.=Vous avez activé les succès de @1.
<award ID>=<succès ID>
Show details of an award=Afficher les détails d'une succès
Award not found.=Succès non trouvée.
<name>=<nom>
Get the awards statistics for the given player or yourself=Obtenez les statistiques des succèss d'un joueur donné ou de vous-même
### gui.lua ###
Error: No achivements available.=Erreur : Aucun succès disponible.
OK=OK
(Secret Award)=(Succès Secret)
Unlock this award to find out what it is.=Débloque ce succès pour découvrir ce que c'est.
(unlocked)=(débloqué)
You've disabled awards. Type /awards enable to reenable.=Vous avez désactivé les succès. Tapez '/awards enable' pour les réactiver.
Error: No award available.=Erreur : Aucun succès disponible.
You have not unlocked any awards.=Vous n'avez encore débloqué aucun succès.
@1s awards:=Succès de @1:
Awards=Succès
### triggers.lua ###
@1/@2 chat messages=@1/@2 messages de chat
Send a chat message=Envoyer un message de chat
Chat @1 times=Discuter @1 fois
@1/@2 joins=@1/@2 connections
Join once=Connecte toi une fois
Join @1 times=Connecte toi @1 fois
@1/@2 deaths=@1/@2 morts
Die once of @2=Mourir une fois sur @2
Die @1 times of @2=Mort·e @1 fois sur @2
Die @1 time.=Mort·e @1 fois.
Die @1 times.=Mort·e @1 fois.
@1/@2 dug=@1/@2 creusés
Mine: @2=Mine : @2
Mine: @1×@2=Mine : @1×@2
Mine @1 block.=Creuse @1 bloc.
Mine @1 blocks.=Creuse @1 blocs.
@1/@2 placed=@1/@2 placés
Place: @2=Place : @2
Place: @1×@2=Place : @1×@2
Place @1 block.=Place @1 bloc.
Place @1 blocks.=Place @1 blocs.
@1/@2 crafted=@1/@2 craftés
Craft: @2=Fabrique : @2
Craft: @1×@2=Fabrique : @1×@2
Craft @1 item.=Confectionne @1 objet
Craft @1 items.=Confectionne @1 objets.
@1/@2 eaten=@1/@2 Mangés
Eat @2=Mange @2
Eat @1×@2=Mange @1×@2
Eat @1 item.=Mange @1 aliment.
Eat @1 items.=Mange @1 aliments.

249
locale/awards.pt.tr Normal file
View File

@ -0,0 +1,249 @@
# textdomain: awards
### api_awards.lua ###
Secret Award Unlocked: @1=
Award Unlocked: @1=
Secret Award Unlocked!=
Award Unlocked!=
### awards.lua ###
Saint-Maclou=Saint-Maclou
Place 20 coal checkers.=
Castorama=
Place 20 iron checkers.=
Sam the Trapper=
Place 2 trap stones.=
Backpacker=
Craft 4 large bags.=
Pyromaniac=Piromaníaco
Craft 8 times flint and steel.=Montar acendedor de Ferro e Pederneira 8 vezes.
Firefighter=Bombeiro
Put out 1000 fires.=Apagar fogo 1000 vezes.
You're a witch!=
Burn to death in a fire.=
You Suck!=
Die 100 times.=
Death in the Deeps=
Die below -10000=
In space, no one can hear you scream=
Die above 10000=
Light It Up=Ilumine Isso
Place 100 torches.=Colocar 100 tochas.
Well Lit=Bem Iluminado
Place 1,000 torches.=Colocar 1.000 tochas.
Really Well Lit=Realmente Bem Iluminado
Craft 10 mese lamps.=Fazer 10 lâmpadas de mese.
Outpost=Posto Avançado
Craft 200 stone bricks.=Fazer 200 tijolos de pedra.
Watchtower=Sentinela
Craft 800 stone bricks.=Fazer 800 tijolos de pedra.
Fortress=Fortaleza
Craft 3,200 stone bricks.=Fazer 3.200 tijolos de pedra.
Desert Dweller=Morador do Deserto
Craft 400 desert stone bricks.=Fazer 400 Tijolos de pedra do deserto.
Pharaoh=Faraó
Craft 100 sandstone bricks.=Fazer 100 tijolos de arenito.
Little Library=Pequena Biblioteca
Craft 7 bookshelves.=Fazer 7 estantes de livros.
Lava and Water=Lava e Água
Mine your first obsidian.=Cavar sua primeira obsidiana.
Obsessed with Obsidian=Obcecado por Obsidiana
Mine 50 obsidian.=Minerar 50 obsidianas.
Lava Miner=Minerador de Lava
Mine any block while being very close to lava.=Minerar qualquer bloco enquanto estiver mergulhado em lava.
On The Way=No Caminho
Place 100 rails.=Colocar 100 trilhos.
First Day in the Woods=Primeiro dia na Floresta
Dig 6 tree blocks.=Cortar 6 blocos de árvore.
Lumberjack=Lenhador
Dig 36 tree blocks.=Cortar 36 blocos de árvore.
Semi-pro Lumberjack=Lenhador Semi-Profissional
Dig 216 tree blocks.=Cortar 216 blocos de árvore.
Professional Lumberjack=Lenhador Profissional
Dig 1,296 tree blocks.=Cortar 1.296 blocos de árvore.
Junglebaby=Bebê Selvagem
Dig 100 jungle tree blocks.=Cortar 100 blocos de árvore selvagem.
Jungleman=Homem Selvagem
Dig 1,000 jungle tree blocks.=Cortar 1.000 blocos de árvore selvagem.
First Mese Find=Primeiro Mese
Mine your first mese ore.=Cavar seu primeiro mese.
Mese Mastery=Mestre do Mese
Mine a mese block.=Cavar um bloco de mese.
Youre a copper=Sou um Cobre
Dig 1,000 copper ores.=Minerar 1.000 cobres.
Mini Miner=Mini Minerador
Dig 100 stone blocks.=Minerar 100 blocos de pedra.
Hardened Miner=Minerador Avançado
Dig 1,000 stone blocks.=Minerar 1.000 blocos de pedra.
Master Miner=Minerador Mestre
Dig 10,000 stone blocks.=Minerar 10.000 blocos de pedra.
SandMan=Vendedor de Areia
Dig 1,000 sand.=Cavar 1.000 blocos de areia.
Crafter of Sticks=Rachador de Lenha
Craft 100 sticks.=Lenhar 100 gravetos.
Jungle Discoverer=Desbravador Selvagem
Mine your first jungle grass.=Cortar seu primeiro mato selvagem.
Grasslands Discoverer=Descobridor do Gramado
Mine some grass.=Minerar algum mato
Savannah Discoverer=Descobridor da Savana
Mine some dry grass.=Minerar algum mato seco.
Desert Discoverer=Descobridor do Deserto
Mine your first cactus.=Cortar seu primeiro cacto.
Far Lands=Terras Distantes
Mine your first dry shrub.=Minerar seu primeiro arbusto seco.
Glacier Discoverer=Descobridor Glacial
Mine your first ice.=Quebrar seu primeiro bloco de gelo.
Very Simple Snow Man=Homem de Neve Muito Simples
Place two snow blocks.=Colocar 2 blocos de neve.
First Gold Find=Achei Ouro
Mine your first gold ore.=Minerar sua primeira de ouro.
Gold Rush=Corriga do Ouro
Mine 45 gold ores.=Minerar 45 de ouro.
Wow, I am Diamonds!=Uau, Diamante!
Mine your first diamond ore.=Minerar seu primeiro diamante.
Girl's Best Friend=Melhor Amigo da Menina
Mine 18 diamond ores.=Minere 18 diamantes.
Hardest Block on Earth=O Bloco mais Duro da Terra
Craft a diamond block.=Montar um bloco de diamante.
In the Dungeon=Na Masmorra
Mine a mossy cobblestone.=Minerar um pedregulho com musgo.
Smelter=Fundidor
Craft 10 furnaces.=Montar 10 fornos.
Treasurer=Tesoureiro
Craft 15 chests.=Montar 10 baús.
Banker=
Craft 30 locked chests.=Montar 30 baús trancados.
Bricker=Tijoleiro
Craft 200 brick blocks.=Fazer 200 blocos de tijolo.
House of Obsidian=Casa de Obsidiana
Craft 100 obsidian bricks.=Montar 100 tijolos de obsidiana.
Build a Cave=Montar uma Caverna
Place 100 stone.=Colocar 100 pedras.
Long Ladder=Longa Escadaria
Place 400 wooden ladders.=Colocar 400 escadas de madeira.
Industrial Age=Era Industrial
Place 40 steel ladders.=Colocar 40 escadas de ferro.
Yummy!=Humm!
Eat 80 apples.=Comer 80 maçãs.
In the Flow=
Die in flowing lava.=
This is Sad=
Die near diamond ore.=
Graveyard=
Die near bones.=
Glasser=Vidraceiro
Craft 14 vessels shelves.=Montar 14 estantes de frascos.
Farming Skills Acquired=Conhecimento de Cultivo Adquirido
Harvest a fully grown wheat plant.=Colher um trigo totalmente crescido.
Field Worker=Trabalhador do Campo
Harvest 25 fully grown wheat plants.=Colher 25 plantas trigos totalmente crescidos.
Aspiring Farmer=Fazendeiro Aspirante
Harvest 125 fully grown wheat plants.=Colher 125 plantas trigos totalmente crescidos.
Wheat Magnate=Magnata do Trigo
Harvest 625 fully grown wheat plants.=Colher 625 plantas trigos totalmente crescidos.
Baker=Padeiro
Eat 10 loaves of bread.=Comer 10 pães.
Wool Over Your Eyes=Lã Sobre Meus Olhos
Craft 250 white wool.=Tecer 250 lãs branca.
Hotelier=Hoteleiro
Craft 15 fancy beds.=Montar 15 camas chiques.
Filthy Rich=Muito Rico
Craft 24 gold block stairs.=Montar 24 escadas de bloco de ouro.
Roses Are Red=Rosas São Vermelhas
Craft 400 red dyes.=Fazer 400 tintas vermelhas.
Dandelions are Yellow=Dentes-de-Leões são Amarelos
Craft 400 yellow dyes.=Fazer 400 tintas amarelas.
Geraniums are Blue=Gerânios são Azuis
Craft 400 blue dyes.=Fazer 400 tintas azuis.
White Color Stock=Estoque de Cor Branca
Craft 100 white dyes.=Fazer 100 tintas brancas.
Tasty Mushrooms=Cogumelos Deliciosos
Eat 3 brown mushrooms.=Comer 3 cogumelos marrons.
Mushroom Lover=Amante de Cogumelo
Eat 33 brown mushrooms.=Comer 33 cogumelos marrons.
Underground Mushroom Farmer=Fazendeiro Subterrâneo de Cogumelos
Eat 333 brown mushrooms.=Comer 333 cogumelos marrons.
Builder=Construtor
Engineer=
Architect=Arquiteto
Master Architect=Arquiteto Mestre
A Cat in a Pop-Tart?!=Um Gato em um Pop-Tart?!
Mine a nyan cat.=Capturar um gato nyan.
Item transporter=
Place 10000 tubes.=
Factory=
Place 5 autocrafters.=
Electical Engineer=
Place 500 mesecon wires.=
Oil Typhoon=
Craft 500 times oil extract.=
### chat_commands.lua ###
Can manage awards of given player=
Show, clear, disable or enable player's awards=
You need awards_admin privilege!=
All your awards and statistics have been cleared. You can now start again.=Todas as suas conquistas e estatísticas foram limpas. Agora podes iniciar novamente.
All awards and statistics of @1 have been cleared.=
Your awards are disabled.=
You have disabled awards of @1.=
Your awards are enabled.=
You have enabled awards of @1.=
<award ID>=
Show details of an award=
Award not found.=
<name>=<jogador>
Get the awards statistics for the given player or yourself=
### gui.lua ###
Error: No achivements available.=
OK=OK
(Secret Award)=(Conquista Secreta)
Unlock this award to find out what it is.=Desbloqueie essa conquista para descobrir o que significa.
(unlocked)=
You've disabled awards. Type /awards enable to reenable.=Desabilitaste as conquistas. Digite /awards enable para reabilitar.
Error: No award available.=
You have not unlocked any awards.=Nenhuma conquista desbloqueada ainda.
@1s awards:=
Awards=Conquistas
### triggers.lua ###
@1/@2 chat messages=@1 de @2
Send a chat message=
Chat @1 times=
@1/@2 joins=
Join once=
Join @1 times=
@1/@2 deaths=@1 de @2 mortes
Die once of @2=
Die @1 times of @2=
Die @1 time.=Morrer 1 vez.
Die @1 times.=Morrer @1 vezes.
@1/@2 dug=@1 de @2 obtidos
Mine: @2=Cavar: @2
Mine: @1×@2=Minar: @1×@2
Mine @1 block.=Cavar um bloco.
Mine @1 blocks.=Cavar @1 blocos.
@1/@2 placed=@1 de @2 colocados
Place: @2=Colocar: @2
Place: @1×@2=Place: @1×@2
Place @1 block.=
Place @1 blocks.=Colocar @1 blocos.
@1/@2 crafted=@1 de @2 feitos
Craft: @2=Fazer @2
Craft: @1×@2=Montar @2 @1 vezes
Craft @1 item.=
Craft @1 items.=Fazer @1 itens.
@1/@2 eaten=@1 de @2 consumidos
Eat @2=
Eat @1×@2=
Eat @1 item.=
Eat @1 items.=Consumir @1 itens.

View File

@ -1,61 +1,248 @@
Achievement Unlocked: =
Light It Up =
Place 100 torches. =
Light ALL The Things! =
Place 1,000 torches. =
# textdomain: awards
### api_awards.lua ###
Secret Award Unlocked: @1=
Award Unlocked: @1=
Secret Award Unlocked!=
Award Unlocked!=
### awards.lua ###
Saint-Maclou=
Place 20 coal checkers.=
Castorama=
Place 20 iron checkers.=
Sam the Trapper=
Place 2 trap stones.=
Backpacker=
Craft 4 large bags.=
Pyromaniac=
Craft 8 times flint and steel.=
Firefighter=
Put out 1000 fires.=
You're a witch!=
Burn to death in a fire.=
You Suck!=
Die 100 times.=
Death in the Deeps=
Die below -10000=
In space, no one can hear you scream=
Die above 10000=
Light It Up=
Place 100 torches.=
Well Lit=
Place 1,000 torches.=
Really Well Lit=
Craft 10 mese lamps.=
Outpost=
Craft 200 stone bricks.=
Watchtower=
Craft 800 stone bricks.=
Fortress=
Craft 3,200 stone bricks.=
Desert Dweller=
Craft 400 desert stone bricks.=
Pharaoh=
Craft 100 sandstone bricks.=
Little Library=
Craft 7 bookshelves.=
Lava and Water=
Mine your first obsidian.=
Obsessed with Obsidian=
Mine 50 obsidian.=
Lava Miner=
Mine any block while being very close to lava.=
On The Way=
Place 100 rails.=
First Day in the Woods=
Dig 6 tree blocks.=
Lumberjack=
Dig 100 tree blocks. =
Dig 36 tree blocks.=
Semi-pro Lumberjack=
Dig 1,000 tree blocks. =
Dig 216 tree blocks.=
Professional Lumberjack=
Dig 10,000 tree blocks. =
L33T Lumberjack =
Dig 100,000 tree blocks. =
Dig 1,296 tree blocks.=
Junglebaby=
Dig 100 jungle tree blocks.=
Jungleman=
Dig 1,000 jungle tree blocks.=
First Mese Find=
Find some Mese. =
You're a copper =
Mine your first mese ore.=
Mese Mastery=
Mine a mese block.=
Youre a copper=
Dig 1,000 copper ores.=
OMG, Nyan Cat! =
Find a nyan cat. =
Mini Miner=
Dig 100 stone blocks.=
Hardened Miner=
Dig 1,000 stone blocks =
Dig 1,000 stone blocks.=
Master Miner=
Dig 10,000 stone blocks.=
Marchand De Sable =
SandMan=
Dig 1,000 sand.=
Frequent Visitor =
Connect to the server 50 times. =
Dying Spree =
Die 5 times. =
Bot-like =
Die 10 times. =
You Suck! =
Die 100 times. =
You're a witch! =
Burn to death in a fire. =
Crafter of Sticks=
Craft 100 sticks.=
Jungle Discoverer=
Mine your first jungle grass.=
Grasslands Discoverer=
Mine some grass.=
Savannah Discoverer=
Mine some dry grass.=
Desert Discoverer=
Mine your first cactus.=
Far Lands=
Mine your first dry shrub.=
Glacier Discoverer=
Mine your first ice.=
Very Simple Snow Man=
Place two snow blocks.=
First Gold Find=
Mine your first gold ore.=
Gold Rush=
Mine 45 gold ores.=
Wow, I am Diamonds!=
Mine your first diamond ore.=
Girl's Best Friend=
Mine 18 diamond ores.=
Hardest Block on Earth=
Craft a diamond block.=
In the Dungeon=
Mine a mossy cobblestone.=
Smelter=
Craft 10 furnaces.=
Treasurer=
Craft 15 chests.=
Banker=
Craft 30 locked chests.=
Bricker=
Craft 200 brick blocks.=
House of Obsidian=
Craft 100 obsidian bricks.=
Build a Cave=
Place 100 stone.=
Long Ladder=
Place 400 wooden ladders.=
Industrial Age=
Place 40 steel ladders.=
Yummy!=
Eat 80 apples.=
In the Flow=
Die in flowing lava.=
This is Sad=
Die near diamond ore.=
The Stack =
Graveyard=
Die near bones.=
Deep Down =
Die below -10000 =
In space, no one can hear you scream =
Die above 10000 =
Glasser=
Craft 14 vessels shelves.=
Farming Skills Acquired=
Harvest a fully grown wheat plant.=
Field Worker=
Harvest 25 fully grown wheat plants.=
Aspiring Farmer=
Harvest 125 fully grown wheat plants.=
Wheat Magnate=
Harvest 625 fully grown wheat plants.=
Baker=
Eat 10 loaves of bread.=
Wool Over Your Eyes=
Craft 250 white wool.=
Hotelier=
Craft 15 fancy beds.=
Filthy Rich=
Craft 24 gold block stairs.=
Roses Are Red=
Craft 400 red dyes.=
Dandelions are Yellow=
Craft 400 yellow dyes.=
Geraniums are Blue=
Craft 400 blue dyes.=
White Color Stock=
Craft 100 white dyes.=
Tasty Mushrooms=
Eat 3 brown mushrooms.=
Mushroom Lover=
Eat 33 brown mushrooms.=
Underground Mushroom Farmer=
Eat 333 brown mushrooms.=
Builder=
Engineer=
Architect=
Master Architect=
A Cat in a Pop-Tart?!=
Mine a nyan cat.=
Item transporter=
Place 10000 tubes.=
Factory=
Place 5 autocrafters.=
Electical Engineer=
Place 500 mesecon wires.=
Oil Typhoon=
Craft 500 times oil extract.=
### chat_commands.lua ###
Can manage awards of given player=
Show, clear, disable or enable player's awards=
You need awards_admin privilege!=
All your awards and statistics have been cleared. You can now start again.=
All awards and statistics of @1 have been cleared.=
Your awards are disabled.=
You have disabled awards of @1.=
Your awards are enabled.=
You have enabled awards of @1.=
<award ID>=
Show details of an award=
Award not found.=
<name>=
Get the awards statistics for the given player or yourself=
### gui.lua ###
Error: No achivements available.=
OK=
(Secret Award)=
Unlock this award to find out what it is.=
(unlocked)=
You've disabled awards. Type /awards enable to reenable.=
Error: No award available.=
You have not unlocked any awards.=
@1s awards:=
Awards=
### triggers.lua ###
@1/@2 chat messages=
Send a chat message=
Chat @1 times=
@1/@2 joins=
Join once=
Join @1 times=
@1/@2 deaths=
Die once of @2=
Die @1 times of @2=
Die @1 time.=
Die @1 times.=
@1/@2 dug=
Mine: @2=
Mine: @1×@2=
Mine @1 block.=
Mine @1 blocks.=
@1/@2 placed=
Place: @2=
Place: @1×@2=
Place @1 block.=
Place @1 blocks.=
@1/@2 crafted=
Craft: @2=
Craft: @1×@2=
Craft @1 item.=
Craft @1 items.=
@1/@2 eaten=
Eat @2=
Eat @1×@2=
Eat @1 item.=
Eat @1 items.=

View File

@ -1,7 +1,8 @@
name = awards
title = Achievements
title = Awards
author = rubenwardy
description = Adds achievements to Minetest, and an API to register new ones.
license = LGPL 2.1 or later
description = Adds awards to Minetest, and an API to register new ones.
optional_depends = intllib,sfinv,unified_inventory,default,stairs,farming,dye,beds,wool,vessels,moreblocks,fire,flowers,nyancat
license = MIT
forum = https://forum.minetest.net/viewtopic.php?t=4870
version = 2.2.0
version = 3.0.0

138
readme.md
View File

@ -1,138 +0,0 @@
# Awards
by Andrew "Rubenwardy" Ward, LGPL 2.1 or later.
This mod adds achievements to Minetest.
Majority of awards are back ported from Calinou's
old fork in Carbone, under same license.
# Basic API
* awards.register_achievement(name, def)
* name
* desciption
* sound [optional]
* image [optional] - texture name, eg: award_one.png
* background [optional] - texture name, eg: award_one.png
* trigger [optional] [table]
* type - "dig", "place", "craft", "death", "chat" or "join"
* (for dig/place type) node - the nodes name
* (for craft type) item - the items name
* (for all types) target - how many to dig / place
* See Triggers
* secret [optional] - if true, then player needs to unlock to find out what it is.
* on_unlock [optional] - func(name, def)
* name is player name
* return true to cancel register_on_unlock callbacks and HUD
* awards.register_trigger(name, func(awardname, def))
* Note: awards.on[name] is automatically created for triggers
* awards.run_trigger_callbacks(player, data, trigger, table_func(entry))
* Goes through and checks all triggers registered to a trigger type,
unlocking the award if conditions are met.
* data is the player's award data, ie: awards.players[player_name]
* trigger is the name of the trigger type. Ie: awards.on[trigger]
* table_func is called if the trigger is a table - simply return an
award name to unlock it
* See triggers.lua for examples
* awards.increment_item_counter(data, field, itemname)
* add to an item's statistic count
* for example, (data, "place", "default:stone") will add 1 to the number of
times default:stone has been placed.
* data is the player's award data, ie: awards.players[player_name]
* returns true on success, false on failure (eg: cannot get modname and item from itemname)
* awards.register_on_unlock(func(name, def))
* name is the player name
* def is the award def.
* return true to cancel HUD
* awards.unlock(name, award)
* gives an award to a player
* name is the player name
# Included in the Mod
The API, above, allows you to register awards
and triggers (things that look for events and unlock awards, they need
to be registered in order to get details from award_def.trigger).
However, all awards and triggers are separate from the API.
They can be found in init.lua and triggers.lua
## Triggers
Callbacks (register a function to be run)
### dig
trigger = {
type = "dig",
node = "default:dirt",
target = 50
}
### place
trigger = {
type = "place",
node = "default:dirt",
target = 50
}
### death
trigger = {
type = "death",
target = 5
}
### chat
trigger = {
type = "chat",
target = 100
}
### join
trigger = {
type = "join",
target = 100
}
## Callbacks relating to triggers
* awards.register_on_dig(func(player, data))
* data is player data (see below)
* return award name or null
* awards.register_on_place(func(player, data))
* data is player data (see below)
* return award name or null
* awards.register_on_death(func(player, data))
* data is player data (see below)
* return award name or null
* awards.register_on_chat(func(player, data))
* data is player data (see below)
* return award name or null
* awards.register_on_join(func(player, data)
* data is player data (see below)
* return award name or null
# Player Data
A list of data referenced/hashed by the player's name.
* player name
* name [string]
* count [table] - dig counter
* modname [table]
* itemname [int]
* place [table] - place counter
* modname [table]
* itemname [int]
* craft [table] - craft counter
* modname [table]
* itemname [int]
* deaths
* chats
* joins

2
settingtypes.txt Normal file
View File

@ -0,0 +1,2 @@
# Add default achievements from the awards mod
awards.add_defaults (Add Default Achievements) bool true

Binary file not shown.

255
src/api_awards.lua Normal file
View File

@ -0,0 +1,255 @@
-- Copyright (c) 2013-18 rubenwardy. MIT.
local S = awards.get_translator
function awards.register_award(name, def)
def.name = name
-- Add Triggers
if def.trigger and def.trigger.type then
local tdef = awards.registered_triggers[def.trigger.type]
assert(tdef, "Trigger not found: " .. def.trigger.type)
tdef:on_register(def)
end
function def:can_unlock(data)
if not self.requires then
return true
end
for i=1, #self.requires do
if not data.unlocked[self.requires[i]] then
return false
end
end
return true
end
-- Add Award
awards.registered_awards[name] = def
local tdef = awards.registered_awards[name]
if def.description == nil and tdef.getDefaultDescription then
def.description = tdef:getDefaultDescription()
end
end
-- This function is called whenever a target condition is met.
-- It checks if a player already has that award, and if they do not,
-- it gives it to them
----------------------------------------------
--awards.unlock(name, award)
-- name - the name of the player
-- award - the name of the award to give
function awards.unlock(name, award)
-- Ensure the player is online.
if not minetest.get_player_by_name(name) then
return
end
-- Access Player Data
local data = awards.player(name)
local awdef = awards.registered_awards[award]
assert(awdef, "Unable to unlock an award which doesn't exist!")
if data.disabled or
(data.unlocked[award] and data.unlocked[award] == award) then
return
end
if not awdef:can_unlock(data) then
minetest.log("warning", "can_unlock returned false in unlock of " ..
award .. " for " .. name)
return
end
-- Unlock Award
minetest.log("action", name.." has unlocked award "..award)
data.unlocked[award] = award
awards.save()
-- Give Prizes
if awdef and awdef.prizes then
for i = 1, #awdef.prizes do
local itemstack = ItemStack(awdef.prizes[i])
if not itemstack:is_empty() then
local receiverref = minetest.get_player_by_name(name)
if receiverref then
receiverref:get_inventory():add_item("main", itemstack)
end
end
end
end
-- Run callbacks
if awdef.on_unlock and awdef.on_unlock(name, awdef) then
return
end
for _, callback in pairs(awards.on_unlock) do
if callback(name, awdef) then
return
end
end
-- Get Notification Settings
local title = awdef.title or award
local desc = awdef.description or ""
local background = awdef.hud_background or awdef.background or "awards_bg_default.png"
local icon = (awdef.icon or "awards_unknown.png") .. "^[resize:32x32"
local sound = awdef.sound
if sound == nil then
-- Explicit check for nil because sound could be `false` to disable it
sound = {name="awards_got_generic", gain=0.25}
end
-- Do Notification
if sound then
-- Enforce sound delay to prevent sound spamming
local lastsound = data.lastsound
if lastsound == nil or os.difftime(os.time(), lastsound) >= 1 then
minetest.sound_play(sound, {to_player=name})
data.lastsound = os.time()
end
end
if awards.show_mode == "chat" then
local chat_announce
if awdef.secret then
chat_announce = S("Secret Award Unlocked: @1", title)
else
chat_announce = S("Award Unlocked: @1", title)
end
-- use the chat console to send it
minetest.chat_send_player(name, chat_announce)
if desc~="" then
minetest.chat_send_player(name, desc)
end
else
local player = minetest.get_player_by_name(name)
if not (player and player.is_player and player:is_player()) then
return
end
local one = player:hud_add({
hud_elem_type = "image",
name = "award_bg",
scale = {x = 2, y = 1},
text = background,
position = {x = 0.5, y = 0.05},
offset = {x = 0, y = 138},
alignment = {x = 0, y = -1}
})
local hud_announce
if awdef.secret then
hud_announce = S("Secret Award Unlocked!")
else
hud_announce = S("Award Unlocked!")
end
local two = player:hud_add({
hud_elem_type = "text",
name = "award_au",
number = 0xFFFFFF,
scale = {x = 100, y = 20},
text = hud_announce,
position = {x = 0.5, y = 0.05},
offset = {x = 0, y = 45},
alignment = {x = 0, y = -1}
})
local three = player:hud_add({
hud_elem_type = "text",
name = "award_title",
number = 0xFFFFFF,
scale = {x = 100, y = 20},
text = title,
position = {x = 0.5, y = 0.05},
offset = {x = 0, y = 100},
alignment = {x = 0, y = -1}
})
local four = player:hud_add({
hud_elem_type = "image",
name = "award_icon",
scale = {x = 2, y = 2}, -- adjusted for 32x32 from x/y = 4
text = icon,
position = {x = 0.5, y = 0.05},
offset = {x = -200.5, y = 126},
alignment = {x = 0, y = -1}
})
minetest.after(4, function()
local player2 = minetest.get_player_by_name(name)
if player2 then
player2:hud_remove(one)
player2:hud_remove(two)
player2:hud_remove(three)
player2:hud_remove(four)
end
end)
end
end
function awards.get_award_states(name)
local hash_is_unlocked = {}
local retval = {}
-- Add all unlocked awards
local data = awards.player(name)
if data and data.unlocked then
for awardname, _ in pairs(data.unlocked) do
local def = awards.registered_awards[awardname]
if def then
hash_is_unlocked[awardname] = true
local score = -100000
local difficulty = def.difficulty or 1
if def.trigger and def.trigger.target then
difficulty = difficulty * def.trigger.target
end
score = score + difficulty
retval[#retval + 1] = {
name = awardname,
def = def,
unlocked = true,
started = true,
score = score,
progress = nil,
}
end
end
end
-- Add all locked awards
for _, def in pairs(awards.registered_awards) do
if not hash_is_unlocked[def.name] and def:can_unlock(data) then
local progress = def.get_progress and def:get_progress(data)
local started = false
local score = def.difficulty or 1
if def.secret then
score = 1000000
elseif def.trigger and def.trigger.target and progress then
local perc = progress.current / progress.target
score = score * (1 - perc) * def.trigger.target
if perc < 0.001 then
score = score + 100
else
started = true
end
else
score = 100
end
retval[#retval + 1] = {
name = def.name,
def = def,
unlocked = false,
started = started,
score = score,
progress = progress,
}
end
end
table.sort(retval, function(a, b)
return a.score < b.score
end)
return retval
end

219
src/api_triggers.lua Normal file
View File

@ -0,0 +1,219 @@
-- Copyright (c) 2013-18 rubenwardy. MIT.
local NS = awards.ngettext
local S = awards.get_translator
awards.on = {}
local default_def = {}
function default_def:run_callbacks(player, data, table_func)
for i = 1, #self.on do
local res = nil
local entry = self.on[i]
if type(entry) == "function" then
res = entry(player, data)
elseif type(entry) == "table" and entry.award then
res = table_func(entry)
end
if res then
awards.unlock(player:get_player_name(), res)
end
end
end
function awards.register_trigger(tname, tdef)
assert(type(tdef) == "table",
"Passing a callback to register_trigger is not supported in 3.0")
tdef.name = tname
for key, value in pairs(default_def) do
tdef[key] = value
end
if tdef.type == "counted" then
local old_reg = tdef.on_register
function tdef:on_register(def)
local tmp = {
award = def.name,
target = def.trigger.target,
}
tdef.register(tmp)
function def.get_progress(_, data)
local current = math.min(data[tname] or 0, tmp.target)
return {
current = current,
target = tmp.target,
label = S(tdef.progress, current, tmp.target),
}
end
function def.getDefaultDescription(_)
local n = def.trigger.target
return NS(tdef.auto_description[1], tdef.auto_description[2], n, n)
end
if old_reg then
return old_reg(tdef, def)
end
end
function tdef.notify(player)
assert(player and player.is_player and player:is_player())
local name = player:get_player_name()
local data = awards.player(name)
-- Increment counter
local currentVal = (data[tname] or 0) + 1
data[tname] = currentVal
tdef:run_callbacks(player, data, function(entry)
if entry.target and entry.award and currentVal and
currentVal >= entry.target then
return entry.award
end
end)
end
awards["notify_" .. tname] = tdef.notify
elseif tdef.type == "counted_key" then
if tdef.key_is_item then
tdef.watched_groups = {}
end
-- On award register
local old_reg = tdef.on_register
function tdef:on_register(def)
-- Register trigger
local tmp = {
award = def.name,
key = tdef:get_key(def),
target = def.trigger.target,
}
tdef.register(tmp)
-- If group, add it to watch list
if tdef.key_is_item and tmp.key and tmp.key:sub(1, 6) == "group:" then
tdef.watched_groups[tmp.key:sub(7, #tmp.key)] = true
end
-- Called to get progress values and labels
function def.get_progress(_, data)
data[tname] = data[tname] or {}
local done
if tmp.key then
done = data[tname][tmp.key] or 0
else
done = data[tname].__total or 0
end
done = math.min(done, tmp.target)
return {
current = done,
target = tmp.target,
label = S(tdef.progress, done, tmp.target),
}
end
-- Build description if none is specificed by the award
function def.getDefaultDescription(_)
local n = def.trigger.target
if tmp.key then
local nname = tmp.key
return NS(tdef.auto_description[1],
tdef.auto_description[2], n, n, nname)
else
return NS(tdef.auto_description_total[1],
tdef.auto_description_total[2], n, n)
end
end
-- Call on_register in trigger type definition
if old_reg then
return old_reg(tdef, def)
end
end
function tdef.notify(player, key, n)
n = n or 1
if tdef.key_is_item and key:sub(1, 6) ~= "group:" then
local itemdef = minetest.registered_items[key]
if itemdef then
for groupname,rating in pairs(itemdef.groups or {}) do
if rating ~= 0 and tdef.watched_groups[groupname] then
tdef.notify(player, "group:" .. groupname, n)
end
end
end
end
assert(player and player.is_player and player:is_player() and key)
local name = player:get_player_name()
local data = awards.player(name)
-- Increment counter
data[tname] = data[tname] or {}
local currentVal = (data[tname][key] or 0) + n
data[tname][key] = currentVal
data[tname].__total = (data[tname].__total or 0)
if key:sub(1, 6) ~= "group:" then
data[tname].__total = data[tname].__total + n
end
tdef:run_callbacks(player, data, function(entry)
local current
if entry.key == key then
current = currentVal
elseif entry.key == nil then
current = data[tname].__total
else
return
end
if current >= entry.target then
return entry.award
end
end)
end
awards["notify_" .. tname] = tdef.notify
elseif tdef.type and tdef.type ~= "custom" then
error("Unrecognised trigger type " .. tdef.type)
end
awards.registered_triggers[tname] = tdef
tdef.on = {}
tdef.register = function(func)
table.insert(tdef.on, func)
end
-- Backwards compat
awards.on[tname] = tdef.on
awards['register_on_' .. tname] = tdef.register
return tdef
end
function awards.increment_item_counter(data, field, itemname, count)
itemname = minetest.registered_aliases[itemname] or itemname
data[field][itemname] = (data[field][itemname] or 0) + (count or 1)
end
function awards.get_item_count(data, field, itemname)
itemname = minetest.registered_aliases[itemname] or itemname
return data[field][itemname] or 0
end
function awards.get_total_keyed_count(data, field)
return data[field].__total or 0
end
function awards.register_on_unlock(func)
table.insert(awards.on_unlock, func)
end

1110
src/awards.lua Normal file

File diff suppressed because it is too large Load Diff

73
src/chat_commands.lua Normal file
View File

@ -0,0 +1,73 @@
-- Copyright (c) 2013-18 rubenwardy. MIT.
local S = awards.get_translator
minetest.register_privilege("awards_admin", { description = S("Can manage awards of given player") })
minetest.register_chatcommand("awards", {
params = "[c|clear|disable|enable] [player_name]",
description = S("Show, clear, disable or enable player's awards"),
func = function(name, param)
if not minetest.check_player_privs(name, { awards_admin = true }) then
return false, S("You need awards_admin privilege!")
end
local action, playern = param:split(" ")[1], param:split(" ")[2] or name
if action == "clear" then
awards.clear_player(playern)
minetest.chat_send_player(playern,
S("All your awards and statistics have been cleared. You can now start again."))
minetest.chat_send_player(name, S("All awards and statistics of @1 have been cleared.", playern))
elseif action == "disable" then
awards.disable(playern)
minetest.chat_send_player(playern, S("Your awards are disabled."))
minetest.chat_send_player(name, S("You have disabled awards of @1.", playern))
elseif action == "enable" then
awards.enable(playern)
minetest.chat_send_player(playern, S("Your awards are enabled."))
minetest.chat_send_player(name, S("You have enabled awards of @1.", playern))
elseif action == "c" then
awards.show_to(playern, name, nil, true)
elseif not action then
awards.show_to(name, name, nil, false)
else
awards.show_to(action, name, nil, true)
end
if (action == "disable" or action == "enable") and minetest.global_exists("sfinv") and not minetest.get_modpath("unified_inventory") then
local player = minetest.get_player_by_name(playern)
if player then
sfinv.set_player_inventory_formspec(player)
end
end
end
})
minetest.register_chatcommand("awd", {
params = S("<award ID>"),
description = S("Show details of an award"),
func = function(name, param)
local def = awards.registered_awards[param]
if def then
minetest.chat_send_player(name, string.format("%s: %s", def.title, def.description))
else
minetest.chat_send_player(name, S("Award not found."))
end
end
})
minetest.register_chatcommand("awpl", {
privs = {
server = true
},
params = S("<name>"),
description = S("Get the awards statistics for the given player or yourself"),
func = function(name, param)
if not param or param == "" then
param = name
end
minetest.chat_send_player(name, param)
local player = awards.player(param)
minetest.chat_send_player(name, dump(player))
end
})

112
src/data.lua Normal file
View File

@ -0,0 +1,112 @@
local storage = minetest.get_mod_storage()
local __player_data
-- Table Save Load Functions
function awards.save()
storage:set_string("player_data", minetest.write_json(__player_data))
end
local function convert_data()
minetest.log("warning", "Importing awards data from previous version")
local old_players = __player_data
__player_data = {}
for name, data in pairs(old_players) do
while name.name do
name = name.name
end
data.name = name
print("Converting data for " .. name)
-- Just rename counted
local counted = {
chats = "chat",
deaths = "death",
joins = "join",
}
for from, to in pairs(counted) do
data[to] = data[from]
data[from] = nil
end
data.death = {
unknown = data.death,
__total = data.death,
}
-- Convert item db to new format
local counted_items = {
count = "dig",
place = "place",
craft = "craft",
}
for from, to in pairs(counted_items) do
local ret = {}
local count = 0
if data[from] then
for modname, items in pairs(data[from]) do
for itemname, value in pairs(items) do
itemname = modname .. ":" .. itemname
local key = minetest.registered_aliases[itemname] or itemname
ret[key] = value
count = count + value
end
end
end
ret.__total = count
data[from] = nil
data[to] = ret
end
__player_data[name] = data
end
end
function awards.load()
local old_save_path = minetest.get_worldpath().."/awards.txt"
local file = io.open(old_save_path, "r")
if file then
local table = minetest.deserialize(file:read("*all"))
if type(table) == "table" then
__player_data = table
convert_data()
else
__player_data = {}
end
file:close()
os.rename(old_save_path, minetest.get_worldpath().."/awards.bk.txt")
awards.save()
else
local json = storage:get("player_data")
__player_data = json and minetest.parse_json(json) or {}
end
end
function awards.player(name)
assert(type(name) == "string")
local data = __player_data[name] or {}
__player_data[name] = data
data.name = data.name or name
data.unlocked = data.unlocked or {}
return data
end
function awards.player_or_nil(name)
return __player_data[name]
end
function awards.enable(name)
awards.player(name).disabled = nil
end
function awards.disable(name)
awards.player(name).disabled = true
end
function awards.clear_player(name)
__player_data[name] = {}
end

218
src/gui.lua Normal file
View File

@ -0,0 +1,218 @@
-- Copyright (c) 2013-18 rubenwardy. MIT.
local S = awards.get_translator
function awards.get_formspec(name, to, sid)
local formspec = ""
local awards_list = awards.get_award_states(name)
if #awards_list == 0 then
formspec = formspec .. "label[3.9,1.5;"..minetest.formspec_escape(S("Error: No achivements available.")).."]"
formspec = formspec .. "button_exit[4.2,2.3;3,1;close;"..minetest.formspec_escape(S("OK")).."]"
return formspec
end
sid = awards_list[sid] and sid or 1
-- Sidebar
local sitem = awards_list[sid]
local sdef = sitem.def
if sdef and sdef.secret and not sitem.unlocked then
formspec = formspec .. "label[1,2.75;"..
minetest.formspec_escape(S("(Secret Award)")).."]"..
"image[1,0;3,3;awards_unknown.png]"
if sdef and sdef.description then
formspec = formspec .. "textarea[0.25,3.25;4.8,1.7;;"..
minetest.formspec_escape(
S("Unlock this award to find out what it is."))..";]"
end
else
local title = sitem.name
if sdef and sdef.title then
title = sdef.title
end
local status = "%s"
if sitem.unlocked then
status = "%s ".. S("(unlocked)")
end
formspec = formspec .. "textarea[0.5,3.1;4.8,1.45;;" ..
string.format(status, minetest.formspec_escape(title)) ..
";]"
if sdef and sdef.icon then
formspec = formspec .. "image[0.45,0;3.5,3.5;" .. sdef.icon .. "]" -- adjusted values from 0.6,0;3,3
end
if sitem.progress then
local barwidth = 3.95
local perc = sitem.progress.current / sitem.progress.target
local label = sitem.progress.label
if perc > 1 then
perc = 1
end
formspec = formspec .. "background[0,8.24;" .. barwidth ..",0.4;awards_progress_gray.png;false]"
formspec = formspec .. "background[0,8.24;" .. (barwidth * perc) ..",0.4;awards_progress_green.png;false]"
if label then
formspec = formspec .. "label[1.6,8.15;" .. minetest.formspec_escape(label) .. "]"
end
end
if sdef and sdef.description then
formspec = formspec .. "box[-0.05,3.75;3.9,4.2;#000]"
formspec = formspec .. "textarea[0.25,3.75;3.9,4.2;;" ..
minetest.formspec_escape(sdef.description) .. ";]"
end
end
-- Create list box
formspec = formspec .. "textlist[4,0;3.8,8.6;awards;"
local first = true
for _, award in pairs(awards_list) do
local def = award.def
if def then
if not first then
formspec = formspec .. ","
end
first = false
if def.secret and not award.unlocked then
formspec = formspec .. "#707070"..minetest.formspec_escape(S("(Secret Award)"))
else
local title = award.name
if def and def.title then
title = def.title
end
-- title = title .. " [" .. award.score .. "]"
if award.unlocked then
formspec = formspec .. minetest.formspec_escape(title)
elseif award.started then
formspec = formspec .. "#c0c0c0".. minetest.formspec_escape(title)
else
formspec = formspec .. "#a0a0a0".. minetest.formspec_escape(title)
end
end
end
end
return formspec .. ";"..sid.."]"
end
function awards.show_to(name, to, sid, text)
if name == "" or name == nil then
name = to
end
local data = awards.player(name)
if name == to and data.disabled then
minetest.chat_send_player(name, S("You've disabled awards. Type /awards enable to reenable."))
return
end
if text then
local awards_list = awards.get_award_states(name)
if #awards_list == 0 then
minetest.chat_send_player(to, S("Error: No award available."))
return
elseif not data or not data.unlocked then
minetest.chat_send_player(to, S("You have not unlocked any awards."))
return
end
minetest.chat_send_player(to, S("@1s awards:", name))
for str, _ in pairs(data.unlocked) do
local def = awards.registered_awards[str]
if def then
if def.title then
if def.description then
minetest.chat_send_player(to, string.format("%s: %s", def.title, def.description))
else
minetest.chat_send_player(to, def.title)
end
else
minetest.chat_send_player(to, str)
end
end
end
else
local deco = ""
if minetest.global_exists("default") then
deco = default.gui_bg .. default.gui_bg_img
end
-- Show formspec to user
minetest.show_formspec(to,"awards:awards",
"size[8,8.6]" .. deco ..
awards.get_formspec(name, to, sid))
end
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "awards:awards" then
return false
end
if fields.quit then
return true
end
local name = player:get_player_name()
if fields.awards then
local event = minetest.explode_textlist_event(fields.awards)
if event.type == "CHG" then
awards.show_to(name, name, event.index, false)
end
end
return true
end)
if minetest.get_modpath("sfinv") then
sfinv.register_page("awards:awards", {
title = S("Awards"),
on_enter = function(self, player, context)
context.awards_idx = 1
end,
is_in_nav = function(self, player, context)
local data = awards.player(player:get_player_name())
return not data.disabled
end,
get = function(self, player, context)
local name = player:get_player_name()
return sfinv.make_formspec(player, context,
awards.get_formspec(name, name, context.awards_idx),
false)
end,
on_player_receive_fields = function(self, player, context, fields)
if fields.awards then
local event = minetest.explode_textlist_event(fields.awards)
if event.type == "CHG" then
context.awards_idx = event.index
sfinv.set_player_inventory_formspec(player, context)
end
end
end
})
local function check_and_reshow(name)
local player = minetest.get_player_by_name(name)
if not player then
return
end
local context = sfinv.get_or_create_context(player)
if context.page ~= "awards:awards" then
return
end
sfinv.set_player_inventory_formspec(player, context)
end
awards.register_on_unlock(check_and_reshow)
end
if minetest.get_modpath("unified_inventory") ~= nil then
unified_inventory.register_button("awards", {
type = "image",
image = "awards_ui_icon.png",
tooltip = S("Awards"),
action = function(player)
local name = player:get_player_name()
awards.show_to(name, name, nil, false)
end,
})
end

45
src/intllib.lua Normal file
View File

@ -0,0 +1,45 @@
-- Fallback functions for when `intllib` is not installed.
-- Code released under Unlicense <http://unlicense.org>.
-- Get the latest version of this file at:
-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua
local function format(str, ...)
local args = { ... }
local function repl(escape, open, num, close)
if escape == "" then
local replacement = tostring(args[tonumber(num)])
if open == "" then
replacement = replacement..close
end
return replacement
else
return "@"..open..num..close
end
end
return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl))
end
local gettext, ngettext
--[[
if minetest.get_modpath("intllib") then
if intllib.make_gettext_pair then
-- New method using gettext.
gettext, ngettext = intllib.make_gettext_pair()
else
-- Old method using text files.
gettext = intllib.Getter()
end
end
--]]
-- Fill in missing functions.
gettext = gettext or function(msgid, ...)
return format(msgid, ...)
end
ngettext = ngettext or function(msgid, msgid_plural, n, ...)
return format(n==1 and msgid or msgid_plural, ...)
end
return gettext, ngettext

149
src/triggers.lua Normal file
View File

@ -0,0 +1,149 @@
-- AWARDS
--
-- Copyright (C) 2013-2015 rubenwardy
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU Lesser General Public License as published by
-- the Free Software Foundation; either version 2.1 of the License, or
-- (at your option) any later version.
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU Lesser General Public License for more details.
-- You should have received a copy of the GNU Lesser General Public License along
-- with this program; if not, write to the Free Software Foundation, Inc.,
-- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--
-- Check if a player object is valid for awards.
local function player_ok(player)
return player and player.is_player and player:is_player() and not player.is_fake_player
end
awards.register_trigger("chat", {
type = "counted",
progress = "@1/@2 chat messages",
auto_description = { "Send a chat message", "Chat @1 times" },
})
minetest.register_on_chat_message(function(name, message)
local player = minetest.get_player_by_name(name)
if not player_ok(player) or string.find(message, "/") then
return
end
awards.notify_chat(player)
end)
awards.register_trigger("join", {
type = "counted",
progress = "@1/@2 joins",
auto_description = { "Join once", "Join @1 times" },
})
minetest.register_on_joinplayer(awards.notify_join)
awards.register_trigger("death", {
type = "counted_key",
progress = "@1/@2 deaths",
auto_description = { "Die once of @2", "Die @1 times of @2" },
auto_description_total = { "Die @1 time.", "Die @1 times." },
get_key = function(self, def)
return def.trigger.reason
end,
})
minetest.register_on_dieplayer(function(player, reason)
if reason then
reason = reason.type
else
reason = "unknown"
end
awards.notify_death(player, reason)
end)
awards.register_trigger("dig", {
type = "counted_key",
progress = "@1/@2 dug",
auto_description = { "Mine: @2", "Mine: @1×@2" },
auto_description_total = { "Mine @1 block.", "Mine @1 blocks." },
get_key = function(self, def)
return minetest.registered_aliases[def.trigger.node] or def.trigger.node
end,
key_is_item = true,
})
minetest.register_on_dignode(function(pos, node, player)
if not player_ok(player) or not pos or not node then
return
end
local node_name = node.name
node_name = minetest.registered_aliases[node_name] or node_name
awards.notify_dig(player, node_name)
end)
awards.register_trigger("place", {
type = "counted_key",
progress = "@1/@2 placed",
auto_description = { "Place: @2", "Place: @1×@2" },
auto_description_total = { "Place @1 block.", "Place @1 blocks." },
get_key = function(self, def)
return minetest.registered_aliases[def.trigger.node] or def.trigger.node
end,
key_is_item = true,
})
minetest.register_on_placenode(function(pos, node, player)
if not player_ok(player) or not pos or not node then
return
end
local node_name = node.name
node_name = minetest.registered_aliases[node_name] or node_name
if string.match(node_name, "default:torch_") then -- NALC: fix torch name change on wall place
node_name = "default:torch"
end
awards.notify_place(player, node_name)
end)
awards.register_trigger("craft", {
type = "counted_key",
progress = "@1/@2 crafted",
auto_description = { "Craft: @2", "Craft: @1×@2" },
auto_description_total = { "Craft @1 item.", "Craft @1 items." },
get_key = function(self, def)
return minetest.registered_aliases[def.trigger.item] or def.trigger.item
end,
key_is_item = true,
})
--minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
-- if not player_ok(player) or itemstack:is_empty() then
-- return
-- end
--
-- local itemname = itemstack:get_name()
-- itemname = minetest.registered_aliases[itemname] or itemname
-- awards.notify_craft(player, itemname, itemstack:get_count())
--end)
awards.register_trigger("eat", {
type = "counted_key",
progress = "@1/@2 eaten",
auto_description = { "Eat @2", "Eat @1×@2" },
auto_description_total = { "Eat @1 item.", "Eat @1 items." },
get_key = function(self, def)
return minetest.registered_aliases[def.trigger.item] or def.trigger.item
end,
key_is_item = true,
})
minetest.register_on_item_eat(function(_, _, itemstack, player, _)
if not player_ok(player) or itemstack:is_empty() then
return
end
local itemname = itemstack:get_name()
itemname = minetest.registered_aliases[itemname] or itemname
awards.notify_eat(player, itemname)
end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More