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

Commands Framework #114

Merged
merged 17 commits into from
Mar 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
8ef4b04
Fix waterlogging always true on shell block. Add license url to mod i…
50ap5ud5 Dec 31, 2022
70549aa
Merge branch 'master' of https://github.com/CommandrMoose/TardisRefined
50ap5ud5 Dec 31, 2022
a66fed7
Change version
50ap5ud5 Dec 31, 2022
42c6d8d
Merge branch 'master' of https://github.com/CommandrMoose/TardisRefined
50ap5ud5 Dec 31, 2022
e8a013a
Merge branch 'master' of https://github.com/CommandrMoose/TardisRefined
50ap5ud5 Jan 4, 2023
5c9ac6f
Merge branch 'master' of https://github.com/CommandrMoose/TardisRefined
50ap5ud5 Jan 5, 2023
a8cae92
Merge branch 'master' of https://github.com/CommandrMoose/TardisRefined
50ap5ud5 Jan 5, 2023
8b8ad29
Merge branch 'master' of https://github.com/CommandrMoose/TardisRefined
50ap5ud5 Jan 6, 2023
53344e8
Merge branch 'master' of https://github.com/CommandrMoose/TardisRefined
50ap5ud5 Jan 15, 2023
599025d
Merge branch 'master' of https://github.com/CommandrMoose/TardisRefined
50ap5ud5 Feb 9, 2023
fa0a492
Merge branch 'master' of https://github.com/CommandrMoose/TardisRefined
50ap5ud5 Feb 16, 2023
7aab7f3
Interior Command
Jeryn99 Feb 19, 2023
9517bb1
Merge branch 'master' of https://github.com/CommandrMoose/TardisRefined
50ap5ud5 Mar 4, 2023
8c905c7
Merge branch 'master' of https://github.com/CommandrMoose/TardisRefined
50ap5ud5 Mar 11, 2023
3fa6e85
Merge branch 'master' into feature/commands
50ap5ud5 Mar 12, 2023
9bc0844
Switch IP dependencies back to modCompileOnlyApi only
50ap5ud5 Mar 15, 2023
7b6c218
Make interior command only suggest Tardis-type dimensions.
50ap5ud5 Mar 18, 2023
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package whocraft.tardis_refined.command;

import com.mojang.brigadier.CommandDispatcher;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import whocraft.tardis_refined.TardisRefined;
import whocraft.tardis_refined.command.sub.InteriorCommand;
import whocraft.tardis_refined.common.util.Platform;

public class TardisRefinedCommand {

public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
dispatcher.register(Commands.literal(TardisRefined.MODID).requires(commandSource -> commandSource.hasPermission(Platform.getServer().getOperatorUserPermissionLevel()))
.then(InteriorCommand.register(dispatcher))

);

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package whocraft.tardis_refined.command.sub;

import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.ArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.commands.arguments.DimensionArgument;
import net.minecraft.commands.arguments.EntityArgument;
import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.Level;
import whocraft.tardis_refined.common.capability.TardisLevelOperator;
import whocraft.tardis_refined.common.util.CommandHelper;
import whocraft.tardis_refined.common.util.PlayerUtil;
import whocraft.tardis_refined.common.util.TRTeleporter;
import whocraft.tardis_refined.constants.ModMessages;

import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

public class InteriorCommand implements Command<CommandSourceStack> {

public static ArgumentBuilder<CommandSourceStack, ?> register(CommandDispatcher<CommandSourceStack> dispatcher) {
return Commands.literal("interior")
.then(Commands.argument("tardis", DimensionArgument.dimension()).suggests(CommandHelper.SUGGEST_TARDISES).executes(context -> teleportToInterior(context, List.of(Objects.requireNonNull(context.getSource().getPlayer())), DimensionArgument.getDimension(context, "tardis")))
.then(Commands.argument("entities", EntityArgument.entities())
.executes(context -> teleportToInterior(context, EntityArgument.getEntities(context, "entities"), DimensionArgument.getDimension(context, "tardis")))));
}

private static int teleportToInterior(CommandContext<CommandSourceStack> context, Collection<? extends Entity> entities, ServerLevel tardis) {
Optional<TardisLevelOperator> tardisData = TardisLevelOperator.get(tardis);

ServerPlayer sender = context.getSource().getPlayer();

if (tardisData.isPresent()) {
tardisData.ifPresent(tardisLevelOperator -> entities.forEach(entity -> teleportToInterior(tardisLevelOperator, entity)));
return 0;
}
PlayerUtil.sendMessage(sender, Component.translatable(ModMessages.CMD_DIM_NOT_A_TARDIS, tardis.dimensionTypeId().location().toString()), false);
return 0;
}

private static void teleportToInterior(TardisLevelOperator tardisLevelOperator, Entity entity) {
Level tpLevel = tardisLevelOperator.getLevel();
if (tpLevel instanceof ServerLevel finalTpLevel) {
BlockPos pos = tardisLevelOperator.getInternalDoor().getDoorPosition();
pos = pos.relative(tardisLevelOperator.getInternalDoor().getEntryRotation(), 1);
TRTeleporter.performTeleport(entity, finalTpLevel, pos.getX(), pos.getY(), pos.getZ(), entity.getYRot(), entity.getXRot());
}
}


@Override
public int run(CommandContext<CommandSourceStack> context) {
return 0;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package whocraft.tardis_refined.common.util;

import com.mojang.brigadier.suggestion.SuggestionProvider;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.SharedSuggestionProvider;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.Level;

import java.util.Collection;

public class CommandHelper {

public static final SuggestionProvider<CommandSourceStack> SUGGEST_TARDISES = (context, suggestionBuilder) -> {
Collection<ResourceKey<Level>> collection = DimensionUtil.getTardisLevels(context.getSource().getServer());
return SharedSuggestionProvider.suggestResource(collection.stream().map(ResourceKey::location), suggestionBuilder);
};

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
package whocraft.tardis_refined.common.util;

import com.google.common.collect.Sets;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.Level;
import whocraft.tardis_refined.TRConfig;
import whocraft.tardis_refined.registry.DimensionTypes;

import java.util.Set;

public class DimensionUtil {

Expand All @@ -11,4 +17,13 @@ public static boolean isAllowedDimension(ResourceKey<Level> level) {
return !level.location().getNamespace().toString().contains("tardis") && !bannedDimensions.contains(level.location().toString());
}

public static Set<ResourceKey<Level>> getTardisLevels(MinecraftServer server){
Set<ResourceKey<Level>> set = Sets.newHashSet();
for(ServerLevel level : server.getAllLevels()) {
if(level.dimensionTypeId() == DimensionTypes.TARDIS){
set.add(level.dimension());
}
}
return set;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package whocraft.tardis_refined.common.util;

import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.level.TicketType;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.PathfinderMob;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.pathfinder.BlockPathTypes;
import net.minecraft.world.level.pathfinder.WalkNodeEvaluator;

public class TRTeleporter {
private static boolean canTeleportTo(BlockPos pPos, Level level, Entity entity) {
BlockPathTypes blockpathtypes = WalkNodeEvaluator.getBlockPathTypeStatic(level, pPos.mutable());
if (blockpathtypes != BlockPathTypes.WALKABLE) {
return false;
} else {
BlockPos blockpos = pPos.subtract(entity.blockPosition());
return level.noCollision(entity, entity.getBoundingBox().move(blockpos));
}
}
public static boolean performTeleport(Entity pEntity, ServerLevel pLevel, double pX, double pY, double pZ, float pYaw, float pPitch) {
BlockPos blockpos = new BlockPos(pX, pY, pZ);

if (!canTeleportTo(blockpos, pLevel, pEntity)) {
return false;
}

if (!Level.isInSpawnableBounds(blockpos)) {
return false;
} else {
float f = Mth.wrapDegrees(pYaw);
float f1 = Mth.wrapDegrees(pPitch);
if (pEntity instanceof ServerPlayer serverPlayer) {
ChunkPos chunkpos = new ChunkPos(new BlockPos(pX, pY, pZ));
pLevel.getChunkSource().addRegionTicket(TicketType.POST_TELEPORT, chunkpos, 1, pEntity.getId());
pEntity.stopRiding();
if (serverPlayer.isSleeping()) {
serverPlayer.stopSleepInBed(true, true);
}

if (pLevel == pEntity.level) {
serverPlayer.connection.teleport(pX, pY, pZ, f, f1);
} else {
serverPlayer.teleportTo(pLevel, pX, pY, pZ, f, f1);
}
pEntity.setYHeadRot(f);
} else {
float f2 = Mth.clamp(f1, -90.0F, 90.0F);
if (pLevel == pEntity.level) {
pEntity.moveTo(pX, pY, pZ, f, f2);
pEntity.setYHeadRot(f);
} else {
pEntity.unRide();
Entity entity = pEntity;
pEntity = pEntity.getType().create(pLevel);
if (pEntity == null) {
return false;
}

pEntity.restoreFrom(entity);
pEntity.moveTo(pX, pY, pZ, f, f2);
pEntity.setYHeadRot(f);
entity.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION);
pLevel.addDuringTeleport(pEntity);
}
}

if (!(pEntity instanceof LivingEntity) || !((LivingEntity) pEntity).isFallFlying()) {
pEntity.setDeltaMovement(pEntity.getDeltaMovement().multiply(1.0D, 0.0D, 1.0D));
pEntity.setOnGround(true);
}

if (pEntity instanceof PathfinderMob) {
((PathfinderMob) pEntity).getNavigation().stop();
}

return true;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ public class ModMessages {
public static final String CONFIG_IP_COMPAT = config("immersive_portals");
public static final String CONFIG_CONTROL_NAMES = config("control_names");

public static final String CMD_DIM_NOT_A_TARDIS = cmdException("dim_not_a_tardis");

public static String message(String translationKey){
return "message." + TardisRefined.MODID + "." + translationKey;
}
Expand All @@ -53,6 +55,10 @@ public static String tooltip(String translationKey) {
return "tooltip." + TardisRefined.MODID + "." + translationKey;
}

public static String cmdException(String translationKey) {
return "command." + TardisRefined.MODID + "." + translationKey;
}

public static String config(String translationKey) {
return "config." + TardisRefined.MODID + "." + translationKey;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package whocraft.tardis_refined.fabric.events;

import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents;
import net.fabricmc.fabric.api.networking.v1.PacketSender;
Expand All @@ -12,6 +13,7 @@
import net.minecraft.world.level.Level;
import whocraft.tardis_refined.client.TardisClientData;
import whocraft.tardis_refined.client.model.blockentity.console.ConsolePatterns;
import whocraft.tardis_refined.command.TardisRefinedCommand;
import whocraft.tardis_refined.common.capability.TardisLevelOperator;
import whocraft.tardis_refined.common.dimension.DelayedTeleportData;
import whocraft.tardis_refined.common.dimension.fabric.DimensionHandlerImpl;
Expand Down Expand Up @@ -42,6 +44,7 @@ public static void addCommonEvents() {
});

ServerLifecycleEvents.SERVER_STOPPING.register(server -> DimensionHandlerImpl.clear());
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> TardisRefinedCommand.register(dispatcher));
}

public static void addClientEvents() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package whocraft.tardis_refined.common.data;

import net.minecraft.ChatFormatting;
import net.minecraft.data.DataGenerator;
import net.minecraft.sounds.SoundEvent;
import net.minecraftforge.common.data.LanguageProvider;
Expand Down Expand Up @@ -75,6 +76,9 @@ protected void addTranslations() {
add(ModMessages.MSG_KEY_BOUND, "Key Bound to %s");
add(ModMessages.MSG_KEY_CYCLED, "Main: %s");

/*Command*/
add(ModMessages.CMD_DIM_NOT_A_TARDIS, ChatFormatting.RED + "%s is not a TARDIS Dimension!");

/*Creative Tab*/
add("itemGroup.tardis_refined.tardis_refined", "Tardis Refined");
add("itemGroup.tardis_refined", "Tardis Refined");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraftforge.event.AddReloadListenerEvent;
import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.event.level.BlockEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import whocraft.tardis_refined.TardisRefined;
import whocraft.tardis_refined.client.model.blockentity.console.ConsolePatterns;
import whocraft.tardis_refined.command.TardisRefinedCommand;
import whocraft.tardis_refined.common.dimension.DelayedTeleportData;
import whocraft.tardis_refined.common.network.messages.SyncConsolePatternsMessage;
import whocraft.tardis_refined.common.tardis.TardisDesktops;
Expand All @@ -36,6 +38,11 @@ public static void onDatapack(AddReloadListenerEvent addReloadListenerEvent) {
addReloadListenerEvent.addListener(new TardisDesktops());
}

@SubscribeEvent
public static void onCommandRegister(RegisterCommandsEvent event) {
TardisRefinedCommand.register(event.getDispatcher());
}

@SubscribeEvent
public static void onBlockPlace(BlockEvent.EntityPlaceEvent event) {
if (event.getEntity() instanceof Player player) {
Expand All @@ -57,4 +64,4 @@ public static void onBlockBreak(BlockEvent.BreakEvent event) {
event.setCanceled(MiscHelper.shouldCancelBreaking(event.getPlayer().level, event.getPlayer(), event.getPos(), event.getState()));
}

}
}
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ minecraft_version=1.19.2
architectury_version=5.13.48

#Fabric
fabric_loader_version=0.14.13
fabric_loader_version=0.14.14
fabric_api_version=0.73.2+1.19.2
fabric_version_range=>=0.60.0+1.19.2
fabric_loader_version_range=>=0.14.10
Expand Down