Skip to content

1.18/dev #32

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 32 commits into from
Dec 5, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
0e217ed
Merge branch 'dev' into main
MaxNeedsSnacks Nov 18, 2021
a872ade
Update loom and gradle
MaxNeedsSnacks May 18, 2022
9e2c895
Quark Item Share PR (#27) (#29)
MichaelHillcox May 23, 2022
444608c
1.18/main/ Quark Item Share Ported over to 1.18 code. (#28)
X-Niter May 23, 2022
bfc2ce9
[ciskip] yeet
MichaelHillcox May 23, 2022
0a54a33
fix: arch dep
MichaelHillcox May 23, 2022
5cfa544
Merge remote-tracking branch 'origin/1.18/dev' into 1.18/dev
MaxNeedsSnacks May 23, 2022
90d97aa
Introduce changes fron #27 to 1.18
X-Niter May 23, 2022
c69fff3
Update buildscript
MaxNeedsSnacks May 23, 2022
f53bd4a
feat: add some events to the API
desht Nov 18, 2022
3a42cf5
feat: more events and commands!
desht Nov 21, 2022
3cb5a4d
feat: add /ftbranks show_rank command
desht Nov 21, 2022
bc531ec
build: version -> 1802.1.9
desht Nov 21, 2022
78933e5
fix: made arg completion for ranks work on dedicated server
desht Nov 21, 2022
1f74165
fix: another rank argument type fix, less aggressive caching
desht Nov 22, 2022
36f2cef
build: update dependencies
desht Dec 5, 2022
d7c0864
Update loom and gradle
MaxNeedsSnacks May 18, 2022
6472b09
Introduce changes fron #27 to 1.18
X-Niter May 23, 2022
cb379f5
Update buildscript
MaxNeedsSnacks May 23, 2022
1f0c0b6
feat: add some events to the API
desht Nov 18, 2022
bdeddb3
feat: more events and commands!
desht Nov 21, 2022
cc7f3ba
feat: add /ftbranks show_rank command
desht Nov 21, 2022
247d56f
build: version -> 1802.1.9
desht Nov 21, 2022
cee4635
fix: made arg completion for ranks work on dedicated server
desht Nov 21, 2022
b9c315f
fix: another rank argument type fix, less aggressive caching
desht Nov 22, 2022
868a60b
build: update dependencies
desht Dec 5, 2022
172026d
chore: update .gitignore
desht Dec 5, 2022
7f1fa3b
Merge branch '1.18/dev' of github.com:FTBTeam/FTB-Ranks into 1.18/dev
desht Dec 5, 2022
77e1435
build: update to loom 1.0 snapshot
desht Dec 5, 2022
e10c2dc
fix: did not mean to use jopt.internal.Strings there!
desht Dec 5, 2022
fe62947
fix: just stdlib string repeating, this is modern java...
desht Dec 5, 2022
259f4d1
chore: a little code cleanup
desht Dec 5, 2022
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
10 changes: 8 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,24 @@ on:
# main and dev versions for each mc ver here
- "1.18/main"
- "1.18/dev"
workflow_dispatch:
inputs:
norelease:
description: 'Do not publish'
required: true
default: 'false'

jobs:
build:
runs-on: ubuntu-latest
if: |
!contains(github.event.head_commit.message, '[ci skip]')
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
with:
fetch-depth: 30 # Gets the last 30 commits so the changelog might work
- name: Set up JDK 17
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
Expand Down
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,6 @@ logs
# other
eclipse
run
.vscode
.vscode
/.architectury-transformer/debug.log
/common/.architectury-transformer/debug.log
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Changelog
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

[1802.1.9]

### Added
* Events are now fired for other mods to consume when various things happen:
* Config reloaded with `/ftbranks reload`
* A rank is created or deleted
* Player is added to or removed from a rank
* A permission node of a rank is modified
* A rank's condition is modified
* Added `/ftbranks node <rank> <nodename> <value>` command to change a permission node's value
* Added `/ftbranks condition <rank> <condition>` command to change a rank's condition
* `<condition>` is an SNBT serialized condition e.g. `op` or `{ type "dimension", "dimension": "minecraft:the_nether" }`
* Added `/ftbrank show_rank <rank>` to display details of a rank
* Added Tab-completion for known rank names

2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
plugins {
id "architectury-plugin" version "3.4-SNAPSHOT"
id "dev.architectury.loom" version "0.11.0-SNAPSHOT" apply false
id "dev.architectury.loom" version "1.0-SNAPSHOT" apply false
}

architectury {
Expand Down
5 changes: 5 additions & 0 deletions common/src/main/java/dev/ftb/mods/ftbranks/FTBRanks.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
import dev.architectury.event.events.common.CommandRegistrationEvent;
import dev.architectury.event.events.common.LifecycleEvent;
import dev.ftb.mods.ftbranks.api.FTBRanksAPI;
import dev.ftb.mods.ftbranks.api.Rank;
import dev.ftb.mods.ftbranks.impl.FTBRanksAPIImpl;
import net.minecraft.commands.synchronization.ArgumentTypes;
import net.minecraft.commands.synchronization.EmptyArgumentSerializer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

Expand All @@ -25,5 +28,7 @@ public FTBRanks() {
CommandRegistrationEvent.EVENT.register(FTBRanksCommands::register);
// TODO: Register with LOWEST priority on forge
ChatEvent.SERVER.register(FTBRanksAPIImpl::serverChat);

ArgumentTypes.register("ftbranks:rank", RankArgumentType.class, new RankArgumentType.Serializer());
}
}
179 changes: 143 additions & 36 deletions common/src/main/java/dev/ftb/mods/ftbranks/FTBRanksCommands.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,33 @@
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
import dev.ftb.mods.ftblibrary.snbt.SNBT;
import dev.ftb.mods.ftbranks.api.FTBRanksAPI;
import dev.ftb.mods.ftbranks.api.PermissionValue;
import dev.ftb.mods.ftbranks.api.Rank;
import dev.ftb.mods.ftbranks.api.RankCondition;
import dev.ftb.mods.ftbranks.impl.BooleanPermissionValue;
import dev.ftb.mods.ftbranks.impl.FTBRanksAPIImpl;
import dev.ftb.mods.ftbranks.impl.NumberPermissionValue;
import dev.ftb.mods.ftbranks.impl.StringPermissionValue;
import dev.ftb.mods.ftbranks.impl.condition.DefaultCondition;
import net.minecraft.ChatFormatting;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.commands.arguments.EntityArgument;
import net.minecraft.commands.arguments.GameProfileArgument;
import net.minecraft.nbt.StringTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.server.level.ServerPlayer;
import org.apache.commons.lang3.math.NumberUtils;

import java.io.IOException;
import java.util.Collection;
import java.util.Collections;

/**
* @author LatvianModder
Expand All @@ -39,21 +54,21 @@ public static void register(CommandDispatcher<CommandSourceStack> dispatcher, Co
)
)
.then(Commands.literal("delete")
.then(Commands.argument("rank", StringArgumentType.word())
.executes(context -> deleteRank(context.getSource(), StringArgumentType.getString(context, "rank")))
.then(Commands.argument("rank", RankArgumentType.rank())
.executes(context -> deleteRank(context.getSource(), RankArgumentType.getRank(context, "rank")))
)
)
.then(Commands.literal("add")
.then(Commands.argument("players", GameProfileArgument.gameProfile())
.then(Commands.argument("rank", StringArgumentType.word())
.executes(context -> addRank(context.getSource(), GameProfileArgument.getGameProfiles(context, "players"), StringArgumentType.getString(context, "rank")))
.then(Commands.argument("rank", RankArgumentType.rank())
.executes(context -> addRank(context.getSource(), GameProfileArgument.getGameProfiles(context, "players"), RankArgumentType.getRank(context, "rank")))
)
)
)
.then(Commands.literal("remove")
.then(Commands.argument("players", GameProfileArgument.gameProfile())
.then(Commands.argument("rank", StringArgumentType.word())
.executes(context -> removeRank(context.getSource(), GameProfileArgument.getGameProfiles(context, "players"), StringArgumentType.getString(context, "rank")))
.then(Commands.argument("rank", RankArgumentType.rank())
.executes(context -> removeRank(context.getSource(), GameProfileArgument.getGameProfiles(context, "players"), RankArgumentType.getRank(context, "rank")))
)
)
)
Expand All @@ -63,8 +78,38 @@ public static void register(CommandDispatcher<CommandSourceStack> dispatcher, Co
)
)
.then(Commands.literal("list_players_with")
.then(Commands.argument("rank", StringArgumentType.word())
.executes(context -> listPlayersWith(context.getSource(), StringArgumentType.getString(context, "rank")))
.then(Commands.argument("rank", RankArgumentType.rank())
.executes(context -> listPlayersWith(context.getSource(), RankArgumentType.getRank(context, "rank")))
)
)
.then(Commands.literal("node")
.then(Commands.literal("add")
.then(Commands.argument("rank", RankArgumentType.rank())
.then(Commands.argument("node", StringArgumentType.word())
.then(Commands.argument("value", StringArgumentType.greedyString())
.executes(context -> setNode(context.getSource(), RankArgumentType.getRank(context, "rank"), StringArgumentType.getString(context, "node"), StringArgumentType.getString(context, "value")))
)
)
)
)
.then(Commands.literal("remove")
.then(Commands.argument("rank", RankArgumentType.rank())
.then(Commands.argument("node", StringArgumentType.word())
.executes(context -> setNode(context.getSource(), RankArgumentType.getRank(context, "rank"), StringArgumentType.getString(context, "node"), null))
)
)
)
)
.then(Commands.literal("condition")
.then(Commands.argument("rank", RankArgumentType.rank())
.then(Commands.argument("value", StringArgumentType.greedyString())
.executes(context -> setCondition(context.getSource(), RankArgumentType.getRank(context, "rank"), StringArgumentType.getString(context, "value")))
)
)
)
.then(Commands.literal("show_rank")
.then(Commands.argument("rank", RankArgumentType.rank())
.executes(context -> showRank(context.getSource(), RankArgumentType.getRank(context, "rank")))
)
)
);
Expand All @@ -77,7 +122,7 @@ private static String normalizeRankName(String name) {
private static int reloadRanks(CommandSourceStack source) {
try {
FTBRanksAPIImpl.manager.reload();
source.sendSuccess(new TextComponent("Ranks reloaded!"), true);
source.sendSuccess(new TranslatableComponent("ftbranks.reload"), true);

for (ServerPlayer p : source.getServer().getPlayerList().getPlayers()) {
source.getServer().getPlayerList().sendPlayerPermissionLevel(p);
Expand All @@ -98,12 +143,12 @@ private static int refreshReadme(CommandSourceStack source) {
ex.printStackTrace();
}

source.sendSuccess(new TextComponent("Done!"), false);
source.sendSuccess(new TranslatableComponent("ftbranks.refresh_readme"), false);
return 1;
}

private static int listAllRanks(CommandSourceStack source) {
source.sendSuccess(new TextComponent("Ranks:"), false);
source.sendSuccess(new TranslatableComponent("ftbranks.ranks"), false);

for (Rank rank : FTBRanksAPIImpl.manager.getAllRanks()) {
source.sendSuccess(new TextComponent("- " + rank.getName()).withStyle(rank.getCondition().isDefaultCondition() ? ChatFormatting.AQUA : ChatFormatting.YELLOW), false);
Expand All @@ -112,55 +157,48 @@ private static int listAllRanks(CommandSourceStack source) {
return 1;
}

private static int createRank(CommandSourceStack source, String name) throws CommandSyntaxException {
private static int createRank(CommandSourceStack source, String name) {
String id = normalizeRankName(name);

if (FTBRanksAPIImpl.manager.getRank(id).isPresent()) {
source.sendFailure(new TextComponent("Rank ID already taken!"));
source.sendFailure(new TranslatableComponent("ftbranks.rank_taken", name));
return 0;
}

FTBRanksAPIImpl.manager.createRank(id, name);
source.sendSuccess(new TextComponent("Rank created with id '" + id + "'!"), false);
source.sendSuccess(new TranslatableComponent("ftbranks.rank_created", id), false);
return 1;
}

private static int deleteRank(CommandSourceStack source, String name) throws CommandSyntaxException {
if (FTBRanksAPIImpl.manager.deleteRank(normalizeRankName(name)) == null) {
source.sendFailure(new TextComponent("Rank not found!"));
return 0;
}
private static int deleteRank(CommandSourceStack source, Rank rank) {
FTBRanksAPI.INSTANCE.getManager().deleteRank(rank.getId());
source.sendSuccess(new TranslatableComponent("ftbranks.rank_deleted", rank.getName()), false);

source.sendSuccess(new TextComponent("Rank deleted!"), false);
return 1;
}

private static int addRank(CommandSourceStack source, Collection<GameProfile> players, String name) throws CommandSyntaxException {
Rank r = FTBRanksAPIImpl.manager.getRank(normalizeRankName(name)).orElseThrow(NullPointerException::new);

private static int addRank(CommandSourceStack source, Collection<GameProfile> players, Rank rank) {
for (GameProfile profile : players) {
if (r.add(profile)) {
source.sendSuccess(new TextComponent("Added '" + r.getName() + "' to " + profile.getName()), false);
if (rank.add(profile)) {
source.sendSuccess(new TranslatableComponent("ftbranks.player_added", profile.getName(), rank.getName()), false);
}
}

return 1;
}

private static int removeRank(CommandSourceStack source, Collection<GameProfile> players, String name) throws CommandSyntaxException {
Rank r = FTBRanksAPIImpl.manager.getRank(normalizeRankName(name)).orElseThrow(NullPointerException::new);

private static int removeRank(CommandSourceStack source, Collection<GameProfile> players, Rank rank) {
for (GameProfile profile : players) {
if (r.remove(profile)) {
source.sendSuccess(new TextComponent("Removed '" + r.getName() + "' from " + profile.getName()), false);
if (rank.remove(profile)) {
source.sendSuccess(new TranslatableComponent("ftbranks.player_removed", profile.getName(), rank.getName()), false);
}
}

return 1;
}

private static int listRanksOf(CommandSourceStack source, ServerPlayer player) {
source.sendSuccess(new TextComponent("Ranks added to " + player.getGameProfile().getName() + ":"), false);
source.sendSuccess(new TranslatableComponent("ftbranks.list_ranks_of", player.getGameProfile().getName()), false);

for (Rank rank : FTBRanksAPIImpl.manager.getAllRanks()) {
if (rank.isActive(player)) {
Expand All @@ -171,17 +209,86 @@ private static int listRanksOf(CommandSourceStack source, ServerPlayer player) {
return 1;
}

private static int listPlayersWith(CommandSourceStack source, String name) {
Rank r = FTBRanksAPIImpl.manager.getRank(normalizeRankName(name)).orElseThrow(NullPointerException::new);

source.sendSuccess(new TextComponent("Players with " + name + " added to them:"), false);
private static int listPlayersWith(CommandSourceStack source, Rank rank) {
source.sendSuccess(new TranslatableComponent("ftbranks.list_players_with", rank.getName()), false);

for (ServerPlayer player : source.getServer().getPlayerList().getPlayers()) {
if (r.isActive(player)) {
if (rank.isActive(player)) {
source.sendSuccess(new TextComponent("- ").withStyle(ChatFormatting.YELLOW).append(player.getDisplayName()), false);
}
}

return 1;
}

private static int setNode(CommandSourceStack source, Rank rank, String node, String value) throws CommandSyntaxException {
try {
rank.setPermission(node, strToPermissionValue(value));
if (value != null) {
source.sendSuccess(new TranslatableComponent("ftbranks.node_added", node, rank.getPermission(node), rank), false);
} else {
source.sendSuccess(new TranslatableComponent("ftbranks.node_removed", node, rank), false);
}
} catch (IllegalArgumentException e) {
throw new SimpleCommandExceptionType(new TextComponent(e.getMessage())).create();
}

return 1;
}

private static int setCondition(CommandSourceStack source, Rank rank, String value) throws CommandSyntaxException {
try {
RankCondition condition;
if (value.equals("default") || value.equals("\"\"")) {
condition = new DefaultCondition(rank);
} else if (value.startsWith("{") || value.contains(" ")) {
condition = FTBRanksAPI.INSTANCE.getManager().createCondition(rank, SNBT.readLines(Collections.singletonList(value)));
} else {
condition = FTBRanksAPI.INSTANCE.getManager().createCondition(rank, StringTag.valueOf(value));
}
rank.setCondition(condition);
source.sendSuccess(new TranslatableComponent("ftbranks.node_added", "condition", value, rank), false);
} catch (Exception e) {
throw new SimpleCommandExceptionType(new TextComponent(e.getMessage())).create();
}

return 1;
}

private static int showRank(CommandSourceStack source, Rank rank) {
source.sendSuccess(new TextComponent("=".repeat(50)).withStyle(ChatFormatting.GREEN), false);

source.sendSuccess(new TranslatableComponent("ftbranks.show_rank.header", col(rank.getId(), ChatFormatting.WHITE), col(rank.getName(), ChatFormatting.WHITE), col(Integer.toString(rank.getPower()), ChatFormatting.WHITE)).withStyle(ChatFormatting.YELLOW), false);

String condStr = rank.getCondition().asString();
Component c = condStr.isEmpty() ?
new TranslatableComponent("ftbranks.show_rank.condition.default").withStyle(ChatFormatting.WHITE, ChatFormatting.ITALIC) :
col(condStr, ChatFormatting.WHITE);
source.sendSuccess(new TranslatableComponent("ftbranks.show_rank.condition", c).withStyle(ChatFormatting.YELLOW), false);

source.sendSuccess(new TranslatableComponent("ftbranks.show_rank.nodes").withStyle(ChatFormatting.YELLOW), false);
rank.getPermissions().stream().sorted().forEach(node ->
source.sendSuccess(new TranslatableComponent("ftbranks.show_rank.node", col(node, ChatFormatting.AQUA), rank.getPermission(node)).withStyle(ChatFormatting.WHITE), false)
);

return 0;
}

private static MutableComponent col(String str, ChatFormatting color) {
return new TextComponent(str).withStyle(color);
}

private static PermissionValue strToPermissionValue(String str) {
if (str == null) {
return null;
} else if (str.startsWith("\"") && str.endsWith("\"")) {
return StringPermissionValue.of(str.substring(1, str.length() - 1));
} if (str.equalsIgnoreCase("true") || str.equalsIgnoreCase("false")) {
return BooleanPermissionValue.of(str.equalsIgnoreCase("true"));
} else if (NumberUtils.isCreatable(str)) {
return NumberPermissionValue.of(NumberUtils.createNumber(str));
} else {
return StringPermissionValue.of(str);
}
}
}
Loading