Solved Event(s) not firing

Discussion in 'Plugin Development' started by ZodiacTheories, Jun 12, 2014.

Thread Status:
Not open for further replies.
  1. Offline

    ZodiacTheories

    Hi, so I am making a plugin where if a Player interacts with a chest, they will get a reward. For some reason, this event is not firing. I am getting no errors in the console. Here is my code:

    Code:java
    1. package me.zodiactheories.coolcrates;
    2.  
    3. import java.util.ArrayList;
    4. import java.util.List;
    5. import net.milkbowl.vault.economy.Economy;
    6. import org.bukkit.plugin.RegisteredServiceProvider;
    7. import org.bukkit.plugin.java.JavaPlugin;
    8.  
    9. public class Main extends JavaPlugin {
    10.  
    11. public static Economy econ = null;
    12.  
    13. public void onEnable() {
    14. if (!setupEconomy() ) {
    15. getLogger().severe(String.format("[%s] - Disabled due to no Vault dependency found!", getDescription().getName()));
    16. getServer().getPluginManager().disablePlugin(this);
    17. getServer().getPluginManager().registerEvents(new Prizes(), this);
    18. getServer().getPluginManager().registerEvents(new Prizes2(), this);
    19. getServer().getPluginManager().registerEvents(new Prizes3(), this);
    20. getServer().getPluginManager().registerEvents(new Prizes4(), this);
    21. return;
    22. }
    23. }
    24.  
    25. private boolean setupEconomy() {
    26. if (getServer().getPluginManager().getPlugin("Vault") == null) {
    27. return false;
    28. }
    29. RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
    30. if (rsp == null) {
    31. return false;
    32. }
    33. econ = rsp.getProvider();
    34. return econ != null;
    35. }
    36.  
    37. public static List<String> hasprize = new ArrayList<String>();
    38.  
    39. public static List<String> getPlayersWithPrize() {
    40. return hasprize;
    41. }
    42. }


    Code:java
    1. package me.zodiactheories.coolcrates;
    2.  
    3. import java.util.Random;
    4.  
    5. import net.milkbowl.vault.economy.EconomyResponse;
    6.  
    7. import org.bukkit.ChatColor;
    8. import org.bukkit.entity.Player;
    9. import org.bukkit.event.EventHandler;
    10. import org.bukkit.event.Listener;
    11. import org.bukkit.event.block.Action;
    12. import org.bukkit.event.player.PlayerInteractEvent;
    13.  
    14. public class Prizes implements Listener {
    15.  
    16. Random random = new Random();
    17. int percentage = random.nextInt(100);
    18.  
    19. @EventHandler
    20. public void onOpen(PlayerInteractEvent e) {
    21. Player p = e.getPlayer();
    22. if(p.hasPermission("crate.open")) {
    23. if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK) || e.getAction().equals(Action.RIGHT_CLICK_AIR) || e.getAction().equals(Action.LEFT_CLICK_BLOCK) || e.getAction().equals(Action.LEFT_CLICK_AIR)) {
    24. if(percentage > 30) {
    25. if(!(Main.getPlayersWithPrize().contains(p.getName()))) {
    26. String uuid = p.getUniqueId().toString();
    27. @SuppressWarnings("deprecation")
    28. EconomyResponse r = Main.econ.depositPlayer(uuid, 1000000);
    29. Main.getPlayersWithPrize().add(uuid);
    30. p.sendMessage(ChatColor.GREEN + "Good Job! You got 1,000,000!!!!");
    31. }
    32. }
    33. }
    34. }
    35. }
    36. }


    Code:java
    1. package me.zodiactheories.coolcrates;
    2.  
    3. import java.util.Random;
    4.  
    5. import net.milkbowl.vault.economy.EconomyResponse;
    6.  
    7. import org.bukkit.ChatColor;
    8. import org.bukkit.entity.Player;
    9. import org.bukkit.event.EventHandler;
    10. import org.bukkit.event.Listener;
    11. import org.bukkit.event.block.Action;
    12. import org.bukkit.event.player.PlayerInteractEvent;
    13.  
    14. public class Prizes2 implements Listener {
    15.  
    16. Random random = new Random();
    17. int percentage = random.nextInt(100);
    18.  
    19. @EventHandler
    20. public void onOpen(PlayerInteractEvent e) {
    21. Player p = e.getPlayer();
    22. if(p.hasPermission("crate.open")) {
    23. if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK) || e.getAction().equals(Action.RIGHT_CLICK_AIR) || e.getAction().equals(Action.LEFT_CLICK_BLOCK) || e.getAction().equals(Action.LEFT_CLICK_AIR)) {
    24. if(percentage > 20) {
    25. if(!(Main.getPlayersWithPrize().contains(p.getName()))) {
    26. String uuid = p.getUniqueId().toString();
    27. @SuppressWarnings("deprecation")
    28. EconomyResponse r = Main.econ.depositPlayer(uuid, 2000000);
    29. Main.getPlayersWithPrize().add(uuid);
    30. p.sendMessage(ChatColor.GREEN + "Good Job! You got 2,000,000!!!!");
    31. }
    32. }
    33. }
    34. }
    35. }
    36. }


    The rest of the classes are like Prizes and Prizes2, just customised the prizes
     
  2. Offline

    L33m4n123

    You only register your events if theres no economy plugin installed
     
  3. Offline

    ZodiacTheories

    L33m4n123

    Ill try it out now

    L33m4n123

    Still doesn't work

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 8, 2016
  4. Offline

    Garris0n

    Post the current code.
     
  5. Offline

    ZodiacTheories

    Garris0n

    Code:java
    1. package me.zodiactheories.coolcrates;
    2.  
    3. import java.util.ArrayList;
    4. import java.util.List;
    5. import net.milkbowl.vault.economy.Economy;
    6. import org.bukkit.plugin.RegisteredServiceProvider;
    7. import org.bukkit.plugin.java.JavaPlugin;
    8.  
    9. public class Main extends JavaPlugin {
    10.  
    11. public static Economy econ = null;
    12.  
    13. public void onEnable() {
    14. if (!setupEconomy() ) {
    15. getLogger().severe(String.format("[%s] - Disabled due to no Vault dependency found!", getDescription().getName()));
    16. return;
    17. }
    18. }
    19.  
    20. private boolean setupEconomy() {
    21. if (getServer().getPluginManager().getPlugin("Vault") == null) {
    22. return false;
    23. }
    24. RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
    25. if (rsp == null) {
    26. return false;
    27. }
    28. econ = rsp.getProvider();
    29. return econ != null;
    30. }
    31.  
    32. public static List<String> hasprize = new ArrayList<String>();
    33.  
    34. public static List<String> getPlayersWithPrize() {
    35. return hasprize;
    36. }
    37. }
    38.  


    Haven't changed my Event classes
     
  6. Offline

    Garris0n

    But...now you don't register your events at all.
     
  7. Offline

    ZodiacTheories

    Huh?

    Ooohh wait, I mis-read L33m4n123

    I was reading it as a general thing, not a problem with my code :p

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 8, 2016
  8. Offline

    fireblast709

    ZodiacTheories Also try to refrain from using static, and try using the constructor instead:
    Code:java
    1. private final Main main;
    2.  
    3. public Prize(Main main)
    4. {
    5. this.main = main;
    6. }
    Now you can do the following:
    Code:java
    1. main.getPlayersWithPrize();
    without the need of static :p
     
    Garris0n likes this.
  9. Offline

    ZodiacTheories

    fireblast709

    Thanks :D

    fireblast709 Garris0n L33m4n123

    I tried this and it doesn't work:

    Code:java
    1. package me.zodiactheories.coolcrates;
    2.  
    3. import java.util.ArrayList;
    4. import java.util.List;
    5. import net.milkbowl.vault.economy.Economy;
    6. import org.bukkit.plugin.RegisteredServiceProvider;
    7. import org.bukkit.plugin.java.JavaPlugin;
    8.  
    9. public class Main extends JavaPlugin {
    10.  
    11. public static Economy econ = null;
    12.  
    13. public void onEnable() {
    14. if (!setupEconomy() ) {
    15. getLogger().severe(String.format("[%s] - Disabled due to no Vault dependency found!", getDescription().getName()));
    16. getServer().getPluginManager().registerEvents(new Prizes(), this);
    17. getServer().getPluginManager().registerEvents(new Prizes2(), this);
    18. getServer().getPluginManager().registerEvents(new Prizes3(), this);
    19. getServer().getPluginManager().registerEvents(new Prizes4(), this);
    20. return;
    21. }
    22. }
    23.  
    24. private boolean setupEconomy() {
    25. if (getServer().getPluginManager().getPlugin("Vault") != null) {
    26. return false;
    27. }
    28. RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
    29. if (rsp == null) {
    30. return false;
    31. }
    32. econ = rsp.getProvider();
    33. return econ != null;
    34. }
    35.  
    36. public static List<String> hasprize = new ArrayList<String>();
    37.  
    38. public static List<String> getPlayersWithPrize() {
    39. return hasprize;
    40. }
    41. }


    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 8, 2016
  10. Offline

    Rocoty

    ZodiacTheories You're still only registering the events if economy does not exist.
     
  11. Offline

    theguynextdoor

    ZodiacTheories Look at on your onEnable method. Read it through.

    When the plugin loads, you check if the economy is 'setup'. If it isn't then you are printing that you shall disable the plugin. You then register your events, and finally disable the plugin. If the economy is 'setup', then what are you going to do? well according to your onEnable, not a lot.
     
  12. Offline

    ZodiacTheories

    Rocoty

    Oh, I'll try that again. I was also going to post a stack trace, it seems like I am getting a NPE at line 28 of Prizes, should I add SuppressedWarnings?

    Thanks

    theguynextdoor

    I copied the code from the Vault wiki, I will read it through though and check to see if I have made any errors though.

    theguynextdoor Rocoty

    Ok, now I get it logically, if !setupEconomy then I disable it and register the events, so I basically register the events of a a plugin that is disabled. Now I am going to try and fix it :)

    Ok, I have fixed it by:

    Code:java
    1. package me.zodiactheories.coolcrates;
    2.  
    3. import java.util.ArrayList;
    4. import java.util.List;
    5. import net.milkbowl.vault.economy.Economy;
    6. import org.bukkit.plugin.RegisteredServiceProvider;
    7. import org.bukkit.plugin.java.JavaPlugin;
    8.  
    9. public class Main extends JavaPlugin {
    10.  
    11. public static Economy econ = null;
    12.  
    13. public void onEnable() {
    14. if (!setupEconomy() ) {
    15. getLogger().severe(String.format("[%s] - Disabled due to no Vault dependency found!", getDescription().getName()));
    16. }
    17. getServer().getPluginManager().registerEvents(new Prizes(), this);
    18. getServer().getPluginManager().registerEvents(new Prizes2(), this);
    19. getServer().getPluginManager().registerEvents(new Prizes3(), this);
    20. getServer().getPluginManager().registerEvents(new Prizes4(), this);
    21. return;
    22. }
    23.  
    24.  
    25.  
    26. private boolean setupEconomy() {
    27. if (getServer().getPluginManager().getPlugin("Vault") == null) {
    28. return true;
    29. }
    30. RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
    31. if (rsp == null) {
    32. return false;
    33. }
    34. econ = rsp.getProvider();
    35. return econ != null;
    36. }
    37.  
    38. public static List<String> hasprize = new ArrayList<String>();
    39.  
    40. public static List<String> getPlayersWithPrize() {
    41. return hasprize;
    42. }
    43. }


    But I have a problem. Everytime my event fires, it bypasses the percentages, so I get the same prize everytime, here is my code for the prize I get every time:

    Code:java
    1. package me.zodiactheories.coolcrates;
    2.  
    3. import java.util.Random;
    4.  
    5. import net.milkbowl.vault.economy.EconomyResponse;
    6.  
    7. import org.bukkit.ChatColor;
    8. import org.bukkit.Material;
    9. import org.bukkit.entity.Player;
    10. import org.bukkit.event.EventHandler;
    11. import org.bukkit.event.Listener;
    12. import org.bukkit.event.block.Action;
    13. import org.bukkit.event.player.PlayerInteractEvent;
    14. import org.bukkit.inventory.ItemStack;
    15.  
    16. public class Prizes4 implements Listener {
    17.  
    18. Random random = new Random();
    19. int percentage = random.nextInt(100);
    20.  
    21. @EventHandler
    22. public void onOpen(PlayerInteractEvent e) {
    23. Player p = e.getPlayer();
    24. if(p.hasPermission("crate.open")) {
    25. if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK) || e.getAction().equals(Action.RIGHT_CLICK_AIR) || e.getAction().equals(Action.LEFT_CLICK_BLOCK) || e.getAction().equals(Action.LEFT_CLICK_AIR)) {
    26. if(percentage > 20) {
    27. if(!(Main.getPlayersWithPrize().contains(p.getName()))) {
    28. String uuid = p.getUniqueId().toString();
    29. p.getInventory().addItem(new ItemStack(Material.CHEST, 2));
    30. Main.getPlayersWithPrize().add(uuid);
    31. p.sendMessage(ChatColor.GREEN + "Good Job! You got 2 Crates!");
    32. }
    33. }
    34. }
    35. }
    36. }
    37. }


    Thanks

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 8, 2016
  13. Offline

    Rocoty

    SuppressWarnings would not suppress an error or exception thrown at runtime. It would also not suppress a compiler error. It would only suppress compiler warnings, and wouldn't change the way your code behaves when running. You should steer clear of SuppressWarnings for the most part, as it is virtually the same as putting your fingers in your ears and standing still during a fire alarm. It would stop the warning, but not the danger.
     
    es359, 1Rogue and ZodiacTheories like this.
  14. Offline

    ZodiacTheories

    Rocoty

    Ah ok, wasn't sure what they did, thanks though.
     
  15. Offline

    Necrodoom

    ZodiacTheories your code is suffering a lot from irrelevant and useless checks. Please read your code, and explain your self what each line is supposed to do, and how it fits in with the rest of the class. This way you will be able to get rid of most of the problems.
     
  16. Offline

    ZodiacTheories

  17. Offline

    Necrodoom

    ZodiacTheories like the fact that you consider vault working if it doesn't exist, or checking your prize list for player name while storing UUIDs in it. These are only two of the issues there.
     
  18. Offline

    ZodiacTheories

    Necrodoom

    Thanks, I will go and fix that :p

    (by the way, I didn't mean it in a passive-aggressive way, I was just asking :p)

    Bump

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 8, 2016
  19. Offline

    Necrodoom

    ZodiacTheories you bumped, that means you tried to fix your code?
     
  20. Offline

    ZodiacTheories

  21. Offline

    Necrodoom

    Paste edited code and problem then.
     
  22. Offline

    ZodiacTheories

    Necrodoom

    Everytime my event fires, it bypasses the percentages, so I get the same prize everytime.

    Do you want all 5 classes (Main, Prizes, Prizes2, Prizes3 and Prizes4)?
     
  23. Offline

    Necrodoom

    Yes.
     
  24. Offline

    ZodiacTheories

    Necrodoom

    Main:

    Code:java
    1. package me.zodiactheories.coolcrates;
    2.  
    3. import java.util.ArrayList;
    4. import java.util.List;
    5. import net.milkbowl.vault.economy.Economy;
    6. import org.bukkit.plugin.RegisteredServiceProvider;
    7. import org.bukkit.plugin.java.JavaPlugin;
    8.  
    9. public class Main extends JavaPlugin {
    10.  
    11. public static Economy econ = null;
    12.  
    13. public void onEnable() {
    14. if (!setupEconomy() ) {
    15. getLogger().severe(String.format("[%s] - Disabled due to no Vault dependency found!", getDescription().getName()));
    16. }
    17. getServer().getPluginManager().registerEvents(new Prizes(), this);
    18. getServer().getPluginManager().registerEvents(new Prizes2(), this);
    19. getServer().getPluginManager().registerEvents(new Prizes3(), this);
    20. getServer().getPluginManager().registerEvents(new Prizes4(), this);
    21. return;
    22. }
    23.  
    24.  
    25.  
    26. private boolean setupEconomy() {
    27. if (getServer().getPluginManager().getPlugin("Vault") == null) {
    28. return true;
    29. }
    30. RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
    31. if (rsp == null) {
    32. return false;
    33. }
    34. econ = rsp.getProvider();
    35. return econ != null;
    36. }
    37.  
    38. public static List<String> hasprize = new ArrayList<String>();
    39.  
    40. public static List<String> getPlayersWithPrize() {
    41. return hasprize;
    42. }
    43. }
    44.  


    Code:java
    1. package me.zodiactheories.coolcrates;
    2.  
    3. import java.util.Random;
    4.  
    5. import net.milkbowl.vault.economy.EconomyResponse;
    6.  
    7. import org.bukkit.ChatColor;
    8. import org.bukkit.entity.Player;
    9. import org.bukkit.event.EventHandler;
    10. import org.bukkit.event.Listener;
    11. import org.bukkit.event.block.Action;
    12. import org.bukkit.event.player.PlayerInteractEvent;
    13.  
    14. public class Prizes implements Listener {
    15.  
    16. Random random = new Random();
    17. int percentage = random.nextInt(100);
    18.  
    19. @EventHandler
    20. public void onOpen(PlayerInteractEvent e) {
    21. Player p = e.getPlayer();
    22. if(p.hasPermission("crate.open")) {
    23. if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK) || e.getAction().equals(Action.RIGHT_CLICK_AIR) || e.getAction().equals(Action.LEFT_CLICK_BLOCK) || e.getAction().equals(Action.LEFT_CLICK_AIR)) {
    24. if(percentage > 30) {
    25. String uuid = p.getUniqueId().toString();
    26. if(!(Main.getPlayersWithPrize().contains(uuid))) {
    27. @SuppressWarnings("deprecation")
    28. EconomyResponse r = Main.econ.depositPlayer(uuid, 1000000);
    29. Main.getPlayersWithPrize().add(uuid);
    30. p.sendMessage(ChatColor.GREEN + "Good Job! You got 1,000,000!!!!");
    31. }
    32. }
    33. }
    34. }
    35. }
    36. }
    37.  
    38.  
    39.  
    40.  


    Code:java
    1. package me.zodiactheories.coolcrates;
    2.  
    3. import java.util.Random;
    4.  
    5. import net.milkbowl.vault.economy.EconomyResponse;
    6.  
    7. import org.bukkit.ChatColor;
    8. import org.bukkit.entity.Player;
    9. import org.bukkit.event.EventHandler;
    10. import org.bukkit.event.Listener;
    11. import org.bukkit.event.block.Action;
    12. import org.bukkit.event.player.PlayerInteractEvent;
    13.  
    14. public class Prizes2 implements Listener {
    15.  
    16. Random random = new Random();
    17. int percentage = random.nextInt(100);
    18.  
    19. @EventHandler
    20. public void onOpen(PlayerInteractEvent e) {
    21. Player p = e.getPlayer();
    22. if(p.hasPermission("crate.open")) {
    23. if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK) || e.getAction().equals(Action.RIGHT_CLICK_AIR) || e.getAction().equals(Action.LEFT_CLICK_BLOCK) || e.getAction().equals(Action.LEFT_CLICK_AIR)) {
    24. if(percentage > 20) {
    25. String uuid = p.getUniqueId().toString();
    26. if(!(Main.getPlayersWithPrize().contains(uuid))) {
    27. @SuppressWarnings("deprecation")
    28. EconomyResponse r = Main.econ.depositPlayer(uuid, 2000000);
    29. Main.getPlayersWithPrize().add(uuid);
    30. p.sendMessage(ChatColor.GREEN + "Good Job! You got 2,000,000!!!!");
    31. }
    32. }
    33. }
    34. }
    35. }
    36. }
    37.  
    38.  


    Code:java
    1. package me.zodiactheories.coolcrates;
    2.  
    3. import java.util.Random;
    4.  
    5. import net.milkbowl.vault.economy.EconomyResponse;
    6.  
    7. import org.bukkit.ChatColor;
    8. import org.bukkit.entity.Player;
    9. import org.bukkit.event.EventHandler;
    10. import org.bukkit.event.Listener;
    11. import org.bukkit.event.block.Action;
    12. import org.bukkit.event.player.PlayerInteractEvent;
    13.  
    14. public class Prizes3 implements Listener {
    15.  
    16. Random random = new Random();
    17. int percentage = random.nextInt(100);
    18.  
    19. @EventHandler
    20. public void onOpen(PlayerInteractEvent e) {
    21. Player p = e.getPlayer();
    22. if(p.hasPermission("crate.open")) {
    23. if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK) || e.getAction().equals(Action.RIGHT_CLICK_AIR) || e.getAction().equals(Action.LEFT_CLICK_BLOCK) || e.getAction().equals(Action.LEFT_CLICK_AIR)) {
    24. if(percentage > 10) {
    25. String uuid = p.getUniqueId().toString();
    26. if(!(Main.getPlayersWithPrize().contains(uuid))) {
    27. @SuppressWarnings("deprecation")
    28. EconomyResponse r = Main.econ.depositPlayer(uuid, 3000000);
    29. Main.getPlayersWithPrize().add(uuid);
    30. p.sendMessage(ChatColor.GREEN + "Good Job! You got 3,000,000!!!!");
    31. }
    32. }
    33. }
    34. }
    35. }
    36. }
    37.  
    38.  
    39.  


    Code:java
    1. package me.zodiactheories.coolcrates;
    2.  
    3. import java.util.Random;
    4.  
    5. import net.milkbowl.vault.economy.EconomyResponse;
    6.  
    7. import org.bukkit.ChatColor;
    8. import org.bukkit.Material;
    9. import org.bukkit.entity.Player;
    10. import org.bukkit.event.EventHandler;
    11. import org.bukkit.event.Listener;
    12. import org.bukkit.event.block.Action;
    13. import org.bukkit.event.player.PlayerInteractEvent;
    14. import org.bukkit.inventory.ItemStack;
    15.  
    16. public class Prizes4 implements Listener {
    17.  
    18. Random random = new Random();
    19. int percentage = random.nextInt(100);
    20.  
    21. @EventHandler
    22. public void onOpen(PlayerInteractEvent e) {
    23. Player p = e.getPlayer();
    24. if(p.hasPermission("crate.open")) {
    25. if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK) || e.getAction().equals(Action.RIGHT_CLICK_AIR) || e.getAction().equals(Action.LEFT_CLICK_BLOCK) || e.getAction().equals(Action.LEFT_CLICK_AIR)) {
    26. if(percentage > 20) {
    27. String uuid = p.getUniqueId().toString();
    28. if(!(Main.getPlayersWithPrize().contains(uuid))) {
    29. p.getInventory().addItem(new ItemStack(Material.CHEST, 2));
    30. Main.getPlayersWithPrize().add(uuid);
    31. p.sendMessage(ChatColor.GREEN + "Good Job! You got 2 Crates!");
    32. }
    33. }
    34. }
    35. }
    36. }
    37. }
    38.  
    39.  


    I think I know where the problem is coming from, gonna try one thing.
     
  25. Offline

    Necrodoom

    ZodiacTheories you still have the vault logic error, you have redundant event action check, checking if the action is any of the 4 actual actions, and you don't actually have a concept of opening a chest, or support for more than one chest while the server is up.

    The only thing you fixed is storing UUID in the list.
     
  26. Offline

    ZodiacTheories

    Necrodoom

    Where is my Vault logic error?
     
  27. Offline

    Necrodoom

  28. Offline

    ZodiacTheories

    Necrodoom

    Ok, I get it logically, but how do I go about fixing this?
     
  29. Offline

    ZodiacTheories

  30. ZodiacTheories To ensure you actually understand the error, please explain it. The fix should be obvious. :)
     
Thread Status:
Not open for further replies.

Share This Page