diff --git a/README.md b/README.md
index c68014e..f34a5c0 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,5 @@
-# GroovyScript Docs
-This is the official repository for the GroovyScript Documentation using Read the Docs and MkDocs\
-Docs are hosted [here](https://groovyscript-docs.readthedocs.io/en/latest/)
+# GroovyScript Docs Localization
+Being localized ......If you want to see the English wiki tutorial, [please](https://groovyscript-docs.readthedocs.io/en/latest/)
## Test locally
Run the following from a terminal
@@ -10,4 +9,4 @@ pip install -r requirements.txt
mkdocs serve
```
`pip install` installs the required dependencies and `mkdocs serve` builds and runs the doc on a local server.\
-After that simply open [http://127.0.0.1:8000/](http://127.0.0.1:8000/) in a browser. It automatically refreshes when you save files.
\ No newline at end of file
+After that simply open [http://127.0.0.1:8000/](http://127.0.0.1:8000/) in a browser. It automatically refreshes when you save files.
diff --git a/docs/de/index.md b/docs/de/index.md
new file mode 100644
index 0000000..e1b7b66
--- /dev/null
+++ b/docs/de/index.md
@@ -0,0 +1,35 @@
+# Welcome to GroovyScript
+
+Ein umfassender Skriptsandkasten für Minecraft 1.12.2.
+[Trete unserem Discordserver bei (Englisch)](https://discord.com/invite/m53yxTjjKM).
+
+!!! Note
+ Die deutsche Übersetzung ist nicht vollständig! Bei nicht vorhandenen Seiten werden die Englischen versionen gezeigt.
+
+Du siehst nicht, was andere sehen? Versuche die Seite neu zu laden.
+
+#### Merkmale:
+
+1. Groovy: eine leistungsfähige und getestete Skriptsprache
+ - Java kompatibler Syntax + zusammenpassender Code
+ - Statische Kompilation
+ - Optionale dynamisches typisieren
+ - Metaprogrammierung
+2. Sandboxed: scripts are effectively ran in a sandbox, with sensitive operations blacklisted from being called or referenced
+3. Reloading: able to test script changes within the game without restarting
+ - Most if not all Forge Registry objects can be reloaded on the fly
+ - Most mod registries are supported natively
+4. Events: Easily listen to Forge's EventBuses with Groovy Closures
+5. Familiarity: Bracket handlers for those that are familiar with CraftTweaker (currently implemented, may be removed in the near future)
+6. Informational: commands to display rich information for the item in your hand and more
+7. Optimized: Making sure no compromises are being made while delivering features with efficient code
+8. API: Great catalogue of code for other mod authors to make their mods compatible with GroovyScript such as package/class/method/field blacklists
+
+### Where to go?
+Check [this](getting_started.md) out to get started.
+Check out the Groovy tab for infos about the Groovy language.
+Check out the GroovyScript for the GroovyScript documentation.
+
+!!! Note
+ This wiki is highly WIP. There is still a lot of info missing. We would appreciate any help to improve this place.
+ Get started by joining our [Discord](https://discord.com/invite/m53yxTjjKM)
\ No newline at end of file
diff --git a/docs/assets/images/slice_n_splice_recipe.png b/docs/en/assets/images/slice_n_splice_recipe.png
similarity index 100%
rename from docs/assets/images/slice_n_splice_recipe.png
rename to docs/en/assets/images/slice_n_splice_recipe.png
diff --git a/docs/getting_started.md b/docs/en/getting_started.md
similarity index 100%
rename from docs/getting_started.md
rename to docs/en/getting_started.md
diff --git a/docs/groovy/builder.md b/docs/en/groovy/builder.md
similarity index 100%
rename from docs/groovy/builder.md
rename to docs/en/groovy/builder.md
diff --git a/docs/groovy/closure.md b/docs/en/groovy/closure.md
similarity index 100%
rename from docs/groovy/closure.md
rename to docs/en/groovy/closure.md
diff --git a/docs/groovy/introduction.md b/docs/en/groovy/introduction.md
similarity index 100%
rename from docs/groovy/introduction.md
rename to docs/en/groovy/introduction.md
diff --git a/docs/groovy/lists.md b/docs/en/groovy/lists.md
similarity index 100%
rename from docs/groovy/lists.md
rename to docs/en/groovy/lists.md
diff --git a/docs/groovy/loops.md b/docs/en/groovy/loops.md
similarity index 100%
rename from docs/groovy/loops.md
rename to docs/en/groovy/loops.md
diff --git a/docs/groovy/maps.md b/docs/en/groovy/maps.md
similarity index 100%
rename from docs/groovy/maps.md
rename to docs/en/groovy/maps.md
diff --git a/docs/groovy/strings.md b/docs/en/groovy/strings.md
similarity index 100%
rename from docs/groovy/strings.md
rename to docs/en/groovy/strings.md
diff --git a/docs/groovyscript/content/block.md b/docs/en/groovyscript/content/block.md
similarity index 100%
rename from docs/groovyscript/content/block.md
rename to docs/en/groovyscript/content/block.md
diff --git a/docs/groovyscript/content/content.md b/docs/en/groovyscript/content/content.md
similarity index 100%
rename from docs/groovyscript/content/content.md
rename to docs/en/groovyscript/content/content.md
diff --git a/docs/groovyscript/content/creative_tab.md b/docs/en/groovyscript/content/creative_tab.md
similarity index 100%
rename from docs/groovyscript/content/creative_tab.md
rename to docs/en/groovyscript/content/creative_tab.md
diff --git a/docs/groovyscript/content/item.md b/docs/en/groovyscript/content/item.md
similarity index 100%
rename from docs/groovyscript/content/item.md
rename to docs/en/groovyscript/content/item.md
diff --git a/docs/groovyscript/minecraft/crafting.md b/docs/en/groovyscript/minecraft/crafting.md
similarity index 100%
rename from docs/groovyscript/minecraft/crafting.md
rename to docs/en/groovyscript/minecraft/crafting.md
diff --git a/docs/groovyscript/minecraft/crafting_builders.md b/docs/en/groovyscript/minecraft/crafting_builders.md
similarity index 100%
rename from docs/groovyscript/minecraft/crafting_builders.md
rename to docs/en/groovyscript/minecraft/crafting_builders.md
diff --git a/docs/groovyscript/minecraft/events.md b/docs/en/groovyscript/minecraft/events.md
similarity index 100%
rename from docs/groovyscript/minecraft/events.md
rename to docs/en/groovyscript/minecraft/events.md
diff --git a/docs/groovyscript/minecraft/events/aa_events.md b/docs/en/groovyscript/minecraft/events/aa_events.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/aa_events.md
rename to docs/en/groovyscript/minecraft/events/aa_events.md
diff --git a/docs/groovyscript/minecraft/events/advancement_event.md b/docs/en/groovyscript/minecraft/events/advancement_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/advancement_event.md
rename to docs/en/groovyscript/minecraft/events/advancement_event.md
diff --git a/docs/groovyscript/minecraft/events/animal_tame_event.md b/docs/en/groovyscript/minecraft/events/animal_tame_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/animal_tame_event.md
rename to docs/en/groovyscript/minecraft/events/animal_tame_event.md
diff --git a/docs/groovyscript/minecraft/events/anvil_repair_event.md b/docs/en/groovyscript/minecraft/events/anvil_repair_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/anvil_repair_event.md
rename to docs/en/groovyscript/minecraft/events/anvil_repair_event.md
diff --git a/docs/groovyscript/minecraft/events/anvil_update_event.md b/docs/en/groovyscript/minecraft/events/anvil_update_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/anvil_update_event.md
rename to docs/en/groovyscript/minecraft/events/anvil_update_event.md
diff --git a/docs/groovyscript/minecraft/events/arrow_loose_event.md b/docs/en/groovyscript/minecraft/events/arrow_loose_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/arrow_loose_event.md
rename to docs/en/groovyscript/minecraft/events/arrow_loose_event.md
diff --git a/docs/groovyscript/minecraft/events/arrow_nock_event.md b/docs/en/groovyscript/minecraft/events/arrow_nock_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/arrow_nock_event.md
rename to docs/en/groovyscript/minecraft/events/arrow_nock_event.md
diff --git a/docs/groovyscript/minecraft/events/attach_capabilities_event.md b/docs/en/groovyscript/minecraft/events/attach_capabilities_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/attach_capabilities_event.md
rename to docs/en/groovyscript/minecraft/events/attach_capabilities_event.md
diff --git a/docs/groovyscript/minecraft/events/attack_entity_event.md b/docs/en/groovyscript/minecraft/events/attack_entity_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/attack_entity_event.md
rename to docs/en/groovyscript/minecraft/events/attack_entity_event.md
diff --git a/docs/groovyscript/minecraft/events/baby_entity_spawn_event.md b/docs/en/groovyscript/minecraft/events/baby_entity_spawn_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/baby_entity_spawn_event.md
rename to docs/en/groovyscript/minecraft/events/baby_entity_spawn_event.md
diff --git a/docs/groovyscript/minecraft/events/biome_event._biome_color.md b/docs/en/groovyscript/minecraft/events/biome_event._biome_color.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/biome_event._biome_color.md
rename to docs/en/groovyscript/minecraft/events/biome_event._biome_color.md
diff --git a/docs/groovyscript/minecraft/events/biome_event._create_decorator.md b/docs/en/groovyscript/minecraft/events/biome_event._create_decorator.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/biome_event._create_decorator.md
rename to docs/en/groovyscript/minecraft/events/biome_event._create_decorator.md
diff --git a/docs/groovyscript/minecraft/events/biome_event._get_foliage_color.md b/docs/en/groovyscript/minecraft/events/biome_event._get_foliage_color.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/biome_event._get_foliage_color.md
rename to docs/en/groovyscript/minecraft/events/biome_event._get_foliage_color.md
diff --git a/docs/groovyscript/minecraft/events/biome_event._get_grass_color.md b/docs/en/groovyscript/minecraft/events/biome_event._get_grass_color.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/biome_event._get_grass_color.md
rename to docs/en/groovyscript/minecraft/events/biome_event._get_grass_color.md
diff --git a/docs/groovyscript/minecraft/events/biome_event._get_village_block_i_d.md b/docs/en/groovyscript/minecraft/events/biome_event._get_village_block_i_d.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/biome_event._get_village_block_i_d.md
rename to docs/en/groovyscript/minecraft/events/biome_event._get_village_block_i_d.md
diff --git a/docs/groovyscript/minecraft/events/biome_event._get_water_color.md b/docs/en/groovyscript/minecraft/events/biome_event._get_water_color.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/biome_event._get_water_color.md
rename to docs/en/groovyscript/minecraft/events/biome_event._get_water_color.md
diff --git a/docs/groovyscript/minecraft/events/biome_event.md b/docs/en/groovyscript/minecraft/events/biome_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/biome_event.md
rename to docs/en/groovyscript/minecraft/events/biome_event.md
diff --git a/docs/groovyscript/minecraft/events/block_event._break_event.md b/docs/en/groovyscript/minecraft/events/block_event._break_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/block_event._break_event.md
rename to docs/en/groovyscript/minecraft/events/block_event._break_event.md
diff --git a/docs/groovyscript/minecraft/events/block_event._create_fluid_source_event.md b/docs/en/groovyscript/minecraft/events/block_event._create_fluid_source_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/block_event._create_fluid_source_event.md
rename to docs/en/groovyscript/minecraft/events/block_event._create_fluid_source_event.md
diff --git a/docs/groovyscript/minecraft/events/block_event._crop_grow_event.md b/docs/en/groovyscript/minecraft/events/block_event._crop_grow_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/block_event._crop_grow_event.md
rename to docs/en/groovyscript/minecraft/events/block_event._crop_grow_event.md
diff --git a/docs/groovyscript/minecraft/events/block_event._entity_multi_place_event.md b/docs/en/groovyscript/minecraft/events/block_event._entity_multi_place_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/block_event._entity_multi_place_event.md
rename to docs/en/groovyscript/minecraft/events/block_event._entity_multi_place_event.md
diff --git a/docs/groovyscript/minecraft/events/block_event._entity_place_event.md b/docs/en/groovyscript/minecraft/events/block_event._entity_place_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/block_event._entity_place_event.md
rename to docs/en/groovyscript/minecraft/events/block_event._entity_place_event.md
diff --git a/docs/groovyscript/minecraft/events/block_event._farmland_trample_event.md b/docs/en/groovyscript/minecraft/events/block_event._farmland_trample_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/block_event._farmland_trample_event.md
rename to docs/en/groovyscript/minecraft/events/block_event._farmland_trample_event.md
diff --git a/docs/groovyscript/minecraft/events/block_event._fluid_place_block_event.md b/docs/en/groovyscript/minecraft/events/block_event._fluid_place_block_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/block_event._fluid_place_block_event.md
rename to docs/en/groovyscript/minecraft/events/block_event._fluid_place_block_event.md
diff --git a/docs/groovyscript/minecraft/events/block_event._harvest_drops_event.md b/docs/en/groovyscript/minecraft/events/block_event._harvest_drops_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/block_event._harvest_drops_event.md
rename to docs/en/groovyscript/minecraft/events/block_event._harvest_drops_event.md
diff --git a/docs/groovyscript/minecraft/events/block_event._multi_place_event.md b/docs/en/groovyscript/minecraft/events/block_event._multi_place_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/block_event._multi_place_event.md
rename to docs/en/groovyscript/minecraft/events/block_event._multi_place_event.md
diff --git a/docs/groovyscript/minecraft/events/block_event._neighbor_notify_event.md b/docs/en/groovyscript/minecraft/events/block_event._neighbor_notify_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/block_event._neighbor_notify_event.md
rename to docs/en/groovyscript/minecraft/events/block_event._neighbor_notify_event.md
diff --git a/docs/groovyscript/minecraft/events/block_event._place_event.md b/docs/en/groovyscript/minecraft/events/block_event._place_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/block_event._place_event.md
rename to docs/en/groovyscript/minecraft/events/block_event._place_event.md
diff --git a/docs/groovyscript/minecraft/events/block_event._portal_spawn_event.md b/docs/en/groovyscript/minecraft/events/block_event._portal_spawn_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/block_event._portal_spawn_event.md
rename to docs/en/groovyscript/minecraft/events/block_event._portal_spawn_event.md
diff --git a/docs/groovyscript/minecraft/events/block_event.md b/docs/en/groovyscript/minecraft/events/block_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/block_event.md
rename to docs/en/groovyscript/minecraft/events/block_event.md
diff --git a/docs/groovyscript/minecraft/events/bonemeal_event.md b/docs/en/groovyscript/minecraft/events/bonemeal_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/bonemeal_event.md
rename to docs/en/groovyscript/minecraft/events/bonemeal_event.md
diff --git a/docs/groovyscript/minecraft/events/chunk_data_event._load.md b/docs/en/groovyscript/minecraft/events/chunk_data_event._load.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/chunk_data_event._load.md
rename to docs/en/groovyscript/minecraft/events/chunk_data_event._load.md
diff --git a/docs/groovyscript/minecraft/events/chunk_data_event._save.md b/docs/en/groovyscript/minecraft/events/chunk_data_event._save.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/chunk_data_event._save.md
rename to docs/en/groovyscript/minecraft/events/chunk_data_event._save.md
diff --git a/docs/groovyscript/minecraft/events/chunk_data_event.md b/docs/en/groovyscript/minecraft/events/chunk_data_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/chunk_data_event.md
rename to docs/en/groovyscript/minecraft/events/chunk_data_event.md
diff --git a/docs/groovyscript/minecraft/events/chunk_event._load.md b/docs/en/groovyscript/minecraft/events/chunk_event._load.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/chunk_event._load.md
rename to docs/en/groovyscript/minecraft/events/chunk_event._load.md
diff --git a/docs/groovyscript/minecraft/events/chunk_event._unload.md b/docs/en/groovyscript/minecraft/events/chunk_event._unload.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/chunk_event._unload.md
rename to docs/en/groovyscript/minecraft/events/chunk_event._unload.md
diff --git a/docs/groovyscript/minecraft/events/chunk_event.md b/docs/en/groovyscript/minecraft/events/chunk_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/chunk_event.md
rename to docs/en/groovyscript/minecraft/events/chunk_event.md
diff --git a/docs/groovyscript/minecraft/events/chunk_generator_event._init_noise_field.md b/docs/en/groovyscript/minecraft/events/chunk_generator_event._init_noise_field.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/chunk_generator_event._init_noise_field.md
rename to docs/en/groovyscript/minecraft/events/chunk_generator_event._init_noise_field.md
diff --git a/docs/groovyscript/minecraft/events/chunk_generator_event._replace_biome_blocks.md b/docs/en/groovyscript/minecraft/events/chunk_generator_event._replace_biome_blocks.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/chunk_generator_event._replace_biome_blocks.md
rename to docs/en/groovyscript/minecraft/events/chunk_generator_event._replace_biome_blocks.md
diff --git a/docs/groovyscript/minecraft/events/chunk_generator_event.md b/docs/en/groovyscript/minecraft/events/chunk_generator_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/chunk_generator_event.md
rename to docs/en/groovyscript/minecraft/events/chunk_generator_event.md
diff --git a/docs/groovyscript/minecraft/events/chunk_watch_event._un_watch.md b/docs/en/groovyscript/minecraft/events/chunk_watch_event._un_watch.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/chunk_watch_event._un_watch.md
rename to docs/en/groovyscript/minecraft/events/chunk_watch_event._un_watch.md
diff --git a/docs/groovyscript/minecraft/events/chunk_watch_event._watch.md b/docs/en/groovyscript/minecraft/events/chunk_watch_event._watch.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/chunk_watch_event._watch.md
rename to docs/en/groovyscript/minecraft/events/chunk_watch_event._watch.md
diff --git a/docs/groovyscript/minecraft/events/chunk_watch_event.md b/docs/en/groovyscript/minecraft/events/chunk_watch_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/chunk_watch_event.md
rename to docs/en/groovyscript/minecraft/events/chunk_watch_event.md
diff --git a/docs/groovyscript/minecraft/events/command_event.md b/docs/en/groovyscript/minecraft/events/command_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/command_event.md
rename to docs/en/groovyscript/minecraft/events/command_event.md
diff --git a/docs/groovyscript/minecraft/events/critical_hit_event.md b/docs/en/groovyscript/minecraft/events/critical_hit_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/critical_hit_event.md
rename to docs/en/groovyscript/minecraft/events/critical_hit_event.md
diff --git a/docs/groovyscript/minecraft/events/decorate_biome_event._decorate.md b/docs/en/groovyscript/minecraft/events/decorate_biome_event._decorate.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/decorate_biome_event._decorate.md
rename to docs/en/groovyscript/minecraft/events/decorate_biome_event._decorate.md
diff --git a/docs/groovyscript/minecraft/events/decorate_biome_event.md b/docs/en/groovyscript/minecraft/events/decorate_biome_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/decorate_biome_event.md
rename to docs/en/groovyscript/minecraft/events/decorate_biome_event.md
diff --git a/docs/groovyscript/minecraft/events/difficulty_change_event.md b/docs/en/groovyscript/minecraft/events/difficulty_change_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/difficulty_change_event.md
rename to docs/en/groovyscript/minecraft/events/difficulty_change_event.md
diff --git a/docs/groovyscript/minecraft/events/enchantment_level_set_event.md b/docs/en/groovyscript/minecraft/events/enchantment_level_set_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/enchantment_level_set_event.md
rename to docs/en/groovyscript/minecraft/events/enchantment_level_set_event.md
diff --git a/docs/groovyscript/minecraft/events/ender_teleport_event.md b/docs/en/groovyscript/minecraft/events/ender_teleport_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/ender_teleport_event.md
rename to docs/en/groovyscript/minecraft/events/ender_teleport_event.md
diff --git a/docs/groovyscript/minecraft/events/entity_event._can_update.md b/docs/en/groovyscript/minecraft/events/entity_event._can_update.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/entity_event._can_update.md
rename to docs/en/groovyscript/minecraft/events/entity_event._can_update.md
diff --git a/docs/groovyscript/minecraft/events/entity_event._entering_chunk.md b/docs/en/groovyscript/minecraft/events/entity_event._entering_chunk.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/entity_event._entering_chunk.md
rename to docs/en/groovyscript/minecraft/events/entity_event._entering_chunk.md
diff --git a/docs/groovyscript/minecraft/events/entity_event._entity_constructing.md b/docs/en/groovyscript/minecraft/events/entity_event._entity_constructing.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/entity_event._entity_constructing.md
rename to docs/en/groovyscript/minecraft/events/entity_event._entity_constructing.md
diff --git a/docs/groovyscript/minecraft/events/entity_event.md b/docs/en/groovyscript/minecraft/events/entity_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/entity_event.md
rename to docs/en/groovyscript/minecraft/events/entity_event.md
diff --git a/docs/groovyscript/minecraft/events/entity_item_pickup_event.md b/docs/en/groovyscript/minecraft/events/entity_item_pickup_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/entity_item_pickup_event.md
rename to docs/en/groovyscript/minecraft/events/entity_item_pickup_event.md
diff --git a/docs/groovyscript/minecraft/events/entity_join_world_event.md b/docs/en/groovyscript/minecraft/events/entity_join_world_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/entity_join_world_event.md
rename to docs/en/groovyscript/minecraft/events/entity_join_world_event.md
diff --git a/docs/groovyscript/minecraft/events/entity_mob_griefing_event.md b/docs/en/groovyscript/minecraft/events/entity_mob_griefing_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/entity_mob_griefing_event.md
rename to docs/en/groovyscript/minecraft/events/entity_mob_griefing_event.md
diff --git a/docs/groovyscript/minecraft/events/entity_mount_event.md b/docs/en/groovyscript/minecraft/events/entity_mount_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/entity_mount_event.md
rename to docs/en/groovyscript/minecraft/events/entity_mount_event.md
diff --git a/docs/groovyscript/minecraft/events/entity_struck_by_lightning_event.md b/docs/en/groovyscript/minecraft/events/entity_struck_by_lightning_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/entity_struck_by_lightning_event.md
rename to docs/en/groovyscript/minecraft/events/entity_struck_by_lightning_event.md
diff --git a/docs/groovyscript/minecraft/events/entity_travel_to_dimension_event.md b/docs/en/groovyscript/minecraft/events/entity_travel_to_dimension_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/entity_travel_to_dimension_event.md
rename to docs/en/groovyscript/minecraft/events/entity_travel_to_dimension_event.md
diff --git a/docs/groovyscript/minecraft/events/explosion_event._detonate.md b/docs/en/groovyscript/minecraft/events/explosion_event._detonate.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/explosion_event._detonate.md
rename to docs/en/groovyscript/minecraft/events/explosion_event._detonate.md
diff --git a/docs/groovyscript/minecraft/events/explosion_event._start.md b/docs/en/groovyscript/minecraft/events/explosion_event._start.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/explosion_event._start.md
rename to docs/en/groovyscript/minecraft/events/explosion_event._start.md
diff --git a/docs/groovyscript/minecraft/events/explosion_event.md b/docs/en/groovyscript/minecraft/events/explosion_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/explosion_event.md
rename to docs/en/groovyscript/minecraft/events/explosion_event.md
diff --git a/docs/groovyscript/minecraft/events/fill_bucket_event.md b/docs/en/groovyscript/minecraft/events/fill_bucket_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/fill_bucket_event.md
rename to docs/en/groovyscript/minecraft/events/fill_bucket_event.md
diff --git a/docs/groovyscript/minecraft/events/furnace_fuel_burn_time_event.md b/docs/en/groovyscript/minecraft/events/furnace_fuel_burn_time_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/furnace_fuel_burn_time_event.md
rename to docs/en/groovyscript/minecraft/events/furnace_fuel_burn_time_event.md
diff --git a/docs/groovyscript/minecraft/events/game_rule_change_event.md b/docs/en/groovyscript/minecraft/events/game_rule_change_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/game_rule_change_event.md
rename to docs/en/groovyscript/minecraft/events/game_rule_change_event.md
diff --git a/docs/groovyscript/minecraft/events/get_collision_boxes_event.md b/docs/en/groovyscript/minecraft/events/get_collision_boxes_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/get_collision_boxes_event.md
rename to docs/en/groovyscript/minecraft/events/get_collision_boxes_event.md
diff --git a/docs/groovyscript/minecraft/events/init_map_gen_event.md b/docs/en/groovyscript/minecraft/events/init_map_gen_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/init_map_gen_event.md
rename to docs/en/groovyscript/minecraft/events/init_map_gen_event.md
diff --git a/docs/groovyscript/minecraft/events/init_noise_gens_event.md b/docs/en/groovyscript/minecraft/events/init_noise_gens_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/init_noise_gens_event.md
rename to docs/en/groovyscript/minecraft/events/init_noise_gens_event.md
diff --git a/docs/groovyscript/minecraft/events/item_event.md b/docs/en/groovyscript/minecraft/events/item_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/item_event.md
rename to docs/en/groovyscript/minecraft/events/item_event.md
diff --git a/docs/groovyscript/minecraft/events/item_expire_event.md b/docs/en/groovyscript/minecraft/events/item_expire_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/item_expire_event.md
rename to docs/en/groovyscript/minecraft/events/item_expire_event.md
diff --git a/docs/groovyscript/minecraft/events/item_fished_event.md b/docs/en/groovyscript/minecraft/events/item_fished_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/item_fished_event.md
rename to docs/en/groovyscript/minecraft/events/item_fished_event.md
diff --git a/docs/groovyscript/minecraft/events/item_tooltip_event.md b/docs/en/groovyscript/minecraft/events/item_tooltip_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/item_tooltip_event.md
rename to docs/en/groovyscript/minecraft/events/item_tooltip_event.md
diff --git a/docs/groovyscript/minecraft/events/item_toss_event.md b/docs/en/groovyscript/minecraft/events/item_toss_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/item_toss_event.md
rename to docs/en/groovyscript/minecraft/events/item_toss_event.md
diff --git a/docs/groovyscript/minecraft/events/living_attack_event.md b/docs/en/groovyscript/minecraft/events/living_attack_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_attack_event.md
rename to docs/en/groovyscript/minecraft/events/living_attack_event.md
diff --git a/docs/groovyscript/minecraft/events/living_damage_event.md b/docs/en/groovyscript/minecraft/events/living_damage_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_damage_event.md
rename to docs/en/groovyscript/minecraft/events/living_damage_event.md
diff --git a/docs/groovyscript/minecraft/events/living_death_event.md b/docs/en/groovyscript/minecraft/events/living_death_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_death_event.md
rename to docs/en/groovyscript/minecraft/events/living_death_event.md
diff --git a/docs/groovyscript/minecraft/events/living_destroy_block_event.md b/docs/en/groovyscript/minecraft/events/living_destroy_block_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_destroy_block_event.md
rename to docs/en/groovyscript/minecraft/events/living_destroy_block_event.md
diff --git a/docs/groovyscript/minecraft/events/living_drops_event.md b/docs/en/groovyscript/minecraft/events/living_drops_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_drops_event.md
rename to docs/en/groovyscript/minecraft/events/living_drops_event.md
diff --git a/docs/groovyscript/minecraft/events/living_entity_use_item_event._finish.md b/docs/en/groovyscript/minecraft/events/living_entity_use_item_event._finish.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_entity_use_item_event._finish.md
rename to docs/en/groovyscript/minecraft/events/living_entity_use_item_event._finish.md
diff --git a/docs/groovyscript/minecraft/events/living_entity_use_item_event._start.md b/docs/en/groovyscript/minecraft/events/living_entity_use_item_event._start.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_entity_use_item_event._start.md
rename to docs/en/groovyscript/minecraft/events/living_entity_use_item_event._start.md
diff --git a/docs/groovyscript/minecraft/events/living_entity_use_item_event._stop.md b/docs/en/groovyscript/minecraft/events/living_entity_use_item_event._stop.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_entity_use_item_event._stop.md
rename to docs/en/groovyscript/minecraft/events/living_entity_use_item_event._stop.md
diff --git a/docs/groovyscript/minecraft/events/living_entity_use_item_event._tick.md b/docs/en/groovyscript/minecraft/events/living_entity_use_item_event._tick.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_entity_use_item_event._tick.md
rename to docs/en/groovyscript/minecraft/events/living_entity_use_item_event._tick.md
diff --git a/docs/groovyscript/minecraft/events/living_entity_use_item_event.md b/docs/en/groovyscript/minecraft/events/living_entity_use_item_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_entity_use_item_event.md
rename to docs/en/groovyscript/minecraft/events/living_entity_use_item_event.md
diff --git a/docs/groovyscript/minecraft/events/living_equipment_change_event.md b/docs/en/groovyscript/minecraft/events/living_equipment_change_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_equipment_change_event.md
rename to docs/en/groovyscript/minecraft/events/living_equipment_change_event.md
diff --git a/docs/groovyscript/minecraft/events/living_event._living_jump_event.md b/docs/en/groovyscript/minecraft/events/living_event._living_jump_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_event._living_jump_event.md
rename to docs/en/groovyscript/minecraft/events/living_event._living_jump_event.md
diff --git a/docs/groovyscript/minecraft/events/living_event._living_update_event.md b/docs/en/groovyscript/minecraft/events/living_event._living_update_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_event._living_update_event.md
rename to docs/en/groovyscript/minecraft/events/living_event._living_update_event.md
diff --git a/docs/groovyscript/minecraft/events/living_event.md b/docs/en/groovyscript/minecraft/events/living_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_event.md
rename to docs/en/groovyscript/minecraft/events/living_event.md
diff --git a/docs/groovyscript/minecraft/events/living_experience_drop_event.md b/docs/en/groovyscript/minecraft/events/living_experience_drop_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_experience_drop_event.md
rename to docs/en/groovyscript/minecraft/events/living_experience_drop_event.md
diff --git a/docs/groovyscript/minecraft/events/living_fall_event.md b/docs/en/groovyscript/minecraft/events/living_fall_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_fall_event.md
rename to docs/en/groovyscript/minecraft/events/living_fall_event.md
diff --git a/docs/groovyscript/minecraft/events/living_heal_event.md b/docs/en/groovyscript/minecraft/events/living_heal_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_heal_event.md
rename to docs/en/groovyscript/minecraft/events/living_heal_event.md
diff --git a/docs/groovyscript/minecraft/events/living_hurt_event.md b/docs/en/groovyscript/minecraft/events/living_hurt_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_hurt_event.md
rename to docs/en/groovyscript/minecraft/events/living_hurt_event.md
diff --git a/docs/groovyscript/minecraft/events/living_knock_back_event.md b/docs/en/groovyscript/minecraft/events/living_knock_back_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_knock_back_event.md
rename to docs/en/groovyscript/minecraft/events/living_knock_back_event.md
diff --git a/docs/groovyscript/minecraft/events/living_pack_size_event.md b/docs/en/groovyscript/minecraft/events/living_pack_size_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_pack_size_event.md
rename to docs/en/groovyscript/minecraft/events/living_pack_size_event.md
diff --git a/docs/groovyscript/minecraft/events/living_set_attack_target_event.md b/docs/en/groovyscript/minecraft/events/living_set_attack_target_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_set_attack_target_event.md
rename to docs/en/groovyscript/minecraft/events/living_set_attack_target_event.md
diff --git a/docs/groovyscript/minecraft/events/living_spawn_event._allow_despawn.md b/docs/en/groovyscript/minecraft/events/living_spawn_event._allow_despawn.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_spawn_event._allow_despawn.md
rename to docs/en/groovyscript/minecraft/events/living_spawn_event._allow_despawn.md
diff --git a/docs/groovyscript/minecraft/events/living_spawn_event._check_spawn.md b/docs/en/groovyscript/minecraft/events/living_spawn_event._check_spawn.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_spawn_event._check_spawn.md
rename to docs/en/groovyscript/minecraft/events/living_spawn_event._check_spawn.md
diff --git a/docs/groovyscript/minecraft/events/living_spawn_event._special_spawn.md b/docs/en/groovyscript/minecraft/events/living_spawn_event._special_spawn.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_spawn_event._special_spawn.md
rename to docs/en/groovyscript/minecraft/events/living_spawn_event._special_spawn.md
diff --git a/docs/groovyscript/minecraft/events/living_spawn_event.md b/docs/en/groovyscript/minecraft/events/living_spawn_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/living_spawn_event.md
rename to docs/en/groovyscript/minecraft/events/living_spawn_event.md
diff --git a/docs/groovyscript/minecraft/events/loot_table_load_event.md b/docs/en/groovyscript/minecraft/events/loot_table_load_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/loot_table_load_event.md
rename to docs/en/groovyscript/minecraft/events/loot_table_load_event.md
diff --git a/docs/groovyscript/minecraft/events/looting_level_event.md b/docs/en/groovyscript/minecraft/events/looting_level_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/looting_level_event.md
rename to docs/en/groovyscript/minecraft/events/looting_level_event.md
diff --git a/docs/groovyscript/minecraft/events/merchant_trade_offers_event.md b/docs/en/groovyscript/minecraft/events/merchant_trade_offers_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/merchant_trade_offers_event.md
rename to docs/en/groovyscript/minecraft/events/merchant_trade_offers_event.md
diff --git a/docs/groovyscript/minecraft/events/minecart_collision_event.md b/docs/en/groovyscript/minecraft/events/minecart_collision_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/minecart_collision_event.md
rename to docs/en/groovyscript/minecraft/events/minecart_collision_event.md
diff --git a/docs/groovyscript/minecraft/events/minecart_event.md b/docs/en/groovyscript/minecraft/events/minecart_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/minecart_event.md
rename to docs/en/groovyscript/minecraft/events/minecart_event.md
diff --git a/docs/groovyscript/minecraft/events/minecart_interact_event.md b/docs/en/groovyscript/minecraft/events/minecart_interact_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/minecart_interact_event.md
rename to docs/en/groovyscript/minecraft/events/minecart_interact_event.md
diff --git a/docs/groovyscript/minecraft/events/minecart_update_event.md b/docs/en/groovyscript/minecraft/events/minecart_update_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/minecart_update_event.md
rename to docs/en/groovyscript/minecraft/events/minecart_update_event.md
diff --git a/docs/groovyscript/minecraft/events/note_block_event._change.md b/docs/en/groovyscript/minecraft/events/note_block_event._change.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/note_block_event._change.md
rename to docs/en/groovyscript/minecraft/events/note_block_event._change.md
diff --git a/docs/groovyscript/minecraft/events/note_block_event._play.md b/docs/en/groovyscript/minecraft/events/note_block_event._play.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/note_block_event._play.md
rename to docs/en/groovyscript/minecraft/events/note_block_event._play.md
diff --git a/docs/groovyscript/minecraft/events/note_block_event.md b/docs/en/groovyscript/minecraft/events/note_block_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/note_block_event.md
rename to docs/en/groovyscript/minecraft/events/note_block_event.md
diff --git a/docs/groovyscript/minecraft/events/ore_gen_event._generate_minable.md b/docs/en/groovyscript/minecraft/events/ore_gen_event._generate_minable.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/ore_gen_event._generate_minable.md
rename to docs/en/groovyscript/minecraft/events/ore_gen_event._generate_minable.md
diff --git a/docs/groovyscript/minecraft/events/ore_gen_event.md b/docs/en/groovyscript/minecraft/events/ore_gen_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/ore_gen_event.md
rename to docs/en/groovyscript/minecraft/events/ore_gen_event.md
diff --git a/docs/groovyscript/minecraft/events/play_sound_at_entity_event.md b/docs/en/groovyscript/minecraft/events/play_sound_at_entity_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/play_sound_at_entity_event.md
rename to docs/en/groovyscript/minecraft/events/play_sound_at_entity_event.md
diff --git a/docs/groovyscript/minecraft/events/player_brewed_potion_event.md b/docs/en/groovyscript/minecraft/events/player_brewed_potion_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_brewed_potion_event.md
rename to docs/en/groovyscript/minecraft/events/player_brewed_potion_event.md
diff --git a/docs/groovyscript/minecraft/events/player_container_event._close.md b/docs/en/groovyscript/minecraft/events/player_container_event._close.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_container_event._close.md
rename to docs/en/groovyscript/minecraft/events/player_container_event._close.md
diff --git a/docs/groovyscript/minecraft/events/player_container_event._open.md b/docs/en/groovyscript/minecraft/events/player_container_event._open.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_container_event._open.md
rename to docs/en/groovyscript/minecraft/events/player_container_event._open.md
diff --git a/docs/groovyscript/minecraft/events/player_container_event.md b/docs/en/groovyscript/minecraft/events/player_container_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_container_event.md
rename to docs/en/groovyscript/minecraft/events/player_container_event.md
diff --git a/docs/groovyscript/minecraft/events/player_destroy_item_event.md b/docs/en/groovyscript/minecraft/events/player_destroy_item_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_destroy_item_event.md
rename to docs/en/groovyscript/minecraft/events/player_destroy_item_event.md
diff --git a/docs/groovyscript/minecraft/events/player_drops_event.md b/docs/en/groovyscript/minecraft/events/player_drops_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_drops_event.md
rename to docs/en/groovyscript/minecraft/events/player_drops_event.md
diff --git a/docs/groovyscript/minecraft/events/player_event._break_speed.md b/docs/en/groovyscript/minecraft/events/player_event._break_speed.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_event._break_speed.md
rename to docs/en/groovyscript/minecraft/events/player_event._break_speed.md
diff --git a/docs/groovyscript/minecraft/events/player_event._clone.md b/docs/en/groovyscript/minecraft/events/player_event._clone.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_event._clone.md
rename to docs/en/groovyscript/minecraft/events/player_event._clone.md
diff --git a/docs/groovyscript/minecraft/events/player_event._harvest_check.md b/docs/en/groovyscript/minecraft/events/player_event._harvest_check.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_event._harvest_check.md
rename to docs/en/groovyscript/minecraft/events/player_event._harvest_check.md
diff --git a/docs/groovyscript/minecraft/events/player_event._load_from_file.md b/docs/en/groovyscript/minecraft/events/player_event._load_from_file.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_event._load_from_file.md
rename to docs/en/groovyscript/minecraft/events/player_event._load_from_file.md
diff --git a/docs/groovyscript/minecraft/events/player_event._name_format.md b/docs/en/groovyscript/minecraft/events/player_event._name_format.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_event._name_format.md
rename to docs/en/groovyscript/minecraft/events/player_event._name_format.md
diff --git a/docs/groovyscript/minecraft/events/player_event._save_to_file.md b/docs/en/groovyscript/minecraft/events/player_event._save_to_file.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_event._save_to_file.md
rename to docs/en/groovyscript/minecraft/events/player_event._save_to_file.md
diff --git a/docs/groovyscript/minecraft/events/player_event._start_tracking.md b/docs/en/groovyscript/minecraft/events/player_event._start_tracking.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_event._start_tracking.md
rename to docs/en/groovyscript/minecraft/events/player_event._start_tracking.md
diff --git a/docs/groovyscript/minecraft/events/player_event._stop_tracking.md b/docs/en/groovyscript/minecraft/events/player_event._stop_tracking.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_event._stop_tracking.md
rename to docs/en/groovyscript/minecraft/events/player_event._stop_tracking.md
diff --git a/docs/groovyscript/minecraft/events/player_event._visibility.md b/docs/en/groovyscript/minecraft/events/player_event._visibility.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_event._visibility.md
rename to docs/en/groovyscript/minecraft/events/player_event._visibility.md
diff --git a/docs/groovyscript/minecraft/events/player_event.md b/docs/en/groovyscript/minecraft/events/player_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_event.md
rename to docs/en/groovyscript/minecraft/events/player_event.md
diff --git a/docs/groovyscript/minecraft/events/player_flyable_fall_event.md b/docs/en/groovyscript/minecraft/events/player_flyable_fall_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_flyable_fall_event.md
rename to docs/en/groovyscript/minecraft/events/player_flyable_fall_event.md
diff --git a/docs/groovyscript/minecraft/events/player_interact_event._entity_interact.md b/docs/en/groovyscript/minecraft/events/player_interact_event._entity_interact.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_interact_event._entity_interact.md
rename to docs/en/groovyscript/minecraft/events/player_interact_event._entity_interact.md
diff --git a/docs/groovyscript/minecraft/events/player_interact_event._entity_interact_specific.md b/docs/en/groovyscript/minecraft/events/player_interact_event._entity_interact_specific.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_interact_event._entity_interact_specific.md
rename to docs/en/groovyscript/minecraft/events/player_interact_event._entity_interact_specific.md
diff --git a/docs/groovyscript/minecraft/events/player_interact_event._left_click_block.md b/docs/en/groovyscript/minecraft/events/player_interact_event._left_click_block.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_interact_event._left_click_block.md
rename to docs/en/groovyscript/minecraft/events/player_interact_event._left_click_block.md
diff --git a/docs/groovyscript/minecraft/events/player_interact_event._left_click_empty.md b/docs/en/groovyscript/minecraft/events/player_interact_event._left_click_empty.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_interact_event._left_click_empty.md
rename to docs/en/groovyscript/minecraft/events/player_interact_event._left_click_empty.md
diff --git a/docs/groovyscript/minecraft/events/player_interact_event._right_click_block.md b/docs/en/groovyscript/minecraft/events/player_interact_event._right_click_block.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_interact_event._right_click_block.md
rename to docs/en/groovyscript/minecraft/events/player_interact_event._right_click_block.md
diff --git a/docs/groovyscript/minecraft/events/player_interact_event._right_click_empty.md b/docs/en/groovyscript/minecraft/events/player_interact_event._right_click_empty.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_interact_event._right_click_empty.md
rename to docs/en/groovyscript/minecraft/events/player_interact_event._right_click_empty.md
diff --git a/docs/groovyscript/minecraft/events/player_interact_event._right_click_item.md b/docs/en/groovyscript/minecraft/events/player_interact_event._right_click_item.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_interact_event._right_click_item.md
rename to docs/en/groovyscript/minecraft/events/player_interact_event._right_click_item.md
diff --git a/docs/groovyscript/minecraft/events/player_interact_event.md b/docs/en/groovyscript/minecraft/events/player_interact_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_interact_event.md
rename to docs/en/groovyscript/minecraft/events/player_interact_event.md
diff --git a/docs/groovyscript/minecraft/events/player_pickup_xp_event.md b/docs/en/groovyscript/minecraft/events/player_pickup_xp_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_pickup_xp_event.md
rename to docs/en/groovyscript/minecraft/events/player_pickup_xp_event.md
diff --git a/docs/groovyscript/minecraft/events/player_set_spawn_event.md b/docs/en/groovyscript/minecraft/events/player_set_spawn_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_set_spawn_event.md
rename to docs/en/groovyscript/minecraft/events/player_set_spawn_event.md
diff --git a/docs/groovyscript/minecraft/events/player_sleep_in_bed_event.md b/docs/en/groovyscript/minecraft/events/player_sleep_in_bed_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_sleep_in_bed_event.md
rename to docs/en/groovyscript/minecraft/events/player_sleep_in_bed_event.md
diff --git a/docs/groovyscript/minecraft/events/player_wake_up_event.md b/docs/en/groovyscript/minecraft/events/player_wake_up_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/player_wake_up_event.md
rename to docs/en/groovyscript/minecraft/events/player_wake_up_event.md
diff --git a/docs/groovyscript/minecraft/events/populate_chunk_event._populate.md b/docs/en/groovyscript/minecraft/events/populate_chunk_event._populate.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/populate_chunk_event._populate.md
rename to docs/en/groovyscript/minecraft/events/populate_chunk_event._populate.md
diff --git a/docs/groovyscript/minecraft/events/populate_chunk_event.md b/docs/en/groovyscript/minecraft/events/populate_chunk_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/populate_chunk_event.md
rename to docs/en/groovyscript/minecraft/events/populate_chunk_event.md
diff --git a/docs/groovyscript/minecraft/events/potion_brew_event.md b/docs/en/groovyscript/minecraft/events/potion_brew_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/potion_brew_event.md
rename to docs/en/groovyscript/minecraft/events/potion_brew_event.md
diff --git a/docs/groovyscript/minecraft/events/potion_color_calculation_event.md b/docs/en/groovyscript/minecraft/events/potion_color_calculation_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/potion_color_calculation_event.md
rename to docs/en/groovyscript/minecraft/events/potion_color_calculation_event.md
diff --git a/docs/groovyscript/minecraft/events/potion_event._potion_added_event.md b/docs/en/groovyscript/minecraft/events/potion_event._potion_added_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/potion_event._potion_added_event.md
rename to docs/en/groovyscript/minecraft/events/potion_event._potion_added_event.md
diff --git a/docs/groovyscript/minecraft/events/potion_event._potion_applicable_event.md b/docs/en/groovyscript/minecraft/events/potion_event._potion_applicable_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/potion_event._potion_applicable_event.md
rename to docs/en/groovyscript/minecraft/events/potion_event._potion_applicable_event.md
diff --git a/docs/groovyscript/minecraft/events/potion_event._potion_expiry_event.md b/docs/en/groovyscript/minecraft/events/potion_event._potion_expiry_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/potion_event._potion_expiry_event.md
rename to docs/en/groovyscript/minecraft/events/potion_event._potion_expiry_event.md
diff --git a/docs/groovyscript/minecraft/events/potion_event._potion_remove_event.md b/docs/en/groovyscript/minecraft/events/potion_event._potion_remove_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/potion_event._potion_remove_event.md
rename to docs/en/groovyscript/minecraft/events/potion_event._potion_remove_event.md
diff --git a/docs/groovyscript/minecraft/events/potion_event.md b/docs/en/groovyscript/minecraft/events/potion_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/potion_event.md
rename to docs/en/groovyscript/minecraft/events/potion_event.md
diff --git a/docs/groovyscript/minecraft/events/projectile_impact_event._arrow.md b/docs/en/groovyscript/minecraft/events/projectile_impact_event._arrow.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/projectile_impact_event._arrow.md
rename to docs/en/groovyscript/minecraft/events/projectile_impact_event._arrow.md
diff --git a/docs/groovyscript/minecraft/events/projectile_impact_event._fireball.md b/docs/en/groovyscript/minecraft/events/projectile_impact_event._fireball.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/projectile_impact_event._fireball.md
rename to docs/en/groovyscript/minecraft/events/projectile_impact_event._fireball.md
diff --git a/docs/groovyscript/minecraft/events/projectile_impact_event._throwable.md b/docs/en/groovyscript/minecraft/events/projectile_impact_event._throwable.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/projectile_impact_event._throwable.md
rename to docs/en/groovyscript/minecraft/events/projectile_impact_event._throwable.md
diff --git a/docs/groovyscript/minecraft/events/projectile_impact_event.md b/docs/en/groovyscript/minecraft/events/projectile_impact_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/projectile_impact_event.md
rename to docs/en/groovyscript/minecraft/events/projectile_impact_event.md
diff --git a/docs/groovyscript/minecraft/events/registry_event._missing_mappings.md b/docs/en/groovyscript/minecraft/events/registry_event._missing_mappings.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/registry_event._missing_mappings.md
rename to docs/en/groovyscript/minecraft/events/registry_event._missing_mappings.md
diff --git a/docs/groovyscript/minecraft/events/registry_event._new_registry.md b/docs/en/groovyscript/minecraft/events/registry_event._new_registry.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/registry_event._new_registry.md
rename to docs/en/groovyscript/minecraft/events/registry_event._new_registry.md
diff --git a/docs/groovyscript/minecraft/events/registry_event._register.md b/docs/en/groovyscript/minecraft/events/registry_event._register.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/registry_event._register.md
rename to docs/en/groovyscript/minecraft/events/registry_event._register.md
diff --git a/docs/groovyscript/minecraft/events/registry_event.md b/docs/en/groovyscript/minecraft/events/registry_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/registry_event.md
rename to docs/en/groovyscript/minecraft/events/registry_event.md
diff --git a/docs/groovyscript/minecraft/events/sapling_grow_tree_event.md b/docs/en/groovyscript/minecraft/events/sapling_grow_tree_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/sapling_grow_tree_event.md
rename to docs/en/groovyscript/minecraft/events/sapling_grow_tree_event.md
diff --git a/docs/groovyscript/minecraft/events/server_chat_event.md b/docs/en/groovyscript/minecraft/events/server_chat_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/server_chat_event.md
rename to docs/en/groovyscript/minecraft/events/server_chat_event.md
diff --git a/docs/groovyscript/minecraft/events/sleeping_location_check_event.md b/docs/en/groovyscript/minecraft/events/sleeping_location_check_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/sleeping_location_check_event.md
rename to docs/en/groovyscript/minecraft/events/sleeping_location_check_event.md
diff --git a/docs/groovyscript/minecraft/events/sleeping_time_check_event.md b/docs/en/groovyscript/minecraft/events/sleeping_time_check_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/sleeping_time_check_event.md
rename to docs/en/groovyscript/minecraft/events/sleeping_time_check_event.md
diff --git a/docs/groovyscript/minecraft/events/throwable_impact_event.md b/docs/en/groovyscript/minecraft/events/throwable_impact_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/throwable_impact_event.md
rename to docs/en/groovyscript/minecraft/events/throwable_impact_event.md
diff --git a/docs/groovyscript/minecraft/events/use_hoe_event.md b/docs/en/groovyscript/minecraft/events/use_hoe_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/use_hoe_event.md
rename to docs/en/groovyscript/minecraft/events/use_hoe_event.md
diff --git a/docs/groovyscript/minecraft/events/village_siege_event.md b/docs/en/groovyscript/minecraft/events/village_siege_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/village_siege_event.md
rename to docs/en/groovyscript/minecraft/events/village_siege_event.md
diff --git a/docs/groovyscript/minecraft/events/world_event._create_spawn_position.md b/docs/en/groovyscript/minecraft/events/world_event._create_spawn_position.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/world_event._create_spawn_position.md
rename to docs/en/groovyscript/minecraft/events/world_event._create_spawn_position.md
diff --git a/docs/groovyscript/minecraft/events/world_event._load.md b/docs/en/groovyscript/minecraft/events/world_event._load.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/world_event._load.md
rename to docs/en/groovyscript/minecraft/events/world_event._load.md
diff --git a/docs/groovyscript/minecraft/events/world_event._potential_spawns.md b/docs/en/groovyscript/minecraft/events/world_event._potential_spawns.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/world_event._potential_spawns.md
rename to docs/en/groovyscript/minecraft/events/world_event._potential_spawns.md
diff --git a/docs/groovyscript/minecraft/events/world_event._save.md b/docs/en/groovyscript/minecraft/events/world_event._save.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/world_event._save.md
rename to docs/en/groovyscript/minecraft/events/world_event._save.md
diff --git a/docs/groovyscript/minecraft/events/world_event._unload.md b/docs/en/groovyscript/minecraft/events/world_event._unload.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/world_event._unload.md
rename to docs/en/groovyscript/minecraft/events/world_event._unload.md
diff --git a/docs/groovyscript/minecraft/events/world_event.md b/docs/en/groovyscript/minecraft/events/world_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/world_event.md
rename to docs/en/groovyscript/minecraft/events/world_event.md
diff --git a/docs/groovyscript/minecraft/events/world_type_event._biome_size.md b/docs/en/groovyscript/minecraft/events/world_type_event._biome_size.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/world_type_event._biome_size.md
rename to docs/en/groovyscript/minecraft/events/world_type_event._biome_size.md
diff --git a/docs/groovyscript/minecraft/events/world_type_event._init_biome_gens.md b/docs/en/groovyscript/minecraft/events/world_type_event._init_biome_gens.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/world_type_event._init_biome_gens.md
rename to docs/en/groovyscript/minecraft/events/world_type_event._init_biome_gens.md
diff --git a/docs/groovyscript/minecraft/events/world_type_event.md b/docs/en/groovyscript/minecraft/events/world_type_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/world_type_event.md
rename to docs/en/groovyscript/minecraft/events/world_type_event.md
diff --git a/docs/groovyscript/minecraft/events/zombie_event._summon_aid_event.md b/docs/en/groovyscript/minecraft/events/zombie_event._summon_aid_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/zombie_event._summon_aid_event.md
rename to docs/en/groovyscript/minecraft/events/zombie_event._summon_aid_event.md
diff --git a/docs/groovyscript/minecraft/events/zombie_event.md b/docs/en/groovyscript/minecraft/events/zombie_event.md
similarity index 100%
rename from docs/groovyscript/minecraft/events/zombie_event.md
rename to docs/en/groovyscript/minecraft/events/zombie_event.md
diff --git a/docs/groovyscript/minecraft/furnace.md b/docs/en/groovyscript/minecraft/furnace.md
similarity index 100%
rename from docs/groovyscript/minecraft/furnace.md
rename to docs/en/groovyscript/minecraft/furnace.md
diff --git a/docs/groovyscript/minecraft/item.md b/docs/en/groovyscript/minecraft/item.md
similarity index 100%
rename from docs/groovyscript/minecraft/item.md
rename to docs/en/groovyscript/minecraft/item.md
diff --git a/docs/groovyscript/minecraft/ore_dictionary.md b/docs/en/groovyscript/minecraft/ore_dictionary.md
similarity index 100%
rename from docs/groovyscript/minecraft/ore_dictionary.md
rename to docs/en/groovyscript/minecraft/ore_dictionary.md
diff --git a/docs/groovyscript/minecraft/tooltip.md b/docs/en/groovyscript/minecraft/tooltip.md
similarity index 100%
rename from docs/groovyscript/minecraft/tooltip.md
rename to docs/en/groovyscript/minecraft/tooltip.md
diff --git a/docs/groovyscript/mods/bloodmagic/alchemy_array.md b/docs/en/groovyscript/mods/bloodmagic/alchemy_array.md
similarity index 100%
rename from docs/groovyscript/mods/bloodmagic/alchemy_array.md
rename to docs/en/groovyscript/mods/bloodmagic/alchemy_array.md
diff --git a/docs/groovyscript/mods/bloodmagic/alchemy_table.md b/docs/en/groovyscript/mods/bloodmagic/alchemy_table.md
similarity index 100%
rename from docs/groovyscript/mods/bloodmagic/alchemy_table.md
rename to docs/en/groovyscript/mods/bloodmagic/alchemy_table.md
diff --git a/docs/groovyscript/mods/bloodmagic/blood_altar.md b/docs/en/groovyscript/mods/bloodmagic/blood_altar.md
similarity index 100%
rename from docs/groovyscript/mods/bloodmagic/blood_altar.md
rename to docs/en/groovyscript/mods/bloodmagic/blood_altar.md
diff --git a/docs/groovyscript/mods/bloodmagic/meteor.md b/docs/en/groovyscript/mods/bloodmagic/meteor.md
similarity index 100%
rename from docs/groovyscript/mods/bloodmagic/meteor.md
rename to docs/en/groovyscript/mods/bloodmagic/meteor.md
diff --git a/docs/groovyscript/mods/bloodmagic/sacrificial.md b/docs/en/groovyscript/mods/bloodmagic/sacrificial.md
similarity index 100%
rename from docs/groovyscript/mods/bloodmagic/sacrificial.md
rename to docs/en/groovyscript/mods/bloodmagic/sacrificial.md
diff --git a/docs/groovyscript/mods/bloodmagic/tartaric_forge.md b/docs/en/groovyscript/mods/bloodmagic/tartaric_forge.md
similarity index 100%
rename from docs/groovyscript/mods/bloodmagic/tartaric_forge.md
rename to docs/en/groovyscript/mods/bloodmagic/tartaric_forge.md
diff --git a/docs/groovyscript/mods/bloodmagic/tranquility.md b/docs/en/groovyscript/mods/bloodmagic/tranquility.md
similarity index 100%
rename from docs/groovyscript/mods/bloodmagic/tranquility.md
rename to docs/en/groovyscript/mods/bloodmagic/tranquility.md
diff --git a/docs/groovyscript/mods/enderio/alloy_smelter.md b/docs/en/groovyscript/mods/enderio/alloy_smelter.md
similarity index 100%
rename from docs/groovyscript/mods/enderio/alloy_smelter.md
rename to docs/en/groovyscript/mods/enderio/alloy_smelter.md
diff --git a/docs/groovyscript/mods/enderio/combustion_gen.md b/docs/en/groovyscript/mods/enderio/combustion_gen.md
similarity index 100%
rename from docs/groovyscript/mods/enderio/combustion_gen.md
rename to docs/en/groovyscript/mods/enderio/combustion_gen.md
diff --git a/docs/groovyscript/mods/enderio/enchanter.md b/docs/en/groovyscript/mods/enderio/enchanter.md
similarity index 100%
rename from docs/groovyscript/mods/enderio/enchanter.md
rename to docs/en/groovyscript/mods/enderio/enchanter.md
diff --git a/docs/groovyscript/mods/enderio/sag_mill.md b/docs/en/groovyscript/mods/enderio/sag_mill.md
similarity index 100%
rename from docs/groovyscript/mods/enderio/sag_mill.md
rename to docs/en/groovyscript/mods/enderio/sag_mill.md
diff --git a/docs/groovyscript/mods/enderio/slice_n_splice.md b/docs/en/groovyscript/mods/enderio/slice_n_splice.md
similarity index 100%
rename from docs/groovyscript/mods/enderio/slice_n_splice.md
rename to docs/en/groovyscript/mods/enderio/slice_n_splice.md
diff --git a/docs/groovyscript/mods/enderio/soul_binder.md b/docs/en/groovyscript/mods/enderio/soul_binder.md
similarity index 100%
rename from docs/groovyscript/mods/enderio/soul_binder.md
rename to docs/en/groovyscript/mods/enderio/soul_binder.md
diff --git a/docs/groovyscript/mods/enderio/tank.md b/docs/en/groovyscript/mods/enderio/tank.md
similarity index 100%
rename from docs/groovyscript/mods/enderio/tank.md
rename to docs/en/groovyscript/mods/enderio/tank.md
diff --git a/docs/groovyscript/mods/enderio/vat.md b/docs/en/groovyscript/mods/enderio/vat.md
similarity index 100%
rename from docs/groovyscript/mods/enderio/vat.md
rename to docs/en/groovyscript/mods/enderio/vat.md
diff --git a/docs/groovyscript/mods/gtceu/heating_coils.md b/docs/en/groovyscript/mods/gtceu/heating_coils.md
similarity index 100%
rename from docs/groovyscript/mods/gtceu/heating_coils.md
rename to docs/en/groovyscript/mods/gtceu/heating_coils.md
diff --git a/docs/groovyscript/mods/gtceu/material.md b/docs/en/groovyscript/mods/gtceu/material.md
similarity index 100%
rename from docs/groovyscript/mods/gtceu/material.md
rename to docs/en/groovyscript/mods/gtceu/material.md
diff --git a/docs/groovyscript/mods/gtceu/multiblock.md b/docs/en/groovyscript/mods/gtceu/multiblock.md
similarity index 100%
rename from docs/groovyscript/mods/gtceu/multiblock.md
rename to docs/en/groovyscript/mods/gtceu/multiblock.md
diff --git a/docs/groovyscript/mods/gtceu/recipes.md b/docs/en/groovyscript/mods/gtceu/recipes.md
similarity index 100%
rename from docs/groovyscript/mods/gtceu/recipes.md
rename to docs/en/groovyscript/mods/gtceu/recipes.md
diff --git a/docs/groovyscript/mods/gtceu/terminal.md b/docs/en/groovyscript/mods/gtceu/terminal.md
similarity index 100%
rename from docs/groovyscript/mods/gtceu/terminal.md
rename to docs/en/groovyscript/mods/gtceu/terminal.md
diff --git a/docs/groovyscript/mods/jei.md b/docs/en/groovyscript/mods/jei.md
similarity index 100%
rename from docs/groovyscript/mods/jei.md
rename to docs/en/groovyscript/mods/jei.md
diff --git a/docs/groovyscript/mods/mekanism/crusher.md b/docs/en/groovyscript/mods/mekanism/crusher.md
similarity index 100%
rename from docs/groovyscript/mods/mekanism/crusher.md
rename to docs/en/groovyscript/mods/mekanism/crusher.md
diff --git a/docs/groovyscript/mods/thaumcraft/ArcaneWorkbench.md b/docs/en/groovyscript/mods/thaumcraft/ArcaneWorkbench.md
similarity index 100%
rename from docs/groovyscript/mods/thaumcraft/ArcaneWorkbench.md
rename to docs/en/groovyscript/mods/thaumcraft/ArcaneWorkbench.md
diff --git a/docs/groovyscript/mods/thaumcraft/Aspects.md b/docs/en/groovyscript/mods/thaumcraft/Aspects.md
similarity index 100%
rename from docs/groovyscript/mods/thaumcraft/Aspects.md
rename to docs/en/groovyscript/mods/thaumcraft/Aspects.md
diff --git a/docs/groovyscript/mods/thaumcraft/Crucible.md b/docs/en/groovyscript/mods/thaumcraft/Crucible.md
similarity index 100%
rename from docs/groovyscript/mods/thaumcraft/Crucible.md
rename to docs/en/groovyscript/mods/thaumcraft/Crucible.md
diff --git a/docs/groovyscript/mods/thaumcraft/DustTrigger.md b/docs/en/groovyscript/mods/thaumcraft/DustTrigger.md
similarity index 100%
rename from docs/groovyscript/mods/thaumcraft/DustTrigger.md
rename to docs/en/groovyscript/mods/thaumcraft/DustTrigger.md
diff --git a/docs/groovyscript/mods/thaumcraft/Infusion.md b/docs/en/groovyscript/mods/thaumcraft/Infusion.md
similarity index 100%
rename from docs/groovyscript/mods/thaumcraft/Infusion.md
rename to docs/en/groovyscript/mods/thaumcraft/Infusion.md
diff --git a/docs/groovyscript/mods/thaumcraft/Lootbag.md b/docs/en/groovyscript/mods/thaumcraft/Lootbag.md
similarity index 100%
rename from docs/groovyscript/mods/thaumcraft/Lootbag.md
rename to docs/en/groovyscript/mods/thaumcraft/Lootbag.md
diff --git a/docs/groovyscript/mods/thaumcraft/Research.md b/docs/en/groovyscript/mods/thaumcraft/Research.md
similarity index 100%
rename from docs/groovyscript/mods/thaumcraft/Research.md
rename to docs/en/groovyscript/mods/thaumcraft/Research.md
diff --git a/docs/groovyscript/mods/thaumcraft/SmeltingBonus.md b/docs/en/groovyscript/mods/thaumcraft/SmeltingBonus.md
similarity index 100%
rename from docs/groovyscript/mods/thaumcraft/SmeltingBonus.md
rename to docs/en/groovyscript/mods/thaumcraft/SmeltingBonus.md
diff --git a/docs/groovyscript/mods/thaumcraft/Warp.md b/docs/en/groovyscript/mods/thaumcraft/Warp.md
similarity index 100%
rename from docs/groovyscript/mods/thaumcraft/Warp.md
rename to docs/en/groovyscript/mods/thaumcraft/Warp.md
diff --git a/docs/groovyscript/mods/thermal/pulverizer.md b/docs/en/groovyscript/mods/thermal/pulverizer.md
similarity index 100%
rename from docs/groovyscript/mods/thermal/pulverizer.md
rename to docs/en/groovyscript/mods/thermal/pulverizer.md
diff --git a/docs/groovyscript/rl.md b/docs/en/groovyscript/rl.md
similarity index 100%
rename from docs/groovyscript/rl.md
rename to docs/en/groovyscript/rl.md
diff --git a/docs/index.md b/docs/en/index.md
similarity index 100%
rename from docs/index.md
rename to docs/en/index.md
diff --git a/docs/stylesheets/extra.css b/docs/en/stylesheets/extra.css
similarity index 100%
rename from docs/stylesheets/extra.css
rename to docs/en/stylesheets/extra.css
diff --git a/docs/zh-TW/index.md b/docs/zh-TW/index.md
new file mode 100644
index 0000000..62522ef
--- /dev/null
+++ b/docs/zh-TW/index.md
@@ -0,0 +1,32 @@
+# Welcome to GroovyScript
+
+A comprehensive scripting sandbox for Minecraft 1.12.2.
+[加入 Discord 群組(英語)](https://discord.com/invite/m53yxTjjKM).
+
+Are you not seeing what other see on this wiki? Try reloading it.
+
+#### Features:
+
+1. Groovy: a powerful and tested scripting language
+ - Java-compatible syntax + interoperable code
+ - Static compilation
+ - Optional dynamic typing
+ - Metaprogramming
+2. Sandboxed: scripts are effectively ran in a sandbox, with sensitive operations blacklisted from being called or referenced
+3. Reloading: able to test script changes within the game without restarting
+ - Most if not all Forge Registry objects can be reloaded on the fly
+ - Most mod registries are supported natively
+4. Events: Easily listen to Forge's EventBuses with Groovy Closures
+5. Familiarity: Bracket handlers for those that are familiar with CraftTweaker (currently implemented, may be removed in the near future)
+6. Informational: commands to display rich information for the item in your hand and more
+7. Optimized: Making sure no compromises are being made while delivering features with efficient code
+8. API: Great catalogue of code for other mod authors to make their mods compatible with GroovyScript such as package/class/method/field blacklists
+
+### Where to go?
+Check [this](getting_started.md) out to get started.
+Check out the Groovy tab for infos about the Groovy language.
+Check out the GroovyScript for the GroovyScript documentation.
+
+!!! Note
+ This wiki is highly WIP. There is still a lot of info missing. We would appreciate any help to improve this place.
+ Get started by joining our [Discord](https://discord.com/invite/m53yxTjjKM)
\ No newline at end of file
diff --git a/docs/zh/assets/images/slice_n_splice_recipe.png b/docs/zh/assets/images/slice_n_splice_recipe.png
new file mode 100644
index 0000000..6ebf4d7
Binary files /dev/null and b/docs/zh/assets/images/slice_n_splice_recipe.png differ
diff --git a/docs/zh/getting_started.md b/docs/zh/getting_started.md
new file mode 100644
index 0000000..b38606d
--- /dev/null
+++ b/docs/zh/getting_started.md
@@ -0,0 +1,107 @@
+# 让我们开始
+
+哦不不, 读懂这不一定需要太多的编程知识, 但会对你有很大的帮助.
+作为文本文件(.groovy), 你可以使用[VSCode](https://code.visualstudio.com/)来打开并且编写Groovy文件, 或者是一个更像样的IDE. (我们将在未来开发一个更好的替代品)
+
+1. 下载 Minecraft和Forge 1.12.2并且安装它. (我想你的启动器应该可以)
+2. 下载最新版的GroovyScript([点这里](https://www.curseforge.com/minecraft/mc-mods/groovyscript/files))
+ 并且丢到你的mods文件夹里去. (HMCL等主流启动器支持直接从CurseForge下载模组)
+3. 另外, 你还需要安装一个[MixinBooter](https://www.curseforge.com/minecraft/mc-mods/mixin-booter/files), 因为GroovyScript依赖于它.
+4. 启动游戏, 并且往groovy文件夹里丢一些脚本.
+5. 第一次启动时, GroovyScript将生成以下文件
+ - groovy.log (即[Groovy Log](#groovy-log))
+ - groovy/runConfig.json (即[Groovy运行配置](#run-config))
+ - groovy/postInit/main.groovy (默认提供的脚本实例文件)
+
+## Groovy log
+
+所有与groovy有关的东西都有自己的日志, 而且会生成自己的文件.
+如果你的脚本写出了问题, 你应该先看看Log. 文件位于[Minecraft实例路径]/groovy.log
+
+## 运行配置
+这个文件定义了每个脚本文件应该如何执行, 在哪个加载阶段执行.
+它也可以存储一些关于MOD包的一般信息.
+如果该文件无法被查找到或不存在, 将重新生成一份.
+如果你不明白这是什么或 "它是如何工作的" , 你可以跳过配置.
+你所需要知道的是, 你把你的配方脚本放在groovy/postInit中.
+诸如 "自定义物品" 之类的脚本则放在groovy/preInit中.
+(类似KubeJS的start_scripts-preInit和server_scripts-postInit)
+让我们看看这个文件是什么样子的.
+
+````json
+{
+ "packName": "",
+ "packId": "",
+ "version": "1.0.0",
+ "debug": false,
+ "classes": [
+ "classes/"
+ ],
+ "loaders": {
+ "preInit": [
+ "preInit/"
+ ],
+ "postInit": [
+ "postInit2/"
+ ]
+ }
+}
+````
+
+Let's go through it bit by bit:
+
+- `packName` is the name of the pack (See [pack name and id](#pack-name-and-id)). Important
+ for [content](groovyscript/content/content.md).
+- `packId` (0.4.0+) is the id of the pack (See [pack name and id](#pack-name-and-id)). Important
+ for [content](groovyscript/content/content.md).
+- `version` is the version of the pack. It currently doesn't do anything special.
+- `debug`: If this is false all messages that logged to debug will not be logged. Great for debugging.
+- `classes`: (0.3.0+) Files that contain a single class should be specified here. It makes sure classes are loaded when
+ scripts try to access them.
+- `loaders`: This defines at what stage what files should be loaded. By default, there are two stages: `preInit`
+ and `postInit`.
+- `preInit` will run at an early stage. Do not register recipes here. Use it to register game objects like items and
+ blocks.
+- `postInit` will run right before JEI loads. Use it to register recipes for example. When GroovyScript gets reloaded
+ only this loader will run.
+ Inside the square brackets of the loader we define the files or path that will be run. You can NOT run a file in
+ multiple loaders.
+ Elements higher in the list will be run first. Files can be put multiple times, but they will only get executed
+ once.
+ For example:
+
+````json
+[
+ "postInit/ore_dict.groovy",
+ "postInit/"
+]
+````
+
+Here first `ore_dict.groovy` will be executed and then all files of `postInit/`, but since `ore_dict.groovy` was already
+executed, it will not run now.
+Another example:
+
+````json
+[
+ "postInit/",
+ "postInit/late_stuff.groovy"
+]
+````
+
+First everything in `postInit/` will be executed, but since `late_stuff.groovy` is specifically put later it will not be
+executed. After that only `late_stuff.groovy` will be executed.
+
+### Pack name and id
+
+The pack name can be anything. It's the name that will show up in JEI in tooltips on items you created.
+The pack id is very important. It must only consist of lower case letters and `_`.
+
+!!! warning
+ Changing the pack id will result in created items being lost in existing worlds!
+
+## Important infos
+
+1. Groovy scripts must end in `.groovy`
+2. Groovy scripts must be defined somehow in the [run config](#run-config) to be executed
+3. The scripts and folders can have any name
+4. All scripts and the [run config](#run-config) must be located in `[Minecraft instance path]/groovy/`
diff --git a/docs/zh/groovy/builder.md b/docs/zh/groovy/builder.md
new file mode 100644
index 0000000..ea71aa8
--- /dev/null
+++ b/docs/zh/groovy/builder.md
@@ -0,0 +1,62 @@
+# Builder
+
+A builder is a class that contains methods to build an object. Those methods can be chained together and often end in a `.build()` call.
+Each method, except the `build()` method, should return the same builder instance.
+The Recipe Builders in GroovyScript and with a `.register()` call, because the recipe is registered rather than just build and `.buildAndRegister()` is too long.
+
+## Builder class example
+Let's see what a simple Builder class can look like:
+
+```groovy
+class RecipeBuilder {
+ private final List inputs = new ArrayList()
+ private final List outputs = new ArrayList() // (1)
+
+ RecipeBuilder input(IIngredient ingredient) {
+ this.inputs.add(ingredient)
+ return this // the method returns this builder (2)
+ }
+
+ RecipeBuilder output(ItemStack itemStack) {
+ this.outputs.add(itemStack)
+ return this // the method returns this builder (3)
+ }
+
+ Recipe build() { // the build method usually returns the object that will be build
+ return new Recipe(inputs, outputs)
+ }
+}
+```
+
+1. We need to store our inputs and outputs somewhere
+2. Usually the return keyword is not needed in groovy, but in this case it helps to understand the concept.
+3. Usually the return keyword is not needed in groovy, but in this case it helps to understand the concept.
+
+## Usage example
+Now let's create a new recipe using the builder
+````groovy
+def recipe = new RecipeBuilder() // first create a recipe builder instance
+ .input('') // add a input
+ .input('' * 3) // add another input
+ .output('') // add a output
+ .build() // build and return a recipe instance
+````
+
+Notice how each method call is chained together. This is because `input()` and `output()` return the same builder instance.
+Since the `build()` method returns a `Recipe` instance, the `recipe` variable will also be of type `Recipe`.
+The same code as above can also be put in a single line:
+````groovy
+def recipe = new RecipeBuilder().input('').input('' * 3).output('').build()
+````
+This does exactly the same thing, but as you can see it is uglier and harder to read. The line breaks are purely aesthetically, but are highly recommended.
+
+Now lets see what the recipe could look like without a builder:
+````groovy
+def recipe = new Recipe(['', '' * 3], [''])
+````
+That doesn't look too bad right? Now imagine the recipe requires 5 inputs. Or 10. Or 20. And you need to specify energy requirement, duration and maybe fluids.
+This is where Builders shine.
+
+## Conclusion
+Builders help to produce clean code while creating complex objects.
+Understanding the concept will help you in GroovyScript, since they are used commonly for recipes.
\ No newline at end of file
diff --git a/docs/zh/groovy/closure.md b/docs/zh/groovy/closure.md
new file mode 100644
index 0000000..87f6a68
--- /dev/null
+++ b/docs/zh/groovy/closure.md
@@ -0,0 +1,52 @@
+# Closures
+
+Closures are like lambdas in java, but slightly different.
+
+# For beginners
+
+You may know what a method is. A method is a set order of instructions you can call. For example:
+
+````groovy
+def print_numbers(int n) {
+ for (def i : 0..n) {
+ log.info(i)
+ }
+}
+````
+
+This method prints numbers from 0 to a given number to the log.
+
+````groovy
+print_numbers(5)
+````
+
+This will now output
+
+````
+0
+1
+2
+3
+4
+````
+
+You can call that method as often as you want with any number input.
+
+Now closures are methods, but you can carry them around. Example:
+
+````groovy
+def print_numbers = { int n -> /*(1)*/
+ for (def i : 0..n) {
+ log.info(i)
+ }
+}
+````
+
+1. Most of the time the type is optional, so here it would become `{ n -> ...`
+
+This closure does the same thing as the method above, but it's a variable instead of a method. Just like any other
+variable you can pass it to other methods. (See [Events](../groovyscript/minecraft/events/aa_events.md)).
+You can invoke this closure the same way you do with a method:
+````groovy
+print_numbers(3)
+````
\ No newline at end of file
diff --git a/docs/zh/groovy/introduction.md b/docs/zh/groovy/introduction.md
new file mode 100644
index 0000000..a833d9a
--- /dev/null
+++ b/docs/zh/groovy/introduction.md
@@ -0,0 +1,113 @@
+# Groovy
+Groovy is a powerful scripting language based on java.
+
+In this tab you can find some information about the scripting language itself.
+For GroovyScript specific stuff refer to the GroovyScript tab.
+
+The syntax is very similar to java, but with some conveniences from other scripting languages.
+The most noticeable is that you don't need `;` at the end of a line.
+
+## Comments
+Comments can be made inside scripts that will be ignored by the compiler like this:
+````groovy
+// single line comment
+
+/*
+Multi line comment
+ */
+````
+
+## Variables
+Variables can hold data with a specific type. They can be created with the keyword `def` or by using the desired type directly.
+After that comes the name. It usually starts with a lower case letter.
+At the end is the value. If you used `def` then the value will define the type.
+```groovy
+def num = 10 // dynamically typed
+int num2 = 100 // strongly typed
+```
+
+## Datatypes
+There are differnt kinds of datatypes: primitive and complex.
+
+### Primitive types
+Primitive types can never be null. They always have a value. A whole number is by default a `int`
+Decimals like `1.5` have by default the type `BigDecimal`. Which is most likely not what you want.
+I highly recommend to use the `d` or `f` suffix for `double` or `float`.
+`int`: any whole number from -2^31 to 2^31 - 1
+`long`: any whole number from -2^63 to 2^63 - 1
+`byte`: any whole number from -2^7 to 2^7 - 1 (-256 - 255)
+`short`: any whole number from -2^15 to 2^15 - 1 (-32768 - 32767)
+`float` a decimal number stored in 32 bits
+`double` a decimal number stored in 64 bits
+`boolean` true or false (nothing else)
+
+````groovy
+def num1 = 10 // int
+def num2 = 10l // long
+def num3 = 10 as byte // byte
+def num4 = 10 as short // byte
+def num5 = 1.0f // float
+def num6 = 1.0d // double
+def bool = true // boolean
+````
+
+### Complex types
+Complex types are all types that are not primitive. Every object falls under this category.
+Primitive types also have boxed complex types.
+As said before `def num = 1.5` will create a `BigDecimal` which is complex.
+`def num = 10G` will create a `BigInteger` which has almost no value limit, but it can take a lot of memory, so try to not use to often.
+
+## Functions
+A function is a set of instructions that can be called with a single line.
+
+### Defining Functions
+```groovy
+// function which takes a single parameter and returns nothing
+def f(x) {
+ println(x)
+}
+
+// function which takes two parameters and returns their sum
+def sum(x, y) {
+ return x + y
+}
+
+// specifying types is optional
+// if used, it will error if passed invalid types
+def sum2(int x, int y) {
+ return x + y
+}
+```
+
+### Calling functions
+We'll take the functions from above.
+````groovy
+f(10) // calls the function with the parameter 10
+f(sum(4, 16)) // calls f with the result of sum
+````
+
+## Imports
+If you want to use any classes short name you need to import the full class name.
+Most of javas classes are imported by default.
+```groovy
+import my.package.MyClass // import a single class
+import my.other.package.* // import all classes from a package
+
+import static my.package.MyClass.FIELD // static field import
+import static my.package.MyClass.function // static function import
+import static my.other.package.MyOtherClass.* // import all static functions from the class
+
+import my.package.MyClass as MC // import aliasing
+import static my.package.MyClass.function as f // static import aliasing
+```
+
+## Further Reading
+
+If there's something more advanced you'd like to learn, take a look at the [Official Groovy Documentation](https://groovy-lang.org/documentation.html).
+
+Some useful Groovy Documentation pages:
+
+* [Syntax](https://groovy-lang.org/syntax.html)
+* [Operators](https://groovy-lang.org/operators.html)
+* [Closures](https://groovy-lang.org/closures.html)
+* [Semantics](https://groovy-lang.org/semantics.html)
diff --git a/docs/zh/groovy/lists.md b/docs/zh/groovy/lists.md
new file mode 100644
index 0000000..a250699
--- /dev/null
+++ b/docs/zh/groovy/lists.md
@@ -0,0 +1,52 @@
+# Lists
+Lists are data types that can hold multiple values of a certain type.
+
+Lists are dynamically sized. So that means if we create a list of 0 length, we can still add elements to it.
+There are multiple ways to create lists. The elements of a list are ordered, so the order wont change randomly.
+````groovy
+// most simple list, size = 0
+// the type is always ArrayList
+def simpleList = []
+def list = new ArrayList() // this is the same as above
+
+def anotherList = ['He', 'llo', ' w', 'or', 'ld!'] // we can put values into the list, all of the same type
+````
+
+## Getting values
+Elements of a list can bee accessed via `get` or the `[]` operator.
+Lists index start at 0.
+````groovy
+def list = [9, 8, 7, 6, 5, 4, 3, 2, 1]
+println(list[0]) // 9
+println(list.get(0)) // 9
+println(list[3]) // prints the 4th element: 6
+println(list[-1]) // prints the last element: 1
+println(list[-2]) // prints the 2nd last element: 2
+````
+
+You can also get a range of elements by using the `..` operator.
+````groovy
+def list = [9, 8, 7, 6, 5, 4, 3, 2, 1]
+def subList = list[2..5] // [7, 6, 5, 4]
+// reversing the indexes results in a reversed list
+def subLis2 = list[5..2] // [4, 5, 6, 7]
+// -1 is greater because it refers to the last elements, so its not reversed
+def subList3 = list[2..-1] // [7, 6, 5, 4, 3, 2, 1]
+````
+
+## Modifying lists
+Lists can modified by using `set()`, `add()` and `remove()`.
+We can also use the `[]` operators
+````groovy
+def list = []
+list.add(1) // adds 1 to the lest
+// list is now [1]
+list.add(3)
+list.add(9)
+// [1, 3, 9]
+list.set(1, 5) // sets the element at index 1 to 5
+list[1] = 5 // same thing as above
+// [1, 5, 9]
+list.remove(0) // removes the first element
+// [5, 9]
+````
\ No newline at end of file
diff --git a/docs/zh/groovy/loops.md b/docs/zh/groovy/loops.md
new file mode 100644
index 0000000..581473c
--- /dev/null
+++ b/docs/zh/groovy/loops.md
@@ -0,0 +1,74 @@
+# Loops
+Loops are useful if you want to do the operation multiple times or if you want to do a operation for each element in a list.
+
+## While loop
+A simple while loop looks like this:
+````groovy
+while (condition) {
+ operation
+}
+````
+The condition is a boolean. As long as that condition evaluates to true, the operation will be executed.
+### Example:
+This will print `0, 1, 2, 3, 4, 5, 6, 7, 8, 9`.
+````groovy
+int i = 0;
+while (i < 10) {
+ print("${i++}, ")
+}
+````
+
+There is also a `do while` loop which ignores the condition on its first run.
+````groovy
+do {
+ operation
+} while (condition)
+````
+
+## For loop
+For loops are similar to while loops.
+````groovy
+for(init; condition; incrementor) {
+ operation
+}
+````
+`init` is called before the loop. `condition` is checked before each run and `incrementor` is called after each run.
+
+### Example
+This will print `0, 1, 2, 3, 4, 5, 6, 7, 8, 9`.
+````groovy
+for(int i = 0; i < 10; i++) {
+ print("${i++}, ")
+}
+````
+
+## Enhanced for loop
+Those are very useful for lists and maps.
+This will print `Hello world!`
+````groovy
+def list = ['He', 'llo', ' w', 'or', 'ld!']
+for(part in list) {
+ print(part)
+}
+````
+`part` creates a new variable on each run for the current element in the list `lists`.
+
+For maps it looks like this
+````groovy
+def elements = [
+ 'Au': 'Gold',
+ 'Ag': 'Silver',
+ 'Pb': 'Lead',
+ 'H' : 'Hydrogen'
+]
+// prints al elements
+for (entry in elements) {
+ println("${entry.key}: ${entry.value}")
+}
+````
+
+## Control flow in loops
+`break` can be used at any time inside a loop to abort the current and all following runs.
+`continue` will only abort the current run and *continues* with the next run (if the condition is still true)
+
+
diff --git a/docs/zh/groovy/maps.md b/docs/zh/groovy/maps.md
new file mode 100644
index 0000000..9190488
--- /dev/null
+++ b/docs/zh/groovy/maps.md
@@ -0,0 +1,39 @@
+# Maps
+Maps are similar to lists, but they assign each value to a key.
+Meaning instead of accessing the value by the index, you can get it by using the key.
+Each key can only have one value, but multiple values can have the same key.
+
+There different types of maps. Javas default map is `HashMap`.
+It doesn't keep the elements order causing the elements to be seemingly random.
+
+Groovy uses `Object2ObjectLinkedOpenHashMap` by default. It is slightly more memory efficient and keeps the element order.
+
+The key and value can be of different types. If the key is a string you can leave out the `'` or `"`.
+
+````groovy
+def simpleMap = [:] // a empty ordered hash map
+def hashMap = new HashMap() // a empty unordered hash map
+
+// this maps the short form of some periodic elements to their real name
+def elements = [
+ Au: 'Gold',
+ Ag: 'Silver',
+ Pb: 'Lead',
+ H: 'Hydrogen'
+]
+````
+
+## Getting values
+We are using the map we created above here.
+````groovy
+println(elements['Pb']) // Lead
+println(elements['Ag']) // Silver
+println(elements['B']) // null since there is no key 'B'
+````
+
+## Modifying maps
+We are using the map we created above here.
+````groovy
+elements['Au'] = 'Copper' // Au is know mapped to copper
+elements.remove('H') // removes H: Hydrogen
+````
diff --git a/docs/zh/groovy/strings.md b/docs/zh/groovy/strings.md
new file mode 100644
index 0000000..b0e8eed
--- /dev/null
+++ b/docs/zh/groovy/strings.md
@@ -0,0 +1,15 @@
+# Strings
+Strings are a sequence of characters.
+There are multiple ways to define a string and each does something different.
+The most simple way is by using `''`. In java these are used for chars. Here they create strings and don't do anything special.
+A more advanced way is by using `""`. They allow you to use variables inside the literal.
+The last way is by using `\\`. This is perfect for regex, because you don't need to escape any `\`.
+````groovy
+def s = 'hello' // String
+def s2 = "hello" // can use either '' or ""
+assert s == s2 // both strings are equal
+
+def num = 7
+def numberOfDays = 'There are ' + num + ' days in a week' // using a variable inside the string with concatenation
+def numberOfDays2 = "There are $num days in a week" // using a variable inside the string with $
+````
\ No newline at end of file
diff --git a/docs/zh/groovyscript/content/block.md b/docs/zh/groovyscript/content/block.md
new file mode 100644
index 0000000..5fa7817
--- /dev/null
+++ b/docs/zh/groovyscript/content/block.md
@@ -0,0 +1,49 @@
+# Creating blocks
+
+## The simplest way
+
+````groovy
+content.createBlock(String name).register()
+````
+
+Simple right?
+Let's break it up:
+
+- `content` is a global variable.
+- `createBlock(String name)` creates a block and an item version and returns it. The name is the registry name and must only consist of lower
+ case letters and `_`.
+- `register()` registers the block and the item. Without this the block will not appear in game.
+
+## Registering a block
+The example above creates a simple block for you, but you can also create blocks yourself (to create custom behaviour).
+Use the following methods to register custom blocks.
+````groovy
+content.registerBlock(String name, Block block)
+content.registerBlock(String name, Block block, ItemBlock block)
+````
+
+## Texture
+
+Minecraft's blocks need a texture (or multiple), a model file which describes how the textures are rendered and a block state file which points each block state to a model file. If groovy
+can't find a model file or a block state file it will generate default files
+at `.minecraft/groovy/assets/[pack id]/models/block/[block name].json` and `.minecraft/groovy/assets/[pack id]/blockstates/[item name].json`.
+It will point to a texture you will need to place
+at `.minecraft/groovy/assets/[pack id]/textures/blocks/[block name].png`.
+
+## Translating the items name
+
+By default, the items name will show up as `tile.[pack id].[block name].name`. To change that you need add an entry to
+the lang file. GroovyScript generates a default lang file at `.minecraft/groovy/assets/[pack id]/lang/en_us.lang`.
+
+### Example
+First create a block
+````groovy
+content.createBlock('dust_block')
+````
+Let's assume that the pack id is `nomifactory` so that the item and block id will be `nomifactory:dust_block`.
+Insert this line into the lang file.
+````mclang
+tile.nomifactory.dust_block.name=Heart of the universe
+````
+(`tile.nomifactory.dust_block.name` is the default generated translation key. You can change to anything you want.)
+Finally, put a texture at `.minecraft/groovy/assets/nomifactory/textures/items/dust_block.png`
diff --git a/docs/zh/groovyscript/content/content.md b/docs/zh/groovyscript/content/content.md
new file mode 100644
index 0000000..ee03a11
--- /dev/null
+++ b/docs/zh/groovyscript/content/content.md
@@ -0,0 +1,34 @@
+# Content
+
+This part of GroovyScript allows the creation of game content like items and blocks. It's equivalent to ContentTweaker
+for CraftTweaker, but for GroovyScript it doesn't require another mod.
+
+!!! Note
+ Requires version 0.4.0+.
+ Before you start adding content make sure to specify the pack name and id in
+ your [runConfig](../../getting_started.md#run-config).
+ Also make sure to read [pack name and id](../../getting_started.md#pack-name-and-id)
+
+Currently, GroovyScript adds helpers to create
+
+- [items](item.md)
+- blocks
+- creative tabs
+
+Coming in the future:
+
+- fluids
+- Mekanism gases
+
+## Creative tabs
+You can set a default creative tab which registered items and blocks will use if not specified otherwise
+````groovy
+content.setDefaultCreativeTab(CreativeTabs tab)
+````
+
+### Example
+With [that](creative_tab.md) we can do this
+````groovy
+def creativeTab = content.createCreativeTab("nomifactory.creative_tab", item("nomifactory:heart_of_the_universe"))
+content.setDefaultCreativeTab(creativeTab)
+````
\ No newline at end of file
diff --git a/docs/zh/groovyscript/content/creative_tab.md b/docs/zh/groovyscript/content/creative_tab.md
new file mode 100644
index 0000000..30a6260
--- /dev/null
+++ b/docs/zh/groovyscript/content/creative_tab.md
@@ -0,0 +1,17 @@
+# Creating creative tabs
+
+````groovy
+content.createCreativeTab(String name, ItemStack icon) // returns the creative tab
+````
+
+## Example
+````groovy
+def creativeTab = content.createCreativeTab("nomifactory.creative_tab", item("nomifactory:heart_of_the_universe"))
+````
+
+## Other
+You can get a creative tab by using
+````groovy
+creativeTab(String tabName)
+````
+A list of existing creative tab names can be obtained by running the `/gs creativeTabs` command.
\ No newline at end of file
diff --git a/docs/zh/groovyscript/content/item.md b/docs/zh/groovyscript/content/item.md
new file mode 100644
index 0000000..aaf65aa
--- /dev/null
+++ b/docs/zh/groovyscript/content/item.md
@@ -0,0 +1,48 @@
+# Creating items
+
+## The simplest way
+
+````groovy
+content.createItem(String name).register()
+````
+
+Simple right?
+Let's break it up:
+
+- `content` is a global variable.
+- `createItem(String name)` creates an item and returns it. The name is the registry name and must only consist of lower
+ case letters and `_`.
+- `register()` registers the item. Without this the item will not appear in game.
+
+## Registering an item
+The example above creates a simple item for you, but you can also create items yourself (to create custom behaviour).
+Use the following methods to register custom items.
+````groovy
+content.registerItem(String name, Item item)
+````
+
+## Texture
+
+Minecraft's items need a texture (or multiple) and a model file which describes how the textures are rendered. If groovy
+can't find a model file it will generate a default file
+at `.minecraft/groovy/assets/[pack id]/models/item/[item name].json`.
+It will point to a texture you will need to place
+at `.minecraft/groovy/assets/[pack id]/textures/items/[item name].png`.
+
+## Translating the items name
+
+By default, the items name will show up as `item.[pack id].[item name].name`. To change that you need add an entry to
+the lang file. GroovyScript generates a default lang file at `.minecraft/groovy/assets/[pack id]/lang/en_us.lang`.
+
+### Example
+First create an item
+````groovy
+content.createItem('heart_of_the_universe')
+````
+Let's assume that the pack id is `nomifactory` so that the item id will be `nomifactory:heart_of_the_universe`.
+Insert this line into the lang file.
+````mclang
+item.nomifactory.heart_of_the_universe.name=Heart of the universe
+````
+(`item.nomifactory.heart_of_the_universe.name` is the default generated translation key. You can change to anything you want.)
+Finally, put a texture at `.minecraft/groovy/assets/nomifactory/textures/items/heart_of_the_universe.png`
diff --git a/docs/zh/groovyscript/minecraft/crafting.md b/docs/zh/groovyscript/minecraft/crafting.md
new file mode 100644
index 0000000..0fa3d16
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/crafting.md
@@ -0,0 +1,70 @@
+# Crafting Table
+
+## Adding Shaped Recipes
+
+```groovy
+// Regular Addition
+crafting.addShaped(ItemStack output, List> input) // (1)
+crafting.addShaped(String name, ItemStack output, List> input) // (2)
+
+// Replacement Addition
+crafting.replaceShaped(ItemStack output, List> input) // (3)
+crafting.replaceShaped(String name, ItemStack output, List> input) // (2)
+```
+
+1. If not provided, a recipe name will be autogenerated for you.
+2. The `List>` in the signature may seem complicated at first. See the Shaped Recipe Examples for a better representation.
+3. The `replace` methods will remove all recipes outputting the output, and adds the new recipe - replacing the old one(s).
+
+### Example
+```groovy
+crafting.addShaped('balanced_clay', item('minecraft:clay_ball') * 3, [
+ [item('minecraft:nether_star'), null, item('minecraft:nether_star')],
+ [null, ore('ingotIron'), null], // (1)
+ [item('minecraft:nether_star'), null, item('minecraft:nether_star')]
+])
+
+crafting.addShaped('balanced_clay_2x2', item('minecraft:clay_ball') * 2, [
+ [item('minecraft:nether_star'), null],
+ [null, ore('ingotIron')], // (2)
+])
+```
+
+1. Use `null` to specify an empty slot.
+2. You can shrink the sizes of the lists for smaller recipes - this one is 2x2. Just make sure it's not jagged (different lengths for each row/col).
+
+## Adding Shapeless Recipes
+Unlike other recipe types, Shapeless Crafting also does not use a recipe builder.
+
+```groovy
+// Regular Addition
+crafting.addShapeless(ItemStack output, List input) // (1)
+crafting.addShapeless(String name, ItemStack output, List input)
+
+// Replacement Addition
+crafting.replaceShapeless(ItemStack output, List input) // (2)
+crafting.replaceShapeless(String name, ItemStack output, List input)
+```
+
+1. If not provided, a recipe name will be autogenerated for you.
+2. The `replace` methods will remove all recipes outputting the output, and adds the new recipe - replacing the old one(s).
+
+### Example
+```groovy
+crafting.addShapeless('unbalanced_clay', item('minecraft:clay_ball') * 32, [item('minecraft:dirt'), item('minecraft:dirt'), item('minecraft:leather')])
+```
+
+## Removing Recipes
+{--
+You can also use JEI/HEI in Creative Mode to remove recipes with ease.
+Find the recipe you want to remove, and click the `[X]` button to copy code to remove the recipe to your clipboard.
+Then just paste the code into your desired script and you're good to go!
+--}
+(Planned feature)
+
+You can view recipe names in JEI/HEI by hovering over the output with `F3+h` mode enabled.
+
+```groovy
+crafting.remove(String name) // removes the recipe with the same name
+crafting.removeByOutput(IIngredient output) // removes all recipes with the output
+```
diff --git a/docs/zh/groovyscript/minecraft/crafting_builders.md b/docs/zh/groovyscript/minecraft/crafting_builders.md
new file mode 100644
index 0000000..673482b
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/crafting_builders.md
@@ -0,0 +1,134 @@
+# Crafting Recipes with RecipeBuilders
+
+## Adding Recipes with Builders
+
+Crafting also has a RecipeBuilder.
+If you don't know what a builder is, check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out!
+
+You start the builder chain with either `shapedBuilder()` or `shapelessBuilder()`. This determines the kind of recipe you want to add.
+```groovy
+crafting.shapedBuilder()
+crafting.shapelessBuilder()
+```
+
+Then you call additional methods onto the builder (.name(), .replace(), etc), to build up the end result. See the examples below for a complete picture.
+
+
+Set the recipe name (optional):
+```groovy
+name(String name) // (1)
+```
+
+1. If not provided, a recipe name will be autogenerated for you.
+
+Set the recipe output (required):
+```groovy
+output(ItemStack item)
+```
+
+Set the recipe function (optional):
+```groovy
+recipeFunction(Closure recipeFunction) // (1)
+```
+
+1. See the [Recipe Function and Action page](./crafting.md) for more details.
+
+Set the recipe action (optional):
+```groovy
+recipeFunction(Closure recipeAction) // (1)
+```
+
+1. See the [Recipe Function and Action page](TODO) for more details.
+
+Set the recipe to replace others (optional):
+```groovy
+replace() // (1)
+```
+
+1. See the [Crafting page](https://groovyscript-docs.readthedocs.io/en/latest/groovyscript/minecraft/crafting/) for details about these.
+
+Set the recipe to replace others by name (optional):
+```groovy
+replaceByName() // (1)
+```
+
+1. See the [Crafting page](https://groovyscript-docs.readthedocs.io/en/latest/groovyscript/minecraft/crafting/) for details about these.
+It functions the same as the one above, except that it matches the provided recipe name.
+
+Set the recipe to allow the grid to be mirrored (optional, shaped only):
+```groovy
+mirrored()
+mirrored(boolean mirrored) // (1)
+```
+
+1. Choose whether the recipe is mirrored or not, default false
+
+Creating the recipe's layout (required, shaped only):
+```groovy
+matrix(String... matrix)
+shape(String... matrix) // does the same thing as matrix()
+
+// to input a matrix in the style of non-builder shaped addition
+matrix(List> matrix)
+shape(List> matrix)
+```
+
+Matching ingredients to the recipe layout (required, shaped only):
+```groovy
+key(String c, IIngredient ingredient) // (1)
+```
+
+1. Please see the examples below to better understand how this works
+
+Adding inputs to the recipe (required, shapeless only):
+```groovy
+input(IIngredient ingredient)
+input(IIngredient... ingredients)
+input(Collection ingredients)
+```
+
+Registering the recipe (required):
+```groovy
+register()
+```
+
+### Examples
+Reading the above makes this seem quite complicated. We promise it's not!
+
+```groovy
+// Shaped Recipes
+crafting.shapedBuilder() // create a new shaped recipe
+ .name('balanced_clay') // name the recipe 'balanced_clay'
+ .output(item('minecraft:clay') * 32) // output 32 clay
+ .matrix('NIN', // create the layout for the recipe
+ 'DSD', // each character represents a slot
+ 'NIN')
+ .key('N', item('minecraft:nether_star')) // everywhere there is an 'N' in the layout, use a nether star
+ .key('I', ore('ingotIron')) // all 'I' characters are iron ingots
+ .key('D', item('minecraft:diamond')) // all 'D' characters are diamonds
+ .key('S', ore('stone')) // all 'I' characters are stone
+ .register() // register the recipe
+
+
+crafting.shapedBuilder()
+ .name('balanced_clay_v2')
+ .output(item('minecraft:clay') * 64)
+ .matrix(' B ', // use a space for an empty slot
+ 'X X') // (1)
+ .key('B', item('minecraft:glass_bottle'))
+ .key('X', item('minecraft:gold_nugget'))
+ .register()
+```
+
+1. You can omit rows and columns for smaller recipes - this one's 3x2. Just make sure it's not jagged (different lengths for each row/col).
+
+```groovy
+// Shapeless Recipes
+crafting.shapelessBuilder() // add a new shapeless recipe
+ .name('balanced_clay_v3') // name the recipe 'balanced_clay_v3'
+ .output('minecraft:clay' * 2) // output 2 clay
+ .input('minecraft:iron_ingot') // add an iron ingot to the inputs
+ .input('minecraft:iron_ingot') // add a second iron ingot to the inputs
+ .input('minecraft:gold_nugget', 'minecraft:diamond') // add a gold nugget and a diamond to the inputs
+ .register()
+```
diff --git a/docs/zh/groovyscript/minecraft/events.md b/docs/zh/groovyscript/minecraft/events.md
new file mode 100644
index 0000000..163454a
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events.md
@@ -0,0 +1,15 @@
+# Events
+
+By listening to an event you can run a block of code when something special happens, for example when a block breaks or the player takes damage.
+
+## Example
+
+`````groovy
+eventManager.listen {
+ Event event ->
+ // Your code here
+ print('Hello')
+}
+`````
+
+Replace `Event` with the desired event class.
diff --git a/docs/zh/groovyscript/minecraft/events/aa_events.md b/docs/zh/groovyscript/minecraft/events/aa_events.md
new file mode 100644
index 0000000..8d28aa9
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/aa_events.md
@@ -0,0 +1,66 @@
+# Events
+
+GroovyScript allows you to listen to any event which uses the forge event system.
+Here are listed all minecraft and forge events there are.
+
+!!! Note
+ Events can be reloaded if they are registered in `postInit`
+
+Let's see an example:
+
+````groovy
+import net.minecraftforge.event.world.BlockEvent.BreakEvent
+
+event_manager.listen { BreakEvent event ->
+ log.info('Block broken: {}', event.getState())
+}
+````
+
+What is happening?
+
+- `event_manager` is a global variable where event listeners are registered (alternative name `eventManager`)
+- `listen` is a method which accepts a [closure](../../../groovy/closure.md) with the event class as the first parameter
+- `BreakEvent event` is the event being listened to. The type must be specified and imported here. (
+ See [BreakEvent](block_event._break_event.md))
+- Inside the closure you can do what you want. Here the broken block state is printed to the log.
+
+## Other listen methods
+
+````groovy
+event_manager.listen(EventPriority eventPriority, EventBusType eventBusType, Closure> eventListener)
+event_manager.listen(EventBusType eventPriority, EventPriority eventBusType, Closure> eventListener)
+event_manager.listen(EventBusType eventPriority, Closure> eventListener)
+event_manager.listen(EventPriority eventPriority, Closure> eventListener)
+````
+
+### Explanation
+
+- `EventPriority` is the priority this listener takes compared to other listeners (from all mods). Valid values are
+
+ * `EventPriority.HIGHEST` (executed first)
+ * `EventPriority.HIGH`
+ * `EventPriority.NORMAL` (default)
+ * `EventPriority.LOW`
+ * `EventPriority.LOWEST` (executed last)
+
+- `EventBusType` is the event bus where you want to register your listener. Valid values are
+
+ * `EventBusType.MAIN` (default)
+ * `EventBusType.FORGE` (currently unused)
+ * `EventBusType.ORE_GENERATION`
+ * `EventBusType.TERRAIN_GENERATION`
+
+- `Closure> eventListener` is the method executed when the event is invoked.
+
+Normally you don't need to chane any of those values.
+
+Let's see an example using `EventPriority`:
+````groovy
+import net.minecraftforge.event.world.BlockEvent.BreakEvent
+
+event_manager.listen(EventPriority.HIGHEST) { BreakEvent event ->
+ log.info('Block broken: {}', event.getState())
+}
+````
+Now it is very likely that our listener is executed before all other (not guaranteed).
+Note that we don't need to import `EventPriority`. It is auto imported.
\ No newline at end of file
diff --git a/docs/zh/groovyscript/minecraft/events/advancement_event.md b/docs/zh/groovyscript/minecraft/events/advancement_event.md
new file mode 100644
index 0000000..e309436
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/advancement_event.md
@@ -0,0 +1,16 @@
+# AdvancementEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.AdvancementEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.advancements.Advancement getAdvancement()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/animal_tame_event.md b/docs/zh/groovyscript/minecraft/events/animal_tame_event.md
new file mode 100644
index 0000000..6d1ab91
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/animal_tame_event.md
@@ -0,0 +1,20 @@
+# AnimalTameEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.AnimalTameEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.player.EntityPlayer getTamer()
+```
+
+```groovy
+net.minecraft.entity.passive.EntityAnimal getAnimal()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/anvil_repair_event.md b/docs/zh/groovyscript/minecraft/events/anvil_repair_event.md
new file mode 100644
index 0000000..3e28fd1
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/anvil_repair_event.md
@@ -0,0 +1,44 @@
+# AnvilRepairEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.AnvilRepairEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.item.ItemStack getOutput()
+```
+
+```groovy
+net.minecraft.item.ItemStack getRight()
+```
+
+```groovy
+net.minecraft.item.ItemStack getLeft()
+```
+
+```groovy
+net.minecraft.item.ItemStack getItemResult()
+```
+
+```groovy
+void setBreakChance(float arg0)
+```
+
+```groovy
+net.minecraft.item.ItemStack getItemInput()
+```
+
+```groovy
+net.minecraft.item.ItemStack getIngredientInput()
+```
+
+```groovy
+float getBreakChance()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/anvil_update_event.md b/docs/zh/groovyscript/minecraft/events/anvil_update_event.md
new file mode 100644
index 0000000..ead1609
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/anvil_update_event.md
@@ -0,0 +1,44 @@
+# AnvilUpdateEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.AnvilUpdateEvent
+```
+
+## Methods
+```groovy
+java.lang.String getName()
+```
+
+```groovy
+net.minecraft.item.ItemStack getOutput()
+```
+
+```groovy
+net.minecraft.item.ItemStack getRight()
+```
+
+```groovy
+net.minecraft.item.ItemStack getLeft()
+```
+
+```groovy
+void setOutput(net.minecraft.item.ItemStack arg0)
+```
+
+```groovy
+void setCost(int arg0)
+```
+
+```groovy
+void setMaterialCost(int arg0)
+```
+
+```groovy
+int getCost()
+```
+
+```groovy
+int getMaterialCost()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/arrow_loose_event.md b/docs/zh/groovyscript/minecraft/events/arrow_loose_event.md
new file mode 100644
index 0000000..ad50907
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/arrow_loose_event.md
@@ -0,0 +1,32 @@
+# ArrowLooseEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.ArrowLooseEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.world.World getWorld()
+```
+
+```groovy
+boolean hasAmmo()
+```
+
+```groovy
+int getCharge()
+```
+
+```groovy
+net.minecraft.item.ItemStack getBow()
+```
+
+```groovy
+void setCharge(int arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/arrow_nock_event.md b/docs/zh/groovyscript/minecraft/events/arrow_nock_event.md
new file mode 100644
index 0000000..3329335
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/arrow_nock_event.md
@@ -0,0 +1,36 @@
+# ArrowNockEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.ArrowNockEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.util.EnumHand getHand()
+```
+
+```groovy
+net.minecraft.world.World getWorld()
+```
+
+```groovy
+boolean hasAmmo()
+```
+
+```groovy
+void setAction(net.minecraft.util.ActionResult arg0)
+```
+
+```groovy
+net.minecraft.item.ItemStack getBow()
+```
+
+```groovy
+net.minecraft.util.ActionResult getAction()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/attach_capabilities_event.md b/docs/zh/groovyscript/minecraft/events/attach_capabilities_event.md
new file mode 100644
index 0000000..2a1e4dc
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/attach_capabilities_event.md
@@ -0,0 +1,24 @@
+# AttachCapabilitiesEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.AttachCapabilitiesEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[GenericEvent](generic_event.md)
+
+## Methods
+```groovy
+java.lang.Object getObject()
+```
+
+```groovy
+void addCapability(net.minecraft.util.ResourceLocation arg0, net.minecraftforge.common.capabilities.ICapabilityProvider arg1)
+```
+
+```groovy
+java.util.Map getCapabilities()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/attack_entity_event.md b/docs/zh/groovyscript/minecraft/events/attack_entity_event.md
new file mode 100644
index 0000000..bf62401
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/attack_entity_event.md
@@ -0,0 +1,16 @@
+# AttackEntityEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.AttackEntityEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.Entity getTarget()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/baby_entity_spawn_event.md b/docs/zh/groovyscript/minecraft/events/baby_entity_spawn_event.md
new file mode 100644
index 0000000..3022552
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/baby_entity_spawn_event.md
@@ -0,0 +1,28 @@
+# BabyEntitySpawnEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.BabyEntitySpawnEvent
+```
+
+## Methods
+```groovy
+net.minecraft.entity.EntityLiving getParentB()
+```
+
+```groovy
+net.minecraft.entity.EntityLiving getParentA()
+```
+
+```groovy
+net.minecraft.entity.player.EntityPlayer getCausedByPlayer()
+```
+
+```groovy
+void setChild(net.minecraft.entity.EntityAgeable arg0)
+```
+
+```groovy
+net.minecraft.entity.EntityAgeable getChild()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/biome_event._biome_color.md b/docs/zh/groovyscript/minecraft/events/biome_event._biome_color.md
new file mode 100644
index 0000000..7d2bf2a
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/biome_event._biome_color.md
@@ -0,0 +1,24 @@
+# BiomeEvent.BiomeColor
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.BiomeEvent.BiomeColor
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BiomeEvent](biome_event.md)
+
+## Methods
+```groovy
+int getNewColor()
+```
+
+```groovy
+int getOriginalColor()
+```
+
+```groovy
+void setNewColor(int arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/biome_event._create_decorator.md b/docs/zh/groovyscript/minecraft/events/biome_event._create_decorator.md
new file mode 100644
index 0000000..a54d73d
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/biome_event._create_decorator.md
@@ -0,0 +1,24 @@
+# BiomeEvent.CreateDecorator
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.BiomeEvent.CreateDecorator
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BiomeEvent](biome_event.md)
+
+## Methods
+```groovy
+net.minecraft.world.biome.BiomeDecorator getNewBiomeDecorator()
+```
+
+```groovy
+net.minecraft.world.biome.BiomeDecorator getOriginalBiomeDecorator()
+```
+
+```groovy
+void setNewBiomeDecorator(net.minecraft.world.biome.BiomeDecorator arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/biome_event._get_foliage_color.md b/docs/zh/groovyscript/minecraft/events/biome_event._get_foliage_color.md
new file mode 100644
index 0000000..055e80d
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/biome_event._get_foliage_color.md
@@ -0,0 +1,12 @@
+# BiomeEvent.GetFoliageColor
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.BiomeEvent.GetFoliageColor
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BiomeColor](biome_color.md), [BiomeEvent](biome_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/biome_event._get_grass_color.md b/docs/zh/groovyscript/minecraft/events/biome_event._get_grass_color.md
new file mode 100644
index 0000000..c635118
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/biome_event._get_grass_color.md
@@ -0,0 +1,12 @@
+# BiomeEvent.GetGrassColor
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.BiomeEvent.GetGrassColor
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BiomeColor](biome_color.md), [BiomeEvent](biome_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/biome_event._get_village_block_i_d.md b/docs/zh/groovyscript/minecraft/events/biome_event._get_village_block_i_d.md
new file mode 100644
index 0000000..8d33cf0
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/biome_event._get_village_block_i_d.md
@@ -0,0 +1,28 @@
+# BiomeEvent.GetVillageBlockID
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.BiomeEvent.GetVillageBlockID
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BiomeEvent](biome_event.md)
+
+## Methods
+```groovy
+net.minecraft.block.state.IBlockState getReplacement()
+```
+
+```groovy
+void setReplacement(net.minecraft.block.state.IBlockState arg0)
+```
+
+```groovy
+boolean hasResult()
+```
+
+```groovy
+net.minecraft.block.state.IBlockState getOriginal()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/biome_event._get_water_color.md b/docs/zh/groovyscript/minecraft/events/biome_event._get_water_color.md
new file mode 100644
index 0000000..50202e4
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/biome_event._get_water_color.md
@@ -0,0 +1,12 @@
+# BiomeEvent.GetWaterColor
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.BiomeEvent.GetWaterColor
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BiomeColor](biome_color.md), [BiomeEvent](biome_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/biome_event.md b/docs/zh/groovyscript/minecraft/events/biome_event.md
new file mode 100644
index 0000000..0151afb
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/biome_event.md
@@ -0,0 +1,12 @@
+# BiomeEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.BiomeEvent
+```
+
+## Methods
+```groovy
+net.minecraft.world.biome.Biome getBiome()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/block_event._break_event.md b/docs/zh/groovyscript/minecraft/events/block_event._break_event.md
new file mode 100644
index 0000000..03ec1b3
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/block_event._break_event.md
@@ -0,0 +1,24 @@
+# BlockEvent.BreakEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.BlockEvent.BreakEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BlockEvent](block_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.player.EntityPlayer getPlayer()
+```
+
+```groovy
+int getExpToDrop()
+```
+
+```groovy
+void setExpToDrop(int arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/block_event._create_fluid_source_event.md b/docs/zh/groovyscript/minecraft/events/block_event._create_fluid_source_event.md
new file mode 100644
index 0000000..0d84f1c
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/block_event._create_fluid_source_event.md
@@ -0,0 +1,16 @@
+# BlockEvent.CreateFluidSourceEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.BlockEvent.CreateFluidSourceEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BlockEvent](block_event.md)
+
+## Methods
+```groovy
+boolean hasResult()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/block_event._crop_grow_event.md b/docs/zh/groovyscript/minecraft/events/block_event._crop_grow_event.md
new file mode 100644
index 0000000..591755f
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/block_event._crop_grow_event.md
@@ -0,0 +1,44 @@
+# BlockEvent.CropGrowEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.BlockEvent.CropGrowEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BlockEvent](block_event.md)
+
+## Methods
+# BlockEvent.CropGrowEvent.Pre
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.BlockEvent.CropGrowEvent.Pre
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[CropGrowEvent](crop_grow_event.md), [BlockEvent](block_event.md)
+
+## Methods
+```groovy
+boolean hasResult()
+```
+
+# BlockEvent.CropGrowEvent.Post
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.BlockEvent.CropGrowEvent.Post
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[CropGrowEvent](crop_grow_event.md), [BlockEvent](block_event.md)
+
+## Methods
+```groovy
+net.minecraft.block.state.IBlockState getOriginalState()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/block_event._entity_multi_place_event.md b/docs/zh/groovyscript/minecraft/events/block_event._entity_multi_place_event.md
new file mode 100644
index 0000000..129ca37
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/block_event._entity_multi_place_event.md
@@ -0,0 +1,16 @@
+# BlockEvent.EntityMultiPlaceEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.BlockEvent.EntityMultiPlaceEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityPlaceEvent](entity_place_event.md), [BlockEvent](block_event.md)
+
+## Methods
+```groovy
+java.util.List getReplacedBlockSnapshots()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/block_event._entity_place_event.md b/docs/zh/groovyscript/minecraft/events/block_event._entity_place_event.md
new file mode 100644
index 0000000..abcdf04
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/block_event._entity_place_event.md
@@ -0,0 +1,28 @@
+# BlockEvent.EntityPlaceEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.BlockEvent.EntityPlaceEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BlockEvent](block_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.Entity getEntity()
+```
+
+```groovy
+net.minecraftforge.common.util.BlockSnapshot getBlockSnapshot()
+```
+
+```groovy
+net.minecraft.block.state.IBlockState getPlacedBlock()
+```
+
+```groovy
+net.minecraft.block.state.IBlockState getPlacedAgainst()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/block_event._farmland_trample_event.md b/docs/zh/groovyscript/minecraft/events/block_event._farmland_trample_event.md
new file mode 100644
index 0000000..9fc772b
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/block_event._farmland_trample_event.md
@@ -0,0 +1,20 @@
+# BlockEvent.FarmlandTrampleEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.BlockEvent.FarmlandTrampleEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BlockEvent](block_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.Entity getEntity()
+```
+
+```groovy
+float getFallDistance()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/block_event._fluid_place_block_event.md b/docs/zh/groovyscript/minecraft/events/block_event._fluid_place_block_event.md
new file mode 100644
index 0000000..b8c7915
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/block_event._fluid_place_block_event.md
@@ -0,0 +1,28 @@
+# BlockEvent.FluidPlaceBlockEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.BlockEvent.FluidPlaceBlockEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BlockEvent](block_event.md)
+
+## Methods
+```groovy
+net.minecraft.block.state.IBlockState getNewState()
+```
+
+```groovy
+net.minecraft.util.math.BlockPos getLiquidPos()
+```
+
+```groovy
+void setNewState(net.minecraft.block.state.IBlockState arg0)
+```
+
+```groovy
+net.minecraft.block.state.IBlockState getOriginalState()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/block_event._harvest_drops_event.md b/docs/zh/groovyscript/minecraft/events/block_event._harvest_drops_event.md
new file mode 100644
index 0000000..a5484cc
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/block_event._harvest_drops_event.md
@@ -0,0 +1,36 @@
+# BlockEvent.HarvestDropsEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.BlockEvent.HarvestDropsEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BlockEvent](block_event.md)
+
+## Methods
+```groovy
+void setDropChance(float arg0)
+```
+
+```groovy
+java.util.List getDrops()
+```
+
+```groovy
+float getDropChance()
+```
+
+```groovy
+int getFortuneLevel()
+```
+
+```groovy
+boolean isSilkTouching()
+```
+
+```groovy
+net.minecraft.entity.player.EntityPlayer getHarvester()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/block_event._multi_place_event.md b/docs/zh/groovyscript/minecraft/events/block_event._multi_place_event.md
new file mode 100644
index 0000000..9e3ee25
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/block_event._multi_place_event.md
@@ -0,0 +1,16 @@
+# BlockEvent.MultiPlaceEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.BlockEvent.MultiPlaceEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlaceEvent](place_event.md), [EntityPlaceEvent](entity_place_event.md), [BlockEvent](block_event.md)
+
+## Methods
+```groovy
+java.util.List getReplacedBlockSnapshots()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/block_event._neighbor_notify_event.md b/docs/zh/groovyscript/minecraft/events/block_event._neighbor_notify_event.md
new file mode 100644
index 0000000..66a03e8
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/block_event._neighbor_notify_event.md
@@ -0,0 +1,20 @@
+# BlockEvent.NeighborNotifyEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.BlockEvent.NeighborNotifyEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BlockEvent](block_event.md)
+
+## Methods
+```groovy
+boolean getForceRedstoneUpdate()
+```
+
+```groovy
+java.util.EnumSet getNotifiedSides()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/block_event._place_event.md b/docs/zh/groovyscript/minecraft/events/block_event._place_event.md
new file mode 100644
index 0000000..d3794ae
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/block_event._place_event.md
@@ -0,0 +1,24 @@
+# BlockEvent.PlaceEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.BlockEvent.PlaceEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityPlaceEvent](entity_place_event.md), [BlockEvent](block_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.player.EntityPlayer getPlayer()
+```
+
+```groovy
+net.minecraft.util.EnumHand getHand()
+```
+
+```groovy
+net.minecraft.item.ItemStack getItemInHand()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/block_event._portal_spawn_event.md b/docs/zh/groovyscript/minecraft/events/block_event._portal_spawn_event.md
new file mode 100644
index 0000000..09ed910
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/block_event._portal_spawn_event.md
@@ -0,0 +1,16 @@
+# BlockEvent.PortalSpawnEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.BlockEvent.PortalSpawnEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BlockEvent](block_event.md)
+
+## Methods
+```groovy
+net.minecraft.block.BlockPortal$Size getPortalSize()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/block_event.md b/docs/zh/groovyscript/minecraft/events/block_event.md
new file mode 100644
index 0000000..82db4fe
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/block_event.md
@@ -0,0 +1,20 @@
+# BlockEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.BlockEvent
+```
+
+## Methods
+```groovy
+net.minecraft.block.state.IBlockState getState()
+```
+
+```groovy
+net.minecraft.util.math.BlockPos getPos()
+```
+
+```groovy
+net.minecraft.world.World getWorld()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/bonemeal_event.md b/docs/zh/groovyscript/minecraft/events/bonemeal_event.md
new file mode 100644
index 0000000..ad58297
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/bonemeal_event.md
@@ -0,0 +1,36 @@
+# BonemealEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.BonemealEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.item.ItemStack getStack()
+```
+
+```groovy
+net.minecraft.block.state.IBlockState getBlock()
+```
+
+```groovy
+boolean hasResult()
+```
+
+```groovy
+net.minecraft.util.EnumHand getHand()
+```
+
+```groovy
+net.minecraft.util.math.BlockPos getPos()
+```
+
+```groovy
+net.minecraft.world.World getWorld()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/chunk_data_event._load.md b/docs/zh/groovyscript/minecraft/events/chunk_data_event._load.md
new file mode 100644
index 0000000..55d8bca
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/chunk_data_event._load.md
@@ -0,0 +1,12 @@
+# ChunkDataEvent.Load
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.ChunkDataEvent.Load
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ChunkDataEvent](chunk_data_event.md), [ChunkEvent](chunk_event.md), [WorldEvent](world_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/chunk_data_event._save.md b/docs/zh/groovyscript/minecraft/events/chunk_data_event._save.md
new file mode 100644
index 0000000..74d6eb1
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/chunk_data_event._save.md
@@ -0,0 +1,12 @@
+# ChunkDataEvent.Save
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.ChunkDataEvent.Save
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ChunkDataEvent](chunk_data_event.md), [ChunkEvent](chunk_event.md), [WorldEvent](world_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/chunk_data_event.md b/docs/zh/groovyscript/minecraft/events/chunk_data_event.md
new file mode 100644
index 0000000..bf2af60
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/chunk_data_event.md
@@ -0,0 +1,16 @@
+# ChunkDataEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.ChunkDataEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ChunkEvent](chunk_event.md), [WorldEvent](world_event.md)
+
+## Methods
+```groovy
+net.minecraft.nbt.NBTTagCompound getData()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/chunk_event._load.md b/docs/zh/groovyscript/minecraft/events/chunk_event._load.md
new file mode 100644
index 0000000..4c7db4e
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/chunk_event._load.md
@@ -0,0 +1,12 @@
+# ChunkEvent.Load
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.ChunkEvent.Load
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ChunkEvent](chunk_event.md), [WorldEvent](world_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/chunk_event._unload.md b/docs/zh/groovyscript/minecraft/events/chunk_event._unload.md
new file mode 100644
index 0000000..2bb30fa
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/chunk_event._unload.md
@@ -0,0 +1,12 @@
+# ChunkEvent.Unload
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.ChunkEvent.Unload
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ChunkEvent](chunk_event.md), [WorldEvent](world_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/chunk_event.md b/docs/zh/groovyscript/minecraft/events/chunk_event.md
new file mode 100644
index 0000000..4ffc967
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/chunk_event.md
@@ -0,0 +1,16 @@
+# ChunkEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.ChunkEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[WorldEvent](world_event.md)
+
+## Methods
+```groovy
+net.minecraft.world.chunk.Chunk getChunk()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/chunk_generator_event._init_noise_field.md b/docs/zh/groovyscript/minecraft/events/chunk_generator_event._init_noise_field.md
new file mode 100644
index 0000000..da84fda
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/chunk_generator_event._init_noise_field.md
@@ -0,0 +1,48 @@
+# ChunkGeneratorEvent.InitNoiseField
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.ChunkGeneratorEvent.InitNoiseField
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ChunkGeneratorEvent](chunk_generator_event.md)
+
+## Methods
+```groovy
+int getPosZ()
+```
+
+```groovy
+[D getNoisefield()
+```
+
+```groovy
+void setNoisefield([D arg0)
+```
+
+```groovy
+int getSizeX()
+```
+
+```groovy
+int getSizeZ()
+```
+
+```groovy
+int getSizeY()
+```
+
+```groovy
+boolean hasResult()
+```
+
+```groovy
+int getPosY()
+```
+
+```groovy
+int getPosX()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/chunk_generator_event._replace_biome_blocks.md b/docs/zh/groovyscript/minecraft/events/chunk_generator_event._replace_biome_blocks.md
new file mode 100644
index 0000000..411e771
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/chunk_generator_event._replace_biome_blocks.md
@@ -0,0 +1,32 @@
+# ChunkGeneratorEvent.ReplaceBiomeBlocks
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.ChunkGeneratorEvent.ReplaceBiomeBlocks
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ChunkGeneratorEvent](chunk_generator_event.md)
+
+## Methods
+```groovy
+int getX()
+```
+
+```groovy
+boolean hasResult()
+```
+
+```groovy
+int getZ()
+```
+
+```groovy
+net.minecraft.world.World getWorld()
+```
+
+```groovy
+net.minecraft.world.chunk.ChunkPrimer getPrimer()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/chunk_generator_event.md b/docs/zh/groovyscript/minecraft/events/chunk_generator_event.md
new file mode 100644
index 0000000..8124998
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/chunk_generator_event.md
@@ -0,0 +1,16 @@
+# ChunkGeneratorEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.ChunkGeneratorEvent
+```
+
+## Methods
+```groovy
+net.minecraft.world.gen.IChunkGenerator getGenerator()
+```
+
+```groovy
+net.minecraft.world.gen.IChunkGenerator getGen()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/chunk_watch_event._un_watch.md b/docs/zh/groovyscript/minecraft/events/chunk_watch_event._un_watch.md
new file mode 100644
index 0000000..716aa72
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/chunk_watch_event._un_watch.md
@@ -0,0 +1,12 @@
+# ChunkWatchEvent.UnWatch
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.ChunkWatchEvent.UnWatch
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ChunkWatchEvent](chunk_watch_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/chunk_watch_event._watch.md b/docs/zh/groovyscript/minecraft/events/chunk_watch_event._watch.md
new file mode 100644
index 0000000..74f5dc6
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/chunk_watch_event._watch.md
@@ -0,0 +1,12 @@
+# ChunkWatchEvent.Watch
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.ChunkWatchEvent.Watch
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ChunkWatchEvent](chunk_watch_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/chunk_watch_event.md b/docs/zh/groovyscript/minecraft/events/chunk_watch_event.md
new file mode 100644
index 0000000..3eb2776
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/chunk_watch_event.md
@@ -0,0 +1,20 @@
+# ChunkWatchEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.ChunkWatchEvent
+```
+
+## Methods
+```groovy
+net.minecraft.world.chunk.Chunk getChunkInstance()
+```
+
+```groovy
+net.minecraft.entity.player.EntityPlayerMP getPlayer()
+```
+
+```groovy
+net.minecraft.util.math.ChunkPos getChunk()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/command_event.md b/docs/zh/groovyscript/minecraft/events/command_event.md
new file mode 100644
index 0000000..58a1706
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/command_event.md
@@ -0,0 +1,32 @@
+# CommandEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.CommandEvent
+```
+
+## Methods
+```groovy
+java.lang.Throwable getException()
+```
+
+```groovy
+[Ljava.lang.String; getParameters()
+```
+
+```groovy
+net.minecraft.command.ICommand getCommand()
+```
+
+```groovy
+void setParameters([Ljava.lang.String; arg0)
+```
+
+```groovy
+void setException(java.lang.Throwable arg0)
+```
+
+```groovy
+net.minecraft.command.ICommandSender getSender()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/critical_hit_event.md b/docs/zh/groovyscript/minecraft/events/critical_hit_event.md
new file mode 100644
index 0000000..c6f33cc
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/critical_hit_event.md
@@ -0,0 +1,36 @@
+# CriticalHitEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.CriticalHitEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.Entity getTarget()
+```
+
+```groovy
+boolean hasResult()
+```
+
+```groovy
+float getDamageModifier()
+```
+
+```groovy
+void setDamageModifier(float arg0)
+```
+
+```groovy
+float getOldDamageModifier()
+```
+
+```groovy
+boolean isVanillaCritical()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/decorate_biome_event._decorate.md b/docs/zh/groovyscript/minecraft/events/decorate_biome_event._decorate.md
new file mode 100644
index 0000000..3140c4a
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/decorate_biome_event._decorate.md
@@ -0,0 +1,24 @@
+# DecorateBiomeEvent.Decorate
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[DecorateBiomeEvent](decorate_biome_event.md)
+
+## Methods
+```groovy
+net.minecraftforge.event.terraingen.DecorateBiomeEvent$Decorate$EventType getType()
+```
+
+```groovy
+net.minecraft.util.math.BlockPos getPlacementPos()
+```
+
+```groovy
+boolean hasResult()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/decorate_biome_event.md b/docs/zh/groovyscript/minecraft/events/decorate_biome_event.md
new file mode 100644
index 0000000..7e1456d
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/decorate_biome_event.md
@@ -0,0 +1,48 @@
+# DecorateBiomeEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.DecorateBiomeEvent
+```
+
+## Methods
+```groovy
+net.minecraft.util.math.BlockPos getPos()
+```
+
+```groovy
+net.minecraft.world.World getWorld()
+```
+
+```groovy
+java.util.Random getRand()
+```
+
+```groovy
+net.minecraft.util.math.ChunkPos getChunkPos()
+```
+
+# DecorateBiomeEvent.Pre
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.DecorateBiomeEvent.Pre
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[DecorateBiomeEvent](decorate_biome_event.md)
+
+## Methods
+# DecorateBiomeEvent.Post
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.DecorateBiomeEvent.Post
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[DecorateBiomeEvent](decorate_biome_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/difficulty_change_event.md b/docs/zh/groovyscript/minecraft/events/difficulty_change_event.md
new file mode 100644
index 0000000..0acf23e
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/difficulty_change_event.md
@@ -0,0 +1,16 @@
+# DifficultyChangeEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.DifficultyChangeEvent
+```
+
+## Methods
+```groovy
+net.minecraft.world.EnumDifficulty getOldDifficulty()
+```
+
+```groovy
+net.minecraft.world.EnumDifficulty getDifficulty()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/enchantment_level_set_event.md b/docs/zh/groovyscript/minecraft/events/enchantment_level_set_event.md
new file mode 100644
index 0000000..9668d61
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/enchantment_level_set_event.md
@@ -0,0 +1,40 @@
+# EnchantmentLevelSetEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.enchanting.EnchantmentLevelSetEvent
+```
+
+## Methods
+```groovy
+int getLevel()
+```
+
+```groovy
+void setLevel(int arg0)
+```
+
+```groovy
+net.minecraft.item.ItemStack getItem()
+```
+
+```groovy
+net.minecraft.util.math.BlockPos getPos()
+```
+
+```groovy
+net.minecraft.world.World getWorld()
+```
+
+```groovy
+int getOriginalLevel()
+```
+
+```groovy
+int getEnchantRow()
+```
+
+```groovy
+int getPower()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/ender_teleport_event.md b/docs/zh/groovyscript/minecraft/events/ender_teleport_event.md
new file mode 100644
index 0000000..cf00f59
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/ender_teleport_event.md
@@ -0,0 +1,44 @@
+# EnderTeleportEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.EnderTeleportEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+double getTargetX()
+```
+
+```groovy
+double getTargetY()
+```
+
+```groovy
+double getTargetZ()
+```
+
+```groovy
+float getAttackDamage()
+```
+
+```groovy
+void setAttackDamage(float arg0)
+```
+
+```groovy
+void setTargetX(double arg0)
+```
+
+```groovy
+void setTargetZ(double arg0)
+```
+
+```groovy
+void setTargetY(double arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/entity_event._can_update.md b/docs/zh/groovyscript/minecraft/events/entity_event._can_update.md
new file mode 100644
index 0000000..e2d7b8c
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/entity_event._can_update.md
@@ -0,0 +1,20 @@
+# EntityEvent.CanUpdate
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.EntityEvent.CanUpdate
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+boolean getCanUpdate()
+```
+
+```groovy
+void setCanUpdate(boolean arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/entity_event._entering_chunk.md b/docs/zh/groovyscript/minecraft/events/entity_event._entering_chunk.md
new file mode 100644
index 0000000..51ab0bf
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/entity_event._entering_chunk.md
@@ -0,0 +1,44 @@
+# EntityEvent.EnteringChunk
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.EntityEvent.EnteringChunk
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+void setNewChunkX(int arg0)
+```
+
+```groovy
+void setNewChunkZ(int arg0)
+```
+
+```groovy
+void setOldChunkX(int arg0)
+```
+
+```groovy
+void setOldChunkZ(int arg0)
+```
+
+```groovy
+int getNewChunkX()
+```
+
+```groovy
+int getOldChunkX()
+```
+
+```groovy
+int getOldChunkZ()
+```
+
+```groovy
+int getNewChunkZ()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/entity_event._entity_constructing.md b/docs/zh/groovyscript/minecraft/events/entity_event._entity_constructing.md
new file mode 100644
index 0000000..10f9c20
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/entity_event._entity_constructing.md
@@ -0,0 +1,12 @@
+# EntityEvent.EntityConstructing
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.EntityEvent.EntityConstructing
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityEvent](entity_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/entity_event.md b/docs/zh/groovyscript/minecraft/events/entity_event.md
new file mode 100644
index 0000000..2a43262
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/entity_event.md
@@ -0,0 +1,12 @@
+# EntityEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.EntityEvent
+```
+
+## Methods
+```groovy
+net.minecraft.entity.Entity getEntity()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/entity_item_pickup_event.md b/docs/zh/groovyscript/minecraft/events/entity_item_pickup_event.md
new file mode 100644
index 0000000..2f4835c
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/entity_item_pickup_event.md
@@ -0,0 +1,20 @@
+# EntityItemPickupEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.EntityItemPickupEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.item.EntityItem getItem()
+```
+
+```groovy
+boolean hasResult()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/entity_join_world_event.md b/docs/zh/groovyscript/minecraft/events/entity_join_world_event.md
new file mode 100644
index 0000000..33e36e3
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/entity_join_world_event.md
@@ -0,0 +1,16 @@
+# EntityJoinWorldEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.EntityJoinWorldEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.world.World getWorld()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/entity_mob_griefing_event.md b/docs/zh/groovyscript/minecraft/events/entity_mob_griefing_event.md
new file mode 100644
index 0000000..74399f4
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/entity_mob_griefing_event.md
@@ -0,0 +1,16 @@
+# EntityMobGriefingEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.EntityMobGriefingEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+boolean hasResult()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/entity_mount_event.md b/docs/zh/groovyscript/minecraft/events/entity_mount_event.md
new file mode 100644
index 0000000..fcb51d9
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/entity_mount_event.md
@@ -0,0 +1,32 @@
+# EntityMountEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.EntityMountEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.world.World getWorldObj()
+```
+
+```groovy
+net.minecraft.entity.Entity getEntityBeingMounted()
+```
+
+```groovy
+net.minecraft.entity.Entity getEntityMounting()
+```
+
+```groovy
+boolean isMounting()
+```
+
+```groovy
+boolean isDismounting()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/entity_struck_by_lightning_event.md b/docs/zh/groovyscript/minecraft/events/entity_struck_by_lightning_event.md
new file mode 100644
index 0000000..6308b30
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/entity_struck_by_lightning_event.md
@@ -0,0 +1,16 @@
+# EntityStruckByLightningEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.EntityStruckByLightningEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.effect.EntityLightningBolt getLightning()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/entity_travel_to_dimension_event.md b/docs/zh/groovyscript/minecraft/events/entity_travel_to_dimension_event.md
new file mode 100644
index 0000000..3922204
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/entity_travel_to_dimension_event.md
@@ -0,0 +1,16 @@
+# EntityTravelToDimensionEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.EntityTravelToDimensionEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+int getDimension()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/explosion_event._detonate.md b/docs/zh/groovyscript/minecraft/events/explosion_event._detonate.md
new file mode 100644
index 0000000..6b0e3d9
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/explosion_event._detonate.md
@@ -0,0 +1,20 @@
+# ExplosionEvent.Detonate
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.ExplosionEvent.Detonate
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ExplosionEvent](explosion_event.md)
+
+## Methods
+```groovy
+java.util.List getAffectedBlocks()
+```
+
+```groovy
+java.util.List getAffectedEntities()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/explosion_event._start.md b/docs/zh/groovyscript/minecraft/events/explosion_event._start.md
new file mode 100644
index 0000000..7de5448
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/explosion_event._start.md
@@ -0,0 +1,12 @@
+# ExplosionEvent.Start
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.ExplosionEvent.Start
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ExplosionEvent](explosion_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/explosion_event.md b/docs/zh/groovyscript/minecraft/events/explosion_event.md
new file mode 100644
index 0000000..071aa22
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/explosion_event.md
@@ -0,0 +1,16 @@
+# ExplosionEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.ExplosionEvent
+```
+
+## Methods
+```groovy
+net.minecraft.world.World getWorld()
+```
+
+```groovy
+net.minecraft.world.Explosion getExplosion()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/fill_bucket_event.md b/docs/zh/groovyscript/minecraft/events/fill_bucket_event.md
new file mode 100644
index 0000000..0178a66
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/fill_bucket_event.md
@@ -0,0 +1,36 @@
+# FillBucketEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.FillBucketEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.util.math.RayTraceResult getTarget()
+```
+
+```groovy
+boolean hasResult()
+```
+
+```groovy
+net.minecraft.world.World getWorld()
+```
+
+```groovy
+net.minecraft.item.ItemStack getFilledBucket()
+```
+
+```groovy
+void setFilledBucket(net.minecraft.item.ItemStack arg0)
+```
+
+```groovy
+net.minecraft.item.ItemStack getEmptyBucket()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/furnace_fuel_burn_time_event.md b/docs/zh/groovyscript/minecraft/events/furnace_fuel_burn_time_event.md
new file mode 100644
index 0000000..dcab401
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/furnace_fuel_burn_time_event.md
@@ -0,0 +1,20 @@
+# FurnaceFuelBurnTimeEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.furnace.FurnaceFuelBurnTimeEvent
+```
+
+## Methods
+```groovy
+int getBurnTime()
+```
+
+```groovy
+void setBurnTime(int arg0)
+```
+
+```groovy
+net.minecraft.item.ItemStack getItemStack()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/game_rule_change_event.md b/docs/zh/groovyscript/minecraft/events/game_rule_change_event.md
new file mode 100644
index 0000000..5efaa5c
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/game_rule_change_event.md
@@ -0,0 +1,20 @@
+# GameRuleChangeEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.GameRuleChangeEvent
+```
+
+## Methods
+```groovy
+net.minecraft.world.GameRules getRules()
+```
+
+```groovy
+java.lang.String getRuleName()
+```
+
+```groovy
+net.minecraft.server.MinecraftServer getServer()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/get_collision_boxes_event.md b/docs/zh/groovyscript/minecraft/events/get_collision_boxes_event.md
new file mode 100644
index 0000000..947d117
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/get_collision_boxes_event.md
@@ -0,0 +1,24 @@
+# GetCollisionBoxesEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.GetCollisionBoxesEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[WorldEvent](world_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.Entity getEntity()
+```
+
+```groovy
+java.util.List getCollisionBoxesList()
+```
+
+```groovy
+net.minecraft.util.math.AxisAlignedBB getAabb()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/init_map_gen_event.md b/docs/zh/groovyscript/minecraft/events/init_map_gen_event.md
new file mode 100644
index 0000000..307c285
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/init_map_gen_event.md
@@ -0,0 +1,24 @@
+# InitMapGenEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.InitMapGenEvent
+```
+
+## Methods
+```groovy
+net.minecraftforge.event.terraingen.InitMapGenEvent$EventType getType()
+```
+
+```groovy
+void setNewGen(net.minecraft.world.gen.MapGenBase arg0)
+```
+
+```groovy
+net.minecraft.world.gen.MapGenBase getOriginalGen()
+```
+
+```groovy
+net.minecraft.world.gen.MapGenBase getNewGen()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/init_noise_gens_event.md b/docs/zh/groovyscript/minecraft/events/init_noise_gens_event.md
new file mode 100644
index 0000000..5bc7b53
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/init_noise_gens_event.md
@@ -0,0 +1,24 @@
+# InitNoiseGensEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.InitNoiseGensEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[WorldEvent](world_event.md)
+
+## Methods
+```groovy
+net.minecraftforge.event.terraingen.InitNoiseGensEvent$Context getNewValues()
+```
+
+```groovy
+net.minecraftforge.event.terraingen.InitNoiseGensEvent$Context getOriginal()
+```
+
+```groovy
+java.util.Random getRandom()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/item_event.md b/docs/zh/groovyscript/minecraft/events/item_event.md
new file mode 100644
index 0000000..9bbe0f2
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/item_event.md
@@ -0,0 +1,16 @@
+# ItemEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.item.ItemEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.item.EntityItem getEntityItem()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/item_expire_event.md b/docs/zh/groovyscript/minecraft/events/item_expire_event.md
new file mode 100644
index 0000000..6d566ae
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/item_expire_event.md
@@ -0,0 +1,20 @@
+# ItemExpireEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.item.ItemExpireEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ItemEvent](item_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+int getExtraLife()
+```
+
+```groovy
+void setExtraLife(int arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/item_fished_event.md b/docs/zh/groovyscript/minecraft/events/item_fished_event.md
new file mode 100644
index 0000000..b9495e1
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/item_fished_event.md
@@ -0,0 +1,28 @@
+# ItemFishedEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.ItemFishedEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+int getRodDamage()
+```
+
+```groovy
+net.minecraft.util.NonNullList getDrops()
+```
+
+```groovy
+void damageRodBy(int arg0)
+```
+
+```groovy
+net.minecraft.entity.projectile.EntityFishHook getHookEntity()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/item_tooltip_event.md b/docs/zh/groovyscript/minecraft/events/item_tooltip_event.md
new file mode 100644
index 0000000..7c61fc5
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/item_tooltip_event.md
@@ -0,0 +1,28 @@
+# ItemTooltipEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.ItemTooltipEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.client.util.ITooltipFlag getFlags()
+```
+
+```groovy
+net.minecraft.entity.player.EntityPlayer getEntityPlayer()
+```
+
+```groovy
+java.util.List getToolTip()
+```
+
+```groovy
+net.minecraft.item.ItemStack getItemStack()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/item_toss_event.md b/docs/zh/groovyscript/minecraft/events/item_toss_event.md
new file mode 100644
index 0000000..efe8543
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/item_toss_event.md
@@ -0,0 +1,16 @@
+# ItemTossEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.item.ItemTossEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ItemEvent](item_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.player.EntityPlayer getPlayer()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_attack_event.md b/docs/zh/groovyscript/minecraft/events/living_attack_event.md
new file mode 100644
index 0000000..ff21a2c
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_attack_event.md
@@ -0,0 +1,20 @@
+# LivingAttackEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingAttackEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.util.DamageSource getSource()
+```
+
+```groovy
+float getAmount()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_damage_event.md b/docs/zh/groovyscript/minecraft/events/living_damage_event.md
new file mode 100644
index 0000000..9c7c7d8
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_damage_event.md
@@ -0,0 +1,24 @@
+# LivingDamageEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingDamageEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.util.DamageSource getSource()
+```
+
+```groovy
+void setAmount(float arg0)
+```
+
+```groovy
+float getAmount()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_death_event.md b/docs/zh/groovyscript/minecraft/events/living_death_event.md
new file mode 100644
index 0000000..b6967be
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_death_event.md
@@ -0,0 +1,16 @@
+# LivingDeathEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingDeathEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.util.DamageSource getSource()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_destroy_block_event.md b/docs/zh/groovyscript/minecraft/events/living_destroy_block_event.md
new file mode 100644
index 0000000..0293b41
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_destroy_block_event.md
@@ -0,0 +1,20 @@
+# LivingDestroyBlockEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingDestroyBlockEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.block.state.IBlockState getState()
+```
+
+```groovy
+net.minecraft.util.math.BlockPos getPos()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_drops_event.md b/docs/zh/groovyscript/minecraft/events/living_drops_event.md
new file mode 100644
index 0000000..473c711
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_drops_event.md
@@ -0,0 +1,28 @@
+# LivingDropsEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingDropsEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.util.DamageSource getSource()
+```
+
+```groovy
+java.util.List getDrops()
+```
+
+```groovy
+boolean isRecentlyHit()
+```
+
+```groovy
+int getLootingLevel()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_entity_use_item_event._finish.md b/docs/zh/groovyscript/minecraft/events/living_entity_use_item_event._finish.md
new file mode 100644
index 0000000..9ef51ea
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_entity_use_item_event._finish.md
@@ -0,0 +1,20 @@
+# LivingEntityUseItemEvent.Finish
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent.Finish
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEntityUseItemEvent](living_entity_use_item_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.item.ItemStack getResultStack()
+```
+
+```groovy
+void setResultStack(net.minecraft.item.ItemStack arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_entity_use_item_event._start.md b/docs/zh/groovyscript/minecraft/events/living_entity_use_item_event._start.md
new file mode 100644
index 0000000..0f0da8d
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_entity_use_item_event._start.md
@@ -0,0 +1,12 @@
+# LivingEntityUseItemEvent.Start
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent.Start
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEntityUseItemEvent](living_entity_use_item_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/living_entity_use_item_event._stop.md b/docs/zh/groovyscript/minecraft/events/living_entity_use_item_event._stop.md
new file mode 100644
index 0000000..6fd1ac4
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_entity_use_item_event._stop.md
@@ -0,0 +1,12 @@
+# LivingEntityUseItemEvent.Stop
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent.Stop
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEntityUseItemEvent](living_entity_use_item_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/living_entity_use_item_event._tick.md b/docs/zh/groovyscript/minecraft/events/living_entity_use_item_event._tick.md
new file mode 100644
index 0000000..2a86354
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_entity_use_item_event._tick.md
@@ -0,0 +1,12 @@
+# LivingEntityUseItemEvent.Tick
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent.Tick
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEntityUseItemEvent](living_entity_use_item_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/living_entity_use_item_event.md b/docs/zh/groovyscript/minecraft/events/living_entity_use_item_event.md
new file mode 100644
index 0000000..4f753d9
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_entity_use_item_event.md
@@ -0,0 +1,24 @@
+# LivingEntityUseItemEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+int getDuration()
+```
+
+```groovy
+net.minecraft.item.ItemStack getItem()
+```
+
+```groovy
+void setDuration(int arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_equipment_change_event.md b/docs/zh/groovyscript/minecraft/events/living_equipment_change_event.md
new file mode 100644
index 0000000..fc49f42
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_equipment_change_event.md
@@ -0,0 +1,24 @@
+# LivingEquipmentChangeEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingEquipmentChangeEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.inventory.EntityEquipmentSlot getSlot()
+```
+
+```groovy
+net.minecraft.item.ItemStack getTo()
+```
+
+```groovy
+net.minecraft.item.ItemStack getFrom()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_event._living_jump_event.md b/docs/zh/groovyscript/minecraft/events/living_event._living_jump_event.md
new file mode 100644
index 0000000..050482a
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_event._living_jump_event.md
@@ -0,0 +1,12 @@
+# LivingEvent.LivingJumpEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingEvent.LivingJumpEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/living_event._living_update_event.md b/docs/zh/groovyscript/minecraft/events/living_event._living_update_event.md
new file mode 100644
index 0000000..ad34d59
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_event._living_update_event.md
@@ -0,0 +1,12 @@
+# LivingEvent.LivingUpdateEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/living_event.md b/docs/zh/groovyscript/minecraft/events/living_event.md
new file mode 100644
index 0000000..a71ce6d
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_event.md
@@ -0,0 +1,16 @@
+# LivingEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.EntityLivingBase getEntityLiving()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_experience_drop_event.md b/docs/zh/groovyscript/minecraft/events/living_experience_drop_event.md
new file mode 100644
index 0000000..858a7b1
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_experience_drop_event.md
@@ -0,0 +1,28 @@
+# LivingExperienceDropEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingExperienceDropEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+int getDroppedExperience()
+```
+
+```groovy
+void setDroppedExperience(int arg0)
+```
+
+```groovy
+int getOriginalExperience()
+```
+
+```groovy
+net.minecraft.entity.player.EntityPlayer getAttackingPlayer()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_fall_event.md b/docs/zh/groovyscript/minecraft/events/living_fall_event.md
new file mode 100644
index 0000000..64ae965
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_fall_event.md
@@ -0,0 +1,28 @@
+# LivingFallEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingFallEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+float getDamageMultiplier()
+```
+
+```groovy
+void setDamageMultiplier(float arg0)
+```
+
+```groovy
+void setDistance(float arg0)
+```
+
+```groovy
+float getDistance()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_heal_event.md b/docs/zh/groovyscript/minecraft/events/living_heal_event.md
new file mode 100644
index 0000000..f7251f1
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_heal_event.md
@@ -0,0 +1,20 @@
+# LivingHealEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingHealEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+void setAmount(float arg0)
+```
+
+```groovy
+float getAmount()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_hurt_event.md b/docs/zh/groovyscript/minecraft/events/living_hurt_event.md
new file mode 100644
index 0000000..0fc2e05
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_hurt_event.md
@@ -0,0 +1,24 @@
+# LivingHurtEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingHurtEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.util.DamageSource getSource()
+```
+
+```groovy
+void setAmount(float arg0)
+```
+
+```groovy
+float getAmount()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_knock_back_event.md b/docs/zh/groovyscript/minecraft/events/living_knock_back_event.md
new file mode 100644
index 0000000..1c5847b
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_knock_back_event.md
@@ -0,0 +1,60 @@
+# LivingKnockBackEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingKnockBackEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.Entity getOriginalAttacker()
+```
+
+```groovy
+double getOriginalRatioX()
+```
+
+```groovy
+double getOriginalRatioZ()
+```
+
+```groovy
+float getOriginalStrength()
+```
+
+```groovy
+net.minecraft.entity.Entity getAttacker()
+```
+
+```groovy
+float getStrength()
+```
+
+```groovy
+double getRatioX()
+```
+
+```groovy
+double getRatioZ()
+```
+
+```groovy
+void setStrength(float arg0)
+```
+
+```groovy
+void setAttacker(net.minecraft.entity.Entity arg0)
+```
+
+```groovy
+void setRatioZ(double arg0)
+```
+
+```groovy
+void setRatioX(double arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_pack_size_event.md b/docs/zh/groovyscript/minecraft/events/living_pack_size_event.md
new file mode 100644
index 0000000..de36fea
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_pack_size_event.md
@@ -0,0 +1,24 @@
+# LivingPackSizeEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingPackSizeEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+boolean hasResult()
+```
+
+```groovy
+int getMaxPackSize()
+```
+
+```groovy
+void setMaxPackSize(int arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_set_attack_target_event.md b/docs/zh/groovyscript/minecraft/events/living_set_attack_target_event.md
new file mode 100644
index 0000000..b53746b
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_set_attack_target_event.md
@@ -0,0 +1,16 @@
+# LivingSetAttackTargetEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingSetAttackTargetEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.EntityLivingBase getTarget()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_spawn_event._allow_despawn.md b/docs/zh/groovyscript/minecraft/events/living_spawn_event._allow_despawn.md
new file mode 100644
index 0000000..a034830
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_spawn_event._allow_despawn.md
@@ -0,0 +1,16 @@
+# LivingSpawnEvent.AllowDespawn
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingSpawnEvent.AllowDespawn
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingSpawnEvent](living_spawn_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+boolean hasResult()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_spawn_event._check_spawn.md b/docs/zh/groovyscript/minecraft/events/living_spawn_event._check_spawn.md
new file mode 100644
index 0000000..7bb86ab
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_spawn_event._check_spawn.md
@@ -0,0 +1,24 @@
+# LivingSpawnEvent.CheckSpawn
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingSpawnEvent.CheckSpawn
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingSpawnEvent](living_spawn_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+boolean hasResult()
+```
+
+```groovy
+boolean isSpawner()
+```
+
+```groovy
+net.minecraft.tileentity.MobSpawnerBaseLogic getSpawner()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_spawn_event._special_spawn.md b/docs/zh/groovyscript/minecraft/events/living_spawn_event._special_spawn.md
new file mode 100644
index 0000000..812919e
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_spawn_event._special_spawn.md
@@ -0,0 +1,16 @@
+# LivingSpawnEvent.SpecialSpawn
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingSpawnEvent.SpecialSpawn
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingSpawnEvent](living_spawn_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.tileentity.MobSpawnerBaseLogic getSpawner()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/living_spawn_event.md b/docs/zh/groovyscript/minecraft/events/living_spawn_event.md
new file mode 100644
index 0000000..d11ad0d
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/living_spawn_event.md
@@ -0,0 +1,28 @@
+# LivingSpawnEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LivingSpawnEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+float getY()
+```
+
+```groovy
+float getX()
+```
+
+```groovy
+float getZ()
+```
+
+```groovy
+net.minecraft.world.World getWorld()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/loot_table_load_event.md b/docs/zh/groovyscript/minecraft/events/loot_table_load_event.md
new file mode 100644
index 0000000..6e56648
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/loot_table_load_event.md
@@ -0,0 +1,24 @@
+# LootTableLoadEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.LootTableLoadEvent
+```
+
+## Methods
+```groovy
+net.minecraft.util.ResourceLocation getName()
+```
+
+```groovy
+net.minecraft.world.storage.loot.LootTable getTable()
+```
+
+```groovy
+net.minecraft.world.storage.loot.LootTableManager getLootTableManager()
+```
+
+```groovy
+void setTable(net.minecraft.world.storage.loot.LootTable arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/looting_level_event.md b/docs/zh/groovyscript/minecraft/events/looting_level_event.md
new file mode 100644
index 0000000..545e893
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/looting_level_event.md
@@ -0,0 +1,24 @@
+# LootingLevelEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.LootingLevelEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.util.DamageSource getDamageSource()
+```
+
+```groovy
+void setLootingLevel(int arg0)
+```
+
+```groovy
+int getLootingLevel()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/merchant_trade_offers_event.md b/docs/zh/groovyscript/minecraft/events/merchant_trade_offers_event.md
new file mode 100644
index 0000000..e8bd465
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/merchant_trade_offers_event.md
@@ -0,0 +1,24 @@
+# MerchantTradeOffersEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.village.MerchantTradeOffersEvent
+```
+
+## Methods
+```groovy
+net.minecraft.entity.player.EntityPlayer getPlayer()
+```
+
+```groovy
+net.minecraft.village.MerchantRecipeList getList()
+```
+
+```groovy
+net.minecraft.entity.IMerchant getMerchant()
+```
+
+```groovy
+void setList(net.minecraft.village.MerchantRecipeList arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/minecart_collision_event.md b/docs/zh/groovyscript/minecraft/events/minecart_collision_event.md
new file mode 100644
index 0000000..2672035
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/minecart_collision_event.md
@@ -0,0 +1,16 @@
+# MinecartCollisionEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.minecart.MinecartCollisionEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[MinecartEvent](minecart_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.Entity getCollider()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/minecart_event.md b/docs/zh/groovyscript/minecraft/events/minecart_event.md
new file mode 100644
index 0000000..238ddd4
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/minecart_event.md
@@ -0,0 +1,16 @@
+# MinecartEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.minecart.MinecartEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.item.EntityMinecart getMinecart()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/minecart_interact_event.md b/docs/zh/groovyscript/minecraft/events/minecart_interact_event.md
new file mode 100644
index 0000000..49955cc
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/minecart_interact_event.md
@@ -0,0 +1,24 @@
+# MinecartInteractEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.minecart.MinecartInteractEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[MinecartEvent](minecart_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.item.ItemStack getItem()
+```
+
+```groovy
+net.minecraft.entity.player.EntityPlayer getPlayer()
+```
+
+```groovy
+net.minecraft.util.EnumHand getHand()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/minecart_update_event.md b/docs/zh/groovyscript/minecraft/events/minecart_update_event.md
new file mode 100644
index 0000000..8d9b497
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/minecart_update_event.md
@@ -0,0 +1,16 @@
+# MinecartUpdateEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.minecart.MinecartUpdateEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[MinecartEvent](minecart_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.util.math.BlockPos getPos()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/note_block_event._change.md b/docs/zh/groovyscript/minecraft/events/note_block_event._change.md
new file mode 100644
index 0000000..0502ede
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/note_block_event._change.md
@@ -0,0 +1,20 @@
+# NoteBlockEvent.Change
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.NoteBlockEvent.Change
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[NoteBlockEvent](note_block_event.md), [BlockEvent](block_event.md)
+
+## Methods
+```groovy
+net.minecraftforge.event.world.NoteBlockEvent$Note getOldNote()
+```
+
+```groovy
+net.minecraftforge.event.world.NoteBlockEvent$Octave getOldOctave()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/note_block_event._play.md b/docs/zh/groovyscript/minecraft/events/note_block_event._play.md
new file mode 100644
index 0000000..f92904d
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/note_block_event._play.md
@@ -0,0 +1,20 @@
+# NoteBlockEvent.Play
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.NoteBlockEvent.Play
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[NoteBlockEvent](note_block_event.md), [BlockEvent](block_event.md)
+
+## Methods
+```groovy
+net.minecraftforge.event.world.NoteBlockEvent$Instrument getInstrument()
+```
+
+```groovy
+void setInstrument(net.minecraftforge.event.world.NoteBlockEvent$Instrument arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/note_block_event.md b/docs/zh/groovyscript/minecraft/events/note_block_event.md
new file mode 100644
index 0000000..4605990
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/note_block_event.md
@@ -0,0 +1,28 @@
+# NoteBlockEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.NoteBlockEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[BlockEvent](block_event.md)
+
+## Methods
+```groovy
+net.minecraftforge.event.world.NoteBlockEvent$Note getNote()
+```
+
+```groovy
+net.minecraftforge.event.world.NoteBlockEvent$Octave getOctave()
+```
+
+```groovy
+int getVanillaNoteId()
+```
+
+```groovy
+void setNote(net.minecraftforge.event.world.NoteBlockEvent$Note arg0, net.minecraftforge.event.world.NoteBlockEvent$Octave arg1)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/ore_gen_event._generate_minable.md b/docs/zh/groovyscript/minecraft/events/ore_gen_event._generate_minable.md
new file mode 100644
index 0000000..8093800
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/ore_gen_event._generate_minable.md
@@ -0,0 +1,24 @@
+# OreGenEvent.GenerateMinable
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[OreGenEvent](ore_gen_event.md)
+
+## Methods
+```groovy
+net.minecraftforge.event.terraingen.OreGenEvent$GenerateMinable$EventType getType()
+```
+
+```groovy
+boolean hasResult()
+```
+
+```groovy
+net.minecraft.world.gen.feature.WorldGenerator getGenerator()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/ore_gen_event.md b/docs/zh/groovyscript/minecraft/events/ore_gen_event.md
new file mode 100644
index 0000000..8427399
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/ore_gen_event.md
@@ -0,0 +1,44 @@
+# OreGenEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.OreGenEvent
+```
+
+## Methods
+```groovy
+net.minecraft.util.math.BlockPos getPos()
+```
+
+```groovy
+net.minecraft.world.World getWorld()
+```
+
+```groovy
+java.util.Random getRand()
+```
+
+# OreGenEvent.Pre
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.OreGenEvent.Pre
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[OreGenEvent](ore_gen_event.md)
+
+## Methods
+# OreGenEvent.Post
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.OreGenEvent.Post
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[OreGenEvent](ore_gen_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/play_sound_at_entity_event.md b/docs/zh/groovyscript/minecraft/events/play_sound_at_entity_event.md
new file mode 100644
index 0000000..58395d9
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/play_sound_at_entity_event.md
@@ -0,0 +1,52 @@
+# PlaySoundAtEntityEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.PlaySoundAtEntityEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+void setCategory(net.minecraft.util.SoundCategory arg0)
+```
+
+```groovy
+net.minecraft.util.SoundCategory getCategory()
+```
+
+```groovy
+float getVolume()
+```
+
+```groovy
+net.minecraft.util.SoundEvent getSound()
+```
+
+```groovy
+float getPitch()
+```
+
+```groovy
+void setPitch(float arg0)
+```
+
+```groovy
+void setVolume(float arg0)
+```
+
+```groovy
+float getDefaultPitch()
+```
+
+```groovy
+void setSound(net.minecraft.util.SoundEvent arg0)
+```
+
+```groovy
+float getDefaultVolume()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_brewed_potion_event.md b/docs/zh/groovyscript/minecraft/events/player_brewed_potion_event.md
new file mode 100644
index 0000000..6dd7d1e
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_brewed_potion_event.md
@@ -0,0 +1,16 @@
+# PlayerBrewedPotionEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.brewing.PlayerBrewedPotionEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.item.ItemStack getStack()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_container_event._close.md b/docs/zh/groovyscript/minecraft/events/player_container_event._close.md
new file mode 100644
index 0000000..f7c02c2
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_container_event._close.md
@@ -0,0 +1,12 @@
+# PlayerContainerEvent.Close
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerContainerEvent.Close
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerContainerEvent](player_container_event.md), [PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/player_container_event._open.md b/docs/zh/groovyscript/minecraft/events/player_container_event._open.md
new file mode 100644
index 0000000..ae8fc04
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_container_event._open.md
@@ -0,0 +1,12 @@
+# PlayerContainerEvent.Open
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerContainerEvent.Open
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerContainerEvent](player_container_event.md), [PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/player_container_event.md b/docs/zh/groovyscript/minecraft/events/player_container_event.md
new file mode 100644
index 0000000..adcdad2
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_container_event.md
@@ -0,0 +1,16 @@
+# PlayerContainerEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerContainerEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.inventory.Container getContainer()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_destroy_item_event.md b/docs/zh/groovyscript/minecraft/events/player_destroy_item_event.md
new file mode 100644
index 0000000..54483fe
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_destroy_item_event.md
@@ -0,0 +1,20 @@
+# PlayerDestroyItemEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.util.EnumHand getHand()
+```
+
+```groovy
+net.minecraft.item.ItemStack getOriginal()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_drops_event.md b/docs/zh/groovyscript/minecraft/events/player_drops_event.md
new file mode 100644
index 0000000..38a4073
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_drops_event.md
@@ -0,0 +1,16 @@
+# PlayerDropsEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerDropsEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingDropsEvent](living_drops_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.player.EntityPlayer getEntityPlayer()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_event._break_speed.md b/docs/zh/groovyscript/minecraft/events/player_event._break_speed.md
new file mode 100644
index 0000000..3c2db83
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_event._break_speed.md
@@ -0,0 +1,32 @@
+# PlayerEvent.BreakSpeed
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerEvent.BreakSpeed
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.block.state.IBlockState getState()
+```
+
+```groovy
+net.minecraft.util.math.BlockPos getPos()
+```
+
+```groovy
+float getNewSpeed()
+```
+
+```groovy
+void setNewSpeed(float arg0)
+```
+
+```groovy
+float getOriginalSpeed()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_event._clone.md b/docs/zh/groovyscript/minecraft/events/player_event._clone.md
new file mode 100644
index 0000000..d16874a
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_event._clone.md
@@ -0,0 +1,20 @@
+# PlayerEvent.Clone
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerEvent.Clone
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.player.EntityPlayer getOriginal()
+```
+
+```groovy
+boolean isWasDeath()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_event._harvest_check.md b/docs/zh/groovyscript/minecraft/events/player_event._harvest_check.md
new file mode 100644
index 0000000..45ad509
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_event._harvest_check.md
@@ -0,0 +1,24 @@
+# PlayerEvent.HarvestCheck
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerEvent.HarvestCheck
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+boolean canHarvest()
+```
+
+```groovy
+net.minecraft.block.state.IBlockState getTargetBlock()
+```
+
+```groovy
+void setCanHarvest(boolean arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_event._load_from_file.md b/docs/zh/groovyscript/minecraft/events/player_event._load_from_file.md
new file mode 100644
index 0000000..b2e9c23
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_event._load_from_file.md
@@ -0,0 +1,24 @@
+# PlayerEvent.LoadFromFile
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerEvent.LoadFromFile
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+java.io.File getPlayerDirectory()
+```
+
+```groovy
+java.lang.String getPlayerUUID()
+```
+
+```groovy
+java.io.File getPlayerFile(java.lang.String arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_event._name_format.md b/docs/zh/groovyscript/minecraft/events/player_event._name_format.md
new file mode 100644
index 0000000..ca1411c
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_event._name_format.md
@@ -0,0 +1,24 @@
+# PlayerEvent.NameFormat
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerEvent.NameFormat
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+java.lang.String getUsername()
+```
+
+```groovy
+java.lang.String getDisplayname()
+```
+
+```groovy
+void setDisplayname(java.lang.String arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_event._save_to_file.md b/docs/zh/groovyscript/minecraft/events/player_event._save_to_file.md
new file mode 100644
index 0000000..6e81490
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_event._save_to_file.md
@@ -0,0 +1,24 @@
+# PlayerEvent.SaveToFile
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerEvent.SaveToFile
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+java.io.File getPlayerDirectory()
+```
+
+```groovy
+java.lang.String getPlayerUUID()
+```
+
+```groovy
+java.io.File getPlayerFile(java.lang.String arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_event._start_tracking.md b/docs/zh/groovyscript/minecraft/events/player_event._start_tracking.md
new file mode 100644
index 0000000..4942bd3
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_event._start_tracking.md
@@ -0,0 +1,16 @@
+# PlayerEvent.StartTracking
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerEvent.StartTracking
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.Entity getTarget()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_event._stop_tracking.md b/docs/zh/groovyscript/minecraft/events/player_event._stop_tracking.md
new file mode 100644
index 0000000..2d7fd96
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_event._stop_tracking.md
@@ -0,0 +1,16 @@
+# PlayerEvent.StopTracking
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerEvent.StopTracking
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.Entity getTarget()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_event._visibility.md b/docs/zh/groovyscript/minecraft/events/player_event._visibility.md
new file mode 100644
index 0000000..2a0f2af
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_event._visibility.md
@@ -0,0 +1,20 @@
+# PlayerEvent.Visibility
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerEvent.Visibility
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+double getVisibilityModifier()
+```
+
+```groovy
+void modifyVisibility(double arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_event.md b/docs/zh/groovyscript/minecraft/events/player_event.md
new file mode 100644
index 0000000..e800d25
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_event.md
@@ -0,0 +1,16 @@
+# PlayerEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.player.EntityPlayer getEntityPlayer()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_flyable_fall_event.md b/docs/zh/groovyscript/minecraft/events/player_flyable_fall_event.md
new file mode 100644
index 0000000..5cee069
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_flyable_fall_event.md
@@ -0,0 +1,28 @@
+# PlayerFlyableFallEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerFlyableFallEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+float getMultiplier()
+```
+
+```groovy
+void setMultiplier(float arg0)
+```
+
+```groovy
+void setDistance(float arg0)
+```
+
+```groovy
+float getDistance()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_interact_event._entity_interact.md b/docs/zh/groovyscript/minecraft/events/player_interact_event._entity_interact.md
new file mode 100644
index 0000000..65d7f39
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_interact_event._entity_interact.md
@@ -0,0 +1,16 @@
+# PlayerInteractEvent.EntityInteract
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteract
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerInteractEvent](player_interact_event.md), [PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.Entity getTarget()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_interact_event._entity_interact_specific.md b/docs/zh/groovyscript/minecraft/events/player_interact_event._entity_interact_specific.md
new file mode 100644
index 0000000..7901ffe
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_interact_event._entity_interact_specific.md
@@ -0,0 +1,20 @@
+# PlayerInteractEvent.EntityInteractSpecific
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteractSpecific
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerInteractEvent](player_interact_event.md), [PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.Entity getTarget()
+```
+
+```groovy
+net.minecraft.util.math.Vec3d getLocalPos()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_interact_event._left_click_block.md b/docs/zh/groovyscript/minecraft/events/player_interact_event._left_click_block.md
new file mode 100644
index 0000000..d0c9dc3
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_interact_event._left_click_block.md
@@ -0,0 +1,36 @@
+# PlayerInteractEvent.LeftClickBlock
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerInteractEvent.LeftClickBlock
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerInteractEvent](player_interact_event.md), [PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+void setCanceled(boolean arg0)
+```
+
+```groovy
+net.minecraftforge.fml.common.eventhandler.Event$Result getUseItem()
+```
+
+```groovy
+net.minecraft.util.math.Vec3d getHitVec()
+```
+
+```groovy
+net.minecraftforge.fml.common.eventhandler.Event$Result getUseBlock()
+```
+
+```groovy
+void setUseBlock(net.minecraftforge.fml.common.eventhandler.Event$Result arg0)
+```
+
+```groovy
+void setUseItem(net.minecraftforge.fml.common.eventhandler.Event$Result arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_interact_event._left_click_empty.md b/docs/zh/groovyscript/minecraft/events/player_interact_event._left_click_empty.md
new file mode 100644
index 0000000..dcb1fbc
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_interact_event._left_click_empty.md
@@ -0,0 +1,12 @@
+# PlayerInteractEvent.LeftClickEmpty
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerInteractEvent.LeftClickEmpty
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerInteractEvent](player_interact_event.md), [PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/player_interact_event._right_click_block.md b/docs/zh/groovyscript/minecraft/events/player_interact_event._right_click_block.md
new file mode 100644
index 0000000..a7d0035
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_interact_event._right_click_block.md
@@ -0,0 +1,36 @@
+# PlayerInteractEvent.RightClickBlock
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerInteractEvent](player_interact_event.md), [PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+void setCanceled(boolean arg0)
+```
+
+```groovy
+net.minecraftforge.fml.common.eventhandler.Event$Result getUseItem()
+```
+
+```groovy
+net.minecraft.util.math.Vec3d getHitVec()
+```
+
+```groovy
+net.minecraftforge.fml.common.eventhandler.Event$Result getUseBlock()
+```
+
+```groovy
+void setUseBlock(net.minecraftforge.fml.common.eventhandler.Event$Result arg0)
+```
+
+```groovy
+void setUseItem(net.minecraftforge.fml.common.eventhandler.Event$Result arg0)
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_interact_event._right_click_empty.md b/docs/zh/groovyscript/minecraft/events/player_interact_event._right_click_empty.md
new file mode 100644
index 0000000..eda9821
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_interact_event._right_click_empty.md
@@ -0,0 +1,12 @@
+# PlayerInteractEvent.RightClickEmpty
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickEmpty
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerInteractEvent](player_interact_event.md), [PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/player_interact_event._right_click_item.md b/docs/zh/groovyscript/minecraft/events/player_interact_event._right_click_item.md
new file mode 100644
index 0000000..6e17365
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_interact_event._right_click_item.md
@@ -0,0 +1,12 @@
+# PlayerInteractEvent.RightClickItem
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickItem
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerInteractEvent](player_interact_event.md), [PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/player_interact_event.md b/docs/zh/groovyscript/minecraft/events/player_interact_event.md
new file mode 100644
index 0000000..c282b75
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_interact_event.md
@@ -0,0 +1,44 @@
+# PlayerInteractEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerInteractEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraftforge.fml.relauncher.Side getSide()
+```
+
+```groovy
+net.minecraft.util.EnumHand getHand()
+```
+
+```groovy
+net.minecraft.util.math.BlockPos getPos()
+```
+
+```groovy
+net.minecraft.world.World getWorld()
+```
+
+```groovy
+net.minecraft.util.EnumActionResult getCancellationResult()
+```
+
+```groovy
+void setCancellationResult(net.minecraft.util.EnumActionResult arg0)
+```
+
+```groovy
+net.minecraft.item.ItemStack getItemStack()
+```
+
+```groovy
+net.minecraft.util.EnumFacing getFace()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_pickup_xp_event.md b/docs/zh/groovyscript/minecraft/events/player_pickup_xp_event.md
new file mode 100644
index 0000000..58f5db7
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_pickup_xp_event.md
@@ -0,0 +1,16 @@
+# PlayerPickupXpEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerPickupXpEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.item.EntityXPOrb getOrb()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_set_spawn_event.md b/docs/zh/groovyscript/minecraft/events/player_set_spawn_event.md
new file mode 100644
index 0000000..6d81ca3
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_set_spawn_event.md
@@ -0,0 +1,20 @@
+# PlayerSetSpawnEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerSetSpawnEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+boolean isForced()
+```
+
+```groovy
+net.minecraft.util.math.BlockPos getNewSpawn()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_sleep_in_bed_event.md b/docs/zh/groovyscript/minecraft/events/player_sleep_in_bed_event.md
new file mode 100644
index 0000000..d896037
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_sleep_in_bed_event.md
@@ -0,0 +1,24 @@
+# PlayerSleepInBedEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+void setResult(net.minecraft.entity.player.EntityPlayer$SleepResult arg0)
+```
+
+```groovy
+net.minecraft.util.math.BlockPos getPos()
+```
+
+```groovy
+net.minecraft.entity.player.EntityPlayer$SleepResult getResultStatus()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/player_wake_up_event.md b/docs/zh/groovyscript/minecraft/events/player_wake_up_event.md
new file mode 100644
index 0000000..086338b
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/player_wake_up_event.md
@@ -0,0 +1,24 @@
+# PlayerWakeUpEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.PlayerWakeUpEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+boolean wakeImmediately()
+```
+
+```groovy
+boolean shouldSetSpawn()
+```
+
+```groovy
+boolean updateWorld()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/populate_chunk_event._populate.md b/docs/zh/groovyscript/minecraft/events/populate_chunk_event._populate.md
new file mode 100644
index 0000000..7048d00
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/populate_chunk_event._populate.md
@@ -0,0 +1,20 @@
+# PopulateChunkEvent.Populate
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PopulateChunkEvent](populate_chunk_event.md), [ChunkGeneratorEvent](chunk_generator_event.md)
+
+## Methods
+```groovy
+net.minecraftforge.event.terraingen.PopulateChunkEvent$Populate$EventType getType()
+```
+
+```groovy
+boolean hasResult()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/populate_chunk_event.md b/docs/zh/groovyscript/minecraft/events/populate_chunk_event.md
new file mode 100644
index 0000000..963a6b6
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/populate_chunk_event.md
@@ -0,0 +1,56 @@
+# PopulateChunkEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.PopulateChunkEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ChunkGeneratorEvent](chunk_generator_event.md)
+
+## Methods
+```groovy
+boolean isHasVillageGenerated()
+```
+
+```groovy
+net.minecraft.world.World getWorld()
+```
+
+```groovy
+int getChunkZ()
+```
+
+```groovy
+int getChunkX()
+```
+
+```groovy
+java.util.Random getRand()
+```
+
+# PopulateChunkEvent.Pre
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.PopulateChunkEvent.Pre
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PopulateChunkEvent](populate_chunk_event.md), [ChunkGeneratorEvent](chunk_generator_event.md)
+
+## Methods
+# PopulateChunkEvent.Post
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.PopulateChunkEvent.Post
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PopulateChunkEvent](populate_chunk_event.md), [ChunkGeneratorEvent](chunk_generator_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/potion_brew_event.md b/docs/zh/groovyscript/minecraft/events/potion_brew_event.md
new file mode 100644
index 0000000..8929ad0
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/potion_brew_event.md
@@ -0,0 +1,44 @@
+# PotionBrewEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.brewing.PotionBrewEvent
+```
+
+## Methods
+```groovy
+int getLength()
+```
+
+```groovy
+net.minecraft.item.ItemStack getItem(int arg0)
+```
+
+```groovy
+void setItem(int arg0, net.minecraft.item.ItemStack arg1)
+```
+
+# PotionBrewEvent.Pre
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.brewing.PotionBrewEvent.Pre
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PotionBrewEvent](potion_brew_event.md)
+
+## Methods
+# PotionBrewEvent.Post
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.brewing.PotionBrewEvent.Post
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PotionBrewEvent](potion_brew_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/potion_color_calculation_event.md b/docs/zh/groovyscript/minecraft/events/potion_color_calculation_event.md
new file mode 100644
index 0000000..921c1bb
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/potion_color_calculation_event.md
@@ -0,0 +1,32 @@
+# PotionColorCalculationEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.PotionColorCalculationEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+void setColor(int arg0)
+```
+
+```groovy
+void shouldHideParticles(boolean arg0)
+```
+
+```groovy
+boolean areParticlesHidden()
+```
+
+```groovy
+int getColor()
+```
+
+```groovy
+java.util.Collection getEffects()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/potion_event._potion_added_event.md b/docs/zh/groovyscript/minecraft/events/potion_event._potion_added_event.md
new file mode 100644
index 0000000..836df33
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/potion_event._potion_added_event.md
@@ -0,0 +1,20 @@
+# PotionEvent.PotionAddedEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.PotionEvent.PotionAddedEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PotionEvent](potion_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.potion.PotionEffect getOldPotionEffect()
+```
+
+```groovy
+net.minecraft.potion.PotionEffect getPotionEffect()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/potion_event._potion_applicable_event.md b/docs/zh/groovyscript/minecraft/events/potion_event._potion_applicable_event.md
new file mode 100644
index 0000000..f5a83d4
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/potion_event._potion_applicable_event.md
@@ -0,0 +1,20 @@
+# PotionEvent.PotionApplicableEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.PotionEvent.PotionApplicableEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PotionEvent](potion_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+boolean hasResult()
+```
+
+```groovy
+net.minecraft.potion.PotionEffect getPotionEffect()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/potion_event._potion_expiry_event.md b/docs/zh/groovyscript/minecraft/events/potion_event._potion_expiry_event.md
new file mode 100644
index 0000000..8758777
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/potion_event._potion_expiry_event.md
@@ -0,0 +1,12 @@
+# PotionEvent.PotionExpiryEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.PotionEvent.PotionExpiryEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PotionEvent](potion_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/potion_event._potion_remove_event.md b/docs/zh/groovyscript/minecraft/events/potion_event._potion_remove_event.md
new file mode 100644
index 0000000..f6e27d8
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/potion_event._potion_remove_event.md
@@ -0,0 +1,20 @@
+# PotionEvent.PotionRemoveEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.PotionEvent.PotionRemoveEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PotionEvent](potion_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.potion.Potion getPotion()
+```
+
+```groovy
+net.minecraft.potion.PotionEffect getPotionEffect()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/potion_event.md b/docs/zh/groovyscript/minecraft/events/potion_event.md
new file mode 100644
index 0000000..d5fde97
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/potion_event.md
@@ -0,0 +1,16 @@
+# PotionEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.PotionEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.potion.PotionEffect getPotionEffect()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/projectile_impact_event._arrow.md b/docs/zh/groovyscript/minecraft/events/projectile_impact_event._arrow.md
new file mode 100644
index 0000000..a79fe20
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/projectile_impact_event._arrow.md
@@ -0,0 +1,16 @@
+# ProjectileImpactEvent.Arrow
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.ProjectileImpactEvent.Arrow
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ProjectileImpactEvent](projectile_impact_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.projectile.EntityArrow getArrow()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/projectile_impact_event._fireball.md b/docs/zh/groovyscript/minecraft/events/projectile_impact_event._fireball.md
new file mode 100644
index 0000000..a7b6982
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/projectile_impact_event._fireball.md
@@ -0,0 +1,16 @@
+# ProjectileImpactEvent.Fireball
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.ProjectileImpactEvent.Fireball
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ProjectileImpactEvent](projectile_impact_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.projectile.EntityFireball getFireball()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/projectile_impact_event._throwable.md b/docs/zh/groovyscript/minecraft/events/projectile_impact_event._throwable.md
new file mode 100644
index 0000000..9c5c299
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/projectile_impact_event._throwable.md
@@ -0,0 +1,16 @@
+# ProjectileImpactEvent.Throwable
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.ProjectileImpactEvent.Throwable
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ProjectileImpactEvent](projectile_impact_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.projectile.EntityThrowable getThrowable()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/projectile_impact_event.md b/docs/zh/groovyscript/minecraft/events/projectile_impact_event.md
new file mode 100644
index 0000000..4fa4ce2
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/projectile_impact_event.md
@@ -0,0 +1,16 @@
+# ProjectileImpactEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.ProjectileImpactEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.util.math.RayTraceResult getRayTraceResult()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/registry_event._missing_mappings.md b/docs/zh/groovyscript/minecraft/events/registry_event._missing_mappings.md
new file mode 100644
index 0000000..c4adfc3
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/registry_event._missing_mappings.md
@@ -0,0 +1,32 @@
+# RegistryEvent.MissingMappings
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.RegistryEvent.MissingMappings
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[RegistryEvent](registry_event.md), [GenericEvent](generic_event.md)
+
+## Methods
+```groovy
+net.minecraft.util.ResourceLocation getName()
+```
+
+```groovy
+net.minecraftforge.registries.IForgeRegistry getRegistry()
+```
+
+```groovy
+void setModContainer(net.minecraftforge.fml.common.ModContainer arg0)
+```
+
+```groovy
+com.google.common.collect.ImmutableList getAllMappings()
+```
+
+```groovy
+com.google.common.collect.ImmutableList getMappings()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/registry_event._new_registry.md b/docs/zh/groovyscript/minecraft/events/registry_event._new_registry.md
new file mode 100644
index 0000000..936a351
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/registry_event._new_registry.md
@@ -0,0 +1,8 @@
+# RegistryEvent.NewRegistry
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.RegistryEvent.NewRegistry
+```
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/registry_event._register.md b/docs/zh/groovyscript/minecraft/events/registry_event._register.md
new file mode 100644
index 0000000..e784dcc
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/registry_event._register.md
@@ -0,0 +1,20 @@
+# RegistryEvent.Register
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.RegistryEvent.Register
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[RegistryEvent](registry_event.md), [GenericEvent](generic_event.md)
+
+## Methods
+```groovy
+net.minecraft.util.ResourceLocation getName()
+```
+
+```groovy
+net.minecraftforge.registries.IForgeRegistry getRegistry()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/registry_event.md b/docs/zh/groovyscript/minecraft/events/registry_event.md
new file mode 100644
index 0000000..eaf0c75
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/registry_event.md
@@ -0,0 +1,12 @@
+# RegistryEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.RegistryEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[GenericEvent](generic_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/sapling_grow_tree_event.md b/docs/zh/groovyscript/minecraft/events/sapling_grow_tree_event.md
new file mode 100644
index 0000000..765c35e
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/sapling_grow_tree_event.md
@@ -0,0 +1,24 @@
+# SaplingGrowTreeEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.SaplingGrowTreeEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[WorldEvent](world_event.md)
+
+## Methods
+```groovy
+boolean hasResult()
+```
+
+```groovy
+net.minecraft.util.math.BlockPos getPos()
+```
+
+```groovy
+java.util.Random getRand()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/server_chat_event.md b/docs/zh/groovyscript/minecraft/events/server_chat_event.md
new file mode 100644
index 0000000..43000ac
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/server_chat_event.md
@@ -0,0 +1,28 @@
+# ServerChatEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.ServerChatEvent
+```
+
+## Methods
+```groovy
+java.lang.String getMessage()
+```
+
+```groovy
+net.minecraft.util.text.ITextComponent getComponent()
+```
+
+```groovy
+net.minecraft.entity.player.EntityPlayerMP getPlayer()
+```
+
+```groovy
+void setComponent(net.minecraft.util.text.ITextComponent arg0)
+```
+
+```groovy
+java.lang.String getUsername()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/sleeping_location_check_event.md b/docs/zh/groovyscript/minecraft/events/sleeping_location_check_event.md
new file mode 100644
index 0000000..f914983
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/sleeping_location_check_event.md
@@ -0,0 +1,20 @@
+# SleepingLocationCheckEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.SleepingLocationCheckEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+boolean hasResult()
+```
+
+```groovy
+net.minecraft.util.math.BlockPos getSleepingLocation()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/sleeping_time_check_event.md b/docs/zh/groovyscript/minecraft/events/sleeping_time_check_event.md
new file mode 100644
index 0000000..edd2fac
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/sleeping_time_check_event.md
@@ -0,0 +1,20 @@
+# SleepingTimeCheckEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.SleepingTimeCheckEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+boolean hasResult()
+```
+
+```groovy
+net.minecraft.util.math.BlockPos getSleepingLocation()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/throwable_impact_event.md b/docs/zh/groovyscript/minecraft/events/throwable_impact_event.md
new file mode 100644
index 0000000..58d0651
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/throwable_impact_event.md
@@ -0,0 +1,20 @@
+# ThrowableImpactEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.ThrowableImpactEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.projectile.EntityThrowable getEntityThrowable()
+```
+
+```groovy
+net.minecraft.util.math.RayTraceResult getRayTraceResult()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/use_hoe_event.md b/docs/zh/groovyscript/minecraft/events/use_hoe_event.md
new file mode 100644
index 0000000..ffd4f0f
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/use_hoe_event.md
@@ -0,0 +1,28 @@
+# UseHoeEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.player.UseHoeEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[PlayerEvent](player_event.md), [LivingEvent](living_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+boolean hasResult()
+```
+
+```groovy
+net.minecraft.util.math.BlockPos getPos()
+```
+
+```groovy
+net.minecraft.world.World getWorld()
+```
+
+```groovy
+net.minecraft.item.ItemStack getCurrent()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/village_siege_event.md b/docs/zh/groovyscript/minecraft/events/village_siege_event.md
new file mode 100644
index 0000000..14686e9
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/village_siege_event.md
@@ -0,0 +1,28 @@
+# VillageSiegeEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.village.VillageSiegeEvent
+```
+
+## Methods
+```groovy
+net.minecraft.village.Village getVillage()
+```
+
+```groovy
+net.minecraft.village.VillageSiege getSiege()
+```
+
+```groovy
+net.minecraft.util.math.Vec3d getAttemptedSpawnPos()
+```
+
+```groovy
+net.minecraft.entity.player.EntityPlayer getPlayer()
+```
+
+```groovy
+net.minecraft.world.World getWorld()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/world_event._create_spawn_position.md b/docs/zh/groovyscript/minecraft/events/world_event._create_spawn_position.md
new file mode 100644
index 0000000..1a5b1c9
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/world_event._create_spawn_position.md
@@ -0,0 +1,16 @@
+# WorldEvent.CreateSpawnPosition
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.WorldEvent.CreateSpawnPosition
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[WorldEvent](world_event.md)
+
+## Methods
+```groovy
+net.minecraft.world.WorldSettings getSettings()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/world_event._load.md b/docs/zh/groovyscript/minecraft/events/world_event._load.md
new file mode 100644
index 0000000..6853711
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/world_event._load.md
@@ -0,0 +1,12 @@
+# WorldEvent.Load
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.WorldEvent.Load
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[WorldEvent](world_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/world_event._potential_spawns.md b/docs/zh/groovyscript/minecraft/events/world_event._potential_spawns.md
new file mode 100644
index 0000000..91218eb
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/world_event._potential_spawns.md
@@ -0,0 +1,24 @@
+# WorldEvent.PotentialSpawns
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.WorldEvent.PotentialSpawns
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[WorldEvent](world_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.EnumCreatureType getType()
+```
+
+```groovy
+net.minecraft.util.math.BlockPos getPos()
+```
+
+```groovy
+java.util.List getList()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/world_event._save.md b/docs/zh/groovyscript/minecraft/events/world_event._save.md
new file mode 100644
index 0000000..928587d
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/world_event._save.md
@@ -0,0 +1,12 @@
+# WorldEvent.Save
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.WorldEvent.Save
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[WorldEvent](world_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/world_event._unload.md b/docs/zh/groovyscript/minecraft/events/world_event._unload.md
new file mode 100644
index 0000000..77edbd2
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/world_event._unload.md
@@ -0,0 +1,12 @@
+# WorldEvent.Unload
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.WorldEvent.Unload
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[WorldEvent](world_event.md)
+
+## Methods
diff --git a/docs/zh/groovyscript/minecraft/events/world_event.md b/docs/zh/groovyscript/minecraft/events/world_event.md
new file mode 100644
index 0000000..2693107
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/world_event.md
@@ -0,0 +1,12 @@
+# WorldEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.world.WorldEvent
+```
+
+## Methods
+```groovy
+net.minecraft.world.World getWorld()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/world_type_event._biome_size.md b/docs/zh/groovyscript/minecraft/events/world_type_event._biome_size.md
new file mode 100644
index 0000000..fb04c12
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/world_type_event._biome_size.md
@@ -0,0 +1,24 @@
+# WorldTypeEvent.BiomeSize
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.WorldTypeEvent.BiomeSize
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[WorldTypeEvent](world_type_event.md)
+
+## Methods
+```groovy
+int getOriginalSize()
+```
+
+```groovy
+void setNewSize(int arg0)
+```
+
+```groovy
+int getNewSize()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/world_type_event._init_biome_gens.md b/docs/zh/groovyscript/minecraft/events/world_type_event._init_biome_gens.md
new file mode 100644
index 0000000..e8a516a
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/world_type_event._init_biome_gens.md
@@ -0,0 +1,28 @@
+# WorldTypeEvent.InitBiomeGens
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.WorldTypeEvent.InitBiomeGens
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[WorldTypeEvent](world_type_event.md)
+
+## Methods
+```groovy
+long getSeed()
+```
+
+```groovy
+void setNewBiomeGens([Lnet.minecraft.world.gen.layer.GenLayer; arg0)
+```
+
+```groovy
+[Lnet.minecraft.world.gen.layer.GenLayer; getNewBiomeGens()
+```
+
+```groovy
+[Lnet.minecraft.world.gen.layer.GenLayer; getOriginalBiomeGens()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/world_type_event.md b/docs/zh/groovyscript/minecraft/events/world_type_event.md
new file mode 100644
index 0000000..42d2c4c
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/world_type_event.md
@@ -0,0 +1,12 @@
+# WorldTypeEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.terraingen.WorldTypeEvent
+```
+
+## Methods
+```groovy
+net.minecraft.world.WorldType getWorldType()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/zombie_event._summon_aid_event.md b/docs/zh/groovyscript/minecraft/events/zombie_event._summon_aid_event.md
new file mode 100644
index 0000000..7325fb2
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/zombie_event._summon_aid_event.md
@@ -0,0 +1,48 @@
+# ZombieEvent.SummonAidEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.ZombieEvent.SummonAidEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[ZombieEvent](zombie_event.md), [EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+int getY()
+```
+
+```groovy
+int getX()
+```
+
+```groovy
+boolean hasResult()
+```
+
+```groovy
+void setCustomSummonedAid(net.minecraft.entity.monster.EntityZombie arg0)
+```
+
+```groovy
+net.minecraft.entity.monster.EntityZombie getCustomSummonedAid()
+```
+
+```groovy
+int getZ()
+```
+
+```groovy
+net.minecraft.world.World getWorld()
+```
+
+```groovy
+double getSummonChance()
+```
+
+```groovy
+net.minecraft.entity.EntityLivingBase getAttacker()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/events/zombie_event.md b/docs/zh/groovyscript/minecraft/events/zombie_event.md
new file mode 100644
index 0000000..d5a8de9
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/events/zombie_event.md
@@ -0,0 +1,16 @@
+# ZombieEvent
+
+To use this event use the following import:
+```groovy
+import net.minecraftforge.event.entity.living.ZombieEvent
+```
+
+## Sub-Classes
+This event extends the following events and can use all their methods and fields:
+[EntityEvent](entity_event.md)
+
+## Methods
+```groovy
+net.minecraft.entity.monster.EntityZombie getSummoner()
+```
+
diff --git a/docs/zh/groovyscript/minecraft/furnace.md b/docs/zh/groovyscript/minecraft/furnace.md
new file mode 100644
index 0000000..a0d0cf1
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/furnace.md
@@ -0,0 +1,26 @@
+# Minecraft Furnace
+
+## Adding Recipes
+Unlike other recipe types, furnace smelting does not use a recipe builder.
+
+```groovy
+furnace.add(IIngredient input, ItemStack output) // applies a default exp of 0.1
+furnace.add(IIngredient input, ItemStack output, float exp)
+```
+
+### Example
+```groovy
+// smelt 1 dirt to produce one cobblestone and 0.5 exp
+furnace.add(item('minecraft:dirt'), item('minecraft:cobblestone'), 0.5f)
+```
+
+## Removing Recipes:
+```groovy
+furnace.removeByInput(ItemStack input)
+```
+
+### Example
+```groovy
+// removes all recipes that input iron ore
+furnace.removeByInput(item('minecraft:iron_ore'))
+```
diff --git a/docs/zh/groovyscript/minecraft/item.md b/docs/zh/groovyscript/minecraft/item.md
new file mode 100644
index 0000000..b96975f
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/item.md
@@ -0,0 +1,61 @@
+# Items
+Item stacks can be obtained with the item bracket handler.
+````groovy
+def iron_ingot = item('minecraft:iron_ingot', 4) * 6
+````
+
+The 4 inside the () is the metadata. Iron ingot doesn't have any sub items so it will result in an item that doesn't actually exist.
+The `* 6` at the end marks the amount. The item id `'minecraft:iron_ingot'` is a string and can be replaced by anything that makes a string.
+The following also returns a iron ingot.
+````groovy
+def iron_ingot = 'iron_ingot'
+item("minecraft:$iron_ingot")
+````
+
+## NBT
+Nbt data is minecraft data format used for items and world saving. Adding a nbt tag is easy.
+````groovy
+itemStack.withNbt(Map map)
+````
+Now this looks complicated, but it isn't.
+````groovy
+item('minecraft:iron_ingot').withNbt([Name: 'Epic Ingot'])
+````
+### More
+- `.withNbt(null)` removes the nbt tag
+- `.withEmptyNbt()` adds an empty nbt tag
+
+## Match Conditions
+This allows for dynamic item checking in recipes.
+!!! Note
+ At this moment (ver. 0.3.1) only crafting and Draconic Evolution fusion crafting is supported.
+
+````groovy
+itemStack.when(Closure condition)
+````
+!!! Example
+ ````groovy
+ item('minecraft:iron_axe:*').when({stack -> stack.getDamage() < 50})
+ ````
+Let's see what this does. First `item('minecraft:iron_axe:*')` matches an iron axe with any damage.
+Then `.when({stack -> stack.getDamage() < 50})` only validates items that have taken less than 50 damage.
+
+## Transformer
+This transforms an item ingredient to a new item on craft. For example a water bucket returns an empty bucket after crafting.
+!!! Note
+ This only works for crafting.
+
+````groovy
+itemStack.transform(Closure transformer)
+````
+!!! Example
+ ````groovy
+ def transformer = { stack -> stack.copyWithDamage(stack.getDamage() + 1)}
+ item('minecraft:iron_axe:*').transform(transformer)
+ ````
+First we create a transformer closure, so we can easier see what's going on. It simply creates a new item with one more damage.
+In the second line that transformer is applied to the item. So at the end when you craft a recipe with that iron axe it will get damaged by 1.
+
+### Default Transformer
+- `.noreturn()` will not return anything. Useful when you want to consume a water bucket with the bucket for example.
+- `.reuse()` will return itself. That means the item will not be consumed.
\ No newline at end of file
diff --git a/docs/zh/groovyscript/minecraft/ore_dictionary.md b/docs/zh/groovyscript/minecraft/ore_dictionary.md
new file mode 100644
index 0000000..b20400a
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/ore_dictionary.md
@@ -0,0 +1,53 @@
+# Ore Dictionary
+!!! Note
+ Requires version 0.3.0+
+ GroovyScript also allows you to remove and add ore dictionaries to items and reload them.
+
+## Adding ore dicts
+
+All three methods are do exactly the same thing.
+```groovy
+oreDict.add("amogus", item('minecraft:iron_ingot'))
+
+item('minecraft:iron_ingot').addOreDict(ore('amogus'))
+
+ore('amogus').add(item('minecraft:iron_ingot'))
+```
+
+## Removing ore dicts
+
+All three methods are do exactly the same thing.
+````groovy
+oreDict.remove("ingotIron", item('minecraft:iron_ingot'))
+
+item('minecraft:iron_ingot').removeOreDict(ore('ingotIron'))
+
+ore('ingotIron').remove(item('minecraft:iron_ingot'))
+````
+
+## Other
+You can get all items from an ore dict.
+Both ways do the same thing.
+````groovy
+oreDict.getItems('ingotIron')
+oreDict['ingotIron']
+````
+
+Checking if an item is in an ore dictionary
+````groovy
+item('minecraft:iron_ingot') in ore('ingotIron') // returns true
+````
+
+Getting the first item from an ore dictionary
+````groovy
+ore('ingotIron').first
+ore('ingotIron')[0]
+````
+
+Iterating over all items in an ore dictionary
+````groovy
+for (def ironIngot : ore('ingotIron')) {
+ ...
+}
+````
+
diff --git a/docs/zh/groovyscript/minecraft/tooltip.md b/docs/zh/groovyscript/minecraft/tooltip.md
new file mode 100644
index 0000000..9eee775
--- /dev/null
+++ b/docs/zh/groovyscript/minecraft/tooltip.md
@@ -0,0 +1,23 @@
+# Item Tooltips
+
+There is not a simple way to add tooltips. However, you can use the event system to modify any tooltip in any way you
+want.
+See [ItemTooltipEvent](events/item_tooltip_event.md).
+
+## Adding lines
+
+This is the simplest way to add tooltips to a specific item. Note that this would ignore nbt data. Also, you can add
+tooltips for multiple items inside the event. You don't need to call listen for the same event multiple times.
+
+````groovy
+import net.minecraftforge.event.entity.player.ItemTooltipEvent
+
+event_manager.listen { ItemTooltipEvent event ->
+ if (ItemStack.areItemsEqual(event.getItemStack(), item('minecraft:diamond'))) {
+ event.getToolTip().add('Epic diamond tooltip')
+ }
+}
+````
+
+If your familiar with [lists](../../groovy/lists.md) you can modify the tooltip lines as you like
+since `event.getToolTip()` returns a `List`.
\ No newline at end of file
diff --git a/docs/zh/groovyscript/mods/bloodmagic/alchemy_array.md b/docs/zh/groovyscript/mods/bloodmagic/alchemy_array.md
new file mode 100644
index 0000000..b8e5129
--- /dev/null
+++ b/docs/zh/groovyscript/mods/bloodmagic/alchemy_array.md
@@ -0,0 +1,104 @@
+# Blood Magic Alchemy Array
+
+Package:
+```groovy
+mods.bloodmagic.AlchemyArray
+```
+
+!!! Note
+ An Alchemy Array is created in-world via Right Clicking Arcane Ashes on the ground.
+ Right Clicking first the input and then the catalyst on the Arcane Ashes will cause an animation, ending with the item being spawned in-world.
+
+## Adding Recipes
+Just like other recipe types, the Alchemy Array also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+```groovy
+mods.bloodmagic.AlchemyArray.recipeBuilder()
+```
+
+Adding inputs: (requires exactly 1)
+```groovy
+.input(IIngredient)
+.input(IIngredient...)
+.input(Collection)
+```
+
+Setting catalyst item: (required exactly 1)
+```groovy
+.catalyst(IIngredient)
+```
+
+Setting the texture location: (option (default WIP))
+```groovy
+.texture(String)
+.texture(ResourceLocation)
+```
+
+Adding output: (requires exactly 1)
+```groovy
+.output(ItemStack)
+```
+
+Register recipe: (returns `WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray`)
+```groovy
+.register()
+```
+
+### Example
+```groovy
+mods.bloodmagic.AlchemyArray.recipeBuilder()
+ .input(item("minecraft:diamond"))
+ .catalyst(item("bloodmagic:slate:1"))
+ .output(item("minecraft:gold_ingot"))
+ .register()
+
+mods.bloodmagic.AlchemyArray.recipeBuilder()
+ .input(item("minecraft:clay"))
+ .catalyst(item("minecraft:gold_ingot"))
+ .output(item("minecraft:diamond"))
+ .texture("bloodmagic:textures/models/AlchemyArrays/LightSigil.png")
+ .register()
+```
+
+## Removing Recipes
+
+This removes ALL recipes that match the given input:
+```groovy
+mods.bloodmagic.AlchemyArray.removeByInput(IIngredient)
+```
+
+This removes ALL recipes that match the given catalyst:
+```groovy
+mods.bloodmagic.AlchemyArray.removeByCatalyst(IIngredient)
+```
+
+This removes ALL recipes that match both the given input and catalyst:
+```groovy
+mods.bloodmagic.AlchemyArray.removeByInputAndCatalyst(IIngredient input, IIngredient catalyst)
+```
+
+This removes ALL recipes that match the given output:
+```groovy
+mods.bloodmagic.AlchemyArray.removeByOutput(ItemStack)
+```
+
+Removes all registed Alchemy Array recipes:
+```groovy
+mods.bloodmagic.AlchemyArray.removeAll()
+```
+
+### Example
+```groovy
+// Removes all recipes that have an input of Haste Reagent. (1)
+mods.bloodmagic.AlchemyArray.removeByInput(item("bloodmagic:component:13"))
+// Removes all recipes that have the target catalyst item. (2)
+mods.bloodmagic.AlchemyArray.removeByCatalyst(item("bloodmagic:slate:2"))
+// Removes all recipes that have both the target input and catalyst items. (3)
+mods.bloodmagic.AlchemyArray.removeByInputAndCatalyst(item("bloodmagic:component:7"), item("bloodmagic:slate:1"))
+// Removes all recipes that output the Sigil of the Void.
+mods.bloodmagic.AlchemyArray.removeByOutput(item("bloodmagic:sigil_void"))
+```
+
+1. This would remove the recipe for the Sigil of Haste.
+2. This would remove the recipe for the Sigil of the Claw, Elemental Affinity, Magnetism, Blood Lamp, and Holding.
+3. This would remove the recipe for the Seer's Sigil.
diff --git a/docs/zh/groovyscript/mods/bloodmagic/alchemy_table.md b/docs/zh/groovyscript/mods/bloodmagic/alchemy_table.md
new file mode 100644
index 0000000..968bb21
--- /dev/null
+++ b/docs/zh/groovyscript/mods/bloodmagic/alchemy_table.md
@@ -0,0 +1,105 @@
+# Blood Magic Alchemy Table
+
+Package:
+```groovy
+mods.bloodmagic.AlchemyTable
+```
+
+!!! Note
+ The Alchemy Table requires a Blood Orb linked to a player inside it to function.
+ It consumes Life Essence from the bound player's Life Network to craft.
+ !!! Danger ""
+ Tier 6 must be enabled in the config to use a Blood Orb of that tier.
+
+## Adding Recipes
+Just like other recipe types, the Alchemy Table also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+```groovy
+mods.bloodmagic.AlchemyTable.recipeBuilder()
+```
+
+Adding inputs: (requires 1-6)
+```groovy
+.input(IIngredient)
+.input(IIngredient...)
+.input(Collection)
+```
+
+Setting cost in Life Essence taken from the owner of the orb: (optional (default is 0))
+```groovy
+.syphon(int)
+.drain(int)
+```
+
+Setting the time in ticks the recipe takes: (required)
+```groovy
+.ticks(int)
+.time(int)
+```
+
+Setting the minimum tier of Blood Orb: (required)
+```groovy
+.minimumTier(int)
+.tier(int)
+```
+
+Adding output: (requires exactly 1)
+```groovy
+.output(ItemStack)
+```
+
+Register recipe: (returns `WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyTable`)
+```groovy
+.register()
+```
+
+### Example
+```groovy
+mods.bloodmagic.AlchemyTable.recipeBuilder()
+ .input(item("minecraft:diamond"), item("minecraft:diamond"))
+ .output(item("minecraft:clay"))
+ .ticks(100)
+ .minimumTier(2)
+ .syphon(500)
+ .register()
+
+mods.bloodmagic.AlchemyTable.recipeBuilder()
+ .input(item("minecraft:diamond"), item("minecraft:diamond"), item("minecraft:gold_ingot"),
+ item("minecraft:gold_ingot"), item("bloodmagic:slate"), item("bloodmagic:slate"))
+ .output(item("minecraft:clay"))
+ .time(2000)
+ .tier(5)
+ .drain(25000)
+ .register()
+```
+
+## Removing Recipes
+
+This removes ALL recipes which have all input ingredients[^1]:
+```groovy
+mods.bloodmagic.AlchemyTable.removeByInput(NonNullList)
+mods.bloodmagic.AlchemyTable.removeByInput(IIngredient...)
+```
+
+This removes ALL recipes that match the given output:
+```groovy
+mods.bloodmagic.AlchemyTable.removeByOutput(ItemStack)
+```
+
+Removes all registed Alchemy Table recipes:
+```groovy
+mods.bloodmagic.AlchemyTable.removeAll()
+```
+
+### Example
+```groovy
+// Removes all recipes that have inputs including both Nether Wart and Gunpowder. (1)
+mods.bloodmagic.AlchemyTable.removeByInput(item("minecraft:nether_wart"), item("minecraft:gunpowder"))
+// Removes all recipes that output Sand.
+mods.bloodmagic.AlchemyTable.removeByOutput(item("minecraft:sand"))
+```
+
+1. This would remove the recipes for both Simple Power Catalyst and Simple Lengthening Catalysts.
+
+
+[^1]: Note that a recipe with inputs "ABCD" would match with a target containing only "AB".
diff --git a/docs/zh/groovyscript/mods/bloodmagic/blood_altar.md b/docs/zh/groovyscript/mods/bloodmagic/blood_altar.md
new file mode 100644
index 0000000..17e6247
--- /dev/null
+++ b/docs/zh/groovyscript/mods/bloodmagic/blood_altar.md
@@ -0,0 +1,105 @@
+# Blood Magic Blood Altar
+
+Package:
+```groovy
+mods.bloodmagic.BloodAltar
+```
+
+!!! Note
+ The Blood Altar consumes Life Essence from its internal tank to convert the input item into the output item.
+ Each tier requires a larger multiblock, which may contain Runes that modify the Blood Altar's functionality.
+ !!! Danger ""
+ Tier 6 must be enabled in the config to use a Blood Altar of that tier.
+
+## Adding Recipes
+Just like other recipe types, the Blood Altar also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+```groovy
+mods.bloodmagic.BloodAltar.recipeBuilder()
+```
+
+Adding inputs: (requires exactly 1)
+```groovy
+.input(IIngredient)
+.input(IIngredient...)
+.input(Collection)
+```
+
+Setting the minimum tier required: (optional (default is 0))
+```groovy
+.minimumTier(int)
+.tier(int)
+```
+
+Setting the required amount of Life Essence: (optional (default is 0))
+```groovy
+.syphon(int)
+```
+
+Setting the base rate the craft consumes Life Essence from the Blood Altar: (optional (default is 0))
+```groovy
+.consumeRate(int)
+```
+
+Setting the base rate the craft loses progress when the Blood Altar does not have enough Life Essence: (optional (default is 0))
+```groovy
+.drainRate(int)
+```
+
+Adding output: (requires exactly 1)
+```groovy
+.output(ItemStack)
+```
+
+Register recipe: (returns `WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar`)
+```groovy
+.register()
+```
+
+### Example
+```groovy
+mods.bloodmagic.BloodAltar.recipeBuilder()
+ .input(item("minecraft:clay"))
+ .output(item("minecraft:gold_ingot"))
+ .tier(0)
+ .drainRate(5)
+ .syphon(10)
+ .consumeRate(5)
+ .register()
+
+mods.bloodmagic.BloodAltar.recipeBuilder()
+ .input(item("minecraft:gold_ingot"))
+ .output(item("minecraft:diamond"))
+ .minimumTier(3)
+ .drainRate(100)
+ .syphon(50000)
+ .consumeRate(500)
+ .register()
+```
+
+## Removing Recipes
+
+This removes ALL recipes that match the given input:
+```groovy
+mods.bloodmagic.BloodAltar.removeByInput(IIngredient)
+```
+
+This removes ALL recipes that match the given output:
+```groovy
+mods.bloodmagic.BloodAltar.removeByOutput(ItemStack)
+```
+
+Removes all registed Blood Altar recipes:
+```groovy
+mods.bloodmagic.BloodAltar.removeAll()
+```
+
+### Example
+```groovy
+// Removes all recipes that have have Ender Pearl as their input. (1)
+mods.bloodmagic.BloodAltar.removeByInput(item("minecraft:ender_pearl"))
+// Removes all recipes that output Ethereal Slates.
+mods.bloodmagic.BloodAltar.removeByOutput(item("bloodmagic:slate:4"))
+```
+
+1. This would remove the recipe for the Teleposition Focus.
diff --git a/docs/zh/groovyscript/mods/bloodmagic/meteor.md b/docs/zh/groovyscript/mods/bloodmagic/meteor.md
new file mode 100644
index 0000000..e561a92
--- /dev/null
+++ b/docs/zh/groovyscript/mods/bloodmagic/meteor.md
@@ -0,0 +1,93 @@
+# Blood Magic Meteor Ritual
+
+Package:
+```groovy
+mods.bloodmagic.Meteor
+```
+
+!!! Note
+ Meteors are created via activating a `Mark of the Falling Tower` Ritual, tossing a catalyst item onto the Master
+ Ritual Stone, and having enough Life Essence within the activator's Blood Network to pay the cost.
+
+
+## Adding Meteors
+Just like other recipe types, the Meteor also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+```groovy
+mods.bloodmagic.Meteor.recipeBuilder()
+```
+
+Adding the catalyst: (requires exactly 1)
+```groovy
+.catalystStack(ItemStack)
+.catalyst(ItemStack)
+```
+
+Adding meteor components: (requires one or more)
+```groovy
+.component(int weight, String ore) // The string name of the oredict.
+.component(String ore, int weight) // weight and ore can be in either order.
+.component(int weight, OreDictIngredient ore)
+.component(OreDictIngredient ore, int weight)
+```
+
+Setting Explosion Strength: (optional (default is 0))
+```groovy
+.explosionStrength(float)
+```
+
+Setting Life Essence cost: (optional (default is 1000000))
+```groovy
+.cost(int)
+```
+
+Setting radius: (requires a radius greater than 0)
+```groovy
+.radius(int)
+```
+
+Register the meteor: (returns `WayofTime.bloodmagic.meteor.Meteor`)
+```groovy
+.register()
+```
+
+### Example
+```groovy
+mods.bloodmagic.Meteor.recipeBuilder()
+ .catalyst(item("minecraft:gold_ingot"))
+ .component(ore("oreIron"), 20) // 10% iron ore
+ .component(ore("oreDiamond"), 10) // 10% diamond ore
+ .component(ore("stone"), 70) // 70% stone
+ .radius(7)
+ .explosionStrength(10)
+ .cost(1000)
+ .register()
+
+mods.bloodmagic.Meteor.recipeBuilder()
+ .catalyst(item("minecraft:clay"))
+ .component("blockClay", 10) // (1)
+ .radius(20)
+ .explosionStrength(20)
+ .register() // Has the default Life Essence cost of 1000000
+```
+
+1. Since there is only one component, it will be 100% clay blocks regardless of weight.
+
+## Removing Meteors
+Removes the Meteor that matches the given catalyst item:
+```groovy
+mods.bloodmagic.Meteor.remove(ItemStack)
+mods.bloodmagic.Meteor.removeByInput(ItemStack)
+mods.bloodmagic.Meteor.removeByCatalyst(ItemStack)
+```
+
+Removes all registed Meteors:
+```groovy
+mods.bloodmagic.Meteor.removeAll()
+```
+
+### Example
+```groovy
+// Removes the default Meteor with a catalyst of an Diamond Block.
+mods.bloodmagic.Meteor.remove(item("minecraft:diamond_block"))
+```
diff --git a/docs/zh/groovyscript/mods/bloodmagic/sacrificial.md b/docs/zh/groovyscript/mods/bloodmagic/sacrificial.md
new file mode 100644
index 0000000..03d3917
--- /dev/null
+++ b/docs/zh/groovyscript/mods/bloodmagic/sacrificial.md
@@ -0,0 +1,66 @@
+# Blood Magic Entity Sacrifice Amount
+
+Package:
+```groovy
+mods.bloodmagic.Sacrificial
+```
+
+!!! Note
+ Affects the value of Entities sacrificed to the Blood Altar via Sacrificial Dagger or Well of Suffering.
+ Amount gained is `value * HP`. If not set, the default value of `25` is used for the Sacrificial Dagger,
+ and configurable via config with a default value of `25` for the Well of Suffering Ritual.
+
+## Setting the Sacrificial value of Entities
+Just like other recipe types, Sacrificial also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+```groovy
+mods.bloodmagic.Sacrificial.recipeBuilder()
+```
+
+Set the target Entity.
+```groovy
+.entity(String)
+.entity(ResourceLocation)
+.entity(Entity)
+```
+
+Set the Blood amount per HP when Sacrificed:
+```groovy
+.value(int)
+```
+
+Register recipe:
+```groovy
+.register()
+```
+
+### Example
+```groovy
+mods.bloodmagic.Sacrificial.recipeBuilder()
+ .entity("minecraft:enderman") // If the Entity is already registered, overrides the prior value.
+ .value(1000)
+ .register()
+```
+
+## Removing Recipes
+!!! Danger "Warning"
+ Some Entities are set to 0 by default to prevent exploits - for example, Vanilla's Armor Stand.
+ Removing these Sacrificial values may introduce unintentional exploits.
+
+Removes the recipe that matches the given catalyst item:
+```groovy
+mods.bloodmagic.Sacrificial.remove(String)
+mods.bloodmagic.Sacrificial.remove(ResourceLocation)
+mods.bloodmagic.Sacrificial.remove(Entity)
+```
+
+Removes all registed Entities, resetting them to the default value:
+```groovy
+mods.bloodmagic.Sacrificial.removeAll()
+```
+
+### Example
+```groovy
+// Removes the default Sacrificial value of a Villager.
+mods.bloodmagic.Sacrificial.remove("minecraft:villager")
+```
diff --git a/docs/zh/groovyscript/mods/bloodmagic/tartaric_forge.md b/docs/zh/groovyscript/mods/bloodmagic/tartaric_forge.md
new file mode 100644
index 0000000..5d9e8e9
--- /dev/null
+++ b/docs/zh/groovyscript/mods/bloodmagic/tartaric_forge.md
@@ -0,0 +1,96 @@
+# Blood Magic Tartaric Forge
+
+Package:
+```groovy
+mods.bloodmagic.TartaricForge
+```
+
+!!! Note
+ The Tartaric Forge requires a Tartaric Gem to provide Demonic Will to the recipe. Only Raw Will can be used.
+ Each recipe requires a minimum amount of Will inside the Gem to start, and consumes a smaller amount of Will on completion.
+
+## Adding Recipes
+Just like other recipe types, the Tartaric Forge also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+```groovy
+mods.bloodmagic.TartaricForge.recipeBuilder()
+```
+
+Adding inputs: (requires 1-4)
+```groovy
+.input(IIngredient)
+.input(IIngredient...)
+.input(Collection)
+```
+
+Setting the amount of souls removed from the Tartaic Gem: (required)
+```groovy
+.drain(int)
+.soulDrain(int)
+```
+
+Setting the amount of souls required in the Tartaric Gem: (required (if less than the amount removed, set to the amount removed))
+```groovy
+.minimumSouls(int)
+```
+
+Adding output: (requires exactly 1)
+```groovy
+.output(ItemStack)
+```
+
+Register recipe: (returns `WayofTime.bloodmagic.api.impl.recipe.RecipeTartaricForge`)
+```groovy
+.register()
+```
+
+### Example
+```groovy
+mods.bloodmagic.TartaricForge.recipeBuilder()
+ .input(item("minecraft:clay"), item("minecraft:clay"), item("minecraft:clay"), item("minecraft:clay"))
+ .output(item("minecraft:gold_ingot"))
+ .drain(5)
+ .minimumSouls(10)
+ .register()
+
+mods.bloodmagic.TartaricForge.recipeBuilder()
+ .input(item("minecraft:gold_ingot"), item("minecraft:clay"))
+ .output(item("minecraft:diamond"))
+ .soulDrain(200)
+ .minimumSouls(500)
+ .register()
+```
+
+## Removing Recipes
+
+This removes ALL recipes which have all input ingredients[^1]:
+```groovy
+mods.bloodmagic.TartaricForge.removeByInput(NonNullList)
+mods.bloodmagic.TartaricForge.removeByInput(IIngredient...)
+```
+
+This removes ALL recipes that match the given output:
+```groovy
+mods.bloodmagic.TartaricForge.removeByOutput(ItemStack)
+```
+
+Removes all registed Tartaric Forge recipes:
+```groovy
+mods.bloodmagic.TartaricForge.removeAll()
+```
+
+### Example
+```groovy
+// Removes all recipes that have inputs Cauldron, Stone, Lapis, and Diamond. (1)
+mods.bloodmagic.TartaricForge.removeByInput(item("minecraft:cauldron"), item("minecraft:stone"), item("minecraft:dye:4"), item("minecraft:diamond"))
+// Removes all recipes that have inputs including both Gunpowder and Redstone. (2)
+mods.bloodmagic.TartaricForge.removeByInput(item("minecraft:gunpowder"), item("minecraft:redstone"))
+// Removes all recipes that output Blood Magic's Demon Crystal.
+mods.bloodmagic.TartaricForge.removeByOutput(item("bloodmagic:demon_crystal"))
+```
+
+1. This would remove the recipe for the Demon Crucible.
+2. This would the remove recipes for both Arcane Ashes and Binding Reagent.
+
+
+[^1]: Note that a recipe with inputs "ABCD" would match with a target containing only "AB".
diff --git a/docs/zh/groovyscript/mods/bloodmagic/tranquility.md b/docs/zh/groovyscript/mods/bloodmagic/tranquility.md
new file mode 100644
index 0000000..665b463
--- /dev/null
+++ b/docs/zh/groovyscript/mods/bloodmagic/tranquility.md
@@ -0,0 +1,91 @@
+# Blood Magic Tranquility Amount
+
+Package:
+```groovy
+mods.bloodmagic.Tranquility
+```
+
+!!! Note
+ Tranquility is used to improve the effect of an Incense Altar, which increases the amount of Life Essenced gained when using a Dagger of Self-Sacrifice.
+ The Incense Altar recives diminishing effects from additional sources of a type.
+
+
+## Adding Tranquility to blocks
+Just like other recipe types, Tranquility also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+```groovy
+mods.bloodmagic.Tranquility.recipeBuilder()
+```
+
+Setting the target block: (set either the exact blockstate, or all blockstates of a block)
+```groovy
+.blockstate(IBlockState)
+.block(Block)
+```
+
+Tranquility types are one of the following: PLANT, CROP, TREE, EARTHEN, WATER, FIRE, LAVA.
+
+Set the Tranquility type:
+```groovy
+.tranquility(EnumTranquilityType)
+.tranquility(String/*(1)!*/)
+```
+
+1. Must be one of the following: PLANT, CROP, TREE, EARTHEN, WATER, FIRE, LAVA.
+
+
+Set value provided to the given Tranquility type:
+```groovy
+.value(double)
+```
+
+Register recipe:
+```groovy
+.register()
+```
+
+### Example
+```groovy
+mods.bloodmagic.tranquility.recipeBuilder()
+ .block(blockstate("minecraft:obsidian").getBlock())
+ .tranquility("LAVA")
+ .value(10)
+ .register()
+
+mods.bloodmagic.tranquility.recipeBuilder()
+ .block(blockstate("minecraft:obsidian").getBlock())
+ .tranquility("WATER")
+ .value(10)
+ .register()
+
+mods.bloodmagic.tranquility.recipeBuilder()
+ .blockstate(blockstate("minecraft:obsidian"))
+ .tranquility("LAVA")
+ .value(500)
+ .register()
+```
+
+## Removing Recipes
+Removes the given Blockstate or all blockstates of a given Block from the target Tranquility type:
+```groovy
+mods.bloodmagic.Tranquility.remove(Block, String/*(1)!*/)
+mods.bloodmagic.Tranquility.remove(IBlockState, String/*(2)!*/)
+mods.bloodmagic.Tranquility.remove(Block, EnumTranquilityType)
+mods.bloodmagic.Tranquility.remove(IBlockState, EnumTranquilityType)
+```
+
+1. Must be one of the following: PLANT, CROP, TREE, EARTHEN, WATER, FIRE, LAVA.
+2. Must be one of the following: PLANT, CROP, TREE, EARTHEN, WATER, FIRE, LAVA.
+
+Removes all registed Tranquility blockstates:
+```groovy
+mods.bloodmagic.Tranquility.removeAll()
+```
+
+### Example
+```groovy
+// Removes the target blockstate of netherrack from the FIRE Tranquility type.
+mods.bloodmagic.tranquility.remove(blockstate("minecraft:netherrack"), "FIRE")
+// Removes all blockstates of dirt from the EARTHEN Tranquility type.
+mods.bloodmagic.tranquility.remove(blockstate("minecraft:dirt").getBlock(), "EARTHEN")
+```
diff --git a/docs/zh/groovyscript/mods/enderio/alloy_smelter.md b/docs/zh/groovyscript/mods/enderio/alloy_smelter.md
new file mode 100644
index 0000000..4093db5
--- /dev/null
+++ b/docs/zh/groovyscript/mods/enderio/alloy_smelter.md
@@ -0,0 +1,66 @@
+# EnderIO Alloy Smelter
+
+## Adding Recipes
+Just like other recipe types, the Alloy Smelter also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+```groovy
+mods.enderio.AlloySmelter.recipeBuilder()
+```
+
+Adding inputs: (requires 1-3)
+```groovy
+.input(IIngredient)
+.input(IIngredient...)
+.input(Collection)
+```
+
+Adding output: (requires exactly 1)
+```groovy
+.output(ItemStack)
+```
+
+Set required machine tier: (optional)
+```groovy
+.tierAny() // Default: Allows any tier
+.tierSimple()
+.tierNormal()
+.tierEnhanced()
+```
+
+Set required total energy: (optional (default is 5000))
+```groovy
+.energy(int)
+```
+
+Set xp chance: (optional (default is 0))
+````groovy
+.xp(float) // 0.0 = 0% / 1.0 = 100%
+````
+
+Register recipe: (returns nothing)
+````groovy
+.register()
+````
+
+### Example
+````groovy
+mods.enderio.AlloySmelter.recipeBuilder()
+ .input(item('minecraft:iron_ingot'), ore('ingotGold'), item('minecraft:clay_ball') * 64)
+ .output(item('minecraft:nether_star'))
+ .tierNormal() // recipes requires normal or enhanced tier
+ .energy(6000)
+ .xpChance(0.5f)
+ .register()
+````
+
+## Removing Recipes
+This removes ALL recipes that match the given output:
+````groovy
+mods.enderio.AlloySmelter.remove(ItemStack output)
+````
+
+### Example
+````groovy
+// removes Vibrant Alloy from Alloy Smelter
+mods.enderio.AlloySmelter.remove(item('enderio:item_alloy_ingot:2'))
+````
diff --git a/docs/zh/groovyscript/mods/enderio/combustion_gen.md b/docs/zh/groovyscript/mods/enderio/combustion_gen.md
new file mode 100644
index 0000000..bdcd078
--- /dev/null
+++ b/docs/zh/groovyscript/mods/enderio/combustion_gen.md
@@ -0,0 +1,40 @@
+# EnderIO Combustion Generator
+GroovyScript allows you to add and remove custom fuels and coolants for the Combustion Generator.
+
+## Adding fuels
+
+````groovy
+mods.enderio.CombustionGen.addFuel(FluidStack fuel, int rfPerCycle, int burnTime)
+````
+Example
+````groovy
+mods.enderio.CombustionGen.addFuel(fluid('water'), 100, 100)
+````
+
+## Removing fuels
+````groovy
+mods.enderio.CombustionGen.removeFuel(FluidStack fuel)
+````
+Example
+````groovy
+mods.enderio.CombustionGen.removeFuel(fluid('rocket_fuel'))
+````
+
+## Adding coolants
+
+````groovy
+mods.enderio.CombustionGen.addCoolant(FluidStack fuel, float degreesCoolingPerMb)
+````
+Example
+````groovy
+mods.enderio.CombustionGen.addCoolant(fluid('lava'), 20f)
+````
+
+## Removing coolants
+````groovy
+mods.enderio.CombustionGen.removeCoolant(FluidStack fuel)
+````
+Example
+````groovy
+mods.enderio.CombustionGen.removeCoolant(fluid('ender_distillation'))
+````
\ No newline at end of file
diff --git a/docs/zh/groovyscript/mods/enderio/enchanter.md b/docs/zh/groovyscript/mods/enderio/enchanter.md
new file mode 100644
index 0000000..952bb59
--- /dev/null
+++ b/docs/zh/groovyscript/mods/enderio/enchanter.md
@@ -0,0 +1,68 @@
+# EnderIO Enchanter
+GroovyScript allows you to add and remove recipes for enchantments in the enchanter with custom book and lapis items.
+EnderIO automatically calculates costs and adds recipes for each level of the enchantment.
+
+## Adding Recipes
+Just like other recipe types, the Enchanter also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+```groovy
+mods.enderio.Enchanter.recipeBuilder()
+```
+
+Set input: (required)
+```groovy
+.input(IIngredient)
+```
+
+Set enchantment: (required)
+```groovy
+.enchantment(Enchantment)
+```
+
+Set input amount per level: (optional (default is amount of input ingredient))
+````groovy
+.amountPerLevel(int)
+````
+
+Set xp multiplier: (optional (default is 1))
+````groovy
+.xpCostMulitplier(double)
+````
+
+Set custom book item: (optional (default is Book and Quill))
+```groovy
+.customBook(IIngredient)
+```
+
+Set custom lapis item: (optional (default is Lapis Lazuli))
+```groovy
+.customLapis(IIngredient)
+```
+
+Register recipe: (returns a `crazypants.enderio.base.recipe.enchanter.EnchanterRecipe` instance if successful)
+````groovy
+.register()
+````
+
+### Example
+````groovy
+mods.enderio.Enchanter.recipeBuilder()
+ .enchantment(enchantment('efficiency'))
+ .input(item('minecraft:nether_star') * 2)
+ .xpCostMultiplier(3f)
+ .customBook(item('enderio:item_dark_steel_upgrade:0'))
+ .customLapis(item('minecraft:poisonous_potato'))
+ .register()
+````
+
+## Removing Recipes
+This removes a recipe that match the given input:
+````groovy
+mods.enderio.Enchantment.remove(Enchantment)
+````
+
+### Example
+````groovy
+// removes all efficiency enchantment recipes
+mods.enderio.Enchantment.remove(enchantment('efficiency'))
+````
\ No newline at end of file
diff --git a/docs/zh/groovyscript/mods/enderio/sag_mill.md b/docs/zh/groovyscript/mods/enderio/sag_mill.md
new file mode 100644
index 0000000..781a54b
--- /dev/null
+++ b/docs/zh/groovyscript/mods/enderio/sag_mill.md
@@ -0,0 +1,73 @@
+# EnderIO SAG Mill
+
+## Adding Recipes
+Just like other recipe types, the SAG Mill also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+```groovy
+mods.enderio.SagMill.recipeBuilder()
+```
+
+Adding inputs: (requires exactly 1)
+```groovy
+.input(IIngredient)
+```
+
+Adding output: (requires 1 - 4)
+```groovy
+.output(ItemStack)
+.output(ItemStack...)
+.output(Collection)
+```
+
+Adding output with chance: (counts as output)
+```groovy
+.output(ItemStack itemStack, float chance)
+```
+
+Set required machine tier: (optional)
+```groovy
+.tierAny() // Default: Allows any tier
+.tierSimple()
+.tierNormal()
+.tierEnhanced()
+```
+
+Set required total energy: (optional (default is 5000))
+```groovy
+.energy(int)
+```
+
+Set recipe bonus type: (unknown behaviour) TODO
+````groovy
+.bonusTypeNone() // Default
+.bonusTypeMultiply()
+.bonusTypeChance()
+````
+
+Register recipe: (returns a `crazypants.enderio.base.recipe.Recipe` instance if successful)
+````groovy
+.register()
+````
+
+### Example
+````groovy
+mods.enderio.SagMill.recipeBuilder()
+ .input(item('minecraft:nether_star'))
+ .output(item('minecraft:diamond')) // guaranteed diamond
+ .output(item('minecraft:nether_star'), 0.05f) // 5% chance to get nether star back
+ .tierNormal() // recipes requires normal or enhanced tier
+ .energy(6000)
+ .register()
+````
+
+## Removing Recipes
+This removes a recipe that match the given input:
+````groovy
+mods.enderio.SagMill.removeByInput(ItemStack input)
+````
+
+### Example
+````groovy
+// removes wheat milling in Sag Mill
+mods.enderio.SagMill.removeByInput(item('minecraft:wheat'))
+````
\ No newline at end of file
diff --git a/docs/zh/groovyscript/mods/enderio/slice_n_splice.md b/docs/zh/groovyscript/mods/enderio/slice_n_splice.md
new file mode 100644
index 0000000..4b6729b
--- /dev/null
+++ b/docs/zh/groovyscript/mods/enderio/slice_n_splice.md
@@ -0,0 +1,63 @@
+# EnderIO Slice'n'Splice
+
+## Adding Recipes
+Just like other recipe types, the Soul Binder also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+```groovy
+mods.enderio.SliceNSplce.recipeBuilder()
+```
+
+Adding inputs: (requires 1 - 6)
+Here the order of inputs is important. The slot order is from left to right and top to bottom.
+All Slice'n'Splice recipes are "shaped". Meaning all inputs must go in their specified slot. Empty ingredients aka. `null` are allowed.
+```groovy
+.input(IIngredient)
+.input(IIngredient...)
+.input(Collection)
+```
+
+Adding output: (requires exactly 1)
+```groovy
+.output(ItemStack)
+```
+
+Set xp chance: (optional (default is 0))
// needs to be tested and confirmed
+````groovy
+.xp(float) // 0.0 = 0% / 1.0 = 100%
+````
+
+Set required total energy: (optional (default is 5000))
+```groovy
+.energy(int)
+```
+
+Register recipe: (returns a `crazypants.enderio.base.recipe.Recipe` instance if successful)
+````groovy
+.register()
+````
+
+### Example
+Here the inputs are split into two `input()` calls. This helps to visualize the recipe.
+````groovy
+mods.enderio.SliceNSplice.recipeBuilder()
+ .input(item('minecraft:diamond'), item('minecraft:gold_ingot'), item('minecraft:diamond'))
+ .input(item('minecraft:clay_ball'), item('minecraft:nether_star'), item('minecraft:clay_ball'))
+ .output(item('minecraft:totem_of_undying'))
+ .energy(9999)
+ .register()
+````
+The example results in the following recipe:
+
+
+
+## Removing Recipes
+This removes a recipe that match the given input:
+````groovy
+mods.enderio.SliceNSplice.remove(ItemStack output)
+````
+
+### Example
+````groovy
+// removes slice n splice for tormented enderman head
+mods.enderio.SliceNSplice.remove(item('enderio:block_enderman_skull:2'))
+````
\ No newline at end of file
diff --git a/docs/zh/groovyscript/mods/enderio/soul_binder.md b/docs/zh/groovyscript/mods/enderio/soul_binder.md
new file mode 100644
index 0000000..6d223ef
--- /dev/null
+++ b/docs/zh/groovyscript/mods/enderio/soul_binder.md
@@ -0,0 +1,64 @@
+# EnderIO Soul Binder
+
+## Adding Recipes
+Just like other recipe types, the Soul Binder also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+```groovy
+mods.enderio.SoulBinder.recipeBuilder()
+```
+
+Adding inputs: (requires exactly 1)
+```groovy
+.input(IIngredient)
+```
+
+Adding output: (requires exactly 1)
+```groovy
+.output(ItemStack)
+```
+
+Adding soul vial inputs:
+Adds entity souls in form of soul vials to the input
+````groovy
+.entitySoul(String entityName)
+.entitySoul(String... entityNames)
+.entitySoul(Collection entityNames)
+````
+
+Set input xp levels: (optional (default is 2))
+````groovy
+.xp(int)
+````
+
+Set required total energy: (optional (default is 5000))
+```groovy
+.energy(int)
+```
+
+Register recipe: (returns a `crazypants.enderio.base.recipe.Recipe` instance if successful)
+````groovy
+.register()
+````
+
+### Example
+````groovy
+mods.enderio.SoulBinder.recipeBuilder()
+ .input(item('minecraft:diamond'))
+ .entitySoul('minecraft:zombie') // zombie in a soul vial
+ .output(item('minecraft:nether_star'))
+ .xp(10) // requires 10 xp levels
+ .energy(6000)
+ .register()
+````
+
+## Removing Recipes
+This removes a recipe that match the given input:
+````groovy
+mods.enderio.SoulBinder.remove(ItemStack output)
+````
+
+### Example
+````groovy
+// removes soul binding for enticing crystal
+mods.enderio.SoulBinder.remove(item('enderio:item_material:17'))
+````
\ No newline at end of file
diff --git a/docs/zh/groovyscript/mods/enderio/tank.md b/docs/zh/groovyscript/mods/enderio/tank.md
new file mode 100644
index 0000000..cf7d399
--- /dev/null
+++ b/docs/zh/groovyscript/mods/enderio/tank.md
@@ -0,0 +1,31 @@
+# EnderIO Tank
+EnderIO Tanks can not only store fluids but also empty and fill fluid containers.
+You can add custom fill/drain recipes to get custom behaviour. For example you can add a `water + sponge = wet sponge` recipe.
+
+## Adding Recipes
+
+### Filling
+Adds a recipe that will fill the input `IIngredient` with the input `FluidStack` and results in the output `ItemStack`.
+````groovy
+mods.enderio.Tank.addFill(IIngredient input, FluidStack inputFluid, ItemStack output)
+````
+
+### Draining
+Adds a recipe that will drain the output `FluidStack` from the input `IIngredient` and results in the output `ItemStack`.
+````groovy
+mods.enderio.Tank.addDrain(IIngredient input, FluidStack outputFluid, ItemStack output)
+````
+
+## Removing Recipes
+
+### Filling
+Removes a filling recipe:
+````groovy
+mods.enderio.Tank.removeFill(FluidStack inputFluid, ItemStack output)
+````
+
+### Draining
+Removes a filling recipe:
+````groovy
+mods.enderio.Tank.removeDrain(FluidStack outputFluid, ItemStack output)
+````
diff --git a/docs/zh/groovyscript/mods/enderio/vat.md b/docs/zh/groovyscript/mods/enderio/vat.md
new file mode 100644
index 0000000..20dd2bf
--- /dev/null
+++ b/docs/zh/groovyscript/mods/enderio/vat.md
@@ -0,0 +1,74 @@
+# EnderIO Vat
+
+## Adding Recipes
+Just like other recipe types, the Vat also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+```groovy
+mods.enderio.Vat.recipeBuilder()
+```
+
+Adding input: (requires exactly 1)
+```groovy
+.input(FluidStack)
+```
+
+Adding output: (requires exactly 1)
+```groovy
+.output(FluidStack)
+```
+
+Set base multiplier: (optional (default is 1))
+````groovy
+.baseMultiplier(float)
+````
+
+Adding left item input: (optional)
+````groovy
+.itemInputLeft(ItemStack item, float multiplier)
+````
+
+Adding right item input: (optional)
+````groovy
+.itemInputRight(ItemStack item, float multiplier)
+````
+
+Set required machine tier: (optional (default is any))
+```groovy
+.tierAny() // Default: Allows any tier
+.tierNormal()
+.tierEnhanced()
+```
+
+Set required total energy: (optional (default is 5000))
+```groovy
+.energy(int)
+```
+
+Register recipe: (returns nothing)
+````groovy
+.register()
+````
+
+### Example
+````groovy
+mods.enderio.Vat.recipeBuilder()
+ .input(fluid('water') * 500)
+ .output(fluid('lava') * 500)
+ .itemInputLeft(item('minecraft:diamond'), 1.5)
+ .itemInputRight(item('minecraft:iron_ingot'), 0.7)
+ .itemInputRight(item('minecraft:gold_ingot'), 7)
+ .baseMultiplier(1)
+ .register()
+````
+
+## Removing Recipes
+This removes ALL recipes that match the given output:
+````groovy
+mods.enderio.Vat.remove(ItemStack output)
+````
+
+### Example
+````groovy
+// removes Nutrient Distillation recipe from the Vat
+mods.enderio.Vat.remove(fluid('nutrient_distillation'))
+````
diff --git a/docs/zh/groovyscript/mods/gtceu/heating_coils.md b/docs/zh/groovyscript/mods/gtceu/heating_coils.md
new file mode 100644
index 0000000..0e3d959
--- /dev/null
+++ b/docs/zh/groovyscript/mods/gtceu/heating_coils.md
@@ -0,0 +1 @@
+[WIP]
\ No newline at end of file
diff --git a/docs/zh/groovyscript/mods/gtceu/material.md b/docs/zh/groovyscript/mods/gtceu/material.md
new file mode 100644
index 0000000..c84f5e8
--- /dev/null
+++ b/docs/zh/groovyscript/mods/gtceu/material.md
@@ -0,0 +1,929 @@
+# Materials
+
+First of all, the best docs is the source
+itself: [Source](https://github.com/GregTechCEu/GregTech/blob/master/src/main/java/gregtech/api/unification/material/Material.java)
+
+!!! Note
+This docs goes of, of GroovyScript version 0.4.0 and GTCEu 2.5.4
+
+## Introduction
+
+### Firstly, you should know what a **Material** actually is.
+
+Material is the basis of CEu. It defines a substance and its properties. It usually takes the form of an **element** (
+i.e. Oxygen) or a **compound** (i.e. Water), but it can also take the form of something weird like the **Eye of Ender**.
+
+### Which Properties are defined?
+
+The **Material** specifies whether it has a **Fluid** property, **plasma** property, **dust** property, **gem** property
+or **ingot** property. When it has a specific property, GTCEu will register the corresponding item or fluid
+automatically. Some properties will require others, like **Ingot** requiring **Dust**.
+
+### What else does it define?
+
+You can additionally define **Colors**, **Flags** (indicators for specific attributes), **MaterialIconSet** (textures),
+**CableProperties**, **Element**, **Formula** (tooltips), **Components** and more. Don't worry, they are not
+complicated, and will be introduced in detail below.
+
+***
+
+### Retrieving Existing Materials
+
+There are two good ways to do this: the simple way and the not simple way.
+
+#### The Simple Way
+
+This method requires the Material to first exist. This method goes off of the material's **Unlocalized Name**, which is
+the name used before it is translated in a lang file. You can use the `/gs hand` command to retrieve the material of
+items.
+
+```groovy
+// assigns the variable my_material to a Material called Steel.
+def my_material = material('steel')
+```
+
+#### The Not Simple Way
+
+This method also works exactly the same as before, but the former is much easier and more convenient. It is **strongly**
+recommended to use the **Simple Way**.
+
+```groovy
+// import the Material class to use Materials
+import gregtech.api.unification.material.Materials
+
+// assigns the variable my_material to a Material called Steel.
+var my_material = Materials.Steel
+```
+
+***
+
+## Creating a New Material
+
+GregTech materials must be created in the `preInit` loader. Additionaly they need to be registered (or modified) inside
+an event.
+
+```groovy
+// import the material event
+import gregtech.api.GregTechAPI.MaterialEvent
+
+// register an event listener
+event_manager.listen { MaterialEvent event ->
+ // create materials here
+}
+```
+
+Note that when the event runs GregTech materials are already created, but addon materials might not. To modify addon
+materials (but don't register) use `PostMaterialEvent` instead of `MaterialEvent`.
+
+Materials are created using a system called `MaterialBuilder`. If you've used GregTech CE and CEu's system for adding
+machine recipes, this will feel very similar.
+
+All Materials need a number `id` and a `name`. The `id` must be from 0-32767, however, Ids 32000+ are reserved for pack
+makers. No add-on developer is supposed to use ids in that range, so there should be no worry about conflicts. 700+
+materials is more than all of CEu uses by itself too! The `name` must be all lowercase, contain no spaces, and not have
+special characters (@, %, etc).
+
+```groovy
+import gregtech.api.GregTechAPI.MaterialEvent
+import gregtech.api.unification.material.Material
+
+// import the Material class for making new materials
+
+event_manager.listen { MaterialEvent event ->
+ /*
+ * This does not do much on its own.
+ * It assigns a variable to a new MaterialBuilder, with an id of 32000, and a name of "my_material".
+ */
+ def my_material_builder = new Material.Builder(32000, "my_material")
+}
+```
+
+```groovy
+import gregtech.api.GregTechAPI.MaterialEvent
+import gregtech.api.unification.material.Material
+
+event_manager.listen { MaterialEvent event ->
+ /*
+ * This will not work quite yet. Read on to learn what else this needs!
+ * It would assign a variable to a new Material, with an id of 32001, and a name of "my_real_material".
+ *
+ * Use .build() to finish building a material. This is what actually creates it.
+ */
+ def my_material = new Material.Builder(32001, "my_real_material").build()
+}
+```
+
+### Adding Material Properties.
+
+This is where materials really start to take shape. All of the following methods are called on
+a `new Material.Builder()`.
+Scroll down to the first example to see how to do this. Each method can be chained together, one after the other, until
+the desired material is all specified. It is then built and the end and returns a finished Material.
+
+**fluid**: _`fluid(@Optional String type, @Optional boolean hasBlock)`_
+
+Adds a `FluidProperty` to this Material, which generates a fluid.
+The following two parameters are optional. If you want to modify a later optional parameter, you must specify a value
+for every preceding one. Note that you do not need to specify anything when using `fluid()`.
+
+* `@Optional type` - The Material.FluidType of this Material, either `"fluid"` or `"gas"`.
+* `@Optional hasBlock` - If `true`, create a Fluid Block for this Material, which can be placed in the world.
+
+**plasma**: _`plasma()`_
+
+Adds a `PlasmaProperty` to this Material, which generates a plasma.
+It does not require a `FluidProperty`, but can be used in conjunction with it.
+
+**dust**: _`dust(@Optional int harvestLevel, @Optional int burnTime)`_
+
+Adds a `DustProperty` to this Material, which generates a Dust, Small Dust, and Tiny Dust.
+**Is automatically applied by `IngotProperty` and `GemProperty`**.
+
+* `@Optional harvestLevel` - The Harvest Level of the Material's block when mining it. If the Material also has
+ a `ToolProperty`, this value will also be used to determine the tool's Mining Level.
+* `@Optional burnTime` - The Burn Time (in ticks) of this Material as a Furnace Fuel. If not specified, the material *
+ *cannot** be used as a furnace fuel.
+
+**ingot**: _`ingot(@Optional int harvestLevel, @Optional int burnTime)`_
+
+Adds an `IngotProperty` to this Material, which generates an Ingot. It automatically adds a `DustProperty`. **This is
+INCOMPATIBLE with `GemProperty`.**
+
+* `@Optional harvestLevel` - The Harvest Level of the Material's block when mining it. If the Material also has
+ a `ToolProperty`, this value will also be used to determine the tool's Mining Level. If this Material already had a
+ Harvest Level defined, it will be overridden.
+* `@Optional burnTime` - The Burn Time (in ticks) of this Material as a Furnace Fuel. If not specified, the material *
+ *cannot** be used as a furnace fuel. If this Material already had a Burn Time defined, it will be overridden.
+
+**gem**: _`gem(@Optional int harvestLevel, @Optional int burnTime)`_
+
+Adds a `GemProperty` to this Material, which generates all types of GregTech Gems. It automatically adds
+a `DustProperty`. **This is INCOMPATIBLE with `IngotProperty`.**
+
+* `@Optional harvestLevel` - The Harvest Level of the Material's block when mining it. If the Material also has
+ a `ToolProperty`, this value will also be used to determine the tool's Mining Level. If this Material already had a
+ Harvest Level defined, it will be overridden.
+* `@Optional burnTime` - The Burn Time (in ticks) of this Material as a Furnace Fuel. If not specified, the material *
+ *cannot** be used as a furnace fuel. If this Material already had a Burn Time defined, it will be overridden.
+
+**polymer**: _`polymer(@Optional int harvestLevel)`_
+
+Adds a `PolymerProperty` to this material, which determines if special lang entries should be used for its items: such
+as "Sheet" instead of "Plate." This requires a `FluidProperty`.
+
+* `@Optional harvestLevel` - The Harvest Level of the Material's block when mining it. If the Material also has
+ a `ToolProperty`, this value will also be used to determine the tool's Mining Level. If this Material already had a
+ Harvest Level defined, it will be overridden.
+
+**color**: _`color(int color)`_
+
+Set the Color of this Material. Defaults to 0xFFFFFF unless `colorAverage()` is used. Colors can be supplied in either
+of the following formats: the integer value, such as `16777215` or as `0xFFFFFF`. This is RGB, with no alpha channel.
+
+* `color` - The RGB color to use for the Material.
+
+**colorAverage**: _`colorAverage()`_
+
+The Material's Color will be a weighted average of all of the Components' colors in the Material.
+
+**rotorStats**: _`rotorStats(float speed, float damage, int durability)`_
+
+Set the stats for turbine rotors which are made from this Material. Speed and Damage are used according to a formula,
+and do not reflect those two user-facing properties directly.
+
+* `speed` - Speed of the rotor.
+* `damage` - Damage of the rotor.
+* `durability` - Durability of the rotor.
+
+**blastTemp**:
+_`blastTemp(int temp, @Optional String gasTier, @Optional int eutOverride, @Optional int durationOverride)`_
+
+Sets the Blast Furnace Temperature of this Material. If below 1000 Kelvin, Primitive Blast Furnace recipes will be also
+added. If above 1750 Kelvin, a Hot Ingot and its appropriate Vacuum Freezer recipe will be also added. If a Material
+with this Property has a Fluid, its temperature will be set to this if it is currently using the default Fluid
+temperature.
+
+* `temp` - Blast Furnace Temperature in Kelvin required to heat up the material. Just like in real life, this value *
+ *cannot** be less than `0`.
+* `@Optional gasTier` - The tier of gas used to smelt in the Electric Blast Furnace. Available options
+ are: `"LOW"`, `"MID"`, `"HIGH"`, `"HIGHER"`, `"HIGHEST`.
+* `@Optional eutOverride` - Sets the EU/t of autogenerated Electric Blast Furnace recipes to the specified value.
+* `@Optional durationOverride` - Sets the base duration in ticks of autogenerated Electric Blast Furnace recipes to the
+ specified value.
+
+**ore**: _`ore(@Optional int oreMultiplier, @Optional int byproductMultiplier, @Optional boolean emissive)`_
+
+Adds Ore Blocks, Crushed, Crushed Purified, Crushed Centrifuged, Impure Dust, and Purified Dust for this Material.
+
+* `@Optional oreMultiplier` - Crushed Ore output amount multiplier for Ore -> Crushed Ore Maceration. Default: 1 (no
+ multiplier).
+* `@Optional byproductMultiplier` - Byproduct output amount multiplier for Crushed Ore processing of any kind. Default:
+ 1 (no multiplier).
+* `@Optional emissive` - Should ore block use emissive texturing (see below image). Default: false.
+
+
+
+**washedIn**: _`washedIn(Material material, @Optional int washedAmount)`_
+
+Sets what the material's crushed ore is washed in using the Chemical Bath. Requires `OreProperty` to be set.
+
+* `material` - The Material in which this material is to be washed. The parameter's Material requires `FluidProperty` to
+ be set.
+* `@Optional washedAmount` - The amount of fluid the crushed ore will be washed in. Default: 100mB.
+
+**separatedInto**: _`separatedInto(Material... materials)`_
+
+Sets the products of processing this Material's Purified Dust in an Electromagnetic Separator. Requires `OreProperty` to
+be set.
+
+* `materials` - An array of materials which is output in the magnetic separator. This already includes the Material
+ itself automatically.
+
+**addOreByproducts**: _`addOreByproducts(Material... materials)`_
+
+Sets the Ore Byproducts of this Material. Requires `OreProperty` to be set.
+
+* `materials` - An array of materials which are used for various ore processing byproduct outputs.
+
+**oreSmeltInto**: _`oreSmeltInto(Material material)`_
+
+Sets the Direct Smelting product in a vanilla furnace of this Material's ore related forms. Requires `OreProperty` to be
+set.
+
+* `material` - The material to output in the furnace. Can have `IngotProperty`, `GemProperty`, or `DustProperty`.
+
+**polarizesInto**: _`polarizesInto(Material material)`_
+
+Sets the Polarizer product of this Material. Requires `IngotProperty` to be set.
+
+* `material` - The material to output when polarized.
+
+**arcSmeltInto**: _`arcSmeltInto(Material material)`_
+
+Sets the Arc Furnace product of this Material. Requires `IngotProperty` to be set.
+
+* `material` - The material to output when arc furnaced. By default, the material will output itself.
+
+**macerateInto**: _`macerateInto(Material material)`_
+
+Sets the Macerator product of this Material. Requires `IngotProperty` to be set.
+
+* `material` - The material to output when macerated. By default, the material will output itself.
+
+**fluidTemp**: _`fluidTemp(int temp)`_
+
+Sets the temperature of the fluid of this Material. Requires `FluidProperty` to be set.
+
+* `temp` - The temperature in Kelvin to set. Like in real life, this value **cannot** be less than `0`.
+
+**cableProperties**: _`cableProperties(long voltage, int amperage, int loss, @Optional boolean isSuperCon)`_
+
+Adds cables and wires of this Material. Requires `IngotProperty` to be set.
+
+* `voltage` - The voltage amount a 1x wire/cable can transfer.
+* `amperage` - The amperage amount a 1x wire/cable can handle.
+* `loss` - The loss per block a 1x **wire** will have. Cables have this value divided by 2, but will never be lossless
+ unless set to `0`.
+* `@Optional isSuperCon` - Whether this is a superconductor. This will prevent cables from generating, and have a loss
+ of `0`.
+
+**fluidPipeProperties**: _`fluidPipeProperties(int maxTemp, int throughput, boolean gasProof)`_
+
+Adds Fluid Pipes of this Material. Requires `IngotProperty` to be set.
+
+* `maxTemp` - Sets the maximum allowed fluid temperature in the pipe. Pipes burn/vanish when fluid is too hot.
+* `throughput` - Sets the maximum flowrate through the pipes. This value multiplied by `20` is the maximum rate for the
+ Tiny Pipe. Each subsequent pipe is further multiplied by `2` over the previous.
+* `gasProof` - If `true`, the pipe is able to transfer fluids with the Gas state. Else, they will vaporize.
+
+**fluidPipeProperties**:
+_`fluidPipeProperties(int maxTemp, int throughput, boolean gasProof, boolean acidProof, boolean cryoProof, boolean plasmaProof)`_
+
+Adds Fluid Pipes of this Material. Requires `IngotProperty` to be set.
+
+* `maxTemp` - Sets the maximum allowed fluid temperature in the pipe. Pipes burn/vanish when fluid is too hot.
+* `throughput` - Sets the maximum flowrate through the pipes. This value multiplied by `20` is the maximum rate for the
+ Tiny Pipe. Each subsequent pipe is further multiplied by `2` over the previous.
+* `gasProof` - If `true`, the pipe is able to transfer fluids with the Gas state. Else, they will vaporize.
+* `acidProof` - If `true`, the pipe is able to transfer fluids with the Acidic attribute. Else, they will destroy the
+ pipe.
+* `cryoProof` - If `true`, the pipe is able to transfer fluids with the Cryogenic attribute. Else, they will vaporize.
+* `plasmaProof` - If `true`, the pipe is able to transfer fluids with the Plasma state, regardless of the fluid pipe's
+ maximum temperature. Else, they will destroy the pipe.
+
+**itemPipeProperties**: _`itemPipeProperties(int priority, float stacksPerSec)`_
+
+Adds item pipes of this Material. Requires `IngotProperty` to be set.
+
+* `priority` - Sets the priority for the pipe. Items will take the path with the lowest priority. This value is used for
+ the Normal Pipe. The Small Pipe has this value multiplied by `1.5`, and the Large Pipe has this value multiplied
+ by `0.75`.
+* `stacksPerSec` - Sets the maximum transfer rate in stacks of 64 items per second. This value is used for the Normal
+ Pipe. Small Pipes have this value multiplied by `0.5`. Large Pipes have this value multiplied by `2`.
+
+#### Tool stats
+Tool stats are slightly more complicated than in CT, but also more configurable.
+**toolStats**: _`toolStats(ToolProperty property)`_
+As you can see there is only one method which accepts a ToolProperty. You can create it like this:
+````groovy
+import gregtech.api.unification.material.properties.ToolProperty
+
+ToolProperty property = ToolProperty.Builder.of(float speed, float damage, int durability, int harvestLevel).build()
+````
+Before calling `build()` at the end you can call several other methods to further customize your tool stats
+````groovy
+ToolProperty property = ToolProperty.Builder.of(float speed, float damage, int durability, int harvestLevel)
+ .attackSpeed(float attackSpeed) // self explanatory
+ .ignoreCraftingTools() /*(1)*/
+ .unbreakable() // self explanatory
+ .enchantment(Enchantment enchantment, int level) /*(2)*/
+ .magnetic() /*(3)*/
+ .durabilityMultiplier(int multiplier) /*(4)*/
+ .build()
+````
+
+1. There won't be any crafting tools like hammer, saw and wrench
+2. Default enchantment that every tool with this material has. `Enchantment` can be obtained with the `enchantment(String name)` method.
+3. All mined block will go straight to the players inventory.
+4. A multiplier for the property durability.
+
+Set the stats for tools which are made from this Material.
+
+* `speed` - Mining Speed of the tools.
+* `damage` - Attack Damage dealt by the tools.
+* `durability` - Durability of the tools.
+* `harvestLevel` - Harvest Level of the tools.
+
+
+#### **Example Thus Far**
+
+This is example of a material using everything mentioned so far.
+
+```groovy
+import gregtech.api.GregTechAPI.MaterialEvent
+import gregtech.api.unification.material.Material
+
+event_manager.listen { MaterialEvent event ->
+ def specialSteel = new Material.Builder(32002, "special_steel") // name
+ .fluid("gas", false) // gas without block
+ .ingot() // has ingot (and therefore dust)
+ .color(0x0000FF) // pure blue
+ .toolStats(10, 3, 256, 21) // tool stats
+ .blastTemp(2900) // EBF temperature
+ .ore() // has ore blocks
+ .addOreByproducts(material('gold'), material('copper')) // add byproducts
+ .cableProperties(128, 2, 4, false) // add cables
+ .build() // build the actual material
+}
+```
+
+### Changing Material Appearances.
+
+You may have noticed from testing the above example that the material's textures looks like the same style as many
+others. This is called the `MaterialIconSet`. This entire next section is dedicated to explaining this system and how to
+use it.
+
+Available **MaterialIconsets** and existing material examples which use them.
+
+| MaterialIconset | Example |
+|--------------------|-----------------|
+| `"DULL"` | Aluminium |
+| `"METALLIC"` | Steel |
+| `"MAGNETIC"` | Magnetic Steel |
+| `"SHINY"` | Copper |
+| `"BRIGHT"` | Annealed Copper |
+| `"DIAMOND"` | Apatite |
+| `"EMERALD"` | Cinnabar |
+| `"GEM_HORIZONTAL"` | Blue Topaz |
+| `"GEM_VERTICAL"` | Sapphire |
+| `"RUBY"` | Ruby |
+| `"OPAL"` | Opal |
+| `"GLASS"` | Glass |
+| `"NETHERSTAR"` | Nether Star |
+| `"FINE"` | Rock Salt |
+| `"SAND"` | Glauconite Sand |
+| `"WOOD"` | Wood |
+| `"ROUGH"` | Pyrite |
+| `"FLINT"` | Flint |
+| `"LIGNITE"` | Coal Coke |
+| `"QUARTZ"` | Quartzite |
+| `"CERTUS"` | Certus Quartz |
+| `"LAPIS"` | Lazurite |
+| `"FLUID"` | Nitric Acid |
+| `"GAS"` | Argon |
+
+For example, the following image shows the appearance of ores with different MaterialIconSets.
+
+
+The MaterialIconSet of a material, which determines all of its textures, is set with a single method.
+
+`iconSet`: _`iconSet(String iconSet)`_
+
+Sets the `MaterialIconSet` of this Material. Defaults vary depending on if the Material has:
+
+* `GemProperty` - defaults to `"GEM_VERTICAL"`
+* `IngotProperty` or `DustProperty` - defaults to `"DULL"`
+* `FluidProperty` - defaults to either `"FLUID"` or `"GAS"`, depending on the `FluidType`
+* `PlasmaProperty` - defaults to `"FLUID"`, but will receive a special plasma texture regardless.
+
+The default will be determined by the property found first in this order.
+
+#### Example with a MaterialIconSet:
+
+```groovy
+import gregtech.api.GregTechAPI.MaterialEvent
+import gregtech.api.unification.material.Material
+
+event_manager.listen { MaterialEvent event ->
+ def specialSteelTextured = new Material.Builder(32003, "special_steel_textured") // name
+ .fluid("gas", false) // gas without block
+ .ingot() // has ingot (and therefore dust)
+ .color(0x0000FF) // pure blue
+ .iconSet("shiny") // iconset to the shiny type
+ .toolStats(10, 3, 256, 21) // tool stats
+ .blastTemp(2900) // EBF temperature
+ .ore() // has ore blocks
+ .addOreByproducts(material('gold'), material('copper')) // add byproducts
+ .cableProperties(128, 2, 4, false) // add cables
+ .build() // build the actual material
+}
+```
+
+### Components
+
+**Components** refers to composition of the Material.
+
+For example, the components of TungstenSteel is `1 Tungsten (W)` and `1 Steel (Fe)`. That makes its chemical formula:
+
+
+#### MaterialStack
+
+Components are determined using something called a `MaterialStack`. This is the Material version of an ItemStack which
+is an Item with a Count. In our case, MaterialStack is a Material with a Count.
+
+```groovy
+// creates a MaterialStack of Material Tin with a Count of 3.
+def my_material_stack = material('tin') * 3
+```
+
+Simple, isn't it?
+
+#### Setting the Components
+
+**components**: _`components(MaterialStack[] components)`_
+
+Sets the components of the material.
+
+* `components` - an array of `MaterialStacks` representing the components of this Material.
+
+#### The Next Example
+
+```groovy
+import gregtech.api.GregTechAPI.MaterialEvent
+import gregtech.api.unification.material.Material
+
+event_manager.listen { MaterialEvent event ->
+ def cursed_chemistry_material = new Material.Builder(32004, "cursed_chemistry_material")
+ .fluid()
+ .color(0x00FF00) // pure red
+ .components([material('silver') * 3, material('nitrogen') * 6, material('carbon') * 2]) // set the components
+ .build() // build the actual material
+}
+```
+
+### Material Flags
+
+`MaterialFlags` refers to additional mini-attributes about the material. There are a ton of them.
+
+Available MaterialFlags for Every Material:
+
+* `"no_unification"`: Add to material to disable it's unification fully (this means no autogenerated recipes).
+* `"decomposition_requires_hydrogen"`: Decomposition recipe requires hydrogen as additional input. Amount is equal to
+ input amount. Sets the electrolyzer voltage to EV.
+* `"decomposition_by_electrolyzing"`: Enables electrolyzer decomposition recipe generation.
+* `"decomposition_by_centrifuging"`: Enables centrifuge decomposition recipe generation.
+* `"disable_decomposition"`: Disables decomposition recipe generation for this material and all materials that has it as
+ component.
+* `"explosive"`: Add to material if it is some kind of explosive.
+* `"flammable"`: Add to material if it is some kind of flammable.
+* `"generate_plate"`:
+
+Available MaterialFlags for Materials with `DustProperty`:
+
+* `"generate_plate"`: Generate a plate for this material. If it only has a `DustProperty`, a dust compressor recipe will
+ be added. If it has an `IngotProperty`, bending machine recipes will be added. If a block is found, cutting machine
+ recipes will be generated.
+* `"generate_rod"`: Generate a rod for this material.
+* `"generate_frame"`: Generate a frame for this material. Requires `"generate_rod"`.
+* `"generate_gear"`: Generate a gear for this material. Requires `"generate_plate"` and `"generate_rod"`.
+* `"generate_long_rod"`: Generate a long rod for this material. Requires `"generate_rod"`.
+* `"exclude_block_crafting_recipes"`: Prevent creating shapeless recipes for dust to block and vice versa. Prevents
+ extruding and alloy smelting via the Block Shape/Mold.
+* `"exclude_plate_compressor_recipe"`: Prevent creating plates in the compressor from dust. Requires `"generate_plate"`.
+* `"exclude_block_crafting_by_hand_recipes"`: Prevent creating shapeless recipes for dust to block and vice versa.
+* `"mortar_grindable"`: All the material to be ground into dust when crafting with a mortar.
+
+Available MaterialFlags for Materials with `IngotProperty`:
+
+* `"no_working"`: Add if it cannot be worked by any means other than smashing or smelting. This is used for coated
+ Materials.
+* `"no_smashing"`: Add to material if it cannot be used for regular Metal working techniques since it is not possible to
+ bend it.
+* `"no_smelting"`: Add to material if it's impossible to smelt it.
+* `"blast_furnace_calcite_double"`: Add this to your Material if you want to have its Ore Calcite heated in a Blast
+ Furnace for 2x output.
+* `"blast_furnace_calcite_triple"`: Add this to your Material if you want to have its Ore Calcite heated in a Blast
+ Furnace for 3x output.
+* `"generate_foil"`: Generate a foil for this material. Requires `"generate_plate"`.
+* `"generate_bolt_screw"`: Generate a bolt and screw for this material. Requires `"generate_rod"`.
+* `"generate_ring"`: Generate a ring for this material. Requires `"generate_rod"`.
+* `"generate_spring"`: Generate a spring for this material. Requires `"generate_long_rod"`.
+* `"generate_spring_small"`: Generate a small spring for this material. Requires `"generate_rod"`.
+* `"generate_small_gear"`: Generate a small gear for this material. Requires `"generate_plate"` and `"generate_rod"`.
+* `"generate_fine_wire"`: Generate a fine wire for this material. Requires `"generate_foil"`.
+* `"generate_rotor"`: Generate a rotor for this material. Requires `"generate_bolt_screw"`, `"generate_ring"`,
+ and `"generate_plate"`.
+* `"generate_dense"`: Generate a dense plate for this material. Requires `"generate_plate"`.
+* `"generate_round"`: Generate a dense plate for this material.
+
+Available MaterialFlags for Materials with `GemProperty`:
+
+* `"crystallizable"`: If this material can be crystallized in an autoclave.
+* `"generate_lens"`: Generate a lens for this material. Requires `"generate_plate"`.
+
+Available MaterialFlags for Materials with `OreProperty`:
+
+* `"high_sifter_output"`: If this material has a higher output when the Crushed Purified Ore is processed in the Sifter.
+
+#### Adding Flags to a Material
+
+`flags`: _`flags(string[] names)`_
+Add MaterialFlags to this Material.
+
+* `names` - a string array of the names of specific MaterialFlags.
+
+#### Example:
+
+```groovy
+import gregtech.api.GregTechAPI.MaterialEvent
+import gregtech.api.unification.material.Material
+
+event_manager.listen { MaterialEvent event ->
+ def specialSteelFlagged = new Material.Builder(32004, "special_steel_flagged") // name
+ .fluid("gas", false) // gas without block
+ .ingot() // has ingot (and therefore dust)
+ .color(0x0000FF) // pure blue
+ .iconSet("shiny") // iconset to the shiny type
+ .flags(["generate_plate", "generate_foil"]) // add flags
+ .toolStats(10, 3, 256, 21) // tool stats
+ .blastTemp(2900) // EBF temperature
+ .ore() // has ore blocks
+ .addOreByproducts(material('gold'), material('copper')) // add byproducts
+ .cableProperties(128, 2, 4, false) // add cables
+ .build() // build the actual material
+}
+```
+
+### Elements
+
+`Element` is used to specify a material as element. CEu has the periodic table, so you probably won't need it much.
+
+`Elements.add`:
+_`Elements.add(long protons, long neutrons, long halfLifeSeconds, String decayTo, String name, String symbol, boolean isIsotope)`_
+Add a new element.
+
+* `protons` - Amount of Protons
+* `neutrons` - Amount of Neutrons
+* `halfLifeSeconds` - Amount of Half Life this Material has in Seconds. `-1` for stable Materials
+* `decayTo` - String representing the Elements it decays to. Separated by an '&' character
+* `name` - Name of the Element
+* `symbol` - Symbol of the Element
+
+`Elements.get`: _`Elements.get(String name)`_
+
+* `name` - the name of the element
+ Get the element by name.
+
+ protons | netrons | halfLifeSeconds | decayTo | name | symbol | isIsotope
+---------|---------|-----------------|---------|--------------------|----------|-----------
+ 1 | 0 | -1 | null | "Hydrogen" | "H" | false
+ 1 | 1 | -1 | "H" | "Deuterium" | "D" | true
+ 1 | 2 | -1 | "D" | "Tritium" | "T" | true
+ 2 | 2 | -1 | null | "Helium" | "He" | false
+ 2 | 1 | -1 | "H&D" | "Helium-3" | "He-3" | true
+ 3 | 4 | -1 | null | "Lithium" | "Li" | false
+ 4 | 5 | -1 | null | "Beryllium" | "Be" | false
+ 5 | 5 | -1 | null | "Boron" | "B" | false
+ 6 | 6 | -1 | null | "Carbon" | "C" | false
+ 7 | 7 | -1 | null | "Nitrogen" | "N" | false
+ 8 | 8 | -1 | null | "Oxygen" | "O" | false
+ 9 | 9 | -1 | null | "Fluorine" | "F" | false
+ 10 | 10 | -1 | null | "Neon" | "Ne" | false
+ 11 | 11 | -1 | null | "Sodium" | "Na" | false
+ 12 | 12 | -1 | null | "Magnesium" | "Mg" | false
+ 13 | 13 | -1 | null | "Aluminium" | "Al" | false
+ 14 | 14 | -1 | null | "Silicon" | "Si" | false
+ 15 | 15 | -1 | null | "Phosphorus" | "P" | false
+ 16 | 16 | -1 | null | "Sulfur" | "S" | false
+ 17 | 18 | -1 | null | "Chlorine" | "Cl" | false
+ 18 | 22 | -1 | null | "Argon" | "Ar" | false
+ 19 | 20 | -1 | null | "Potassium" | "K" | false
+ 20 | 20 | -1 | null | "Calcium" | "Ca" | false
+ 21 | 24 | -1 | null | "Scandium" | "Sc" | false
+ 22 | 26 | -1 | null | "Titanium" | "Ti" | false
+ 23 | 28 | -1 | null | "Vanadium" | "V" | false
+ 24 | 28 | -1 | null | "Chrome" | "Cr" | false
+ 25 | 30 | -1 | null | "Manganese" | "Mn" | false
+ 26 | 30 | -1 | null | "Iron" | "Fe" | false
+ 27 | 32 | -1 | null | "Cobalt" | "Co" | false
+ 28 | 30 | -1 | null | "Nickel" | "Ni" | false
+ 29 | 34 | -1 | null | "Copper" | "Cu" | false
+ 30 | 35 | -1 | null | "Zinc" | "Zn" | false
+ 31 | 39 | -1 | null | "Gallium" | "Ga" | false
+ 32 | 40 | -1 | null | "Germanium" | "Ge" | false
+ 33 | 42 | -1 | null | "Arsenic" | "As" | false
+ 34 | 45 | -1 | null | "Selenium" | "Se" | false
+ 35 | 45 | -1 | null | "Bromine" | "Br" | false
+ 36 | 48 | -1 | null | "Krypton" | "Kr" | false
+ 37 | 48 | -1 | null | "Rubidium" | "Rb" | false
+ 38 | 49 | -1 | null | "Strontium" | "Sr" | false
+ 39 | 50 | -1 | null | "Yttrium" | "Y" | false
+ 40 | 51 | -1 | null | "Zirconium" | "Zr" | false
+ 41 | 53 | -1 | null | "Niobium" | "Nb" | false
+ 42 | 53 | -1 | null | "Molybdenum" | "Mo" | false
+ 43 | 55 | -1 | null | "Technetium" | "Tc" | false
+ 44 | 57 | -1 | null | "Ruthenium" | "Ru" | false
+ 45 | 58 | -1 | null | "Rhodium" | "Rh" | false
+ 46 | 60 | -1 | null | "Palladium" | "Pd" | false
+ 47 | 60 | -1 | null | "Silver" | "Ag" | false
+ 48 | 64 | -1 | null | "Cadmium" | "Cd" | false
+ 49 | 65 | -1 | null | "Indium" | "In" | false
+ 50 | 68 | -1 | null | "Tin" | "Sn" | false
+ 51 | 70 | -1 | null | "Antimony" | "Sb" | false
+ 52 | 75 | -1 | null | "Tellurium" | "Te" | false
+ 53 | 74 | -1 | null | "Iodine" | "I" | false
+ 54 | 77 | -1 | null | "Xenon" | "Xe" | false
+ 55 | 77 | -1 | null | "Caesium" | "Cs" | false
+ 56 | 81 | -1 | null | "Barium" | "Ba" | false
+ 57 | 81 | -1 | null | "Lanthanum" | "La" | false
+ 58 | 82 | -1 | null | "Cerium" | "Ce" | false
+ 59 | 81 | -1 | null | "Praseodymium" | "Pr" | false
+ 60 | 84 | -1 | null | "Neodymium" | "Nd" | false
+ 61 | 83 | -1 | null | "Promethium" | "Pm" | false
+ 62 | 88 | -1 | null | "Samarium" | "Sm" | false
+ 63 | 88 | -1 | null | "Europium" | "Eu" | false
+ 64 | 93 | -1 | null | "Gadolinium" | "Gd" | false
+ 65 | 93 | -1 | null | "Terbium" | "Tb" | false
+ 66 | 96 | -1 | null | "Dysprosium" | "Dy" | false
+ 67 | 97 | -1 | null | "Holmium" | "Ho" | false
+ 68 | 99 | -1 | null | "Erbium" | "Er" | false
+ 69 | 99 | -1 | null | "Thulium" | "Tm" | false
+ 70 | 103 | -1 | null | "Ytterbium" | "Yb" | false
+ 71 | 103 | -1 | null | "Lutetium" | "Lu" | false
+ 72 | 106 | -1 | null | "Hafnium" | "Hf" | false
+ 73 | 107 | -1 | null | "Tantalum" | "Ta" | false
+ 74 | 109 | -1 | null | "Tungsten" | "W" | false
+ 75 | 111 | -1 | null | "Rhenium" | "Re" | false
+ 76 | 114 | -1 | null | "Osmium" | "Os" | false
+ 77 | 115 | -1 | null | "Iridium" | "Ir" | false
+ 78 | 117 | -1 | null | "Platinum" | "Pt" | false
+ 79 | 117 | -1 | null | "Gold" | "Au" | false
+ 80 | 120 | -1 | null | "Mercury" | "Hg" | false
+ 81 | 123 | -1 | null | "Thallium" | "Tl" | false
+ 82 | 125 | -1 | null | "Lead" | "Pb" | false
+ 83 | 125 | -1 | null | "Bismuth" | "Bi" | false
+ 84 | 124 | -1 | null | "Polonium" | "Po" | false
+ 85 | 124 | -1 | null | "Astatine" | "At" | false
+ 86 | 134 | -1 | null | "Radon" | "Rn" | false
+ 87 | 134 | -1 | null | "Francium" | "Fr" | false
+ 88 | 136 | -1 | null | "Radium" | "Ra" | false
+ 89 | 136 | -1 | null | "Actinium" | "Ac" | false
+ 90 | 140 | -1 | null | "Thorium" | "Th" | false
+ 91 | 138 | -1 | null | "Protactinium" | "Pa" | false
+ 92 | 146 | -1 | null | "Uranium" | "U" | false
+ 92 | 146 | -1 | null | "Uranium-238" | "U-238" | false
+ 92 | 143 | -1 | null | "Uranium-235" | "U-235" | true
+ 93 | 144 | -1 | null | "Neptunium" | "Np" | false
+ 94 | 152 | -1 | null | "Plutonium" | "Pu" | false
+ 94 | 145 | -1 | null | "Plutonium-239" | "Pu-239" | false
+ 94 | 149 | -1 | null | "Plutonium-241" | "Pu-241" | true
+ 95 | 150 | -1 | null | "Americium" | "Am" | false
+ 96 | 153 | -1 | null | "Curium" | "Cm" | false
+ 97 | 152 | -1 | null | "Berkelium" | "Bk" | false
+ 98 | 153 | -1 | null | "Californium" | "Cf" | false
+ 99 | 153 | -1 | null | "Einsteinium" | "Es" | false
+ 100 | 157 | -1 | null | "Fermium" | "Fm" | false
+ 101 | 157 | -1 | null | "Mendelevium" | "Md" | false
+ 102 | 157 | -1 | null | "Nobelium" | "No" | false
+ 103 | 159 | -1 | null | "Lawrencium" | "Lr" | false
+ 104 | 161 | -1 | null | "Rutherfordium" | "Rf" | false
+ 105 | 163 | -1 | null | "Dubnium" | "Db" | false
+ 106 | 165 | -1 | null | "Seaborgium" | "Sg" | false
+ 107 | 163 | -1 | null | "Bohrium" | "Bh" | false
+ 108 | 169 | -1 | null | "Hassium" | "Hs" | false
+ 109 | 167 | -1 | null | "Meitnerium" | "Mt" | false
+ 110 | 171 | -1 | null | "Darmstadtium" | "Ds" | false
+ 111 | 169 | -1 | null | "Roentgenium" | "Rg" | false
+ 112 | 173 | -1 | null | "Copernicium" | "Cn" | false
+ 113 | 171 | -1 | null | "Nihonium" | "Nh" | false
+ 114 | 175 | -1 | null | "Flerovium" | "Fl" | false
+ 115 | 173 | -1 | null | "Moscovium" | "Mc" | false
+ 116 | 177 | -1 | null | "Livermorium" | "Lv" | false
+ 117 | 177 | -1 | null | "Tennessine" | "Ts" | false
+ 118 | 176 | -1 | null | "Oganesson" | "Og" | false
+ 119 | 178 | -1 | null | "Tritanium" | "Tr" | false
+ 120 | 180 | -1 | null | "Duranium" | "Dr" | false
+ 125 | 198 | -1 | null | "Trinium" | "Ke" | false
+ 174 | 352 | 140 | null | "Naquadah" | "Nq" | true
+ 174 | 354 | 140 | null | "NaquadahEnriched" | "Nq+" | true
+ 174 | 348 | 140 | null | "Naquadria" | "Nq" | true
+ 0 | 1000 | -1 | null | "Neutronium" | "Nt" | false
+ 750 | 1000 | -1 | null | "Adamantium" | "Ad" | false
+ 850 | 900 | -1 | null | "Vibranium" | "Vb" | false
+ 550 | 670 | -1 | null | "Taranium" | "Tn" | false
+
+#### Elemental Material Example
+
+```groovy
+import gregtech.api.GregTechAPI.MaterialEvent
+import gregtech.api.unification.material.Material
+import gregtech.api.unification.Elements
+
+// elements can be created outside the event
+def CEu = Elements.add(999, 999, -1, null, "GTCEu", "CEu", false) // create a new element.
+
+event_manager.listen { MaterialEvent event ->
+ def element_material = new Material.Builder(32006, "element_material").element("GTCEu").build()
+
+ def Au = Elements.get("Gold") // get an existing element.
+
+ def element_material = new Material.Builder(32007, "element_material").element("Gold").build()
+}
+```
+
+***
+
+## Material Creation Full Examples
+
+```groovy
+import gregtech.api.GregTechAPI.MaterialEvent
+import gregtech.api.unification.material.Material
+
+event_manager.listen { MaterialEvent event ->
+
+ new Material.Builder(32000, "red_iron")
+ .ingot().fluid()
+ .color(0xF7B29B)
+ .flags(["generate_plate", "generate_rod", "generate_gear", "decomposition_by_centrifuging"])
+ .components([material('iron') * 1, material('redstone') * 1])
+ .cableProperties(32, 2, 1)
+ .build()
+
+ new Material.Builder(32001, "glowing_redstone")
+ .dust()
+ .color(0x774D05).iconSet("bright")
+ .flags(["decomposition_by_centrifuging"])
+ .components([material('glowstone') * 1, material('redstone') * 1])
+ .build()
+
+ new Material.Builder(32002, "rare_iron")
+ .ingot().fluid()
+ .color(0x6AE26E).iconSet("bright")
+ .flags(["generate_plate", "generate_rod", "generate_gear", "disable_decomposition"])
+ .components([material('iron') * 1, material('rare_earth') * 1])
+ .cableProperties(8, 2, 1)
+ .build()
+
+ new Material.Builder(32003, "obsidian_steel")
+ .ingot().fluid()
+ .color(0x414751).iconSet("metallic")
+ .flags(["generate_plate", "generate_rod", "disable_decomposition"])
+ .components([material('steel') * 1, material('obsidian') * 1])
+ .build()
+
+ new Material.Builder(32004, "silicon_steel")
+ .ingot().fluid()
+ .color(0xB2C0C1).iconSet("shiny")
+ .flags(["generate_plate", "generate_rod", "generate_gear", "decomposition_by_centrifuging"])
+ .components([material('steel') * 1, material('silicon') * 1])
+ .build()
+
+ new Material.Builder(32005, "rare_gold")
+ .ingot().fluid()
+ .color(0x755C40)
+ .flags(["generate_plate", "disable_decomposition"])
+ .components([material('gold') * 1, material('rare_earth') * 1])
+ .build()
+}
+```
+
+## Modifying existing Materials.
+
+See the **Retrieving Existing Materials** section for information on retrieving existing materials.
+
+The material registry can do more than just get materials.
+
+_`MaterialRegistry.get(String materialName)`_
+
+* `materialName` - get a `Material` by its unlocalized name.
+
+_`MaterialRegistry.getAllMaterials()`_ get
+
+* get a list of every material registered
+
+Materials also have more methods and fields.
+
+**Getters:**
+
+_`getChemicalFormula()`_
+
+* returns a string representation of the internal chemical formula (i.e. "H2O")
+
+_`materialRGB`_ get default materialRGB.
+
+* returns the in color of the material
+
+_`radioactive`_
+
+* returns whether the material is radioactive
+
+_`protons`_
+
+* returns the number of protons in the material
+
+_`neutrons`_
+
+* returns the number of neutrons in the material
+
+_`mass`_
+
+* returns the total amount of mass in the material
+
+_`averageProtons`_
+
+* returns the amount of protons divided by total amount of components in the material
+
+_`averageNeutrons`_
+
+* returns the amount of neutrons divided by total amount of components in the material
+
+_`averageMass`_
+
+* returns the amount of mass divided by total amount of components in the material
+
+_`blastTemperature`_
+
+* returns the material's blast furnace temperature
+
+_`camelCaseName`_ get default camelCaseName.
+
+* returns the string camelCase form of the material's unlocalized name. I.e. a name of "my_material" returns "
+ myMaterial"
+
+_`unlocalizedName`_
+
+* returns the string of the material's unlocalized name
+
+_`localizedName`_
+
+* returns the string of the material's localized (translated) name
+
+_`name`_
+
+* returns toString() used on the material internally
+
+**Setters:**
+
+_`setFormula(String formula, @Optional boolean withFormatting)`_
+
+Sets the internal formula and thus tooltip of this Material.
+
+* `formula` - the string to set the formula to
+* `@Optional withFormatting` - whether to apply number formatting (subscripts, etc) to the formula and tooltip
+
+_`addFlags(String[] names)`_
+
+Adds additional flags to this Material.
+
+* `names` - a string array of flags to add
+
+_`setMaterialRGB(int materialRGB)`_
+
+Sets the color of this Material.
+
+* `materialRGB` - the int color to set. Accepts the raw int value or values in the `0x` format.
+
+### Example
+
+```groovy
+import gregtech.api.GregTechAPI.PostMaterialEvent
+
+event_manager.listen { PostMaterialEvent event ->
+ def gold = material('gold')
+ def name = gold.toString() // "gold"
+ def color = gold.getMaterialRGB() // 0xFFE650
+ gold.setFormula("(Au)2Au", true) // set formula
+ def formula = gold.getChemicalFormula() // "(Au)2Au"
+ gold.addFlags("generate_long_rod", "generate_gear") // add gold long rod, add gold gear
+}
+```
\ No newline at end of file
diff --git a/docs/zh/groovyscript/mods/gtceu/multiblock.md b/docs/zh/groovyscript/mods/gtceu/multiblock.md
new file mode 100644
index 0000000..4ec8fe5
--- /dev/null
+++ b/docs/zh/groovyscript/mods/gtceu/multiblock.md
@@ -0,0 +1,100 @@
+# GregTech Multiblocks
+
+First of all, there is no special compat for multiblocks. We are simple doing it the java way in groovy, which makes it
+complicated, but also highly customizable.
+
+First we need to decide what kind of multiblock we want. For example do you want a multiblock with custom behaviour like
+the tesla tower from MechTech or do you want a multiblock which can run recipes. Here we will only focus on the later.
+
+## Making a multiblock class
+Let's take the vacuum freezer for example:
+````groovy
+import gregtech.api.metatileentity.MetaTileEntity
+import gregtech.api.metatileentity.interfaces.IGregTechTileEntity
+import gregtech.api.metatileentity.multiblock.IMultiblockPart
+import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController
+import gregtech.api.pattern.BlockPattern
+import gregtech.api.pattern.FactoryBlockPattern
+import gregtech.api.recipes.RecipeMaps
+import gregtech.client.renderer.ICubeRenderer
+import gregtech.client.renderer.texture.Textures
+import gregtech.common.blocks.BlockMetalCasing.MetalCasingType
+import gregtech.common.blocks.MetaBlocks
+
+class MetaTileEntityVacuumFreezer extends RecipeMapMultiblockController {
+
+ /*(1)*/
+ MetaTileEntityVacuumFreezer(ResourceLocation metaTileEntityId) {
+ super(metaTileEntityId, RecipeMaps.VACUUM_RECIPES) /*(2)*/
+ }
+
+ @Override
+ MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) {
+ return new MetaTileEntityVacuumFreezer(metaTileEntityId) /*(3)*/
+ }
+
+ @Override
+ protected BlockPattern createStructurePattern() {
+ return FactoryBlockPattern.start() /*(4)*/
+ .aisle("XXX", "XXX", "XXX")
+ .aisle("XXX", "X#X", "XXX")
+ .aisle("XXX", "XSX", "XXX")
+ .where('S', selfPredicate())
+ .where('X', states(getCasingState()).setMinGlobalLimited(14).or(autoAbilities()))
+ .where('#', air())
+ .build()
+ }
+
+ @Override
+ ICubeRenderer getBaseTexture(IMultiblockPart sourcePart) {
+ return Textures.FROST_PROOF_CASING /*(5)*/
+ }
+
+ /*(6)*/
+ protected IBlockState getCasingState() {
+ return MetaBlocks.METAL_CASING.getState(MetalCasingType.ALUMINIUM_FROSTPROOF)
+ }
+
+ /*(7)*/
+ @Override
+ protected ICubeRenderer getFrontOverlay() {
+ return Textures.VACUUM_FREEZER_OVERLAY
+ }
+}
+````
+
+1. This is the constructor.
+2. Pass the id and a recipe map to the super constructor.
+3. In this method you need to create a new copy of the controller.
+4. Here the structure is defined. This part is similar to mbt.
+5. This defines what texture busses and hatches will have when the structure is formed.
+6. This is a helper method to make the structure code look cleaner.
+7. The overlay texture of the controller.
+
+## Registering the multiblock
+Now we have a defined a multiblock, but we need to also register it. I recommend to do this in preInit
+
+````groovy
+import gregtech.common.metatileentities.MetaTileEntities
+
+MetaTileEntities.register(int id, MetaTileEntity mte) // id is the meta value of the controller. We recommend the range from 32000 - 32766
+````
+This is how register any `MetaTileEntity`. Yes, our multiblock controller is also a `MetaTileEntity`. Therefore, we can do
+````groovy
+import gregtech.common.metatileentities.MetaTileEntities
+
+MetaTileEntities.register(32000, new MetaTileEntityVacuumFreezer(new ResourceLocation("gregtech", "vacuum_freezer")))
+````
+To create the controller we simply call its constructor, which needs a `ResourceLocation`.
+If you want to create a recipe for the controller you can get the item form like this
+````groovy
+metaitem("vacuum_freezer")
+````
+If the domain of the resource location is not `gregtech`, but for example `nomifactory`, then it will be
+````groovy
+metaitem("nomifactory:vacuum_freezer")
+````
+See [resource location](../../rl.md)
+
+## More examples
+[WIP]
\ No newline at end of file
diff --git a/docs/zh/groovyscript/mods/gtceu/recipes.md b/docs/zh/groovyscript/mods/gtceu/recipes.md
new file mode 100644
index 0000000..3c3395f
--- /dev/null
+++ b/docs/zh/groovyscript/mods/gtceu/recipes.md
@@ -0,0 +1,68 @@
+# Recipes
+
+GTCEu has a great recipe structure. Adding and removing is pretty much the same for each machine.
+Recipes for a machine are stored in a `RecipeMap`.
+You can get a recipe map like this:
+````groovy
+def recipeMap = mods.gregtech.recipe_map_name
+// this works also:
+def recipeMap2 = recipemap('recipe_map_name')
+````
+You can find a list of all machines [here](https://github.com/GregTechCEu/GregTech/wiki/CraftTweaker-for-Machines).
+Let's use `alloy_smelter` as an example here.
+With the recipe map you can create a recipe builder.
+````groovy
+mods.gregtech.alloy_smelter.recipeBuilder()
+````
+You don't know what a builder is? Check [this](../../../groovy/builder.md) out.
+
+## Builder functions
+GregTechs recipe builder has tons of helper functions. We'll only focus on the important ones.
+
+### Adding inputs
+Works for fluid and items
+````groovy
+inputs(IIngredient ingredient)
+inputs(IIngredient... ingredients)
+inputs(Collection ingredients)
+notConsumable(IIngredient ingredient) // this will not be consumed
+````
+
+### Adding outputs
+````groovy
+outputs(ItemStack)
+outputs(ItemStack...)
+outputs(Collection)
+chancedOutput(ItemStack, int chance, int tierChanceBoost) // this will not be consumed
+
+fluidOutputs(FluidStack)
+fluidOutputs(FluidStack...)
+fluidOutputs(Collection)
+````
+
+### Other
+````groovy
+duration(int duration) // base recipe duration int ticks (20 ticks = 1 sec)
+EUt(int EUt)
+hidden() // hides recipe in jei
+
+cleanroom(CleanroomType) // makes the recipe require cleanroom
+````
+
+### Register recipe
+````groovy
+buildAndRegister()
+````
+
+## Example
+````groovy
+import gregtech.api.metatileentity.multiblock.CleanroomType // needed when you want to use cleanroom
+
+mods.gregtech.alloy_smelter.recipeBuilder()
+ .inputs(item('minecraft:dirt'), ore('stone'))
+ .outputs(item('minecraft:nether_star') * 2)
+ .cleanroom(CleanroomType.CLEANROOM) // CLEANROOM and STERILE_CLEANROOM are valid
+ .duration(200) // 10 seconds
+ .EUt(512) // HV recipe
+ .buildAndRegister()
+````
\ No newline at end of file
diff --git a/docs/zh/groovyscript/mods/gtceu/terminal.md b/docs/zh/groovyscript/mods/gtceu/terminal.md
new file mode 100644
index 0000000..d4d396c
--- /dev/null
+++ b/docs/zh/groovyscript/mods/gtceu/terminal.md
@@ -0,0 +1,2 @@
+# Terminal
+[WIP]
\ No newline at end of file
diff --git a/docs/zh/groovyscript/mods/jei.md b/docs/zh/groovyscript/mods/jei.md
new file mode 100644
index 0000000..35aeeb6
--- /dev/null
+++ b/docs/zh/groovyscript/mods/jei.md
@@ -0,0 +1,35 @@
+# Just Enough Items
+
+!!! Note
+ Requires GroovyScript 0.3.1+
+
+In all methods you can replace `jei` with `hei`.
+
+## Hiding
+````groovy
+mods.jei.hide(IIngredient)
+````
+
+## Remove and Hiding
+````groovy
+mods.jei.removeAndHide(IIngredient)
+// is exactly the same but with a cooler name
+mods.jei.yeet(IIngredient)
+````
+
+## Hiding categories
+A list of categories can be obtained by running /gs jeiCategories in game.
+````groovy
+mods.jei.hideCategory(String)
+````
+
+## Examples
+````groovy
+// hides nether star in jei
+mods.jei.hide(item('minecraft:nether_star'))
+// hides and removes all iron ingots and its crafting recipes
+mods.jei.removeAndHide(ore('ingotIron'))
+// hides all smelting recipes
+mods.jei.hideCategory('minecraft.smelting')
+````
+
diff --git a/docs/zh/groovyscript/mods/mekanism/crusher.md b/docs/zh/groovyscript/mods/mekanism/crusher.md
new file mode 100644
index 0000000..458fbbc
--- /dev/null
+++ b/docs/zh/groovyscript/mods/mekanism/crusher.md
@@ -0,0 +1,16 @@
+# Mekanism Crusher
+
+Add recipe
+```groovy
+mods.mekanism.crusher.add(IIngredient input, ItemStack output)
+```
+
+!!! example
+ ```groovy
+ mods.mekanism.crusher.add(ore('ingotIron'), item('minecraft:nether_star'))
+ ```
+
+Remove recipe
+```groovy
+mods.mekanism.crusher.remove(ItemStack output)
+```
\ No newline at end of file
diff --git a/docs/zh/groovyscript/mods/thaumcraft/ArcaneWorkbench.md b/docs/zh/groovyscript/mods/thaumcraft/ArcaneWorkbench.md
new file mode 100644
index 0000000..a3785db
--- /dev/null
+++ b/docs/zh/groovyscript/mods/thaumcraft/ArcaneWorkbench.md
@@ -0,0 +1,182 @@
+# Arcane Workbench
+
+The recipe builder for the Arcane Workbench works very similar to the vanilla [Crafting Table](../../minecraft/crafting_builders.md). Except that you can add a required Research, Vis and Aspects.
+
+### Adding Shapeless Recipes
+
+Just like other recipe types, the Arcane Workbench also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+
+```groovy
+mods.thaumcraft.ArcaneWorkbench.shapelessBuilder()
+```
+
+Adding inputs: (requires 1-9)
+
+```groovy
+.input(IIngredient)
+.input(IIngredient...)
+.input(Collection)
+```
+
+Adding outputs: (requires exactly 1)
+
+```groovy
+.output(ItemStack)
+```
+
+Adding research requirement: (optional (default is ""))
+
+```groovy
+.researchKey(String/*(1)!*/)
+```
+
+1. Please see the examples below to better understand how this works
+
+Adding aspects: (optional)
+
+```groovy
+.aspect(AspectStack/*(1)!*/)
+```
+
+1. Must be a primal aspect: Ignis, Terra, Aer, Ordo, Aqua, or Perditio
+
+Adding vis requirement: (optional (default is 0))
+
+```groovy
+.vis(int/*(1)!*/)
+```
+
+1. Amount of vis required to craft, must be >= 0.
+
+Register recipe: (returns nothing)
+
+```groovy
+.register()
+```
+
+### Example
+
+```groovy
+mods.thaumcraft.ArcaneWorkbench.shapelessBuilder()
+ .researchKey('UNLOCKALCHEMY@3')
+ .input(item('minecraft:pumpkin'))
+ .input(item('minecraft:stick'))
+ .input(item('minecraft:stick'))
+ .output(item('thaumcraft:void_hoe'))
+ .vis(0)
+ .register()
+```
+
+### Adding Shaped Recipes
+
+```groovy
+mods.thaumcraft.ArcaneWorkbench.shapedBuilder()
+```
+
+Creating the recipe's layout (required):
+
+```groovy
+row(String/*(1)!*/)
+
+matrix(String... matrix/*(2)!*/)
+shape(String... matrix) // does the same thing as matrix()
+
+// to input a matrix in the style of non-builder shaped addition
+matrix(List> matrix)
+shape(List> matrix)
+```
+
+1. Must be called exactly 3 times, requires a String of length 3 characters. For empty slots use ` ` (space). See examples.
+1. Matrix must be an array of 3 Strings, each of length 3 characters. For empty slots use ` ` (space). See examples.
+
+Matching ingredients to the recipe layout (required):
+
+```groovy
+.key(Char, IIngredient)/*(1)!*/
+```
+
+1. Char is the ASCII character which represents the slot(s) in the recipe IIngredient will occupy.
+
+Adding outputs: (requires exactly 1)
+
+```groovy
+.output(ItemStack)
+```
+
+Adding research requirement: (optional (default is ""))
+
+```groovy
+.researchKey(String/*(1)!*/)
+```
+
+1. The Research Key is the required research to craft the item, research is unlocked via the Thaumonomicon. Obtain a list of all research keys by doing `/tc research list`.
+
+Adding aspects: (optional)
+
+```groovy
+.aspect(AspectStack/*(1)!*/)
+```
+
+1. Must be a primal aspect: Ignis, Terra, Aer, Ordo, Aqua, or Perditio
+
+Adding vis requirement: (optional (default is 0))
+
+```groovy
+.vis(int/*(1)!*/)
+```
+
+1. Amount of vis required to craft, must be >= 0.
+
+Allow mirroring: (optional)
+
+```groovy
+.mirrored()/*(1)!*/
+```
+
+1. If called, the resultant recipe inputs can be mirrored along the x and y axis (see vanilla Axe recipes).
+
+Register recipe: (returns nothing)
+
+```groovy
+.register()
+```
+
+### Example
+
+```groovy
+mods.thaumcraft.ArcaneWorkbench.shapedBuilder()
+ .researchKey('UNLOCKALCHEMY@3')
+ .output(item('minecraft:pumpkin'))
+ .row('SS ')
+ .row(' ')
+ .row(' ')
+ .key('S', item('minecraft:pumpkin_seeds'))
+ .aspect(aspect('terra'))
+ .vis(5)
+ .register()
+
+mods.thaumcraft.ArcaneWorkbench.shapedBuilder()
+ .researchKey('UNLOCKALCHEMY@3')
+ .output(item('minecraft:pumpkin'))
+ .matrix('SS ',
+ ' ',
+ ' ')
+ .key('S', item('minecraft:pumpkin_seeds'))
+ .aspect(aspect('terra'))
+ .vis(5)
+ .register()
+```
+
+### Removing Recipes
+
+This removes ALL recipes that match the given output:
+
+```groovy
+mods.thaumcraft.ArcaneWorkbench.removeByOutput(IIngredient)
+```
+
+!!! example
+ ```groovy
+ mods.thaumcraft.ArcaneWorkbench.removeByOutput(item('thaumcraft:mechanism_simple'))
+ ```
diff --git a/docs/zh/groovyscript/mods/thaumcraft/Aspects.md b/docs/zh/groovyscript/mods/thaumcraft/Aspects.md
new file mode 100644
index 0000000..271434c
--- /dev/null
+++ b/docs/zh/groovyscript/mods/thaumcraft/Aspects.md
@@ -0,0 +1,138 @@
+# Aspects
+
+### GroovyScript syntax
+
+To help with aspects in Thaumcraft the following bracket handlers have been added:
+
+- `aspect('') * ` returns `AspectStack` (a vis - amount pairing)
+- `crystal('')` returns ItemStack containing vis crystal of the specified aspect
+
+`aspect('')` when no `` is specified the default value is 1
+
+### AspectStack
+
+An Aspect wrapper with the following methods:
+
+- `AspectStack#getCrystal()` same as `crystal('')`
+- `AspectStack#getPhial()` returns ItemStack containing a phial of the specified aspect
+
+### Creating Aspects
+
+The following builder is for creating new Aspects.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+
+```groovy
+mods.thaumcraft.Aspect.aspectBuilder()
+```
+
+Adding name: (required)
+
+```groovy
+.tag(String/*(1)!*/)
+```
+
+1. Name of the new aspect.
+
+Adding component aspects: (requires exactly 0 or exactly 2)
+
+```groovy
+.component(AspectStack/*(1)!*/)
+```
+
+1. Aspects which make up the new aspect.
+
+Adding sprite image: (required)
+This is a [resource location](../../rl.md).
+```groovy
+.image(String)/*(1)!*/
+.image(String mod, String path)/*(2)!*/
+```
+
+1. Path to the new aspect's target sprite in the Thaumcraft assets folder.
+2. Path to the new aspect's target sprite in the "mod" assets folder.
+
+Adding chat color: (required)
+
+```groovy
+.chatColor(int/*(1)!*/)
+```
+
+1. int should be in hexadecimal RGB format (example: 0x00FF00).
+
+Register aspect: (returns nothing)
+
+```groovy
+.register()
+```
+
+### Example
+
+```groovy
+mods.thaumcraft.Aspect.aspectBuilder()
+ .tag('humor')
+ .chatColor(0xD5D4EC)
+ .component(aspect('cognito'))
+ .component(aspect('perditio'))
+ .image('textures/aspects/humor.png')
+ .register()
+```
+
+### Item/Entity Aspects
+
+```groovy
+mods.thaumcraft.AspectHelper.aspectBuilder()
+```
+
+Set target item: (required, item only)
+
+```groovy
+.object(IIngredient) // if object() is called entity() may not be
+```
+
+Set target entity: (required, entity only)
+
+```groovy
+.entity(EntityEntry) // if entity() is called object() may not be
+```
+
+Clear existing aspects: (optional)
+
+```groovy
+.stripAspects()
+```
+
+Add new aspect: (optional)
+
+```groovy
+.aspect(AspectStack)
+```
+
+Register aspects: (returns nothing)
+
+```groovy
+.register()
+```
+
+### Example
+
+```groovy
+// How to remove all aspects for an item
+mods.thaumcraft.AspectHelper.aspectBuilder()
+ .object(item('minecraft:dirt'))
+ .stripAspects()
+ .register()
+
+// Set chickens to have 20 Bestia Essentia
+mods.thaumcraft.AspectHelper.aspectBuilder()
+ .entity(entity('minecraft:chicken'))
+ .stripAspects()
+ .aspect(aspect('bestia') * 20)
+ .register()
+
+// Set Stone blocks to have 20 Ignis Essentia
+mods.thaumcraft.AspectHelper.aspectBuilder()
+ .object(ore('stone'))
+ .stripAspects()
+ .aspect(aspect('ignis') * 20)
+ .register()
+```
diff --git a/docs/zh/groovyscript/mods/thaumcraft/Crucible.md b/docs/zh/groovyscript/mods/thaumcraft/Crucible.md
new file mode 100644
index 0000000..33fd9d0
--- /dev/null
+++ b/docs/zh/groovyscript/mods/thaumcraft/Crucible.md
@@ -0,0 +1,64 @@
+# Crucible
+
+### Adding Recipes
+
+Just like other recipe types, the Crucible also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+
+```groovy
+mods.thaumcraft.Crucible.recipeBuilder()
+```
+
+Adding catalyst: (requires exactly 1)
+
+```groovy
+.catalyst(IIngredient)
+```
+
+Adding outputs: (requires exactly 1)
+
+```groovy
+.output(ItemStack)
+```
+
+Adding research requirement: (optional (default is ""))
+
+```groovy
+.researchKey(String/*(1)!*/)
+```
+
+1. The Research Key is the required research to craft the item, research is unlocked via the Thaumonomicon. Obtain a list of all research keys by doing `/tc research list`.
+
+Adding aspects: (requires at least 1)
+
+```groovy
+.aspect(AspectStack)
+```
+
+Register recipe: (returns nothing)
+
+```groovy
+.register()
+```
+
+### Example
+
+```groovy
+mods.thaumcraft.Crucible.recipeBuilder()
+ .researchKey('UNLOCKALCHEMY@3')
+ .catalyst(item('minecraft:rotten_flesh'))
+ .output(item('minecraft:gold_ingot'))
+ .aspect(aspect('metallum') * 10)
+ .register()
+```
+
+### Removing Recipes
+
+```groovy
+mods.thaumcraft.Crucible.removeByOutput(IIngredient)
+```
+
+!!! example
+ ```groovy
+ mods.thaumcraft.Crucible.removeByOutput(item('minecraft:gunpowder'))
+ ```
diff --git a/docs/zh/groovyscript/mods/thaumcraft/DustTrigger.md b/docs/zh/groovyscript/mods/thaumcraft/DustTrigger.md
new file mode 100644
index 0000000..fdf2d41
--- /dev/null
+++ b/docs/zh/groovyscript/mods/thaumcraft/DustTrigger.md
@@ -0,0 +1,58 @@
+# Dust Trigger (Salis Mundus)
+
+The following builder is for creating new Dust Triggers.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+
+### Add a trigger
+
+```groovy
+mods.thaumcraft.DustTrigger.triggerBuilder()
+```
+
+Adding target: (requires exactly 1)
+
+```groovy
+.target(Block)
+.target(String) // for oreDict triggers
+```
+
+Adding outputs: (requires exactly 1)
+
+```groovy
+.output(ItemStack)
+```
+
+Adding research requirement: (optional (default is ""))
+
+```groovy
+.researchKey(String/*(1)!*/)
+```
+
+1. The Research Key is the required research to craft the item, research is unlocked via the Thaumonomicon. Obtain a list of all research keys by doing `/tc research list`.
+
+Register recipe: (returns nothing)
+
+```groovy
+.register()
+```
+
+### Example
+
+```groovy
+mods.thaumcraft.DustTrigger.triggerBuilder()
+ .researchKey('UNLOCKALCHEMY@3')
+ .target(block('minecraft:obsidian'))
+ .output(item('minecraft:enchanting_table'))
+ .register()
+```
+
+### Remove a trigger
+
+```groovy
+mods.thaumcraft.DustTrigger.removeByOutput(ItemStack)
+```
+
+!!! example
+ ```groovy
+ mods.thaumcraft.DustTrigger.removeByOutput(item('thaumcraft:arcane_workbench'))
+ ```
diff --git a/docs/zh/groovyscript/mods/thaumcraft/Infusion.md b/docs/zh/groovyscript/mods/thaumcraft/Infusion.md
new file mode 100644
index 0000000..9307d4d
--- /dev/null
+++ b/docs/zh/groovyscript/mods/thaumcraft/Infusion.md
@@ -0,0 +1,85 @@
+# Infusion Crafting
+
+### Add a recipe
+
+Just like other recipe types, Infusion Crafting also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+
+```groovy
+mods.thaumcraft.InfusionCrafting.recipeBuilder()
+```
+
+Adding center pedestal item: (requires exactly 1)
+
+```groovy
+.mainInput(IIngredient)
+```
+
+Adding input: (requires at least 1)
+
+```groovy
+.input(IIngredient)
+.input(IIngredient...)
+.input(Collection)
+```
+
+Adding outputs: (requires exactly 1)
+
+```groovy
+.output(ItemStack)
+```
+
+Adding aspects: (requires at least 1)
+
+```groovy
+.aspect(AspectStack)
+```
+
+Adding research requirement: (optional (default is ""))
+
+```groovy
+.researchKey(String/*(1)!*/)
+```
+
+1. The Research Key is the required research to craft the item, research is unlocked via the Thaumonomicon. Obtain a list of all research keys by doing `/tc research list`.
+
+Adding instability: (required)
+
+```groovy
+.instability(int)
+```
+
+Register recipe: (returns nothing)
+
+```groovy
+.register()
+```
+
+### Example
+
+```groovy
+mods.thaumcraft.InfusionCrafting.recipeBuilder()
+ .researchKey('UNLOCKALCHEMY@3')
+ .mainInput(item('minecraft:gunpowder'))
+ .output(item('minecraft:gold_ingot'))
+ .aspect(aspect('terra') * 20)
+ .aspect(aspect('ignis') * 30)
+ .input(crystal('aer'))
+ .input(crystal('ignis'))
+ .input(crystal('aqua'))
+ .input(crystal('terra'))
+ .input(crystal('ordo'))
+ .instability(10)
+ .register()
+```
+
+### Remove a recipe
+
+```groovy
+mods.thaumcraft.InfusionCrafting.removeByOutput(IIngredient)
+```
+
+!!! example
+ ```groovy
+ mods.thaumcraft.InfusionCrafting.removeByOutput(item('thaumcraft:crystal_terra'))
+ ```
diff --git a/docs/zh/groovyscript/mods/thaumcraft/Lootbag.md b/docs/zh/groovyscript/mods/thaumcraft/Lootbag.md
new file mode 100644
index 0000000..739ac29
--- /dev/null
+++ b/docs/zh/groovyscript/mods/thaumcraft/Lootbag.md
@@ -0,0 +1,55 @@
+# Lootbag
+
+## Rarity
+
+Each lootbag modification is rarity specific. Rarities can be specified using the following methods.
+
+```groovy
+mods.thaumcraft.LootBag.getRare()
+mods.thaumcraft.LootBag.getUncommon()
+mods.thaumcraft.LootBag.getCommon()
+```
+
+### Remove All
+
+Removes all items from the specified rarity of lootbag.
+
+```groovy
+.removeAll()
+```
+
+!!! example
+ ```groovy
+ mods.thaumcraft.LootBag.getCommon().removeAll()
+ ```
+
+!!! Bug
+ Armor chances are hard coded into randomized loot function, and are not currently removable.
+
+### Remove
+
+Removes chance for an item from the specified rarity of lootbag.
+
+```groovy
+.removeItem(ItemStack)
+```
+
+!!! example
+ ```groovy
+ mods.thaumcraft.LootBag.getRare().removeItem(item('minecraft:ender_pearl'))
+ ```
+
+### Add
+
+Adds chance for an item in the given rarity of lootbag.
+
+```groovy
+.addItem(ItemStack, int/*(1)!*/)
+```
+
+1. a non-negative weight (higher number = more likely)
+
+!!! example
+ ```groovy
+ mods.thaumcraft.LootBag.getRare().addItem(item('minecraft:diamond_block'), 10)
+ ```
diff --git a/docs/zh/groovyscript/mods/thaumcraft/Research.md b/docs/zh/groovyscript/mods/thaumcraft/Research.md
new file mode 100644
index 0000000..a980186
--- /dev/null
+++ b/docs/zh/groovyscript/mods/thaumcraft/Research.md
@@ -0,0 +1,180 @@
+# Research
+
+### Thaumometer Scanning
+
+The following methods allow for scanning a specified Object with a Thaumometer to discover the Object's component aspects.
+
+```groovy
+mods.thaumcraft.Research.addScannable(Block)
+mods.thaumcraft.Research.addScannable(Enchantment)
+mods.thaumcraft.Research.addScannable(Material)
+mods.thaumcraft.Research.addScannable(Potion)
+```
+
+The following methods specify the research key unlocked by scanning a specified Object, with a Thaumometer.
+
+```groovy
+mods.thaumcraft.Research.addScannable(String, Block)
+mods.thaumcraft.Research.addScannable(String, ItemStack)
+mods.thaumcraft.Research.addScannable(String, Material)
+```
+
+!!! example
+ ```groovy
+ mods.thaumcraft.Research.addScannable('UNLOCKAUROMANCY', item('minecraft:pumpkin'))
+ ```
+
+
+## Modifying The Thaumonomicon
+
+### New Category (research tab)
+
+The following builder is for creating new Research Categories (research tab).
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+
+```groovy
+mods.thaumcraft.Research.researchCategoryBuilder()
+```
+
+Adding category name: (required)
+
+```groovy
+.key(String)
+```
+
+Adding research requirement: (optional (default is ""))
+
+```groovy
+.researchKey(String/*(1)!*/)
+```
+
+1. The Research Key is the required research to craft the item, research is unlocked via the Thaumonomicon. Obtain a list of all research keys by doing `/tc research list`.
+
+Adding required aspects: (optional)
+
+```groovy
+.formulaAspect(AspectStack)/*(1)!*/
+```
+
+1. Aspects specified here must be discovered before the category is revealed in the Thaumonomicon. May be called multiple times.
+
+Adding tab icon: (required)
+This is a [resource location](../../rl.md).
+```groovy
+.icon(String)/*(1)!*/
+.icon(String mod, String path)/*(2)!*/
+```
+
+1. Path to the new tab's icon in the Thaumcraft assets folder.
+2. Path to the new tab's icon in the "mod" assets folder.
+
+Adding background: (required)
+This is a [resource location](../../rl.md).
+```groovy
+.background(String)/*(1)!*/
+.background(String mod, String path)/*(2)!*/
+```
+
+1. Path to the new tab's background in the Thaumcraft assets folder.
+2. Path to the new tab's background in the "mod" assets folder.
+
+Adding background overlay: (optional)
+This is a [resource location](../../rl.md).
+```groovy
+.background2(String)/*(1)!*/
+.background2(String mod, String path)/*(2)!*/
+```
+
+1. Path to the new tab's background overlay in the Thaumcraft assets folder.
+2. Path to the new tab's background overlay in the "mod" assets folder.
+
+Register recipe: (returns nothing)
+
+```groovy
+.register()
+```
+
+### Example
+
+```groovy
+mods.thaumcraft.Research.researchCategoryBuilder()
+ .key('BASICS2')
+ .researchKey('UNLOCKAUROMANCY')
+ .formulaAspect(aspect('herba') * 5)
+ .formulaAspect(aspect('ordo') * 5)
+ .formulaAspect(aspect('perditio') * 5)
+ .formulaAspect(aspect('aer') * 5)
+ .formulaAspect(aspect('ignis') * 5)
+ .formulaAspect(aspect('terra') * 5)
+ .formulaAspect(aspect('aqua') * 5)
+ .icon('textures/aspects/humor.png')
+ .background('textures/gui/gui_research_back_1.jpg')
+ .background2('textures/gui/gui_research_back_over.png')
+ .register()
+```
+
+### Remove Category (research tab)
+
+```groovy
+mods.thaumcraft.Research.removeCategory(String/*(1)!*/)
+```
+
+1. Target tab name.
+
+!!! example
+ ```groovy
+ mods.thaumcraft.Research.removeCategory('BASICS')
+ ```
+
+### New research entries
+
+[WIP]
+
+A research builder has yet to be created, for now this method takes in a json representation of the Thaumonomicon tab's research.
+
+```groovy
+mods.thaumcraft.Research.addResearchLocation(String)/*(1)!*/
+mods.thaumcraft.Research.addResearchLocation(String mod, String path)/*(2)!*/
+```
+
+1. Path to the additional research JSON in the Thaumcraft assets folder.
+2. Path to the additional research JSON in the "mod" assets folder.
+
+!!! example
+ ```groovy
+ mods.thaumcraft.Research.addResearchLocation('thaumcraft', 'research/new.json')
+ ```
+ ```json
+ {
+ "entries" :[
+ {
+ "key": "FIRSTSTEPS",
+ "name": "research.FIRSTSTEPS.title",
+ "icons": [ "thaumcraft:textures/items/thaumonomicon.png" ],
+ "category": "BASICS",
+ "location": [ 0,0 ],
+ "parents": [ "!gotthaumonomicon" ],
+ "siblings": [ "KNOWLEDGETYPES", "!gotdream" ],
+ "meta": [ "ROUND","SPIKY" ],
+ "stages": [
+ {
+ "text": "research.FIRSTSTEPS.stage.1",
+ "required_craft":["thaumcraft:arcane_workbench"],
+ "recipes": ["thaumcraft:salismundusfake"]
+ },
+ {
+ "text": "research.FIRSTSTEPS.stage.2",
+ "required_craft":["thaumcraft:thaumometer"],
+ "required_knowledge":["OBSERVATION;BASICS;1"],
+ "recipes": ["thaumcraft:thaumometer","thaumcraft:salismundusfake"]
+ },
+ {
+ "text": "research.FIRSTSTEPS.stage.3",
+ "recipes": ["thaumcraft:thaumometer","thaumcraft:salismundusfake","thaumcraft:StoneArcane","thaumcraft:BrickArcane"]
+ }
+ ]
+ },
+ { ... }
+ ]
+ }
+ ```
diff --git a/docs/zh/groovyscript/mods/thaumcraft/SmeltingBonus.md b/docs/zh/groovyscript/mods/thaumcraft/SmeltingBonus.md
new file mode 100644
index 0000000..d84c10f
--- /dev/null
+++ b/docs/zh/groovyscript/mods/thaumcraft/SmeltingBonus.md
@@ -0,0 +1,61 @@
+# Smelting Bonus
+
+Add or remove bonus outputs from the Infernal Furnace.
+
+### Adding Bonus
+
+The following builder is for creating new Smelting Bonuses.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+
+```groovy
+mods.thaumcraft.SmeltingBonus.recipeBuilder()
+```
+
+Adding input: (requires exactly 1)
+
+```groovy
+.input(IIngredient/*(1)!*/)
+```
+
+1. Must be a valid furnace input.
+
+Adding outputs: (requires exactly 1)
+
+```groovy
+.output(ItemStack)
+```
+
+Set bonus chance: (optional (default is 33%))
+
+```groovy
+.chance(float/*(1)!*/)
+```
+
+1. 0.0 = 0% / 1.0 = 100%
+
+Register recipe: (returns nothing)
+
+```groovy
+.register()
+```
+
+### Example
+
+```groovy
+mods.thaumcraft.SmeltingBonus.recipeBuilder()
+ .input(item('minecraft:cobblestone'))
+ .output(item('minecraft:stone_button'))
+ .chance(0.2F)
+ .register()
+```
+
+### Removing Bonus
+
+```groovy
+mods.thaumcraft.SmeltingBonus.removeByOutput(ItemStack)
+```
+
+!!! example
+ ```groovy
+ mods.thaumcraft.SmeltingBonus.removeByOutput(item('minecraft:gold_nugget'))
+ ```
diff --git a/docs/zh/groovyscript/mods/thaumcraft/Warp.md b/docs/zh/groovyscript/mods/thaumcraft/Warp.md
new file mode 100644
index 0000000..15e4a42
--- /dev/null
+++ b/docs/zh/groovyscript/mods/thaumcraft/Warp.md
@@ -0,0 +1,23 @@
+# Warp
+
+### Adding Warp
+
+```groovy
+mods.thaumcraft.Warp.addWarp(ItemStack, int) // int must be non-negative
+```
+
+!!! example
+ ```groovy
+ mods.thaumcraft.Warp.addWarp(item('minecraft:pumpkin'), 3)
+ ```
+
+### Removing Warp
+
+```groovy
+mods.thaumcraft.Warp.removeWarp(ItemStack)
+```
+
+!!! example
+ ```groovy
+ mods.thaumcraft.Warp.removeWarp(item('thaumcraft:void_hoe'))
+ ```
\ No newline at end of file
diff --git a/docs/zh/groovyscript/mods/thermal/pulverizer.md b/docs/zh/groovyscript/mods/thermal/pulverizer.md
new file mode 100644
index 0000000..a500d5e
--- /dev/null
+++ b/docs/zh/groovyscript/mods/thermal/pulverizer.md
@@ -0,0 +1,57 @@
+# Thermal Expansion Pulverizer
+
+## Adding Recipes
+Just like other recipe types, the Pulverizer also uses a recipe builder.
+You don't know what a builder is? Check [this](https://groovyscript-docs.readthedocs.io/en/latest/groovy/builder/) out
+```groovy
+mods.thermalexpansion.Pulverizer.recipeBuilder()
+```
+
+Set input: (requires exactly 1)
+```groovy
+.input(IIngredient)
+```
+
+Set output: (requires exactly 1)
+```groovy
+.output(ItemStack)
+```
+
+Set secondary Output: (optional)
+````groovy
+.secondaryOutput(ItemStack) // default chance is 100%
+.secondaryOutput(ItemStack, int chance) // chance is a number from 0 to 100 where 100 is 100%
+````
+
+Set required total energy: (optional (default is 3000))
+```groovy
+.energy(int)
+```
+
+Register recipe: (returns `cofh.thermalexpansion.util.managers.machine.PulverizerManager.PulverizerRecipe`)
+````groovy
+.register()
+````
+
+### Example
+This creates a recipe where bookshelf turns into a diamond with an extra 1% chance for an extra diamond.
+````groovy
+mods.thermalexpansion.Pulverizer.recipeBuilder()
+ .input(item('minecraft:bookshelf'))
+ .output(item('minecraft:diamond'))
+ .secondaryOutput(item('minecraft:diamond'), 1)
+ .energy(2000)
+ .register()
+````
+
+## Removing Recipes
+This removes a recipe that match the given input:
+````groovy
+mods.thermalexpansion.Pulverizer.removeByInput(ItemStack input)
+````
+
+### Example
+````groovy
+// removes recipe with Iron Ingot as input from Pulverizer
+mods.thermalexpansion.Pulverizer.removeByInput(item('minecraft:iron_ingot'))
+````
diff --git a/docs/zh/groovyscript/rl.md b/docs/zh/groovyscript/rl.md
new file mode 100644
index 0000000..74a7d50
--- /dev/null
+++ b/docs/zh/groovyscript/rl.md
@@ -0,0 +1,71 @@
+# Resource Location for Dummies
+
+Minecraft's resource location consists of two strings which usually marks the location of a file. For example model json
+files.
+The minecraft class's name is `net.minecraft.util.ResourceLocation`. It is auto imported to any groovy script (version
+0.4.0+).
+Let's look at how it works.
+As mentioned before it consists of two strings, a domain and a path. The domain is usually a mod id. If the domain is
+not specified it defaults to `minecraft`.
+A resource location can be written as:
+
+- `new ResourceLocation("modid:path")`
+- `new ResourceLocation("modid", "path")`
+
+Both are equal. In GroovyScript there usually exist overrides where you can directly insert mod id and path without
+creating a `ResourceLocation`.
+To clarify: `new ResourceLocation("thaumcraft", "research/SOME_RESEARCH.json")` is the same
+as `new ResourceLocation("thaumcraft:research/SOME_RESEARCH.json")`.
+In the following examples we would write `thaumcraft:research/SOME_RESEARCH.json` to keep it short.
+
+## Converting to file path
+
+In the following `.../.minecraft/` is the instance folder.
+`.minecraft/resources/` is the root resource folder (requires Resource Loader mod). Resources can be in any valid path
+as long as minecraft knows about it.
+Since version 0.4.0 the root folder may also be `.minecraft/groovy/assets/`. Resource packs are also a valid way to load
+resources.
+The whole path is composed of
+
+- the root path
+- the domain (mod id)
+- the path (of the resource location)
+
+Formatted: `rootPath/domain/path`
+
+## Examples
+
+We use `.minecraft/resources` as the root here.
+
+| Resource Location | refers to File path |
+|------------------------------------------|---------------------------------------------------------------|
+| `minecraft:textures/gui/button.png` | `.minecraft/resources/minecraft/textures/gui/button.png` |
+| `textures/gui/button.png` | `.minecraft/resources/minecraft/textures/gui/button.png` |
+| `thaumcraft:research/SOME_RESEARCH.json` | `.minecraft/resources/thaumcraft/research/SOME_RESEARCH.json` |
+
+## Model files
+
+In model or blockstate json files you may also find resource locations. Lets
+take `assets/minecraft/models/block/andesite.json` for example (`assets` being the root folder). In there you will find
+
+````json
+{
+ "parent": "block/cube_all",
+ "textures": {
+ "all": "blocks/stone_andesite"
+ }
+}
+````
+
+Here `"block/cube_all"` and `"blocks/stone_andesite"` are both resource locations. So you might think the texture is
+located in `assets/minecraft/blocks/stone_andesite`, but that is not the case.
+The real path is `assets/minecraft/textures/blocks/stone_andesite.png`. The reason for that is that
+minecraft knows it should point to a texture and prepends `textures/` and appends `.png` to the path.
+It's similar for `"parent": "block/cube_all"` except it points to another model.
+
+## Other uses
+Resource locations are also used as identifiers for game registry entries for example items.
+When you use the item bracket handler you do something like `item('minecraft:iron_ingot')`. Yes `'minecraft:iron_ingot'` is a resource location, except it doesn't point to a resource.
+For game objects like items the resource location is also referred to as the registry name.
+!!! Note
+ Note that you can't use `item('iron_ingot')`. This is disabled by GroovyScript. You must always input the full registry name.
diff --git a/docs/zh/index.md b/docs/zh/index.md
new file mode 100644
index 0000000..aada268
--- /dev/null
+++ b/docs/zh/index.md
@@ -0,0 +1,31 @@
+# 欢迎来到GroovyScript
+
+这是一个在 1.12.2 版本上的脚本模组。
+[加入 Discord 社区(英语)](https://discord.com/invite/m53yxTjjKM).
+
+你没有看到其他人在这个维基百科看到的东西吗?尝试重新加载它。
+
+#### 功能:
+
+1. Groovy:一种功能强大且经过测试的脚本语言
+ - Java 兼容语法 + 可互操作代码;
+ - 静态编译;
+ - 可选动态类型;
+ - 元编程。
+2. 沙盒化:脚本在沙盒中有效运行,敏感操作被列入黑名单,不被调用或引用。
+3. 热重载:能够在不重新启动的情况下测试游戏中的脚本更改:
+ - 大多数(如果不是全部)Forge 注册表对象都可以热重载;
+ - 大多数模组注册表都本地支持。
+4. 事件:使用 Groovy 的闭包轻松的监听 Forge 的事件总线。
+5. 熟悉性:适用于熟悉 CraftTweaker 的人的括号处理程序(目前已实现,可能会在不久的将来删除)。
+6. 信息性:通过命令显示玩家手中物品的丰富信息等。
+7. 优化:确保在使用高效代码实现功能时不会做出任何妥协。
+8. API:为其他模组作者提供出色的代码 API 库,使其模组与 GroovyScript 兼容,例如包/类/方法/字段黑名单。
+### 在哪?
+查看 [this](getting_started.md) 就可以开始了。
+请查看Groovy标签,了解有关Groovy语言的信息。
+请查看GroovyScript文档。
+
+!!! 笔记
+ 这个维基是WIP阶段。仍然有很多信息缺失。我们将感谢任何帮助来改善这个地方。
+ 通过加入我们的 [Discord](https://discord.com/invite/m53yxTjjKM)
\ No newline at end of file
diff --git a/docs/zh/stylesheets/extra.css b/docs/zh/stylesheets/extra.css
new file mode 100644
index 0000000..2bf3d7c
--- /dev/null
+++ b/docs/zh/stylesheets/extra.css
@@ -0,0 +1,3 @@
+[data-md-color-scheme="slate"] {
+ --md-typeset-a-color: #7087E0;
+}
diff --git a/mkdocs.yml b/mkdocs.yml
index 99a6886..a0bfd33 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -1,12 +1,14 @@
-site_name: GroovyScript
+site_name: GroovyScript Wiki
+site_url: https://groovyscript-docs.readthedocs.io
repo_name: CleanroomMC/GroovyScript-Docs
repo_url: https://github.com/CleanroomMC/GroovyScript-Docs
+docs_dir: docs
+
nav:
- - Introduction:
- - index.md
- - Getting Started: getting_started.md
+ - Introduction: index.md
+ - Getting Started: getting_started.md
- "Groovy":
- "Introduction": "groovy/introduction.md"
- "Strings": "groovy/strings.md"
@@ -289,3 +291,41 @@ markdown_extensions:
extra_css:
- stylesheets/extra.css
+
+
+plugins:
+ - search
+ - i18n:
+ default_language: en
+ default_language_only: false
+ docs_structure: folder
+ languages:
+ default:
+ name: Default (en)
+ build: true
+ en:
+ name: English
+ build: true
+ de:
+ name: Deutsch
+ build: true
+ site_name: "GroovyScript Wiki"
+ zh:
+ name: Simplified Chinese
+ bulid: true
+ site_name: "GroovyScript 维基百科"
+ zh-TW:
+ name: Traditional Chinese
+ bulid: true
+ site_name: "GroovyScript 維基百科"
+ nav_translations:
+ de:
+ Introduction: Einführung
+ Getting Started: Erste Schritte
+ zh:
+ Introduction: 简介
+ Getting Started: 第一个步骤
+ zh-TW:
+ Introduction: 概括
+ Getting Started: 第一個步驟
+
diff --git a/requirements.txt b/requirements.txt
index 10f2c47..8d4d5da 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,4 +2,5 @@
jinja2>=3.0.2
markdown>=3.2
mkdocs>=1.3.1
-mkdocs-material>=8.3.9
\ No newline at end of file
+mkdocs-material>=8.3.9
+mkdocs-static-i18n>=0.53
\ No newline at end of file