Jump to content

NovaViper

Forge Modder
  • Posts

    1061
  • Joined

  • Last visited

Posts posted by NovaViper

  1. Do you know anyone that can make animations? Also I still can't get the entity to drop items, not sure why it isn't dropping them

     

    Not personally, but Jabelar has a tutorial on complex entity models with animation here.

     

    I can't really help you with your issues unless you give me something to work with. I need to see the entity, the loot table file, any custom loot table classes used in it (e.g. properties, conditions) and the loot table registration.

     

    The Source code is here

  2. Hey Choonster, do you know anything about custom animations? I've been trying to figure out how to make such methods. Also, what do I do with the Entity Property I made?

     

    I know very little about rendering, I can't help you with animations.

     

    Use your

    EntityProperty

    in the

    properties

    section of an

    entity_properties

    conditional in your loot table JSON, like the

    on_fire

    property is used in the pig's loot table.

     

    Do you know anyone that can make animations? Also I still can't get the entity to drop items, not sure why it isn't dropping them

  3. Also, how do I get the status of the Forge Version Checker just for my mod?

     

    Use

    ForgeVersion.getResult

    to get the

    CheckResult

    of the version check for the specified

    ModContainer

    .

    FMLCommonHandler#findContainerFor

    will return the

    ModContainer

    for the specified mod ID or instance.

    I was trying to use MinecraftServer but I can't get the instance of it and yeah, thats what the error is talking about, the MineraftServer being null.

     

    ICommand#execute

    has a

    MinecraftServer

    argument, pass this to your

    applyModifier

    method.

     

    Thanks! That fixed that error and got the version to display, I have another question though (Sorry for asking so many), I want the header of the help command to have gold seperators (---) and leave the rest of the text dark green. So far I got this:

     

    Code

    			int l = Math.min((k + 1) * 7, list.size());
    		TextComponentTranslation textcomponenttranslation1 = ChatHelper.getChatComponentTranslation(TextFormatting.GOLD + "--- "+"commands.tetracraft:help.header" + TextFormatting.GOLD + " ---", new Object[] {Integer.valueOf(k + 1), Integer.valueOf(j + 1)});
    		textcomponenttranslation1.getStyle().setColor(TextFormatting.DARK_GREEN);
    		sender.addChatMessage(textcomponenttranslation1);

     

    Lang File

    commands.tetracraft:help.header=Help page %d/%d (/tetracraft help <page>)

  4. Hey Choonster, I got an issue with the admin commands, I get this error whenever I use the global optional parameter with the commands (it affects all of the mod tameable entities, which I make change that to all the entities in my mod instead of just the tameable ones):

     

    I suggest you set a breakpoint on line 155 of

    CommandAdmin

    , run the game in debug mode, use the command and then look at the debugger to see what's

    null

    . It looks like it's probably the

    MinecraftServer

    you get from

    FMLServerHandler

    .

     

    In 1.9, Minecraft is slowly moving away from

    MinecraftServer

    being a singleton since there's no static field in the class itself storing the instance and

    World

    has a

    getMinecraftServer

    method to get the world's server. For this reason, I suggest you use the

    MinecraftServer

    provided to the command rather than using

    FMLServerHandler

    (which still assumes there's only one

    MinecraftServer

    instance).

     

    I was trying to use MinecraftServer but I can't get the instance of it and yeah, thats what the error is talking about, the MineraftServer being null.

  5. Hey Choonster, I got an issue with the admin commands, I get this error whenever I use the global optional parameter with the commands (it affects all of the mod tameable entities, which I make change that to all the entities in my mod instead of just the tameable ones):

    [18:34:58] [server thread/WARN]: Couldn't process command: 'admin gender female g'
    java.lang.NullPointerException
    at novaviper.tetracraft.common.command.CommandAdmin.applyModifier(CommandAdmin.java:155) ~[CommandAdmin.class:?]
    at novaviper.tetracraft.common.command.CommandAdmin.execute(CommandAdmin.java:94) ~[CommandAdmin.class:?]
    at net.minecraft.command.CommandHandler.tryExecute(CommandHandler.java:107) [CommandHandler.class:?]
    at net.minecraft.command.CommandHandler.executeCommand(CommandHandler.java:86) [CommandHandler.class:?]
    at novaviper.tetracraft.common.command.CommandTetraCraft.execute(CommandTetraCraft.java:88) [CommandTetraCraft.class:?]
    at net.minecraft.command.CommandHandler.tryExecute(CommandHandler.java:107) [CommandHandler.class:?]
    at net.minecraft.command.CommandHandler.executeCommand(CommandHandler.java:86) [CommandHandler.class:?]
    at net.minecraft.network.NetHandlerPlayServer.handleSlashCommand(NetHandlerPlayServer.java:957) [NetHandlerPlayServer.class:?]
    at net.minecraft.network.NetHandlerPlayServer.processChatMessage(NetHandlerPlayServer.java:933) [NetHandlerPlayServer.class:?]
    at net.minecraft.network.play.client.CPacketChatMessage.processPacket(CPacketChatMessage.java:47) [CPacketChatMessage.class:?]
    at net.minecraft.network.play.client.CPacketChatMessage.processPacket(CPacketChatMessage.java: [CPacketChatMessage.class:?]
    at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:15) [PacketThreadUtil$1.class:?]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_77]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_77]
    at net.minecraft.util.Util.runTask(Util.java:23) [util.class:?]
    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:738) [MinecraftServer.class:?]
    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:683) [MinecraftServer.class:?]
    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:155) [integratedServer.class:?]
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:532) [MinecraftServer.class:?]
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_77]
    [18:34:58] [Client thread/INFO]: [CHAT] An unknown error occurred while attempting to perform this command

     

    Source code for the command

    package novaviper.tetracraft.common.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.entity.player.EntityPlayerMP;
    import net.minecraft.server.MinecraftServer;
    import net.minecraft.util.math.AxisAlignedBB;
    import net.minecraft.util.math.BlockPos;
    import net.minecraft.world.WorldServer;
    import net.minecraftforge.fml.server.FMLServerHandler;
    import novaviper.tetracraft.common.command.modifers.*;
    import novaviper.tetracraft.common.entity.EntityModTameable;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    /**
    * Created by NovaViper on 4/14/2016.
    * Class Purpose:
    */
    public class CommandAdmin extends CommandBase {
    
    @Override
    public String getCommandName() {
    	return "admin";
    }
    
    @Override
    public List getCommandAliases() {
    	return Arrays.<String>asList(new String[] {"a", "*"});
    }
    
    @Override
    public String getCommandUsage(ICommandSender sender) {
    	return String.format("commands.tetracraft:admin.usage");
    }
    
    /**
     * Return the required permission level for this command.
     */
    @Override
    public int getRequiredPermissionLevel() {
    	return 4;
    }
    
    private boolean getCommand(String paramIn, String name) {
    	return paramIn.equalsIgnoreCase(name);
    }
    
    @Override
    public void execute(MinecraftServer server, ICommandSender sender, String[] params) throws CommandException {
    	if (sender instanceof EntityPlayerMP) {
    		EntityPlayerMP player = (EntityPlayerMP) sender;
    		if (params.length < 1 || params[0].isEmpty()) {
    			throw new WrongUsageException(getCommandUsage(sender));
    		}
    
    		// last parameter, optional
    		boolean global = params[params.length - 1].equalsIgnoreCase("global") || params[params.length - 1].equalsIgnoreCase("g") || params[params.length - 1].equalsIgnoreCase("all") || params[params.length - 1].equalsIgnoreCase("a");
    		String command = params[0];
    
    		if (getCommand(command, "tame") || getCommand(command, "t")) {
    			applyModifier(sender, new TameModifier(player), global);
    		} else if (getCommand(command, "heal") || getCommand(command, "hp")) {
    			applyModifier(sender, new HealthModifier(player), global);
    		} else if (getCommand(command, "age") || getCommand(command, "a")) {
    			if (params.length < 2) {
    				throw new WrongUsageException(getCommandUsage(sender));
    			}
    
    			String parameter = params[1];
    
    			if (parameter.equalsIgnoreCase("baby") || parameter.equalsIgnoreCase("b")) {
    				applyModifier(sender, new AgeModifier(player, -24000), global);
    			}
    			else if (parameter.equalsIgnoreCase("adult") || parameter.equalsIgnoreCase("a")) {
    				applyModifier(sender, new AgeModifier(player, 1), global);
    			}
    		} else if (getCommand(command, "gender") || getCommand(command, "g")) {
    			if (params.length < 2) {
    				throw new WrongUsageException(getCommandUsage(sender));
    			}
    
    			String parameter = params[1];
    
    			if (parameter.equalsIgnoreCase("male") || parameter.equalsIgnoreCase("m")) {
    				applyModifier(sender, new GenderModifier(player, true), global);
    			}
    			else if (parameter.equalsIgnoreCase("female") || parameter.equalsIgnoreCase("f")) {
    				applyModifier(sender, new GenderModifier(player, false), global);
    			}
    		} else {
    			throw new CommandException(getCommandUsage(sender));
    		}
    	}
    }
    
    private boolean getArgs(String[] args, String name) {
    	return args[0].equalsIgnoreCase(name);
    }
    
    /**
     * Adds the strings available in this command to the given list of tab
     * completion options.
     */
    @Override
    public List<String> getTabCompletionOptions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos pos) {
    	if (args.length == 1) { //If the command name is filled, then list the sub commands
    		return getListOfStringsMatchingLastWord(args, new String[] { "tame", "t", "heal", "hp", "age", "a", "gender", "g"});
    	} else if (args.length == 2) {//If the following sub-commands are filled, then fill their arguments
    		if (args[0].equalsIgnoreCase("age") || args[0].equalsIgnoreCase("a")) {
    			return getListOfStringsMatchingLastWord(args, new String[] { "baby", "adult" });
    		} else if (args[0].equalsIgnoreCase("gender") || args[0].equalsIgnoreCase("gender")) {
    			return getListOfStringsMatchingLastWord(args, new String[] { "male", "female" });
    		}
    	}
    	return null;
    }
    
    private void applyModifier(ICommandSender sender, EntityModifier modifier, boolean global) throws CommandException {
    	if (!global && sender instanceof EntityPlayerMP) {
    		EntityPlayerMP player = getCommandSenderAsPlayer(sender);
    		double range = 64;
    		AxisAlignedBB aabb = new AxisAlignedBB(player.posX - 1, player.posY - 1, player.posZ - 1, player.posX + 1, player.posY + 1, player.posZ + 1);
    		aabb = aabb.expand(range, range, range);
    		List<Entity> entities = player.worldObj.getEntitiesWithinAABB(EntityModTameable.class, aabb);
    
    		Entity closestEntity = null;
    		float minPlayerDist = Float.MAX_VALUE;
    
    		// get closest entity
    		for (int i = 0; i < entities.size(); i++) {
    			Entity entity = entities.get(i);
    			float playerDist = entity.getDistanceToEntity(player);
    			if (entity.getDistanceToEntity(player) < minPlayerDist) {
    				closestEntity = entity;
    				minPlayerDist = playerDist;
    			}
    		}
    
    		if (closestEntity == null) {
    			throw new CommandException("commands.tetracraft:admin.notameable");
    		}
    		else {
    			modifier.modify((EntityModTameable)closestEntity);
    		}
    	}
    	else {
    		// scan all entities on all dimensions
    		MinecraftServer server = FMLServerHandler.instance().getServer();
    		for (WorldServer worldServer : server.worldServers) {
    			List<Entity> entities = worldServer.loadedEntityList;
    
    			for (int i = 0; i < entities.size(); i++) {
    				Entity entity = entities.get(i);
    
    				if (!(entity instanceof EntityModTameable)) {
    					continue;
    				}
    
    				modifier.modify((EntityModTameable)entity);
    			}
    		}
    	}
    }
    
    public interface EntityModifier {
    	public void modify(EntityModTameable entity);
    }
    }

  6. I did what you said but now the subcommands aren't registered

     

    package novaviper.tetracraft.common.command;
    
    import com.google.common.collect.Lists;
    import net.minecraft.command.*;
    import net.minecraft.server.MinecraftServer;
    import net.minecraft.util.math.BlockPos;
    import novaviper.tetracraft.common.command.interfaces.ISubCommandManager;
    import novaviper.tetracraft.common.init.ModCommands;
    import novaviper.tetracraft.common.init.TetraCraft;
    
    import javax.annotation.Nullable;
    import java.util.*;
    
    /**
    * Created by NovaViper on 4/15/2016.
    * Class Purpose: A command with sub-commands
    * Credit goes to Choonster
    */
    public class CommandTetraCraft extends CommandBase {
    
    /**
     * The {@link ISubCommandManager} that manages the sub-commands of this command.
     */
    private final SubCommandHandler subCommandHandler;
    
    public CommandTetraCraft(MinecraftServer server) {
    	subCommandHandler = new SubCommandHandler(server);
    }
    
    /**
     * Join the arguments array into a single string.
     *
     * @param args The arguments
     * @return The joined string
     */
    private static String joinArgs(String[] args) {
    	return String.join(" ", (CharSequence[]) args);
    }
    
    /**
     * Return a copy of the array with the first string removed.
     * <p>
     * Copied from {@link CommandHandler#dropFirstString}.
     *
     * @param input The original array
     * @return The new array
     */
    private static String[] dropFirstString(String[] input) {
    	String[] output = new String[input.length - 1];
    	System.arraycopy(input, 1, output, 0, input.length - 1);
    	return output;
    }
    
    /**
     * Gets the name of the command
     */
    @Override
    public String getCommandName() {
    	return "tetracraft";
    }
    
    @Override
    public List<String> getCommandAliases() {
    	return Arrays.<String>asList(new String[] {"tcraft", "tc", "TETRACRAFT", "TCRAFT", "TC"});
    }
    
    /**
     * Gets the usage string for the command.
     *
     * @param sender The command sender
     * @return The command usage
     */
    @Override
    public String getCommandUsage(ICommandSender sender) {
    	return "commands.tetracraft.usage";
    }
    
    /**
     * Callback for when the command is executed
     *
     * @param server The Minecraft server instance
     * @param sender The source of the command invocation
     * @param args   The arguments that were passed
     */
    @Override
    public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
    	subCommandHandler.executeCommand(sender, joinArgs(args));
    }
    
    @Override
    public List<String> getTabCompletionOptions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos pos) {
    	return subCommandHandler.getTabCompletionOptions(sender, joinArgs(args), pos);
    }
    
    /**
     * Return whether the specified command parameter index is a username parameter.
     */
    @Override
    public boolean isUsernameIndex(String[] args, int index) {
    	final ICommand subCommand = subCommandHandler.getCommand(args[0]);
    	return index > 0 && subCommand != null && subCommand.isUsernameIndex(dropFirstString(args), index - 1);
    }
    
    /**
     * Handler for the sub-commands of this command.
     */
    private static class SubCommandHandler extends CommandHandler implements ISubCommandManager {
    	private final MinecraftServer server;
    	public Map<String, ICommand> commandsMap = new LinkedHashMap();
    
    	private SubCommandHandler(MinecraftServer server) {
    		this.server = server;
    		ModCommands.registerSubCommands(this);
    	}
    
    	@Override
    	protected MinecraftServer getServer() {
    		return server;
    	}
    
    	@Override
    	public ICommand registerCommand(ICommand command) {
    		super.registerCommand(command);
    		this.commandsMap.put(command.getCommandName(), command);
    
    		for (String s : command.getCommandAliases())
    		{
    			ICommand icommand = (ICommand)this.commandsMap.get(s);
    
    			if (icommand == null || !icommand.getCommandName().equals(s))
    			{
    				this.commandsMap.put(s, command);
    			}
    		}
    
    		return command;
    	}
    
    	@Override
    	public List<String> getTabCompletionOptions(ICommandSender sender, String input, BlockPos pos)
    	{
    		String[] astring = input.split(" ", -1);
    		String s = astring[0];
    
    		if (astring.length == 1)
    		{
    			List<String> list = Lists.<String>newArrayList();
    
    			for (Map.Entry<String, ICommand> entry : this.commandsMap.entrySet())
    			{
    				if (CommandBase.doesStringStartWith(s, (String)entry.getKey()) && ((ICommand)entry.getValue()).checkPermission(this.getServer(), sender))
    				{
    					list.add(entry.getKey());
    				}
    			}
    
    			return list;
    		}
    		else
    		{
    			if (astring.length > 1)
    			{
    				ICommand icommand = (ICommand)this.commandsMap.get(s);
    
    				if (icommand != null && icommand.checkPermission(this.getServer(), sender))
    				{
    					return icommand.getTabCompletionOptions(this.getServer(), sender, dropFirstString(astring), pos);
    				}
    			}
    
    			return Collections.<String>emptyList();
    		}
    	}
    
    	/**
    	 * Get the command with the specified name.
    	 *
    	 * @param commandName The command name
    	 * @return The command, or null if there isn't one
    	 */
    	@Nullable
    	public ICommand getCommand(String commandName) {
    		return getCommands().get(commandName);
    	}
    }
    }

     

    UPDATE: I fixed the commands registering, I had to add the super method.

  7. Thanks! I had to play around with the

    CommandBase.getListOfStringsMatchingLastWord(String[], String...)

    a little bit because it was a bit hard to understand with the

    ? :

    booleans but I did the

    if else

    and got it work. But I have one more question with the sub commands, how do I make the commands not sort? I want the Aliases to line up together like this:

    help, h, ?, version, v, admin, a , *

    Instead of this:

    help, a, v, h, admin, *, version, ?

  8. I tested your implementation and it works exactly what I was think off, but I do have a question about it. How do I make help usage use a different header? The default ones says

    /help

    instead of

    /tetracraft help

    . Also, how do I make my admin command enter in the commands with the tab button? The code is this:

     

    package novaviper.tetracraft.common.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.entity.player.EntityPlayerMP;
    import net.minecraft.server.MinecraftServer;
    import net.minecraft.util.math.AxisAlignedBB;
    import net.minecraft.util.math.BlockPos;
    import net.minecraft.world.WorldServer;
    import net.minecraftforge.fml.server.FMLServerHandler;
    import novaviper.tetracraft.common.command.modifers.*;
    import novaviper.tetracraft.common.entity.EntityModTameable;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    /**
    * Created by NovaViper on 4/14/2016.
    * Class Purpose:
    */
    public class CommandAdmin extends CommandBase {
    
    @Override
    public String getCommandName() {
    	return "admin";
    }
    
    @Override
    public List getCommandAliases() {
    	return Arrays.<String>asList(new String[] {"a", "*"});
    }
    
    @Override
    public String getCommandUsage(ICommandSender sender) {
    	return String.format("commands.tetracraft:admin.usage");
    }
    
    /**
     * Return the required permission level for this command.
     */
    @Override
    public int getRequiredPermissionLevel() {
    	return 4;
    }
    
    private boolean getCommand(String paramIn, String name) {
    	return paramIn.equalsIgnoreCase(name);
    }
    
    @Override
    public void execute(MinecraftServer server, ICommandSender sender, String[] params) throws CommandException {
    	if (sender instanceof EntityPlayerMP) {
    		EntityPlayerMP player = (EntityPlayerMP) sender;
    		if (params.length < 1 || params[0].isEmpty()) {
    			throw new WrongUsageException(getCommandUsage(sender));
    		}
    
    		// last parameter, optional
    		boolean global = params[params.length - 1].equalsIgnoreCase("global") || params[params.length - 1].equalsIgnoreCase("g") || params[params.length - 1].equalsIgnoreCase("all") || params[params.length - 1].equalsIgnoreCase("a");
    		String command = params[0];
    
    		if (getCommand(command, "tame") || getCommand(command, "t")) {
    			applyModifier(sender, new TameModifier(player), global);
    		} else if (getCommand(command, "heal") || getCommand(command, "hp")) {
    			applyModifier(sender, new HealthModifier(player), global);
    		} else if (getCommand(command, "stage") || getCommand(command, "st")) {
    			if (params.length < 2) {
    				throw new WrongUsageException(getCommandUsage(sender));
    			}
    
    			String parameter = params[1];
    
    			if (parameter.equalsIgnoreCase("baby") || parameter.equalsIgnoreCase("b")) {
    				applyModifier(sender, new AgeModifier(player, -24000), global);
    			}
    			else if (parameter.equalsIgnoreCase("adult") || parameter.equalsIgnoreCase("a")) {
    				applyModifier(sender, new AgeModifier(player, 1), global);
    			}
    		} else if (getCommand(command, "purge") || getCommand(command, "p")) {
    			if (params.length < 2) {
    				throw new WrongUsageException(getCommandUsage(sender));
    			}
    
    			String parameter = params[1];
    
    			if (parameter.equalsIgnoreCase("tamed") || parameter.equalsIgnoreCase("t")) {
    				applyModifier(sender, new PurgeModifier(player, false, "tamed"), global);
    			}
    			else if (parameter.equalsIgnoreCase("all") || parameter.equalsIgnoreCase("a")) {
    				applyModifier(sender, new PurgeModifier(player, true, "all"), true);
    			}
    			else if (parameter.equalsIgnoreCase("wild") || parameter.equalsIgnoreCase("w")) {
    				applyModifier(sender, new PurgeModifier(player, false, "wild"), global);
    			}
    		} else if (getCommand(command, "gender") || getCommand(command, "g")) {
    			if (params.length < 2) {
    				throw new WrongUsageException(getCommandUsage(sender));
    			}
    
    			String parameter = params[1];
    
    			if (parameter.equalsIgnoreCase("male") || parameter.equalsIgnoreCase("m")) {
    				applyModifier(sender, new GenderModifier(player, true), global);
    			}
    			else if (parameter.equalsIgnoreCase("female") || parameter.equalsIgnoreCase("f")) {
    				applyModifier(sender, new GenderModifier(player, false), global);
    			}
    		} else {
    			throw new CommandException(getCommandUsage(sender));
    		}
    	}
    }
    
    private boolean getArgs(String[] args, String name) {
    	return args[0].equalsIgnoreCase(name);
    }
    
    /**
     * Adds the strings available in this command to the given list of tab
     * completion options.
     */
    @Override
    public List<String> getTabCompletionOptions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos pos) {
    	boolean argLength = args.length == 2;
    	return args.length == 1
    			? getListOfStringsMatchingLastWord(args, new String[] {})
    			: (argLength && getArgs(args, "stage") || getArgs(args, "s")
    			? getListOfStringsMatchingLastWord(args, new String[] { "baby", "adult" })
    			: (argLength && getArgs(args, "purge") || getArgs(args, "p")
    			? getListOfStringsMatchingLastWord(args, new String[] { "tamed", "wild", "all" }) : null));
    }
    
    private void applyModifier(ICommandSender sender, EntityModifier modifier, boolean global) throws CommandException {
    	if (!global && sender instanceof EntityPlayerMP) {
    		EntityPlayerMP player = getCommandSenderAsPlayer(sender);
    		double range = 64;
    		AxisAlignedBB aabb = new AxisAlignedBB(player.posX - 1, player.posY - 1, player.posZ - 1, player.posX + 1, player.posY + 1, player.posZ + 1);
    		aabb = aabb.expand(range, range, range);
    		List<Entity> entities = player.worldObj.getEntitiesWithinAABB(EntityModTameable.class, aabb);
    
    		Entity closestEntity = null;
    		float minPlayerDist = Float.MAX_VALUE;
    
    		// get closest entity
    		for (int i = 0; i < entities.size(); i++) {
    			Entity entity = entities.get(i);
    			float playerDist = entity.getDistanceToEntity(player);
    			if (entity.getDistanceToEntity(player) < minPlayerDist) {
    				closestEntity = entity;
    				minPlayerDist = playerDist;
    			}
    		}
    
    		if (closestEntity == null) {
    			throw new CommandException("commands.tetracraft:admin.notameable");
    		}
    		else {
    			modifier.modify((EntityModTameable)closestEntity);
    		}
    	}
    	else {
    		// scan all entities on all dimensions
    		MinecraftServer server = FMLServerHandler.instance().getServer();
    		for (WorldServer worldServer : server.worldServers) {
    			List<Entity> entities = worldServer.loadedEntityList;
    
    			for (int i = 0; i < entities.size(); i++) {
    				Entity entity = entities.get(i);
    
    				if (!(entity instanceof EntityModTameable)) {
    					continue;
    				}
    
    				modifier.modify((EntityModTameable)entity);
    			}
    		}
    	}
    }
    
    public interface EntityModifier {
    	public void modify(EntityModTameable entity);
    }
    }

  9. Sorry for not responding in a while and I did get that error fixed, I have another question relating with commands. Is it possible to make sub-commands like

    /tetracraft admin tame

    and

    /tetracraft help

    ? And for the admin commands, only restrict them to the owner/admin while leaving the other ones like

    /tetracraft help

    to be used by everyone?

  10. Oh yeah, sorry about leaving that main package there, and I fixed that typo in the bow json and package. I did the EntityTamed like this

     

    package novaviper.tetracraft.common.entity.properties;
    
    import com.google.gson.JsonDeserializationContext;
    import com.google.gson.JsonElement;
    import com.google.gson.JsonPrimitive;
    import com.google.gson.JsonSerializationContext;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.passive.EntityTameable;
    import net.minecraft.util.JsonUtils;
    import net.minecraft.util.ResourceLocation;
    import net.minecraft.world.storage.loot.conditions.EntityHasScore;
    import net.minecraft.world.storage.loot.properties.EntityProperty;
    import novaviper.tetracraft.common.entity.EntityModTameable;
    
    import java.util.Random;
    
    /**
    * Created by NovaViper on 4/11/2016.
    * Class Purpose: Declares Entity Property for Tamed Mod Entities
    */
    public class EntityTamed implements EntityProperty
    {
    private final boolean isTamed;
    
    public EntityTamed(boolean isTamedIn)
    {
    	this.isTamed = isTamedIn;
    }
    
    public boolean testProperty(Random random, Entity entityIn)
    {
    	if(entityIn instanceof EntityTameable){
    		EntityTameable entityTameable = (EntityTameable)entityIn;
    		if(entityTameable.isTamed()){
    			return this.isTamed == true;
    		}else{
    			return this.isTamed == false;
    		}
    	}else{
    		return this.isTamed == false;
    	}
    }
    
    public static Serializer getSerializer(){
    	return new Serializer();
    }
    
    public static class Serializer extends EntityProperty.Serializer<EntityTamed>
    {
    	protected Serializer()
    	{
    		super(new ResourceLocation("is_tamed"), EntityTamed.class);
    	}
    
    	public JsonElement serialize(EntityTamed property, JsonSerializationContext serializationContext)
    	{
    		return new JsonPrimitive(Boolean.valueOf(property.isTamed));
    	}
    
    	public EntityTamed deserialize(JsonElement element, JsonDeserializationContext deserializationContext)
    	{
    		return new EntityTamed(JsonUtils.getBoolean(element, "is_tamed"));
    	}
    }
    }

     

    How do I acutally register this?

  11. Thanks! How would this work if I want to add a custom condition, like if the player has tamed the entity and it died?

     

    It looks like you'll need to create an

    EntityProperty

    to test whether the entity has been tamed. You'll also need to create its

    EntityProperty.Serializer

    and register an instance of it with

    EntityPropertyManager.registerProperty

    .

     

    In your loot table, use the

    entity_properties

    condition with your property.

     

    How do I make Custom Entity Properties? I never made those before, mostly did datawatchers for certain properties like gender and evo stages.

  12. Hey Choonster, I got another question, what in the world is Loot Tables? I want to make my entity drop something, but it wants a Loot Table

     

    See the wiki page. They're basically a more flexible replacement for

    ChestGenHooks

    /

    WeightedRandomChestContent

    that are also used for entity drops.

     

    Forge hasn't added any hooks for loot tables yet, but you can still register your own using the vanilla classes. You can see my loot table registration class here and a loot table here.

     

    Thanks! How would this work if I want to add a custom condition, like if the player has tamed the entity and it died?

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.