From e59850d75bdb8b74d5d05a99304e6357ca6c3231 Mon Sep 17 00:00:00 2001 From: BehrRiley Date: Tue, 21 Jul 2026 17:47:29 -0400 Subject: [PATCH 01/10] expand contributing pages --- source/guides/contributing/building.md | 18 ++++++++++++++++++ source/guides/contributing/layout.md | 23 +++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/source/guides/contributing/building.md b/source/guides/contributing/building.md index 7483308..efa8deb 100644 --- a/source/guides/contributing/building.md +++ b/source/guides/contributing/building.md @@ -26,3 +26,21 @@ Follow the setup instructions and then run the BuildTools jar for each version s 3. Open the Maven tab, select `denizen-parent`, and click "Run Maven Build" (the green arrow). After building, the jar will be available in the `target` folder. You can stick this into your test server's plugins folder and all of Denizen should be available. You can repeat step 3 to build the project after making any desired changes. + +### Building the Project (CLI) + +To compile the project and test your changes locally, you can also use [Maven](https://maven.apache.org/) directly from the command line. Run the following command in the root directory of the repository: + +```bash +mvn clean package +``` + +Once the build completes successfully, the compiled plugin jar will be located in the `dist/target` folder. + +### Testing Your Changes + +Before submitting a pull request, ensure you have thoroughly tested your modifications locally on a test server. You are expected to provide proof of testing and instructions on how to replicate your test within your PR description. Once merged into a developmental build, changes are further validated by testers before making their way to an official release. + +### The Review Process + +The Denizen project is intentionally designed to be an educational environment. When you submit a pull request, expect maintainers to leave detailed reviews and point out small nitpicks. This isn't meant to be discouraging; the goal is to help you learn the nuances of the codebase, understand good coding practices, and improve your skills for future contributions. diff --git a/source/guides/contributing/layout.md b/source/guides/contributing/layout.md index 5e6a588..04a511e 100644 --- a/source/guides/contributing/layout.md +++ b/source/guides/contributing/layout.md @@ -8,8 +8,31 @@ Denizen's Project Layout **Denizen** is a plugin for Minecraft servers that parses and interprets a scripting language called **DenizenScript**. The most popular implementation of Denizen is the Spigot implementation, which is the jar you've most likely downloaded many times. At the time of writing, it is the *only* maintained implementation. +### Repository Modules + +Denizen uses a multi-module Maven setup. The primary directories you will encounter in the repository are: + +- `plugin`: Contains the core logic, tags, commands, and script events. Most pull requests belong in `plugin/src/main/java/com/denizenscript/denizen/`. +- `paper`: Contains Paper-specific tags, events, and API features. +- `v1_17` through `v26_2`: Contain version-specific NMS code for direct server internals. +- `dist`: Bundles all modules into the final compiled jar. + +### Associated Projects + Any Denizen implementation depends on **DenizenCore**, which is the main set of tools that powers every language feature. It includes all content that isn't implementation-specific, such as basic ElementTag manipulation and data script containers. Support for other plugins within Denizen scripts is provided by **Depenizen**. It uses the tools provided by both DenizenCore and Denizen to interact with external APIs. This is also the case for **dDiscordBot**, although it focuses on a single API (that being Discord). +### What to Contribute + +As a new contributor, you might wonder what kind of changes you should focus on. In general: + +- Adding, changing, improving, or fixing **tags, mechanisms, commands, and events** is considered the range of what anyone can contribute and is a great place to start. +- More advanced features, such as deep core functionality or things that aren't implementation-specific (like `DenizenCore`), should be avoided until you are more familiar with working in the codebase. +- Start with the "easy" stuff to gain the experience needed to tackle medium or advanced features later! + +### Finding Existing Source Code + Unless you're going to be working with core language features, most of your code will be recognizably similar, and you can find numerous examples throughout these projects for each type of contribution. + +**Tip:** You can easily find existing source code using the [Meta Docs](https://meta.denizenscript.com). Searching for any tag or command on the site provides a direct source link at the bottom of the page, pointing to the exact Java class and line number in the repository. From 930a66924974a65a553048a2e40d36775657b7dd Mon Sep 17 00:00:00 2001 From: BehrRiley Date: Tue, 21 Jul 2026 18:19:04 -0400 Subject: [PATCH 02/10] quick revisions - removed the CLI build instructions - fixed the flow of `layout.md` - genericized the NMS versions - rephrased obvious copy-pasta --- source/guides/contributing/building.md | 9 --------- source/guides/contributing/layout.md | 18 ++++++------------ 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/source/guides/contributing/building.md b/source/guides/contributing/building.md index efa8deb..da1dfeb 100644 --- a/source/guides/contributing/building.md +++ b/source/guides/contributing/building.md @@ -27,15 +27,6 @@ Follow the setup instructions and then run the BuildTools jar for each version s After building, the jar will be available in the `target` folder. You can stick this into your test server's plugins folder and all of Denizen should be available. You can repeat step 3 to build the project after making any desired changes. -### Building the Project (CLI) - -To compile the project and test your changes locally, you can also use [Maven](https://maven.apache.org/) directly from the command line. Run the following command in the root directory of the repository: - -```bash -mvn clean package -``` - -Once the build completes successfully, the compiled plugin jar will be located in the `dist/target` folder. ### Testing Your Changes diff --git a/source/guides/contributing/layout.md b/source/guides/contributing/layout.md index 04a511e..2f4d710 100644 --- a/source/guides/contributing/layout.md +++ b/source/guides/contributing/layout.md @@ -8,28 +8,22 @@ Denizen's Project Layout **Denizen** is a plugin for Minecraft servers that parses and interprets a scripting language called **DenizenScript**. The most popular implementation of Denizen is the Spigot implementation, which is the jar you've most likely downloaded many times. At the time of writing, it is the *only* maintained implementation. +Any Denizen implementation depends on **DenizenCore**, which is the main set of tools that powers every language feature. It includes all content that isn't implementation-specific, such as basic ElementTag manipulation and data script containers. + +Support for other plugins within Denizen scripts is provided by **Depenizen**. It uses the tools provided by both DenizenCore and Denizen to interact with external APIs. This is also the case for **dDiscordBot**, although it focuses on a single API (that being Discord). + ### Repository Modules Denizen uses a multi-module Maven setup. The primary directories you will encounter in the repository are: - `plugin`: Contains the core logic, tags, commands, and script events. Most pull requests belong in `plugin/src/main/java/com/denizenscript/denizen/`. - `paper`: Contains Paper-specific tags, events, and API features. -- `v1_17` through `v26_2`: Contain version-specific NMS code for direct server internals. +- Version modules formatted like `v1_20`: Contain version-specific NMS code for direct server internals. - `dist`: Bundles all modules into the final compiled jar. -### Associated Projects - -Any Denizen implementation depends on **DenizenCore**, which is the main set of tools that powers every language feature. It includes all content that isn't implementation-specific, such as basic ElementTag manipulation and data script containers. - -Support for other plugins within Denizen scripts is provided by **Depenizen**. It uses the tools provided by both DenizenCore and Denizen to interact with external APIs. This is also the case for **dDiscordBot**, although it focuses on a single API (that being Discord). - ### What to Contribute -As a new contributor, you might wonder what kind of changes you should focus on. In general: - -- Adding, changing, improving, or fixing **tags, mechanisms, commands, and events** is considered the range of what anyone can contribute and is a great place to start. -- More advanced features, such as deep core functionality or things that aren't implementation-specific (like `DenizenCore`), should be avoided until you are more familiar with working in the codebase. -- Start with the "easy" stuff to gain the experience needed to tackle medium or advanced features later! +As a new contributor, you might wonder what kind of changes you should focus on. Adding, changing, improving, or fixing **tags, mechanisms, commands, and events** is considered the range of what anyone can contribute and is a great place to start and gain experience! This will help you learn the codebase and prepare you to tackle more advanced features later. You should avoid contributing to deep core functionality (like `DenizenCore`) until you are more familiar with the project. ### Finding Existing Source Code From 629ed3e49782b02dee8ae4feafd31266bd285c45 Mon Sep 17 00:00:00 2001 From: BehrRiley Date: Tue, 21 Jul 2026 20:11:57 -0400 Subject: [PATCH 03/10] revisions --- source/guides/contributing/building.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/guides/contributing/building.md b/source/guides/contributing/building.md index da1dfeb..82f56aa 100644 --- a/source/guides/contributing/building.md +++ b/source/guides/contributing/building.md @@ -30,8 +30,8 @@ After building, the jar will be available in the `target` folder. You can stick ### Testing Your Changes -Before submitting a pull request, ensure you have thoroughly tested your modifications locally on a test server. You are expected to provide proof of testing and instructions on how to replicate your test within your PR description. Once merged into a developmental build, changes are further validated by testers before making their way to an official release. +Before submitting a pull request, make sure to thoroughly test your modifications locally on a test server. In your PR description, you should list which server versions you tested your changes on and confirm that the features worked as expected. Once merged into a developmental build, changes are further validated by testers before making their way to an official release. ### The Review Process -The Denizen project is intentionally designed to be an educational environment. When you submit a pull request, expect maintainers to leave detailed reviews and point out small nitpicks. This isn't meant to be discouraging; the goal is to help you learn the nuances of the codebase, understand good coding practices, and improve your skills for future contributions. +When you submit a pull request, maintainers will likely leave detailed reviews that point out minor adjustments or suggest improvements. This process is highly educational: the maintainers want to help you learn every detail of good coding practices so you can do even better on your next contribution! Although fixing minor issues might seem tedious, this feedback loop trains contributors to handle things effectively and helps ensure the long-term health of the project. From 1a7b5741651b08fe2e7c065be7976c64583ce866 Mon Sep 17 00:00:00 2001 From: Inquisitor <62276696+creaturesofhabit@users.noreply.github.com> Date: Wed, 22 Jul 2026 15:28:45 -0700 Subject: [PATCH 04/10] initial commit for review --- source/guides/contributing/beginning.md | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 source/guides/contributing/beginning.md diff --git a/source/guides/contributing/beginning.md b/source/guides/contributing/beginning.md new file mode 100644 index 0000000..cf20f96 --- /dev/null +++ b/source/guides/contributing/beginning.md @@ -0,0 +1,29 @@ +How to Start Contributing to Denizen +--------------------------------- + +```eval_rst +.. contents:: Table of Contents + :local: +``` + +### Do you Need to Know Java? + +No! You can begin contributing to Denizen without any prior experience. You'll begin with simple contributions that will help you learn what you need for more advanced topics. You'll find that your experience with Denizenscript will help greatly in understanding Denizen's internals. + + +### What Do You Need to Start? + +#### Software + +To begin, you'll need software designed for Java development and Git, in order to bring Denizen to your own computer and submit changes. + +For the IDE(code editor), We strongly recomend [IntelliJ IDEA](https://www.jetbrains.com/idea/). This editor is specifically designed for Java projects and will handle dependencies on its own. +We suggest using Github Desktop, as it allows you to view and manages changes much more easily than the command-line tool. + +#### Spigot + +You must build Spigot on your computer before you can work with Denizen. To do this, download Spigot's [BuildTools](https://www.spigotmc.org/wiki/buildtools/). Once you have it, you will build each version listed in the [project README](https://github.com/DenizenScript/Denizen#readme) one at a time. You can use the tool's GUI, being sure to select `remapped` in the options menu prior, or you may use the command line with a command like `java -jar BuildTools.jar --rev 26.2 --remapped`. This will take a few minutes for each build. You don't need to keep the final jars outputted, though you may find them useful for your local test server; The building process created files in your home directory the IDE will use later. + +### Getting your Project Set Up + +Once you have the requisite software, you'll need to get a copy of Denizen of your very own to make changes to! You'll need to make a `fork` of Denizen. It's generally easiest to do this on the github website. You can find [Denizen's Repository](https://github.com/DenizenScript/Denizen) here to do so. From there, clone the reposity to your computer. In Github Desktop, you can do this with the reposity dropdown in the top left. This will copy all the files to your computer. You can then open the whole folder you just made with IntelliJ and browse the files. Don't worry if it's confusing right now! \ No newline at end of file From 7cb79e4db060b021fd4525f356a1112f3fd0e9f5 Mon Sep 17 00:00:00 2001 From: Inquisitor <62276696+creaturesofhabit@users.noreply.github.com> Date: Thu, 23 Jul 2026 01:38:45 -0700 Subject: [PATCH 05/10] those fixes Co-authored-by: Bear Riley <46008563+BehrRiley@users.noreply.github.com> --- source/guides/contributing/beginning.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/guides/contributing/beginning.md b/source/guides/contributing/beginning.md index cf20f96..656452b 100644 --- a/source/guides/contributing/beginning.md +++ b/source/guides/contributing/beginning.md @@ -8,7 +8,7 @@ How to Start Contributing to Denizen ### Do you Need to Know Java? -No! You can begin contributing to Denizen without any prior experience. You'll begin with simple contributions that will help you learn what you need for more advanced topics. You'll find that your experience with Denizenscript will help greatly in understanding Denizen's internals. +No! You can begin contributing to Denizen without any prior experience. You'll begin with simple contributions that will help you learn what you need for more advanced topics. You'll find that your experience with DenizenScript will help greatly in understanding Denizen's internals. ### What Do You Need to Start? @@ -17,13 +17,13 @@ No! You can begin contributing to Denizen without any prior experience. You'll b To begin, you'll need software designed for Java development and Git, in order to bring Denizen to your own computer and submit changes. -For the IDE(code editor), We strongly recomend [IntelliJ IDEA](https://www.jetbrains.com/idea/). This editor is specifically designed for Java projects and will handle dependencies on its own. -We suggest using Github Desktop, as it allows you to view and manages changes much more easily than the command-line tool. +For the IDE(code editor), we strongly recommend [IntelliJ IDEA](https://www.jetbrains.com/idea/). This editor is specifically designed for Java projects and will handle dependencies on its own. +We suggest using GitHub Desktop, as it allows you to view and manage changes much more easily than the command-line tool. #### Spigot -You must build Spigot on your computer before you can work with Denizen. To do this, download Spigot's [BuildTools](https://www.spigotmc.org/wiki/buildtools/). Once you have it, you will build each version listed in the [project README](https://github.com/DenizenScript/Denizen#readme) one at a time. You can use the tool's GUI, being sure to select `remapped` in the options menu prior, or you may use the command line with a command like `java -jar BuildTools.jar --rev 26.2 --remapped`. This will take a few minutes for each build. You don't need to keep the final jars outputted, though you may find them useful for your local test server; The building process created files in your home directory the IDE will use later. +You must build Spigot on your computer before you can work with Denizen. To do this, download Spigot's [BuildTools](https://www.spigotmc.org/wiki/buildtools/). Once you have it, you will build each version listed in the [project README](https://github.com/DenizenScript/Denizen#readme) one at a time. You can use the tool's GUI, being sure to select `remapped` in the options menu prior, or you may use the command line with a command like `java -jar BuildTools.jar --rev 26.2 --remapped`. This will take a few minutes for each build. You don't need to keep the final jars outputted, though you may find them useful for your local test server; the building process created files in your home directory the IDE will use later. ### Getting your Project Set Up -Once you have the requisite software, you'll need to get a copy of Denizen of your very own to make changes to! You'll need to make a `fork` of Denizen. It's generally easiest to do this on the github website. You can find [Denizen's Repository](https://github.com/DenizenScript/Denizen) here to do so. From there, clone the reposity to your computer. In Github Desktop, you can do this with the reposity dropdown in the top left. This will copy all the files to your computer. You can then open the whole folder you just made with IntelliJ and browse the files. Don't worry if it's confusing right now! \ No newline at end of file +Once you have the requisite software, you'll need to get a copy of Denizen of your very own to make changes to! You'll need to make a `fork` of Denizen. It's generally easiest to do this on the GitHub website. You can find [Denizen's Repository](https://github.com/DenizenScript/Denizen) here to do so. From there, clone the repository to your computer. In GitHub Desktop, you can do this with the repository dropdown in the top left. This will copy all the files to your computer. You can then open the whole folder you just made with IntelliJ and browse the files. Don't worry if it's confusing right now! \ No newline at end of file From c0e77f32aa922f2e5d14072f6ffdea4eceaa8c81 Mon Sep 17 00:00:00 2001 From: Inquisitor <62276696+creaturesofhabit@users.noreply.github.com> Date: Thu, 23 Jul 2026 02:26:27 -0700 Subject: [PATCH 06/10] finish? starting page and replace building page with placeholder --- source/guides/contributing/beginning.md | 16 +++++++++++-- source/guides/contributing/building.md | 32 ++----------------------- 2 files changed, 16 insertions(+), 32 deletions(-) diff --git a/source/guides/contributing/beginning.md b/source/guides/contributing/beginning.md index 656452b..f126e77 100644 --- a/source/guides/contributing/beginning.md +++ b/source/guides/contributing/beginning.md @@ -22,8 +22,20 @@ We suggest using GitHub Desktop, as it allows you to view and manage changes muc #### Spigot -You must build Spigot on your computer before you can work with Denizen. To do this, download Spigot's [BuildTools](https://www.spigotmc.org/wiki/buildtools/). Once you have it, you will build each version listed in the [project README](https://github.com/DenizenScript/Denizen#readme) one at a time. You can use the tool's GUI, being sure to select `remapped` in the options menu prior, or you may use the command line with a command like `java -jar BuildTools.jar --rev 26.2 --remapped`. This will take a few minutes for each build. You don't need to keep the final jars outputted, though you may find them useful for your local test server; the building process created files in your home directory the IDE will use later. +You must build Spigot on your computer before you can work with Denizen. To do this, download Spigot's [BuildTools](https://www.spigotmc.org/wiki/buildtools/). Once you have it, you will build each version listed in the [project README](https://github.com/DenizenScript/Denizen#readme) one at a time. You can use the tool's GUI, being sure to select `remapped` in the options menu prior, or you may use the command line with a command like `java -jar BuildTools.jar --rev 26.2 --remapped`. This will take a few minutes for each build. You don't need to keep the final jars outputted, though you may find them useful for your local test server; the building process creates files in your home directory the IDE will use later. ### Getting your Project Set Up -Once you have the requisite software, you'll need to get a copy of Denizen of your very own to make changes to! You'll need to make a `fork` of Denizen. It's generally easiest to do this on the GitHub website. You can find [Denizen's Repository](https://github.com/DenizenScript/Denizen) here to do so. From there, clone the repository to your computer. In GitHub Desktop, you can do this with the repository dropdown in the top left. This will copy all the files to your computer. You can then open the whole folder you just made with IntelliJ and browse the files. Don't worry if it's confusing right now! \ No newline at end of file +Once you have the requisite software, you'll need to get a copy of Denizen of your very own to make changes to! You'll need to make a `fork` of Denizen. It's generally easiest to do this on the GitHub website. You can find [Denizen's Repository](https://github.com/DenizenScript/Denizen) here to do so. From there, clone the repository to your computer. In GitHub Desktop, you can do this with the repository dropdown in the top left. This will copy all the files to your computer. You can then open the whole folder you just made with IntelliJ and browse the files. Don't worry if it's confusing right now! + +### What Do You Start With? + +Now that you have Denizen's file in front of you, you'll need to decide what you want to work on! If you don't have any prior experience working in java, we suggest that you begin by adding or changing a tag, mechanism, or event. These components are designed to be easy to build on and there are lots of examples for you to look at or even copy as a starting place. The best place to start is in the Denizen Discord server's Denizen channel, where you can select the `Easy PR` tag to filter for posts that the helpers believe would be good for newer contributors! Once you have one in mind, you can use that thread to either mention that you'll be starting work on it, or to ask questions if you need. You may find [this page on properties](https://guide.denizenscript.com/guides/contributing/property-dev.html) useful if you're starting with a tag or mechanism. + +### Your First PR + +Once you know what you'll be doing, you need to create a new branch in your git repository. Name it something related to what you're working on, but the specific name doesn't matter. You're then set to start editing code. You'll find some of the other pages of this guide helpful for implementing and testing the change, but this page focuses on the process, so we'll assume that you've finished successfully and are ready to submit it for review. You need to commit and push your changes. Once you've done that, Github desktop or web make it easy to submit a pull request to the main Denizen repository. Make sure to name it descriptively with what you changed, and include a reference to the thread originally requesting it. It's nice to also make another comment in the original thread with a link to your new PR. + +### What to Expect Now + +After you submit your PR, it will appear for review by existing contributors. Depending on circumstance, this review could take anywhere from minutes to a few days. Most likely, you'll get one or more comments on your pull request. You can review these on GitHub and respond to them. We try to be extra thorough with newer contributors to help you learn good practices and improve your abilities, so don't be discouraged if it seems like you're getting a lot of feedback; we want to help! Also, don't take initial comments as law. If you disagree, feel free to share why you did it one way instead of another. Once you've resolved all the comments, your pull request can be merged and incorporated into Denizen. You'll likely get a mention later in the Discord and everyone will be able to use your change! You may get the ability to chat in the contribution channel as well, which you can use to discuss your PR's in the future or ask questions. diff --git a/source/guides/contributing/building.md b/source/guides/contributing/building.md index 82f56aa..6750a3b 100644 --- a/source/guides/contributing/building.md +++ b/source/guides/contributing/building.md @@ -1,4 +1,4 @@ -Working With and Building Denizen +Building Denizen and Testing Changes --------------------------------- ```eval_rst @@ -6,32 +6,4 @@ Working With and Building Denizen :local: ``` -### Prerequisites - -Make sure you have the following tools installed on your machine: - -- Some form of git. We recommend [GitHub Desktop](https://desktop.github.com/) (if you're using Linux, don't worry, there's probably a package for your distro). -- [IntelliJ IDEA](https://www.jetbrains.com/idea/). This editor is specifically designed for Java projects and will handle dependencies on its own. - -### Building Spigot - -To build Denizen, you'll also need to build the supported versions of Spigot, which you can find on the [project README](https://github.com/DenizenScript/Denizen#readme). To do this, Spigot provides a tool called [BuildTools](https://www.spigotmc.org/wiki/buildtools/). This cannot be substituted with prebuilt jars or forks, as it must be built into your local maven repo. - -Follow the setup instructions and then run the BuildTools jar for each version supported by Denizen. This should be a command like `java -jar BuildTools.jar --rev 1.21.1 --remapped`. - -### Building Denizen - -1. Clone the Denizen repository: https://github.com/DenizenScript/Denizen -2. Open the cloned folder with IntelliJ. -3. Open the Maven tab, select `denizen-parent`, and click "Run Maven Build" (the green arrow). - -After building, the jar will be available in the `target` folder. You can stick this into your test server's plugins folder and all of Denizen should be available. You can repeat step 3 to build the project after making any desired changes. - - -### Testing Your Changes - -Before submitting a pull request, make sure to thoroughly test your modifications locally on a test server. In your PR description, you should list which server versions you tested your changes on and confirm that the features worked as expected. Once merged into a developmental build, changes are further validated by testers before making their way to an official release. - -### The Review Process - -When you submit a pull request, maintainers will likely leave detailed reviews that point out minor adjustments or suggest improvements. This process is highly educational: the maintainers want to help you learn every detail of good coding practices so you can do even better on your next contribution! Although fixing minor issues might seem tedious, this feedback loop trains contributors to handle things effectively and helps ensure the long-term health of the project. +placeholder From 46ef0f84fd123d3c0eb1904c64f414eeee0e4228 Mon Sep 17 00:00:00 2001 From: Inquisitor <62276696+creaturesofhabit@users.noreply.github.com> Date: Fri, 24 Jul 2026 07:11:37 -0700 Subject: [PATCH 07/10] building denizen page --- source/guides/contributing/building.md | 14 +++++++++++++- .../guides/contributing/images/maven_menu.png | Bin 0 -> 36848 bytes 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 source/guides/contributing/images/maven_menu.png diff --git a/source/guides/contributing/building.md b/source/guides/contributing/building.md index 6750a3b..c3b23bb 100644 --- a/source/guides/contributing/building.md +++ b/source/guides/contributing/building.md @@ -6,4 +6,16 @@ Building Denizen and Testing Changes :local: ``` -placeholder +### Building Denizen + +After you've made changes to Denizen's code, you'll need to test them thoroughly to ensure that they function as expected in all use-cases. To do this, you'll need to build the plugin, with your changes, into a custom .jar file. +The easiest way to do this is to use Intellj's Maven plugin's GUI. In Intellj, on the right side, you should see an `M` symbol. Click that and it'll open a menu that looks like this: + +![](images/uuid_uppercase.png) + +Right click on `denizen-parent` and select "Run Maven Build". This will take a few moments, esspecially the first time you do it. Wait until the console tells you that the build is sucessful, and then navigate to your repository. In the root directory, you'll find /target, and the .jar will be inside. This is your plugin and you can put it into your [test server](/guides/first-steps/local-test-server) and try it! Make sure you get the jar from the target directory in the root. + +### Testing Changes + +How you test changes varies greatly depending on the nature of the feature, but you'll want to make sure that it works when used correctly and gracefully errors when used incorrectly on each version that it supports. Unless you've set otherwise, this means that you need to test it on each minecraft version that Denizen supports. +You should try to think a little outside-the-box when testing for failures, as you may be suprised just how incorrectly users manage to use your feature. For example, if you're adding a tag, command, or mechanism, try giving no input, input of the completely wrong object type, empty input, misordered input, or so on. If your change uses a location, try it on locations that are unloaded, do not exist at all(such as in a made-up world name), with noted locations. It's not possible or expected to catch every possible mistake, and Denizen will often handle user-created problems for you before your code ever runs, but do your best! diff --git a/source/guides/contributing/images/maven_menu.png b/source/guides/contributing/images/maven_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..8a84e7dae599eb9d7c6baa8d7e282425a7a7888c GIT binary patch literal 36848 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 NB7%|vMSNPG{|~V=(h&dv literal 0 HcmV?d00001 From 0cd02e3bdb6dcaf604517f0268565543abfeaad1 Mon Sep 17 00:00:00 2001 From: Bear Riley <46008563+BehrRiley@users.noreply.github.com> Date: Fri, 24 Jul 2026 13:00:01 -0400 Subject: [PATCH 08/10] Apply suggestions from code review Co-authored-by: Bear Riley <46008563+BehrRiley@users.noreply.github.com> --- source/guides/contributing/beginning.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/guides/contributing/beginning.md b/source/guides/contributing/beginning.md index f126e77..7032e84 100644 --- a/source/guides/contributing/beginning.md +++ b/source/guides/contributing/beginning.md @@ -30,12 +30,12 @@ Once you have the requisite software, you'll need to get a copy of Denizen of yo ### What Do You Start With? -Now that you have Denizen's file in front of you, you'll need to decide what you want to work on! If you don't have any prior experience working in java, we suggest that you begin by adding or changing a tag, mechanism, or event. These components are designed to be easy to build on and there are lots of examples for you to look at or even copy as a starting place. The best place to start is in the Denizen Discord server's Denizen channel, where you can select the `Easy PR` tag to filter for posts that the helpers believe would be good for newer contributors! Once you have one in mind, you can use that thread to either mention that you'll be starting work on it, or to ask questions if you need. You may find [this page on properties](https://guide.denizenscript.com/guides/contributing/property-dev.html) useful if you're starting with a tag or mechanism. +Now that you have Denizen's file in front of you, you'll need to decide what you want to work on! If you don't have any prior experience working in Java, we suggest that you begin by adding or changing a tag, mechanism, or event. These components are designed to be easy to build on and there are lots of examples for you to look at or even copy as a starting place. The best place to start is in the Denizen Discord server's Denizen channel, where you can select the `Easy PR` tag to filter for posts that the helpers believe would be good for newer contributors! Once you have one in mind, you can use that thread to either mention that you'll be starting work on it, or to ask questions if you need. You may find [this page on properties](https://guide.denizenscript.com/guides/contributing/property-dev.html) useful if you're starting with a tag or mechanism. ### Your First PR -Once you know what you'll be doing, you need to create a new branch in your git repository. Name it something related to what you're working on, but the specific name doesn't matter. You're then set to start editing code. You'll find some of the other pages of this guide helpful for implementing and testing the change, but this page focuses on the process, so we'll assume that you've finished successfully and are ready to submit it for review. You need to commit and push your changes. Once you've done that, Github desktop or web make it easy to submit a pull request to the main Denizen repository. Make sure to name it descriptively with what you changed, and include a reference to the thread originally requesting it. It's nice to also make another comment in the original thread with a link to your new PR. +Once you know what you'll be doing, you need to create a new branch in your git repository. Name it something related to what you're working on, but the specific name doesn't matter. You're then set to start editing code. You'll find some of the other pages of this guide helpful for implementing and testing the change, but this page focuses on the process, so we'll assume that you've finished successfully and are ready to submit it for review. You need to commit and push your changes. Once you've done that, GitHub desktop or web make it easy to submit a pull request to the main Denizen repository. Make sure to name it descriptively with what you changed, and include a reference to the thread originally requesting it. It's nice to also make another comment in the original thread with a link to your new PR. ### What to Expect Now -After you submit your PR, it will appear for review by existing contributors. Depending on circumstance, this review could take anywhere from minutes to a few days. Most likely, you'll get one or more comments on your pull request. You can review these on GitHub and respond to them. We try to be extra thorough with newer contributors to help you learn good practices and improve your abilities, so don't be discouraged if it seems like you're getting a lot of feedback; we want to help! Also, don't take initial comments as law. If you disagree, feel free to share why you did it one way instead of another. Once you've resolved all the comments, your pull request can be merged and incorporated into Denizen. You'll likely get a mention later in the Discord and everyone will be able to use your change! You may get the ability to chat in the contribution channel as well, which you can use to discuss your PR's in the future or ask questions. +After you submit your PR, it will appear for review by existing contributors. Depending on circumstance, this review could take anywhere from minutes to a few days. Most likely, you'll get one or more comments on your pull request. You can review these on GitHub and respond to them. We try to be extra thorough with newer contributors to help you learn good practices and improve your abilities, so don't be discouraged if it seems like you're getting a lot of feedback; we want to help! Also, don't take initial comments as law. If you disagree, feel free to share why you did it one way instead of another. Once you've resolved all the comments, your pull request can be merged and incorporated into Denizen. You'll likely get a mention later in the Discord and everyone will be able to use your change! You may get the ability to chat in the contribution channel as well, which you can use to discuss your PRs in the future or ask questions. From da75f79276dd8fd97292edc62f5e2c52904b5030 Mon Sep 17 00:00:00 2001 From: Bear Riley <46008563+BehrRiley@users.noreply.github.com> Date: Fri, 24 Jul 2026 13:11:32 -0400 Subject: [PATCH 09/10] fix image reference --- source/guides/contributing/building.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/guides/contributing/building.md b/source/guides/contributing/building.md index c3b23bb..a368f4b 100644 --- a/source/guides/contributing/building.md +++ b/source/guides/contributing/building.md @@ -11,7 +11,7 @@ Building Denizen and Testing Changes After you've made changes to Denizen's code, you'll need to test them thoroughly to ensure that they function as expected in all use-cases. To do this, you'll need to build the plugin, with your changes, into a custom .jar file. The easiest way to do this is to use Intellj's Maven plugin's GUI. In Intellj, on the right side, you should see an `M` symbol. Click that and it'll open a menu that looks like this: -![](images/uuid_uppercase.png) +![](images/maven_menu.png) Right click on `denizen-parent` and select "Run Maven Build". This will take a few moments, esspecially the first time you do it. Wait until the console tells you that the build is sucessful, and then navigate to your repository. In the root directory, you'll find /target, and the .jar will be inside. This is your plugin and you can put it into your [test server](/guides/first-steps/local-test-server) and try it! Make sure you get the jar from the target directory in the root. From 0422203ec8dded891a4a20cf787ca73a37b13b33 Mon Sep 17 00:00:00 2001 From: "Darian \"Librarian\" Williams" Date: Fri, 24 Jul 2026 13:32:43 -0400 Subject: [PATCH 10/10] Update building.md --- source/guides/contributing/building.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/guides/contributing/building.md b/source/guides/contributing/building.md index a368f4b..c68f5ac 100644 --- a/source/guides/contributing/building.md +++ b/source/guides/contributing/building.md @@ -9,13 +9,13 @@ Building Denizen and Testing Changes ### Building Denizen After you've made changes to Denizen's code, you'll need to test them thoroughly to ensure that they function as expected in all use-cases. To do this, you'll need to build the plugin, with your changes, into a custom .jar file. -The easiest way to do this is to use Intellj's Maven plugin's GUI. In Intellj, on the right side, you should see an `M` symbol. Click that and it'll open a menu that looks like this: +The easiest way to do this is to use IntelliJ's Maven plugin's GUI. In IntelliJ, on the right side, you should see an `M` symbol. Click that and it'll open a menu that looks like this: ![](images/maven_menu.png) -Right click on `denizen-parent` and select "Run Maven Build". This will take a few moments, esspecially the first time you do it. Wait until the console tells you that the build is sucessful, and then navigate to your repository. In the root directory, you'll find /target, and the .jar will be inside. This is your plugin and you can put it into your [test server](/guides/first-steps/local-test-server) and try it! Make sure you get the jar from the target directory in the root. +Right click on `denizen-parent` and select "Run Maven Build". This will take a few moments, especially the first time you do it. Wait until the console tells you that the build is sucessful, and then navigate to your repository. In the root directory, you'll find /target, and the` .jar` will be inside. This is your plugin and you can put it into your [test server](/guides/first-steps/local-test-server) and try it! Make sure you get the jar from the target directory in the root. ### Testing Changes How you test changes varies greatly depending on the nature of the feature, but you'll want to make sure that it works when used correctly and gracefully errors when used incorrectly on each version that it supports. Unless you've set otherwise, this means that you need to test it on each minecraft version that Denizen supports. -You should try to think a little outside-the-box when testing for failures, as you may be suprised just how incorrectly users manage to use your feature. For example, if you're adding a tag, command, or mechanism, try giving no input, input of the completely wrong object type, empty input, misordered input, or so on. If your change uses a location, try it on locations that are unloaded, do not exist at all(such as in a made-up world name), with noted locations. It's not possible or expected to catch every possible mistake, and Denizen will often handle user-created problems for you before your code ever runs, but do your best! +You should try to think a little outside-the-box when testing for failures, as you may be surprised just how incorrectly users manage to use your feature. For example, if you're adding a tag, command, or mechanism, try giving no input, input of the completely wrong object type, empty input, misordered input, or so on. If your change uses a location, try it on locations that are unloaded, do not exist at all (such as in a made-up world name), with noted locations. It's not possible or expected to catch every possible mistake, and Denizen will often handle user-created problems for you before your code ever runs, but do your best!