skeeter144 Posted August 15, 2015 Posted August 15, 2015 I have an event handler that I use to tell whenever an entity gets attacked, and do some other stuff with that. The problem is, the event is getting called twice per attack, on the client side. I have checks that if the server is dedicated, it will only get called on the server, which works. But when the server is integrated, it only gets called on the client, and is called twice. Here's my code for the attack handler. The LivingDeathEvent works properly, it's only the LivingAttackEvent Reveal hidden contents public class AttackHandler { @SubscribeEvent public void entityAttacked(LivingAttackEvent e) { if (MinecraftServer.getServer().isDedicatedServer()) { if (!IslandSurvival.proxy.isRemote()) { return; } } EntityPlayer player; if (e.source.getSourceOfDamage() instanceof EntityPlayer) { player = (EntityPlayer) e.source.getSourceOfDamage(); } else { return; } Integer level = SkillAttack.getLevelForWeapon(player.getHeldItem().getItem()); if (level == null) return; int attackLevel = IslandSurvival.instance.getPlayerLevelsDatabase().getPlayerLevels(player.getPersistentID()) .getAttackLevel(); if (attackLevel < level) { player.addChatMessage(new ChatComponentTranslation(EnumChatFormatting.RED + "You need level " + level + " Attack to use the " + player.getHeldItem().getDisplayName() + "!")); e.setCanceled(true); } } @SubscribeEvent public void onLivingDeath(LivingDeathEvent e) { EntityPlayer player; if (e.source.getSourceOfDamage() instanceof EntityPlayer) { player = (EntityPlayer) e.source.getSourceOfDamage(); if (player.getHeldItem() == null) return; Integer exp = 0; if (e.entity instanceof EntityPlayer) { exp = 10; } else { exp = SkillAttack.getExpForMob((EntityLiving) e.entity); } System.out.println(exp); IslandSurvival.instance.getPlayerLevelsDatabase().getPlayerLevels(player.getPersistentID()) .addAttackExp(exp, player); return; } return; } } And where I register the AttackHandler class. Reveal hidden contents @Mod.EventHandler public void preInit(FMLPreInitializationEvent e) { // Item/block init and registering ISItems.init(); ISTools.init(); ISBlocks.init(); SkillsMain.init(); SkillMining.init(); SkillCrafting.init(); network = NetworkRegistry.INSTANCE.newSimpleChannel("MyChannel"); network.registerMessage(Handler.class, CraftingMessage.class, 0, Side.SERVER); // Config handling loadDatabase(); //handlers bbHandler = new BlockBreakingHandler(); MinecraftForge.EVENT_BUS.register(new ConnectionHandler()); MinecraftForge.EVENT_BUS.register(new AttackHandler()); if (!proxy.isRemote()) { KeyBindings.init(); FMLCommonHandler.instance().bus().register(new KeyInputHandler()); } else { } } And here is the console output: Reveal hidden contents [17:41:24] [Client thread/INFO]: [CHAT] §cYou need level 20 Attack to use the Diamond Sword! [17:41:24] [Client thread/INFO]: [CHAT] §cYou need level 20 Attack to use the Diamond Sword! [17:41:25] [Client thread/INFO]: [CHAT] §cYou need level 20 Attack to use the Diamond Sword! [17:41:25] [Client thread/INFO]: [CHAT] §cYou need level 20 Attack to use the Diamond Sword! [17:41:28] [Client thread/INFO]: [CHAT] §cYou need level 20 Attack to use the Diamond Sword! [17:41:28] [Client thread/INFO]: [CHAT] §cYou need level 20 Attack to use the Diamond Sword! Any help would be much appreciated! Not sure if this is a bug or what. Quote
delpi Posted August 16, 2015 Posted August 16, 2015 I'd suggest using proxies. Only put your client stuff you are interested for that handler on the client side and vice versa for the server. Will make it easier to troubleshoot. If I had to wager, by the time you do that, I'm betting the issue goes away. Quote Long time Bukkit & Forge Programmer Happy to try and help
skeeter144 Posted August 16, 2015 Author Posted August 16, 2015 Not sure I completely follow. I'm checking "proxy.isRemote()," is that not what you mean? Would you recommend putting the event handler in the proxy classes? Quote
delpi Posted August 16, 2015 Posted August 16, 2015 I put all my events in a side specific proxy section. I'm very deliberate in separating the client/server. It tends to avoid confusion. I looked briefly through your stuff and there were a few things in there that make me think you could benefit from the same. However, that is my opinion, not gospel. Quote Long time Bukkit & Forge Programmer Happy to try and help
skeeter144 Posted August 16, 2015 Author Posted August 16, 2015 That's a good idea! I can't believe I had never thought about that! Thanks for the tip, I'll try it out. And even if it doesn't work, that seems like a really good practice. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.