Jump to content

BadBoy6767

Members
  • Posts

    58
  • Joined

  • Last visited

Everything posted by BadBoy6767

  1. Oh my god I know about that, I know how to read exceptions. My question is why is WGBukkit not in the classpath when you run the server?
  2. The problem is not with my code. It is the classpath of my project and how it's different at runtime.
  3. Here's the story (Sorry for it being so long, It's like this so there'll be less questions): I have been working on a small server and I noticed that ComputerCraft turtles are able to grief areas protected by the WorldGuard plugin. The reason was obvious (to me at least) and so I searched and found out that ComputerCraft has a small API. Using this API I can force turtles to not dig blocks (interfaces and polymorphism and all that crap). So in a Bukkit plugin I'm making, I added the ComputerCraft JAR to the classpath and called it from my plugin. After quitting due to dependency hell (The interface method had an argument of type net.minecraft.world.World, and for some reason the server JAR did not have that class), I tried doing it the other way. So I made a small server-only mod that used this ComputerCraft API. Everything compiled flawlessly and I put it in my servers "mods" folder. Everything was working until my test turtle tried to dig a block. The server crashed. The reason was that a WorldGuard class was not found. I assumed that all Forge/Bukkit mods would be in the same classpath at runtime. Seems that that is false. java.lang.NoClassDefFoundError: com/sk89q/worldguard/bukkit/WGBukkit at org.midnightas.axaxa.serverside.AxaxaServerside.isBlockEditable(AxaxaServerside.java:39) ~[AxaxaServerside.class:?] at dan200.computercraft.ComputerCraft.isBlockEditable(ComputerCraft.java:456) ~[ComputerCraft.class:?] at dan200.computercraft.shared.turtle.upgrades.TurtleTool.dig(TurtleTool.java:207) ~[TurtleTool.class:?] at dan200.computercraft.shared.turtle.upgrades.TurtleTool.useTool(TurtleTool.java:97) ~[TurtleTool.class:?] at dan200.computercraft.shared.turtle.core.TurtleToolCommand.execute(TurtleToolCommand.java:36) ~[TurtleToolCommand.class:?] at dan200.computercraft.shared.turtle.core.TurtleBrain.updateCommands(TurtleBrain.java:995) ~[TurtleBrain.class:?] at dan200.computercraft.shared.turtle.core.TurtleBrain.update(TurtleBrain.java:183) ~[TurtleBrain.class:?] at dan200.computercraft.shared.turtle.blocks.TileTurtle.func_145845_h(TileTurtle.java:278) ~[TileTurtle.class:?] at net.minecraft.world.World.func_72939_s(World.java:2548) ~[ahb.class:?] at net.minecraft.world.WorldServer.func_72939_s(WorldServer.java:673) ~[mt.class:?] at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:976) ~[MinecraftServer.class:?] at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:431) ~[lt.class:?] at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:831) ~[MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:683) [MinecraftServer.class:?] at java.lang.Thread.run(Thread.java:745) [?:1.8.0_111] Caused by: java.lang.ClassNotFoundException: com.sk89q.worldguard.bukkit.WGBukkit at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:191) ~[launchwrapper-1.12.jar:?] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_111] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_111] ... 15 more Caused by: java.lang.NullPointerException The exception says that my isBlockEditable (the interface method) was called, and line 39 is a line which uses the com.sk89q.worldguard.bukkit.WGBukkit class.
  4. One question, do you need to send the discriminator from the server?
  5. I want to slam my own face against a door. It was Spigot with the problem. Damn List taking an Object for the contains method instead of <E> !
  6. Here is my Spigot code: Bukkit.getMessenger().registerIncomingPluginChannel(this, "MCJS", new PluginMessageListener() { @Override public void onPluginMessageReceived(String channel, Player player, byte[] bytes) { System.out.println("HAHA"); ByteBuf buf = Unpooled.copiedBuffer(bytes); int type = buf.readByte(); if (type == TYPE_THIS_IS_THE_MCLUA_MOD_SPEAKING_HERE___OVER) { verifiedMCJSUsers.add(player.getUniqueId()); } } }); The plugin kicks the player off the server if my packet isn't received within 10 seconds.
  7. After switching ClientTickEvent.getPhase to just the phase field, the server still does not receive the message. Here is the main class code if it helps: package com.example.examplemod; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.script.ScriptException; import org.python.core.Py; import org.python.core.PyFunction; import org.python.util.PythonInterpreter; import net.minecraft.util.Tuple; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent; import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; import net.minecraftforge.fml.common.network.FMLNetworkEvent; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; import net.minecraftforge.fml.relauncher.Side; @Mod(modid = MCJS.MODID, version = MCJS.VERSION, name = "MCPY") public class MCJS { static MCJS instance; public static final String MODID = "mcpy"; public static final String VERSION = "1.0"; private PythonInterpreter python; public MCJSHook hooks; public SimpleNetworkWrapper simpleNetworkWrapper; public List<Runnable> tickQueue = new ArrayList<Runnable>(); public HashMap<String, MCJSPlayer> players = new HashMap<String, MCJSPlayer>(); @EventHandler public void preInit(FMLPreInitializationEvent event) throws ScriptException { this.instance = this; prepareForServer(); this.python.exec("def a():\n\tpass"); this.python.exec("hook.add(\"PlayerJoin\", \"test\", a)"); for (Tuple<String, Tuple<String, PyFunction>> tuple : hooks.hooks) System.out.println(tuple); MinecraftForge.EVENT_BUS.register(this); simpleNetworkWrapper = NetworkRegistry.INSTANCE.newSimpleChannel("MCJS"); simpleNetworkWrapper.registerMessage(MCJSMessage.Handler.class, MCJSMessage.class, 84, Side.SERVER); } public PythonInterpreter prepareForServer() { this.python = new PythonInterpreter(); hooks = new MCJSHook(); this.python.set("hook", Py.java2py(hooks)); return getPython(); } public PythonInterpreter getPython() { return this.python == null ? prepareForServer() : this.python; } @SubscribeEvent public void joinServer(FMLNetworkEvent.ClientConnectedToServerEvent e) { prepareForServer(); tickQueue.add(new Runnable() { public void run() { System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); simpleNetworkWrapper .sendToServer(new MCJSMessage(MCJSMessage.TYPE_THIS_IS_THE_MCLUA_MOD_SPEAKING_HERE___OVER, "")); } }); } @SubscribeEvent public void clientTick(ClientTickEvent e) { if (tickQueue.size() > 0 && e.phase == Phase.START) tickQueue.remove(0).run(); } }
  8. event.getPhase(); is returning an EventPriority for some reason. Although I've managed to make a List of Runnable s and have the first one in the list be called, but the server still does not see the packet.
  9. Any good way to wait a tick in the main class?
  10. I don't like the idea of having multiple messages. I saw another tutorial use 84, and I kind of automatically typed that in. Spigot is the server, The client is what will execute Python code. Already know about that. Okay, thank you, will do! Because Spigot is the server, it will not use Forge.
  11. I have this custom packet: public class MCJSMessage implements IMessage { public static class Handler implements IMessageHandler<MCJSMessage, IMessage> { @Override public IMessage onMessage(MCJSMessage message, MessageContext ctx) { if (message.type == TYPE_LOAD_LUA) { MCJS.instance.getPython().exec(message.string); } else if (message.type == TYPE_HOOK_PLAYER_JOIN) { MCJS.instance.hooks.call("PlayerJoin", new Object[] { new MCJSPlayer(FMLCommonHandler.instance().getMinecraftServerInstance() .getPlayerList().getPlayerByUUID(UUID.fromString(message.string))) }); } return null; } } public static final int TYPE_EMPTY = 0, TYPE_LOAD_LUA = 1, TYPE_HOOK_PLAYER_JOIN = 2, TYPE_THIS_IS_THE_MCLUA_MOD_SPEAKING_HERE___OVER = 3; int type = TYPE_EMPTY; String string = ""; public MCJSMessage() { } public MCJSMessage(int type, String string) { this.string = string; this.type = type; } @Override public void fromBytes(ByteBuf buf) { type = buf.readByte(); if (type != TYPE_THIS_IS_THE_MCLUA_MOD_SPEAKING_HERE___OVER) string = ByteBufUtils.readUTF8String(buf.readBytes(buf.readableBytes())); } @Override public void toBytes(ByteBuf buf) { buf.writeByte(type); if (type != TYPE_THIS_IS_THE_MCLUA_MOD_SPEAKING_HERE___OVER) buf.writeBytes(string.getBytes()); } } And it's being registered with simpleNetworkWrapper = NetworkRegistry.INSTANCE.newSimpleChannel("MCJS"); simpleNetworkWrapper.registerMessage(MCJSMessage.Handler.class, MCJSMessage.class, 84, Side.SERVER); After connecting to a server, the client is supposed to send a packet to the server telling it that the client is modified with my mod. If the server does not detect the packet, it's supposed to kick the player off the server. I think I send it normally: @SubscribeEvent public void joinServer(FMLNetworkEvent.ClientConnectedToServerEvent e) { resetPython(); System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); simpleNetworkWrapper.sendToServer(new MCJSMessage(MCJSMessage.TYPE_THIS_IS_THE_MCLUA_MOD_SPEAKING_HERE___OVER, "")); } But the server is not detecting this packet. I think it's something wrong with my Forge code. Am I doing something wrong here?
  12. Specifically Java. I have intermediate knowledge of Java and have looked at many Minecraft launcher's source codes and couldn't understand anything. Is there a way to run Minecraft (with forge and mods) from the command line or Runtime.getRuntime().exec?
  13. NovaMod.java: http://pastebin.com/Q00rCHD0 PacketNova.java: http://pastebin.com/duvJ3NDb I compressed the handler into the packet class.
  14. I told you, I'm back at problem 1: The method registerMessage(Class<? extends IMessageHandler<REQ,REPLY>>, Class<REQ>, int, Side) in the type SimpleNetworkWrapper is not applicable for the arguments (Class<PacketNova.Handler>, Class<PacketNova>, int, Side)
  15. I copy pasted your code thinking I did something wrong and nope. I'm back at problem 1.
  16. If that is so, how would I get Forge and Bukkit to communicate? (PS. I already saw those 2 tutorials, I'm doing this off of diesiebens one. Here are the codes (They are in 2 different files): // Packet package org.midnightas.novarp; import io.netty.buffer.ByteBuf; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; public class PacketNova implements IMessage { @Override public void fromBytes(ByteBuf bb) { } @Override public void toBytes(ByteBuf bb) { } } // Packet Handler package org.midnightas.novarp; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; public class PacketNovaHandler<REQ extends IMessage, REPLY extends IMessage> implements IMessageHandler<REQ, REPLY> { @Override public REPLY onMessage(REQ req, MessageContext c) { return null; } } If I change this line: public class PacketNovaHandler<REQ extends IMessage, REPLY extends IMessage> implements IMessageHandler<REQ, REPLY> { to this: public class PacketNovaHandler<REQ, REPLY> implements IMessageHandler<REQ, REPLY> { I get this error on both REQ and REPLY next to IMessageHandler: Bound mismatch: The type (REQ/REPLY) is not a valid substitute for the bounded parameter <(REQ/REPLY) extends IMessage> of the type IMessageHandler<REQ,REPLY>
  17. Hey everyone, I'm trying to get a server to send a packet to a client using the 250'th packet. When the packet is reached the client starts music from the url given in the packet. I'm having trouble coding the part where the client handles the packet. I'm trying to use the registerMessage method however to no avail. This is my code: package org.midnightas.novarp; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; import net.minecraftforge.fml.relauncher.Side; @Mod(modid = NovaMod.MODID, version = NovaMod.VERSION) public class NovaMod { public static final String MODID = "novamod"; public static final String VERSION = "1.0"; public static SimpleNetworkWrapper wrapper; @EventHandler public void init(FMLPreInitializationEvent event) { wrapper = NetworkRegistry.INSTANCE.newSimpleChannel("novachannel"); wrapper.registerMessage(PacketNovaHandler.class, PacketNova.class, 0, Side.CLIENT); } } ( I do have the PacketNovaHandler class and the PacketNova class (they do not have syntax errors) ) I receive this message at the registerMessage method: The method registerMessage(Class<? extends IMessageHandler<REQ,REPLY>>, Class<REQ>, int, Side) in the type SimpleNetworkWrapper is not applicable for the arguments (Class<PacketNovaHandler>, Class<PacketNova>, int, Side) I didn't know there were more generics here ;( How would I fix that?
  18. Unfortunately I do not know how to do both of those methods. What do you mean by debugger? Do you mean always printing to see if methods get called?
  19. Nope, no blocks in those coordinates. But when I teleport to them then new chunks generate where I teleported to.. Is that strange?
  20. I just repeated the "remove all stone" technique and still nothing.
  21. Okay, so System.out.println is called in the generateSurface method so it is being called. However when I used MCEdit and replaced all stone, dirt and grass, my block wasn't there.
  22. generate() gets called. However I still tried out everywhere and found nothing.
×
×
  • Create New...

Important Information

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