Skip to content

1.18/dev #33

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 3 commits into from
Dec 7, 2022
Merged
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
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@ 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.10]

### Fixed
* Made Quark item linking work again in conjunction with Ranks chat formatting
* FTB Ranks is no longer incorrectly marked as a server-only mod
* As of the previous release, it is also required on the client (to support Tab-completion for ranks in commands)

[1802.1.9]

### Added
Expand Down
251 changes: 105 additions & 146 deletions common/src/main/java/dev/ftb/mods/ftbranks/impl/FTBRanksAPIImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,12 @@

import dev.architectury.event.EventResult;
import dev.architectury.event.events.common.ChatEvent;
import dev.ftb.mods.ftblibrary.util.TextComponentUtils;
import dev.ftb.mods.ftbranks.FTBRanks;
import dev.ftb.mods.ftbranks.api.FTBRanksAPI;
import dev.ftb.mods.ftbranks.api.RankManager;
import dev.ftb.mods.ftbranks.impl.condition.AlwaysActiveCondition;
import dev.ftb.mods.ftbranks.impl.condition.AndCondition;
import dev.ftb.mods.ftbranks.impl.condition.CreativeModeCondition;
import dev.ftb.mods.ftbranks.impl.condition.DimensionCondition;
import dev.ftb.mods.ftbranks.impl.condition.FakePlayerCondition;
import dev.ftb.mods.ftbranks.impl.condition.NotCondition;
import dev.ftb.mods.ftbranks.impl.condition.OPCondition;
import dev.ftb.mods.ftbranks.impl.condition.OrCondition;
import dev.ftb.mods.ftbranks.impl.condition.PlaytimeCondition;
import dev.ftb.mods.ftbranks.impl.condition.RankAddedCondition;
import dev.ftb.mods.ftbranks.impl.condition.SpawnCondition;
import dev.ftb.mods.ftbranks.impl.condition.StatCondition;
import dev.ftb.mods.ftbranks.impl.condition.XorCondition;
import dev.ftb.mods.ftbranks.impl.condition.*;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.HoverEvent;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.server.MinecraftServer;
Expand All @@ -34,134 +19,108 @@
* @author LatvianModder
*/
public class FTBRanksAPIImpl extends FTBRanksAPI {
public static RankManagerImpl manager;

@Override
public RankManager getManager() {
return manager;
}

public static void serverAboutToStart(MinecraftServer server) {
manager = new RankManagerImpl(server);
}

public static void serverStarted(MinecraftServer server) {
// manager.initCommands();

try {
manager.load();
} catch (Exception ex) {
ex.printStackTrace();
}
}

public static void serverStopped(MinecraftServer server) {
manager = null;
}

public static void worldSaved(ServerLevel event) {
if (manager != null) {
manager.saveRanksNow();
manager.savePlayersNow();
}
}

public static void serverStarting(MinecraftServer server) {
manager.registerCondition("always_active", (rank, json) -> AlwaysActiveCondition.INSTANCE);
manager.registerCondition("rank_added", RankAddedCondition::new);

manager.registerCondition("not", NotCondition::new);
manager.registerCondition("or", OrCondition::new);
manager.registerCondition("and", AndCondition::new);
manager.registerCondition("xor", XorCondition::new);

manager.registerCondition("op", (rank, tag) -> new OPCondition());
manager.registerCondition("spawn", (rank, tag) -> new SpawnCondition());
manager.registerCondition("dimension", (rank, tag) -> new DimensionCondition(tag));
manager.registerCondition("playtime", (rank, tag) -> new PlaytimeCondition(tag));
manager.registerCondition("stat", (rank, tag) -> new StatCondition(tag));
manager.registerCondition("fake_player", (rank, tag) -> new FakePlayerCondition());
manager.registerCondition("creative_mode", (rank, tag) -> new CreativeModeCondition());
}


public static EventResult serverChat(ServerPlayer player, TextFilter.FilteredText eventMessage, ChatEvent.ChatComponent component) {
String format = FTBRanksAPI.getPermissionValue(player, "ftbranks.name_format").asString().orElse("");

if (format.isEmpty()) {
return EventResult.pass();
}

TextComponent main = new TextComponent("");
TextComponent cachedNameForChat;

try {
cachedNameForChat = TextComponentParser.parse(format, s -> {
if (s.equals("name")) {
return player.getDisplayName();
}

return null;
});
} catch (Exception ex) {
String s = "Error parsing " + format + ": " + ex;
FTBRanks.LOGGER.error(s);
cachedNameForChat = new TextComponent("BrokenFormatting");
cachedNameForChat.withStyle(ChatFormatting.RED);
cachedNameForChat.setStyle(cachedNameForChat.getStyle().withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent(s))));
}

main.append(cachedNameForChat);
main.append(" ");

MutableComponent text = null;

// In the easiest case, we have the vanilla chat format,
// so we can just use the message from that.
if (component instanceof TranslatableComponent tc && tc.getKey().equals("chat.type.text") && tc.getArgs().length > 1) {
Object message = tc.getArgs()[1];
if (message instanceof Component c) {
text = c.copy();
} else {
text = new TextComponent(message.toString());
}
}

// Otherwise, fall back to parsing the message as a string and turning it back into a component.
if (text == null) {
FTBRanks.LOGGER.debug("Chat message format has been changed, fall back to parsing as string!");
FTBRanks.LOGGER.debug("Since this may break formatting, feel free to remove the `ftbranks.name_format` permission node to stop this from happening.");
text = TextComponentUtils.withLinks(eventMessage.getFiltered()).copy();
}

ChatFormatting color = ChatFormatting.getByName(FTBRanksAPI.getPermissionValue(player, "ftbranks.chat_text.color").asString().orElse(null));
if (color != null) {
text.setStyle(text.getStyle().applyFormat(color));
}

if (FTBRanksAPI.getPermissionValue(player, "ftbranks.chat_text.bold").asBooleanOrFalse()) {
text.setStyle(text.getStyle().applyFormat(ChatFormatting.BOLD));
}

if (FTBRanksAPI.getPermissionValue(player, "ftbranks.chat_text.italic").asBooleanOrFalse()) {
text.setStyle(text.getStyle().applyFormat(ChatFormatting.ITALIC));
}

if (FTBRanksAPI.getPermissionValue(player, "ftbranks.chat_text.underlined").asBooleanOrFalse()) {
text.setStyle(text.getStyle().applyFormat(ChatFormatting.UNDERLINE));
}

if (FTBRanksAPI.getPermissionValue(player, "ftbranks.chat_text.strikethrough").asBooleanOrFalse()) {
text.setStyle(text.getStyle().applyFormat(ChatFormatting.STRIKETHROUGH));
}

if (FTBRanksAPI.getPermissionValue(player, "ftbranks.chat_text.obfuscated").asBooleanOrFalse()) {
text.setStyle(text.getStyle().applyFormat(ChatFormatting.OBFUSCATED));
}

main.append(text);

component.setFiltered(main);
return EventResult.interruptTrue();
}
public static RankManagerImpl manager;

@Override
public RankManager getManager() {
return manager;
}

public static void serverAboutToStart(MinecraftServer server) {
manager = new RankManagerImpl(server);
}

public static void serverStarted(MinecraftServer server) {
try {
manager.load();
} catch (Exception ex) {
ex.printStackTrace();
}
}

public static void serverStopped(MinecraftServer server) {
manager = null;
}

public static void worldSaved(ServerLevel event) {
if (manager != null) {
manager.saveRanksNow();
manager.savePlayersNow();
}
}

public static void serverStarting(MinecraftServer server) {
manager.registerCondition("always_active", (rank, json) -> AlwaysActiveCondition.INSTANCE);
manager.registerCondition("rank_added", RankAddedCondition::new);

manager.registerCondition("not", NotCondition::new);
manager.registerCondition("or", OrCondition::new);
manager.registerCondition("and", AndCondition::new);
manager.registerCondition("xor", XorCondition::new);

manager.registerCondition("op", (rank, tag) -> new OPCondition());
manager.registerCondition("spawn", (rank, tag) -> new SpawnCondition());
manager.registerCondition("dimension", (rank, tag) -> new DimensionCondition(tag));
manager.registerCondition("playtime", (rank, tag) -> new PlaytimeCondition(tag));
manager.registerCondition("stat", (rank, tag) -> new StatCondition(tag));
manager.registerCondition("fake_player", (rank, tag) -> new FakePlayerCondition());
manager.registerCondition("creative_mode", (rank, tag) -> new CreativeModeCondition());
}

public static EventResult serverChat(ServerPlayer player, TextFilter.FilteredText eventMessage, ChatEvent.ChatComponent component) {
String format = FTBRanksAPI.getPermissionValue(player, "ftbranks.name_format").asString().orElse("");

if (format.isEmpty()) {
return EventResult.pass();
}

TextComponent main = new TextComponent("");
TextComponent cachedNameForChat;

try {
cachedNameForChat = TextComponentParser.parse(format, s -> s.equals("name") ? player.getDisplayName() : null);
} catch (Exception ex) {
String s = "Error parsing " + format + ": " + ex;
FTBRanks.LOGGER.error(s);
cachedNameForChat = new TextComponent("BrokenFormatting");
cachedNameForChat.withStyle(ChatFormatting.RED);
cachedNameForChat.setStyle(cachedNameForChat.getStyle().withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent(s))));
}

main.append(cachedNameForChat);
main.append(" ");

if (component.getFiltered() instanceof TranslatableComponent fullComp) {
ChatFormatting color = ChatFormatting.getByName(FTBRanksAPI.getPermissionValue(player, "ftbranks.chat_text.color").asString().orElse(null));
for (int i = 1; i < fullComp.getArgs().length; i++) {
Object arg = fullComp.getArgs()[i];
TextComponent part = arg instanceof TextComponent tc ? tc : new TextComponent(arg.toString());

if (color != null) {
part.setStyle(part.getStyle().applyFormat(color));
}
if (FTBRanksAPI.getPermissionValue(player, "ftbranks.chat_text.bold").asBooleanOrFalse()) {
part.setStyle(part.getStyle().applyFormat(ChatFormatting.BOLD));
}
if (FTBRanksAPI.getPermissionValue(player, "ftbranks.chat_text.italic").asBooleanOrFalse()) {
part.setStyle(part.getStyle().applyFormat(ChatFormatting.ITALIC));
}
if (FTBRanksAPI.getPermissionValue(player, "ftbranks.chat_text.underlined").asBooleanOrFalse()) {
part.setStyle(part.getStyle().applyFormat(ChatFormatting.UNDERLINE));
}
if (FTBRanksAPI.getPermissionValue(player, "ftbranks.chat_text.strikethrough").asBooleanOrFalse()) {
part.setStyle(part.getStyle().applyFormat(ChatFormatting.STRIKETHROUGH));
}
if (FTBRanksAPI.getPermissionValue(player, "ftbranks.chat_text.obfuscated").asBooleanOrFalse()) {
part.setStyle(part.getStyle().applyFormat(ChatFormatting.OBFUSCATED));
}
main.append(part);
}
} else {
main.append(component.getFiltered());
}

component.setFiltered(main);
return EventResult.interruptTrue();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,8 @@

import dev.architectury.platform.forge.EventBuses;
import dev.ftb.mods.ftbranks.FTBRanks;
import net.minecraftforge.fml.IExtensionPoint.DisplayTest;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.network.NetworkConstants;

@Mod(FTBRanks.MOD_ID)
public class FTBRanksForge {
Expand All @@ -15,6 +12,6 @@ public FTBRanksForge() {
new FTBRanks();
// Nope.
// PermissionAPI.setPermissionHandler(new PermissionAPIWrapper(PermissionAPI.getPermissionHandler()));
ModLoadingContext.get().registerExtensionPoint(DisplayTest.class, () -> new DisplayTest(() -> NetworkConstants.IGNORESERVERONLY, (a, b) -> true));
// ModLoadingContext.get().registerExtensionPoint(DisplayTest.class, () -> new DisplayTest(() -> NetworkConstants.IGNORESERVERONLY, (a, b) -> true));
}
}
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ org.gradle.daemon=false
mod_id=ftbranks
archives_base_name=ftb-ranks
maven_group=dev.ftb.mods
mod_version=1802.1.9
mod_version=1802.1.10
mod_author=FTB Team

minecraft_version=1.18.2
Expand Down