I can't even get the bytecode plugin to install...
I'm just trying to see if I can modify the max enchant levels of a couple of enchantments...
Cannot complete the install because one or more required items could not be found.
Software currently installed: Bytecode Outline 2.0.2 (de.loskutov.BytecodeOutline.feature.feature.group 2.0.2)
Missing requirement: Bytecode Outline Plug-in 2.0.2 (de.loskutov.BytecodeOutline 2.0.2) requires 'bundle org.eclipse.help.appserver 0.0.0' but it could not be found
Cannot satisfy dependency:
From: Bytecode Outline 2.0.2 (de.loskutov.BytecodeOutline.feature.feature.group 2.0.2)
To: de.loskutov.BytecodeOutline [2.0.2]
I can't even get the bytecode plugin to install...
I'm just trying to see if I can modify the max enchant levels of a couple of enchantments...
Cannot complete the install because one or more required items could not be found.
Software currently installed: Bytecode Outline 2.0.2 (de.loskutov.BytecodeOutline.feature.feature.group 2.0.2)
Missing requirement: Bytecode Outline Plug-in 2.0.2 (de.loskutov.BytecodeOutline 2.0.2) requires 'bundle org.eclipse.help.appserver 0.0.0' but it could not be found
Cannot satisfy dependency:
From: Bytecode Outline 2.0.2 (de.loskutov.BytecodeOutline.feature.feature.group 2.0.2)
To: de.loskutov.BytecodeOutline [2.0.2]
I had this problem as well. It is a bug in either eclipse or Bytecode installation through the install new features. If you are using a later version of eclipse, you can install it successfully by going to the built-in eclipse marketplace: Help->Eclipse Marketplace... Search for ASM Bytecode, and the first option is Bytecode Outline. This is what you want. Just click install under it.
Now, how do I find it in eclipse? I looked through preferences and everything else I could think of to find how to enable the plugin, but I haven't found a reference to it.
Now, how do I find it in eclipse? I looked through preferences and everything else I could think of to find how to enable the plugin, but I haven't found a reference to it.
No problem.
I had to do a bit of googling when I first started using it. Open the class you want to show and go to: Window->Show View->Other->Java->Bytecode. It will display as a tab on one of your windows.
2013-09-08 16:10:28 [INFO] [STDOUT] Patching Complete!
2013-09-08 16:10:28 [SEVERE] [ForgeModLoader] Unable to launch
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at net.minecraft.launchwrapper.Launch.launch(Launch.java:57)
at net.minecraft.launchwrapper.Launch.main(Launch.java:18)
Caused by: java.lang.NoClassDefFoundError: net/minecraft/entity/player/EntityPlayer
at net.minecraft.client.main.Main.main(Main.java:37)
... 6 more
Caused by: java.lang.ClassNotFoundException: net.minecraft.entity.player.EntityPlayer
at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:179)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 7 more
Caused by: java.lang.NullPointerException
at org.objectweb.asm.Frame.merge(Frame.java:1292)
at org.objectweb.asm.MethodWriter.visitMaxs(MethodWriter.java:1303)
at org.objectweb.asm.tree.MethodNode.accept(MethodNode.java:592)
at org.objectweb.asm.tree.MethodNode.accept(MethodNode.java:515)
at org.objectweb.asm.tree.ClassNode.accept(ClassNode.java:340)
at portables.asm.ClassTransformer.patchClassEnitityPlayer(ClassTransformer.java:97)
at portables.asm.ClassTransformer.transform(ClassTransformer.java:26)
at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:267)
at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:165)
... 9 more
Try changing
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
to
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
The Meaning of Life, the Universe, and Everything.
Join Date:
5/26/2012
Posts:
117
Member Details
It gives me this:
2013-09-18 21:30:46 [INFO] [STDERR] java.lang.VerifyError: Expecting a stackmap frame at branch target 245 in method net.minecraft.entity.player.EntityPlayer.onUpdate()V at offset 246
2013-09-18 21:30:46 [INFO] [STDERR] at net.minecraft.server.management.ServerConfigurationManager.createPlayerForUser(ServerConfigurationManager.java:389)
2013-09-18 21:30:46 [INFO] [STDERR] at net.minecraft.server.integrated.IntegratedServerListenThread.networkTick(IntegratedServerListenThread.java:91)
2013-09-18 21:30:46 [INFO] [STDERR] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:689)
2013-09-18 21:30:46 [INFO] [STDERR] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:585)
2013-09-18 21:30:46 [INFO] [STDERR] at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:129)
2013-09-18 21:30:46 [INFO] [STDERR] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:482)
2013-09-18 21:30:46 [INFO] [STDERR] at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16)
2013-09-18 21:30:46 [SEVERE] [Minecraft-Server] Encountered an unexpected exception VerifyError
java.lang.VerifyError: Expecting a stackmap frame at branch target 245 in method net.minecraft.entity.player.EntityPlayer.onUpdate()V at offset 246
at net.minecraft.server.management.ServerConfigurationManager.createPlayerForUser(ServerConfigurationManager.java:389)
at net.minecraft.server.integrated.IntegratedServerListenThread.networkTick(IntegratedServerListenThread.java:91)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:689)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:585)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:129)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:482)
at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16)
The Meaning of Life, the Universe, and Everything.
Location:
Toronto
Join Date:
9/5/2012
Posts:
42
Minecraft:
playing_w_blocks
Member Details
So I think I've got everything set up correctly to the point where I want to add instructions to the method isBoudingBoxBurning in .net.minecraft.world.World.java (I've chosen to patch as I'm guessing alot of mods might want to mess with world.java);
basically I need to change line 2342 from
if (j2 == Block.fire.blockID|| j2 == Block.lavaMoving.blockID|| j2 == Block.lavaStill.blockID)
I guess my question is, would it be easier to add in the fieldnode-instructions in my transformer class (and if so, how do I do that?/are there any examples of this in Culegooner's github? ) OR would it be simpler to remove the original method and reinsert the modified version (again, what would that look like?)
*edit - is there a way to patch method in class without having to target anything more specific than the method?
Can you describe how to find the name of the obfuscated version of a class or method? I'm not sure I understand.
In your 'mcp' folder there is a folder called 'conf'
In that folder are several files, which contain the obfuscated and deobfuscated names of all the classes, methods, and variables. For example, let's say I wanted to find 'canInsertItem' in 'TileEntityBrewingStand'
To do that, I would first find 'canInsertItem' in 'methods.srg' which is 'func_102007_a'
I would then search for that (func_102007_a) in 'joined.srg' (I would recommend copying it, and using 'ctrl + f'), which turns out to be 'aru/a' - 'aru' is the class, and 'a' is the method.
Finding variables is the same, except you look in 'fields.srg' instead of 'methods.srg'
If you want to just find the class itself, look in 'joined.srg' - they're all at the top.
I'm currently having an issue replacing the World class of the game, using the replacing the world class tutorial. It appears to patch:
Client> 2013-10-06 20:42:31 [INFO] [STDOUT] INSIDE OF WORLD ABOUT TO PATCH: abw
Client> 2013-10-06 20:42:31 [INFO] [STDOUT] [ColoredLights]: Class abw patched!
However, I soon get this error:
Client> java.lang.reflect.InvocationTargetException
Client> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Client> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
Client> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Client> at java.lang.reflect.Method.invoke(Method.java:601)
Client> at net.minecraft.launchwrapper.Launch.launch(Launch.java:131)
Client> at net.minecraft.launchwrapper.Launch.main(Launch.java:27)
Client> Caused by: java.lang.NoClassDefFoundError: net/minecraft/world/World
Client> at net.minecraft.client.main.Main.main(SourceFile:37)
Client> ... 6 more
Client> Caused by: java.lang.ClassNotFoundException: net.minecraft.world.World
Client> at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:186)
Client> at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
Client> at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
Client> ... 7 more
Client> Caused by: java.lang.NullPointerException
Client> at org.objectweb.asm.Type.getArgumentTypes(Unknown Source)
Client> at org.objectweb.asm.commons.Remapper.mapMethodDesc(Unknown Source)
Client> at org.objectweb.asm.commons.RemappingClassAdapter.visitMethod(Unknown Source)
Client> at org.objectweb.asm.ClassReader.b(Unknown Source)
Client> at org.objectweb.asm.ClassReader.accept(Unknown Source)
Client> at org.objectweb.asm.ClassReader.accept(Unknown Source)
Client> at cpw.mods.fml.common.asm.transformers.DeobfuscationTransformer.transform(DeobfuscationTransformer.java:39)
Client> at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:274)
Client> at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:172)
Client> ... 9 more
Could you provide the source of your transformer class?
How do you read the zip's/jar's input stream? With just one InputStream.read()-call or by calling read() repetitively till the end of the file is reached?
Just like I thought. InputStream's read() method returns just a chunk of data (as much as it gets in the current access call), not the whole file. You have to call read() repetitively till there are no more bytes to read.
I will quote karyonix here, as he describes the problem and it's solution in detail:
Thanks, that appears to have worked. However, it does not appear like my files are actually being patched into the jar.
package yamhaven.easycoloredlights.asm;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import net.minecraft.launchwrapper.IClassTransformer;
public class CLClassTransformer implements IClassTransformer
{
@Override
public byte[] transform(String arg0, String arg1, byte[] arg2)
{
if(arg0.equals("bfr") || arg0.equals("net.minecraft.client.renderer.RenderBlocks"))
{
System.out.println(" INSIDE RENDERBLOCKS ABOUT TO PATCH: " + arg0);
arg2 = patchClassInJar(arg0, arg2, arg0, CLFMLLoadingPlugin.location);
}
if(arg0.equals("abw") || arg0.equals("net.minecraft.world.World"))
{
System.out.println(" INSIDE WORLD ABOUT TO PATCH: " + arg0);
arg2 = patchClassInJar(arg0, arg2, arg0, CLFMLLoadingPlugin.location);
}
if(arg0.equals("ads") || arg0.equals("net.minecraft.world.chunk.storage.ExtendedBlockStorage"))
{
System.out.println(" INSIDE EXTENDEDBLOCKSTORAGE ABOUT TO PATCH: " + arg0);
arg2 = patchClassInJar(arg0, arg2, arg0, CLFMLLoadingPlugin.location);
}
if(arg0.equals("aqz") || arg0.equals("net.minecraft.block.Block"))
{
System.out.println(" INSIDE BLOCK ABOUT TO PATCH: " + arg0);
arg2 = patchClassInJar(arg0, arg2, arg0, CLFMLLoadingPlugin.location);
}
if(arg0.equals("bfq") || arg0.equals("net.minecraft.client.renderer.Tessellator"))
{
System.out.println(" INSIDE TESSELLATOR ABOUT TO PATCH: " + arg0);
arg2 = patchClassInJar(arg0, arg2, arg0, CLFMLLoadingPlugin.location);
}
return arg2;
}
public byte[] patchClassInJar(String name, byte[] bytes, String ObfName, File location)
{
try
{
ZipFile zip = new ZipFile(location);
ZipEntry entry = zip.getEntry(name.replace('.', '/') + ".class");
if(entry == null)
{
System.out.println(name + " not found in " + location.getName());
}
else
{
InputStream in = zip.getInputStream(entry);
int size = (int) entry.getSize();
byte[] newbytes = new byte[size];
int pos = 0;
while(pos < size)
{
int len = in.read(newbytes, pos, size - pos);
if(len == 0)
{
throw new IOException();
}
pos += len;
}
in.close();
System.out.println("[ColoredLights]: " + "Class " + name + " patched!");
}
zip.close();
}
catch(Exception e)
{
throw new RuntimeException("Error overriding " + name + " from " + location.getName(), e);
}
return bytes;
}
}
That's my current transformer. Not sure where I went wrong.
I don't know what I'm missing, but I can't figure out how to run the coremod in a dev enviorment. I would have assumed it would be able to pull the pre-injected mod off the classpath like it can with normal mods, but apparently not. All I have is a dummy transformer, it just returns the input bytes.
I don't know what I'm missing, but I can't figure out how to run the coremod in a dev enviorment. I would have assumed it would be able to pull the pre-injected mod off the classpath like it can with normal mods, but apparently not. All I have is a dummy transformer, it just returns the input bytes.
Running the coremod in your development enviroment
--------------------------------------------------------
This is how I run coremods in my development enviroment. There is another way using the argument fml.coreMods.load, but I never tried that. I use the approach I'm explaining here since I could also include the class patches to it as in the example of CreeperBurnCore discussed earlier.
If you still want to use the fml.coreMods.load argument, then just type the following in your VM arguments of your run configuration. If you have multiple coremods you seperate them with a comma.
First create a directory called META-INF.
Inside the META-INF folder create a file called MANIFEST.MF
Edit the file and for the line FMLCorePlugin write the fully qualified name of the class that implements the IFMLLoadingPlugin interface.
Make sure to include the other 2 lines as well.
Compress the directory into a zip using winrar or 7zip and rename the file to have the extension .jar instead of .zip (Don't compress into a .rar format!)
I'm just trying to see if I can modify the max enchant levels of a couple of enchantments...
Cannot complete the install because one or more required items could not be found.
Software currently installed: Bytecode Outline 2.0.2 (de.loskutov.BytecodeOutline.feature.feature.group 2.0.2)
Missing requirement: Bytecode Outline Plug-in 2.0.2 (de.loskutov.BytecodeOutline 2.0.2) requires 'bundle org.eclipse.help.appserver 0.0.0' but it could not be found
Cannot satisfy dependency:
From: Bytecode Outline 2.0.2 (de.loskutov.BytecodeOutline.feature.feature.group 2.0.2)
To: de.loskutov.BytecodeOutline [2.0.2]
- Buggi -
My Humble YouTube Channel
https://www.youtube.com/c/FlexibleGames
Featuring in-depth and technical gameplay with games like Minecraft, Factorio, and others.
I had this problem as well. It is a bug in either eclipse or Bytecode installation through the install new features. If you are using a later version of eclipse, you can install it successfully by going to the built-in eclipse marketplace: Help->Eclipse Marketplace... Search for ASM Bytecode, and the first option is Bytecode Outline. This is what you want. Just click install under it.
Now, how do I find it in eclipse? I looked through preferences and everything else I could think of to find how to enable the plugin, but I haven't found a reference to it.
- Buggi -
My Humble YouTube Channel
https://www.youtube.com/c/FlexibleGames
Featuring in-depth and technical gameplay with games like Minecraft, Factorio, and others.
No problem.
I had to do a bit of googling when I first started using it. Open the class you want to show and go to: Window->Show View->Other->Java->Bytecode. It will display as a tab on one of your windows.
sometimes it's the simple things that go undocumented
- Buggi -
My Humble YouTube Channel
https://www.youtube.com/c/FlexibleGames
Featuring in-depth and technical gameplay with games like Minecraft, Factorio, and others.
-
View User Profile
-
View Posts
-
Send Message
Curse PremiumTry changing to
-
View User Profile
-
View Posts
-
Send Message
Curse Premium2013-09-18 21:30:46 [INFO] [STDERR] at net.minecraft.server.management.ServerConfigurationManager.createPlayerForUser(ServerConfigurationManager.java:389)
2013-09-18 21:30:46 [INFO] [STDERR] at net.minecraft.server.integrated.IntegratedServerListenThread.networkTick(IntegratedServerListenThread.java:91)
2013-09-18 21:30:46 [INFO] [STDERR] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:689)
2013-09-18 21:30:46 [INFO] [STDERR] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:585)
2013-09-18 21:30:46 [INFO] [STDERR] at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:129)
2013-09-18 21:30:46 [INFO] [STDERR] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:482)
2013-09-18 21:30:46 [INFO] [STDERR] at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16)
2013-09-18 21:30:46 [SEVERE] [Minecraft-Server] Encountered an unexpected exception VerifyError
java.lang.VerifyError: Expecting a stackmap frame at branch target 245 in method net.minecraft.entity.player.EntityPlayer.onUpdate()V at offset 246
at net.minecraft.server.management.ServerConfigurationManager.createPlayerForUser(ServerConfigurationManager.java:389)
at net.minecraft.server.integrated.IntegratedServerListenThread.networkTick(IntegratedServerListenThread.java:91)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:689)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:585)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:129)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:482)
at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16)
-
View User Profile
-
View Posts
-
Send Message
Curse Premiumbasically I need to change line 2342 from
to
I guess my question is, would it be easier to add in the fieldnode-instructions in my transformer class (and if so, how do I do that?/are there any examples of this in Culegooner's github? ) OR would it be simpler to remove the original method and reinsert the modified version (again, what would that look like?)
*edit - is there a way to patch method in class without having to target anything more specific than the method?
-
View User Profile
-
View Posts
-
Send Message
Curse PremiumIn that folder are several files, which contain the obfuscated and deobfuscated names of all the classes, methods, and variables. For example, let's say I wanted to find 'canInsertItem' in 'TileEntityBrewingStand'
To do that, I would first find 'canInsertItem' in 'methods.srg' which is 'func_102007_a'
I would then search for that (func_102007_a) in 'joined.srg' (I would recommend copying it, and using 'ctrl + f'), which turns out to be 'aru/a' - 'aru' is the class, and 'a' is the method.
Finding variables is the same, except you look in 'fields.srg' instead of 'methods.srg'
If you want to just find the class itself, look in 'joined.srg' - they're all at the top.
Make sense?
-tlf
-
View User Profile
-
View Posts
-
Send Message
Curse Premium-tlf
-
View User Profile
-
View Posts
-
Send Message
Retired StaffHowever, I soon get this error:
-
View User Profile
-
View Posts
-
Send Message
Retired StaffThat is my transformer class.
-
View User Profile
-
View Posts
-
Send Message
Retired StaffThanks, that appears to have worked. However, it does not appear like my files are actually being patched into the jar.
package yamhaven.easycoloredlights.asm; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import net.minecraft.launchwrapper.IClassTransformer; public class CLClassTransformer implements IClassTransformer { @Override public byte[] transform(String arg0, String arg1, byte[] arg2) { if(arg0.equals("bfr") || arg0.equals("net.minecraft.client.renderer.RenderBlocks")) { System.out.println(" INSIDE RENDERBLOCKS ABOUT TO PATCH: " + arg0); arg2 = patchClassInJar(arg0, arg2, arg0, CLFMLLoadingPlugin.location); } if(arg0.equals("abw") || arg0.equals("net.minecraft.world.World")) { System.out.println(" INSIDE WORLD ABOUT TO PATCH: " + arg0); arg2 = patchClassInJar(arg0, arg2, arg0, CLFMLLoadingPlugin.location); } if(arg0.equals("ads") || arg0.equals("net.minecraft.world.chunk.storage.ExtendedBlockStorage")) { System.out.println(" INSIDE EXTENDEDBLOCKSTORAGE ABOUT TO PATCH: " + arg0); arg2 = patchClassInJar(arg0, arg2, arg0, CLFMLLoadingPlugin.location); } if(arg0.equals("aqz") || arg0.equals("net.minecraft.block.Block")) { System.out.println(" INSIDE BLOCK ABOUT TO PATCH: " + arg0); arg2 = patchClassInJar(arg0, arg2, arg0, CLFMLLoadingPlugin.location); } if(arg0.equals("bfq") || arg0.equals("net.minecraft.client.renderer.Tessellator")) { System.out.println(" INSIDE TESSELLATOR ABOUT TO PATCH: " + arg0); arg2 = patchClassInJar(arg0, arg2, arg0, CLFMLLoadingPlugin.location); } return arg2; } public byte[] patchClassInJar(String name, byte[] bytes, String ObfName, File location) { try { ZipFile zip = new ZipFile(location); ZipEntry entry = zip.getEntry(name.replace('.', '/') + ".class"); if(entry == null) { System.out.println(name + " not found in " + location.getName()); } else { InputStream in = zip.getInputStream(entry); int size = (int) entry.getSize(); byte[] newbytes = new byte[size]; int pos = 0; while(pos < size) { int len = in.read(newbytes, pos, size - pos); if(len == 0) { throw new IOException(); } pos += len; } in.close(); System.out.println("[ColoredLights]: " + "Class " + name + " patched!"); } zip.close(); } catch(Exception e) { throw new RuntimeException("Error overriding " + name + " from " + location.getName(), e); } return bytes; } }That's my current transformer. Not sure where I went wrong.
-
View User Profile
-
View Posts
-
Send Message
Retired StaffHere's the error:
LoadingPlugin:
package yamhaven.easycoloredlights.asm; import java.io.File; import java.util.Map; import cpw.mods.fml.relauncher.IFMLLoadingPlugin; public class CLFMLLoadingPlugin implements IFMLLoadingPlugin { public static File location; @Override public String[] getASMTransformerClass() { return new String[] { CLClassTransformer.class.getName() }; } @Override public void injectData(Map<String, Object> data) { location = (File)data.get("coremodLocation"); } @Override public String[] getLibraryRequestClass() { return null; } @Override public String getModContainerClass() { return CLDummyContainer.class.getName(); } @Override public String getSetupClass() { return null; } }and here's my MANIFEST.MF file:
This only happens when I try to use the new class's methods from a different mod.
My main mod file for the mod that's trying to use the new method:
@EventHandler public static void preInit(FMLPreInitializationEvent event) { } @EventHandler public static void init(FMLInitializationEvent event) { } @EventHandler public static void postInit(FMLPostInitializationEvent event) { ConfigHandler.init(); Blocks.init(); Blocks.addNames(); Blocks.addBlockRecipes(); }-
View User Profile
-
View Posts
-
Send Message
Retired StaffThanks, that did fix my issue.
-
View User Profile
-
View Posts
-
Send Message
Curse Premium-tlf