From 38c78853b14e7df27c2db071863294586c8c73ae Mon Sep 17 00:00:00 2001 From: ExE Boss Date: Sat, 7 Jan 2017 20:46:08 +0100 Subject: [PATCH 1/6] Rewrote exception throwing tests in EnumSelectorTest properly --- .../java/nova/core/util/EnumSelectorTest.java | 57 ++++++------------- 1 file changed, 17 insertions(+), 40 deletions(-) diff --git a/src/test/java/nova/core/util/EnumSelectorTest.java b/src/test/java/nova/core/util/EnumSelectorTest.java index 6434770df..8aa9c7144 100644 --- a/src/test/java/nova/core/util/EnumSelectorTest.java +++ b/src/test/java/nova/core/util/EnumSelectorTest.java @@ -8,7 +8,9 @@ import static org.assertj.core.api.Assertions.assertThat; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import static nova.testutils.NovaAssertions.assertThat; @@ -18,6 +20,9 @@ */ public class EnumSelectorTest { + @Rule + public ExpectedException thrown = ExpectedException.none(); + EnumSelector enumSelectorExample1; EnumSelector enumSelectorExample2; EnumSelector enumSelectorExample3; @@ -278,63 +283,35 @@ public void test4SetSize() { assertThat(result).isEqualTo(0); } - @Test + @Test(expected = IllegalStateException.class) public void testCannotLock() { - EnumSelector enumSelectorExample = EnumSelector.of(EnumExample.class); - IllegalStateException result = null; - try { - enumSelectorExample.lock(); - } catch (IllegalStateException ex) { - result = ex; - } - assertThat(result).isNotNull(); + EnumSelector.of(EnumExample.class).lock(); } - @Test + @Test(expected = IllegalStateException.class) public void testCannotRead() { - EnumSelector enumSelectorExample = EnumSelector.of(EnumExample.class); - IllegalStateException result = null; - try { - enumSelectorExample.allowsAll(); - } catch (IllegalStateException ex) { - result = ex; - } - assertThat(result).isNotNull(); + EnumSelector.of(EnumExample.class).allowsAll(); } - @Test + @Test(expected = IllegalStateException.class) public void testCannotWrite() { - IllegalStateException result = null; - try { - enumSelectorExample1.apart(EnumExample.EXAMPLE_64); - } catch (IllegalStateException ex) { - result = ex; - } - assertThat(result).isNotNull(); + enumSelectorExample1.apart(EnumExample.EXAMPLE_64); } @Test public void testCannotBlockAllowing() { EnumSelector enumSelectorExample = EnumSelector.of(EnumExample.class).allowAll(); - IllegalStateException result = null; - try { - enumSelectorExample.blockAll(); - } catch (IllegalStateException ex) { - result = ex; - } - assertThat(result).isNotNull(); + thrown.expect(IllegalStateException.class); + thrown.expectMessage("You can't block all enum values when you are already allowing them."); + enumSelectorExample.blockAll(); } @Test public void testCannotAllowBlocking() { EnumSelector enumSelectorExample = EnumSelector.of(EnumExample.class).blockAll(); - IllegalStateException result = null; - try { - enumSelectorExample.allowAll(); - } catch (IllegalStateException ex) { - result = ex; - } - assertThat(result).isNotNull(); + thrown.expect(IllegalStateException.class); + thrown.expectMessage("You can't allow all enum values when you are already blocking them."); + enumSelectorExample.allowAll(); } public static enum EnumExample { From 15a68b1e9437a5d78138fd2e95ad19dae4f68017 Mon Sep 17 00:00:00 2001 From: ExE Boss Date: Sat, 7 Jan 2017 21:41:03 +0100 Subject: [PATCH 2/6] =?UTF-8?q?Rewrote=20tests=20that=20don=E2=80=99t=20th?= =?UTF-8?q?row=20exceptions=20properly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nova/core/util/EnumSelectorTest.java | 262 ++++-------------- 1 file changed, 52 insertions(+), 210 deletions(-) diff --git a/src/test/java/nova/core/util/EnumSelectorTest.java b/src/test/java/nova/core/util/EnumSelectorTest.java index 8aa9c7144..a1bdb1ad1 100644 --- a/src/test/java/nova/core/util/EnumSelectorTest.java +++ b/src/test/java/nova/core/util/EnumSelectorTest.java @@ -44,243 +44,85 @@ public void setUp() { } @Test - public void test1Locked() { - boolean result = enumSelectorExample1.locked(); - assertThat(result).isEqualTo(true); + public void testAllLocked() { + assertThat(enumSelectorExample1.locked()).isEqualTo(true); + assertThat(enumSelectorExample2.locked()).isEqualTo(true); + assertThat(enumSelectorExample3.locked()).isEqualTo(true); + assertThat(enumSelectorExample4.locked()).isEqualTo(true); } @Test - public void test1Disallows_EXAMPLE_8() { - boolean result = enumSelectorExample1.allows(EnumExample.EXAMPLE_8); - assertThat(result).isEqualTo(false); + public void test1Allows() { + assertThat(enumSelectorExample1.allows(EnumExample.EXAMPLE_8)).isEqualTo(false); + assertThat(enumSelectorExample1.allows(EnumExample.EXAMPLE_16)).isEqualTo(false); + assertThat(enumSelectorExample1.allows(EnumExample.EXAMPLE_24)).isEqualTo(true); + assertThat(enumSelectorExample1.allows(EnumExample.EXAMPLE_32)).isEqualTo(false); + assertThat(enumSelectorExample1.allows(EnumExample.EXAMPLE_42)).isEqualTo(true); + assertThat(enumSelectorExample1.allows(EnumExample.EXAMPLE_48)).isEqualTo(false); + assertThat(enumSelectorExample1.allows(EnumExample.EXAMPLE_64)).isEqualTo(false); } @Test - public void test1Disallows_EXAMPLE_16() { - boolean result = enumSelectorExample1.allows(EnumExample.EXAMPLE_16); - assertThat(result).isEqualTo(false); + public void test2Allows() { + assertThat(enumSelectorExample2.allows(EnumExample.EXAMPLE_8)).isEqualTo(true); + assertThat(enumSelectorExample2.allows(EnumExample.EXAMPLE_16)).isEqualTo(true); + assertThat(enumSelectorExample2.allows(EnumExample.EXAMPLE_24)).isEqualTo(false); + assertThat(enumSelectorExample2.allows(EnumExample.EXAMPLE_32)).isEqualTo(true); + assertThat(enumSelectorExample2.allows(EnumExample.EXAMPLE_42)).isEqualTo(false); + assertThat(enumSelectorExample2.allows(EnumExample.EXAMPLE_48)).isEqualTo(true); + assertThat(enumSelectorExample2.allows(EnumExample.EXAMPLE_64)).isEqualTo(true); } @Test - public void test1Allows_EXAMPLE_24() { - boolean result = enumSelectorExample1.allows(EnumExample.EXAMPLE_24); - assertThat(result).isEqualTo(true); + public void test3Allows() { + assertThat(enumSelectorExample3.blocks(EnumExample.EXAMPLE_24)).isEqualTo(false); + assertThat(enumSelectorExample3.blocks(EnumExample.EXAMPLE_42)).isEqualTo(false); } @Test - public void test1Disallows_EXAMPLE_32() { - boolean result = enumSelectorExample1.allows(EnumExample.EXAMPLE_16); - assertThat(result).isEqualTo(false); + public void test4Allows() { + assertThat(enumSelectorExample4.blocks(EnumExample.EXAMPLE_24)).isEqualTo(true); + assertThat(enumSelectorExample4.blocks(EnumExample.EXAMPLE_42)).isEqualTo(true); } @Test - public void test1Allows_EXAMPLE_42() { - boolean result = enumSelectorExample1.allows(EnumExample.EXAMPLE_42); - assertThat(result).isEqualTo(true); + public void testAllowsAll() { + assertThat(enumSelectorExample1.allowsAll()).isEqualTo(false); + assertThat(enumSelectorExample2.allowsAll()).isEqualTo(false); + assertThat(enumSelectorExample3.allowsAll()).isEqualTo(true); + assertThat(enumSelectorExample4.allowsAll()).isEqualTo(false); } @Test - public void test1Disallows_EXAMPLE_48() { - boolean result = enumSelectorExample1.allows(EnumExample.EXAMPLE_48); - assertThat(result).isEqualTo(false); + public void testBlocksAll() { + assertThat(enumSelectorExample1.blocksAll()).isEqualTo(false); + assertThat(enumSelectorExample2.blocksAll()).isEqualTo(false); + assertThat(enumSelectorExample3.blocksAll()).isEqualTo(false); + assertThat(enumSelectorExample4.blocksAll()).isEqualTo(true); } @Test - public void test1Disallows_EXAMPLE_64() { - boolean result = enumSelectorExample1.allows(EnumExample.EXAMPLE_64); - assertThat(result).isEqualTo(false); + public void testStreamSize() { + assertThat(enumSelectorExample1.stream().count()).isEqualTo(2); + assertThat(enumSelectorExample2.stream().count()).isEqualTo(EnumExample.values().length - 2); + assertThat(enumSelectorExample3.stream().count()).isEqualTo(EnumExample.values().length); + assertThat(enumSelectorExample4.stream().count()).isEqualTo(0); } @Test - public void test2Locked() { - boolean result = enumSelectorExample2.locked(); - assertThat(result).isEqualTo(true); + public void testParallelStreamSize() { + assertThat(enumSelectorExample1.parallelStream().count()).isEqualTo(2); + assertThat(enumSelectorExample2.parallelStream().count()).isEqualTo(EnumExample.values().length - 2); + assertThat(enumSelectorExample3.parallelStream().count()).isEqualTo(EnumExample.values().length); + assertThat(enumSelectorExample4.parallelStream().count()).isEqualTo(0); } @Test - public void test2Allows_EXAMPLE_8() { - boolean result = enumSelectorExample2.allows(EnumExample.EXAMPLE_8); - assertThat(result).isEqualTo(true); - } - - @Test - public void test2Allows_EXAMPLE_16() { - boolean result = enumSelectorExample2.allows(EnumExample.EXAMPLE_16); - assertThat(result).isEqualTo(true); - } - - @Test - public void test2Disallows_EXAMPLE_24() { - boolean result = enumSelectorExample2.allows(EnumExample.EXAMPLE_24); - assertThat(result).isEqualTo(false); - } - - @Test - public void test2Allows_EXAMPLE_32() { - boolean result = enumSelectorExample2.allows(EnumExample.EXAMPLE_16); - assertThat(result).isEqualTo(true); - } - - @Test - public void test2Disallows_EXAMPLE_42() { - boolean result = enumSelectorExample2.allows(EnumExample.EXAMPLE_42); - assertThat(result).isEqualTo(false); - } - - @Test - public void test2Allows_EXAMPLE_48() { - boolean result = enumSelectorExample2.allows(EnumExample.EXAMPLE_48); - assertThat(result).isEqualTo(true); - } - - @Test - public void test2Allows_EXAMPLE_64() { - boolean result = enumSelectorExample2.allows(EnumExample.EXAMPLE_64); - assertThat(result).isEqualTo(true); - } - - @Test - public void test3Allows_EXAMPLE_24() { - boolean result = enumSelectorExample3.blocks(EnumExample.EXAMPLE_24); - assertThat(result).isEqualTo(false); - } - - @Test - public void test3Allows_EXAMPLE_42() { - boolean result = enumSelectorExample3.blocks(EnumExample.EXAMPLE_42); - assertThat(result).isEqualTo(false); - } - - @Test - public void test4Disallows_EXAMPLE_24() { - boolean result = enumSelectorExample4.blocks(EnumExample.EXAMPLE_24); - assertThat(result).isEqualTo(true); - } - - @Test - public void test4Disallows_EXAMPLE_42() { - boolean result = enumSelectorExample4.blocks(EnumExample.EXAMPLE_42); - assertThat(result).isEqualTo(true); - } - - @Test - public void test1NotAllowsAll() { - boolean result = enumSelectorExample1.allowsAll(); - assertThat(result).isEqualTo(false); - } - - @Test - public void test1NotBlocksAll() { - boolean result = enumSelectorExample1.blocksAll(); - assertThat(result).isEqualTo(false); - } - - @Test - public void test2NotAllowsAll() { - boolean result = enumSelectorExample2.allowsAll(); - assertThat(result).isEqualTo(false); - } - - @Test - public void test2NotBlocksAll() { - boolean result = enumSelectorExample2.blocksAll(); - assertThat(result).isEqualTo(false); - } - - @Test - public void test3AllowsAll() { - boolean result = enumSelectorExample3.allowsAll(); - assertThat(result).isEqualTo(true); - } - - @Test - public void test3NotBlocksAll() { - boolean result = enumSelectorExample3.blocksAll(); - assertThat(result).isEqualTo(false); - } - - @Test - public void test4NotAllowsAll() { - boolean result = enumSelectorExample4.allowsAll(); - assertThat(result).isEqualTo(false); - } - - @Test - public void test4BlocksAll() { - boolean result = enumSelectorExample4.blocksAll(); - assertThat(result).isEqualTo(true); - } - - @Test - public void test1StreamSize() { - long result = enumSelectorExample1.stream().count(); - assertThat(result).isEqualTo(2); - } - - @Test - public void test2StreamSize() { - long result = enumSelectorExample2.stream().count(); - assertThat(result).isEqualTo(EnumExample.values().length - 2); - } - - @Test - public void test3StreamSize() { - long result = enumSelectorExample3.stream().count(); - assertThat(result).isEqualTo(EnumExample.values().length); - } - - @Test - public void test4StreamSize() { - long result = enumSelectorExample4.stream().count(); - assertThat(result).isEqualTo(0); - } - - @Test - public void test1ParallelStreamSize() { - long result = enumSelectorExample1.parallelStream().count(); - assertThat(result).isEqualTo(2); - } - - @Test - public void test2ParallelStreamSize() { - long result = enumSelectorExample2.parallelStream().count(); - assertThat(result).isEqualTo(EnumExample.values().length - 2); - } - - @Test - public void test3ParallelStreamSize() { - long result = enumSelectorExample3.parallelStream().count(); - assertThat(result).isEqualTo(EnumExample.values().length); - } - - @Test - public void test4ParallelStreamSize() { - long result = enumSelectorExample4.parallelStream().count(); - assertThat(result).isEqualTo(0); - } - - @Test - public void test1SetSize() { - int result = enumSelectorExample1.toSet().size(); - assertThat(result).isEqualTo(2); - } - - @Test - public void test2SetSize() { - int result = enumSelectorExample2.toSet().size(); - assertThat(result).isEqualTo(EnumExample.values().length - 2); - } - - @Test - public void test3SetSize() { - int result = enumSelectorExample3.toSet().size(); - assertThat(result).isEqualTo(EnumExample.values().length); - } - - @Test - public void test4SetSize() { - int result = enumSelectorExample4.toSet().size(); - assertThat(result).isEqualTo(0); + public void testSetSize() { + assertThat(enumSelectorExample1.toSet().size()).isEqualTo(2); + assertThat(enumSelectorExample2.toSet().size()).isEqualTo(EnumExample.values().length - 2); + assertThat(enumSelectorExample3.toSet().size()).isEqualTo(EnumExample.values().length); + assertThat(enumSelectorExample4.toSet().size()).isEqualTo(0); } @Test(expected = IllegalStateException.class) From 376b66077eca64f312a9f5bbabb285af8caa0825 Mon Sep 17 00:00:00 2001 From: ExE Boss Date: Fri, 6 Jan 2017 17:58:18 +0100 Subject: [PATCH 3/6] Create ItemEvent and move some events there --- .../forge/v17/wrapper/item/ItemConverter.java | 11 +++-- .../forge/v18/wrapper/item/ItemConverter.java | 11 +++-- .../ItemEvent.java} | 43 +++++++++++++------ src/main/java/nova/core/item/ItemManager.java | 21 +++------ 4 files changed, 46 insertions(+), 40 deletions(-) rename src/main/java/nova/core/{item/event/ItemIDNotFoundEvent.java => event/ItemEvent.java} (52%) diff --git a/minecraft/1.7/src/main/java/nova/core/wrapper/mc/forge/v17/wrapper/item/ItemConverter.java b/minecraft/1.7/src/main/java/nova/core/wrapper/mc/forge/v17/wrapper/item/ItemConverter.java index 969162193..f6dd217f5 100644 --- a/minecraft/1.7/src/main/java/nova/core/wrapper/mc/forge/v17/wrapper/item/ItemConverter.java +++ b/minecraft/1.7/src/main/java/nova/core/wrapper/mc/forge/v17/wrapper/item/ItemConverter.java @@ -27,11 +27,10 @@ import net.minecraft.item.ItemStack; import nova.core.block.BlockFactory; import nova.core.component.Category; +import nova.core.event.ItemEvent; import nova.core.item.Item; import nova.core.item.ItemBlock; import nova.core.item.ItemFactory; -import nova.core.item.ItemManager; -import nova.core.item.event.ItemIDNotFoundEvent; import nova.core.loader.Loadable; import nova.core.nativewrapper.NativeConverter; import nova.core.retention.Data; @@ -169,10 +168,10 @@ public void preInit() { private void registerNOVAItemsToMinecraft() { //There should be no items registered during Native Converter preInit() // item.registry.forEach(this::registerNOVAItem); - Game.events().on(ItemManager.ItemRegistrationEvent.class).bind(this::onItemRegistered); + Game.events().on(ItemEvent.Register.class).bind(this::onItemRegistered); } - private void onItemRegistered(ItemManager.ItemRegistrationEvent event) { + private void onItemRegistered(ItemEvent.Register event) { registerNOVAItem(event.itemFactory); } @@ -232,10 +231,10 @@ private void registerMinecraftItemsToNOVA() { } private void registerSubtypeResolution() { - Game.events().on(ItemIDNotFoundEvent.class).bind(this::onIDNotFound); + Game.events().on(ItemEvent.IDNotFound.class).bind(this::onIDNotFound); } - private void onIDNotFound(ItemIDNotFoundEvent event) { + private void onIDNotFound(ItemEvent.IDNotFound event) { // if item minecraft:planks:2 is detected, this code will register minecraft:planks:2 dynamically // we cannot do this up front since there is **NO** reliable way to get the sub-items of an item diff --git a/minecraft/1.8/src/main/java/nova/core/wrapper/mc/forge/v18/wrapper/item/ItemConverter.java b/minecraft/1.8/src/main/java/nova/core/wrapper/mc/forge/v18/wrapper/item/ItemConverter.java index 793bb2fd1..c496eaa89 100644 --- a/minecraft/1.8/src/main/java/nova/core/wrapper/mc/forge/v18/wrapper/item/ItemConverter.java +++ b/minecraft/1.8/src/main/java/nova/core/wrapper/mc/forge/v18/wrapper/item/ItemConverter.java @@ -28,11 +28,10 @@ import net.minecraftforge.fml.common.registry.GameRegistry; import nova.core.block.BlockFactory; import nova.core.component.Category; +import nova.core.event.ItemEvent; import nova.core.item.Item; import nova.core.item.ItemBlock; import nova.core.item.ItemFactory; -import nova.core.item.ItemManager; -import nova.core.item.event.ItemIDNotFoundEvent; import nova.core.loader.Loadable; import nova.core.nativewrapper.NativeConverter; import nova.core.retention.Data; @@ -171,10 +170,10 @@ public void preInit() { private void registerNOVAItemsToMinecraft() { //There should be no items registered during Native Converter preInit() // item.registry.forEach(this::registerNOVAItem); - Game.events().on(ItemManager.ItemRegistrationEvent.class).bind(this::onItemRegistered); + Game.events().on(ItemEvent.Register.class).bind(this::onItemRegistered); } - private void onItemRegistered(ItemManager.ItemRegistrationEvent event) { + private void onItemRegistered(ItemEvent.Register event) { registerNOVAItem(event.itemFactory); } @@ -234,10 +233,10 @@ private void registerMinecraftItemsToNOVA() { } private void registerSubtypeResolution() { - Game.events().on(ItemIDNotFoundEvent.class).bind(this::onIDNotFound); + Game.events().on(ItemEvent.IDNotFound.class).bind(this::onIDNotFound); } - private void onIDNotFound(ItemIDNotFoundEvent event) { + private void onIDNotFound(ItemEvent.IDNotFound event) { // if item minecraft:planks:2 is detected, this code will register minecraft:planks:2 dynamically // we cannot do this up front since there is **NO** reliable way to get the sub-items of an item diff --git a/src/main/java/nova/core/item/event/ItemIDNotFoundEvent.java b/src/main/java/nova/core/event/ItemEvent.java similarity index 52% rename from src/main/java/nova/core/item/event/ItemIDNotFoundEvent.java rename to src/main/java/nova/core/event/ItemEvent.java index 160eaf06b..008a1d9fc 100644 --- a/src/main/java/nova/core/item/event/ItemIDNotFoundEvent.java +++ b/src/main/java/nova/core/event/ItemEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 NOVA, All rights reserved. + * Copyright (c) 2017 NOVA, All rights reserved. * This library is free software, licensed under GNU Lesser General Public License version 3 * * This file is part of NOVA. @@ -16,28 +16,45 @@ * * You should have received a copy of the GNU General Public License * along with NOVA. If not, see . - */package nova.core.item.event; + */ + +package nova.core.event; +import nova.core.event.bus.CancelableEvent; import nova.core.event.bus.Event; import nova.core.item.ItemFactory; /** - * @author Stan + * @author ExE Boss */ -public class ItemIDNotFoundEvent extends Event { - public final String id; +public abstract class ItemEvent extends CancelableEvent { - private ItemFactory remappedFactory = null; + public static class Register extends CancelableEvent { + public ItemFactory itemFactory; - public ItemIDNotFoundEvent(String id) { - this.id = id; + public Register(ItemFactory itemFactory) { + this.itemFactory = itemFactory; + } } - public ItemFactory getRemappedFactory() { - return remappedFactory; - } + /** + * @author Stan + */ + public static class IDNotFound extends Event { + public final String id; + + private ItemFactory remappedFactory = null; + + public IDNotFound(String id) { + this.id = id; + } + + public ItemFactory getRemappedFactory() { + return remappedFactory; + } - public void setRemappedFactory(ItemFactory remappedFactory) { - this.remappedFactory = remappedFactory; + public void setRemappedFactory(ItemFactory remappedFactory) { + this.remappedFactory = remappedFactory; + } } } diff --git a/src/main/java/nova/core/item/ItemManager.java b/src/main/java/nova/core/item/ItemManager.java index d31b79dcb..0b1122279 100644 --- a/src/main/java/nova/core/item/ItemManager.java +++ b/src/main/java/nova/core/item/ItemManager.java @@ -22,8 +22,7 @@ import nova.core.block.BlockFactory; import nova.core.block.BlockManager; -import nova.core.event.bus.CancelableEvent; -import nova.core.item.event.ItemIDNotFoundEvent; +import nova.core.event.ItemEvent; import nova.core.util.registry.FactoryManager; import nova.core.util.registry.Registry; import nova.internal.core.Game; @@ -52,9 +51,10 @@ public ItemFactory register(String id, Supplier constructor) { @Override public ItemFactory register(ItemFactory factory) { - registry.register(factory); - Game.events().publish(new ItemRegistrationEvent(factory)); - return factory; + ItemEvent.Register event = new ItemEvent.Register(factory); + Game.events().publish(event); + registry.register(event.itemFactory); + return event.itemFactory; } public ItemFactory getItemFromBlock(BlockFactory block) { @@ -68,7 +68,7 @@ public Optional getBlockFromItem(Item item) { @Override public Optional get(String name) { if (!registry.contains(name)) { - ItemIDNotFoundEvent event = new ItemIDNotFoundEvent(name); + ItemEvent.IDNotFound event = new ItemEvent.IDNotFound(name); Game.events().publish(event); if (event.getRemappedFactory() != null) { @@ -79,15 +79,6 @@ public Optional get(String name) { return registry.get(name); } - //TODO: Move to item event - public class ItemRegistrationEvent extends CancelableEvent { - public final ItemFactory itemFactory; - - public ItemRegistrationEvent(ItemFactory itemFactory) { - this.itemFactory = itemFactory; - } - } - @Override public void init() { Game.events().publish(new Init(this)); From a80e07919ce3d40af4e734034cad08dc18f5fc76 Mon Sep 17 00:00:00 2001 From: ExE Boss Date: Fri, 6 Jan 2017 18:47:32 +0100 Subject: [PATCH 4/6] Add javadoc to the event classes --- src/main/java/nova/core/event/BlockEvent.java | 12 +++++++++++- src/main/java/nova/core/event/EntityEvent.java | 2 +- src/main/java/nova/core/event/ItemEvent.java | 10 ++++++++++ src/main/java/nova/core/event/ServerEvent.java | 4 ++-- src/main/java/nova/core/event/WorldEvent.java | 7 +++++-- 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/main/java/nova/core/event/BlockEvent.java b/src/main/java/nova/core/event/BlockEvent.java index 68978201e..e73138b05 100644 --- a/src/main/java/nova/core/event/BlockEvent.java +++ b/src/main/java/nova/core/event/BlockEvent.java @@ -26,6 +26,9 @@ import nova.core.world.World; import org.apache.commons.math3.geometry.euclidean.threed.Vector3D; +/** + * All events related to the block. + */ public abstract class BlockEvent extends CancelableEvent { //The world public final World world; @@ -37,6 +40,13 @@ public BlockEvent(World world, Vector3D position) { this.position = position; } + /** + * Event is triggered when a BlockFactory is registered. + * + * @see BlockFactory + * @see nova.core.block.BlockManager#register(nova.core.block.BlockFactory) + * @see nova.core.block.BlockManager#register(java.lang.String, java.util.function.Supplier) + */ public static class Register extends CancelableEvent { public BlockFactory blockFactory; @@ -46,7 +56,7 @@ public Register(BlockFactory blockFactory) { } /** - * Called when a block in the world changes. + * Event is triggered when a block in the world changes. */ public static class Change extends BlockEvent { diff --git a/src/main/java/nova/core/event/EntityEvent.java b/src/main/java/nova/core/event/EntityEvent.java index 608bbf484..04b68bf12 100644 --- a/src/main/java/nova/core/event/EntityEvent.java +++ b/src/main/java/nova/core/event/EntityEvent.java @@ -24,7 +24,7 @@ import nova.core.event.bus.CancelableEvent; /** - * All events related to the entity + * All events related to the entity. * @author Calclavia */ public class EntityEvent extends CancelableEvent { diff --git a/src/main/java/nova/core/event/ItemEvent.java b/src/main/java/nova/core/event/ItemEvent.java index 008a1d9fc..e910b7638 100644 --- a/src/main/java/nova/core/event/ItemEvent.java +++ b/src/main/java/nova/core/event/ItemEvent.java @@ -25,10 +25,18 @@ import nova.core.item.ItemFactory; /** + * All events related to the item. * @author ExE Boss */ public abstract class ItemEvent extends CancelableEvent { + /** + * Event is triggered when an ItemFactory is registered. + * + * @see ItemFactory + * @see nova.core.item.ItemManager#register(nova.core.item.ItemFactory) + * @see nova.core.item.ItemManager#register(java.lang.String, java.util.function.Supplier) + */ public static class Register extends CancelableEvent { public ItemFactory itemFactory; @@ -38,6 +46,8 @@ public Register(ItemFactory itemFactory) { } /** + * Event is triggered when an Item ID is not found. + * * @author Stan */ public static class IDNotFound extends Event { diff --git a/src/main/java/nova/core/event/ServerEvent.java b/src/main/java/nova/core/event/ServerEvent.java index a5ce5057f..a078a1421 100644 --- a/src/main/java/nova/core/event/ServerEvent.java +++ b/src/main/java/nova/core/event/ServerEvent.java @@ -28,14 +28,14 @@ */ public abstract class ServerEvent extends Event { /** - * Called when the server starts running + * Event is triggered when the server starts running. */ public static class Start extends ServerEvent { } /** - * Called when the server stops running. + * Event is triggered when the server stops running. */ public static class Stop extends ServerEvent { diff --git a/src/main/java/nova/core/event/WorldEvent.java b/src/main/java/nova/core/event/WorldEvent.java index cf148530c..c97e4af93 100644 --- a/src/main/java/nova/core/event/WorldEvent.java +++ b/src/main/java/nova/core/event/WorldEvent.java @@ -23,6 +23,9 @@ import nova.core.event.bus.Event; import nova.core.world.World; +/** + * All events related to the world. + */ public abstract class WorldEvent extends Event { public final World world; @@ -31,7 +34,7 @@ public WorldEvent(World world) { } /** - * Called when a world loads. + * Event is triggered when a world loads. */ public static class Load extends WorldEvent { public Load(World world) { @@ -40,7 +43,7 @@ public Load(World world) { } /** - * Called when a world unloads. + * Event is triggered when a world unloads. */ public static class Unload extends WorldEvent { public Unload(World world) { From 298545711403355c4e432448614f92bac9802392 Mon Sep 17 00:00:00 2001 From: RX14 Date: Mon, 9 Jan 2017 21:28:27 +0000 Subject: [PATCH 5/6] Revert "Update README.md" This reverts commit fa58f30fd8c82ae3c7c4267ea8cecdc9c54947f2. --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 8c11d36cc..50abece54 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -# NOVA is no longer maintained - [![Build Status](https://img.shields.io/travis/NOVA-Team/NOVA-Core.svg?style=flat-square)](https://travis-ci.org/NOVA-Team/NOVA-Core) [![Coverage](https://img.shields.io/codecov/c/github/NOVA-Team/NOVA-Core.svg?style=flat-square)](https://codecov.io/github/NOVA-Team/NOVA-Core) [![Tests](https://img.shields.io/jenkins/t/http/ci.novaapi.net/NOVA-Core.svg?style=flat-square)](http://ci.novaapi.net/job/NOVA-Core/lastCompletedBuild/testReport/) From 2eeb4276a4cac733d22538a58a156b02fffe68f5 Mon Sep 17 00:00:00 2001 From: ExE Boss Date: Tue, 10 Jan 2017 00:01:17 +0100 Subject: [PATCH 6/6] Add mcmod.info and fmlbranding.properties (#240) * Add mcmod.info and fmlbranding.properties * Get rid of SVG files --- minecraft/1.7/build.gradle | 4 ++-- .../resources/assets/nova/textures/NOVA.png | Bin 0 -> 8484 bytes .../src/main/resources/fmlbranding.properties | 1 + minecraft/1.7/src/main/resources/mcmod.info | 21 ++++++++++++++++++ minecraft/1.8/build.gradle | 4 ++-- .../resources/assets/nova/textures/NOVA.png | Bin 0 -> 8484 bytes .../src/main/resources/fmlbranding.properties | 1 + minecraft/1.8/src/main/resources/mcmod.info | 21 ++++++++++++++++++ 8 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 minecraft/1.7/src/main/resources/assets/nova/textures/NOVA.png create mode 100644 minecraft/1.7/src/main/resources/fmlbranding.properties create mode 100644 minecraft/1.7/src/main/resources/mcmod.info create mode 100644 minecraft/1.8/src/main/resources/assets/nova/textures/NOVA.png create mode 100644 minecraft/1.8/src/main/resources/fmlbranding.properties create mode 100644 minecraft/1.8/src/main/resources/mcmod.info diff --git a/minecraft/1.7/build.gradle b/minecraft/1.7/build.gradle index 9ad5482a3..d54fad419 100644 --- a/minecraft/1.7/build.gradle +++ b/minecraft/1.7/build.gradle @@ -123,11 +123,11 @@ processResources { inputs.property "mcversion", project.minecraft.version from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info' + include 'mcmod.info', 'fmlbranding.properties' expand 'version': project.version, 'mcversion': project.minecraft.version } from(sourceSets.main.resources.srcDirs) { - exclude 'mcmod.info' + exclude 'mcmod.info', 'fmlbranding.properties' } } diff --git a/minecraft/1.7/src/main/resources/assets/nova/textures/NOVA.png b/minecraft/1.7/src/main/resources/assets/nova/textures/NOVA.png new file mode 100644 index 0000000000000000000000000000000000000000..1f42e113ce5dbaa9b1bc62df36b8d523f52b5ae5 GIT binary patch literal 8484 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