1 Commits

Author SHA1 Message Date
dependabot[bot]
10fa69e844 chore(deps): bump com.gradleup.shadow from 9.0.0-beta9 to 9.0.0-SNAPSHOT
Bumps com.gradleup.shadow from 9.0.0-beta9 to 9.0.0-SNAPSHOT.

---
updated-dependencies:
- dependency-name: com.gradleup.shadow
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-29 19:23:58 +00:00
913 changed files with 5966 additions and 25357 deletions

View File

@@ -1,20 +1,8 @@
name: Bug Report
description: File a bug report.
title: "Bug: "
labels: [ "Type: Bug", "Priority: Medium", "Status: Pending" ]
labels: ["bug"]
body:
- type: dropdown
id: plugin
attributes:
label: In which plugin has the error occurred?
multiple: false
options:
- FancyNpcs
- FancyHolograms
- FancyDialogs
- Other
validations:
required: true
- type: textarea
id: what-happened
attributes:

1
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1 @@
blank_issues_enabled: false

View File

@@ -1,20 +1,8 @@
name: Feature Request
description: Suggest a new Feature.
title: "Feature: "
labels: [ "Type: Enhancement", "Priority: Medium", "Status: Pending" ]
labels: ["feature"]
body:
- type: dropdown
id: plugin
attributes:
label: For which plugin is the feature?
multiple: false
options:
- FancyNpcs
- FancyHolograms
- FancyDialogs
- Other
validations:
required: true
- type: textarea
id: description
attributes:

View File

@@ -1,31 +0,0 @@
## 📋 Description
Please include a summary of the changes and the related issue(s).
What is this PR solving? Why is it needed?
## ✅ Checklist
- [ ] My code follows the project's coding style and guidelines
- [ ] I have tested my changes locally and they work as expected
- [ ] I have added necessary documentation (if applicable)
- [ ] I have linked related issues using `Fixes #issue_number` or `Closes #issue_number`
- [ ] I have rebased/merged with the latest `main` branch
## 🔍 Changes
Please provide a brief summary of the changes made in this PR.
- Updated ...
- Refactored ...
- Fixed ...
---
## 🧪 How to Test
Please describe how to manually test the changes made in this PR.
1. ...
2. ...
3. ...

View File

@@ -33,15 +33,9 @@ jobs:
- name: Build FancyNpcs
run: ./gradlew :plugins:fancynpcs:shadowJar
- name: Build FancyHolograms v2
run: ./gradlew :plugins:fancyholograms-v2:shadowJar
- name: Build FancyHolograms
run: ./gradlew :plugins:fancyholograms:shadowJar
- name: Build FancyDialogs
run: ./gradlew :plugins:fancydialogs:shadowJar
- name: Build FancyVisuals
run: ./gradlew :plugins:fancyvisuals:shadowJar

View File

@@ -3,10 +3,8 @@ name: Deploy documentation
on:
workflow_dispatch:
push:
branches:
branches:
- main
paths:
- 'docs/**'
jobs:
deploy:

View File

@@ -1,51 +0,0 @@
name: Deploy FancyDialogs (release)
on:
workflow_dispatch:
jobs:
deploy-plugin:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Cache Gradle dependencies
uses: actions/cache@v4
with:
path: ~/.gradle
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Setup Java
uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: '21'
- name: Modify gradlew permissions
run: chmod +x ./gradlew
- name: Build deployment tool
run: ./gradlew :tools:deployment:shadowJar
- name: Build FancyDialogs for Modrinth
env:
RELEASE_CHANNEL: 'release'
RELEASE_PLATFORM: 'modrinth'
run: ./gradlew :plugins:fancydialogs:shadowJar
- name: Deploy to Modrinth
env:
MODRINTH_API_KEY: ${{ secrets.MODRINTH_API_KEY }}
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
run:
cd tools/deployment/build/libs &&
java -jar deployment.jar modrinth ../../../../plugins/fancydialogs/release_deployment_config.json true
- name: Publish to reposilite (releases)
run: ./gradlew :plugins:fancydialogs:fd-api:publishAllPublicationsToFancyinnovationsReleasesRepository
- name: Publish to reposilite (snapshots)
run: ./gradlew :plugins:fancydialogs:fd-api:publishAllPublicationsToFancyinnovationsSnapshotsRepository

View File

@@ -1,51 +0,0 @@
name: Deploy FancyHolograms v2 (release)
on:
workflow_dispatch:
jobs:
deploy-plugin:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Cache Gradle dependencies
uses: actions/cache@v4
with:
path: ~/.gradle
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Setup Java
uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: '21'
- name: Modify gradlew permissions
run: chmod +x ./gradlew
- name: Build deployment tool
run: ./gradlew :tools:deployment:shadowJar
- name: Build FancyHolograms v2 for Modrinth
env:
RELEASE_CHANNEL: 'release'
RELEASE_PLATFORM: 'modrinth'
run: ./gradlew :plugins:fancyholograms-v2:shadowJar
- name: Deploy to Modrinth
env:
MODRINTH_API_KEY: ${{ secrets.MODRINTH_API_KEY }}
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
run:
cd tools/deployment/build/libs &&
java -jar deployment.jar modrinth ../../../../plugins/fancyholograms-v2/release_deployment_config.json true
- name: Publish to reposilite (releases)
run: ./gradlew :plugins:fancyholograms-v2:api:publishAllPublicationsToFancyinnovationsReleasesRepository
- name: Publish to reposilite (snapshots)
run: ./gradlew :plugins:fancyholograms-v2:api:publishAllPublicationsToFancyinnovationsSnapshotsRepository

View File

@@ -27,25 +27,19 @@ jobs:
- name: Modify gradlew permissions
run: chmod +x ./gradlew
- name: Build FancyHolograms
run: ./gradlew :plugins:fancyholograms:shadowJar
- name: Build deployment tool
run: ./gradlew :tools:deployment:shadowJar
- name: Build FancyHolograms for Modrinth
env:
RELEASE_CHANNEL: 'release'
RELEASE_PLATFORM: 'modrinth'
run: ./gradlew :plugins:fancyholograms:shadowJar
- name: Deploy to Modrinth
env:
MODRINTH_API_KEY: ${{ secrets.MODRINTH_API_KEY }}
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
- name: Deploy
run:
cd tools/deployment/build/libs &&
java -jar deployment.jar modrinth ../../../../plugins/fancyholograms/release_deployment_config.json true
java -jar deployment.jar ../../../../plugins/fancyholograms/release_deployment_config.json
- name: Publish to reposilite (releases)
run: ./gradlew :plugins:fancyholograms:fh-api:publishAllPublicationsToFancyinnovationsReleasesRepository
run: ./gradlew :plugins:fancyholograms:api:publishAllPublicationsToFancypluginsReleasesRepository
- name: Publish to reposilite (snapshots)
run: ./gradlew :plugins:fancyholograms:fh-api:publishAllPublicationsToFancyinnovationsSnapshotsRepository
run: ./gradlew :plugins:fancyholograms:api:publishAllPublicationsToFancypluginsSnapshotsRepository

View File

@@ -1,51 +0,0 @@
name: Deploy FancyNpcs (release)
on:
workflow_dispatch:
jobs:
deploy-plugin:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Cache Gradle dependencies
uses: actions/cache@v4
with:
path: ~/.gradle
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Setup Java
uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: '21'
- name: Modify gradlew permissions
run: chmod +x ./gradlew
- name: Build deployment tool
run: ./gradlew :tools:deployment:shadowJar
- name: Build FancyNpcs for Modrinth
env:
RELEASE_CHANNEL: 'release'
RELEASE_PLATFORM: 'modrinth'
run: ./gradlew :plugins:fancynpcs:shadowJar
- name: Deploy to Modrinth
env:
MODRINTH_API_KEY: ${{ secrets.MODRINTH_API_KEY }}
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
run:
cd tools/deployment/build/libs &&
java -jar deployment.jar modrinth ../../../../plugins/fancynpcs/release_deployment_config.json true
- name: Publish to reposilite (releases)
run: ./gradlew :plugins:fancynpcs:fn-api:publishAllPublicationsToFancyinnovationsReleasesRepository
- name: Publish to reposilite (snapshots)
run: ./gradlew :plugins:fancynpcs:fn-api:publishAllPublicationsToFancyinnovationsSnapshotsRepository

View File

@@ -1,48 +0,0 @@
name: Deploy FancyDialogs (snapshot)
on:
workflow_dispatch:
jobs:
deploy-fancydialogs:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Cache Gradle dependencies
uses: actions/cache@v4
with:
path: ~/.gradle
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Setup Java
uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: '21'
- name: Modify gradlew permissions
run: chmod +x ./gradlew
- name: Build deployment tool
run: ./gradlew :tools:deployment:shadowJar
- name: Build FancyDialogs for Modrinth
env:
RELEASE_CHANNEL: 'snapshot'
RELEASE_PLATFORM: 'modrinth'
run: ./gradlew :plugins:fancydialogs:shadowJar
- name: Deploy to Modrinth
env:
MODRINTH_API_KEY: ${{ secrets.MODRINTH_API_KEY }}
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
run:
cd tools/deployment/build/libs &&
java -jar deployment.jar modrinth ../../../../plugins/fancydialogs/snapshot_deployment_config.json true
- name: Publish to reposilite (snapshots)
run: ./gradlew :plugins:fancydialogs:fd-api:publishAllPublicationsToFancyinnovationsSnapshotsRepository

View File

@@ -1,48 +0,0 @@
name: Deploy FancyHolograms v2 (snapshot)
on:
workflow_dispatch:
jobs:
deploy-fancyholograms:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Cache Gradle dependencies
uses: actions/cache@v4
with:
path: ~/.gradle
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Setup Java
uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: '21'
- name: Modify gradlew permissions
run: chmod +x ./gradlew
- name: Build deployment tool
run: ./gradlew :tools:deployment:shadowJar
- name: Build FancyHolograms v2 for Modrinth
env:
RELEASE_CHANNEL: 'snapshot'
RELEASE_PLATFORM: 'modrinth'
run: ./gradlew :plugins:fancyholograms-v2:shadowJar
- name: Deploy to Modrinth
env:
MODRINTH_API_KEY: ${{ secrets.MODRINTH_API_KEY }}
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
run:
cd tools/deployment/build/libs &&
java -jar deployment.jar modrinth ../../../../plugins/fancyholograms-v2/snapshot_deployment_config.json true
- name: Publish to reposilite (snapshots)
run: ./gradlew :plugins:fancyholograms-v2:api:publishAllPublicationsToFancyinnovationsSnapshotsRepository

View File

@@ -27,22 +27,16 @@ jobs:
- name: Modify gradlew permissions
run: chmod +x ./gradlew
- name: Build FancyHolograms
run: ./gradlew :plugins:fancyholograms:shadowJar
- name: Build deployment tool
run: ./gradlew :tools:deployment:shadowJar
- name: Build FancyHolograms for Modrinth
env:
RELEASE_CHANNEL: 'snapshot'
RELEASE_PLATFORM: 'modrinth'
run: ./gradlew :plugins:fancyholograms:shadowJar
- name: Deploy to Modrinth
env:
MODRINTH_API_KEY: ${{ secrets.MODRINTH_API_KEY }}
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
- name: Deploy
run:
cd tools/deployment/build/libs &&
java -jar deployment.jar modrinth ../../../../plugins/fancyholograms/snapshot_deployment_config.json true
java -jar deployment.jar ../../../../plugins/fancyholograms/snapshot_deployment_config.json
- name: Publish to reposilite (snapshots)
run: ./gradlew :plugins:fancyholograms:fh-api:publishAllPublicationsToFancyinnovationsSnapshotsRepository
run: ./gradlew :plugins:fancyholograms:api:publishAllPublicationsToFancypluginsSnapshotsRepository

View File

@@ -1,62 +0,0 @@
name: Deploy FancyNpcs (snapshot)
on:
workflow_dispatch:
jobs:
deploy-plugin:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Cache Gradle dependencies
uses: actions/cache@v4
with:
path: ~/.gradle
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Setup Java
uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: '21'
- name: Modify gradlew permissions
run: chmod +x ./gradlew
- name: Build deployment tool
run: ./gradlew :tools:deployment:shadowJar
- name: Build FancyNpcs for Modrinth
env:
RELEASE_CHANNEL: 'snapshot'
RELEASE_PLATFORM: 'modrinth'
run: ./gradlew :plugins:fancynpcs:shadowJar
- name: Deploy to Modrinth
env:
MODRINTH_API_KEY: ${{ secrets.MODRINTH_API_KEY }}
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
run:
cd tools/deployment/build/libs &&
java -jar deployment.jar modrinth ../../../../plugins/fancynpcs/snapshot_deployment_config.json true
# - name: Build FancyNpcs for Hangar
# env:
# RELEASE_CHANNEL: 'snapshot'
# RELEASE_PLATFORM: 'hangar'
# run: ./gradlew :plugins:fancynpcs:shadowJar
#
# - name: Deploy to Hangar
# env:
# HANGAR_API_KEY: "${{ secrets.HANGAR_API_KEY }}"
# DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
# run:
# cd tools/deployment/build/libs &&
# java -jar deployment.jar hangar ../../../../plugins/fancynpcs/snapshot_deployment_config.json true
- name: Publish to reposilite (snapshots)
run: ./gradlew :plugins:fancynpcs:fn-api:publishAllPublicationsToFancyinnovationsSnapshotsRepository

View File

@@ -1,3 +0,0 @@
# Contributing
See [docs/src/development-guidelines/contributing.md](docs/src/development-guidelines/contributing.md) for more information on how to contribute to the project.

21
LICENSE
View File

@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2025 Oliver Schlüter
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

108
README.md
View File

@@ -2,69 +2,91 @@
<div align="center">
![](docs/src/static/logos-and-banners/fancyinnovations-banner.png)
![](docs/src/static/fancyplugins-banner.png)
[![Modrinth](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/compact/available/modrinth_vector.svg)](https://modrinth.com/user/Oliver)
[![Hangar](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/compact/available/hangar_vector.svg)](https://hangar.papermc.io/Oliver)
[![Unsupported spigot](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/compact/unsupported/spigot_vector.svg)]()
[![Website](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/compact/documentation/website_vector.svg)](https://fancyinnovations.com)
[![Documentation](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/compact/documentation/ghpages_vector.svg)](https://docs.fancyinnovations.com)
[![discord-plural](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/compact/social/discord-plural_46h.png)](https://discord.gg/ZUgYCEJUEx)
[![Lines of Code](https://tokei.rs/b1/github/fancymcplugins/fancyplugins?category=code)](https://github.com/fancymcplugins/fancyplugins)
[![Discord](https://img.shields.io/discord/899740810956910683?cacheSeconds=3600&logo=discord&logoColor=white&label=%20&labelColor=%235865F2&color=%23707BF4)](https://discord.gg/ZUgYCEJUEx)
<br />
[![CodeFactor](https://www.codefactor.io/repository/github/fancyinnovations/fancyplugins/badge)](https://www.codefactor.io/repository/github/fancyinnovations/fancyplugins)
[![Lines of Code](https://tokei.rs/b1/github/fancyinnovations/fancyplugins?category=code)](https://github.com/fancyinnovations/fancyplugins)
Simple, lightweight and feature-rich plugins for Minecraft servers.
</div>
## FancyPlugins
## Modules
This is a [monorepo](docs/src/development-guidelines/monorepo.md) for all plugins, libraries, and tools of FancyInnovations.
> [!CAUTION]
> The monorepo is still work in progress. Expect breaking changes and incomplete documentation.
**Plugins:**
- FancyNpcs: create and manage fancy looking npcs
- FancyHolograms: create fancy looking holograms
- FancyDialogs: create and manage fancy looking dialogs which were added in 1.21.6 (work in progress)
- FancyVisuals: plugin to customize all visual components of the game (work in progress)
Plugins:
- fancynpcs: create and manage fancy looking npcs ([old repository](https://github.com/FancyMcPlugins/FancyNpcs))
- fancyholograms (v3): create fancy looking holograms
- fancyvisuals: plugin to customize all visual components of the game
**Libraries:**
- Common: common classes and utilities
- JDB: json database library
- Plugin Tests: testing library for plugins
- Packets: packet handling library (also called FancySitula)
Libraries:
- common: common classes and utilities (FancyLib previously)
- jdb: json database library (included in FancyLib previously)
- plugin-tests: testing library for plugins (included in FancyLib previously)
- packets: packet handling library (FancySitula previously)
**Tools:**
- Deployment: deploy plugins to platforms like modrinth
- Quick E2E: generate a quick end-to-end environment for testing
Tools:
- deployment: deploy plugins to platforms like modrinth
- quick-e2e: generate a quick end-to-end environment for testing
Docs: documentation for all plugins, libraries and tools.
Future packages that are planned to be added to the monorepo:
- fancywebsite: https://github.com/FancyMcPlugins/FancyWebsite
- (fancymorphs: https://github.com/FancyMcPlugins/FancyMorphs)
- modrinth-sdk: an SDK for the modrinth API (which then can be used in the deployment and quick-e2e tool)
- minecraft-client: a lightweight Minecraft client for testing
## Usage
The monorepo uses Gradle as a build system. See [monorepo.md](docs/src/development-guidelines/monorepo.md) for more information.
The monorepo uses Gradle as build system. See [monorepo.md](docs/src/development-guidelines/monorepo.md) for more information.
To see specific usage for each package, see the README.md in the respective package directory.
## Contributing
## Contributors
You can contribute to this repository by reporting bugs, suggesting features, or contributing code.
Please read the [contributing guidelines](docs/src/development-guidelines/contributing.md) for more information.
Since this is a new repository, the list of contributors didn't get migrated from the previous repositories.
Here is a list of contributors to the previous repositories:
---
- [Grabsky](https://github.com/Grabsky)
- [OakLoaf](https://github.com/OakLoaf)
- [Matt-MX](https://github.com/MattMX)
- [Sxtanna](https://github.com/Sxtanna)
- [airoons](https://github.com/airoons)
- [BitByLogics](https://github.com/BitByLogics)
- [devpeaqe](https://github.com/devpeaqe)
- [NonSwag](https://github.com/NonSwag)
- [FrezzyDev](https://github.com/FrezzyDev)
- [perkojack](https://github.com/perkojack)
- [BigTowns](https://github.com/BigTowns)
- [kforbro](https://github.com/kforbro)
- [Kamillaova](https://github.com/Kamillaova)
- [Emibergo02](https://github.com/Emibergo02)
- [bridgelol](https://github.com/bridgelol)
- [Seshpenguin](https://github.com/Seshpenguin)
- [UltraFaceguy](https://github.com/UltraFaceguy)
- [4drian3d](https://github.com/4drian3d)
- [Zemux1613](https://github.com/Zemux1613)
- [Yive](https://github.com/Yive)
- [UsainSrht](https://github.com/UsainSrht)
- [killerprojecte](https://github.com/killerprojecte)
- [SirSalad](https://github.com/SirSalad)
- [yukisnowflake](https://github.com/yukisnowflake)
- [BiFTHg](https://github.com/BiFTHg)
- [alexcastro1919](https://github.com/alexcastro1919)
- [FrinshHD](https://github.com/FrinshHD)
- [xii69](https://github.com/xii69)
- [ruViolence](https://github.com/ruViolence)
- [JonasDevDE](https://github.com/JonasDevDE)
- [CloveTwilight3](https://github.com/CloveTwilight3)
[All contributors of this repository:](https://github.com/FancyInnovations/FancyPlugins/graphs/contributors)
*(Taken from https://github.com/FancyMcPlugins/FancyNpcs/graphs/contributors and https://github.com/FancyMcPlugins/FancyHolograms/graphs/contributors)*
<a href = "https://github.com/FancyInnovations/FancyPlugins/graphs/contributors">
<img src = "https://contrib.rocks/image?repo=FancyInnovations/FancyPlugins" alt="All contributors of this repository"/>
</a>
**[All contributors of the old FancyNpcs repository:](https://github.com/FancyMcPlugins/FancyNpcs/graphs/contributors)**
<a href = "https://github.com/FancyMcPlugins/FancyNpcs/graphs/contributors">
<img src = "https://contrib.rocks/image?repo=FancyMcPlugins/FancyNpcs" alt="All contributors of the old FancyNpcs repository"/>
</a>
**[All contributors of the old FancyHolograms repository:](https://github.com/FancyMcPlugins/FancyHolograms/graphs/contributors)**
<a href = "https://github.com/FancyMcPlugins/FancyHolograms/graphs/contributors">
<img src = "https://contrib.rocks/image?repo=FancyMcPlugins/FancyHolograms" alt="All contributors of the old FancyHolograms repository"/>
</a>
If you contributed to the previous repositories and want to be listed here, please open an issue or a pull request.

View File

@@ -1,8 +1,10 @@
plugins {
id("com.gradleup.shadow") version "9.2.2" apply false
id("io.papermc.paperweight.userdev") version "2.0.0-beta.19" apply false
id("xyz.jpenilla.run-paper") version "3.0.2" apply false
id("de.eldoria.plugin-yml.paper") version "0.8.0" apply false
id("com.gradleup.shadow") version "9.0.0-SNAPSHOT" apply false
id("io.papermc.paperweight.userdev") version "2.0.0-beta.16" apply false
id("xyz.jpenilla.run-paper") version "2.3.1" apply false
id("net.minecrell.plugin-yml.paper") version "0.6.0" apply false
id("io.papermc.hangar-publish-plugin") version "0.1.3" apply false
id("com.modrinth.minotaur") version "2.+" apply false
}
allprojects {
@@ -13,14 +15,7 @@ allprojects {
mavenLocal()
mavenCentral()
maven("https://repo.papermc.io/repository/maven-public/")
maven("https://repo.fancyinnovations.com/releases")
maven("https://repo.fancyplugins.de/releases")
maven(url = "https://jitpack.io")
maven("https://maven-prs.papermc.io/Paper/pr13194") {
name = "Maven for PR #13194" // https://github.com/PaperMC/Paper/pull/13194
mavenContent {
includeModule("io.papermc.paper", "dev-bundle")
includeModule("io.papermc.paper", "paper-api")
}
}
}
}

BIN
docs/.DS_Store vendored

Binary file not shown.

View File

@@ -1,4 +1,4 @@
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS builder
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS builder
WORKDIR /build
COPY . /build
RUN dotnet tool install retypeapp --tool-path /bin

View File

@@ -1,20 +1,20 @@
input: src
output: .retype
url: https://docs.fancyinnovations.com
url: https://fancyplugins.de
branding:
title: Fancy Innovations
title: Fancy Plugins
logo: /static/favicon.png
favicon: /static/favicon.png
links:
- text: Website
icon: globe
link: https://fancyinnovations.com
link: https://fancyplugins.de
- text: Download
icon: download
link: https://modrinth.com/user/oliver
- text: GitHub
icon: mark-github
link: https://github.com/fancyinnovations
link: https://github.com/fancymcplugins
- text: Discord
icon: megaphone
link: https://discord.gg/ZUgYCEJUEx
@@ -26,10 +26,10 @@ footer:
links:
- text: Website
icon: globe
link: https://fancyinnovations.com
link: https://fancyplugins.de
- text: GitHub
icon: mark-github
link: https://github.com/fancyinnovations
link: https://github.com/fancymcplugins
- text: Discord
icon: megaphone
link: https://discord.gg/ZUgYCEJUEx

BIN
docs/src/.DS_Store vendored

Binary file not shown.

View File

@@ -1 +0,0 @@
<script defer src="https://umami.fancyinnovations.com/script.js" data-website-id="31f4837e-6616-4699-9daf-ef8d9445b8e6"></script>

View File

@@ -1,154 +1,58 @@
---
visibility: hidden
authors:
- name: Oliver Schlüter
email: oliver@fancyinnovations.com
link: https://github.com/OliverSchlueter
avatar: https://avatars.githubusercontent.com/u/79666085?v=4
- name: Oliver Schlüter
email: oliver@fancyplugins.de
link: https://github.com/OliverSchlueter
avatar: https://avatars.githubusercontent.com/u/79666085?v=4
date: 2025-04-19
title: 1.21.5 Update (Spring to Life)
description: Everything you need to know about the 1.21.5 update.
description: The reasons why we switched to a monorepo for our Minecraft plugins and libraries.
---
![](../static/1_21_5-update.png)
# 1.21.5 Update
In this article, we will talk about the changes in the 1.21.5 update, what that means for our plugins and how we will benefit from the Paper hardfork.
## :icon-log: Changes in 1.21.5
## Changes in 1.21.5 :icon-log:
!!!
Official release notes can be found [here](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-21-5).
!!!
### Game changes
### New Animal Variants
**New Blocks and Features**
**Pigs, Cows, and Chickens** now have **warm and cold variants**, determined by the biome they spawn in.
- Vegetation: Introduction of Firefly Bush, Leaf Litter, Wildflowers, Bush, Short Dry Grass, Tall Dry Grass, and Cactus Flower blocks, enhancing the natural diversity of various biomes.
- Fallen Trees: New fallen tree generation adds to the realism of forested areas.
- Ambient Sounds: Desert and Badlands biomes now feature new ambient block sounds, providing a more immersive environment.
- **Warm Variants**: Found in deserts, jungles, badlands, etc.
- **Cold Variants**: Found in snowy and End biomes.
- Chickens lay new **Blue (cold)** and **Brown (warm)** eggs.
- **Sheep** now spawn with wool color based on the biome's temperature:
- **Cold**: Mostly black
- **Warm**: Mostly brown
- **Temperate**: Mostly white
**Farm Animals Variants**
### New Wolf Sound Personalities
Pigs, Cows, and Chickens now have warm and cold variants, determined by the biome in which they spawn. For instance, cold variants appear in biomes like Frozen Peaks and Snowy Plains, while warm variants are found in Deserts and Jungles. When bred, offspring randomly inherit one of the parents variants, irrespective of the current biome. Additionally, Chickens lay new types of eggs corresponding to their variants: Blue Eggs for cold Chickens and Brown Eggs for warm Chickens.
Wolves now randomly get one of **seven unique sound sets**:
- Classic
- Big
- Cute
- Puglin
- Angry
- Grumpy
- Sad
**Sheep Wool Color**
Each variant has distinct ambient, growl, pant, whine, hurt, and death sounds.
Sheep wool color now depends on the biome:
- Temperate biomes: Commonly white; uncommon colors include black, gray, light gray, and brown; rare chance for pink.
- Cold biomes: Commonly black; uncommon colors are gray, light gray, white, and brown; rare chance for pink.
- Warm biomes: Commonly brown; uncommon colors are black, white, gray, and light gray; rare chance for pink.
### Spawn Egg Visual Overhaul
**Spawn Eggs**
Spawn Eggs now visually reflect the **mob's personality and size**, improving readability and accessibility.
### New World Generation Features
**Fallen Trees**
- Found in most forested biomes.
- Come in **oak, birch, jungle**, and **spruce** variants.
- Sometimes decorated with mushrooms or vines.
**Firefly Bush**
- Grows near water in Swamps, Badlands, and Mangrove Swamps.
- Emits light and glowing particles at night.
- Can be bonemealed to spread.
**Leaf Litter**
- Found in Forests and Dark Forests.
- Placed in up to 4 layers per block.
- Tinted based on biome and usable as fuel or compost.
**Wildflowers**
- Found in Birch Forests, Meadows.
- Stackable flowers that can be bonemealed.
- Craftable into Yellow Dye.
**Bushes**
- Appear in patches in Windswept, Birch, and River biomes.
- Collectable with shears or Silk Touch.
**Dry Grass**
- Short and Tall variants now generate in deserts and badlands.
- Bonemealable and compostable.
- Eaten by Sheep.
**Cactus Flowers**
- Grow on Cactus blocks.
- Used for Pink Dye or compost.
- Require open space on all sides.
### Falling Leaf Particles
All **Leaf blocks** now randomly emit gentle falling leaf particles for added ambience.
### New Ambient Sounds
- **Desert and Badlands** blocks like sand and terracotta now emit subtle ambient sounds.
- Dead Bushes can also trigger audio ambiance when placed on terracotta or sand.
### Visual & Gameplay Tweaks
- **New main menu panorama** for Spring to Life.
- **Beacon beams** now render up to **2048 blocks high** and are thicker at long distances.
- **Lodestones** have a new crafting recipe and spawn in Ruined Portals.
- Updated textures for **Cows, Mooshrooms, and Sheep**.
### Cartographer & Wandering Trader Updates
**Cartographer**
- Sells 7 new maps pointing to structures in different biomes.
- Village-specific map offerings and colored banners.
**Wandering Trader**
- Now buys **basic supplies** like water bottles, hay bales.
- Offers new trades including **logs, potions**, and **enchanted tools**.
### Mob Spawning & Biomes
- **Camels** now spawn in Deserts.
- **Cows, Pigs, Chickens, and Sheep** can spawn in **Badlands**.
- **Woodland Mansions** can generate in the **Pale Garden** biome.
- **Meadows** have slightly sparser short grass.
### Technical & Gameplay Improvements
- **Game Tests** are now accessible via datapacks using the `/test` command.
- **Simulation distance** improvements: tick behavior for crops, snow, and cauldrons extended to all loaded chunks.
- Various **networking, UI, and tooltip** enhancements.
- Sound rebalancing and expanded **Iron block sound types**.
### Dev Features & Fixes
- New `--renderDebugLabels` argument for developers.
- Enhanced **Game Test automation** with new command-line tools.
- Reverted fix to sprint slowdown mechanics to improve parkour experience.
- Minor fixes to **items, sounds, and Realms uploads**.
### And yes, as always...
> **Removed Herobrine.**
Visuals for Spawn Eggs have been overhauled to improve readability and accessibility, with designs reflecting the personality and size of the respective mobs.
### Packet changes
Little has changed in the packet system.
Not much has changed in the packet system.
**Removed packets**
Removed packets:
- `ClientboundAddExperienceOrb`
**Added packets**
Added packets:
- `ClientboundTestInstanceBlocksStatus`
- `ServerboundSetTestBlock`
- `ServerboundTestInstanceBlockAction`
## :icon-megaphone: Changes in the plugins
## Changes in the plugins :icon-megaphone:
### FancyNpcs
@@ -156,13 +60,11 @@ FancyNpcs now supports 1.21.5. Update to version [2.5.0](https://modrinth.com/pl
**New Attributes:**
| Npc Type | Attr. Name | Possible Values |
|----------|--------------|-----------------------|
| Pig | variant | temperate, cold, warm |
| Cow | variant | temperate, cold, warm |
| Chicken | variant | temperate, cold, warm |
| Cat | collar_color | (all colors) |
| Wolf | collar_color | (all colors) |
| Npc Type | Attr. Name | Possible Values |
|----------|------------|-----------------------|
| Pig | variant | temperate, cold, warm |
| Cow | variant | temperate, cold, warm |
| Chicken | variant | temperate, cold, warm |
### FancyHolograms
@@ -171,7 +73,7 @@ FancyHolograms now supports 1.21.5. Update to version [2.5.0](https://modrinth.c
There are no other changes in FancyHolograms.
## :icon-repo-forked: Paper Hardfork
## Paper Hardfork :icon-repo-forked:
You can read about the reasons and changes in this article on the PaperMC forum: [The future of Paper - Hard fork](https://forums.papermc.io/threads/the-future-of-paper-hard-fork.1451/).
It basically allows the Paper team to work on adding support for new versions after without having to wait on Spigot to update. This means that Paper is able to also update to snapshots, pre-releases and release candidates.
@@ -181,6 +83,4 @@ This is perfect for us, because we can as well update our plugins faster to new
## Conclusion
We are excited about the new changes and the Paper hardfork. We are looking forward to updating our plugins to the new version and snapshots faster than before.
Read the full release notes of the 1.21.5 update [here](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-21-5).
We are excited about the new changes and the Paper hardfork. We are looking forward to updating our plugins to the new version and snapshots faster than before.

View File

@@ -1,132 +0,0 @@
---
authors:
- name: Oliver Schlüter
email: oliver@fancyinnovations.com
link: https://github.com/OliverSchlueter
avatar: https://avatars.githubusercontent.com/u/79666085?v=4
date: 2025-05-16
title: "Unlocking the Power of Minecraft Dialogs: Creative Use-Cases for Dialogs"
description: "Creative Use-Cases for Snapshot 25w20as New Feature"
---
# 💡 Unlocking the Power of Minecraft Dialogs: Creative Use-Cases for Dialogs
With the introduction of **dialogs** in Minecraft Snapshot 25w20a, creators have been given a groundbreaking new tool to interact with players directly through structured, modal UI screens. But once you've learned what dialogs are, the next question becomes: **How can I actually use them in my world or server?**
In this post, well explore a wide range of practical, creative, and even unexpected ways dialogs can enhance your Minecraft experience — whether you're building an adventure map, running a multiplayer server, or developing a plugin.
## 🧭 Guided Tutorials for New Players
One of the most immediate and accessible uses for dialogs is onboarding.
Traditionally, when a new player joins a server or world, theyre flooded with chat messages, signs, or confusing books. Important details like server rules, gameplay goals, and tips often get lost in the chaos.
**Dialogs change that.** You can now build multi-step tutorial flows using a series of dialogs, walking new players through:
- Server rules and punishable behavior
- World-specific mechanics
- How to claim land or use commands
- Economy and shop systems
Each step is clean, clickable, and easy to understand. Best of all, players cant ignore them or miss important info in chat — its right there in front of them.
## 🎭 Branching Quests and RPG Storytelling
Dialogs shine in **story-driven gameplay**. With just a few structured dialogs, you can create rich, immersive narrative experiences.
Imagine an NPC asking a player if they want to accept a quest. The dialog presents two buttons:
“Accept” or “Decline.”
Depending on the players choice, the story continues down a different path — or the opportunity is missed.
Use dialogs to:
- Offer moral decisions (help the villagers or betray them)
- Trigger custom events or cutscenes
- Let players ask NPCs questions
- Show reputation-based choices (if player has enough favor)
Pairing dialogs with plugins like **FancyNpcs** allows you to build entire dialogue trees, similar to systems you'd see in RPGs like Skyrim or Fallout — all without a single mod.
## 🏛️ Server Administration and Safety Confirmations
For server admins, dialogs can act as **confirm screens** before important or destructive actions. Instead of relying on chat commands, you can show players a dialog that makes them confirm with a single click.
Some examples:
- Confirming teleportation to a dangerous area
- Accepting the cost of buying a plot of land
- Agreeing to reset their stats or class
- Warning before deleting inventory or data
This makes your systems more professional and reduces the chance of accidental actions — especially for younger or newer players.
## 🧠 Interactive Education and Training
Minecraft is used in education around the world. With dialogs, educators can build **interactive lessons and quizzes** inside the game, with structured progressions.
Example ideas:
- Ask multiple-choice questions at the end of a lesson
- Present facts or rules about an in-game mechanic
- Guide students through a step-by-step tutorial with checkpoints
Dialogs make Minecraft more suitable for structured learning environments — a game-changing shift for Minecraft: Education Edition and similar initiatives.
## 🛍️ In-Game Shops and Menus
Many servers rely on complex item shops or menus built from chests, signs, or NPC GUIs. Dialogs simplify this dramatically.
Use dialogs to:
- Offer limited-time items with descriptions
- Ask players how many of an item they want to buy
- Present choices for ranks, cosmetics, or kits
- Upsell with “Are you sure?” confirmation boxes
The clean design of dialogs makes shopping experiences faster and easier to manage. You could even dynamically generate dialogs based on inventory or permissions using server-side tools.
## 🧪 Minigames and Game Modes
Dialogs can help streamline and elevate custom minigames. You can use them as:
- Entry points into a match (e.g., “Join Red Team” or “Spectate”)
- Mid-round announcements or votes
- Reward claim screens
- Final score summaries
Imagine a parkour map where, after reaching a checkpoint, a dialog offers the player a choice:
**Retry**, **Continue**, or **Teleport to Start.**
Suddenly, the game feels polished — like a real product.
## 🎨 Character Creation and Class Selection
Want to build a roleplay server with classes or custom roles? Use dialogs to guide players through character creation.
For example:
1. Dialog 1: Choose your race (Human, Elf, Orc)
2. Dialog 2: Choose your class (Warrior, Mage, Thief)
3. Dialog 3: Accept or reset choices
This turns setup into a fully visual, immersive process — without relying on chat input or unintuitive command blocks.
## 🏹 Custom Combat Decisions and Abilities
With some creativity and plugins, you could use dialogs in combat systems too.
Examples:
- Trigger special abilities with cooldowns via dialog buttons
- Let players choose attack styles mid-fight
- Present strategic choices (e.g., “Use potion or flee?”)
- Pause solo boss fights to simulate turn-based combat
While dialogs are modal (they pause interaction), this actually works well in single-player or small-scale scenarios where intentional decision-making matters more than real-time chaos.
## 🤯 And Beyond: What Will You Build?
Dialogs are an incredibly flexible system. They give creators a native, moddable interface that feels both powerful and safe. Combined with existing mechanics — like advancements, commands, loot tables, or custom plugins — the sky is truly the limit.
Whether youre guiding a new player through a peaceful farm world or orchestrating a complex sci-fi RPG with factions and dialog trees, this tool changes whats possible in vanilla Minecraft.
## 🔗 Try It Yourself
You can read about dialogs in Mojangs official post here:
👉 [Minecraft Snapshot 25w20a](https://www.minecraft.net/en-us/article/minecraft-snapshot-25w20a)
Be sure to follow FancyInnovations as we continue to bring modern, immersive tools to Minecraft creators everywhere.
_Oliver_

View File

@@ -1,158 +0,0 @@
---
authors:
- name: Oliver Schlüter
email: oliver@fancyinnovations.com
link: https://github.com/OliverSchlueter
avatar: https://avatars.githubusercontent.com/u/79666085?v=4
date: 2025-06-21
title: "FancyAnalytics Dev Log #1"
description: "The rewrite of FancyAnalytics is underway! In this first dev log, we will take a look at the current state of the backend."
---
![](../static/blogs/fa-dev-log-1/dev-log-1.png)
## State of the platform
Let's start by looking at the numbers. There are **46** registered users and **40** users are still on the waiting list.
On the discord server, there are **277** members having the FancyAnalytics role.
In total, there are 52 projects, but only a handful of them receive continuous data.
The **1018** metrics are being visualized in **98** dashboards, which include **872** charts.
There are **1.28** million recorded data points. One data point contains values for all metrics of a project at a specific time.
The total number of errors is **715k**, and the total number of events is **497k** with **60** different event types.
![Metric data chart (last 6 months)](../static/blogs/fa-dev-log-1/metric-data-chart.png)
*(In March, I added an compression algorithm, which reduced the number of the data points by about **70%**.)*
FancyAnalytics receives data from **6300 to 6700** unique clients per day, with a total of **18.4 million** requests per day.
![Amount of senders chart (last 6 months)](../static/blogs/fa-dev-log-1/amount-senders-chart.png)
I think these numbers are quite impressive for a project that is still in beta and has almost no marketing.
Now let's take a look at the current tech stack and architecture of FancyAnalytics.
The backend is written in Java and uses the lightweight framework [Javalin](https://javalin.io/) for the webserver.
The website is made with Vue.js and [Vuetify](https://vuetifyjs.com/en/) (component library).
There is one generic Java SDK and one SDK for Minecraft plugins. FancyAnalytics also provides a plugin for the Minecraft server software Paper.
All data is stored in MongoDB and Redis is used for caching.
Two servers are used to run the backend.
On the first server, the main backend and all databases are running.
There are two instances running on the second server.
All instances of the backend receive data from the clients and cache them in Redis.
The main instance is then responsible for aggregating the data and writing it to MongoDB.
Nginx is used as a reverse proxy to route the requests to the correct instance.
There is also a backup instance that is used to handle the requests if all other instances are down.
It just response with 200 OK and does not write any data to the database.
## The problems with the current architecture
### Scalability
Since javalin is already a lightweight framework, it still uses a lot of memory (around 2 GB per instance).
There is only one backend, and you can toggle certain capabilities on and off using environment variables.
This works but it is not very flexible and does not allow for easy scaling.
Using MongoDB for analytical data is not ideal, as it is not optimized for querying and inserting large amounts of data - even with indexes.
The flexibility of MongoDB is great for the general business data, but it is not suitable for analytical data.
There are databases that are specifically designed for analytical data, such as DuckDB or ClickHouse.
### Performance
The API has few query capabilities, which makes it hard to get the data you really want.
You need to fetch all data and then filter it on the client side (e.g., 6 kb response but only using one data point).
Let's imagine a Minecraft server with the following plugins:
- FancyAnalytics
- FancyNpcs
- FancyHolograms
- FancyDialogs
Each plugin sends analytical data to FancyAnalytics, every 30 seconds. That means eight requests per minute just from this server.
These requests can be combined into one request every 30 seconds, containing all data from all plugins.
## What to expect in the future
I'm currently working on a complete rewrite of the backend, which will address all the problems mentioned above.
There will be 6 different services, each responsible for a specific tasks.
No more Java, the backend will be completely written in **GoLang**.
### Collector
The collector is only responsible for receiving data from the clients and handing it to the ingestor.
It will forward the data to the ingestor via a message queue (NATS).
That means even when the ingestor is down, the collector can still receive data and will not lose any data.
There will be multiple collector instances running, to handle the load.
### Ingestor
The ingestor is responsible for processing the data received from the collector and writing it to the database.
It will also handle the aggregation of the data and write it to the analytical database.
The ingestor has no public API and is only used by the collector.
### Core
The core service will handle the business logic of FancyAnalytics. It is basically the old backend, but rewritten to be more modular and scalable.
It's responsible for managing the projects, dashboards, metrics, queries ...
### IDP (Identity Provider)
The IDP will handle everything related to user management, authentication, and authorization.
The current system only allows for username/password authentication, but the new IDP will support multiple authentication methods, such as "login with Google".
Access tokens will be reworked to be more performant and flexible.
The IDP will also handle email verification and password reset.
### Website
The website backend service will be responsible for serving the website and further docs in the future.
### Router
I'm replacing Nginx with a custom router service, which will route the requests to the correct service.
It supports load balancing and can route the requests based on the URL.
### Databases
We will still use MongoDB for the business data, but we will switch to DuckDB or ClickHouse for the analytical data.
These are OLAP databases that are specifically designed for analytical queries and can handle large amounts of data efficiently.
We will also use Redis for caching and use NATS as a message queue to decouple the services and make them more scalable.
## Coming features
Soon you will be able to store **logs** in FancyAnalytics, which will allow you to track errors and other log messages from your applications.
This is great for debugging and monitoring your applications.
**Alerts** is a highly requested feature, which will allow you to set up alerts based on certain conditions.
You can set up alerts for when a metric exceeds a certain threshold or when an error occurs.
You will be able to receive notifications via email, Discord, or other channels.
Another highly requested feature is **public dashboards**, which will allow you to share your dashboards with others (read-only).
This is great for sharing your analytics with your team or the public.
This feature will also include the ability to embed the dashboards or single charts in other websites.
**Templates** are another feature that will allow you to easily create dashboards and charts.
A template contains a set of metrics and predefined dashboards that can be used to quickly set up a project.
Example templates could be:
- Minecraft server template: Contains metrics for player count, TPS, and plugin usage
- Minecraft plugin template: Contains metrics for plugin usage, server software and version
- Discord bot template: Contains metrics for server count, user count, and message count
- General Java application template: Contains metrics for memory usage, CPU usage, and garbage collection
- Web application template: Contains metrics for page views, user sessions, and errors
FancyAnalytics is not only for Minecraft related projects, but can be used anywhere.
In addition to the Java SDK, we will also provide a **Go and JavaScript SDK**.
The Go SDK will be used for the backend services, while the JavaScript SDK will be used for web applications.
## Conclusion
The rewrite of FancyAnalytics is a big step forward and will address all the problems we have with the current architecture.
I'm excited to see how the new architecture will improve the performance and scalability of FancyAnalytics.
It will still take some time until the new architecture is ready, but I will keep you updated on the progress.
Thank you to everyone who already uses FancyAnalytics and provides feedback. I'm looking forward to accept more users after the rewrite is finished.
If you have any questions or suggestions, feel free to join the [Discord server](https://discord.gg/ZUgYCEJUEx) or dm me on Discord (real_oliver).
_Oliver_

View File

@@ -1,139 +0,0 @@
---
authors:
- name: Oliver Schlüter
email: oliver@fancyinnovations.com
link: https://github.com/OliverSchlueter
avatar: https://avatars.githubusercontent.com/u/79666085?v=4
date: 2025-08-20
title: "FancyAnalytics Dev Log #2"
description: "We're getting closer to v1 of FancyAnalytics!"
---
![](../static/blogs/fa-dev-log-2/dev-log-2.png)
## Some numbers
Let's start by looking at some numbers, which have changed since the last dev log.
There are +30 new users on the waiting list, bringing the total to **70** users on the list.
This is a good sign that people are interested in FancyAnalytics and want to use it.
The number of recorded data points has increased to **1.4 million** and the total number of errors is now **1 million**.
The total number of events is now **0.7 million** with **69** different event types.
FancyAnalytics now receives data from about **9500** unique clients per day (+ 46% :O), with a total of **27.4 million** incoming requests per day.
![Amount of senders chart (last 6 months)](../static/blogs/fa-dev-log-2/amount-senders-chart.png)
It's impressive to see how FancyAnalytics is growing, even without any marketing.
## Check your email address!
Some of you have no email address set in your profile. A valid email address is required to use v1 of FancyAnalytics, once it is released.
Please check your profile and set a valid email address. You can do this in the profile page of the website.
![Profile page](../static/blogs/fa-dev-log-2/navigate-to-profile.png)
You can only set your email address if it's not a valid email address.
In the first few months of the beta phase, I manually created accounts for users who wanted to try FancyAnalytics and used their Discord username as the email address.
So everyone has to set their email address manually before v1 is released!
## The new API
### Metrics
In FancyAnalytics v1, metrics will become way more powerful and flexible.
The first decision you have to make is whether your metric is a **pull-based** or **push-based** metric.
The key difference is who is responsible for sending the metric data to the FancyAnalytics API.:
- **Push-based**: the client (e.g. Minecraft server) proactively sends the metric data to the FancyAnalytics API every X seconds.
- **Pull-based**: FancyAnalytics will request the metric data from the client every X seconds.
When your metric is a pull-based metric, you can define the endpoint (e.g. `https://minecraftserver.com/metrics`) and the interval (in seconds) at which FancyAnalytics should request the data.
If your metric is a push-based metric, you need to decide whether it's a **multi-sender** or **single-sender** metric.
As the name suggests, a multi-sender metric can be sent by multiple clients (e.g., everyone who uses your Minecraft plugin) at the same time, while a single-sender metric can only be sent by one client at a time (your personal Minecraft server).
If you choose a multi-sender metric, you can set the aggregation interval (in seconds) at which FancyAnalytics should aggregate the data from all clients.
You can also choose to apply extra aggregation functions to the data, such as `sum`, `avg`, `min`, `max`, and `count`.
Currently, the structure of a metric looks like this:
```json
{
"project_id": "FancyNpcs",
"metric_id": "npc_count",
"name": "NPC Count",
"multi_sender": true,
"aggregation_interval": 300,
"apply_extra_aggregation": true,
"pull_metric": false,
"pull_interval": 0,
"pull_url": ""
}
```
### Metric data
The data structure of a metric data point has also changed. Metrics now **only** support numeric values, which can be either an integer or a floating point.
You can now group metric data points by **labels**, which is the alternative to the string-based metrics. You can think of labels as "sub-metrics" that can be used to differentiate between different data points of the same metric.
The label field is optional, so you can still send a metric without labels.
The new data structure looks like this:
```json
{
"sender_id": "sender-1",
"project_id": "FancyNpcs",
"data": [
{
"metric": "npc_types",
"label": "player",
"value": 40.0
},
{
"metric": "npc_types",
"label": "cow",
"value": 10.0
},
{
"metric": "npc_actions",
"value": 123
}
]
}
```
## Identity Provider
Since the last dev log, I have also made some progress on the identity provider (idp) service.
The idp service is responsible for user authentication and identity management. It will handle two central tasks:
- **User management**: Registration, login, password management, verification, roles, custom metadata, etc.
- **Token management**: Creating, refreshing, and validating tokens for authenticated users
The user management part is almost completely implemented and works well. Only OCID user registration (sign in via Google, GitHub or Discord) and the forgot password flow are still missing.
The token management part is already implemented and works well, too. It now uses JWT tokens, which are more secure and easier to use than the previous token system.
I still need to figure out a way to prevent brute force attacks on the login endpoint and implement rate limiting for the API.
If you have any suggestions on how to implement this, feel free to join the [Discord server](https://discord.gg/ZUgYCEJUEx) and let me know :D
## Next steps
The next step for FancyAnalytics is to finish the idp service and make user management available in the new web interface (a dedicated dev log about the new UI will follow).
After that, I will focus on the core service and UI, which will be the main part of FancyAnalytics v1.
## Conclusion
FancyAnalytics is making great progress and is getting closer to the v1 release.
I still can't give you a specific date for the release, as I still have a lot of work to do, but I hope you are as excited as I am about the upcoming features and improvements.
Thank you for your continued support and interest in FancyAnalytics!
You can still join the [waiting list](https://fancyanalytics.net/register/) and get access to the beta version once it's available.
If you have any questions or suggestions, feel free to join the [Discord server](https://discord.gg/ZUgYCEJUEx) or dm me on Discord (real_oliver).
_Oliver_

View File

@@ -1,7 +1,7 @@
---
authors:
- name: Oliver Schlüter
email: oliver@fancyinnovations.com
email: oliver@fancyplugins.de
link: https://github.com/OliverSchlueter
avatar: https://avatars.githubusercontent.com/u/79666085?v=4
@@ -18,7 +18,7 @@ With the new monorepo, the docs are now even closer to the code, which makes it
In addition, we have improved the structure and added new content.
!!!
You can find the new documentation at [https://docs.fancyinnovations.com](https://docs.fancyinnovations.com)
You can find the new documentation at [https://docs.fancyplugins.de](https://docs.fancyplugins.de)
!!!
## Reasons
@@ -62,5 +62,5 @@ We are also working on a section about the product direction and roadmap. You wi
## Conclusion
We are happy with the new documentation and hope you like it too.
Visit [https://docs.fancyinnovations.com](https://docs.fancyinnovations.com) to check it out.
Visit [https://docs.fancyplugins.de](https://docs.fancyplugins.de) to check it out.
If you have any feedback or suggestions, feel free to join our Discord server and let us know.

View File

@@ -1,70 +0,0 @@
---
authors:
- name: Oliver Schlüter
email: oliver@fancyinnovations.com
link: https://github.com/OliverSchlueter
avatar: https://avatars.githubusercontent.com/u/79666085?v=4
date: 2025-05-15
title: What Are Minecraft Dialogs? A Deep Dive into Snapshot 25w20as New Feature
description: "A Deep Dive into Snapshot 25w20as New Feature: Minecraft Dialogs"
---
# What Are Minecraft Dialogs? A Deep Dive into Snapshot 25w20as New Feature
With the release of **Minecraft Snapshot 25w20a**, Mojang has quietly introduced one of the most powerful UI tools the game has ever seen: **Dialogs**. Still in an experimental stage, this feature unlocks a whole new way to interact with players — not through chat commands or signs, but with native, in-game screens that deliver structured content and present players with real choices.
For map makers, server owners, and plugin developers, dialogs offer a bridge between immersive storytelling and technical clarity. In this article, well explore what dialogs are, how they function under the hood, what safety features Mojang has put in place, and why this could be the start of a new era for Minecraft content creation.
## 📜 What Exactly Are Dialogs in Minecraft?
At their core, dialogs are **modal UI screens** — meaning they appear in front of the player and require an action (like clicking a button) before gameplay can continue. They resemble the kind of pop-up windows you'd see in classic RPGs or adventure games: clean, purposeful, and highly interactive.
These dialogs can display information, guide the player through decisions, and present buttons that let them make a choice. Whether you're asking a player to accept a quest, read a rule, confirm a trade, or choose a faction, dialogs are designed to keep the interaction intuitive and immersive — and, most importantly, built right into vanilla Minecraft.
Until now, developers and builders had to rely on inventories, books, signs, scoreboard titles, or chat messages to deliver structured information. Dialogs replace all that with something more focused, more flexible, and far more professional.
## 🧪 Dialogs Are Still Experimental — And Thats a Good Thing
Because dialogs are new and powerful, Mojang has chosen to label them as **experimental** — a wise decision, considering the risks and implications of introducing UI screens that custom content creators can control.
To ensure a safe and transparent experience, every dialog includes a warning icon at the top of the screen. This visual cue tells players, “Youre looking at a custom dialog.” But it doesnt stop there. If a player clicks the warning, a second dialog opens to explain whats happening — and provides a critical escape hatch: the option to **leave the world immediately**.
This extra layer of safety prevents malicious use. It also ensures that players arent trapped in infinite dialog loops — a potential abuse scenario that Mojang has carefully preempted. While dialogs may seem like a UI convenience, Mojang clearly understands their power and is taking the rollout seriously.
## 📦 Dialogs Under the Hood: A Look at the Registry
From a technical perspective, dialogs are part of a new registry in the game called `minecraft:dialog`. This means dialogs are no longer just abstract functions — they are **defined content types** that can be stored, loaded, and reused across a world or data pack.
Creators can define dialogs using JSON files inside a data pack, making them easy to edit and version control. These dialogs can either be referenced from the registry or defined inline — giving developers the choice between modularity and one-off implementation.
This registry-based model isnt just a convenience for coders. Its a sign that Mojang is moving toward more structured, modular systems in Minecrafts backend — and that means more scalable content, easier debugging, and greater consistency across projects.
## 🛠️ How Dialogs Can Transform Custom Content
Lets talk about the practical side of things. For server owners and map makers, dialogs offer massive benefits in terms of clarity, engagement, and immersion.
Take tutorials, for example. Instead of bombarding new players with walls of chat text or signs at spawn, you can now greet them with a dialog that walks them through the server rules step by step. Dialogs provide structure, pacing, and a sense of professionalism that text alone often fails to deliver.
In roleplaying and adventure maps, dialogs can serve as actual conversations. Pairing them with NPCs — especially using plugins like FancyNpcs — allows you to create branching dialogues, player decisions, and interactive quests, all without external mods. Players can read backstory, choose a response, and watch the world react — just like in a traditional RPG.
Dialogs also shine in gameplay systems. You can present confirmation screens before teleporting a player, deleting an item, or entering a dungeon. Want to let players choose their class, guild, or starter item? Present them with a dialog instead of clunky commands or GUI menus. Everything becomes more elegant.
And the best part? All of this is possible **without a single mod**, using just data packs and, eventually, server plugins.
## 🎮 Why This Feature Is a Game-Changer
At first glance, dialogs might seem like a small feature. But they represent a fundamental shift in how Minecraft content is delivered and experienced. Mojang is actively building tools that were once only possible through heavy modding — and bringing them into the core game, thoughtfully and responsibly.
Dialogs aren't just convenient — they're empowering. They give creators the ability to build richer narratives, more complex decision systems, and more immersive gameplay without writing a single line of chat text. For players, they mean cleaner instructions, clearer choices, and more engagement with the world around them.
Its not an exaggeration to say that dialogs could become one of the most important features for Minecraft creators in the years to come.
## 📚 Learn More and Stay Ahead
If youre curious to see how dialogs are defined or want to experiment with them yourself, you can dive into the official announcement here:
👉 [Minecraft Snapshot 25w20a](https://www.minecraft.net/en-us/article/minecraft-snapshot-25w20a)
The dialog system is just beginning to evolve, but its already clear: the way we build Minecraft experiences is about to change — and for the better.
_Oliver_

View File

@@ -1,11 +1,10 @@
---
authors:
- name: Oliver Schlüter
email: oliver@fancyinnovations.com
email: oliver@fancyplugins.de
link: https://github.com/OliverSchlueter
avatar: https://avatars.githubusercontent.com/u/79666085?v=4
date: 2025-03-21
description: The reasons why we switched to a monorepo for our Minecraft plugins and libraries.
---

View File

@@ -1,5 +1,4 @@
---
icon: dot
order: 80
---
# Contributing
@@ -30,7 +29,7 @@ Follow the format described in the [Monorepo](monorepo.md) guidelines.
Please make sure that your code is tested before marking the pull request as ready for review. This means that the code should compile and run without any errors. If you are unsure about how to test your code, please join our Discord server and ask for help.
When creating a PR for FancyNpcs, please run the `/fancynpcs run_tests` command in-game and attach a screenshot of the output to the PR.
When creating a PR for FancyNpcs, please run the `/fancynpcs test` command in-game and attach a screenshot of the output to the PR.
### Documentation

View File

@@ -0,0 +1,5 @@
---
order: 1
icon: shield
redirect: contributing
---

View File

@@ -1,2 +0,0 @@
order: 1
icon: shield

View File

@@ -1,6 +1,5 @@
---
order: 8
icon: dot
---
![](../static/monorepo.png)
@@ -12,12 +11,6 @@ icon: dot
A monorepo (monolithic repository) is a version control strategy where multiple related projects, such as Minecraft plugins and libraries, reside within a single repository.
Instead of maintaining separate repositories for each plugin or library, all codebases share the same version control system, dependencies, and development workflow.
Read more about monorepos there:
- https://monorepo.tools/
- https://medium.com/@lewimuchiri/setting-up-a-gradle-monorepo-with-spring-boot-and-version-catalogs-41fdf1112dac
- https://dev.to/scorsi/why-i-choose-to-use-a-mono-repo-for-a-very-large-project-hkp
- https://docs.gradle.org/current/userguide/intro_multi_project_builds.html
## Benefits of a Monorepo
- **Code Reuse**: Share common libraries between plugins without duplication.

View File

@@ -1,7 +1,3 @@
---
icon: dot
---
# Release Workflow
This document describes the steps to be taken when releasing a new version of a plugin.

View File

@@ -1,5 +1,4 @@
---
icon: dot
order: 9
---
# Versioning
@@ -9,7 +8,7 @@ We use [Semantic Versioning](https://semver.org/) (Semver) for versioning.
The version is structured as follows: `major.minor.patch.<build id>`. The build id is optional and is only used for
development builds.
!!!warning
!!! warning
This versioning system is not getting used yet. We will start applying the rules in the version 3.0.0 of all plugins.
!!!

View File

@@ -1,38 +0,0 @@
---
title: FancyAnalytics
icon: graph
order: 80
---
#
![](../static/logos-and-banners/fancyanalytics-banner.png)
!!!
The modern analytics platform for Minecraft server owners and plugin developers
!!!
## Features
With FancyAnalytics, you will be able to understand the behavior of your users like never before. You will be able to:
- Collect metrics like player count, server uptime, and more
- Track events like player joins, deaths, and more
- Visualize your data with beautiful charts and graphs on multiple dashboards
- Analyze errors and exceptions that occur on your server or in your plugins
FancyAnalytics is still in development, but we are working hard to bring you the best analytics platform for Minecraft. We plan to add many more features in the future, including:
- Pre-defined metrics and dashboards for popular plugins
- Community-driven metrics and dashboards
- Alerts and notifications for important events
- Real-time data streaming
- Log viewing and analysis
- Organization and team management
- Survey and feedback collection
- Support and issue tracking
## Getting Started
Getting started with FancyAnalytics is easy!
Just create an account on our website ([fancyanalytics.net](https://fancyanalytics.net)) and follow the instructions to set up your server or plugin.
You can also check out our documentation for more information on how to use FancyAnalytics.

View File

@@ -1,21 +0,0 @@
---
icon: dot
order: 100
---
# Alerts (soon)
Our analytics platform allows you to define **alerts** that notify you when something important happens — a metric crosses a threshold, an event occurs, or an error spikes.
With alerts, you can **react faster**, **stay informed**, and **automate monitoring** for your apps, plugins, or services.
## What is an Alert?
An **alert** is a rule that monitors your data in real-time and triggers a notification when conditions are met.
You can create alerts for:
- **Metrics** — e.g. `cpu_usage_percent > 90`
- **Events** — e.g. `event == 'minecraft_server_crashed'`
- **Errors** — e.g. `5+ errors in 10s`
- **Logs** — e.g. `ERROR logs > 10 in 1 minute`

View File

@@ -1,22 +0,0 @@
---
icon: dot
order: 300
---
# Errors
Our analytics platform supports error and exception tracking across all projects.
Errors are structured records of exceptions that occur in your applications.
They help you **debug**, **monitor stability**, and **gain insights into failure patterns**.
## What is an Error?
An **error** represents a crash, exception, or runtime issue that happened inside an application. It includes:
- A **timestamp**
- The **exception class** (e.g. `NullPointerException`)
- The **exception message**
- The **stack trace**
- Optional **custom properties** for extra context

View File

@@ -1,30 +0,0 @@
---
icon: dot
order: 400
---
# Events
**Events** are time-stamped, structured logs that describe something that **happened** in your application.
They are flexible, contextual, and great for tracking user behavior, system actions, feature usage, and more.
## What is an Event?
An **event** is:
- Identified by an **event name** (e.g. `npc_spawned`, `command_used`, `plugin_loaded`)
- Has a **timestamp**
- Sent by a **sender** (e.g., server, client, device)
- It Can include any number of **properties** (flexible key-value pairs)
Unlike metrics, events are **not numeric by default**, but rather represent **something that occurred**, and may include rich context.
## Example Use Cases
| Event Name | Properties | Description |
|---------------------|---------------------------------|------------------------------------------|
| `npc_spawned` | world_name, npc_type | Fired whenever an NPC is spawned in-game |
| `feature_flag_used` | feature_flag | Tracked when a feature is enabled/used |
| `plugin_loaded` | plugin_version, server_software | When the plugin successfully loads |
| `command_executed` | command, player | A player runs a specific command |
| `player_joined` | player, location | A player joins the server |

View File

@@ -1,2 +0,0 @@
icon: sparkles-fill
order: 500

View File

@@ -1,19 +0,0 @@
---
icon: dot
order: 200
---
# Logs (soon)
Our analytics platform supports **structured logging** — a powerful way to capture detailed logs with context for debugging, monitoring, and analysis.
Structured logs go beyond plain text by capturing logs in a **machine-readable, structured format** with support for levels, timestamps, and custom properties.
## 💡 What is a Structured Log?
A **structured log** is:
- A **timestamped message**
- With a **log level** (e.g. `INFO`, `WARN`, `ERROR`)
- And **optional structured properties** (key-value pairs)
This makes logs **queryable**, **filterable**, and easy to **analyze programmatically**.

View File

@@ -1,34 +0,0 @@
---
icon: dot
order: 500
---
# Metrics
Metrics are **numerical values** that represent the state, performance, or behavior of your application over time.
They are the core building blocks of the analytics platform — enabling insights, dashboards, alerts, and aggregation across many data sources.
## What is a Metric?
A **metric** is:
- Identified by a **name** (e.g. `cpu_usage_percent`, `online_players`, `npc_type_pig`)
- Reported by one or more **senders** (e.g., a game server, plugin, or application)
- Includes exact one **numeric value**
Each metric is sent at a point in time and represents a measurable value from your application or environment.
## What Can Be a Metric?
Anything that can be measured numerically:
| Metric Name | Example Value | Description |
|---------------------|---------------|-------------------------------------|
| `cpu_usage_percent` | `42.5` | Current CPU usage in percent |
| `online_players` | `10` | Number of players online |
| `npc_count` | `123` | Total NPCs spawned on a game server |
| `npc_count_pig` | `5` | Number of pig NPCs |
| `plugin_enabled` | `1` (true) | Boolean values are converted to 1/0 |
| `tps` | `20` | Ticks per second |
| `network_in_kb` | `512` | Incoming network traffic |

View File

@@ -1,2 +0,0 @@
icon: info
order: 400

View File

@@ -1,83 +0,0 @@
---
icon: dot
order: 300
---
# Java SDK
!!!danger
The FancyAnalytics platform is still in development. Expect breaking changes in the future.
!!!
If you are a Java developer, who wants to track metrics about your Java application, without being in the Minecraft ecosystem, you can use our Java SDK.
The Java SDK is a general purpose SDK which can be used to track metrics about any Java application.
## Include the Java SDK
### Gradle
```kotlin
repositories {
maven("https://repo.fancyinnovations.com/releases")
}
```
```kotlin
dependencies {
implementation("de.oliver.fancyanalytics:java-sdk:VERSION")
}
```
### Maven
```xml
<repository>
<id>fancyplugins-releases</id>
<name>FancyPlugins Repository</name>
<url>https://repo.fancyinnovations.com/releases</url>
</repository>
```
```xml
<dependency>
<groupId>de.oliver.FancyAnalytics</groupId>
<artifactId>java-sdk</artifactId>
<version>VERSION</version>
</dependency>
```
!!!warning
Make sure to shade the API into your app! You can use the [Shade plugin](https://imperceptiblethoughts.com/shadow/) for this.
!!!
## Use the API
### Initialize the ApiClient
First you need to create an instance of the `ApiClient` class.
```java
ApiClient fancyAnalytics = new ApiClient("https://api.fancyanalytics.net", "", "YOUR API TOKEN");
```
### Send metric data
You can send metric data to the server using the record service.
```java
Record record = new Record("unique sender id", "project id", timestamp, new HashMap<>());
record.withEntry("metric name", "metric value");
fancyAnalytics.getRecordService().createRecord("project id", record);
```
### Send events
You can also send events to the server using the event service.
```java
Event event = new Event("event name", new HashMap<>());
event.withProperty("prop key", "prop value");
fancyAnalytics.getEventService().createEvent("project id", event);
```

View File

@@ -1,118 +0,0 @@
---
icon: dot
order: 400
---
# Minecraft Plugins
!!!danger
The FancyAnalytics platform is still in development. Expect breaking changes in the future.
!!!
If you are a Minecraft plugin developer, you might want to track metrics about your plugin usage.
So you know how many people are using your plugin and how they are using it.
We provide a Java SDK which is specifically designed for Minecraft plugins.
## Include the FancyAnalytics API
### Gradle
```kotlin
repositories {
maven("https://repo.fancyinnovations.com/releases")
}
```
```kotlin
dependencies {
implementation("de.oliver.fancyanalytics:mc-api:VERSION")
}
```
### Maven
```xml
<repository>
<id>fancyplugins-releases</id>
<name>FancyPlugins Repository</name>
<url>https://repo.fancyinnovations.com/releases</url>
</repository>
```
```xml
<dependency>
<groupId>de.oliver.FancyAnalytics</groupId>
<artifactId>mc-api</artifactId>
<version>VERSION</version>
</dependency>
```
!!!warning
Make sure to shade the API into your plugin! You can use the [Shade plugin](https://gradleup.com/shadow/) for this.
!!!
## Initialize the API
```java
FancyAnalyticsAPI fancyAnalytics = new FancyAnalyticsAPI("project-id", "api-token");
fancyAnalytics.registerMinecraftPluginMetrics();
fancyAnalytics.initialize();
```
You can find your project ID and api token in the project settings page.
### Custom metrics
You can also send custom metrics to the server:
```java
// Register a number metric to track the amount of npcs
fancyAnalytics.registerNumberMetric(new MetricSupplier<>("amount_npcs", () -> npcManager.getNpcs().size()));
// Register a string metric to track the used language
fancyAnalytics.registerStringMetric(new MetricSupplier<>("language", () -> languageManager.getLanguage()));
```
You can also send multiple values at once with the `registerStringArrayMetric` and `registerNumberArrayMetric` methods.
This is useful for tracking the player client's version for example.
Make sure to add the metrics on website at the project settings page (must be same name as in the code)!
### Events
Some things are better tracked as events. For example, purchases in a shop. You can send events like this:
```java
fancyAnalytics.sendEvent(
new Event("PurchasedItem")
.withProperty("player","Steve")
.withProperty("item","Diamond")
.withProperty("amount","1")
.withProperty("price","5")
);
```
You can also add custom properties to the event. Each property has a key (string) and a value (string but can be
converted to a number if needed).
Once the first event is sent, there will be a new event-type created on the website. This event-type will have the name
and the keys of all properties of the event. You can then see the events on the website.
You do not need to add the events on the website, they will be created automatically and all properties will be updated
automatically as well.
### Error reporting
FancyAnalytics can also track errors in your project. All you need to do is register all relevant loggers:
```java
Logger myLogger = ...;
fancyAnalytics.getExceptionHandler().registerLogger(myLogger);
```
All exceptions that are thrown in the logger and are related to the plugin will be tracked. You can see all thrown
exceptions on the website.
### Done!
This is all you need to do to get started with FancyAnalytics. It will automatically send the data to the server.

View File

@@ -1,37 +0,0 @@
---
icon: dot
order: 500
---
# Minecraft Servers
!!!danger
The FancyAnalytics platform is still in development. Expect breaking changes in the future.
!!!
If you run a Minecraft server, you might want to track metrics about your players and server performance.
We provide a Minecraft plugin which can be installed on your server to send data to FancyAnalytics.
## Installation
To install FancyAnalytics on your server, you need to follow these steps:
1. Download the latest release from the [download page](https://fancyanalytics.net/downloads)
2. Put the downloaded jar file in the ``plugins`` folder of your server
3. Restart your server
4. Run the command `/fancyanalytics version` to confirm that the plugin is installed
## Configuration
To use FancyAnalytics, you need to create an account on the [FancyAnalytics website](https://fancyanalytics.net/register) and create a new project.
After creating the project, you need to put the project ID and the API key in the `config.yml` file of the plugin.
```yaml
project_id: "your project id"
api_key: "your api key",
enable_default_events: false
```
## Usage
All you need to do is wait for the data to be collected, and then you can see it on the website. This can take up to 2 minutes.

View File

@@ -1,13 +0,0 @@
---
icon: dot
order: 200
visibility: hidden
---
# REST API
!!!danger
The FancyAnalytics platform is still in development. Expect breaking changes in the future.
!!!
If you are not a Java developer, or you are using a different programming language, you can use our REST API to send data to FancyAnalytics.

View File

@@ -1,2 +0,0 @@
icon: code
order: 6

View File

@@ -1,67 +0,0 @@
---
icon: dot
---
# Getting started
## Include the API in your project
To include the FancyNPCs API in your project, you need to add the following dependency to your `build.gradle.kts` or `pom.xml` file.
**Gradle:**
```kotlin
repositories {
maven("https://repo.fancyinnovations.com/releases")
}
```
```kotlin
dependencies {
compileOnly("de.oliver:FancyDialogs:VERSION")
}
```
**Maven:**
```xml
<repository>
<id>fancyinnovations-releases</id>
<name>FancyInnovations Repository</name>
<url>https://repo.fancyinnovations.com/releases</url>
</repository>
```
```xml
<dependency>
<groupId>de.oliver</groupId>
<artifactId>FancyDialogs</artifactId>
<version>VERSION</version>
<scope>provided</scope>
</dependency>
```
Replace `VERSION` with the version of the API you want to use. You can find the latest version on the download pages or in the GitHub releases.
## Show a notice dialog
```java
new NoticeDialog("title", "message").show(player);
// or
NoticeDialog.show(player, "message");
```
## Show a confirmation dialog
```java
new ConfirmationDialog("Are you sure you want to reload the configuration?")
.withTitle("Confirm reload")
.withOnConfirm(() -> player.sendMessage("Reloading configuration..."))
.withOnCancel(() -> player.sendMessage("Reload cancelled."))
.ask(player);
```
## JavaDocs and help
You can find the JavaDocs for the FancyDialogs API [here](https://repo.fancyinnovations.com/javadoc/releases/de/oliver/FancyDialogs/latest).
Join the [FancyInnovations Discord](https://discord.gg/ZUgYCEJUEx) for help and support. There is a dedicated channel for help about the api (`#dialogs-api`).
```

View File

@@ -1,2 +0,0 @@
icon: log
order: 5

View File

@@ -1,107 +0,0 @@
---
icon: dot
order: 1
---
# FancyDialogs v0.x.x
## v0.0.19 [!badge variant="info" text="2025-07-25"]
- Added checkbox input type
## v0.0.18 [!badge variant="info" text="2025-07-21"]
- Added more metrics
## v0.0.17 [!badge variant="info" text="2025-07-21"]
- Close all dialogs when plugin reloads
## v0.0.16 [!badge variant="info" text="2025-07-17"]
- Added support for 1.21.8
## v0.0.15 [!badge variant="info" text="2025-07-17"]
- Updated FancyAnalytics to 0.1.8
## v0.0.14 [!badge variant="info" text="2025-07-17"]
- Added support for PlaceholderAPI
## v0.0.13 [!badge variant="info" text="2025-07-17"]
- Enhanced dialog viewer management
## v0.0.12 [!badge variant="info" text="2025-07-10"]
- I don't know
## v0.0.11 [!badge variant="info" text="2025-06-30"]
- Added support for 1.21.7
## v0.0.10 [!badge variant="info" text="2025-06-29"]
- Allow inputs to be null
## v0.0.9 [!badge variant="info" text="2025-06-28"]
- Added `open_random_dialog` action to open a random dialog from a list
## v0.0.8 [!badge variant="info" text="2025-06-28"]
- Fixed permission for dialog command
- Allow console to open dialogs for players
## v0.0.7 [!badge variant="info" text="2025-06-27"]
- Added support for text fields in dialogs
## v0.0.6 [!badge variant="info" text="2025-06-26"]
- Added default values for confirmation dialog
- Added support for the select input
- Marked Folia as supported
## v0.0.5 [!badge variant="info" text="2025-06-20"]
- Added support for text fields in dialogs
## v0.0.4 [!badge variant="info" text="2025-06-20"]
- Added fancyanalytics integration
## v0.0.3 [!badge variant="info" text="2025-06-20"]
- Removed close action
- Added console_command, player_command and send_to_server actions
- Made dialog registry and action registry accessible from the API
- Added confirmation dialogs to certain commands
- Removed html encoding for default dialogs
## v0.0.2 [!badge variant="info" text="2025-06-19"]
- Added action system
- Added `open_dialog`, `close`, and `message` default actions
- Implemented confirmation dialog api
- Added command to reload config
## v0.0.1 [!badge variant="info" text="2025-06-17"]
Initial **alpha version** of FancyDialogs.
You can already create dialogs in the `plugins/FancyDialogs/data/dialogs` directory.
Open dialogs with the `/dialog` command.
You can add the `open_dialog` action to npcs by FancyNpcs to open certain dialogs when interacting with npcs.
Work-in-progress:
- Quick actions hotkey
- Tutorial system
- Input controls
- Button action system
I hope you enjoy creating wonderful dialogs already!

View File

@@ -1,23 +0,0 @@
---
icon: dot
order: 2
---
![](../../static/changelog_v1_x_x.png)
#
## v1.0.1 [!badge variant="info" text="2025-11-23"] [!badge variant="danger" text="Hotfix"]
- Fixed player kick issue when no button or action is defined. ([#147](https://github.com/FancyInnovations/FancyPlugins/issues/147))
## v1.0.0 [!badge variant="info" text="2025-11-23"]
- Create dialogs using the [JSON schema](https://docs.fancyinnovations.com/fancydialogs/tutorials/json-schema/)
- PlaceholderAPI and MiniMessage support in dialog texts
- Execute actions when dialog buttons are clicked
- Open a dialog when the user joins the server for the first time (see `welcome_dialog_id` in the config)
- A quick actions dialog which can be opened with the `/qa` or `/quickactions` commands
- FancyNpcs ingegration to open dialogs when interacting with NPCs (see [docs](https://docs.fancyinnovations.com/fancydialogs/tutorials/open-dialog-npc-action/))
- API for other plugins to open dialogs (see [docs](https://docs.fancyinnovations.com/fancydialogs/api/getting-started/))

View File

@@ -1,2 +0,0 @@
order: 9
icon: command-palette

View File

@@ -1,22 +0,0 @@
---
icon: dot
order: 10
---
![](../../static/commands.png)
# /Dialog
## List all dialogs
Lists all registered dialogs.
- **Syntax**: `/dialog list`
- **Permissions**: `fancydialogs.commands.dialog.list`
## Open dialog
Opens a dialog (for a player) by its ID.
- **Syntax**: `/dialog open <id> [player]`
- **Permissions**: `fancydialogs.commands.dialog.open`

View File

@@ -1,79 +0,0 @@
---
icon: dot
order: 8
---
![](../../static/commands.png)
# /FancyDialogs
## Version
Shows the version of FancyDialogs.
- **Syntax**: `/fancydialogs version`
- **Permissions**: `fancydialogs.commands.fancydialogs.version`
## Config
### Reload config
Reloads the FancyDialogs configuration file.
- **Syntax**: `/fancydialogs config reload`
- **Permissions**: `fancydialogs.commands.fancydialogs.config.reload`
## Storage
### Save all dialogs
Saves all dialog data to the storage.
- **Syntax**: `/fancydialogs storage save`
- **Permissions**: `fancydialogs.commands.fancydialogs.storage.save`
### Load all dialogs
Loads all dialog data from the storage.
- **Syntax**: `/fancydialogs storage load`
- **Permissions**: `fancydialogs.commands.fancydialogs.storage.load`
### Reload all dialogs
Clears the dialog registry and loads all dialog data from the storage.
- **Syntax**: `/fancydialogs storage reload`
- **Permissions**: `fancydialogs.commands.fancydialogs.storage.reload`
## Registry
### List all dialogs
Lists all registered dialogs.
- **Syntax**: `/fancydialogs registry list`
- **Permissions**: `fancydialogs.commands.fancydialogs.registry.list`
### Clear registry
Clears the dialog registry
- **Syntax**: `/fancydialogs registry clear`
- **Permissions**: `fancydialogs.commands.fancydialogs.registry.clear`
### Unregister dialog
Unregisters a dialog by its ID.
- **Syntax**: `/fancydialogs registry unregister <id>`
- **Permissions**: `fancydialogs.commands.fancydialogs.registry.unregister`
## Joined Players Cache
### Clear joined players cache
Clears the cache of players who have joined a dialog.
- **Syntax**: `/fancydialogs joined_players_cache clear`
- **Permissions**: `fancydialogs.commands.fancydialogs.joined_players_cache.clear`

View File

@@ -1,15 +0,0 @@
---
icon: dot
order: 9
---
![](../../static/commands.png)
# /QuickActions
## Open the quick actions dialog
Opens the quick actions dialog, which allows players to perform various actions quickly.
- **Syntax**: `/quickactions` or `/qa`
- **Permissions**: `fancydialogs.commands.quickactions`

View File

@@ -1,49 +0,0 @@
---
title: FancyDialogs
icon: browser
order: 90
---
#
![](../static/logos-and-banners/fancydialogs-banner.png)
!!!
Simple and lightweight dialogs plugin for Paper servers and other plugin developers.
!!!
## Features
With this plugin you can create fancy dialogs for your server or plugin.
FancyDialogs uses the new dialog feature, Minecraft introduced in **1.21.6** and combines it with the power of packets.
!!!warning
The plugin will only for **Paper** servers on **1.21.6** or newer!
!!!
**Core advantages of FancyDialogs:**
- Simple custom dialog creation (in JSON format or in code)
- A lot of different dialog components (text, buttons, input fields, etc.)
- Custom button actions (e.g. run commands, give items, open other dialogs)
- MiniMessages and PlaceholderAPI support
### For servers
If you use FancyDialogs as a plugin, you can take advantage of the following features:
- Dialog as welcome-screen for players joining the first time
- Custom tutorial dialogs
- FancyNpcs 'open_dialog' action for NPCs
### For plugin developers
If you are a plugin developer and want to spice up your plugin with dialogs, you can use FancyDialogs as a library.
You can define default dialogs, which will be persisted in the `plugins/FancyDialogs/data/dialogs` folder.
This allows server administrators to customize the dialogs for their server.
You can then use the dialogs in your plugin and show them to the players whenever you want.
Common use cases are:
- Help dialogs (e.g. for commands or features)
- Confirmation dialogs for critical actions
- Shop UIs (replacing inventories UIs)
- Dialogs for quests

View File

@@ -1,10 +0,0 @@
---
order: 6
icon: book
---
# FAQ
### Are older versions of Minecraft supported?
No, FancyDialogs only supports 1.21.6 or newer. FancyDialogs uses the new dialogs, which only exist in 1.21.6 and newer.

View File

@@ -1,30 +0,0 @@
---
order: 10
icon: info
---
# Getting started
!!!danger
Be aware, that only Paper and Folia is supported, but the plugin should work on any of its forks (like Purpur or Pufferfish). Spigot, Bukkit, Sponge and Fabric is not supported.
!!!
## Installation
To install FancyDialogs, you need to download the latest version from one of the following sources:
[!button size="s" icon="download" iconAlign="left" text="Modrinth" target="blank"](https://modrinth.com/plugin/fancydialogs/versions)
[!button size="s" icon="download" iconAlign="left" text="Hangar" target="blank"](https://hangar.papermc.io/Oliver/FancyDialogs/versions)
After downloading the plugin, you can install it by placing the downloaded file in the `plugins` folder of your server.
Restart your server and you are ready to go!
To check if the plugin is installed correctly, you can use the command `/fancydialogs version`. If the plugin is installed correctly, it will show you the version of the plugin.
## Create your first dialog
FancyDialogs come with some default dialogs, which you can use to get started. You can find them in the `plugins/FancyDialogs/data/dialogs` folder.
You can also create your own dialogs by creating a new file in this folder.
FancyDialogs uses a simple JSON format to define dialogs. Read the [JSON Schema](tutorials/json-schema.md) tutorial to learn more about the format.

View File

@@ -1,16 +0,0 @@
---
order: 8
icon: image
---
# Inspiration
The following examples show how to use FancyDialogs in different ways. They are meant to give you an idea of what you can do with the plugin.
Almost all examples are made by the community. If you have a nice example that you want to share, feel free come to our discord server and show it to us.
![Provided by oliver](../static/fancydialogs/examples/oliver-welcome_to_fd.png)
![Provided by oliver](../static/fancydialogs/examples/oliver-welcome.png)
![Provided by oliver](../static/fancydialogs/examples/oliver-quick_actions.png)

View File

@@ -1,131 +0,0 @@
---
icon: dot
order: 10
---
# JSON Schema
In this tutorial, we will explore the JSON schema used by FancyDialogs to define dialogs.
This schema provides a structured way to create fancy dialogs.
## Example Dialog
The easiest way to create a new dialog is to copy an existing dialog and modify it to suit your needs.
You can find some example dialogs in the `plugins/FancyDialogs/data/dialogs` folder on your server.
Below is an example of a simple dialog defined using the FancyDialogs JSON schema:
```json
{
"id": "my_dialog",
"title": "My Fancy Dialog",
"canCloseWithEscape": true,
"body": [
{ "text": "This is my first dialog created with FancyDialogs!" }
],
"inputs": {
"textFields": [
{
"key": "fav_color",
"order": 1,
"label": "<color:#ff7300>What is your favorite color?</color>",
"placeholder": "gold",
"maxLength": 50,
"maxLines": 1
}
]
},
"buttons": [
{
"label": "Show favorite color",
"tooltip": "Click to show your favorite color",
"actions": [
{
"name": "message",
"data": "Your favorite color is: <color:{fav_color}>{fav_color}</color>"
}
]
}
]
}
```
## Fields Explained
### Common Fields
`id`: The unique identifier for the dialog, which is used to reference the dialog in commands or other dialogs
`title`: The title of the dialog, which is displayed at the top of the dialog (supports MiniMessage & PlaceholderAPI)
`canCloseWithEscape`: Whether the dialog can be closed with the Escape key (default: true)
`body`: The body of the dialog - see [Body Section](#body-fields) for details
`inputs`: The inputs of the dialog - see [Input Section](#input-fields) for details
`buttons`: The buttons of the dialog - see [Button Section](#button-fields) for details
### Body fields
`text`: The text to display in the body of the dialog (supports MiniMessage & PlaceholderAPI)
!!!info
Items will be supported in the body section in a future release.
!!!
### Input fields
`textFields`: A list of text fields - see [Text Fields](#text-fields) for details
`selects`: A list of select fields - see [Select Fields](#select-fields) for details
!!!info
More input types will be added in future releases, such as checkboxes and number sliders.
!!!
#### Text Fields
`key`: The key to use to store the input value (can be used as a placeholder in actions)
`order`: The order of the text field in the dialog
`label`: The label to display above the text field (supports MiniMessage & PlaceholderAPI)
`placeholder`: The initial text to display in the text field
`maxLength`: The maximum length of the input
`maxLines`: The maximum number of lines for the input (greater than 1 will create a multiline text field)
#### Select Fields
`key`: The key to use to store the input value (can be used as a placeholder in actions)
`order`: The order of the select field in the dialog
`label`: The label to display above the select field (supports MiniMessage & PlaceholderAPI)
`options`: A list of options that can be selected by the player
- `value`: The value that will be returned when the player selects this option
- `display`: The text to display in the select field (supports MiniMessage & PlaceholderAPI)
- `initial`: Whether this option is selected by default (default: false)
### Button fields
- `label`: The text to display on the button (supports MiniMessage & PlaceholderAPI)
- `tooltip`: The tooltip to display when hovering over the button (supports MiniMessage & PlaceholderAPI)
- `actions`: A list of actions that will be executed when the button is clicked - see [Actions](#actions) for details
#### Actions
- `name`: The name of the action (see below for a list of available actions)
- `data`: The data for the action, which depends on the action type
Available actions include:
- `message`: Sends a message to the player (set `data` to the message)
- `console_command`: Executes a command as the console (set `data` to the command)
- `player_command`: Executes a command as the player (set `data` to the command)
- `open_dialog`: Opens another dialog (set `data` to the ID of the dialog to open)
- `open_random_dialog`: Opens another dialog (set `data` to a list of dialog IDs separated by commas: 'dialog1,dialog2,dialog3')
- `send_to_server`: Sends the player to another server (requires BungeeCord or Velocity) (set `data` to the server name)

View File

@@ -1,14 +0,0 @@
---
icon: dot
order: 7
---
# Open dialog npc action
!!!warning
This action is only available if [FancyDialogs](https://modrinth.com/plugin/fancydialogs) AND [FancyNpcs](https://modrinth.com/plugin/fancynpcs) is installed on the server.
!!!
FancyDialog adds a new action to the FancyNpcs action system, which allows you to open a dialog when interacting with an NPC.
To use this action, you need to add the open_dialog action to the npc: `/npc action (npc) ANY_CLICK add open_dialog (dialogId)`

View File

@@ -1,13 +0,0 @@
---
icon: dot
order: 8
---
# Quick actions
FancyDialogs doesn't support the quick-actions hotkey, but has a command to open a quick action dialog.
To open the quick actions dialog, use the command: `/qa` or `/quickactions`.
You can customize the quick actions dialog in the `plugins/FancyDialogs/data/dialogs/quick_actions.json` file.
If you want to disable the quick actions dialog, you can set the `disable-quick-actions-dialog` option to true in the `plugins/FancyDialogs/featureFlags.yml` file.

View File

@@ -1,2 +0,0 @@
order: 7
icon: mortar-board

View File

@@ -1,16 +0,0 @@
---
icon: dot
order: 9
---
# Welcome dialog
You can configure a dialog to be shown to players when they join the server for the first time.
A default welcome dialog is included with FancyDialogs, but you can customize it or create your own welcome dialog.
You can find the default welcome dialog in the `plugins/FancyDialogs/data/dialogs/welcome.json` file.
Feel free to edit this file to customize the welcome dialog to your liking.
If you want to use another dialog as the welcome dialog, you can change the id in the `plugins/FancyDialogs/config.yml` file by changing the `welcome_dialog_id` option to the ID of your desired dialog.
To completely disable the welcome dialog, you can set the `disable-welcome-dialog` to true in the `plugins/FancyDialogs/featureFlags.yml` file.

View File

@@ -1,2 +0,0 @@
icon: code
order: 6

View File

@@ -1,134 +0,0 @@
---
icon: dot
---
# Getting started
## Include the API in your project
To include the FancyHolograms API in your project, you need to add the following dependency to your `build.gradle.kts` or `pom.xml` file.
**Gradle:**
```kotlin
repositories {
maven("https://repo.fancyinnovations.com/releases")
}
```
```kotlin
dependencies {
compileOnly("de.oliver:FancyHolograms:VERSION")
}
```
**Maven:**
```xml
<repository>
<id>fancyinnovations-releases</id>
<name>FancyInnovations Repository</name>
<url>https://repo.fancyinnovations.com/releases</url>
</repository>
```
```xml
<dependency>
<groupId>de.oliver</groupId>
<artifactId>FancyHolograms</artifactId>
<version>VERSION</version>
<scope>provided</scope>
</dependency>
```
Replace `VERSION` with the version of the API you want to use. You can find the latest version on the download pages or in the GitHub releases.
## Create a new hologram
### 1. Create the hologram data
The TextHologramData class is used to store all the information about aa hologram. You can create a new instance of TextHologramData by providing a name, and the location where the hologram should be spawned.
```java
TextHologramData hologramData = new TextHologramData("hologram_name", location);
// Adjust the Hologram Data
hologramData.setBackground(TextColor.color(100, 255, 79));
hologramData.setBillboard(Display.Billboard.FIXED);
```
!!!
You can also use ItemHologramData or ItemHologramData to create a holograms with other types.
!!!
### 2. Create the hologram
You can use the TextHologramData object to create a new hologram. Because the implementation of the hologram different for every Minecraft version, FancyHolograms provides a factory to create the hologram.
```java
HologramManager manager = FancyHologramsPlugin.get().getHologramManager();
Hologram hologram = manager.create(data);
```
### 3. Register the hologram
To let FancyHolograms handle the hologram, you need to register it. FancyHolograms will take care of spawning, despawning, saving the hologram, and more.
```java
HologramManager manager = FancyHologramsPlugin.get().getHologramManager();
manager.addHologram(hologram);
```
!!!
If you don't want to persist the hologram, you can do the following: `hologram.setPersistent(false);`
!!!
## Modify an existing hologram
### 1. Get the hologram by name
You can get the hologram by its name. The name is unique and can be used to identify the hologram.
```java
HologramManager manager = FancyHologramsPlugin.get().getHologramManager();
Hologram hologram = manager.getHologram("hologram_name").orElse(null);
if (hologram == null) {
// hologram not found
return;
}
```
### 2. Modify the data
You can modify the hologram data object to change the holograms's properties.
```java
HologramData hologramData = hologram.getData();
hologramData.setBillboard(Display.Billboard.CENTER);
if (hologramData instanceof TextHologramData textData) {
textData.setTextAlignment(TextDisplay.TextAlignment.LEFT);
}
```
### 3. Update the hologram
After modifying the hologram data, you need to update the hologram. This will apply the changes to the hologram.
```java
hologram.forceUpdate();
hologram.queueUpdate();
```
## Remove a hologram
To remove a hologram, you can use the `removeHologram` method of the `HologramManager`. This will remove the hologram and unregister it.
```java
HologramManager manager = FancyHologramsPlugin.get().getHologramManager();
manager.removeHologram("hologram_name");
```
## JavaDocs and help
You can find the JavaDocs for the FancyHolograms API [here](https://repo.fancyinnovations.com/javadoc/releases/de/oliver/FancyHolograms/latest).
Join the [FancyInnovations Discord](https://discord.gg/ZUgYCEJUEx) for help and support. There is a dedicated channel for help about the api (`#holograms-api`).

View File

@@ -1,2 +0,0 @@
icon: log
order: 5

View File

@@ -1,74 +0,0 @@
---
icon: dot
order: 1
---
![](../../static/changelog_v1_x_x.png)
#
## v1.1.1 [!badge variant="info" text="2023-06-13"]
- Added support for 1.20.1
- This version of the plugin supports both 1.20 and 1.20.1
## v1.1.0 [!badge variant="info" text="2023-06-12"]
- Updated to 1.20
## v1.0.7 [!badge variant="info" text="2023-05-22"]
- Added insertBefore and insertAfter
- Added FancyHolograms command
- Fixed some bugs
- Compatible with FancyNpcs 1.1.5 for linking with an NPC
## v1.0.6 [!badge variant="info" text="2023-05-03"]
- Added support for MiniPlaceholders (#5)
- Added visibilityDistance in config
- Added /hologram list command
- Added /hologram teleport <hologram> command
- Bug fixes and typos
## v1.0.5 [!badge variant="info" text="2023-04-10"]
- Add copy hologram feature (/hologram copy <hologram> <new name>)
- Add edit shadow features (/hologram edit <hologram> (shadowRadius | shadowStrength) <value>)
- Added api stuff (spawn, remove and modify events)
- Add link with npc feature (/hologram edit <hologram> linkWithNpc <npc name>)
## v1.0.4 [!badge variant="info" text="2023-04-03"]
- Fixed saving holograms
- Only refresh holograms to players that are in the same world
- Folia support (FancyHolograms-1.0.4-folia.jar)
**Folia support:**
Please make backups when using this plugin with Folia. There might accure bugs.
In the future there will be two jar files, one for Paper and one for Folia. You can not use the Folia version on a Paper server.
## v1.0.3 [!badge variant="info" text="2023-03-28"]
- Add 'updateTextInterval' subcommand (set to 0 to disable)
- Fixed deleting holograms
- Increased default line width
## v1.0.2 [!badge variant="info" text="2023-03-26"]
- Added 'transparent' background
- Added 'reset' background (default)
- Bug fixes
## v1.0.1 [!badge variant="info" text="2023-03-20"]
- Fixed that holograms are not being saved
- Added the 'moveTo' subcommand
- Add the 'help' subcommand
- Added PlaceholderAPI support
- Fixed some bugs
## v1.0.0 [!badge variant="info" text="2023-03-18"]
This is the first version. There might accure bugs, please report them.

View File

@@ -1,295 +0,0 @@
---
icon: dot
order: 2
---
![](../../static/changelog_v2_x_x.png)
#
## v2.8.0 [!badge variant="info" text="2025-10-10"]
- Added support for 1.21.9 and 1.21.10
- Added support for MiniPlaceholders v3
- Improved performance by running more tasks asynchronously
- Improved logging
- Added HologramManager#isLoaded method
- Regular dev builds are now published to the BETA channel
## v2.7.0 [!badge variant="info" text="2025-07-18"]
- Added support for 1.21.7 and 1.21.8
- Fixed comments not being for new feature flags
- Improved http handling in FancyAnalytics
## v2.6.0 [!badge variant="info" text="2025-06-26"]
- Added support for 1.21.6
## v2.5.0 [!badge variant="info" text="2025-04-24"]
- Added support for Minecraft 1.21.5
- Refactored config structure
- Added `update_visibility_interval` config option
## v2.4.2 [!badge variant="info" text="2025-01-16"]
- Added the first converter to convert holograms from DecentHolograms to FancyHolograms (/fancyholograms convert DecentHolograms *)
- Added translate command
- Improved scheduler stability and fixed a memory leak
- Fixed exception thrown when sending resource-packs in the config stage
**API changes:**
- You can now send the hologram events sync and async -> you can spawn and hide holograms synchronically now
- Added HologramsConverted event
## v2.4.1 [!badge variant="info" text="2024-12-08"]
- Added support for 1.21.4
- Added brightness command
- Added per command permissions
- Scale hologram, when linked npc is scaled
**API changes:**
- Hologram#getDisplayEntity is now deprecated and will be removed next version
- Added experimental getter & setter for interpolation duration
## v2.4.0 [!badge variant="info" text="2024-11-02"]
- Added support for 1.21.2 and 1.21.3
- Fixed holograms.yml file resets sometimes
- Improved logging
## v2.3.3 [!badge variant="info" text="2024-08-19"]
- fix exceptions thrown from PlayerResourcePackStatusEvent listener on < 1.20.2 by @Grabsky in #138
## v2.3.2 [!badge variant="info" text="2024-08-14"]
- Added support for 1.21.1
## v2.3.1 [!badge variant="info" text="2024-08-03"]
- Added center command
- Added nearby command
- Load holograms dynamically based on world loading
- Added missing dependencies to paper-plugin.yml
- Add world name to hologram list
- Added manual visbility (api)
- Refresh holograms once resource-pacls are loaded
- Many more fixes & performance upgrades
## v2.3.0 [!badge variant="info" text="2024-06-19"]
- Added support for 1.21
- Maintain rotation when using moveHere subcommand
## v2.2.0 [!badge variant="info" text="2024-06-07"]
- Major performance improvements
- Added persistent flag
- Fixed holograms not disappearing when removing
- API changes
**Pull requests:**
- Major Code Rewrite by @OakLoaf in #94
- Persistent, Inpersistent(temporary) holograms by @UsainSrht in #96
- Bukkit Color by @UsainSrht in #95
- Added new property Viewer for hologram. #99 by @BigTows in #100
- readme changes by @Grabsky in #103
## v2.1.0 [!badge variant="info" text="2024-05-21"]
- Added support for 1.20.5 and 1.20.6
- Certain commands can now be run via console
- Included sources and javadoc to API module
- Added support for "see through" (text holograms only)
- Added 3-axis support for scale command
- The copy subcommand now maintains yaw and pitch
**Pull requests:**
- Add support for see through Text Holograms by @OakLoaf in #85
- Add support for 1.20.5 by @OliverSchlueter in #83
- 3-axis support for scale sub-command by @Grabsky in #86
- Updated paperweight to 1.7.1 by @OakLoaf in #91
- Made onEnable respect muted version notifications by @OakLoaf in #89
- Fixed duplicate files in jar by @OakLoaf in #92
- Made copy command maintain rotation by @OakLoaf in #90
## v2.0.6 [!badge variant="info" text="2024-03-03"]
- Fixed remove subcommand
- Run version checks async
- Fixed a bug with visibility range
- Add permission to hide holograms
- Don't allow dots in name
## v2.0.5 [!badge variant="info" text="2024-01-27"]
- Added 'save_on_changed' config option: holograms will be saved after modifying it
- Improved shown state for players
- Showing and hiding is now done completely async
- Other performance improvements
- Fixed default visibility distance
- Fixed yaw in moveTo command
## v2.0.4 [!badge variant="info" text="2023-12-12"]
- Added support for 1.20.4 🎉
- Added info command
- Added support for legacy colors (&c &4 &n etc.)
## v2.0.3 [!badge variant="info" text="2023-11-17"]
**Item & Block Holograms**
I'm happy to introduce item and block holograms in FancyHolograms 2.0.3 - one most requested feature since the first version.
Until now you could only create text holograms with FancyHolograms, but starting with v2.0.3 you are also able to create holograms with a different type.
How to create item & block holograms?
The create commands has changed a little bit: /hologram create (text|block|item) (hologram name)
Each hologram and only be of one type: text, block or item. You can not have items inside a text hologram (but you can create two holograms and move the item hologram over the text hologram).
How to modify item and block holograms?
There are two new commands:
/hologram edit (hologram) item
(execute this command while holding an item of your choice in your main hand.)
/hologram edit (hologram) block (block type)
Billboard, scale, rotation etc.
You are able to change the billboard, scale, position, shadow and rotaion of all hologram types (text, item and block)
How to migrate from a older version of FancyHolograms?
1. stop the server
2. take a backup of your server and FancyHolograms folder
3. replace the old FancyHolograms jar with the new one
4. start the server
5. done!
I hope you will enjoy the new big feature! I can't wait to see what you are going to do with the new hologram types.
## v2.0.2 [!badge variant="info" text="2023-10-19"]
- Added rotatepitch subcommand
- Added moveHere subcommand
- Added pagination for /hologram list
- Added per-hologram visibility distance
- Fixed issues with 1.19.4
- Fixed linking with npc
- Fixed some scale issues
- Fixed a tab completion bug
- ADDED SUPPORT FOR 1.20.2
## v2.0.1 [!badge variant="info" text="2023-08-21"]
- Fixed deleted holograms not being removed from config
- Added "/fholo" as alias for "/hologram"
- Sort holograms by name in config
- Many bug fixes ...
## v2.0.0 [!badge variant="info" text="2023-06-30"]
**Version Implementations**
FancyHolograms is now compatible with multiple versions in one jar!
Currently the following versions are supported:
- `1.19.4`
- `1.20`
- `1.20.1`
**Enhancements**
- Text alignment command
- You can now change how the text should be aligned (left, center, right)
- Full Documentation
- All exposed classes are now fully documented.
- Data Decoupling
- All data for the hologram is now decoupled from the hologram and its implementations
- Data can be updated without directly modifying the hologram entity
- Simplified Modification Process
- Data modifications on the hologram now happen in steps
- update hologram data
- update hologram
- push changes to players
- Enhanced Eventing
- The hologram update event now exposes both old and new data
- Hologram events
- `HologramCreateEvent` -> `HologramCreateEvent`
- `HologramRemoveEvent` -> `HologramDeleteEvent`
- `HologramModifyEvent` -> `HologramUpdateEvent`
- `HologramSpawnEvent` -> `HologramShowEvent`
- +`HologramHideEvent`
- Hologram Data
- Background Color
- Now accepts hex color codes
- Now accepts `reset` or `default` to return to the original background color
- Text Update Interval
- Now accepts `never` or `off` or `none` to disable updating
- Now accepts second and minute units, ex. `10s` instead of `200`
- Hologram Position
- Now accepts relative coordinates
- Can be relative to the hologram's current location using `~`
- Can be relative to the player's current location using `~~`
- Command Completions
- Intelligently suggests only relevant options
There might accure errors while updating from a previous version and you might have to remake all holograms.
If you found any bug, please report them (create an issue or go to the discord server).
Thank you Sxtanna for putting so much effort into this!
## v2.0.0-pre1 [!badge variant="info" text="2023-06-01"] [!badge variant="warning" text="Pre release"]
**Version Implementations**
- `1.19.4`
- `1.20` & `1.20.1`
**Enhancements**
- Full Documentation
- All exposed classes are now fully documented.
- Data Decoupling
- All data for the hologram is now decoupled from the hologram and its implementations
- Data can be updated without directly modifying the hologram entity
- Simplified Modification Process
- Data modifications on the hologram now happen in steps
- update hologram data
- update hologram
- push changes to players
- Enhanced Eventing
- The hologram update event now exposes both old and new data
- Hologram events
- `HologramCreateEvent` -> `HologramCreateEvent`
- `HologramRemoveEvent` -> `HologramDeleteEvent`
- `HologramModifyEvent` -> `HologramUpdateEvent`
- `HologramSpawnEvent` -> `HologramShowEvent`
- +`HologramHideEvent`
- Hologram Data
- Background Color
- Now accepts hex color codes
- Now accepts `reset` or `default` to return to the original background color
- Text Update Interval
- Now accepts `never` or `off` or `none` to disable updating
- Now accepts second and minute units, ex. `10s` instead of `200`
- Hologram Position
- Now accepts relative coordinates
- Can be relative to the hologram's current location using `~`
- Can be relative to the player's current location using `~~`
- Command Completions
- Intelligently suggests only relevant options
If you found any bug, please report them (create an issue or go to the discord server).
Thank you Sxtanna for putting so much effort into this!

View File

@@ -1,2 +0,0 @@
order: 9
icon: command-palette

View File

@@ -1,37 +0,0 @@
---
icon: dot
order: 9
---
![](../../static/commands.png)
# /FancyHolograms
### Version
Shows the current version of the plugin. It also shows possible updates.
- **Syntax**: `/fancyholograms version`
- **Permissions**: `fancyholograms.admin`
### Save
Saves all holograms to the file system.
- **Syntax**: `/fancyholograms save`
- **Permissions**: `fancyholograms.admin`
### Reload
Reloads the configuration and also loads all holograms from the file system.
- **Syntax**: `/fancyholograms reload`
- **Permissions**: `fancyholograms.admin`
### Convert
Converts holograms from other hologram-plugins to FancyHolograms' holograms
- **Syntax**: `/fancyholograms convert DecentHolograms <* | name of hologram> [--processIcons]`
- `--processIcons`: If set, the converter will also convert icons into separate holograms
- **Permissions**: `fancyholograms.admin`

View File

@@ -1,225 +0,0 @@
---
icon: dot
order: 10
---
![](../../static/commands.png)
# /Hologram
## Manage holograms
### help
Description: Shows a list of all subcommands<br/>
Syntax: ``/Hologram help``<br/>
Permission: ``FancyHolograms.admin``
### list
Description: Shows a list of all holograms<br/>
Syntax: ``/Hologram list``<br/>
Permission: ``FancyHolograms.admin``
### nearby
Description: Shows all holograms nearby you in a range<br/>
Syntax: ``/Hologram nearby <range>``<br/>
Permission: ``FancyHolograms.admin``
### create
Description: Creates a new hologram at your location<br/>
Syntax: ``/Hologram create (type) (name)``<br/>
Permission: ``FancyHolograms.admin``
### remove
Description: Removes a certain hologram<br/>
Syntax: ``/Hologram remove (hologram)``<br/>
Permission: ``FancyHolograms.admin``
### copy
Description: Creates a copy of a hologram<br/>
Syntax: ``/Hologram copy (hologram) (new name)``<br/>
Permission: ``FancyHolograms.admin``
### info
Description: Shows you all information about the hologram<br/>
Syntax: ``/Hologram info (hologram)``<br/>
Permission: ``FancyHolograms.admin``
## General hologram modification
These commands can be run for any hologram type (text, item and block).
### moveHere
Description: Teleports the hologram to you<br/>
Syntax: ``/Hologram edit (hologram) moveHere``<br/>
Alias: ``/Hologram edit (hologram) position``<br/>
Permission: ``FancyHolograms.admin``
### moveTo
Description: Teleports the hologram to the location<br/>
Syntax: ``/Hologram edit (hologram) moveTo (x) (y) (z) [yaw] [pitch]``<br/>
Permission: ``FancyHolograms.admin``
### rotate
Description: Rotates the hologram around the y-axis<br/>
Syntax: ``/Hologram edit (hologram) rotate (degrees)``<br/>
Permission: ``FancyHolograms.admin``
### rotatepitch
Description: Rotates the hologram around the x-axis<br/>
Syntax: ``/Hologram edit (hologram) rotatepitch (degrees)``<br/>
Permission: ``FancyHolograms.admin``
### translate
Description: Translates the hologram by a certain amount in the x, y and z direction<br/>
Syntax: ``/Hologram edit (hologram) rotatepitch (x) (y) (z)``<br/>
Permission: ``FancyHolograms.admin``
### visibilityDistance
Description: Sets from how far away players can see the hologram (-1 for default distance)<br/>
Syntax: ``/Hologram edit (hologram) visibilityDistance (distance)``<br/>
Permission: ``FancyHolograms.admin``
### visibility
Description: Sets how the visibility should be controlled<br/>
Syntax: ``/Hologram edit (hologram) visibility (ALL | MANUAL | PERMISSION_NEEDED)``<br/>
Permission: ``FancyHolograms.admin``<br/>
Permission to view a hologram: ``FancyHolograms.viewhologram.<name>``
### scale
Description: Sets the scale (can be floats)<br/>
Syntax: ``/Hologram edit (hologram) scale (factor)``<br/>
Permission: ``FancyHolograms.admin``
### billboard
Description: Sets the billboard<br/>
Syntax: ``/Hologram edit (hologram) billboard (center | fixed | vertical | horizontal)``<br/>
Permission: ``FancyHolograms.admin``
### shadowStrength
Description: Sets the shadow strength<br/>
Syntax: ``/Hologram edit (hologram) shadowStrength (strength)``<br/>
Permission: ``FancyHolograms.admin``
### shadowRadius
Description: Sets the shadow radius<br/>
Syntax: ``/Hologram edit (hologram) shadowRadius (radius)``<br/>
Permission: ``FancyHolograms.admin``
### linkWithNpc
Description: Links a hologram with an NPC (requires FancyNpcs)<br/>
Syntax: ``/Hologram edit (hologram) linkWithNpc (npc)``<br/>
Permission: ``FancyHolograms.admin``
### unlinkWithNpc
Description: Unlinks the hologram from the NPC<br/>
Syntax: ``/Hologram edit (hologram) unlinkWithNpc``<br/>
Permission: ``FancyHolograms.admin``
## Text hologram modification
These commands can be run for all **text** holograms.
### setLine
Description: Sets the content of the line<br/>
Syntax: ``/Hologram edit (hologram) setLine (line) (text...)``<br/>
Permission: ``FancyHolograms.admin``
### addLine
Description: Adds a line at the bottom<br/>
Syntax: ``/Hologram edit (hologram) addLine (text...)``<br/>
Permission: ``FancyHolograms.admin``
### removeLine
Description: Removes a line<br/>
Syntax: ``/Hologram edit (hologram) removeLine (line)``<br/>
Permission: ``FancyHolograms.admin``
### insertBefore
Description: Adds a line after another<br/>
Syntax: ``/Hologram edit (hologram) insertBefore (line) (text...)``<br/>
Permission: ``FancyHolograms.admin``
### insertAfter
Description: Adds a line before another<br/>
Syntax: ``/Hologram edit (hologram) insertAfter (line) (text...)``<br/>
Permission: ``FancyHolograms.admin``
### updateTextInterval
Description: Sets the interval for refreshing the text (useful for
placeholders)<br/>
Syntax: ``/Hologram edit (hologram) updateTextInterval (ticks | seconds | minutes)``<br/>
Example ticks:``/Hologram edit (hologram) updateTextInterval 15``<br/>
Example seconds:``/Hologram edit (hologram) updateTextInterval 5s``<br/>
Example minutes:``/Hologram edit (hologram) updateTextInterval 5m``<br/>
Permission: ``FancyHolograms.admin``
### background
Description: Sets the background color<br/>
Syntax: ``/Hologram edit (hologram) background (color)``<br/>
Permission: ``FancyHolograms.admin``
### textShadow
Description: Enables/disables the text shadow<br/>
Syntax: ``/Hologram edit (hologram) textShadow (true|false)``<br/>
Permission: ``FancyHolograms.admin``
### brightness
Description: Changes the brightness of the hologram<br/>
Syntax: ``/hologram edit <hologram> brightness (block | sky) (0-15)``<br/>
Permission: ``FancyHolograms.admin``
### textAlignment
Description: Sets the alignment of the text<br/>
Syntax: ``/Hologram edit (hologram) textAlignment (center | left | right)``<br/>
Permission: ``FancyHolograms.admin``
## Item hologram modification
These commands can be run for all **item** holograms.
### item
Description: Sets the hologram item you are holding in your main hand<br/>
Syntax: ``/Hologram edit (hologram) item``<br/>
Permission: ``FancyHolograms.admin``
## Block hologram modification
These commands can be run for all **block** holograms.
### block
Description: Sets the hologram block<br/>
Syntax: ``/Hologram edit (hologram) block (block type)``<br/>
Permission: ``FancyHolograms.admin``

View File

@@ -1,55 +0,0 @@
---
title: FancyHolograms
icon: image
expanded: true
order: 100
---
#
![](../static/logos-and-banners/fancyholograms-banner.png)
!!!
Simple, lightweight and feature-rich hologram plugin for Paper and Folia servers using packets.
!!!
## Features
With this plugin you can create fancy looking holograms with ease. You can customize properties like:
- **Type** (Text, Block, Item)
- **Text** (Multiple lines)
- **Position, Rotation and Scale**
- **Billboard** (Fixed, Center ...)
- **MiniMessage formatting**
- **Placeholders** (PlaceholderAPI, MiniPlaceholders)
- **FancyNpcs Integration** (hologram as display name)
- ... and much more!
## Principles
### Simple
The plugin is designed to be easy to use and understand. The commands are well-structured and the tab completion is incredibly helpful.
You can do everything in-game without the need of touching the configuration files.
All commands and features are documented in this wiki. If you have any questions, feel free to ask in the Discord server, we are happy to help you.
### Lightweight
The plugin is optimized for performance. It uses packets to send the hologram data to the clients, which is the most efficient way to do it.
The server does not have to do any additional work, which means that the plugin has a minimal impact on the server performance.
FancyHolograms does not require ANY dependencies other than Paper.
### Feature-rich
The plugin has a lot of features to offer. You can customize the holograms in many ways and create unique holograms for your server.
We are constantly working on new innovative features and improvements. If you have any suggestions, feel free to share them with us.
## Download
You can download the latest version of FancyHolograms from the following platforms:
[!button size="s" icon="download" iconAlign="left" text="Download from Modrinth" target="blank"](https://modrinth.com/plugin/fancyholograms/versions)
[!button size="s" icon="download" iconAlign="left" text="Download from Hangar" target="blank"](https://hangar.papermc.io/Oliver/FancyHolograms/versions)
How to get started with FancyHolograms? Check out [this page](getting-started.md).

View File

@@ -1,34 +0,0 @@
---
order: 6
icon: book
---
# FAQ
### How to modify each line in a hologram?
Per-line settings (such as scale or background) are not supported in FancyHolograms due to a limitation with display entities.
A separate hologram will need to be created for each line.
### How to add a blank line?
To add a blank line in a hologram, use `<reset>` on a new line.
### How to make holograms clickable?
Holograms currently aren't clickable themselves, but [here's](tutorials/clickable-holograms.md) a workaround
### How to make the hologram not to rotate?
To make a hologram not rotate, the billboarding must be set to FIXED.
Example: `/holo edit <hologram> billboard FIXED`
Once complete, you must set the hologram's rotation with the rotate and rotatepitch commands.
### How to edit the holograms via the data file?
1. Run /fancyholograms save
2. Back up the holograms.yml file in case something goes wrong
3. Edit your holograms.yml file as desired
4. Run /fancyholograms reload after saving the file

View File

@@ -1,35 +0,0 @@
---
order: 10
icon: info
---
# Getting started
!!!danger
Be aware, that only Paper and Folia is supported, but the plugin should work on any of its forks (like Purpur or Pufferfish). Spigot, Bukkit, Sponge and Fabric is not supported.
!!!
## Installation
To install FancyHolograms, you need to download the latest version from one of the following sources:
[!button size="s" icon="download" iconAlign="left" text="Modrinth" target="blank"](https://modrinth.com/plugin/fancyholograms/versions)
[!button size="s" icon="download" iconAlign="left" text="Hangar" target="blank"](https://hangar.papermc.io/Oliver/FancyHolograms/versions)
After downloading the plugin, you can install it by placing the downloaded file in the `plugins` folder of your server.
Restart your server and you are ready to go!
To check if the plugin is installed correctly, you can use the command `/fancyholograms version`. If the plugin is installed correctly, it will show you the version of the plugin.
## Create your first hologram
1. To create your first hologram, you can use the command `/hologram create text myHologram`. This will create a new text hologram with the given name.
2. To add text to the hologram, you can use the command `/hologram edit myHologram addLine <green>My first hologram</green>`. This will add a new line to the hologram with the given text.
3. To edit the text of the hologram, you can use the command `/hologram edit myHologram setLine 1 <red>My first hologram</red>`. This will set the text of the first line to the given text.
4. To change the background of the hologram, you can use the command `/hologram edit myHologram background RED`. This will set the background of the hologram to red.
5. To move the hologram to your current location, you can use the command `/hologram moveHere myHologram`. This will move the hologram to your current location.
!!!
You can use MiniMessages in the hologram text. For more information about MiniMessages, you can visit the [MiniMessage documentation](https://docs.advntr.dev/minimessage/format.html).
!!!

View File

@@ -1,57 +0,0 @@
---
order: 8
icon: image
---
# Inspiration
The following examples show how to use FancyNpcs in different ways. They are meant to give you an idea of what you can do with the plugin.
Almost all examples are made by the community. If you have a nice example that you want to share, feel free come to our discord server and show it to us.
## Examples
![Provided by play.freshsmp.fun](../static/fancyholograms/examples/freshsmp-1.png)
![Provided by play.freshsmp.fun](../static/fancyholograms/examples/freshsmp-2.png)
![Provided by play.freshsmp.fun](../static/fancyholograms/examples/freshsmp-3.png)
![Provided by play.freshsmp.fun](../static/fancyholograms/examples/freshsmp-4.png)
![Provided by play.freshsmp.fun](../static/fancyholograms/examples/freshsmp-5.png)
![Provided by play.silverstonemc.net](../static/fancyholograms/examples/silverstone-1.png)
![Provided by play.silverstonemc.net](../static/fancyholograms/examples/silverstone-2.png)
![Provided by https://github.com/OliverSchlueter](../static/fancyholograms/examples/oliver-1.jpeg)
![Provided by https://github.com/OliverSchlueter](../static/fancyholograms/examples/oliver-2.jpeg)
![Provided by https://github.com/OliverSchlueter](../static/fancyholograms/examples/oliver-3.jpeg)
![Provided by https://github.com/OliverSchlueter](../static/fancyholograms/examples/oliver-4.jpeg)
![Provided by https://github.com/OliverSchlueter](../static/fancyholograms/examples/oliver-5.jpeg)
## API examples
<video autoplay controls loop>
<source src="/static/fancyholograms/examples/faceland-1.mp4" type="video/mp4">
</video>
Provided by play.face.land
---
<video autoplay controls loop>
<source src="/static/fancyholograms/examples/faceland-2.mp4" type="video/mp4">
</video>
Provided by play.face.land
---
<video autoplay controls loop>
<source src="/static/fancyholograms/examples/faceland-3.mp4" type="video/mp4">
</video>
Provided by play.face.land

View File

@@ -1,15 +0,0 @@
---
icon: dot
---
# Clickable holograms
Interactions with holograms is not a feature of FancyHolograms yet, but there is a workaround for this.
1. Create your hologram with the text you want.
2. Install [FancyNpcs](../../fancynpcs/getting-started.md)
3. Create a new npc and set the type to "INTERACTION" (`/npc type (npc name) INTERACTION`)
4. Remove the name tag of the npc (`/npc displayname (npc name) <empty>`)
5. Position the npc to the same location as the hologram (press F3+B to see the hitbox)
6. Modify the size of the hitbox to fit the hologram (`/npc attributes (npc name) set (width/height) (size)`)
7. Add an interaction action to the npc ([action system](../../fancynpcs/tutorials/action-system.md))

View File

@@ -1,2 +0,0 @@
order: 7
icon: mortar-board

View File

@@ -0,0 +1,6 @@
---
redirect: getting-started.md
icon: code
order: 6
---
# API usage

View File

@@ -1,2 +0,0 @@
icon: code
order: 6

View File

@@ -1,7 +1,3 @@
---
icon: dot
---
# Getting started
## Include the API in your project
@@ -11,7 +7,7 @@ To include the FancyNPCs API in your project, you need to add the following depe
**Gradle:**
```kotlin
repositories {
maven("https://repo.fancyinnovations.com/releases")
maven("https://repo.fancyplugins.de/releases")
}
```
@@ -24,9 +20,9 @@ dependencies {
**Maven:**
```xml
<repository>
<id>fancyinnovations-releases</id>
<name>FancyInnovations Repository</name>
<url>https://repo.fancyinnovations.com/releases</url>
<id>fancyplugins-releases</id>
<name>FancyPlugins Repository</name>
<url>https://repo.fancyplugins.de/releases</url>
</repository>
```
@@ -69,7 +65,7 @@ To let FancyNpcs handle the NPC, you need to register it. FancyNpcs will take ca
FancyNpcsPlugin.get().getNpcManager().registerNpc(npc);
```
!!!warning
!!! warning
Do not register npcs in the first few seconds after the server has started. You need to wait at least 10 seconds before registering npcs. Otherwise, the npcs will not get registered correctly.
You can also listen to the `NpcsLoadedEvent` to know when you can register npcs.
!!!
@@ -134,7 +130,7 @@ npc.removeForAll();
## JavaDocs and help
You can find the JavaDocs for the FancyNpcs API [here](https://repo.fancyinnovations.com/javadoc/releases/de/oliver/FancyNpcs/latest).
You can find the JavaDocs for the FancyNpcs API [here](https://repo.fancyplugins.de/javadoc/releases/de/oliver/FancyNpcs/latest).
Join the [FancyInnovations Discord](https://discord.gg/ZUgYCEJUEx) for help and support. There is a dedicated channel for help about the api (`#npcs-api`).
Join the [FancyPlugins Discord](https://discord.gg/ZUgYCEJUEx) for help and support. There is a dedicated channel for help about the api (`#npcs-dev`).
```

View File

@@ -0,0 +1,5 @@
---
icon: log
order: 5
redirect: v2
---

View File

@@ -1,2 +0,0 @@
icon: log
order: 5

View File

@@ -1,5 +1,4 @@
---
icon: dot
order: 1
---

View File

@@ -1,71 +1,10 @@
---
icon: dot
order: 2
---
![](../../static/changelog_v2_x_x.png)
#
## v2.8.0 [!badge variant="info" text="2025-10-10"]
- Added support for 1.21.9 and 1.21.10
- Added support for MiniPlaceholders v3
- Added permissions for each action type
- Improved logging
- Fixed various bugs for the player-npcs fflag
- Added an optional flag to disable arm swinging in Npc#update
- Added NpcManager#isLoaded method
- Regular dev builds are now published to the BETA channel
## v2.7.1 [!badge variant="info" text="2025-08-07"]
- Fixed placeholder skins not refreshing
- Send a warning message when using the `player_command_as_op` action
- Fixed translation for the `turn_to_player` action
- Fixed camel pose attribute for 1.21.6 - 1.21.8
## v2.7.0 [!badge variant="info" text="2025-07-18"]
- Added support for 1.21.7 & 1.21.8
- Added `harness` attribute for happy ghasts
- Fixed comments not being for new feature flags
- Fixed status code check of Mojang API
- Improved http handling in FancyAnalytics
## v2.6.0 [!badge variant="info" text="2025-06-26"]
- Added support for 1.21.6
- Added UUID caching to improve performance
- More fixes to the skin system
## v2.5.2 [!badge variant="info" text="2025-06-13"]
- Fixed skins set to username or uuid not working sometimes (403 http status code)
- Npcs should now spawn instantly when a player teleports
- Added support for [text shadow color](https://docs.advntr.dev/minimessage/format.html#shadow-color) (updated
ChatColorHandler)
- Changed npc update interval (the config option) to seconds
- Added sniffer state attribute
- Fixed NPE in SkinManager
- Fixed issue with the copy command
- Fixed exception with the npc update method when using 1.20
- Fixed NpcsLoadedEvent not being called when no npcs exist
## v2.5.1 [!badge variant="info" text="2025-05-31"] [!badge variant="danger" text="Hotfix"]
- Fixed some attributes kicking players from the server (only in 1.21.5)
- Fixed NPE related to the skin system
## v2.5.0 [!badge variant="info" text="2025-04-24"]
- Added support for Minecraft 1.21.5
- Added `turn_to_player_distance` command
- Added `center` command
- Added `variant` attribute for pig, cow and chicken
- Added `collar_color` attribute for wolves and cats
- Fixed wolf variant attribute
- Many fixes and improvements for the skin system
#
## v2.4.4 [!badge variant="info" text="2025-03-11"] [!badge variant="danger" text="Hotfix"]
@@ -76,7 +15,6 @@ order: 2
## v2.4.3 [!badge variant="info" text="2025-03-11"]
**New skin system**
- You can now use local image files as skin
- Skins set by URL or file can be made slim
- The skin cache system is improved
@@ -84,24 +22,17 @@ order: 2
- Skins should load more reliably
- You can set a MineSkin API key to speed up loading skins
When starting the server for the first time, it might take some time (depending on how many npcs with skins you have) to
load all skins.
When starting the server for the first time, it might take some time (depending on how many npcs with skins you have) to load all skins.
The API for setting skins also changed. Forget the SkinFetcher, now you only need to do the following:
```java
npc.getData().
setSkin("username / uuid / url / filename");
npc.getData().setSkin("username / uuid / url / filename");
```
The old SkinFetcher API won't work in this version.
**Other changes**
- Added configurable missing permissions message for the `need_permission` action
- Added feature flag to use native threads instead of virtual threads (enable it when you have problems with virtual
threads)
- Added feature flag to use native threads instead of virtual threads (enable it when you have problems with virtual threads)
## v2.4.2 [!badge variant="info" text="2025-01-29"]
@@ -111,28 +42,22 @@ The old SkinFetcher API won't work in this version.
- Added configurable npc update visibility interval
- Fixed skins via URL not working
- Fixed clearing npc equipment via command
- Fixed display name not always visible when npc type is not player (you needed to look at the entity - now it's always
visible)
- Fixed display name not always visible when npc type is not player (you needed to look at the entity - now it's always visible)
- Fixed the `register_commands` not working
**API changes**
- Added NpcLoadedEvent (fired when all NPCs are loaded)
## v2.4.1 [!badge variant="info" text="2024-12-08"]
- Added support for 1.21.4
- Added "need_permission" action - if added the player needs a specific permission, otherwise the action-chain will be
terminated
- Added "need_permission" action - if added the player needs a specific permission, otherwise the action-chain will be terminated
- Improved performance of action execution
**API**
Marked current skin system as deprecated.
We're currently working on a new system, which solves rate limiting problems, adds ability to use skins from local files
and adds the ability to specify the skin variant (slim, default). The new skin system will have a slightly new API. If
everything goes right, the new system will be added in the next version. There will be documentation, how to use the new
API then.
We're currently working on a new system, which solves rate limiting problems, adds ability to use skins from local files and adds the ability to specify the skin variant (slim, default). The new skin system will have a slightly new API. If everything goes right, the new system will be added in the next version. There will be documentation, how to use the new API then.
## v2.4.0 [!badge variant="info" text="2024-11-02"]
@@ -205,10 +130,9 @@ API then.
- Fixed player npcs not spawning in 1.19.4
- Fixed duplicate npc names
- Add join delay
- Fixed armor stand interaction
- Fixed armor stand interaction
**API changes**
- Added NpcManager#getNpcById
- Improve and extend api for npc interactions
- Include sources and javadocs in api
@@ -221,8 +145,7 @@ This version fixes various of issues that accured in v2.0.8
- Removed debug message console spam
- Fixed not being able to modify playerCommands on new created npcs
- Equipment is not shown when npc is invisible
- Added a fix command (/npc fix (npc name)): run this command, if the npc is bugged and it will completely recreate the
npc and might fix the issue
- Added a fix command (/npc fix (npc name)): run this command, if the npc is bugged and it will completely recreate the npc and might fix the issue
## v2.0.8 [!badge variant="info" text="2024-02-18"]
@@ -235,16 +158,16 @@ This version fixes various of issues that accured in v2.0.8
## v2.0.7 [!badge variant="info" text="2024-01-09"]
- You can now set multiple npc messages:
- /Npc message (npc name) add (message) - adds a new message
- /Npc message (npc name) set (index) (message) - sets a message at an index
- /Npc message (npc name) remove (index) - removes a message at an index
- /Npc message (npc name) clear - removes all messages
- /Npc message (npc name) add (message) - adds a new message
- /Npc message (npc name) set (index) (message) - sets a message at an index
- /Npc message (npc name) remove (index) - removes a message at an index
- /Npc message (npc name) clear - removes all messages
- Added support for legacy colors in the display name
- Added player sitting pose (/npc attribute pose sitting)
- Added the "/npc info (npc)" command
- You can disable the "on interaction cooldown" message in the config (disable_interaction_cooldown_message=true)
- Added config option to not register commands (helpful if you use FancyNpcs as library)
- Fixed setting showInTab to false not applying right away
- Fixed setting showInTab to false not applying right away
- Fixed npcs sometimes disappearing when teleporting from another world
## v2.0.6.1 [!badge variant="info" text="2023-12-13"] [!badge variant="danger" text="Hotfix"]
@@ -301,15 +224,11 @@ This version fixes various of issues that accured in v2.0.8
## v2.0.0 [!badge variant="info" text="2023-06-28"]
In this major update, FancyNpcs introduces a revamped project structure, empowering the plugin to seamlessly support
multiple Minecraft versions within a single jar file. Gone are the days of limited compatibility - now you can enjoy the
benefits of FancyNpcs across various versions!
In this major update, FancyNpcs introduces a revamped project structure, empowering the plugin to seamlessly support multiple Minecraft versions within a single jar file. Gone are the days of limited compatibility - now you can enjoy the benefits of FancyNpcs across various versions!
Full changelog:
- Versatile Version Support: FancyNpcs 2.0.0 breaks free from its previous limitations by accommodating both newer and
older Minecraft versions. The plugin now proudly supports the latest versions 1.19.4 and 1.20.1, ensuring
compatibility and flexibility for your Minecraft server.
- Versatile Version Support: FancyNpcs 2.0.0 breaks free from its previous limitations by accommodating both newer and older Minecraft versions. The plugin now proudly supports the latest versions 1.19.4 and 1.20.1, ensuring compatibility and flexibility for your Minecraft server.
- Added PlaceholderAPI support
- Several fixes
- Added example images and a new big title to the README.md

View File

@@ -0,0 +1,5 @@
---
order: 9
icon: command-palette
redirect: npc.md
---

View File

@@ -1,2 +0,0 @@
order: 9
icon: command-palette

View File

@@ -1,5 +1,4 @@
---
icon: dot
order: 9
---

View File

@@ -1,5 +1,4 @@
---
icon: dot
order: 10
---
@@ -133,10 +132,6 @@ Changes whether the NPC can collide with other entities.
Changes the scale of the size of the NPC.
!!!warning
Only available for 1.20.5 or newer.
!!!
- **Syntax**: `/npc scale (npc) (factor)`
- **Permissions**: `fancynpcs.command.npc.scale`
@@ -177,13 +172,6 @@ Teleports NPC to specified location.
- **Syntax**: `/npc move_to (npc) (x) (y) (z) [world] [--look-in-my-direction]`
- **Permissions**: `fancynpcs.command.npc.move_to`
### Rotate npc
Sets the yaw and pitch of the specified NPC.
- **Syntax**: `/npc rotate (npc) (yaw) (pitch)`
- **Permissions**: `fancynpcs.command.npc.rotate`
### Center npc location
Centers the NPC to the specified location.
@@ -218,36 +206,28 @@ Learn more about actions and triggers in the [Action System](../tutorials/action
Adds an action to the specified NPC's trigger.
- **Syntax**: `/npc action (npc) (trigger) add (actionType) [value]`
- **Permissions**:
- `fancynpcs.command.npc.action.add`
- and `fancynpcs.command.npc.action.add.(actionType | *)` for the specific action type
- **Permissions**: `fancynpcs.command.npc.action.add`
### Add action before
Adds an action before the specified index in the NPC's action list for the given trigger.
- **Syntax**: `/npc action (npc) (trigger) add_before (index) (actionType) [value]`
- **Permissions**:
- `fancynpcs.command.npc.action.addBefore`
- and `fancynpcs.command.npc.action.add.(actionType | *)` for the specific action type
- **Permissions**: `fancynpcs.command.npc.action.addBefore`
### Add action after
Adds an action after the specified index in the NPC's action list for the given trigger.
- **Syntax**: `/npc action (npc) (trigger) add_after (index) (actionType) [value]`
- **Permissions**:
- `fancynpcs.command.npc.action.addAfter`
- and `fancynpcs.command.npc.action.add.(actionType | *)` for the specific action type
- **Permissions**: `fancynpcs.command.npc.action.addAfter`
### Set action
Sets an action at the specified number in the NPC's action list for the given trigger.
- **Syntax**: `/npc action (npc) (trigger) set (number) (actionType) [value]`
- **Permissions**:
- `fancynpcs.command.npc.action.set`
- and `fancynpcs.command.npc.action.add.(actionType | *)` for the specific action type
- **Permissions**: `fancynpcs.command.npc.action.set`
### Remove action

View File

@@ -2,12 +2,12 @@
title: FancyNpcs
icon: accessibility
expanded: true
order: 200
order: 100
---
#
![](../static/logos-and-banners/fancynpcs-banner.png)
![](/static/fancynpcs/banner.png)
!!!
Simple, lightweight and feature-rich NPC plugin for Paper and Folia servers using packets.
@@ -50,4 +50,4 @@ You can download the latest version of FancyNpcs from the following platforms:
[!button size="s" icon="download" iconAlign="left" text="Download from Hangar" target="blank"](https://hangar.papermc.io/Oliver/FancyNpcs/versions)
How to get started with FancyNpcs? Check out [this page](getting-started.md).
How to get started with FancyNpcs? Check out the [this page](getting-started.md).

View File

@@ -19,26 +19,4 @@ No, currently there is no support for ModelEngine 4 or any other model engine. S
FancyNpcs does not have a movement system yet. This is a highly requested feature and might be added in the future. Keep an eye on the discord server for updates.
We already made plans for a waypoint system, but it is not yet implemented. If you have any suggestions or ideas, feel free to share them on the discord server.
### Placeholders as skin
Using placeholders as skin does generally work. There are a few requirements tho:
- The placeholder must resolve into a valid username, UUID, URL or file path
- The placeholder must be able to resolve without any player context
You can test if this is the case by trying to manually resolve the placeholder using the `/papi parse --null %YOUR-PLACEHOLDER%` command.
If the placeholder resolves to a valid value, you can use it as skin.
### URLs as skin
You can use URLs as skin. There are a few requirements tho:
- The URL must be reachable
- The URL must point to a valid skin file
- Using a URL that points to a .png file is recommended
How to use a skin from NameMC:
![Click on the skin](../static/skin-url-namemc-1.png)
![Right click on the download button](../static/skin-url-namemc-2.png)
We already made plans for a waypoint system, but it is not yet implemented. If you have any suggestions or ideas, feel free to share them on the discord server.

View File

@@ -4,7 +4,7 @@ icon: info
---
# Getting started
!!!danger
!!! danger
Be aware, that only Paper and Folia is supported, but the plugin should work on any of its forks (like Purpur or Pufferfish). Spigot, Bukkit, Sponge and Fabric is not supported.
!!!

View File

@@ -1,7 +1,3 @@
---
icon: dot
---
# Action system
The NPC Action System in FancyNPCs allows server administrators to create interactive and engaging NPCs by assigning actions that trigger based on player interactions or custom events.
@@ -55,7 +51,7 @@ Example: `/npc action (npc) (trigger) add player_command warp spawn`
Executes a command as the player who triggered the action, but with operator privileges. This action is useful for performing player-specific operations that require operator permissions.
!!!warning
!!! warning
FancyNpcs will gives the player operator permissions for the duration of the command execution. This means that the player will have access to all commands and permissions during that time.
This can be a security risk if not used carefully, so make sure to use this action only when necessary and with trusted players.
!!!
@@ -73,10 +69,6 @@ Syntax: `send_to_server (server name)`
Example: `/npc action (npc) (trigger) add send_to_server skyblock`
!!!info
Make sure to set `bungee-plugin-message-channel` to `true` in the velocity.toml config file. Otherwise, this action might not work properly.
!!!
### execute_random_action
Picks a random action from the remaining actions in the list and executes it. This action is useful for creating random behavior in NPCs.
@@ -122,10 +114,6 @@ Syntax: `need_permission (permission)`
Example: `/npc action (npc) (trigger) add need_permission my.cool.permission`
!!!info
If you add the `!` prefix to the permission, the action will be inverted. This means that the action list will be canceled if the player has the permission.
!!!
### play_sound
Plays a sound to the player. This action is useful for creating audio feedback for the player when interacting with the NPC.

View File

@@ -1,7 +1,3 @@
---
icon: dot
---
# MineSkin API Key
When you have many npcs with skins (especially skins by file or url), you will notice that it takes a while once they

View File

@@ -1,7 +1,3 @@
---
icon: dot
---
# Multiple display name lines
To have multiple lines as the display name of an NPC follow the following steps:

View File

@@ -1,13 +1,9 @@
---
icon: dot
---
# Sitting NPCs
You can make a NPC sit by following these steps:
1. Create a NPC
2. Make sure the type is PLAYER (`/npc type <npc> PLAYER`)
3. Run `/npc attribute <npc> set pose sitting`
3. Run `/npc attribute <npc> pose sitting`
You can make the npc stand again by running `/npc attribute <npc> set pose standing`
You can make the npc stand again by running `/npc attribute <npc> pose standing`

View File

@@ -0,0 +1,7 @@
---
order: 7
icon: mortar-board
---
# Tutorials
In this section you will find many tutorials for specific use cases and examples of how to use FancyNPCs. If you have any suggestions for tutorials, please let us know on our discord server.

View File

@@ -1,2 +0,0 @@
order: 7
icon: mortar-board

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