forked from LizzyFleckenstein03/Memeclone
Merge pull request 'Update contribution guidelines' (#1881) from EliasFleckenstein03/MineClone2:guidelines into master
Reviewed-on: MineClone2/MineClone2#1881
This commit is contained in:
commit
f4803a35c4
|
@ -0,0 +1,128 @@
|
||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
We as members, contributors, and leaders pledge to make participation in our
|
||||||
|
community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||||
|
identity and expression, level of experience, education, socio-economic status,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity
|
||||||
|
and orientation.
|
||||||
|
|
||||||
|
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||||
|
diverse, inclusive, and healthy community.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to a positive environment for our
|
||||||
|
community include:
|
||||||
|
|
||||||
|
* Demonstrating empathy and kindness toward other people
|
||||||
|
* Being respectful of differing opinions, viewpoints, and experiences
|
||||||
|
* Giving and gracefully accepting constructive feedback
|
||||||
|
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||||
|
and learning from the experience
|
||||||
|
* Focusing on what is best not just for us as individuals, but for the
|
||||||
|
overall community
|
||||||
|
|
||||||
|
Examples of unacceptable behavior include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery, and sexual attention or
|
||||||
|
advances of any kind
|
||||||
|
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or email
|
||||||
|
address, without their explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Enforcement Responsibilities
|
||||||
|
|
||||||
|
Community leaders are responsible for clarifying and enforcing our standards of
|
||||||
|
acceptable behavior and will take appropriate and fair corrective action in
|
||||||
|
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||||
|
or harmful.
|
||||||
|
|
||||||
|
Community leaders have the right and responsibility to remove, edit, or reject
|
||||||
|
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||||
|
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||||
|
decisions when appropriate.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies within all community spaces, and also applies when
|
||||||
|
an individual is officially representing the community in public spaces.
|
||||||
|
Examples of representing our community include using an official e-mail address,
|
||||||
|
posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported to the community leaders responsible for enforcement at
|
||||||
|
eliasfleckenstein@web.de.
|
||||||
|
All complaints will be reviewed and investigated promptly and fairly.
|
||||||
|
|
||||||
|
All community leaders are obligated to respect the privacy and security of the
|
||||||
|
reporter of any incident.
|
||||||
|
|
||||||
|
## Enforcement Guidelines
|
||||||
|
|
||||||
|
Community leaders will follow these Community Impact Guidelines in determining
|
||||||
|
the consequences for any action they deem in violation of this Code of Conduct:
|
||||||
|
|
||||||
|
### 1. Correction
|
||||||
|
|
||||||
|
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||||
|
unprofessional or unwelcome in the community.
|
||||||
|
|
||||||
|
**Consequence**: A private, written warning from community leaders, providing
|
||||||
|
clarity around the nature of the violation and an explanation of why the
|
||||||
|
behavior was inappropriate. A public apology may be requested.
|
||||||
|
|
||||||
|
### 2. Warning
|
||||||
|
|
||||||
|
**Community Impact**: A violation through a single incident or series
|
||||||
|
of actions.
|
||||||
|
|
||||||
|
**Consequence**: A warning with consequences for continued behavior. No
|
||||||
|
interaction with the people involved, including unsolicited interaction with
|
||||||
|
those enforcing the Code of Conduct, for a specified period of time. This
|
||||||
|
includes avoiding interactions in community spaces as well as external channels
|
||||||
|
like social media. Violating these terms may lead to a temporary or
|
||||||
|
permanent ban.
|
||||||
|
|
||||||
|
### 3. Temporary Ban
|
||||||
|
|
||||||
|
**Community Impact**: A serious violation of community standards, including
|
||||||
|
sustained inappropriate behavior.
|
||||||
|
|
||||||
|
**Consequence**: A temporary ban from any sort of interaction or public
|
||||||
|
communication with the community for a specified period of time. No public or
|
||||||
|
private interaction with the people involved, including unsolicited interaction
|
||||||
|
with those enforcing the Code of Conduct, is allowed during this period.
|
||||||
|
Violating these terms may lead to a permanent ban.
|
||||||
|
|
||||||
|
### 4. Permanent Ban
|
||||||
|
|
||||||
|
**Community Impact**: Demonstrating a pattern of violation of community
|
||||||
|
standards, including sustained inappropriate behavior, harassment of an
|
||||||
|
individual, or aggression toward or disparagement of classes of individuals.
|
||||||
|
|
||||||
|
**Consequence**: A permanent ban from any sort of public interaction within
|
||||||
|
the community.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||||
|
version 2.0, available at
|
||||||
|
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||||
|
|
||||||
|
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||||
|
enforcement ladder](https://github.com/mozilla/diversity).
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
||||||
|
|
||||||
|
For answers to common questions about this code of conduct, see the FAQ at
|
||||||
|
https://www.contributor-covenant.org/faq. Translations are available at
|
||||||
|
https://www.contributor-covenant.org/translations.
|
432
CONTRIBUTING.md
432
CONTRIBUTING.md
|
@ -2,104 +2,404 @@
|
||||||
So you want to contribute to MineClone2?
|
So you want to contribute to MineClone2?
|
||||||
Wow, thank you! :-)
|
Wow, thank you! :-)
|
||||||
|
|
||||||
But first, some things to note:
|
MineClone2 is maintained by Nicu and Fleckenstein. If you have any
|
||||||
|
problems or questions, contact us (See Links section below).
|
||||||
|
|
||||||
MineClone 2's development target is to make a free software clone of Minecraft,
|
You can help with MineClone2's development in many different ways,
|
||||||
***version 1.12***, ***PC edition***, *** + Optifine features supported by the Minetest Engine ***.
|
whether you're a programmer or not.
|
||||||
|
|
||||||
MineClone 2 is maintained by three persons. Namely, kay27, EliasFleckenstein and jordan4ibanez. You can find us
|
## MineClone2's development target is to...
|
||||||
in the Minetest forums (forums.minetest.net), in IRC in the #mineclone2
|
- Crucially, create a stable, moddable, free/libre clone of Minecraft
|
||||||
channel on irc.freenode.net. And finally, you can send e-mails to
|
based on the Minetest engine with polished features, usable in both
|
||||||
<eliasfleckenstein@web.de> or <kay27@bk.ru>.
|
singleplayer and multiplayer. Currently, most of **Minecraft Java
|
||||||
|
Edition 1.12.2** features are already implemented and polishing existing
|
||||||
|
features are prioritized over new feature requests.
|
||||||
|
- With lessened priority yet strictly, implement features targetting
|
||||||
|
**Minecraft version 1.17 + OptiFine** (OptiFine only as far as supported
|
||||||
|
by the Minetest Engine). This means features in parity with the listed
|
||||||
|
Minecraft experiences are prioritized over those that don't fulfill this
|
||||||
|
scope.
|
||||||
|
- Optionally, create a performant experience that will run relatively
|
||||||
|
well on really low spec computers. Unfortunately, due to Minecraft's
|
||||||
|
mechanisms and Minetest engine's limitations along with a very small
|
||||||
|
playerbase on low spec computers, optimizations are hard to investigate.
|
||||||
|
|
||||||
By sending us patches or asking us to include your changes in this game,
|
## Links
|
||||||
you agree that they fall under the terms of the LGPLv2.1, which basically
|
* [Mesehub](https://git.minetest.land/MineClone2/MineClone2)
|
||||||
means they will become part of a free software.
|
* [Discord](https://discord.gg/xE4z8EEpDC)
|
||||||
|
* [YouTube](https://www.youtube.com/channel/UClI_YcsXMF3KNeJtoBfnk9A)
|
||||||
|
* [IRC](https://web.libera.chat/#mineclone2)
|
||||||
|
* [Matrix](https://app.element.io/#/room/#mc2:matrix.org)
|
||||||
|
* [Reddit](https://www.reddit.com/r/MineClone2/)
|
||||||
|
* [Minetest forums](https://forum.minetest.net/viewtopic.php?f=50&t=16407)
|
||||||
|
|
||||||
## The suggested workflow
|
## Using git
|
||||||
We don't **dictate** your workflow, but in order to work with us in an efficient
|
MineClone2 is developed using the version control system
|
||||||
way, you can follow these suggestions:
|
[git](https://git-scm.com/). If you want to contribute code to the
|
||||||
|
project, it is **highly recommended** that you learn the git basics.
|
||||||
|
For non-programmers and people who do not plan to contribute code to
|
||||||
|
MineClone2, git is not required. However, git is a tool that will be
|
||||||
|
referenced frequently because of its usefulness. As such, it is valuable
|
||||||
|
in learning how git works and its terminology. It can also help you
|
||||||
|
keeping your game updated, and easily test pull requests.
|
||||||
|
|
||||||
For small and medium changes:
|
## How you can help as a non-programmer
|
||||||
|
|
||||||
* Fork the repository
|
As someone who does not know how to write programs in Lua or does not
|
||||||
|
know how to use the Minetest API, you can still help us out a lot. For
|
||||||
|
example, by opening an issue in the
|
||||||
|
[Issue tracker](https://git.minetest.land/MineClone2/MineClone2/issues),
|
||||||
|
you can report a bug or request a feature.
|
||||||
|
|
||||||
|
### Rules about both bugs and feature requests
|
||||||
|
* Stay polite towards the developers and anyone else involved in the
|
||||||
|
discussion.
|
||||||
|
* Choose a descriptive title (e.g. not just "crash", "bug" or "question"
|
||||||
|
).
|
||||||
|
* Please write in plain, understandable English. It will be easier to
|
||||||
|
communicate.
|
||||||
|
* Please start the issue title with a capital letter.
|
||||||
|
* Always check the currently opened issues before creating a new one.
|
||||||
|
Don't report bugs that have already been reported or request features
|
||||||
|
that already have been requested.
|
||||||
|
* If you know about Minetest's inner workings, please think about
|
||||||
|
whether the bug / the feature that you are reporting / requesting is
|
||||||
|
actually an issue with Minetest itself, and if it is, head to the
|
||||||
|
[Minetest issue tracker](https://github.com/minetest/minetest/issues)
|
||||||
|
instead.
|
||||||
|
* If you need any help regarding creating a Mesehub account or opening
|
||||||
|
an issue, feel free to ask on the Discord / Matrix server or the IRC
|
||||||
|
channel.
|
||||||
|
|
||||||
|
### Reporting bugs
|
||||||
|
* A bug is an unintended behavior or, in the worst case, a crash.
|
||||||
|
However, it is not a bug if you believe something is missing in the
|
||||||
|
game. In this case, please read "Requesting features"
|
||||||
|
* If you report a crash, always include the error message. If you play
|
||||||
|
in singleplayer, post a screenshot of the message that Minetest showed
|
||||||
|
when the crash happened (or copy the message into your issue). If you
|
||||||
|
are a server admin, you can find error messages in the log file of the
|
||||||
|
server.
|
||||||
|
* Tell us which MineClone2 and Minetest versions you are using.
|
||||||
|
* Tell us how to reproduce the problem: What you were doing to trigger
|
||||||
|
the bug, e.g. before the crash happened or what causes the faulty
|
||||||
|
behavior.
|
||||||
|
|
||||||
|
### Requesting features
|
||||||
|
* Ensure the requested feature fulfills our development targets and
|
||||||
|
goals.
|
||||||
|
* Begging or excessive attention seeking does not help us in the
|
||||||
|
slightest, and may very well disrupt MineClone2 development. It's better
|
||||||
|
to put that energy into helping or researching the feature in question.
|
||||||
|
After all, we're just volunteers working on our spare time.
|
||||||
|
* Ensure the requested feature has not been implemented in MineClone2
|
||||||
|
latest or development versions.
|
||||||
|
|
||||||
|
### Testing code
|
||||||
|
If you want to help us with speeding up MineClone2 development and
|
||||||
|
making the game more stable, a great way to do that is by testing out
|
||||||
|
new features from contributors. For most new things that get into the
|
||||||
|
game, a pull request is created. A pull request is essentially a
|
||||||
|
programmer saying "Look, I modified the game, please apply my changes
|
||||||
|
to the upstream version of the game". However, every programmer makes
|
||||||
|
mistakes sometimes, some of which are hard to spot. You can help by
|
||||||
|
downloading this modified version of the game and trying it out - then
|
||||||
|
tell us if the code works as expected without any issues. Ideally, you
|
||||||
|
would report issues will pull requests similar to when you were
|
||||||
|
reporting bugs that are the mainline (See Reporting bugs section). You
|
||||||
|
can find currently open pull requests here:
|
||||||
|
<https://git.minetest.land/MineClone2/MineClone2/pulls>. Note that pull
|
||||||
|
requests that start with a `WIP:` are not done yet, and therefore might
|
||||||
|
not work, so it's not very useful to try them out yet.
|
||||||
|
|
||||||
|
### Contributing assets
|
||||||
|
Due to license problems, MineClone2 unfortunately cannot use
|
||||||
|
Minecraft's assets, therefore we are always looking for asset
|
||||||
|
contributions. To contribute assets, it can be useful to learn git
|
||||||
|
basics and read the section for Programmers of this document, however
|
||||||
|
this is not required. It's also a good idea to join the Discord server
|
||||||
|
(or alternatively IRC or Matrix).
|
||||||
|
|
||||||
|
#### Textures
|
||||||
|
For textures we use the Pixel Perfection texture pack. This is mostly
|
||||||
|
enough; however in some cases - e.g. for newer Minecraft features, it's
|
||||||
|
useful to have texture artists around. If you want to make such
|
||||||
|
contributions, join our Discord server. Demands for textures will be
|
||||||
|
communicated there.
|
||||||
|
|
||||||
|
#### Sounds
|
||||||
|
MineClone2 currently does not have a consistent way to handle sounds.
|
||||||
|
The sounds in the game come from different sources, like the SnowZone
|
||||||
|
resource pack or minetest_game. Unfortunately, MineClone2 does not play
|
||||||
|
a sound in every situation you would get one in Minecraft. Any help with
|
||||||
|
sounds is greatly appreciated, however if you add new sounds you should
|
||||||
|
probably work together with a programmer, to write the code to actually
|
||||||
|
play these sounds in game.
|
||||||
|
|
||||||
|
#### 3D Models
|
||||||
|
Most of the 3D Models in MineClone2 come from
|
||||||
|
[22i's repository](https://github.com/22i/minecraft-voxel-blender-models).
|
||||||
|
Similar to the textures, we need people that can make 3D Models with
|
||||||
|
Blender on demand. Many of the models have to be patched, some new
|
||||||
|
animations have to be added etc.
|
||||||
|
|
||||||
|
#### Crediting
|
||||||
|
Asset contributions will be credited in their own respective sections in
|
||||||
|
CREDITS.md. If you have commited the results yourself, you will also be
|
||||||
|
credited in the Contributors section.
|
||||||
|
|
||||||
|
### Contributing Translations
|
||||||
|
|
||||||
|
#### Workflow
|
||||||
|
To add/update support for your language to MineClone2, you should take
|
||||||
|
the steps documented in the section for Programmers, add/update the
|
||||||
|
translation files of the mods that you want to update. You can add
|
||||||
|
support for all mods, just some of them or only one mod; you can update
|
||||||
|
the translation file entirely or only partly; basically any effort is
|
||||||
|
valued. If your changes are small, you can also send them to developers
|
||||||
|
via E-Mail, Discord, IRC or Matrix - they will credit you appropriately.
|
||||||
|
|
||||||
|
#### Things to note
|
||||||
|
You can use the script at `tools/check_translate_files.py` to compare
|
||||||
|
the translation files for the language you are working on with the
|
||||||
|
template files, to see what is missing and what is out of date with
|
||||||
|
the template file. However, template files are often incomplete and/or
|
||||||
|
out of date, sometimes they don't match the code. You can update the
|
||||||
|
translation files if that is required, you can also modify the code in
|
||||||
|
your translation PR if it's related to translation. You can also work on
|
||||||
|
multiple languages at the same time in one PR.
|
||||||
|
|
||||||
|
#### Crediting
|
||||||
|
Translation contributions will be credited in their own in CREDITS.md.
|
||||||
|
If you have commited the results yourself, you will also be credited in
|
||||||
|
the Contributors section.
|
||||||
|
|
||||||
|
### Profiling
|
||||||
|
If you own a server, a great way to help us improve MineClone2's code
|
||||||
|
is by giving us profiler results. Profiler results give us detailed
|
||||||
|
information about the game's performance and let us know places to
|
||||||
|
investigate optimization issues. This way we can make the game faster.
|
||||||
|
|
||||||
|
#### Using Minetest's profiler
|
||||||
|
Minetest has a built in profiler. Simply set `profiler.load = true` in
|
||||||
|
your configuration file and restart the server. After running the server
|
||||||
|
for some time, just run `/profiler save` in chat - then you will find a
|
||||||
|
file in the world directory containing the results. Open a new issue and
|
||||||
|
upload the file. You can name the issue "<Server name> profiler
|
||||||
|
results".
|
||||||
|
|
||||||
|
### Let us know your opinion
|
||||||
|
It is always encouraged to actively contribute to issue discussions on
|
||||||
|
MeseHub, let us know what you think about a topic and help us make
|
||||||
|
decisions. Also, note that a lot of discussion takes place on the
|
||||||
|
Discord server, so it's definitely worth checking it out.
|
||||||
|
|
||||||
|
### Crediting
|
||||||
|
If you opened or have contributed to an issue, you receive the
|
||||||
|
`Community` role on our Discord (after asking for it).
|
||||||
|
|
||||||
|
## How you can help as a programmer
|
||||||
|
(Almost) all the MineClone2 development is done using pull requests.
|
||||||
|
|
||||||
|
### Recommended workflow
|
||||||
|
* Fork the repository (in case you have not already)
|
||||||
* Do your change in a new branch
|
* Do your change in a new branch
|
||||||
* Create a pull request to get your changes merged into master
|
* Create a pull request to get your changes merged into master
|
||||||
|
* Keep your pull request up to date by regularly merging upstream. It is
|
||||||
|
imperative that conflicts are resolved prior to merging the pull
|
||||||
|
request.
|
||||||
|
* After the pull request got merged, you can delete the branch
|
||||||
|
|
||||||
For small changes, sending us a patch is also good.
|
### Discuss first
|
||||||
|
If you feel like a problem needs to fixed or you want to make a new
|
||||||
|
feature, you could start writing the code right away and notifying us
|
||||||
|
when you're done, but it never hurts to discuss things first. If there
|
||||||
|
is no issue on the topic, open one. If there is an issue, tell us that
|
||||||
|
you'd like to take care of it, to avoid duplicate work.
|
||||||
|
|
||||||
For big changes: Same as above, but consider notifying us first to avoid
|
### Don't hesitate to ask for help
|
||||||
duplicate work and possible tears of rejection. ;-)
|
We appreciate any contributing effort to MineClone2. If you are a
|
||||||
|
relatively new programmer, you can reach us on Discord, Matrix or IRC
|
||||||
|
for questions about git, Lua, Minetest API, MineClone2 codebase or
|
||||||
|
anything related to MineClone2. We can help you avoid writing code that
|
||||||
|
would be deemed inadequate, or help you become familiar with MineClone2
|
||||||
|
better, or assist you use development tools.
|
||||||
|
|
||||||
For trusted people, we might give them direct commit access to this
|
### Maintain your own code, even if already got merged
|
||||||
repository. In this case, you obviously don't need to fork, but you still
|
Sometimes, your code may cause crashes or bugs - we try to avoid such
|
||||||
need to show your contributions align with the project goals. We still
|
scenarios by testing every time before merging it, but if your merged
|
||||||
reserve the right to revert everything that we don't like.
|
work causes problems, we ask you fix the issues as soon as possible.
|
||||||
For bigger changes, we strongly recommend to use feature branches and
|
|
||||||
discuss with me first.
|
|
||||||
|
|
||||||
If your code causes bugs and crashes, it is your responsibility to fix them as soon as possible.
|
### Changing Gameplay
|
||||||
|
Pull Requests that change gameplay have to be properly researched and
|
||||||
|
need to state their sources. These PRs also need Fleckenstein's approval
|
||||||
|
before they are merged.
|
||||||
|
You can use these sources:
|
||||||
|
|
||||||
We mostly use plain merging rather than rebasing or squash merging.
|
* Minecraft code (Name the source file and line, however DONT post any
|
||||||
|
proprietary code). You can use
|
||||||
|
[MCP](https://minecraft.fandom.com/wiki/Programs_and_editors/Mod_Coder_Pack)
|
||||||
|
to decompile Minecraft or look at
|
||||||
|
[Minestorm](https://github.com/Minestom/Minestom) code.
|
||||||
|
* Testing things inside of Minecraft (Attach screenshots / video footage
|
||||||
|
of the results)
|
||||||
|
* [Official Minecraft Wiki](https://minecraft.fandom.com/wiki/Minecraft_Wiki)
|
||||||
|
(Include a link to the specific page you used)
|
||||||
|
|
||||||
Your commit names should be relatively descriptive, e.g. when saying "Fix #issueid", the commit message should also contain the title of the issue.
|
### Stick to our guidelines
|
||||||
|
|
||||||
Contributors will be credited in `CREDITS.md`.
|
#### Git Guidelines
|
||||||
|
* We use merge rather than rebase or squash merge
|
||||||
|
* We don't use git submodules.
|
||||||
|
* Your commit names should be relatively descriptive, e.g. when saying
|
||||||
|
"Fix #issueid", the commit message should also contain the title of the
|
||||||
|
issue.
|
||||||
|
* Try to keep your commits as atomic as possible (advise, but completely
|
||||||
|
optional)
|
||||||
|
|
||||||
## Code Style
|
#### Code Guidelines
|
||||||
|
* Each mod must provide `mod.conf`.
|
||||||
|
* Mod names are snake case, and newly added mods start with `mcl_`, e.g.
|
||||||
|
`mcl_core`, `mcl_farming`, `mcl_monster_eggs`. Keep in mind Minetest
|
||||||
|
does not support capital letters in mod names.
|
||||||
|
* To export functions, store them inside a global table named like the
|
||||||
|
mod, e.g.
|
||||||
|
|
||||||
Each mod must provide `mod.conf`.
|
|
||||||
Each mod which add API functions should store functions inside a global table named like the mod.
|
|
||||||
Public functions should not use self references but rather just access the table directly.
|
|
||||||
Functions should be defined in this way:
|
|
||||||
```lua
|
```lua
|
||||||
function mcl_xyz.stuff(param) end
|
mcl_example = {}
|
||||||
```
|
|
||||||
Insteed of this way:
|
function mcl_example.do_something()
|
||||||
```lua
|
-- ...
|
||||||
mcl_xyz.stuff = function(param) end
|
end
|
||||||
```
|
|
||||||
Indentation must be unified, more likely with tabs.
|
|
||||||
|
|
||||||
Time sensitive mods should make a local copy of most used API functions to improve performances.
|
|
||||||
```lua
|
|
||||||
local vector = vector
|
|
||||||
local get_node = minetest.get_node
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
* Public functions should not use self references but rather just access
|
||||||
|
the table directly, e.g.
|
||||||
|
|
||||||
## Features > 1.12
|
```lua
|
||||||
|
-- bad
|
||||||
|
function mcl_example:do_something()
|
||||||
|
end
|
||||||
|
|
||||||
If you want to make a feature that was added in a Minecraft version later than 1.12, you should fork MineClone5 (mineclone5 branch in the repository) and add your changes to this.
|
-- good
|
||||||
|
function mcl_example.do_something()
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
## What we accept
|
* Use modern Minetest API, e.g. no usage of `minetest.env`
|
||||||
|
* Tabs should be used for indent, spaces for alignment, e.g.
|
||||||
|
|
||||||
* Every MC features up to version 1.12 JE.
|
```lua
|
||||||
* Every already finished and working good features from versions above (only when making a MineClone5 PR / Contribution).
|
|
||||||
* Except features which couldn't be done easily and bugfree because of Minetest engine limitations. Eg. we CAN extend world boundaries by playing with map chunks, just teleporting player onto next layer after 31000 , but it would cost too much (time, code, bugs, performance, stability, etc).
|
|
||||||
* Some features, approved by the rest of the community, I mean maybe some voting and really missing any negative feedback.
|
|
||||||
|
|
||||||
## What we reject
|
-- use tabs for indent
|
||||||
|
|
||||||
* Any features which cause critical bugs, sending them to rework/fix or trying to fix immediately.
|
for i = 1, 10 do
|
||||||
* Some small portions of big entirely missing features which just definitely break gamplay balance give nothing useful
|
if i % 3 == 0 then
|
||||||
* Controversial features, which some people support while others do not should be discussed well, with publishing forum announcements, at least during the week. In case if there are still doubts - send them into the mod.
|
print(i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
## Reporting bugs
|
-- use tabs for indent and spaces to align things
|
||||||
Report all bugs and missing Minecraft features here:
|
|
||||||
|
|
||||||
<https://git.minetest.land/MineClone2/MineClone2/issues>
|
some_table = {
|
||||||
|
{"a string", 5},
|
||||||
|
{"a very much longer string", 10},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Direct discussion
|
* Use double quotes for strings, e.g. `"asdf"` rather than `'asdf'`
|
||||||
We have an IRC channel! Join us on #mineclone2 in freenode.net.
|
* Use snake_case rather than CamelCase, e.g. `my_function` rather than
|
||||||
|
`MyFunction`
|
||||||
|
* Don't declare functions as an assignment, e.g.
|
||||||
|
|
||||||
<ircs://irc.freenode.net:6697/#mineclone2>
|
```lua
|
||||||
|
-- bad
|
||||||
|
local some_local_func = function()
|
||||||
|
-- ...
|
||||||
|
end
|
||||||
|
|
||||||
## Creating releases
|
my_mod.some_func = function()
|
||||||
|
-- ...
|
||||||
|
end
|
||||||
|
|
||||||
|
-- good
|
||||||
|
local function some_local_func()
|
||||||
|
-- ...
|
||||||
|
end
|
||||||
|
|
||||||
|
function my_mod.some_func()
|
||||||
|
-- ...
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
### Developer status
|
||||||
|
Active and trusted contributors are often granted write access to the
|
||||||
|
MineClone2 repository.
|
||||||
|
|
||||||
|
#### Developer responsibilities
|
||||||
|
- You should not push things directly to
|
||||||
|
MineClone2 master - rather, do your work on a branch on your private
|
||||||
|
repository, then create a pull request. This way other people can review
|
||||||
|
your changes and make sure they work before they get merged.
|
||||||
|
- Merge PRs only when they have recieved the necessary feedback and have
|
||||||
|
been tested by at least two different people (including the author of
|
||||||
|
the pull request), to avoid crashes or the introduction of new bugs.
|
||||||
|
- You may also be assigned to issues or pull
|
||||||
|
requests as a developer. In this case it is your responsibility to fix
|
||||||
|
the issue / review and merge the pull request when it is ready. You can
|
||||||
|
also unassign yourself from the issue / PR if you have no time or don't
|
||||||
|
want to take care of it for some other reason. After all, everyone is a
|
||||||
|
volunteer and we can't expect you to do work that you are not interested
|
||||||
|
in. **The important thing is that you make sure to inform us if you
|
||||||
|
won't take care of something that has been assigned to you.**
|
||||||
|
- Please assign yourself to something that you want to work on to avoid
|
||||||
|
duplicate work.
|
||||||
|
- As a developer, it should be easy to reach you about your work. You
|
||||||
|
should be in at least one of the public MineClone2 discussion rooms -
|
||||||
|
preferrably Discord, but if you really don't like Discord, Matrix
|
||||||
|
or IRC are fine too.
|
||||||
|
|
||||||
|
### Maintainer status
|
||||||
|
Maintainers carry the main responsibility for the project.
|
||||||
|
|
||||||
|
#### Maintainer responsibilities
|
||||||
|
- Making sure issues are addressed and pull requests are reviewed and
|
||||||
|
merged, by assigning either themselves or Developers to issues / PRs
|
||||||
|
- Making releases
|
||||||
|
- Making sure guidelines are kept
|
||||||
|
- Making project decisions based on community feedback
|
||||||
|
- Granting/revoking developer access
|
||||||
|
- Enforcing the code of conduct (See CODE_OF_CONDUCT.md)
|
||||||
|
- Moderating official community spaces (See Links section)
|
||||||
|
- Resolving conflicts and problems within the community
|
||||||
|
|
||||||
|
#### Current maintainers
|
||||||
|
* Fleckenstein - responsible for gameplay review, publishing releases,
|
||||||
|
technical guidelines and issue/PR delegation
|
||||||
|
* Nicu - responsible for community related issues
|
||||||
|
|
||||||
|
#### Release process
|
||||||
|
* Run `tools/generate_ingame_credits.lua` to update the ingame credits
|
||||||
|
from `CREDITS.md` and commit the result (if anything changed)
|
||||||
* Launch MineClone2 to make sure it still runs
|
* Launch MineClone2 to make sure it still runs
|
||||||
* Update the version number in README.md
|
* Update the version number in README.md
|
||||||
* Use `git tag <version number>` to tag the latest commit with the version number
|
* Use `git tag <version number>` to tag the latest commit with the
|
||||||
* Push to repo (don't forget `--tags`!)
|
version number
|
||||||
* Update ContentDB (https://content.minetest.net/packages/Wuzzy/mineclone2/)
|
* Push to repository (don't forget `--tags`!)
|
||||||
* Update first post in forum thread (https://forum.minetest.net/viewtopic.php?f=50&t=16407)
|
* Update ContentDB
|
||||||
|
(https://content.minetest.net/packages/Wuzzy/mineclone2/)
|
||||||
|
* Update first post in forum thread
|
||||||
|
(https://forum.minetest.net/viewtopic.php?f=50&t=16407)
|
||||||
* Post release announcement and changelog in forums
|
* Post release announcement and changelog in forums
|
||||||
|
|
||||||
|
### Licensing
|
||||||
|
By asking us to include your changes in this game, you agree that they
|
||||||
|
fall under the terms of the GPLv3, which basically means they will
|
||||||
|
become part of a free/libre software.
|
||||||
|
|
||||||
|
### Crediting
|
||||||
|
Contributors, Developers and Maintainers will be credited in
|
||||||
|
`CREDITS.md`. If you make your first time contribution, please add
|
||||||
|
yourself to this file. There are also Discord roles for Contributors,
|
||||||
|
Developers and Maintainers.
|
||||||
|
|
26
CREDITS.md
26
CREDITS.md
|
@ -8,8 +8,8 @@
|
||||||
|
|
||||||
## Maintainers
|
## Maintainers
|
||||||
* Fleckenstein
|
* Fleckenstein
|
||||||
|
* Nicu
|
||||||
* kay27
|
* kay27
|
||||||
* jordan4ibanez
|
|
||||||
|
|
||||||
## Developers
|
## Developers
|
||||||
* bzoss
|
* bzoss
|
||||||
|
@ -19,10 +19,11 @@
|
||||||
* iliekprogrammar
|
* iliekprogrammar
|
||||||
* MysticTempest
|
* MysticTempest
|
||||||
* Rootyjr
|
* Rootyjr
|
||||||
* Nicu
|
|
||||||
* aligator
|
* aligator
|
||||||
* Code-Sploit
|
* Code-Sploit
|
||||||
* NO11
|
* NO11
|
||||||
|
* cora
|
||||||
|
* jordan4ibanez
|
||||||
|
|
||||||
## Contributors
|
## Contributors
|
||||||
* Laurent Rocher
|
* Laurent Rocher
|
||||||
|
@ -48,8 +49,24 @@
|
||||||
* dBeans
|
* dBeans
|
||||||
* nickolas360
|
* nickolas360
|
||||||
* yutyo
|
* yutyo
|
||||||
* ztianyang
|
* Tianyang Zhang
|
||||||
* j45
|
* j45
|
||||||
|
* Marcin Serwin
|
||||||
|
* erlehmann
|
||||||
|
* E
|
||||||
|
* Benjamin Schötz
|
||||||
|
* Doloment
|
||||||
|
* Sydney Gems
|
||||||
|
* talamh
|
||||||
|
* Emily2255
|
||||||
|
* Emojigit
|
||||||
|
* FinishedFragment
|
||||||
|
* sfan5
|
||||||
|
* Blue Blancmange
|
||||||
|
* Jared Moody
|
||||||
|
* SmallJoker
|
||||||
|
* Sven792
|
||||||
|
* aldum
|
||||||
|
|
||||||
## MineClone5
|
## MineClone5
|
||||||
* kay27
|
* kay27
|
||||||
|
@ -74,7 +91,6 @@
|
||||||
* Rochambeau
|
* Rochambeau
|
||||||
* rubenwardy
|
* rubenwardy
|
||||||
* stu
|
* stu
|
||||||
* jordan4ibanez
|
|
||||||
* 4aiman
|
* 4aiman
|
||||||
* Kahrl
|
* Kahrl
|
||||||
* Krock
|
* Krock
|
||||||
|
@ -103,6 +119,7 @@
|
||||||
* xMrVizzy
|
* xMrVizzy
|
||||||
* yutyo
|
* yutyo
|
||||||
* NO11
|
* NO11
|
||||||
|
* kay27
|
||||||
|
|
||||||
## Translations
|
## Translations
|
||||||
* Wuzzy
|
* Wuzzy
|
||||||
|
@ -111,6 +128,7 @@
|
||||||
* kay27
|
* kay27
|
||||||
* pitchum
|
* pitchum
|
||||||
* todoporlalibertad
|
* todoporlalibertad
|
||||||
|
* Marcin Serwin
|
||||||
|
|
||||||
## Special thanks
|
## Special thanks
|
||||||
* celeron55 for creating Minetest
|
* celeron55 for creating Minetest
|
||||||
|
|
|
@ -3,123 +3,8 @@ local S = minetest.get_translator(modname)
|
||||||
|
|
||||||
mcl_credits = {
|
mcl_credits = {
|
||||||
players = {},
|
players = {},
|
||||||
}
|
description = S("A faithful Open Source clone of Minecraft"),
|
||||||
|
people = dofile(minetest.get_modpath(modname) .. "/people.lua"),
|
||||||
mcl_credits.description = S("A faithful Open Source clone of Minecraft")
|
|
||||||
|
|
||||||
-- Sub-lists are sorted by number of commits, but the list should not be rearranged (-> new contributors are just added at the end of the list)
|
|
||||||
mcl_credits.people = {
|
|
||||||
{ S("Creator of MineClone"), 0x0A9400, {
|
|
||||||
"davedevils",
|
|
||||||
}},
|
|
||||||
{ S("Creator of MineClone2"), 0xFBF837, {
|
|
||||||
"Wuzzy",
|
|
||||||
}},
|
|
||||||
{ S("Maintainers"), 0xFF51D5, {
|
|
||||||
"Fleckenstein",
|
|
||||||
"kay27",
|
|
||||||
"oilboi",
|
|
||||||
}},
|
|
||||||
{ S("Developers"), 0xF84355, {
|
|
||||||
"bzoss",
|
|
||||||
"AFCMS",
|
|
||||||
"epCode",
|
|
||||||
"ryvnf",
|
|
||||||
"iliekprogrammar",
|
|
||||||
"MysticTempest",
|
|
||||||
"Rootyjr",
|
|
||||||
"Nicu",
|
|
||||||
"aligator",
|
|
||||||
"Code-Sploit",
|
|
||||||
"NO11",
|
|
||||||
}},
|
|
||||||
{ S("Contributors"), 0x52FF00, {
|
|
||||||
"Laurent Rocher",
|
|
||||||
"HimbeerserverDE",
|
|
||||||
"TechDudie",
|
|
||||||
"Alexander Minges",
|
|
||||||
"ArTee3",
|
|
||||||
"ZeDique la Ruleta",
|
|
||||||
"pitchum",
|
|
||||||
"wuniversales",
|
|
||||||
"Bu-Gee",
|
|
||||||
"David McMackins II",
|
|
||||||
"Nicholas Niro",
|
|
||||||
"Wouters Dorian",
|
|
||||||
"Blue Blancmange",
|
|
||||||
"Jared Moody",
|
|
||||||
"Li0n",
|
|
||||||
"Midgard",
|
|
||||||
"Saku Laesvuori",
|
|
||||||
"Yukitty",
|
|
||||||
"ZedekThePD",
|
|
||||||
"aldum",
|
|
||||||
"dBeans",
|
|
||||||
"nickolas360",
|
|
||||||
"yutyo",
|
|
||||||
"ztianyang",
|
|
||||||
"j45",
|
|
||||||
}},
|
|
||||||
{"MineClone5", 0xA60014, {
|
|
||||||
"kay27",
|
|
||||||
"Debiankaios",
|
|
||||||
"epCode",
|
|
||||||
"NO11",
|
|
||||||
"j45",
|
|
||||||
}},
|
|
||||||
{ S("Original Mod Authors"), 0x343434, {
|
|
||||||
"Wuzzy",
|
|
||||||
"Fleckenstein",
|
|
||||||
"BlockMen",
|
|
||||||
"TenPlus1",
|
|
||||||
"PilzAdam",
|
|
||||||
"ryvnf",
|
|
||||||
"stujones11",
|
|
||||||
"Arcelmi",
|
|
||||||
"celeron55",
|
|
||||||
"maikerumine",
|
|
||||||
"GunshipPenguin",
|
|
||||||
"Qwertymine3",
|
|
||||||
"Rochambeau",
|
|
||||||
"rubenwardy",
|
|
||||||
"stu",
|
|
||||||
"oilboi",
|
|
||||||
"4aiman",
|
|
||||||
"Kahrl",
|
|
||||||
"Krock",
|
|
||||||
"UgnilJoZ",
|
|
||||||
"lordfingle",
|
|
||||||
"22i",
|
|
||||||
"bzoss",
|
|
||||||
"kilbith",
|
|
||||||
"xeranas",
|
|
||||||
"kddekadenz",
|
|
||||||
"sofar",
|
|
||||||
"4Evergreen4",
|
|
||||||
"jordan4ibanez",
|
|
||||||
"paramat",
|
|
||||||
}},
|
|
||||||
{ S("3D Models"), 0x0019FF, {
|
|
||||||
"22i",
|
|
||||||
"tobyplowy",
|
|
||||||
"epCode",
|
|
||||||
}},
|
|
||||||
{ S("Textures"), 0xFF9705, {
|
|
||||||
"XSSheep",
|
|
||||||
"Wuzzy",
|
|
||||||
"kingoscargames",
|
|
||||||
"leorockway",
|
|
||||||
"xMrVizzy",
|
|
||||||
"yutyo",
|
|
||||||
"NO11",
|
|
||||||
}},
|
|
||||||
{ S("Translations"), 0x00FF60, {
|
|
||||||
"Wuzzy",
|
|
||||||
"Rocher Laurent",
|
|
||||||
"wuniversales",
|
|
||||||
"kay27",
|
|
||||||
"pitchum",
|
|
||||||
}},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
local function add_hud_element(def, huds, y)
|
local function add_hud_element(def, huds, y)
|
||||||
|
|
|
@ -0,0 +1,141 @@
|
||||||
|
local modname = minetest.get_current_modname()
|
||||||
|
local S = minetest.get_translator(modname)
|
||||||
|
|
||||||
|
return {
|
||||||
|
{S("Creator of MineClone"), 0x0A9400, {
|
||||||
|
"davedevils",
|
||||||
|
}},
|
||||||
|
{S("Creator of MineClone2"), 0xFBF837, {
|
||||||
|
"Wuzzy",
|
||||||
|
}},
|
||||||
|
{S("Maintainers"), 0xFF51D5, {
|
||||||
|
"Fleckenstein",
|
||||||
|
"Nicu",
|
||||||
|
"kay27",
|
||||||
|
}},
|
||||||
|
{S("Developers"), 0xF84355, {
|
||||||
|
"bzoss",
|
||||||
|
"AFCMS",
|
||||||
|
"epCode",
|
||||||
|
"ryvnf",
|
||||||
|
"iliekprogrammar",
|
||||||
|
"MysticTempest",
|
||||||
|
"Rootyjr",
|
||||||
|
"aligator",
|
||||||
|
"Code-Sploit",
|
||||||
|
"NO11",
|
||||||
|
"cora",
|
||||||
|
"jordan4ibanez",
|
||||||
|
}},
|
||||||
|
{S("Contributors"), 0x52FF00, {
|
||||||
|
"Laurent Rocher",
|
||||||
|
"HimbeerserverDE",
|
||||||
|
"TechDudie",
|
||||||
|
"Alexander Minges",
|
||||||
|
"ArTee3",
|
||||||
|
"ZeDique la Ruleta",
|
||||||
|
"pitchum",
|
||||||
|
"wuniversales",
|
||||||
|
"Bu-Gee",
|
||||||
|
"David McMackins II",
|
||||||
|
"Nicholas Niro",
|
||||||
|
"Wouters Dorian",
|
||||||
|
"Blue Blancmange",
|
||||||
|
"Jared Moody",
|
||||||
|
"Li0n",
|
||||||
|
"Midgard",
|
||||||
|
"Saku Laesvuori",
|
||||||
|
"Yukitty",
|
||||||
|
"ZedekThePD",
|
||||||
|
"aldum",
|
||||||
|
"dBeans",
|
||||||
|
"nickolas360",
|
||||||
|
"yutyo",
|
||||||
|
"Tianyang Zhang",
|
||||||
|
"j45",
|
||||||
|
"Marcin Serwin",
|
||||||
|
"erlehmann",
|
||||||
|
"E",
|
||||||
|
"Benjamin Schötz",
|
||||||
|
"Doloment",
|
||||||
|
"Sydney Gems",
|
||||||
|
"talamh",
|
||||||
|
"Emily2255",
|
||||||
|
"Emojigit",
|
||||||
|
"FinishedFragment",
|
||||||
|
"sfan5",
|
||||||
|
"Blue Blancmange",
|
||||||
|
"Jared Moody",
|
||||||
|
"SmallJoker",
|
||||||
|
"Sven792",
|
||||||
|
"aldum",
|
||||||
|
}},
|
||||||
|
{S("MineClone5"), 0xA60014, {
|
||||||
|
"kay27",
|
||||||
|
"Debiankaios",
|
||||||
|
"epCode",
|
||||||
|
"NO11",
|
||||||
|
"j45",
|
||||||
|
}},
|
||||||
|
{S("Original Mod Authors"), 0x343434, {
|
||||||
|
"Wuzzy",
|
||||||
|
"Fleckenstein",
|
||||||
|
"BlockMen",
|
||||||
|
"TenPlus1",
|
||||||
|
"PilzAdam",
|
||||||
|
"ryvnf",
|
||||||
|
"stujones11",
|
||||||
|
"Arcelmi",
|
||||||
|
"celeron55",
|
||||||
|
"maikerumine",
|
||||||
|
"GunshipPenguin",
|
||||||
|
"Qwertymine3",
|
||||||
|
"Rochambeau",
|
||||||
|
"rubenwardy",
|
||||||
|
"stu",
|
||||||
|
"4aiman",
|
||||||
|
"Kahrl",
|
||||||
|
"Krock",
|
||||||
|
"UgnilJoZ",
|
||||||
|
"lordfingle",
|
||||||
|
"22i",
|
||||||
|
"bzoss",
|
||||||
|
"kilbith",
|
||||||
|
"xeranas",
|
||||||
|
"kddekadenz",
|
||||||
|
"sofar",
|
||||||
|
"4Evergreen4",
|
||||||
|
"jordan4ibanez",
|
||||||
|
"paramat",
|
||||||
|
}},
|
||||||
|
{S("3D Models"), 0x0019FF, {
|
||||||
|
"22i",
|
||||||
|
"tobyplowy",
|
||||||
|
"epCode",
|
||||||
|
}},
|
||||||
|
{S("Textures"), 0xFF9705, {
|
||||||
|
"XSSheep",
|
||||||
|
"Wuzzy",
|
||||||
|
"kingoscargames",
|
||||||
|
"leorockway",
|
||||||
|
"xMrVizzy",
|
||||||
|
"yutyo",
|
||||||
|
"NO11",
|
||||||
|
"kay27",
|
||||||
|
}},
|
||||||
|
{S("Translations"), 0x00FF60, {
|
||||||
|
"Wuzzy",
|
||||||
|
"Rocher Laurent",
|
||||||
|
"wuniversales",
|
||||||
|
"kay27",
|
||||||
|
"pitchum",
|
||||||
|
"todoporlalibertad",
|
||||||
|
"Marcin Serwin",
|
||||||
|
}},
|
||||||
|
{S("Special thanks"), 0x00E9FF, {
|
||||||
|
"celeron55 for creating Minetest",
|
||||||
|
"Jordach for the jukebox music compilation from Big Freaking Dig",
|
||||||
|
"The workaholics who spent way too much time writing for the Minecraft Wiki. It's an invaluable resource for creating this game",
|
||||||
|
"Notch and Jeb for being the major forces behind Minecraft",
|
||||||
|
}},
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
#! /usr/bin/env lua
|
||||||
|
-- Script to automatically generate mods/HUD/mcl_credits/people.lua from CREDITS.md
|
||||||
|
-- Run from MCL2 root folder
|
||||||
|
|
||||||
|
local colors = {
|
||||||
|
["Creator of MineClone"] = "0x0A9400",
|
||||||
|
["Creator of MineClone2"] = "0xFBF837",
|
||||||
|
["Maintainers"] = "0xFF51D5",
|
||||||
|
["Developers"] = "0xF84355",
|
||||||
|
["Contributors"] = "0x52FF00",
|
||||||
|
["MineClone5"] = "0xA60014",
|
||||||
|
["Original Mod Authors"] = "0x343434",
|
||||||
|
["3D Models"] = "0x0019FF",
|
||||||
|
["Textures"] = "0xFF9705",
|
||||||
|
["Translations"] = "0x00FF60",
|
||||||
|
["Special thanks"] = "0x00E9FF",
|
||||||
|
}
|
||||||
|
|
||||||
|
local from = io.open("CREDITS.md", "r")
|
||||||
|
local to = io.open("mods/HUD/mcl_credits/people.lua", "w")
|
||||||
|
|
||||||
|
to:write([[
|
||||||
|
local modname = minetest.get_current_modname()
|
||||||
|
local S = minetest.get_translator(modname)
|
||||||
|
|
||||||
|
]])
|
||||||
|
|
||||||
|
to:write("return {\n")
|
||||||
|
|
||||||
|
local started_block = false
|
||||||
|
|
||||||
|
for line in from:lines() do
|
||||||
|
if line:find("## ") == 1 then
|
||||||
|
if started_block then
|
||||||
|
to:write("\t}},\n")
|
||||||
|
end
|
||||||
|
local title = line:sub(4, #line)
|
||||||
|
to:write("\t{S(\"" .. title .. "\"), " .. (colors[title] or "0xFFFFFF") .. ", {\n")
|
||||||
|
started_block = true
|
||||||
|
elseif line:find("*") == 1 then
|
||||||
|
to:write("\t\t\"" .. line:sub(3, #line) .. "\",\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if started_block then
|
||||||
|
to:write("\t}},\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
to:write("}\n")
|
Loading…
Reference in New Issue