Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
build/
run/
.architectury-transformer
.gradle

.idea/
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ A battery packed, multi-platform plugin template for Minecraft servers to get yo
- [Cloud](https://github.com/Incendo/cloud) for platform-agnostic command registration and handling.
- [Configurate](https://github.com/SpongePowered/Configurate) for cross-platform configuration.

Currently supporting Bukkit, Bungeecord, Paper and Velocity.
Currently supporting Bukkit, Bungeecord, Fabric, NeoForge, Paper and Velocity.

## License
This project is licensed under the [CC0 1.0 Universal](https://github.com/RealTriassic/plugin-template/blob/main/LICENSE) license, meaning you are free to use this project however you like, including changing the license for your own projects.
18 changes: 18 additions & 0 deletions bootstrap/mod/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
plugins {
id("architectury-plugin")
id("dev.architectury.loom") version "1.11-SNAPSHOT"
}

architectury {
minecraft = "1.21.8"
common("fabric", "neoforge")
}

loom {
silentMojangMappingsLicense()
}

dependencies {
minecraft("net.minecraft:minecraft:1.21.8")
mappings(loom.officialMojangMappings())
}
34 changes: 34 additions & 0 deletions bootstrap/mod/fabric/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
plugins {
id("dev.architectury.loom") version "1.11-SNAPSHOT"
id("architectury-plugin")
id("conventions.modded")
}

architectury {
platformSetupLoomIde()
fabric()
}

dependencies {
minecraft("net.minecraft:minecraft:1.21.8")
mappings(loom.officialMojangMappings())
modImplementation("net.fabricmc:fabric-loader:0.17.2")
modImplementation(libs.adventure.api)
include(libs.adventure.api)
modImplementation(libs.adventure.minimessage)
include(libs.adventure.minimessage)
include(libs.adventure.fabric)
modImplementation(libs.adventure.fabric)
include(libs.cloud.fabric)
modImplementation(libs.cloud.fabric)
shade(project(mapOf("path" to ":core", "configuration" to "shadow")))
}

relocate("org.spongepowered")

tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
exclude("org/incendo/cloud/**")
exclude("META-INF/services/org.incendo.cloud.*")
exclude("org/slf4j/**")
relocate("io.leangen.geantyref", "dev.triassic.template.lib.geantyref")
}
1 change: 1 addition & 0 deletions bootstrap/mod/fabric/gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
loom.platform=fabric
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* SPDX-License-Identifier: CC0-1.0
*
* Dedicated to the public domain under CC0 1.0 Universal.
*
* You can obtain a full copy of the license at:
* https://creativecommons.org/publicdomain/zero/1.0/
*/

package dev.triassic.template.mod.fabric;

import dev.triassic.template.TemplateImpl;
import dev.triassic.template.TemplatePlugin;
import dev.triassic.template.command.Commander;
import dev.triassic.template.mod.fabric.command.FabricCommander;
import dev.triassic.template.util.PlatformType;
import java.nio.file.Path;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.loader.api.FabricLoader;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.incendo.cloud.CommandManager;
import org.incendo.cloud.SenderMapper;
import org.incendo.cloud.execution.ExecutionCoordinator;
import org.incendo.cloud.fabric.FabricServerCommandManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* hey!!!.
*/
public final class FabricTemplateMod implements ModInitializer, TemplatePlugin {

private Logger logger;
private FabricServerCommandManager<Commander> commandManager;
private TemplateImpl impl;

@Override
public void onInitialize() {
this.logger = LoggerFactory.getLogger(FabricTemplateMod.class);
this.commandManager = new FabricServerCommandManager<>(
ExecutionCoordinator.simpleCoordinator(),
SenderMapper.create(
FabricCommander::from,
commander -> ((FabricCommander) commander).source()
)
);

this.impl = new TemplateImpl(this);
impl.initialize();
}

@Override
public @NonNull Logger logger() {
return logger;
}

@Override
public @NonNull Path dataDirectory() {
return FabricLoader.getInstance().getConfigDir();
}

@Override
public @NonNull PlatformType platformType() {
return PlatformType.FABRIC;
}

@Override
public @NonNull CommandManager<Commander> commandManager() {
return this.commandManager;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* SPDX-License-Identifier: CC0-1.0
*
* Dedicated to the public domain under CC0 1.0 Universal.
*
* You can obtain a full copy of the license at:
* https://creativecommons.org/publicdomain/zero/1.0/
*/

package dev.triassic.template.mod.fabric.command;

import dev.triassic.template.command.Commander;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.audience.ForwardingAudience;
import net.minecraft.commands.CommandSourceStack;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.framework.qual.DefaultQualifier;

/**
* Represents a Fabric-specific {@link Commander}.
*
* <p>Slightly borrowed from <a href="https://github.com/Hexaoxide/Carbon">Carbon's</a> implementation.</p>
*/
@DefaultQualifier(NonNull.class)
public interface FabricCommander extends Commander, ForwardingAudience.Single {

/**
* Create a new {@link FabricCommander} from a {@link CommandSourceStack}.
*
* @param source the {@link CommandSourceStack}
* @return a new {@link FabricCommander}
*/
static FabricCommander from(final CommandSourceStack source) {
return new FabricCommanderImpl(source);
}

/**
* Gets the underlying {@link CommandSourceStack}.
*
* @return the {@link CommandSourceStack}
*/
CommandSourceStack source();

/**
* A record implementation of {@link FabricCommander}.
*/
record FabricCommanderImpl(CommandSourceStack source) implements FabricCommander {

@Override
public Audience audience() {
return source.audience();
}

@Override
public boolean hasPermission(final String permission) {
return true; // TODO: Check for permission in Fabric.
}
}
}
28 changes: 28 additions & 0 deletions bootstrap/mod/fabric/src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"schemaVersion": 1,
"id": "example_mod",
"version": "${version}",
"name": "${name}",
"description": "${description}",
"authors": [
"${author}"
],
"contact": {
"homepage": "${url}"
},
"license": "UNLICENSED",
"environment": "*",
"entrypoints": {
"main": [
"dev.triassic.template.mod.fabric.FabricTemplateMod"
],
"client": []
},
"mixins": [],
"depends": {
"fabricloader": ">=0.16.14",
"minecraft": "~1.21.8",
"java": ">=21",
"cloud": "*"
}
}
34 changes: 34 additions & 0 deletions bootstrap/mod/neoforge/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
plugins {
id("dev.architectury.loom") version "1.11-SNAPSHOT"
id("architectury-plugin")
id("conventions.modded")
}

architectury {
platformSetupLoomIde()
neoForge()
}

dependencies {
modImplementation(libs.adventure.api)
include(libs.adventure.api)
modImplementation(libs.adventure.minimessage)
include(libs.adventure.minimessage)
minecraft("net.minecraft:minecraft:1.21.8")
mappings(loom.officialMojangMappings())
neoForge("net.neoforged:neoforge:21.8.46")
include(libs.adventure.neoforge)
modImplementation(libs.adventure.neoforge)
include(libs.cloud.neoforge)
modImplementation(libs.cloud.neoforge)
shade(project(mapOf("path" to ":core", "configuration" to "shadow")))
}

relocate("org.spongepowered")

tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
exclude("org/incendo/cloud/**")
exclude("META-INF/services/org.incendo.cloud.*")
exclude("org/slf4j/**")
relocate("io.leangen.geantyref", "dev.triassic.template.lib.geantyref")
}
1 change: 1 addition & 0 deletions bootstrap/mod/neoforge/gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
loom.platform=neoforge
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/*
* SPDX-License-Identifier: CC0-1.0
*
* Dedicated to the public domain under CC0 1.0 Universal.
*
* You can obtain a full copy of the license at:
* https://creativecommons.org/publicdomain/zero/1.0/
*/

package dev.triassic.template.mod.neoforge;

import dev.triassic.template.TemplateImpl;
import dev.triassic.template.TemplatePlugin;
import dev.triassic.template.command.Commander;
import dev.triassic.template.mod.neoforge.command.NeoForgeCommander;
import dev.triassic.template.util.PlatformType;
import java.nio.file.Path;
import net.kyori.adventure.platform.modcommon.MinecraftServerAudiences;
import net.kyori.adventure.text.Component;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.loading.FMLPaths;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.server.ServerStartingEvent;
import net.neoforged.neoforge.event.server.ServerStoppedEvent;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.incendo.cloud.CommandManager;
import org.incendo.cloud.SenderMapper;
import org.incendo.cloud.execution.ExecutionCoordinator;
import org.incendo.cloud.neoforge.NeoForgeServerCommandManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Hey!!!.
*/
@Mod("example_mod")
public final class NeoForgeTemplateMod implements TemplatePlugin {

private static MinecraftServerAudiences adventure;

private final Logger logger;
private final NeoForgeServerCommandManager<Commander> commandManager;
private TemplateImpl impl;

/**
* adventure.
*
* @return adventure instance lol.0
*/
public static MinecraftServerAudiences adventure() {
MinecraftServerAudiences ret = adventure;
if (ret == null) {
throw new IllegalStateException("Tried to access Adventure without a running server!");
}
return ret;
}

/**
* hi!.
*/
public NeoForgeTemplateMod() {
NeoForge.EVENT_BUS.addListener((ServerStartingEvent e) -> {
adventure = MinecraftServerAudiences.of(e.getServer());

adventure.console().sendMessage(Component.text("Adventure is ready!"));
});

NeoForge.EVENT_BUS.addListener((ServerStoppedEvent e) -> {
impl.shutdown();
adventure = null;
});

this.logger = LoggerFactory.getLogger(NeoForgeTemplateMod.class);
System.out.println(logger);
logger.info("hihihihihihihihihihihihihihihihihihihihihihihihi");
this.commandManager = new NeoForgeServerCommandManager<>(
ExecutionCoordinator.simpleCoordinator(),
SenderMapper.create(
NeoForgeCommander::from,
commander -> ((NeoForgeCommander) commander).source()
)
);

this.impl = new TemplateImpl(this);
impl.initialize();
}

@Override
public @NonNull Logger logger() {
return logger;
}

@Override
public @NonNull Path dataDirectory() {
return FMLPaths.CONFIGDIR.get();
}

@Override
public @NonNull PlatformType platformType() {
return PlatformType.NEOFORGE;
}

@Override
public @NonNull CommandManager<Commander> commandManager() {
return this.commandManager;
}
}
Loading
Loading