New ITeleporter interface making dimensional teleportation easier. (#4602)

This commit is contained in:
Ben Staddon authored and LexManos committed 2018-04-01 01:55:45 -07:00
1 parent 1d7c04daeb
commit fe3478f233
15 files changed
+410 -19

No files matched your search

@@ -52,6 +52,6 @@ public class FakePlayer extends EntityPlayerMP
@Override public boolean canAttackPlayer(EntityPlayer player){ return false; }
@Override public void onDeath(DamageSource source){ return; }
@Override public void onUpdate(){ return; }
@Override public Entity changeDimension(int dim){ return this; }
@Override public Entity changeDimension(int dim, ITeleporter teleporter){ return this; }
@Override public void handleClientSettings(CPacketClientSettings pkt){ return; }
}
@@ -0,0 +1,60 @@
/*
* Minecraft Forge
* Copyright (c) 2017.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.minecraftforge.common.util;
import net.minecraft.entity.Entity;
import net.minecraft.world.Teleporter;
import net.minecraft.world.World;
import net.minecraft.world.WorldProvider;
/**
* Interface for handling the placement of entities during dimension change.
*
* An implementation of this interface can be used to place the entity
* in a safe location, or generate a return portal, for instance.
*
* See the {@link net.minecraft.world.Teleporter} class, which has
* been patched to implement this interface, for a vanilla example.
*/
public interface ITeleporter
{
/**
* Called to handle placing the entity in the new world.
*
* The initial position of the entity will be its
* position in the origin world, multiplied horizontally
* by the computed cross-dimensional movement factor
* (see {@link WorldProvider#getMovementFactor()}).
*
* Note that the supplied entity has not yet been spawned
* in the destination world at the time.
*
* @param world the entity's destination
* @param entity the entity to be placed
* @param yaw the suggested yaw value to apply
*/
void placeEntity(World world, Entity entity, float yaw);
// used internally to handle vanilla hardcoding
default boolean isVanilla()
{
return getClass() == Teleporter.class;
}
}
@@ -0,0 +1,120 @@
/*
* Minecraft Forge
* Copyright (c) 2017.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.minecraftforge.server.command;
import net.minecraft.command.CommandBase;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
import net.minecraft.command.WrongUsageException;
import net.minecraft.entity.Entity;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.util.ITeleporter;
import javax.annotation.Nullable;
import java.util.Collections;
import java.util.List;
public class CommandSetDimension extends CommandBase
{
@Override
public String getName()
{
return "setdimension";
}
@Override
public List<String> getAliases()
{
return Collections.singletonList("setdim");
}
@Override
public String getUsage(ICommandSender sender)
{
return "commands.forge.setdim.usage";
}
@Override
public List<String> getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, @Nullable BlockPos targetPos)
{
if (args.length > 2 && args.length <= 5)
{
return getTabCompletionCoordinate(args, 2, targetPos);
}
return Collections.emptyList();
}
@Override
public int getRequiredPermissionLevel()
{
return 2;
}
@Override
public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException
{
// args: <entity> <dim> [<x> <y> <z>]
if (args.length != 2 && args.length != 5)
{
throw new WrongUsageException("commands.forge.setdim.usage");
}
Entity entity = getEntity(server, sender, args[0]);
if (!checkEntity(entity))
{
throw new CommandException("commands.forge.setdim.invalid.entity", entity.getName());
}
int dimension = parseInt(args[1]);
if (!DimensionManager.isDimensionRegistered(dimension))
{
throw new CommandException("commands.forge.setdim.invalid.dim", dimension);
}
if (dimension == entity.dimension)
{
throw new CommandException("commands.forge.setdim.invalid.nochange", entity.getName(), dimension);
}
BlockPos pos = args.length == 5 ? parseBlockPos(sender, args, 2, false) : sender.getPosition();
entity.changeDimension(dimension, new CommandTeleporter(pos));
}
private static boolean checkEntity(Entity entity)
{
// use vanilla portal logic, try to avoid doing anything too silly
return !entity.isRiding() && !entity.isBeingRidden() && entity.isNonBoss();
}
private static class CommandTeleporter implements ITeleporter
{
private final BlockPos targetPos;
private CommandTeleporter(BlockPos targetPos)
{
this.targetPos = targetPos;
}
@Override
public void placeEntity(World world, Entity entity, float yaw)
{
entity.moveToBlockPosAndAngles(targetPos, yaw, entity.rotationPitch);
}
}
}
@@ -32,6 +32,7 @@ public class ForgeCommand extends CommandTreeBase
super.addSubcommand(new CommandTrack());
super.addSubcommand(new CommandGenerate());
super.addSubcommand(new CommandEntity());
super.addSubcommand(new CommandSetDimension());
super.addSubcommand(new CommandTreeHelp(this));
}