init
This commit is contained in:
commit
530524b739
27
.editorconfig
Normal file
27
.editorconfig
Normal file
@ -0,0 +1,27 @@
|
||||
# EditorConfig helps developers define and maintain consistent
|
||||
# coding styles between different editors and IDEs
|
||||
# editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
[*.rs]
|
||||
max_line_length = 100
|
||||
|
||||
[*.md]
|
||||
# double whitespace at end of line
|
||||
# denotes a line break in Markdown
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.yml]
|
||||
indent_size = 2
|
||||
|
||||
[Makefile]
|
||||
indent_style = tab
|
||||
4
.github/FUNDING.yml
vendored
Normal file
4
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: [ Snowiiii ]
|
||||
custom: ["https://www.paypal.me/alexxmedvedev"]
|
||||
50
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
50
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@ -0,0 +1,50 @@
|
||||
name: Bug report
|
||||
description: Create a bug report to help us improve
|
||||
labels: ["bug"]
|
||||
assignees: Snowiiii
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: duplicate
|
||||
attributes:
|
||||
label: I've searched existing issues and couldn't find a duplicate.
|
||||
description: I confirm this is not a duplicate.
|
||||
options:
|
||||
- label: I confirm this is not a duplicate.
|
||||
required: true
|
||||
- type: input
|
||||
id: os
|
||||
attributes:
|
||||
label: Operating System
|
||||
description: What operating system are you using?
|
||||
placeholder: "Example: macOS Big Sur"
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: version
|
||||
attributes:
|
||||
label: Server Software Version/Commit
|
||||
description: What Server Software Version/Commit are you using?
|
||||
placeholder: "Example: 1.0.0/39b4cb3"
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: what-happened
|
||||
attributes:
|
||||
label: What happened?
|
||||
description: A clear and concise description of what the bug is.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: to-reproduce
|
||||
attributes:
|
||||
label: To Reproduce
|
||||
description: Steps to reproduce the behavior
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: expected-behavior
|
||||
attributes:
|
||||
label: Expected behavior
|
||||
description: A clear and concise description of what you expected to happen.
|
||||
validations:
|
||||
required: true
|
||||
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@ -0,0 +1 @@
|
||||
blank_issues_enabled: false
|
||||
27
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
27
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
name: Feature request
|
||||
description: Suggest an idea for this project
|
||||
labels: ["enhancement"]
|
||||
assignees: Snowiiii
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: duplicate
|
||||
attributes:
|
||||
label: I've searched existing issues and couldn't find a duplicate.
|
||||
description: I confirm this is not a duplicate.
|
||||
options:
|
||||
- label: I confirm this is not a duplicate.
|
||||
required: true
|
||||
- type: textarea
|
||||
id: problem
|
||||
attributes:
|
||||
label: Is your feature request related to a problem? Please describe.
|
||||
description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: solution
|
||||
attributes:
|
||||
label: Describe the solution you'd like
|
||||
description: A clear and concise description of what you want to happen.
|
||||
validations:
|
||||
required: true
|
||||
16
.github/dependabot.yml
vendored
Normal file
16
.github/dependabot.yml
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for more information:
|
||||
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
# https://containers.dev/guide/dependabot
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "devcontainers"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: weekly
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: weekly
|
||||
55
.github/workflows/docs.yml
vendored
Normal file
55
.github/workflows/docs.yml
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
# Based on https://vitepress.dev/guide/deploy#github-pages
|
||||
name: Deploy VitePress site to GitHub Pages
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [website]
|
||||
workflow_dispatch:
|
||||
|
||||
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
|
||||
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
|
||||
concurrency:
|
||||
group: pages
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 23
|
||||
cache: npm
|
||||
- name: Setup Pages
|
||||
uses: actions/configure-pages@v5
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
- name: Build with VitePress
|
||||
run: npm run docs:build
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v3
|
||||
with:
|
||||
path: docs/.vitepress/dist
|
||||
|
||||
deploy:
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
name: Deploy
|
||||
steps:
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v4
|
||||
124
.gitignore
vendored
Normal file
124
.gitignore
vendored
Normal file
@ -0,0 +1,124 @@
|
||||
# === APPLE FILE SYSTEM CRAP ===
|
||||
# General
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
# Intellij IDEA
|
||||
.idea
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
# === JAVA COMPILED CODE AND LOGS ===
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
## Java/Gradle Stuff
|
||||
.gradle
|
||||
**/build/
|
||||
!src/**/build/
|
||||
.kotlin
|
||||
|
||||
# Ignore Gradle GUI config
|
||||
gradle-app.setting
|
||||
|
||||
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
|
||||
!gradle-wrapper.jar
|
||||
|
||||
# Avoid ignore Gradle wrappper properties
|
||||
!gradle-wrapper.properties
|
||||
|
||||
# Cache of project
|
||||
.gradletasknamecache
|
||||
|
||||
# Eclipse Gradle plugin generated files
|
||||
# Eclipse Core
|
||||
.project
|
||||
# JDT-specific (Eclipse Java Development Tools)
|
||||
.classpath
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
replay_pid*
|
||||
|
||||
# === RUST BUILDS AND DEBUG ===
|
||||
# Generated by Cargo
|
||||
# will have compiled files and executables
|
||||
debug/
|
||||
target/
|
||||
|
||||
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
|
||||
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
|
||||
Cargo.lock
|
||||
|
||||
# These are backup files generated by rustfmt
|
||||
**/*.rs.bk
|
||||
|
||||
# MSVC Windows builds of rustc generate these, which store debugging information
|
||||
*.pdb
|
||||
|
||||
# RustRover
|
||||
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
||||
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
||||
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||
#.idea/
|
||||
|
||||
# === PROJECT SPECIFIC ===
|
||||
plugins/*
|
||||
world/*
|
||||
|
||||
# project's configurations
|
||||
configuration.toml
|
||||
features.toml
|
||||
|
||||
|
||||
*.local.nbt
|
||||
|
||||
|
||||
.vscode/settings.json
|
||||
|
||||
# Documentation
|
||||
docs/.vitepress/dist
|
||||
docs/.vitepress/cache
|
||||
node_modules
|
||||
|
||||
run/
|
||||
128
CODE_OF_CONDUCT.md
Normal file
128
CODE_OF_CONDUCT.md
Normal file
@ -0,0 +1,128 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, religion, or sexual identity
|
||||
and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the
|
||||
overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery, and sexual attention or
|
||||
advances of any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or email
|
||||
address, without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
lilalexmed@proton.me.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series
|
||||
of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or
|
||||
permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within
|
||||
the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.0, available at
|
||||
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||
|
||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||
enforcement ladder](https://github.com/mozilla/diversity).
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
https://www.contributor-covenant.org/faq. Translations are available at
|
||||
https://www.contributor-covenant.org/translations.
|
||||
35
CONTRIBUTING.md
Normal file
35
CONTRIBUTING.md
Normal file
@ -0,0 +1,35 @@
|
||||
# Contributing to Pumpkin
|
||||
|
||||
We appreciate your interest in contributing to Pumpkin! This document outlines the guidelines for submitting bug reports, feature suggestions, and code changes.
|
||||
|
||||
## Getting Started
|
||||
|
||||
The easiest way to get started is by asking for help in our [discord](https://discord.gg/wT8XjrjKkf).
|
||||
|
||||
### How to Contribute
|
||||
|
||||
There are several ways you can contribute to Pumpkin:
|
||||
|
||||
- **Reporting Bugs**:
|
||||
If you encounter a bug, please search for existing issues on the issue tracker first.
|
||||
If you can't find a duplicate issue, open a new one.
|
||||
Provide a clear description of the bug, including steps to reproduce it if possible.
|
||||
Screenshots, logs, or code snippets can also be helpful.
|
||||
- **Suggesting Features**:
|
||||
Do you have an idea on how Pumpkin can be improved? Share your thoughts by opening an issue on the issue tracker.
|
||||
Describe the proposed feature in detail, including its benefits and potential implementation considerations.
|
||||
- **Submitting Pull Requests**:
|
||||
If you'd like to contribute code changes, fork the Pumpkin repository on GitHub.
|
||||
Install Rust at [rust-lang.org](https://www.rust-lang.org/).
|
||||
Make your changes on your local fork and create a pull request to the main repository.
|
||||
Ensure your code adheres to our project structure and style guidelines.
|
||||
Write clear and concise commit messages that describe your changes.
|
||||
|
||||
### Docs
|
||||
The Documentation of Pumpkin can be found at https://snowiiii.github.io/Pumpkin/
|
||||
|
||||
### Additional Information
|
||||
|
||||
We encourage you to comment on existing issues and pull requests to share your thoughts and provide feedback.
|
||||
Feel free to ask questions in the issue tracker or reach out to the project maintainers if you need assistance.
|
||||
Before submitting a large contribution, consider opening an issue, discussion or talk with us on our discord to discuss your approach.
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 Aleksander Medvedev
|
||||
|
||||
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.
|
||||
BIN
assets/default_icon.png
Normal file
BIN
assets/default_icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.4 KiB |
19
docs/.vitepress/components/FmtDateTime.vue
Normal file
19
docs/.vitepress/components/FmtDateTime.vue
Normal file
@ -0,0 +1,19 @@
|
||||
<script setup>
|
||||
import { computed, getCurrentInstance } from 'vue';
|
||||
|
||||
const props = defineProps({
|
||||
d: {
|
||||
type: Date,
|
||||
required: true
|
||||
}
|
||||
});
|
||||
|
||||
const formattedDateTime = computed(() => {
|
||||
return getCurrentInstance().appContext.config.globalProperties.$dateTimeFormatter.format(props.d);
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
<template>
|
||||
{{ formattedDateTime }}
|
||||
</template>
|
||||
18
docs/.vitepress/components/FmtNum.vue
Normal file
18
docs/.vitepress/components/FmtNum.vue
Normal file
@ -0,0 +1,18 @@
|
||||
<script setup>
|
||||
import { computed, getCurrentInstance } from 'vue';
|
||||
|
||||
const props = defineProps({
|
||||
n: {
|
||||
type: Number,
|
||||
required: true
|
||||
}
|
||||
});
|
||||
|
||||
const formattedNumber = computed(() => {
|
||||
return getCurrentInstance().appContext.config.globalProperties.$numberFormatter.format(props.n);
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
{{ formattedNumber }}
|
||||
</template>
|
||||
91
docs/.vitepress/config.mts
Normal file
91
docs/.vitepress/config.mts
Normal file
@ -0,0 +1,91 @@
|
||||
import { defineConfig } from "vitepress";
|
||||
|
||||
// https://vitepress.dev/reference/site-config
|
||||
export default defineConfig({
|
||||
title: "Pumpkin",
|
||||
description:
|
||||
"Empowering everyone to host fast and efficient Minecraft servers",
|
||||
lang: "en-US",
|
||||
base: "/Pumpkin/",
|
||||
themeConfig: {
|
||||
// https://vitepress.dev/reference/default-theme-config
|
||||
search: {
|
||||
provider: "local",
|
||||
},
|
||||
nav: [
|
||||
{
|
||||
text: "Documentation",
|
||||
link: '/about/introduction'
|
||||
}
|
||||
],
|
||||
sidebar: [
|
||||
{
|
||||
text: "About",
|
||||
items: [
|
||||
{ text: "Introduction", link: "/about/introduction" },
|
||||
{ text: "Quick Start", link: "/about/quick-start" },
|
||||
{ text: "Benchmarks", link: "/about/benchmarks" },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Configuration",
|
||||
items: [
|
||||
{ text: "Introduction", link: "/config/introduction" },
|
||||
{ text: "Basic", link: "/config/basic" },
|
||||
{ text: "Proxy", link: "/config/proxy"},
|
||||
{ text: "Authentication", link: "/config/authentication"},
|
||||
{ text: "Compression", link: "/config/compression"},
|
||||
{ text: "Resource Pack", link: "/config/resource-pack"},
|
||||
{ text: "Commands", link: "/config/commands"},
|
||||
{ text: "RCON", link: "/config/rcon"},
|
||||
{ text: "PVP", link: "/config/pvp"},
|
||||
{ text: "Logging", link: "/config/logging"},
|
||||
{ text: "Query", link: "/config/query"},
|
||||
{ text: "LAN Broadcast", link: "/config/lan-broadcast"},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Developers",
|
||||
items: [
|
||||
{ text: "Contributing", link: "/developer/contributing", },
|
||||
{ text: "Introduction", link: "/developer/introduction" },
|
||||
{ text: "Networking", link: "/developer/networking" },
|
||||
{ text: "Authentication", link: "/developer/authentication" },
|
||||
{ text: "RCON", link: "/developer/rcon" },
|
||||
{ text: "World", link: "developer/world"},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Troubleshooting",
|
||||
items: [
|
||||
{ text: "Common Issues", link: "/troubleshooting/common_issues.md" },
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
|
||||
socialLinks: [
|
||||
{ icon: "github", link: "https://github.com/Snowiiii/Pumpkin" },
|
||||
{ icon: "discord", link: "https://discord.gg/RNm224ZsDq" },
|
||||
],
|
||||
|
||||
logo: "/assets/icon.png",
|
||||
footer: {
|
||||
message: "Released under the MIT License.",
|
||||
copyright: "Copyright © 2024-present Aleksandr Medvedev",
|
||||
},
|
||||
editLink: {
|
||||
pattern: "https://github.com/Snowiiii/Pumpkin/blob/master/docs/:path",
|
||||
text: "Edit this page on GitHub",
|
||||
},
|
||||
lastUpdated: {
|
||||
text: "Updated at",
|
||||
formatOptions: {
|
||||
dateStyle: "medium",
|
||||
timeStyle: "medium",
|
||||
},
|
||||
},
|
||||
outline: "deep"
|
||||
},
|
||||
head: [["link", { rel: "icon", href: "/Pumpkin/assets/favicon.ico" }]],
|
||||
});
|
||||
29
docs/.vitepress/theme/index.ts
Normal file
29
docs/.vitepress/theme/index.ts
Normal file
@ -0,0 +1,29 @@
|
||||
// https://vitepress.dev/guide/custom-theme
|
||||
import { h } from 'vue'
|
||||
import type { Theme } from 'vitepress'
|
||||
import DefaultTheme from 'vitepress/theme'
|
||||
import './style.css'
|
||||
import FmtNum from '../components/FmtNum.vue'
|
||||
import FmtDateTime from '../components/FmtDateTime.vue'
|
||||
|
||||
export default {
|
||||
extends: DefaultTheme,
|
||||
Layout: () => {
|
||||
return h(DefaultTheme.Layout, null, {
|
||||
// https://vitepress.dev/guide/extending-default-theme#layout-slots
|
||||
})
|
||||
},
|
||||
enhanceApp({ app, router, siteData }) {
|
||||
app.config.globalProperties.$numberFormatter = new Intl.NumberFormat(navigator.languages);
|
||||
app.config.globalProperties.$dateTimeFormatter = new Intl.DateTimeFormat(navigator.languages, {
|
||||
year: "numeric",
|
||||
month: "long",
|
||||
day: "numeric",
|
||||
hour: "numeric",
|
||||
minute: "numeric",
|
||||
timeZoneName: "short"
|
||||
});
|
||||
app.component('FmtNum', FmtNum);
|
||||
app.component('FmtDateTime', FmtDateTime);
|
||||
}
|
||||
} satisfies Theme
|
||||
139
docs/.vitepress/theme/style.css
Normal file
139
docs/.vitepress/theme/style.css
Normal file
@ -0,0 +1,139 @@
|
||||
/**
|
||||
* Customize default theme styling by overriding CSS variables:
|
||||
* https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css
|
||||
*/
|
||||
|
||||
/**
|
||||
* Colors
|
||||
*
|
||||
* Each colors have exact same color scale system with 3 levels of solid
|
||||
* colors with different brightness, and 1 soft color.
|
||||
*
|
||||
* - `XXX-1`: The most solid color used mainly for colored text. It must
|
||||
* satisfy the contrast ratio against when used on top of `XXX-soft`.
|
||||
*
|
||||
* - `XXX-2`: The color used mainly for hover state of the button.
|
||||
*
|
||||
* - `XXX-3`: The color for solid background, such as bg color of the button.
|
||||
* It must satisfy the contrast ratio with pure white (#ffffff) text on
|
||||
* top of it.
|
||||
*
|
||||
* - `XXX-soft`: The color used for subtle background such as custom container
|
||||
* or badges. It must satisfy the contrast ratio when putting `XXX-1` colors
|
||||
* on top of it.
|
||||
*
|
||||
* The soft color must be semi transparent alpha channel. This is crucial
|
||||
* because it allows adding multiple "soft" colors on top of each other
|
||||
* to create a accent, such as when having inline code block inside
|
||||
* custom containers.
|
||||
*
|
||||
* - `default`: The color used purely for subtle indication without any
|
||||
* special meanings attched to it such as bg color for menu hover state.
|
||||
*
|
||||
* - `brand`: Used for primary brand colors, such as link text, button with
|
||||
* brand theme, etc.
|
||||
*
|
||||
* - `tip`: Used to indicate useful information. The default theme uses the
|
||||
* brand color for this by default.
|
||||
*
|
||||
* - `warning`: Used to indicate warning to the users. Used in custom
|
||||
* container, badges, etc.
|
||||
*
|
||||
* - `danger`: Used to show error, or dangerous message to the users. Used
|
||||
* in custom container, badges, etc.
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
:root {
|
||||
--vp-c-default-1: var(--vp-c-gray-1);
|
||||
--vp-c-default-2: var(--vp-c-gray-2);
|
||||
--vp-c-default-3: var(--vp-c-gray-3);
|
||||
--vp-c-default-soft: var(--vp-c-gray-soft);
|
||||
|
||||
--vp-c-brand-1: #ff9800;
|
||||
--vp-c-brand-2: #fb8c00;
|
||||
--vp-c-brand-3: #f57c00;
|
||||
--vp-c-brand-soft: rgba(255, 152, 0, .16);
|
||||
|
||||
--vp-c-tip-1: var(--vp-c-brand-1);
|
||||
--vp-c-tip-2: var(--vp-c-brand-2);
|
||||
--vp-c-tip-3: var(--vp-c-brand-3);
|
||||
--vp-c-tip-soft: var(--vp-c-brand-soft);
|
||||
|
||||
--vp-c-warning-1: var(--vp-c-yellow-1);
|
||||
--vp-c-warning-2: var(--vp-c-yellow-2);
|
||||
--vp-c-warning-3: var(--vp-c-yellow-3);
|
||||
--vp-c-warning-soft: var(--vp-c-yellow-soft);
|
||||
|
||||
--vp-c-danger-1: var(--vp-c-red-1);
|
||||
--vp-c-danger-2: var(--vp-c-red-2);
|
||||
--vp-c-danger-3: var(--vp-c-red-3);
|
||||
--vp-c-danger-soft: var(--vp-c-red-soft);
|
||||
}
|
||||
|
||||
/**
|
||||
* Component: Button
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
:root {
|
||||
--vp-button-brand-border: transparent;
|
||||
--vp-button-brand-text: var(--vp-c-white);
|
||||
--vp-button-brand-bg: var(--vp-c-brand-3);
|
||||
--vp-button-brand-hover-border: transparent;
|
||||
--vp-button-brand-hover-text: var(--vp-c-white);
|
||||
--vp-button-brand-hover-bg: var(--vp-c-brand-2);
|
||||
--vp-button-brand-active-border: transparent;
|
||||
--vp-button-brand-active-text: var(--vp-c-white);
|
||||
--vp-button-brand-active-bg: var(--vp-c-brand-1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Component: Home
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
:root {
|
||||
--vp-home-hero-name-color: transparent;
|
||||
--vp-home-hero-name-background: -webkit-linear-gradient(
|
||||
120deg,
|
||||
#ff9800 30%,
|
||||
#fb8c00
|
||||
);
|
||||
|
||||
--vp-home-hero-image-background-image: linear-gradient(
|
||||
-45deg,
|
||||
#ff9800 50%,
|
||||
#fb8c00 50%
|
||||
);
|
||||
--vp-home-hero-image-filter: blur(44px);
|
||||
}
|
||||
|
||||
@media (min-width: 640px) {
|
||||
:root {
|
||||
--vp-home-hero-image-filter: blur(56px);
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 960px) {
|
||||
:root {
|
||||
--vp-home-hero-image-filter: blur(68px);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Component: Custom Block
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
:root {
|
||||
--vp-custom-block-tip-border: transparent;
|
||||
--vp-custom-block-tip-text: var(--vp-c-text-1);
|
||||
--vp-custom-block-tip-bg: var(--vp-c-indigo-soft);
|
||||
--vp-custom-block-tip-code-bg: var(--vp-c-indigo-soft);
|
||||
}
|
||||
|
||||
/**
|
||||
* Component: Algolia
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
.DocSearch {
|
||||
--docsearch-primary-color: var(--vp-c-brand-1) !important;
|
||||
}
|
||||
|
||||
188
docs/about/benchmarks.md
Normal file
188
docs/about/benchmarks.md
Normal file
@ -0,0 +1,188 @@
|
||||
# Benchmarks
|
||||
|
||||
Here, common Minecraft servers are compared against Pumpkin.
|
||||
|
||||
> [!CAUTION]
|
||||
> **This comparison is unfair.** Pumpkin currently has far fewer features than other servers, which might suggest it uses fewer resources.
|
||||
> It's also important to consider that other servers have had years for optimization.
|
||||
> Vanilla forks, which don’t need to rewrite the entire vanilla logic, can focus exclusively on optimizations.
|
||||
|
||||

|
||||
|
||||
## Specifications
|
||||
|
||||
#### Technical
|
||||
|
||||
**Software**
|
||||
|
||||
- Distribution: Manjaro Linux
|
||||
- Architecture: x86_64 (64-bit)
|
||||
- Kernel Version: 6.11.3-arch1-1
|
||||
|
||||
**Hardware**
|
||||
|
||||
- Motherboard: MAG B650 TOMAHAWK WIFI
|
||||
- CPU: AMD Ryzen 7600X 6-Core
|
||||
- RAM: Corsair 2x16GB DDR5 6000Mhz
|
||||
- Storage: Samsung 990 PRO 1TB PCIe 4.0 M.2 SSD
|
||||
- Cooling: be quiet Dark Rock Elite
|
||||
|
||||
**Rust**
|
||||
|
||||
- Toolchain: stable-x86_64-unknown-linux-gnu (1.81.0)
|
||||
- Rust Compiler: rustc 1.81.0 (eeb90cda1 2024-09-04)
|
||||
|
||||
**Java**
|
||||
|
||||
- JDK Version: OpenJDK 23 64-Bit 2024-09-17
|
||||
- JRE Version: OpenJDK Runtime Environment (build 23+37)
|
||||
- Vendor: Oracle
|
||||
|
||||
#### Game
|
||||
|
||||
- Minecraft version: 1.21.1
|
||||
- View distance: 10
|
||||
- Simulated distance: 10
|
||||
- Online mode: false
|
||||
- Rcon: false
|
||||
|
||||
<sub><sup>online mode was disabled for easier testing with non-premium accounts</sup></sub>
|
||||
|
||||
> [!NOTE]
|
||||
> All tests have been ran multiple times to guarantee consistent results.
|
||||
> All players did not move when spawning, only the initial 8 chunks were loaded.
|
||||
> All servers used their own terrain generation, no world was pre-loaded.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> `CPU Max` is usually higher with one player as the initial chunks are being loaded.
|
||||
|
||||
## Pumpkin
|
||||
|
||||
Build: [8febc50](https://github.com/Snowiiii/Pumpkin/commit/8febc5035d5611558c13505b7724e6ca284e0ada)
|
||||
|
||||
Compile args: `--release`
|
||||
|
||||
Run args:
|
||||
|
||||
**File Size:** <FmtNum :n=12.3 />MB
|
||||
|
||||
**Startup time:** <FmtNum :n=8 />ms
|
||||
|
||||
**Shutdown time:** <FmtNum :n=0 />ms
|
||||
|
||||
| Players | RAM | CPU Idle | CPU Max |
|
||||
| ------- | --------------------- | ---------------- | ------------------ |
|
||||
| 0 | <FmtNum :n=392.2 />KB | <FmtNum :n=0 />% | <FmtNum :n=0 />% |
|
||||
| 1 | <FmtNum :n=24.9 />MB | <FmtNum :n=0 />% | <FmtNum :n=4 />% |
|
||||
| 2 | <FmtNum :n=25.1 />MB | <FmtNum :n=0 />% | <FmtNum :n=0.6 />% |
|
||||
| 5 | <FmtNum :n=26 />MB | <FmtNum :n=0 />% | <FmtNum :n=1 />% |
|
||||
| 10 | <FmtNum :n=27.1 />MB | <FmtNum :n=0 />% | <FmtNum :n=1.5 />% |
|
||||
|
||||
<sub><sup>Pumpkin does cache already loaded chunks, resulting in no extra RAM usage besides player data and minimal CPU usage.</sup></sub>
|
||||
|
||||
#### Compile time
|
||||
Compiling from Nothing:
|
||||
|
||||
**Debug:** <FmtNum :n=10.35 />sec
|
||||
**Release:** <FmtNum :n=38.40 />sec
|
||||
|
||||
Recompilation (pumpkin crate):
|
||||
|
||||
**Debug:** <FmtNum :n=1.82 />sec
|
||||
**Release:** <FmtNum :n=28.68 />sec
|
||||
|
||||
## Vanilla
|
||||
|
||||
Release: [1.21.1](https://piston-data.mojang.com/v1/objects/59353fb40c36d304f2035d51e7d6e6baa98dc05c/server.jar)
|
||||
|
||||
Compile args:
|
||||
|
||||
Run args: `nogui`
|
||||
|
||||
**File Size:** <FmtNum :n=51.6 />MB
|
||||
|
||||
**Startup time:** <FmtNum :n=7 />sec
|
||||
|
||||
**Shutdown time:** <FmtNum :n=4 />sec
|
||||
|
||||
| Players | RAM | CPU idle | CPU Max |
|
||||
| ------- | --------------------- | ---------------------------------------- | ------------------ |
|
||||
| 0 | <FmtNum n="860" />MB | <FmtNum n="0.1" /> - <FmtNum n="0.3" />% | <FmtNum n="51" />% |
|
||||
| 1 | <FmtNum n="1.5" />GB | <FmtNum n="0.9" /> - <FmtNum n="1" />% | <FmtNum n="41" />% |
|
||||
| 2 | <FmtNum n="1.6" />GB | <FmtNum n="1" /> - <FmtNum n="1.1" />% | <FmtNum n="10" />% |
|
||||
| 5 | <FmtNum n="1.8" />GB | <FmtNum n="2" />% | <FmtNum n="20" />% |
|
||||
| 10 | <FmtNum n="2.2" />GB | <FmtNum n="4" />% | <FmtNum n="24" />% |
|
||||
|
||||
## Paper
|
||||
|
||||
Build: [122](https://api.papermc.io/v2/projects/paper/versions/1.21.1/builds/122/downloads/paper-1.21.1-122.jar)
|
||||
|
||||
Compile args:
|
||||
|
||||
Run args: `nogui`
|
||||
|
||||
**File Size:** <FmtNum :n=49.4 />MB
|
||||
|
||||
**Startup time:** <FmtNum :n=7 />sec
|
||||
|
||||
**Shutdown time:** <FmtNum :n=3 />sec
|
||||
|
||||
| Players | RAM | CPU idle | CPU Max |
|
||||
| ------- | ------------------- | -------------------------------------- | ----------------- |
|
||||
| 0 | <FmtNum :n=1.1 />GB | <FmtNum :n=0.2 /> - <FmtNum :n=0.3 />% | <FmtNum :n=36 />% |
|
||||
| 1 | <FmtNum :n=1.7 />GB | <FmtNum :n=0.9 /> - <FmtNum :n=1.0 />% | <FmtNum :n=47 />% |
|
||||
| 2 | <FmtNum :n=1.8 />GB | <FmtNum :n=1 /> - <FmtNum :n=1.1 />% | <FmtNum :n=10 />% |
|
||||
| 5 | <FmtNum :n=1.9 />GB | <FmtNum :n=1.5 />% | <FmtNum :n=15 />% |
|
||||
| 10 | <FmtNum :n=2 />GB | <FmtNum :n=3 />% | <FmtNum :n=20 />% |
|
||||
|
||||
|
||||
## Purpur
|
||||
|
||||
Build: [2324](https://api.purpurmc.org/v2/purpur/1.21.1/2324/download)
|
||||
|
||||
Compile args:
|
||||
|
||||
Run args: `nogui`
|
||||
|
||||
**File Size:** <FmtNum :n=53.1 />MB
|
||||
|
||||
**Startup time:** <FmtNum :n=8 />sec
|
||||
|
||||
**Shutdown time:** <FmtNum :n=4 />sec
|
||||
|
||||
| Players | RAM | CPU idle | CPU Max |
|
||||
| ------- | ------------------- | -------------------------------------- | ----------------- |
|
||||
| 0 | <FmtNum :n=1.4 />GB | <FmtNum :n=0.2 /> - <FmtNum :n=0.3 />% | <FmtNum :n=25 />% |
|
||||
| 1 | <FmtNum :n=1.6 />GB | <FmtNum :n=0.7 /> - <FmtNum :n=1.0 />% | <FmtNum :n=35 />% |
|
||||
| 2 | <FmtNum :n=1.7 />GB | <FmtNum :n=1.1 /> - <FmtNum :n=1.3 />% | <FmtNum :n=9 />% |
|
||||
| 5 | <FmtNum :n=1.9 />GB | <FmtNum :n=1.6 />% | <FmtNum :n=20 />% |
|
||||
| 10 | <FmtNum :n=2.2 />GB | <FmtNum :n=2 /> - <FmtNum :n=2.5 />% | <FmtNum :n=26 />% |
|
||||
|
||||
## Minestom
|
||||
|
||||
Commit: [0ca1dda2fe](https://github.com/Minestom/Minestom/commit/0ca1dda2fe11390a1b89a228bbe7bf78fefc73e1)
|
||||
|
||||
Compile args:
|
||||
|
||||
Run args:
|
||||
|
||||
**Language:** Benchmarks ran with Kotlin 2.0.0 (Minestom itself is made with Java)
|
||||
|
||||
**File Size:** <FmtNum :n=2.8 />MB (Library)
|
||||
|
||||
**Startup time:** <FmtNum :n=310 />ms
|
||||
|
||||
**Shutdown time:** <FmtNum :n=0 />ms
|
||||
|
||||
<sub>[Used example code from](https://minestom.net/docs/setup/your-first-server)</sub>
|
||||
|
||||
| Players | RAM | CPU idle | CPU Max |
|
||||
| ------- | ------------------- | -------------------------------------- | ---------------- |
|
||||
| 0 | <FmtNum :n=228 />MB | <FmtNum :n=0.1 /> - <FmtNum :n=0.3 />% | <FmtNum :n=1 />% |
|
||||
| 1 | <FmtNum :n=365 />MB | <FmtNum :n=0.9 /> - <FmtNum :n=1.0 />% | <FmtNum :n=5 />% |
|
||||
| 2 | <FmtNum :n=371 />MB | <FmtNum :n=1 /> - <FmtNum :n=1.1 />% | <FmtNum :n=4 />% |
|
||||
| 5 | <FmtNum :n=390 />MB | <FmtNum :n=1.0 />% | <FmtNum :n=6 />% |
|
||||
| 10 | <FmtNum :n=421 />MB | <FmtNum :n=3 />% | <FmtNum :n=9 />% |
|
||||
|
||||
|
||||
Benchmarked at <FmtDateTime :d="new Date('2024-10-15T16:34Z')" />
|
||||
37
docs/about/introduction.md
Normal file
37
docs/about/introduction.md
Normal file
@ -0,0 +1,37 @@
|
||||
# Pumpkin
|
||||
|
||||
Pumpkin is a Minecraft server built entirely in **Rust**, offering a fast, efficient,
|
||||
and customizable experience. It prioritizes performance and player enjoyment while adhering to the core mechanics of the game.
|
||||
|
||||
<picture>
|
||||
<source srcset="/assets/introduction-preview-2560x1440.png" media="(min-width: 2560px)">
|
||||
<source srcset="/assets/introduction-preview-1280x720.png" media="(min-width: 1280px)">
|
||||
<source srcset="/assets/introduction-preview-640x360.png" media="(min-width: 640px)">
|
||||
<img src="/assets/introduction-preview-1280x720.png" alt="Preview">
|
||||
</picture>
|
||||
|
||||
## What Pumpkin wants to achieve
|
||||
|
||||
- **Performance**: Leveraging multi-threading for maximum speed and efficiency.
|
||||
- **Compatibility**: Supports the latest Minecraft server version and adheres to vanilla game mechanics.
|
||||
- **Security**: Prioritizes security by preventing known security exploits.
|
||||
- **Flexibility**: Highly configurable, with the ability to disable unnecessary features.
|
||||
- **Extensibility**: Provides a foundation for plugin development.
|
||||
|
||||
## What Pumpkin will not
|
||||
|
||||
- Be compatible with plugins or mods for other servers
|
||||
- Function as a framework for building a server from scratch.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Pumpkin is currently under heavy development. Check out our [Github Project](https://github.com/users/Snowiiii/projects/12/views/3) to see current progress
|
||||
|
||||
## Vanilla
|
||||
|
||||
Pumpkin is designed to replicate vanilla Minecraft logic as closely as possible,
|
||||
ensuring a familiar gameplay experience. However, we've also added new features to enhance your gameplay.
|
||||
|
||||
### Redstone
|
||||
|
||||
Unlike other forks that may compromise vanilla redstone mechanics, Pumpkin maintains the original redstone behavior.
|
||||
If you're looking to experiment with redstone modifications or seek performance optimizations, you have the flexibility to do so through our configurable settings.
|
||||
53
docs/about/quick-start.md
Normal file
53
docs/about/quick-start.md
Normal file
@ -0,0 +1,53 @@
|
||||
# Quick Start
|
||||
|
||||
**Current Status:**
|
||||
|
||||
Pre-release: Currently under development and not yet ready for official release.
|
||||
|
||||
To get Pumpkin running, you first have to clone it:
|
||||
```shell
|
||||
git clone https://github.com/Snowiiii/Pumpkin.git
|
||||
cd Pumpkin
|
||||
```
|
||||
|
||||
You may also have to [install rust](https://www.rust-lang.org/tools/install) if you don't already have it.
|
||||
|
||||
**Optional:**
|
||||
|
||||
You can place a vanilla world into the Pumpkin/ directory if you want. Just name the World `world`
|
||||
|
||||
Then run:
|
||||
|
||||
> [!NOTE]
|
||||
> This can take a while because we enabled heavy optimizations for release builds
|
||||
>
|
||||
> To apply further optimizations specific to your CPU and use your CPU features, you should set the target-cpu=native
|
||||
> Rust flag.
|
||||
|
||||
```shell
|
||||
cargo run --release
|
||||
```
|
||||
|
||||
## Docker
|
||||
|
||||
Experimental Docker support is available.
|
||||
The image is currently not published anywhere, but you can use the following command to build and deploy it:
|
||||
|
||||
```shell
|
||||
docker compose up --build
|
||||
```
|
||||
|
||||
After running this command a `data/` folder should appear in which you'll be able to find all the server files.
|
||||
Within this `data/` folder you can put your `world/` folder (make sure you restart the server)
|
||||
|
||||
|
||||
## Test Server
|
||||
Pumpkin has a Test server maintained by @kralverde. Its runs on the latest commit of Pumpkin
|
||||
|
||||
- **IP:** pumpkin.kralverde.dev
|
||||
|
||||
**Specs:**
|
||||
- OS: Debian GNU/Linux bookworm 12.7 x86_64
|
||||
- Kernel: Linux 6.1.0-21-cloud-amd64
|
||||
- CPU: Intel Core (Haswell, no TSX) (2) @ 2.40 GHz
|
||||
- RAM: 4GB DIMM
|
||||
BIN
docs/assets/introduction-preview-1280x720.png
Normal file
BIN
docs/assets/introduction-preview-1280x720.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 789 KiB |
BIN
docs/assets/introduction-preview-2560x1440.png
Normal file
BIN
docs/assets/introduction-preview-2560x1440.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 MiB |
BIN
docs/assets/introduction-preview-640x360.png
Normal file
BIN
docs/assets/introduction-preview-640x360.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 264 KiB |
177
docs/config/authentication.md
Normal file
177
docs/config/authentication.md
Normal file
@ -0,0 +1,177 @@
|
||||
# Authentication
|
||||
|
||||
Servers authenthicate with Mojang's session servers in order to ensure the client is playing on a legitimate, paid account. Pumpkin allows you to fully configure authentication.
|
||||
|
||||
## Configuring Authentication
|
||||
|
||||
> [!WARNING]
|
||||
> Most servers should not change the default authenthication configuration. Doing so may have unintended consequnces. **Only change these settings if you know what you are doing!**
|
||||
|
||||
#### `enabled`: Boolean
|
||||
|
||||
Whether authenthication is enabled or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[authentication]
|
||||
enabled = false
|
||||
```
|
||||
:::
|
||||
|
||||
#### `prevent_proxy_connections`: Boolean
|
||||
|
||||
Whether to block proxy connections or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[authentication]
|
||||
enabled = true
|
||||
prevent_proxy_connections = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `auth_url`: String (optional)
|
||||
The URL to authenthicate with. Uses Mojang's session servers to authenthicate if not specified.
|
||||
|
||||
##### Placeholders
|
||||
| Placeholder | Description |
|
||||
| --------------- | ------------------ |
|
||||
| `{username}` | Player username |
|
||||
| `{server_hash}` | Hash of the server |
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[authentication]
|
||||
auth_url = "[custom auth server here]"
|
||||
```
|
||||
:::
|
||||
|
||||
#### `prevent_proxy_connection_auth_url`: String (optional)
|
||||
The URL to authenthicate with if `prevent_proxy_connections` is enabled. Uses Mojang's session servers to authenthicate if not specified.
|
||||
|
||||
##### Placeholders
|
||||
| Placeholder | Description |
|
||||
| --------------- | ------------------------ |
|
||||
| `{username}` | Player username |
|
||||
| `{server_hash}` | Hash of the server |
|
||||
| `{ip}` | IP Address of the player |
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[authentication]
|
||||
prevent_proxy_connection_auth_url = "[custom auth server here]"
|
||||
```
|
||||
:::
|
||||
|
||||
### Player Profile
|
||||
|
||||
#### `allow_banned_players`: Boolean
|
||||
Allow players flagged by Mojang.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[authentication.player_profile]
|
||||
allow_banned_players = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `allowed_actions`: String Array
|
||||
What actions are allowed if `allow_banned_players` is enabled.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[authentication.player_profile]
|
||||
allow_banned_players = true
|
||||
allowed_actions = ["FORCED_NAME_CHANGE", "USING_BANNED_SKIN"]
|
||||
```
|
||||
:::
|
||||
|
||||
### Textures
|
||||
|
||||
#### `enabled`: Boolean
|
||||
Whether to filter/validate player textures (e.g. Skins/Capes).
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[authentication.textures]
|
||||
enabled = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `allowed_url_schemes`: String Array
|
||||
Allowed URL Schemes for textures.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[authentication.textures]
|
||||
enabled = true
|
||||
allowed_url_schemes = ["http", "https"]
|
||||
```
|
||||
:::
|
||||
|
||||
#### `allowed_url_domains`: String Array
|
||||
Allowed URL domains for textures.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[authentication.textures]
|
||||
enabled = true
|
||||
allowed_url_domains = [".minecraft.net", ".mojang.com"]
|
||||
```
|
||||
:::
|
||||
|
||||
### Texture Types
|
||||
|
||||
#### `skin`: Boolean
|
||||
Whether to use player skins or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[authentication.textures.types]
|
||||
skin = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `cape`: Boolean
|
||||
Whether to use player capes or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[authentication.textures.types]
|
||||
cape = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `elytra`: Boolean
|
||||
Whether to use player elytras or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[authentication.textures.types]
|
||||
elytra = true
|
||||
```
|
||||
:::
|
||||
|
||||
## Default Config
|
||||
By default, authentication is enabled and uses Mojang's servers. Here is the default config:
|
||||
:::code-group
|
||||
```toml [features.toml]
|
||||
[authentication]
|
||||
enabled = true
|
||||
prevent_proxy_connections = false
|
||||
|
||||
[authentication.player_profile]
|
||||
allow_banned_players = false
|
||||
allowed_actions = ["FORCED_NAME_CHANGE", "USING_BANNED_SKIN"]
|
||||
|
||||
[authentication.textures]
|
||||
enabled = true
|
||||
allowed_url_schemes = ["http", "https"]
|
||||
allowed_url_domains = [".minecraft.net", ".mojang.com"]
|
||||
|
||||
[authentication.textures.types]
|
||||
skin = true
|
||||
cape = true
|
||||
elytra = true
|
||||
```
|
||||
:::
|
||||
150
docs/config/basic.md
Normal file
150
docs/config/basic.md
Normal file
@ -0,0 +1,150 @@
|
||||
# Basic Configuration
|
||||
|
||||
Representing `configuration.toml`
|
||||
|
||||
## Server Address
|
||||
|
||||
The address to bind the server to
|
||||
|
||||
```toml
|
||||
server_address=0.0.0.0
|
||||
```
|
||||
|
||||
## Seed
|
||||
|
||||
The seed for world generation
|
||||
|
||||
```toml
|
||||
seed=
|
||||
```
|
||||
|
||||
## Max players
|
||||
|
||||
The maximum number of players allowed on the server
|
||||
|
||||
```toml
|
||||
max_players=10000
|
||||
```
|
||||
|
||||
## View distance
|
||||
|
||||
The maximum view distance for players
|
||||
|
||||
```toml
|
||||
view_distance=10
|
||||
```
|
||||
|
||||
## Simulation distance
|
||||
|
||||
The maximum simulation distance for players
|
||||
|
||||
```toml
|
||||
simulation_distance=10
|
||||
```
|
||||
|
||||
## Default difficulty
|
||||
|
||||
The default game difficulty
|
||||
|
||||
```toml
|
||||
default_difficulty=Normal
|
||||
```
|
||||
|
||||
```toml
|
||||
Peaceful
|
||||
Easy
|
||||
Normal
|
||||
Hard
|
||||
```
|
||||
|
||||
## Allow nether
|
||||
|
||||
Whether the Nether dimension is enabled
|
||||
|
||||
```toml
|
||||
allow_nether=true
|
||||
```
|
||||
|
||||
## Hardcore
|
||||
|
||||
Whether the server is in hardcore mode.
|
||||
|
||||
```toml
|
||||
hardcore=true
|
||||
```
|
||||
|
||||
## Online Mode
|
||||
|
||||
Whether online mode is enabled. Requires valid Minecraft accounts
|
||||
|
||||
```toml
|
||||
online_mode=true
|
||||
```
|
||||
|
||||
## Encryption
|
||||
|
||||
Whether packet encryption is enabled
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Required when online mode is enabled
|
||||
|
||||
```toml
|
||||
encryption=true
|
||||
```
|
||||
|
||||
## Motd
|
||||
|
||||
The server's description displayed on the status screen.
|
||||
|
||||
```toml
|
||||
motd=true
|
||||
```
|
||||
|
||||
## TPS
|
||||
|
||||
The server's Tick rate.
|
||||
|
||||
```toml
|
||||
tps=20.0
|
||||
```
|
||||
|
||||
|
||||
## Use favicon
|
||||
|
||||
Whether to use a server favicon or not
|
||||
|
||||
```toml
|
||||
use_favicon=true
|
||||
```
|
||||
|
||||
## Favicon path
|
||||
|
||||
The path to the server's favicon
|
||||
|
||||
```toml
|
||||
favicon_path=./icon.png
|
||||
```
|
||||
|
||||
## Default gamemode
|
||||
|
||||
The default game mode for players
|
||||
|
||||
```toml
|
||||
default_gamemode=Survival
|
||||
```
|
||||
|
||||
```toml
|
||||
Undefined
|
||||
Survival
|
||||
Creative
|
||||
Adventure
|
||||
Spectator
|
||||
```
|
||||
|
||||
## IP Scrubbing
|
||||
|
||||
Whether to scrub player IPs from logs
|
||||
|
||||
```toml
|
||||
scrub_ips=true
|
||||
```
|
||||
34
docs/config/commands.md
Normal file
34
docs/config/commands.md
Normal file
@ -0,0 +1,34 @@
|
||||
# Commands
|
||||
Pumpkin supports Vanilla commands and allows you to configure where they can be ran from.
|
||||
|
||||
## Configuring Commands
|
||||
#### `use_console`: Boolean
|
||||
Whether commands from the console are accepted or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[commands]
|
||||
use_console = false
|
||||
```
|
||||
:::
|
||||
|
||||
#### `log_console`: Boolean
|
||||
Whether commands from players should be logged in the console or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[commands]
|
||||
log_console = false
|
||||
```
|
||||
:::
|
||||
|
||||
## Default Config
|
||||
By default, Pumpkin will allow commands from console and log all commands run by players.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml]
|
||||
[commands]
|
||||
use_console = true
|
||||
log_console = true
|
||||
```
|
||||
:::
|
||||
55
docs/config/compression.md
Normal file
55
docs/config/compression.md
Normal file
@ -0,0 +1,55 @@
|
||||
# Compression
|
||||
Compression is used to reduce the size of packets. This is beneficial to reduce bandwidth server side and also to help players on slower internet connections.
|
||||
|
||||
## Configuring Compression
|
||||
|
||||
#### `enabled`: Boolean
|
||||
Whether packet compression is enabled or not.
|
||||
|
||||
> [!TIP]
|
||||
> It might be beneficial to disable compression if the server is behind a proxy.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[packet_compression]
|
||||
enabled = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `threshold`: Integer (0-1024)
|
||||
|
||||
The minimum packet size before the server attempts to compress the packet.
|
||||
|
||||
> [!CAUTION]
|
||||
> Increasing this value can hurt players on slower connections.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[packet_compression]
|
||||
threshold = 256
|
||||
```
|
||||
:::
|
||||
|
||||
#### `level`: Integer (0-9)
|
||||
|
||||
A value between 0 to 9: 0 to disable compression, 1 being the fastest compression (at the cost of size), and 9 being maximum compression (at the cost of speed).
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[packet_compression]
|
||||
level = 4
|
||||
```
|
||||
:::
|
||||
|
||||
## Default Config
|
||||
|
||||
By default, compression is enabled.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml]
|
||||
[packet_compression]
|
||||
enabled = true
|
||||
threshold = 256
|
||||
level = 4
|
||||
```
|
||||
:::
|
||||
23
docs/config/introduction.md
Normal file
23
docs/config/introduction.md
Normal file
@ -0,0 +1,23 @@
|
||||
### Configuration
|
||||
|
||||
Pumpkin offers a robust configuration system that allows users to customize various aspects of the server's behavior without relying on external plugins. This provides flexibility and control over the server's operation.
|
||||
|
||||
### Basic / Advanced
|
||||
|
||||
Pumpkin's Configuration is split into a basic Configuration made for quick changes and important changes and a more Advanced Configuration
|
||||
|
||||
- `configuration.toml`: simple and can be compared to the vanilla `server.properties`.
|
||||
- `features.toml`: designed to have all features of pumpkin at one place, making it a large configuration
|
||||
|
||||
### Server Version
|
||||
|
||||
Pumpkin aims to support the latest Minecraft Version. If you want to host a Pumpkin server in any other version, there is a project called [ViaProxy](https://github.com/ViaVersion/ViaProxy).
|
||||
|
||||
- Make sure to allow Proxy connections.
|
||||
- Pumpkin and ViaProxy have no connection, don't submit issues regarding their code. Furthermore, this is a 3rd party proxy and Pumpkin does not take any responsibility for the good or the bad.
|
||||
|
||||
#### Key Features:
|
||||
|
||||
- Extensive Customization: Configure server settings, player behavior, world generation, and more.
|
||||
- Performance Optimization: Optimize server performance through configuration tweaks.
|
||||
- Plugin-Free Customization: Achieve desired changes without the need for additional plugins.
|
||||
54
docs/config/lan-broadcast.md
Normal file
54
docs/config/lan-broadcast.md
Normal file
@ -0,0 +1,54 @@
|
||||
# LAN Broadcast
|
||||
Pumpkin can broadcast the server across the network in order to make it easier for local players to connect to the server easier.
|
||||
|
||||
## Configuring LAN Broadcast
|
||||
|
||||
#### `enabled`: Boolean
|
||||
Whether LAN Broadcast is enabled or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[lan_broadcast]
|
||||
enabled = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `motd`: String (optional)
|
||||
The MOTD to broadcast out to clients. Will use server's MOTD by default.
|
||||
|
||||
> [!CAUTION]
|
||||
> LAN broadcast MOTD does not support multiple lines, RGB colors, or gradients. Pumpkin does not verify the MOTD before broadcasted. If the server MOTD is using these components, consider defining this field so that clients see a proper MOTD.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[lan_broadcast]
|
||||
enabled = true
|
||||
motd = "[your MOTD here]"
|
||||
```
|
||||
:::
|
||||
|
||||
#### `port`: Integer (0-65535) (optional)
|
||||
What port to bind to. If not specified, will bind to port 0 (any available port on the system).
|
||||
|
||||
> [!IMPORTANT]
|
||||
> The protocol defines what port to broadcast to. This option only exists to specify which port to bind to on the host. This option purely exists so that the port can be predictable.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[lan_broadcast]
|
||||
enabled = true
|
||||
port = 46733
|
||||
```
|
||||
:::
|
||||
|
||||
## Default Config
|
||||
By default LAN broadcast is disabled.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml]
|
||||
[lan_broadcast]
|
||||
enabled = false
|
||||
motd = "[server MOTD here]"
|
||||
port = 0
|
||||
```
|
||||
:::
|
||||
90
docs/config/logging.md
Normal file
90
docs/config/logging.md
Normal file
@ -0,0 +1,90 @@
|
||||
# Logging
|
||||
Pumpkin allows you to customize what you want in your logs.
|
||||
|
||||
## Configuring Logging
|
||||
|
||||
#### `enabled`: Boolean
|
||||
Whether logging is enabled or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[logging]
|
||||
enabled = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `level`: Enum
|
||||
What should be logged. Possible values are:
|
||||
- Off
|
||||
- Error
|
||||
- Warn
|
||||
- Info
|
||||
- Debug
|
||||
- Trace
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[logging]
|
||||
enabled = true
|
||||
level = "Debug"
|
||||
```
|
||||
:::
|
||||
|
||||
#### `env`: Boolean
|
||||
Whether to allow choosing the log level by setting the `RUST_LOG` environment variable or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[logging]
|
||||
enabled = true
|
||||
env = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `threads`: Boolean
|
||||
Whether to print threads in the logging message or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[logging]
|
||||
enabled = true
|
||||
threads = false
|
||||
```
|
||||
:::
|
||||
|
||||
#### `color`: Boolean
|
||||
Whether to print with color to the console or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[logging]
|
||||
enabled = true
|
||||
color = false
|
||||
```
|
||||
:::
|
||||
|
||||
#### `timestamp`: Boolean
|
||||
Whether to print the timestamp in the meessage or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[logging]
|
||||
enabled = true
|
||||
timestamp = false
|
||||
```
|
||||
:::
|
||||
|
||||
## Default Config
|
||||
By default, logging is enabled and will print with color, threads, and timestamp at the `Info` level.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml]
|
||||
[logging]
|
||||
enabled = true
|
||||
level = "Info"
|
||||
env = false
|
||||
threads = true
|
||||
color = true
|
||||
timestamp = true
|
||||
```
|
||||
:::
|
||||
78
docs/config/proxy.md
Normal file
78
docs/config/proxy.md
Normal file
@ -0,0 +1,78 @@
|
||||
# Proxy
|
||||
Many servers use proxies to manage connections and distribute players across servers. Pumpkin supports the following proxy protocols:
|
||||
|
||||
- [Velocity](https://papermc.io/software/velocity)
|
||||
- [BungeeCord](https://www.spigotmc.org/wiki/bungeecord-installation/)
|
||||
|
||||
> [!TIP]
|
||||
> Velocity is recommended for most server networks. Velocity is modern and more performant compared to BungeeCord.
|
||||
|
||||
## Configuring Proxy
|
||||
|
||||
#### `enabled`: Boolean
|
||||
|
||||
Enables support for proxies.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml]{2}
|
||||
[proxy]
|
||||
enabled = true
|
||||
```
|
||||
:::
|
||||
|
||||
### Velocity
|
||||
|
||||
#### `enabled`: Boolean
|
||||
|
||||
Whether Velocity support is enabled or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml]{2}
|
||||
[proxy.velocity]
|
||||
enabled = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `secret`: String
|
||||
|
||||
The secret as configured in Velocity.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml]{3}
|
||||
[proxy.velocity]
|
||||
enabled = true
|
||||
secret = "[proxy secret here]"
|
||||
```
|
||||
:::
|
||||
|
||||
### BungeeCord
|
||||
|
||||
#### `enabled`: Boolean
|
||||
Whether BungeeCord support is enabled or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml]{2}
|
||||
[proxy.bungeecord]
|
||||
enabled = true
|
||||
```
|
||||
:::
|
||||
|
||||
> [!CAUTION]
|
||||
> Ensure that the server's firewall is correctly configured, as BungeeCord can't verify if player info is from your proxy or an imposter.
|
||||
|
||||
## Default Config
|
||||
By default, proxy support is disabled. Here is the default config:
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml]
|
||||
[proxy]
|
||||
enabled = false
|
||||
|
||||
[proxy.velocity]
|
||||
enabled = false
|
||||
secret = ""
|
||||
|
||||
[proxy.bungeecord]
|
||||
enabled = false
|
||||
```
|
||||
:::
|
||||
68
docs/config/pvp.md
Normal file
68
docs/config/pvp.md
Normal file
@ -0,0 +1,68 @@
|
||||
# PVP
|
||||
PVP is a core part of vanilla mechanics, with even the smallest change affecting gameplay. Pumpkin allows you to fully configure PVP.
|
||||
|
||||
## Configuring PVP
|
||||
|
||||
#### `enabled`: Boolean
|
||||
Whether PVP is enabled or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[pvp]
|
||||
enabled = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `hurt_animation`: Boolean
|
||||
Whether to show red hurt animation and FOV bobbing or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[pvp]
|
||||
hurt_animation = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `protect_creative`: Boolean
|
||||
Whether to protect players in creative againest PVP or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[pvp]
|
||||
protect_creative = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `knockback`: Boolean
|
||||
Whether attacks should have knockback or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[pvp]
|
||||
knockback = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `swing`: Boolean
|
||||
Whether players should swing when attacking or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[pvp]
|
||||
swing = true
|
||||
```
|
||||
:::
|
||||
|
||||
## Default Config
|
||||
By default all PVP options are enabled to match vanilla behavior.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml]
|
||||
[pvp]
|
||||
enabled = true
|
||||
hurt_animation = true
|
||||
protect_creative = true
|
||||
knockback = true
|
||||
swing = true
|
||||
```
|
||||
:::
|
||||
36
docs/config/query.md
Normal file
36
docs/config/query.md
Normal file
@ -0,0 +1,36 @@
|
||||
# Query
|
||||
Query protocol is an simple way to query the server about its status. Pumpkin fully supports the query protocol.
|
||||
|
||||
## Configuring Query
|
||||
|
||||
#### `enabled`: Boolean
|
||||
Whether to listen for query protocol requests or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[query]
|
||||
enabled = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `port`: Integer (0-65535) (optional)
|
||||
What port to listen to query protocol requests. If not specified, it uses the same port as the server.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[query]
|
||||
enabled = true
|
||||
port = 12345
|
||||
```
|
||||
:::
|
||||
|
||||
## Default Config
|
||||
By default query is disabled. It will run on the server port if enabled unless specified explicitly.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml]
|
||||
[query]
|
||||
enabled = true
|
||||
port = 25565
|
||||
```
|
||||
:::
|
||||
106
docs/config/rcon.md
Normal file
106
docs/config/rcon.md
Normal file
@ -0,0 +1,106 @@
|
||||
# RCON
|
||||
RCON is a protocol that allows you to remotely manage the server from a different device. Pumpkin has full support for RCON.
|
||||
|
||||
## Configuring RCON
|
||||
|
||||
#### `enabled`: Boolean
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[rcon]
|
||||
enabled = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `address`: String
|
||||
The address and port that RCON should listen to.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[rcon]
|
||||
enabled = true
|
||||
address = "0.0.0.0:25575"
|
||||
```
|
||||
:::
|
||||
|
||||
#### `password`: String
|
||||
The password to use for RCON authentication.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[rcon]
|
||||
enabled = true
|
||||
password = "[your safe password here]"
|
||||
```
|
||||
:::
|
||||
|
||||
#### `max_connections`: Integer
|
||||
The max number of RCON connections allowed at a single time. Set to 0 to disable a limit.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[rcon]
|
||||
enabled = true
|
||||
max_connections = 5
|
||||
```
|
||||
:::
|
||||
|
||||
### Logging
|
||||
#### `log_logged_successfully`: Boolean
|
||||
Whether successful logins should be logged to console or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[rcon.logging]
|
||||
log_logged_successfully = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `log_wrong_password`: Boolean
|
||||
Whether wrong password attempts should be logged to console or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[rcon.logging]
|
||||
log_logged_successfully = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `log_commands`: Boolean
|
||||
Whether to log commands ran from RCON to console or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[rcon.logging]
|
||||
log_commands = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `log_quit`: Boolean
|
||||
Whether RCON client quit should be logged or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[rcon.logging]
|
||||
log_quit = true
|
||||
```
|
||||
:::
|
||||
|
||||
## Default Config
|
||||
By default RCON is disabled.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml]
|
||||
[rcon]
|
||||
enabled = false
|
||||
address = "0.0.0.0:25575"
|
||||
password = ""
|
||||
max_connections = 0
|
||||
|
||||
[rcon.logging]
|
||||
log_logged_successfully = true
|
||||
log_wrong_password = true
|
||||
log_commands = true
|
||||
log_quit = true
|
||||
```
|
||||
:::
|
||||
97
docs/config/resource-pack.md
Normal file
97
docs/config/resource-pack.md
Normal file
@ -0,0 +1,97 @@
|
||||
# Resource Pack
|
||||
Servers can send resource packs to the client in order to change the appearance of the game on the client. Pumpkin allows you to fully configure the resource pack.
|
||||
|
||||
> [!TIP]
|
||||
> Minify your resource pack using [PackSquash](https://packsquash.aylas.org/)! This can help clients download the resource pack faster.
|
||||
|
||||
## Configuring Resource Pack
|
||||
|
||||
#### `enabled`: Boolean
|
||||
Whether a resource pack is enabled or not.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {2}
|
||||
[resource_pack]
|
||||
enabled = true
|
||||
```
|
||||
:::
|
||||
|
||||
#### `resource_pack_url`: String
|
||||
The direct download URL to the resource pack.
|
||||
|
||||
> [!TIP]
|
||||
> You can host the resource pack for free at [MCPacks](https://mc-packs.net/).
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[resource_pack]
|
||||
enabled = true
|
||||
resource_pack_url = "[your download URL here]"
|
||||
```
|
||||
:::
|
||||
|
||||
#### `resource_pack_sha1`: String
|
||||
The hash of the resource pack, using the SHA1 algorithm.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Although not required to specify, you should specify this field because the client will otherwise redownload the resource pack every time they join the server, even if there are no changes to the resource pack.
|
||||
|
||||
> [!WARNING]
|
||||
> Make sure to update this field if the resource pack is modified.
|
||||
|
||||
::: details How do I get the SHA1 hash of my resource pack?
|
||||
::: code-group
|
||||
```powershell [Windows (PowerShell)]
|
||||
Get-FileHash [file] SHA1
|
||||
```
|
||||
```shell [Mac OS]
|
||||
shasum -a 1 [file]
|
||||
```
|
||||
```shell [Linux]
|
||||
sha1sum [file]
|
||||
```
|
||||
:::
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[resource_pack]
|
||||
enabled = true
|
||||
resource_pack_sha1 = "[your hash here]"
|
||||
```
|
||||
:::
|
||||
|
||||
#### `prompt_message`: String
|
||||
The message to show to the user when prompted to download the resource pack.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[resource_pack]
|
||||
enabled = true
|
||||
prompt_message = "[your message here]"
|
||||
```
|
||||
:::
|
||||
|
||||
#### `force`: Boolean
|
||||
Whether to force the client to download the resource pack or not. If the client declines the download, they will be kicked from the server.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml] {3}
|
||||
[resource_pack]
|
||||
enabled = true
|
||||
force = false
|
||||
```
|
||||
:::
|
||||
|
||||
## Default Config
|
||||
By default, resource pack is disabled.
|
||||
|
||||
:::code-group
|
||||
```toml [features.toml]
|
||||
[resource_pack]
|
||||
enabled = false
|
||||
resource_pack_url = ""
|
||||
resource_pack_sha1 = ""
|
||||
prompt_message = ""
|
||||
force = false
|
||||
```
|
||||
:::
|
||||
68
docs/developer/authentication.md
Normal file
68
docs/developer/authentication.md
Normal file
@ -0,0 +1,68 @@
|
||||
### Authentication
|
||||
|
||||
### Why Authentication
|
||||
|
||||
Minecraft is the most popular game out there and is very easy to play without paying for it. In fact, you don't pay for the game; you pay for a Minecraft account. People who don't buy the game but play it online are using [Cracked Accounts](#cracked-accounts).
|
||||
|
||||
#### Cracked Accounts
|
||||
|
||||
- Don't cost any money.
|
||||
- Everyone can set their own nickname.
|
||||
- Have no UUID.
|
||||
- Have no skin/cape.
|
||||
- Not secure.
|
||||
|
||||
The problem is that everyone can name themselves however they want, which allows them to join the server as a staff member, for example, and have extended permissions. Cracked accounts are also often used for botting and [Denial of Service](https://en.wikipedia.org/wiki/Denial-of-service_attack) attacks.
|
||||
|
||||
### Cracked Server
|
||||
|
||||
By default, `online_mode` is enabled in the configuration. This enables authentication, disabling [Cracked Accounts](#cracked-accounts). If you want to allow cracked accounts, you can disable `online_mode` in the `configuration.toml`.
|
||||
|
||||
### How Mojang Authentication Works
|
||||
|
||||
To ensure a player has a premium account:
|
||||
|
||||
1. A client with a premium account sends a login request to the Mojang session server.
|
||||
2. **Mojang's servers** verify the client's credentials and add the player to their servers.
|
||||
3. Our server sends a request to the session servers to check if the player has joined the session server.
|
||||
4. If the request is successful, it will provide more information about the player (e.g., UUID, name, skin/cape...).
|
||||
|
||||
### Custom Authentication Server
|
||||
|
||||
Pumpkin does support custom authentication servers. You can replace the authentication URL in `features.toml`.
|
||||
|
||||
#### How Pumpkin Authentication Works
|
||||
|
||||
1. **GET Request:** Pumpkin sends a GET request to the specified authentication URL.
|
||||
2. **Status Code 200:** If the authentication is successful, the server responds with a status code of 200.
|
||||
3. **Parse JSON Game Profile:** Pumpkin parses the JSON game profile returned in the response.
|
||||
|
||||
#### Game Profile
|
||||
|
||||
```rust
|
||||
struct GameProfile {
|
||||
id: UUID,
|
||||
name: String,
|
||||
properties: Vec<Property>,
|
||||
profile_actions: Option<Vec<ProfileAction>>, // Optional, only present when actions are applied
|
||||
}
|
||||
```
|
||||
|
||||
##### Property
|
||||
|
||||
```rust
|
||||
struct Property {
|
||||
name: String,
|
||||
value: String, // Base64 encoded
|
||||
signature: Option<String>, // Optional, Base64 encoded
|
||||
}
|
||||
```
|
||||
|
||||
##### Profile Action
|
||||
|
||||
```rust
|
||||
enum ProfileAction {
|
||||
FORCED_NAME_CHANGE,
|
||||
USING_BANNED_SKIN,
|
||||
}
|
||||
```
|
||||
53
docs/developer/contributing.md
Normal file
53
docs/developer/contributing.md
Normal file
@ -0,0 +1,53 @@
|
||||
### Contributing to Pumpkin
|
||||
We appreciate your interest in contributing to Pumpkin! This document outlines the guidelines for submitting bug reports, feature suggestions, and code changes.
|
||||
|
||||
### Getting Started
|
||||
The easiest way to get started is by asking for help in our [discord](https://discord.gg/wT8XjrjKkf).
|
||||
|
||||
### How to Contribute
|
||||
There are several ways you can contribute to Pumpkin:
|
||||
|
||||
#### Reporting Bugs
|
||||
If you encounter a bug, please search for existing issues on the issue tracker first.
|
||||
|
||||
If you can't find a duplicate issue, open a new one.
|
||||
|
||||
Follow the template and provide a clear description of the bug, including steps to reproduce it if possible.
|
||||
Screenshots, logs, or code snippets can also be helpful.
|
||||
|
||||
#### Suggesting Features
|
||||
Do you have an idea on how Pumpkin can be improved? Share your thoughts by opening an issue on the issue tracker.
|
||||
|
||||
Describe the proposed feature in detail, including its benefits and potential implementation considerations.
|
||||
|
||||
#### Contributing Code
|
||||
To get started with contributing code to Pumpkin, fork the repository on github
|
||||
|
||||
- First create a github account if you don't already have one
|
||||
|
||||
- Go to Pumpkin's Official [Github Repository](https://github.com/Snowiiii/Pumpkin) and press fork
|
||||
|
||||
> Creating a fork means you now have your own copy of the Pumpkin source code, (this does not mean you own the copyright)
|
||||
|
||||
Now that you have a copy that you can edit, you will need a few tools
|
||||
|
||||
- Install [git](https://git-scm.com/downloads) for your operating system
|
||||
|
||||
- To get started with git, visit [Getting started with Git](https://docs.github.com/en/get-started/getting-started-with-git)
|
||||
|
||||
- Optional: If you want a graphical tool to interact with Github, install [Github-Desktop](https://desktop.github.com/download/)
|
||||
|
||||
> Github Desktop may be easier if you are not used to the command line, but it is not for everyone
|
||||
|
||||
- To get started with Github Desktop, visit [Getting started with GitHub Desktop](https://docs.github.com/en/desktop/overview/getting-started-with-github-desktop)
|
||||
|
||||
- If you are wanting to contribute code, install Rust at [rust-lang.org](https://www.rust-lang.org/).
|
||||
|
||||
- If you are wanting to contribute to documentation, install [NodeJS](https://nodejs.org/en)
|
||||
|
||||
### Additional Information
|
||||
We encourage you to comment on existing issues and pull requests to share your thoughts and provide feedback.
|
||||
|
||||
Feel free to ask questions in the issue tracker or reach out to the project maintainers if you need assistance.
|
||||
|
||||
Before submitting a large contribution, consider opening an issue, discussion or talk with us on our discord to discuss your approach.
|
||||
8
docs/developer/introduction.md
Normal file
8
docs/developer/introduction.md
Normal file
@ -0,0 +1,8 @@
|
||||
### Introduction
|
||||
|
||||
Welcome to the Pumpkin Documentation!
|
||||
|
||||
Whether you're an internal Pumpkin developer or working on a Pumpkin plugin, this documentation is your resource for everything Pumpkin.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> While Pumpkin currently doesn't have plugin support yet, this documentation provides valuable insights into the platform's architecture and functionality, which can be helpful for understanding how to create potential future plugins.
|
||||
270
docs/developer/networking.md
Normal file
270
docs/developer/networking.md
Normal file
@ -0,0 +1,270 @@
|
||||
### Networking
|
||||
|
||||
Most of the Networking code in Pumpkin can be found at [Pumpkin-Protocol](https://github.com/Snowiiii/Pumpkin/tree/master/pumpkin-protocol)
|
||||
|
||||
Serverbound: Client→Server
|
||||
|
||||
Clientbound: Server→Client
|
||||
|
||||
### Structure
|
||||
|
||||
Packets in the Pumpkin protocol are organized by functionality and state.
|
||||
|
||||
`server`: Contains definitions for serverbound packets.
|
||||
|
||||
`client`: Contains definitions for clientbound packets.
|
||||
|
||||
### States
|
||||
|
||||
**Handshake**: Always the first packet being sent from the Client. This also determines the next state, usually to indicate if the player wants to perform a Status Request, join the server or wants to be transferred.
|
||||
|
||||
**Status**: Indicates the Client wants to see a Status response (MOTD).
|
||||
|
||||
**Login**: The Login sequence. Indicates the Client wants to join to the Server.
|
||||
|
||||
**Config**: A sequence of Configuration packets is mostly sent from the Server to the Client. (Features, Resource Pack, Server Links, etc.)
|
||||
|
||||
**Play**: The final state, which indicates the Player is now ready to join, is also used to handle all other Gameplay packets.
|
||||
|
||||
### Minecraft Protocol
|
||||
|
||||
You can find all Minecraft Java packets at https://wiki.vg/Protocol. There you also can see in which [State](#States) they are.
|
||||
You can also can see all the information the Packets have, which we can either Write or Read depending on whether they are Serverbound or Clientbound.
|
||||
|
||||
### Adding a Clientbound Packet
|
||||
|
||||
1. Adding a Packet is easy. First, you have to derive serde Serialize for packets.
|
||||
|
||||
```rust
|
||||
#[derive(Serialize)]
|
||||
```
|
||||
|
||||
2. Next, you have set the packet using the client_packet macro, This uses the Packet ID automatically sets the Packet ID from the JSON packets file
|
||||
|
||||
```rust
|
||||
#[client_packet("play:disconnect")]
|
||||
```
|
||||
|
||||
3. Now you can create the Struct.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Please start the Packet name with "C" for Clientbound.
|
||||
> Also please add the State to the packet if its a Packet sent in multiple States, For example there are 3 Disconnect Packets.
|
||||
>
|
||||
> - CLoginDisconnect
|
||||
> - CConfigDisconnect
|
||||
> - CPlayDisconnect
|
||||
|
||||
Create fields within your packet structure to represent the data that will be sent to the client.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Use descriptive field names and appropriate data types.
|
||||
|
||||
Example:
|
||||
|
||||
```rust
|
||||
pub struct CPlayDisconnect {
|
||||
reason: TextComponent,
|
||||
more fields...
|
||||
}
|
||||
```
|
||||
|
||||
4. Also don't forgot to impl a new function for Clientbound Packets so we can actually send them by putting in the values.
|
||||
|
||||
Example:
|
||||
|
||||
```rust
|
||||
impl CPlayDisconnect {
|
||||
pub fn new(reason: TextComponent) -> Self {
|
||||
Self { reason }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
5. In the end, everything should come together.
|
||||
|
||||
```rust
|
||||
#[derive(Serialize)]
|
||||
#[client_packet("play:disconnect")]
|
||||
pub struct CPlayDisconnect {
|
||||
reason: TextComponent,
|
||||
}
|
||||
|
||||
impl CPlayDisconnect {
|
||||
pub fn new(reason: TextComponent) -> Self {
|
||||
Self { reason }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
6. You can also Serialize the Packet manually, which can be useful if the Packet is more complex.
|
||||
|
||||
```diff
|
||||
-#[derive(Serialize)]
|
||||
|
||||
+ impl ClientPacket for CPlayDisconnect {
|
||||
+ fn write(&self, bytebuf: &mut BytesMut) {
|
||||
+ bytebuf.put_slice(&self.reason.encode());
|
||||
+ }
|
||||
```
|
||||
|
||||
7. You can now send the Packet. See [Sending Packets](#sending-packets)
|
||||
|
||||
### Adding a Serverbound Packet
|
||||
|
||||
1. Adding a Packet is easy. First, you have to derive serde Deserialize for packets. You should also use the `server_packet` macro to automatically parse the Packet ID
|
||||
|
||||
```rust
|
||||
#[derive(Deserialize)]
|
||||
#[server_packet("login:move_player_pos")]
|
||||
```
|
||||
|
||||
2. Now you can create the Struct.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Please start the Packet name with "S" for Serverbound.
|
||||
> Also please add the State to the packet if its a Packet sent in multiple States.
|
||||
|
||||
Create fields within your packet structure to represent the data that will be sent to the client.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Use descriptive field names and appropriate data types.
|
||||
|
||||
Example:
|
||||
|
||||
```rust
|
||||
pub struct SPlayerPosition {
|
||||
pub x: f64,
|
||||
pub feet_y: f64,
|
||||
pub z: f64,
|
||||
pub ground: bool,
|
||||
}
|
||||
```
|
||||
|
||||
3. In the end, everything should come together.
|
||||
|
||||
```rust
|
||||
#[derive(Deserialize)]
|
||||
#[server_packet("login:move_player_pos")]
|
||||
pub struct SPlayerPosition {
|
||||
pub x: f64,
|
||||
pub feet_y: f64,
|
||||
pub z: f64,
|
||||
pub ground: bool,
|
||||
}
|
||||
```
|
||||
|
||||
4. You can also Deserialize the Packet manually, which can be useful if the Packet is more complex
|
||||
|
||||
```diff
|
||||
-#[derive(Deserialize)]
|
||||
|
||||
+ impl ServerPacket for SPlayerPosition {
|
||||
+ fn read(bytebuf: &mut Bytes) -> Result<Self, ReadingError> {
|
||||
+ Ok(Self {
|
||||
+ x: bytebuf.try_get_f64()?,
|
||||
+ feet_y: bytebuf.try_get_f64()?,
|
||||
+ z: bytebuf.try_get_f64()?,
|
||||
+ ground: bytebuf.try_get_bool()?,
|
||||
+ })
|
||||
+ }
|
||||
```
|
||||
|
||||
5. You can listen for the Packet. See [Receive Packets](#receiving-packets)
|
||||
|
||||
### Client
|
||||
|
||||
Pumpkin has stores Client and Players separately. Everything that is not in the Play State is a Simple Client. Here are the Differences
|
||||
|
||||
**Client**
|
||||
|
||||
- Can only be in Status/Login/Transfer/Config State
|
||||
- Is not a living entity
|
||||
- Has small resource consumption
|
||||
|
||||
**Player**
|
||||
|
||||
- Can only be in Play State
|
||||
- Is a living entity in a world
|
||||
- Has more data, Consumes more resources
|
||||
|
||||
#### Sending Packets
|
||||
|
||||
Example:
|
||||
|
||||
```rust
|
||||
// Works only in Status State
|
||||
client.send_packet(&CStatusResponse::new("{ description: "A Description"}"));
|
||||
```
|
||||
|
||||
#### Receiving Packets
|
||||
|
||||
For Clients:
|
||||
`src/client/mod.rs`
|
||||
|
||||
```diff
|
||||
// Put the Packet into the right State
|
||||
fn handle_mystate_packet(
|
||||
&self,
|
||||
server: &Arc<Server>,
|
||||
packet: &mut RawPacket,
|
||||
) -> Result<(), ReadingError> {
|
||||
let bytebuf = &mut packet.bytebuf;
|
||||
match packet.id.0 {
|
||||
SStatusRequest::PACKET_ID => {
|
||||
self.handle_status_request(server, SStatusRequest::read(bytebuf)?)
|
||||
.await;
|
||||
}
|
||||
+ MyPacket::PACKET_ID => {
|
||||
+ self.handle_my_packet(MyPacket::read(bytebuf)?)
|
||||
+ .await;
|
||||
}
|
||||
_ => {
|
||||
log::error!(
|
||||
"Failed to handle packet id {} while in ... state",
|
||||
packet.id.0
|
||||
);
|
||||
}
|
||||
};
|
||||
Ok(())
|
||||
}
|
||||
```
|
||||
|
||||
For Players:
|
||||
`src/entity/player.rs`
|
||||
|
||||
```diff
|
||||
// Players only have Play State
|
||||
fn handle_play_packet(
|
||||
&self,
|
||||
server: &Arc<Server>,
|
||||
packet: &mut RawPacket,
|
||||
) -> Result<(), ReadingError> {
|
||||
let bytebuf = &mut packet.bytebuf;
|
||||
match packet.id.0 {
|
||||
SChatMessage::PACKET_ID => {
|
||||
self.handle_chat_message(SChatMessage::read(bytebuf)?).await;
|
||||
}
|
||||
MyPacket::PACKET_ID => {
|
||||
+ self.handle_mypacket(server, MyPacket::read(bytebuf)?).await;
|
||||
}
|
||||
_ => {
|
||||
log::error!(
|
||||
"Failed to handle packet id {} while in ... state",
|
||||
packet.id.0
|
||||
);
|
||||
}
|
||||
};
|
||||
Ok(())
|
||||
}
|
||||
```
|
||||
|
||||
### Compression
|
||||
|
||||
Minecraft Packets **can** use the ZLib compression for decoding/encoding. There is usually a threshold set when compression is applied, this most often affects Chunk Packets.
|
||||
|
||||
### Porting
|
||||
|
||||
To port to a new minecraft version, you can compare difference in Protocol on [wiki.vg](https://wiki.vg/index.php?title=Protocol&action=history)
|
||||
|
||||
Also change the `CURRENT_MC_PROTOCOL` in `src/lib.rs`
|
||||
64
docs/developer/rcon.md
Normal file
64
docs/developer/rcon.md
Normal file
@ -0,0 +1,64 @@
|
||||
### RCON
|
||||
|
||||
### What is RCON
|
||||
|
||||
RCON (Remote Console) is a protocol designed by Valve to allow administrators to control and manage game servers remotely. It provides a way to execute commands on a server from a different location, such as a phone or a separate computer.
|
||||
|
||||
### Why RCON
|
||||
|
||||
- **Convenience:** Manage your server from anywhere with an internet connection.
|
||||
- **Flexibility:** Execute commands without needing to be physically present at the server's location.
|
||||
- **Efficiency:** Automate tasks and streamline server management.
|
||||
|
||||
### SSH vs RCON
|
||||
|
||||
**SSH**
|
||||
|
||||
- Offers strong encryption to protect data transmitted between the client and server.
|
||||
- Primarily designed for secure remote login and execution of commands on a remote machine.
|
||||
- Commonly used for managing Linux/Unix systems, configuring networks, and running scripts.
|
||||
- Provides a shell-like environment, allowing you to execute various commands and interact with the remote system.
|
||||
|
||||
**RCON**
|
||||
|
||||
- Specifically designed for remote administration of game servers, allowing you to control and manage the server's settings and operations.
|
||||
- Typically less secure than SSH, as it often relies on plain text passwords.
|
||||
- Primarily used by game server administrators to manage game servers.
|
||||
- Has a limited set of game-specific commands.
|
||||
|
||||
### Packets
|
||||
|
||||
RCON is a very simple protocol with a few packets. Here's how an RCON packet looks:
|
||||
|
||||
| Field | Description |
|
||||
| ----- | ----------------------------------------------- |
|
||||
| ID | Used to indicate whether authentication failed or succeeded |
|
||||
| Type | Identifies the packet type |
|
||||
| Body | A message (String), e.g., a command or a password |
|
||||
|
||||
#### Server Bound Packets <sub><sub>(Client→Server)</sub></sub>
|
||||
|
||||
| Type | Packet |
|
||||
| ---- | ----------- |
|
||||
| 2 | Auth |
|
||||
| 3 | ExecCommand |
|
||||
|
||||
#### Client Bound Packets <sub><sub>(Server→Client)</sub></sub>
|
||||
|
||||
| Type | Packet |
|
||||
| ---- | ------------ |
|
||||
| 2 | AuthResponse |
|
||||
| 0 | Output |
|
||||
|
||||
### How RCON Works
|
||||
|
||||
1. **Authentication:**
|
||||
|
||||
- The RCON client sends an authentication packet with the desired password.
|
||||
- The server verifies the password and responds with an authentication response packet.
|
||||
- If successful, the response packet includes the same ID as the one sent by the client. If unsuccessful, the ID is -1.
|
||||
|
||||
2. **Command Execution:**
|
||||
|
||||
- The authenticated client can now send command execution packets, with each packet containing the command to be executed.
|
||||
- The server processes the command and sends back an output packet containing the result or any error messages.
|
||||
87
docs/developer/world.md
Normal file
87
docs/developer/world.md
Normal file
@ -0,0 +1,87 @@
|
||||
### World Formats
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Currently, Pumpkin only supports Anvil World Format, which is the format used by vanilla
|
||||
> Minecraft. There is planned support for other world formats in the future though, as listed below.
|
||||
|
||||
#### Region File Format
|
||||
|
||||
Minecraft Beta 1.3 to Release 1.2 used a Minecraft format known as "Region file format".
|
||||
|
||||
The files stored in this format are .mcr files, each storing a group of 32x32 chunks called a region.
|
||||
|
||||
More details can be found on the [Minecraft Wiki](https://minecraft.wiki/w/Region_file_format).
|
||||
|
||||
#### Anvil File Format
|
||||
|
||||
Replacing the Region File Format after Minecraft Release 1.2, this is the file format used to store modern vanilla Java Minecraft worlds.
|
||||
|
||||
The files stored in this format are .mca files, while using the same region logic, there were a number of changes. The notable changes include an increase
|
||||
to a 256 height limit, then to 320, as well as a higher number of block ID's.
|
||||
|
||||
More details can be found on the [Minecraft Wiki](https://minecraft.wiki/w/Anvil_file_format).
|
||||
|
||||
#### Linear File Format
|
||||
|
||||
There is a more modern file format known as the Linear region file format. Saving on disk space and using the zstd library instead of zlib. This is beneficial as zlib is extremely old and
|
||||
outdated.
|
||||
|
||||
The files stored in this format are .linear files, and it says about 50% of disk space in the Overworld and Nether, while saving 95% in the end.
|
||||
|
||||
More details can be found at the github page for [LinearRegionFileFormatTools](https://github.com/xymb-endcrystalme/LinearRegionFileFormatTools).
|
||||
|
||||
#### Slime File Format
|
||||
|
||||
Developed by Hypixel to fix many of the pitfalls of the Anvil file format, Slime also replaces zlib and saves space compared to Anvil, in addition to saving the entire world in a single save
|
||||
file, and allowing that file to be loaded into multiple instances.
|
||||
|
||||
The files stored in this format are .slime files.
|
||||
|
||||
More details can be found on the github page for [Slime World Manager](https://github.com/cijaaimee/Slime-World-Manager#:~:text=Slime%20World%20Manager%20is%20a,worlds%20faster%20and%20save%20space.), as well as on [Dev Blog #5](https://hypixel.net/threads/dev-blog-5-storing-your-skyblock-island.2190753/) for Hypixel.
|
||||
|
||||
#### Schematic File Format
|
||||
|
||||
Unlike the other File Formats listed, the Schematic File Format is not for storing minecraft worlds, but instead for use within 3rd party programs such as MCEdit, WorldEdit, and Schematica.
|
||||
|
||||
The files stored in this format are .schematic files, and are stored in NBT format.
|
||||
|
||||
More details can be found on the [Minecraft Wiki](https://minecraft.wiki/w/Schematic_file_format)
|
||||
|
||||
### World Generation
|
||||
|
||||
When the server is starting up, it checks if there is a save present, also known as the "world"
|
||||
|
||||
Pumpkin then calls for World Generation:
|
||||
|
||||
#### Save Present
|
||||
|
||||
AnvilChunkReader is called to process the region files for the given save
|
||||
|
||||
- As stated above, region files store 32x32 chunks
|
||||
> Each region file is named corresponding to coordinates of where it is in the world
|
||||
|
||||
> r.{}.{}.mca
|
||||
|
||||
- The location table is read from the save file, representing the chunk coordinates
|
||||
- The timestamp table is read from the save file, representing the last time the chunk was modified
|
||||
|
||||
#### No Save Present
|
||||
|
||||
The world seed is set to "0", in the future it will be set to the value in Basic Configuration
|
||||
|
||||
PlainsGenerator is called, as so far the plains is the only biome that has been implemented.
|
||||
|
||||
- PerlinTerrainGenerator is called to set chunk height
|
||||
- Stone height is set 5 below chunk height
|
||||
- Dirt height is set to 2 below chunk height
|
||||
- Grass Blocks appear at the top of dirt
|
||||
- Bedrock is set at y = -64
|
||||
- Flowers and short grass are scattered about randomly
|
||||
|
||||
SuperflatGenerator is also available, but is not currently callable.
|
||||
|
||||
- Bedrock is set at y = -64
|
||||
- Dirt is set two blocks up
|
||||
- Grass Block is set one more block up
|
||||
|
||||
Blocks are able to be placed and broken, but changes are not able to be saved in any world format. Anvil worlds are currently read only.
|
||||
34
docs/index.md
Normal file
34
docs/index.md
Normal file
@ -0,0 +1,34 @@
|
||||
---
|
||||
# https://vitepress.dev/reference/default-theme-home-page
|
||||
layout: home
|
||||
|
||||
hero:
|
||||
name: 'Pumpkin'
|
||||
text: 'Minecraft Server'
|
||||
tagline: Empowering everyone to host fast and efficient Minecraft servers
|
||||
image:
|
||||
src: /assets/icon.png
|
||||
alt: Pumpkin
|
||||
actions:
|
||||
- theme: brand
|
||||
text: Quick Start
|
||||
link: /about/quick-start
|
||||
- theme: alt
|
||||
text: Configuration
|
||||
link: /config/introduction
|
||||
- theme: alt
|
||||
text: For developers
|
||||
link: /developer/introduction
|
||||
|
||||
features:
|
||||
# Need to add the svg here instead of using src because then it won't have the box around it
|
||||
- icon: <svg xmlns="http://www.w3.org/2000/svg" viewBox="-20 -20 146 146"><g transform="translate(53 53)"><path stroke="#000" stroke-linejoin="round" d="M-8.5-14.5h13c8 0 8 8 0 8h-13Zm-31 37h40v-11h-9v-8h10c11 0 5 19 14 19h25v-19h-6v2c0 8-9 7-10 2s-5-9-6-9c15-8 6-24-6-24h-47v11h10v26h-15Z"/><g mask="url(#a)"><circle r="43" fill="none" stroke="#000" stroke-width="9"/><path id="b" stroke="#000" stroke-linejoin="round" stroke-width="3" d="m46 3 5-3-5-3z"/><use href="#b" transform="rotate(11.3)"/><use href="#b" transform="rotate(22.5)"/><use href="#b" transform="rotate(33.8)"/><use href="#b" transform="rotate(45)"/><use href="#b" transform="rotate(56.3)"/><use href="#b" transform="rotate(67.5)"/><use href="#b" transform="rotate(78.8)"/><use href="#b" transform="rotate(90)"/><use href="#b" transform="rotate(101.3)"/><use href="#b" transform="rotate(112.5)"/><use href="#b" transform="rotate(123.8)"/><use href="#b" transform="rotate(135)"/><use href="#b" transform="rotate(146.3)"/><use href="#b" transform="rotate(157.5)"/><use href="#b" transform="rotate(168.8)"/><use href="#b" transform="rotate(180)"/><use href="#b" transform="rotate(191.3)"/><use href="#b" transform="rotate(202.5)"/><use href="#b" transform="rotate(213.8)"/><use href="#b" transform="rotate(225)"/><use href="#b" transform="rotate(236.3)"/><use href="#b" transform="rotate(247.5)"/><use href="#b" transform="rotate(258.8)"/><use href="#b" transform="rotate(270)"/><use href="#b" transform="rotate(281.3)"/><use href="#b" transform="rotate(292.5)"/><use href="#b" transform="rotate(303.8)"/><use href="#b" transform="rotate(315)"/><use href="#b" transform="rotate(326.3)"/><use href="#b" transform="rotate(337.5)"/><use href="#b" transform="rotate(348.8)"/><path id="c" stroke="#000" stroke-linejoin="round" stroke-width="6" d="m-7-42 7 7 7-7z"/><use href="#c" transform="rotate(72)"/><use href="#c" transform="rotate(144)"/><use href="#c" transform="rotate(216)"/><use href="#c" transform="rotate(288)"/></g><mask id="a"><path fill="#fff" d="M-60-60H60V60H-60z"/><circle id="d" cy="-40" r="3"/><use href="#d" transform="rotate(72)"/><use href="#d" transform="rotate(144)"/><use href="#d" transform="rotate(216)"/><use href="#d" transform="rotate(288)"/></mask></g></svg>
|
||||
title: Written in Rust
|
||||
details: Pumpkin is written 100% in Rust, ensuring memory safety and unmatched performance.
|
||||
- icon: 📋
|
||||
title: Feature complete
|
||||
details: With all vanilla features supported, you will have no issues.
|
||||
- icon: ⚙️
|
||||
title: Flexibility
|
||||
details: Highly configurable, with the ability to disable unnecessary features.
|
||||
---
|
||||
BIN
docs/public/assets/favicon.ico
Normal file
BIN
docs/public/assets/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
BIN
docs/public/assets/icon.png
Normal file
BIN
docs/public/assets/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 836 KiB |
9
docs/troubleshooting/common_issues.md
Normal file
9
docs/troubleshooting/common_issues.md
Normal file
@ -0,0 +1,9 @@
|
||||
### Common Issues
|
||||
|
||||
1. ### Failed to verify username
|
||||
|
||||
**Issue:** Some players reported having issues logging into the Server, including a "Failed to verify username" error.
|
||||
|
||||
**Cause:** This has to do with Authentication, Usually with the prevent proxy connections setting.
|
||||
|
||||
**Fix:** Disable `prevent_proxy_connections` in `features.toml`
|
||||
2462
package-lock.json
generated
Normal file
2462
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
11
package.json
Normal file
11
package.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"scripts": {
|
||||
"docs:dev": "vitepress dev docs",
|
||||
"docs:build": "vitepress build docs",
|
||||
"docs:preview": "vitepress preview docs"
|
||||
},
|
||||
"devDependencies": {
|
||||
"vitepress": "^1.5.0",
|
||||
"vue": "^3.5.13"
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user