-
Posts
1061 -
Joined
-
Last visited
Everything posted by NovaViper
-
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
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 -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
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 -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
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? -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
Thanks! That worked! -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
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. 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>) -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
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. -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
Also, how do I get the status of the Forge Version Checker just for my mod? -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
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); } } -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
Thanks Choonster! -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
I also don't want the help menu to sort the commands either. How do I fix that? -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
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. -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
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, ? -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
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); } } -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
Ah ok, so should I just leave everything in the handler I made blank and have the subcommands write something for each of the implements from ICommand ? -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
Should I make the class abstract? Also.. Should I override the exeuteCommand methods in CommandHandler and place the mod id here: if (rawCommand.startsWith("/")) <<<<< { rawCommand = rawCommand.substring(1); } -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
Basically I should make my own CommandHandler class that implements ICommand and ICommandManager correct? -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
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? -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
I'm getting an error now with the EntityProperty, it's on this issue on Github. The commit that's causing this error is linked to the issue also -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
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? -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
Hm, I having a bit of an issue with my loot table, the item I made isn't dropping. Also the contionus bow I made, not all of the textures is being shown, it just shows the first two but not the last one. The Source for this issue is in this commit -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
I'm not sure but while I was looking at the pig entity coding, I did find where I can acutally add in other conditions that isn't added to Loot Tables -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
Ok so I made the entity property class but I'm not sure on how to acutally register it for the entity to use (And test to see if it works) -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
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. -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
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? -
[1.8 and 1.9] Having a few issues on 1.9 and 1.8
NovaViper replied to NovaViper's topic in Modder Support
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