Skip to content
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

1.18/dev #696

Merged
merged 9 commits into from
Sep 20, 2023
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
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ 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.3.15]

### Added
* Command rewards now have a "Silent" boolean property; when true, any command output (success or failure) is suppressed
* Added a `/ftbquests open_book <id>` command to open the book to a specific quest, quest link, chapter or task

### Fixed
* Open Quest & Stage Barrier Blocks no longer cause suffocation damage to players passing through them
* Fixed server->client desync with repeatable quests which have multiple rewards

## [1802.3.14]

### Added
Expand Down
4 changes: 2 additions & 2 deletions common/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ publishing {
repositories {
if (ENV.FTB_MAVEN_TOKEN) {
maven {
url "https://maven.ftb.dev/release"
url "https://maven.ftb.dev/releases"
credentials {
username = "ftb"
password = "${ENV.FTB_MAVEN_TOKEN}"
Expand All @@ -38,7 +38,7 @@ publishing {

if (ENV.SAPS_TOKEN) {
maven {
url "https://maven.saps.dev/minecraft"
url "https://maven.saps.dev/releases"
credentials {
username = "ftb"
password = "${ENV.SAPS_TOKEN}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import net.fabricmc.api.Environment;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
Expand Down Expand Up @@ -36,7 +35,8 @@ protected QuestBarrierBlock() {
super(Properties.of(Material.BARRIER, MaterialColor.COLOR_LIGHT_BLUE)
.noOcclusion()
.noDrops()
.isViewBlocking((a, b, c) -> false)
.isViewBlocking((blockState, blockGetter, blockPos) -> false)
.isSuffocating((blockState, blockGetter, blockPos) -> false)
.strength(-1, 6000000F)
.lightLevel(blockState -> 3)
.emissiveRendering((blockState, blockGetter, blockPos) -> true)
Expand All @@ -57,14 +57,10 @@ public RenderShape getRenderShape(BlockState state) {

@Override
public VoxelShape getCollisionShape(BlockState state, BlockGetter bg, BlockPos pos, CollisionContext ctx) {
Entity entity = EntityHooks.fromCollision(ctx);

if (entity instanceof Player) {
BlockEntity be = bg.getBlockEntity(pos);

if (be instanceof BarrierBlockEntity && ((BarrierBlockEntity) be).isOpen((Player) entity)) {
return Shapes.empty();
}
if (EntityHooks.fromCollision(ctx) instanceof Player player
&& bg.getBlockEntity(pos) instanceof BarrierBlockEntity barrier
&& barrier.isOpen(player)) {
return Shapes.empty();
}

return super.getCollisionShape(state, bg, pos, ctx);
Expand Down Expand Up @@ -97,10 +93,8 @@ public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable L
super.setPlacedBy(level, pos, state, entity, stack);

if (!level.isClientSide() && stack.hasCustomHoverName()) {
BlockEntity blockEntity = level.getBlockEntity(pos);

if (blockEntity instanceof BarrierBlockEntity) {
((BarrierBlockEntity) blockEntity).update(stack.getHoverName().getString());
if (level.getBlockEntity(pos) instanceof BarrierBlockEntity barrier) {
barrier.update(stack.getHoverName().getString());
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@
import dev.ftb.mods.ftbquests.gui.quests.QuestScreen;
import dev.ftb.mods.ftbquests.integration.FTBQuestsJEIHelper;
import dev.ftb.mods.ftbquests.net.DeleteObjectMessage;
import dev.ftb.mods.ftbquests.quest.Movable;
import dev.ftb.mods.ftbquests.quest.QuestFile;
import dev.ftb.mods.ftbquests.quest.TeamData;
import dev.ftb.mods.ftbquests.quest.*;
import dev.ftb.mods.ftbquests.quest.theme.QuestTheme;
import dev.ftb.mods.ftbquests.util.TextUtils;
import dev.ftb.mods.ftbteams.data.ClientTeamManager;
Expand Down Expand Up @@ -151,4 +149,23 @@ public void clearCachedData() {
public TeamData getData(Entity player) {
return player == Minecraft.getInstance().player ? self : getData(Objects.requireNonNull(ClientTeamManager.INSTANCE.getKnownPlayer(player.getUUID()), "Non-null team required!").teamId);
}

public static void openBookToQuestObject(long id) {
if (exists()) {
ClientQuestFile file = ClientQuestFile.INSTANCE;
if (file.questScreen == null) {
ClientQuestFile.INSTANCE.openQuestGui();
}
if (file.questScreen != null) {
if (id != 0L) {
QuestObject qo = file.get(id);
if (qo != null) {
file.questScreen.open(qo, true);
}
} else {
file.questScreen.openGui();
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,13 @@
import dev.architectury.registry.registries.Registries;
import dev.ftb.mods.ftblibrary.config.Tristate;
import dev.ftb.mods.ftbquests.FTBQuests;
import dev.ftb.mods.ftbquests.net.CreateObjectResponseMessage;
import dev.ftb.mods.ftbquests.net.DeleteObjectResponseMessage;
import dev.ftb.mods.ftbquests.net.SyncQuestsMessage;
import dev.ftb.mods.ftbquests.net.SyncTeamDataMessage;
import dev.ftb.mods.ftbquests.net.*;
import dev.ftb.mods.ftbquests.quest.*;
import dev.ftb.mods.ftbquests.quest.loot.RewardTable;
import dev.ftb.mods.ftbquests.quest.loot.WeightedReward;
import dev.ftb.mods.ftbquests.quest.reward.ItemReward;
import dev.ftb.mods.ftbquests.quest.task.ItemTask;
import dev.ftb.mods.ftbquests.quest.task.Task;
import dev.ftb.mods.ftbquests.util.FileUtils;
import dev.ftb.mods.ftbquests.util.ProgressChange;
import net.minecraft.ChatFormatting;
Expand Down Expand Up @@ -54,7 +52,7 @@ public class FTBQuestsCommands {

public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
dispatcher.register(Commands.literal("ftbquests")
.requires(s -> s.getServer().isSingleplayer() || s.hasPermission(2))
.requires(s -> s.getServer() != null && s.getServer().isSingleplayer() || s.hasPermission(2))
.then(Commands.literal("editing_mode")
.executes(c -> editingMode(c.getSource(), c.getSource().getPlayerOrException(), null))
.then(Commands.argument("enabled", BoolArgumentType.bool())
Expand Down Expand Up @@ -154,9 +152,42 @@ public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
)
)
)
.then(Commands.literal("open_book")
.executes(c -> openQuest(c.getSource().getPlayerOrException(), null))
.then(Commands.argument("quest_object", QuestObjectArgument.questObject(qob -> qob instanceof QuestObject))
.executes(c -> openQuest(c.getSource().getPlayerOrException(), c.getArgument("quest_object", QuestObjectBase.class))))
)
);
}

private static int openQuest(ServerPlayer player, QuestObjectBase qob) {
if (qob == null) {
// just open the book to wherever it last was
new OpenQuestBookMessage(0L).sendTo(player);
} else if (qob instanceof QuestObject quest) {
if (canSeeQuestObject(player, quest)) {
new OpenQuestBookMessage(quest.id).sendTo(player);
}
}
return 1;
}

private static boolean canSeeQuestObject(ServerPlayer player, QuestObject qo) {
if (qo instanceof Chapter) {
return true;
}
TeamData data = TeamData.get(player);
Quest quest = null;
if (qo instanceof QuestLink link) {
quest = link.getQuest().orElse(null);
} else if (qo instanceof Task task) {
quest = task.quest;
} else if (qo instanceof Quest q) {
quest = q;
}
return quest != null && (data.getCanEdit() || !quest.hideDetailsUntilStartable() || data.canStartTasks(quest));
}

private static int exportRewards(CommandSourceStack source, RewardTable table, BlockPos pos) throws CommandSyntaxException {
ServerPlayer player = source.getPlayerOrException();
ServerLevel level = source.getLevel();
Expand Down Expand Up @@ -377,6 +408,7 @@ private static int generateAllItemChapter(CommandSourceStack source) {
}

private static final Set<UUID> warnedPlayers = new HashSet<>();

private static int doReload(CommandSourceStack source) throws CommandSyntaxException {
ServerQuestFile instance = ServerQuestFile.INSTANCE;
ServerPlayer sender = source.getPlayerOrException();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import java.util.Collection;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.function.Predicate;

public class QuestObjectArgument implements ArgumentType<QuestObjectBase> {

Expand All @@ -37,14 +38,24 @@ public class QuestObjectArgument implements ArgumentType<QuestObjectBase> {
public static final DynamicCommandExceptionType INVALID_ID = new DynamicCommandExceptionType(
(id) -> new TranslatableComponent("commands.ftbquests.command.error.invalid_id", id));

private final Predicate<QuestObjectBase> filter;

public QuestObjectArgument() {
this(qo -> true);
}

public QuestObjectArgument(Predicate<QuestObjectBase> filter) {
this.filter = filter;
}

@Override
public QuestObjectBase parse(StringReader reader) throws CommandSyntaxException {
String id = reader.readString();
QuestFile file = findQuestFile();
if (file != null) {
if (id.startsWith("#")) {
for (QuestObjectBase object : file.getAllObjects()) {
if (object.hasTag(id.substring(1))) {
if (object.hasTag(id.substring(1)) && filter.test(object)) {
return object;
}
}
Expand All @@ -53,7 +64,7 @@ public QuestObjectBase parse(StringReader reader) throws CommandSyntaxException
try {
long num = file.getID(id);
QuestObjectBase object = file.getBase(num);
if (object == null) {
if (object == null || !filter.test(object)) {
throw NO_OBJECT.createWithContext(reader, id);
}
return object;
Expand All @@ -72,6 +83,7 @@ public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> cont
return SharedSuggestionProvider.suggest(
file.getAllObjects()
.stream()
.filter(filter)
.map(QuestFile::getCodeString),
builder
);
Expand All @@ -88,6 +100,10 @@ public static QuestObjectArgument questObject() {
return new QuestObjectArgument();
}

public static QuestObjectArgument questObject(Predicate<QuestObjectBase> filter) {
return new QuestObjectArgument(filter);
}

@Nullable
private static QuestFile findQuestFile() {
if (!QuestObjectBase.isNull(ServerQuestFile.INSTANCE)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,14 @@ public void write(FriendlyByteBuf buffer) {
public void handle(NetworkManager.PacketContext context) {
Reward reward = ServerQuestFile.INSTANCE.getReward(id);

if (reward instanceof ChoiceReward) {
ServerPlayer player = (ServerPlayer) context.getPlayer();
ChoiceReward r = (ChoiceReward) reward;
TeamData data = TeamData.get(player);
RewardTable table = r.getTable();
if (reward instanceof ChoiceReward choiceReward && context.getPlayer() instanceof ServerPlayer serverPlayer) {
TeamData data = TeamData.get(serverPlayer);
RewardTable table = choiceReward.getTable();

if (table != null && data.isCompleted(reward.quest)) {
if (index >= 0 && index < table.rewards.size()) {
table.rewards.get(index).reward.claim(player, true);
data.claimReward(player, reward, true);
table.rewards.get(index).reward.claim(serverPlayer, true);
data.claimReward(serverPlayer, reward, true);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ public void write(FriendlyByteBuf buffer) {
@Override
public void handle(NetworkManager.PacketContext context) {
Reward reward = ServerQuestFile.INSTANCE.getReward(id);
ServerPlayer player = (ServerPlayer) context.getPlayer();

if (reward != null) {
ServerPlayer player = (ServerPlayer) context.getPlayer();
TeamData teamData = ServerQuestFile.INSTANCE.getData(player);

if (teamData.isCompleted(reward.quest)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ public interface FTBQuestsNetHandler {
MessageType SYNC_REWARD_BLOCKING = NET.registerS2C("sync_reward_blocking", SyncRewardBlockingMessage::new);
MessageType COPY_QUEST = NET.registerC2S("copy_quest", CopyQuestMessage::new);
MessageType COPY_CHAPTER_IMAGE = NET.registerC2S("copy_chapter_image", CopyChapterImageMessage::new);
MessageType OPEN_QUEST_BOOK = NET.registerS2C("open_quest_book", OpenQuestBookMessage::new);

static void init() {
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package dev.ftb.mods.ftbquests.net;

import dev.architectury.networking.NetworkManager;
import dev.architectury.networking.simple.BaseS2CMessage;
import dev.architectury.networking.simple.MessageType;
import dev.ftb.mods.ftbquests.client.ClientQuestFile;
import net.minecraft.network.FriendlyByteBuf;

public class OpenQuestBookMessage extends BaseS2CMessage {
private final long id;

public OpenQuestBookMessage(long id) {
this.id = id;
}

OpenQuestBookMessage(FriendlyByteBuf buf) {
id = buf.readLong();
}

@Override
public MessageType getType() {
return FTBQuestsNetHandler.OPEN_QUEST_BOOK;
}

@Override
public void write(FriendlyByteBuf buf) {
buf.writeLong(id);
}

@Override
public void handle(NetworkManager.PacketContext context) {
ClientQuestFile.openBookToQuestObject(id);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -602,10 +602,6 @@ public boolean canStartTasks(Quest quest) {
public void claimReward(ServerPlayer player, Reward reward, boolean notify) {
if (claimReward(player.getUUID(), reward, System.currentTimeMillis())) {
reward.claim(player, notify);

if (file.isServerSide()) {
new ClaimRewardResponseMessage(uuid, player.getUUID(), reward.id).sendToAll(((ServerQuestFile) file).server);
}
}
}

Expand Down
Loading