Skip to content

Commit 4a71502

Browse files
committed
Added a modifier system and made the mod not crash in servers.
1 parent 9410b26 commit 4a71502

24 files changed

+1491
-218
lines changed

build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ buildscript {
1313
}
1414
apply plugin: 'net.minecraftforge.gradle.forge'
1515

16-
version = "1.12.2-0.0.1.0"
16+
version = "1.12.2-0.0.2.0"
1717
group = "com.tomboshoven.minecraft"
1818
archivesBaseName = "magic-mirror"
1919

Original file line numberDiff line numberDiff line change
@@ -1,84 +1,53 @@
11
package com.tomboshoven.minecraft.magicmirror;
22

3-
import com.tomboshoven.minecraft.magicmirror.blocks.BlockMagicMirror;
3+
import com.tomboshoven.minecraft.magicmirror.blocks.Blocks;
4+
import com.tomboshoven.minecraft.magicmirror.blocks.modifiers.MagicMirrorModifier;
5+
import com.tomboshoven.minecraft.magicmirror.blocks.modifiers.MagicMirrorModifierArmor;
46
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.TileEntityMagicMirrorCore;
57
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.TileEntityMagicMirrorPart;
8+
import com.tomboshoven.minecraft.magicmirror.commands.Commands;
69
import com.tomboshoven.minecraft.magicmirror.commands.MagicMirrorCommand;
7-
import com.tomboshoven.minecraft.magicmirror.renderers.TileEntityMagicMirrorRenderer;
10+
import com.tomboshoven.minecraft.magicmirror.items.Items;
11+
import com.tomboshoven.minecraft.magicmirror.renderers.Renderers;
812
import mcp.MethodsReturnNonnullByDefault;
9-
import net.minecraft.block.Block;
10-
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
11-
import net.minecraft.creativetab.CreativeTabs;
12-
import net.minecraft.item.Item;
13-
import net.minecraft.item.ItemBlock;
1413
import net.minecraft.util.ResourceLocation;
1514
import net.minecraftforge.client.ClientCommandHandler;
16-
import net.minecraftforge.client.event.ModelRegistryEvent;
17-
import net.minecraftforge.client.model.ModelLoader;
1815
import net.minecraftforge.common.MinecraftForge;
19-
import net.minecraftforge.event.RegistryEvent;
20-
import net.minecraftforge.fml.client.registry.ClientRegistry;
2116
import net.minecraftforge.fml.common.Mod;
17+
import net.minecraftforge.fml.common.Mod.EventHandler;
2218
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
23-
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
2419
import net.minecraftforge.fml.common.registry.GameRegistry;
2520
import org.apache.logging.log4j.Logger;
2621

2722
import javax.annotation.ParametersAreNonnullByDefault;
2823

29-
@SuppressWarnings("unused")
3024
@ParametersAreNonnullByDefault
3125
@MethodsReturnNonnullByDefault
3226
@Mod(modid = ModMagicMirror.MOD_ID, name = ModMagicMirror.NAME, useMetadata = true)
33-
@Mod.EventBusSubscriber()
3427
public class ModMagicMirror {
35-
@SuppressWarnings("WeakerAccess")
3628
public static final String MOD_ID = "magic_mirror";
3729
@SuppressWarnings("WeakerAccess")
38-
public static final String NAME = "Magic Mirror";
30+
static final String NAME = "Magic Mirror";
3931

32+
@SuppressWarnings("PublicField")
4033
public static Logger logger;
4134

42-
private Block blockMagicMirror;
43-
private Item itemBlockMagicMirror;
44-
45-
@Mod.EventHandler
35+
@SuppressWarnings("MethodMayBeStatic")
36+
@EventHandler
4637
public void init(FMLPreInitializationEvent event) {
4738
logger = event.getModLog();
48-
MinecraftForge.EVENT_BUS.register(this);
49-
50-
blockMagicMirror = new BlockMagicMirror()
51-
.setRegistryName(MOD_ID, "magic_mirror")
52-
.setTranslationKey(String.format("%s.magic_mirror", MOD_ID))
53-
.setCreativeTab(CreativeTabs.MISC);
54-
itemBlockMagicMirror = new ItemBlock(blockMagicMirror)
55-
.setRegistryName(MOD_ID, "magic_mirror")
56-
.setCreativeTab(CreativeTabs.MISC);
39+
MinecraftForge.EVENT_BUS.register(Blocks.class);
40+
MinecraftForge.EVENT_BUS.register(Items.class);
41+
MinecraftForge.EVENT_BUS.register(Renderers.class);
5742

5843
// Register tile entities
5944
GameRegistry.registerTileEntity(TileEntityMagicMirrorCore.class, new ResourceLocation(MOD_ID, "magic_mirror_core"));
6045
GameRegistry.registerTileEntity(TileEntityMagicMirrorPart.class, new ResourceLocation(MOD_ID, "magic_mirror"));
6146

62-
// Register custom renderers
63-
TileEntityMagicMirrorRenderer renderer = new TileEntityMagicMirrorRenderer();
64-
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMagicMirrorCore.class, renderer);
65-
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMagicMirrorPart.class, renderer);
66-
67-
ClientCommandHandler.instance.registerCommand(new MagicMirrorCommand());
68-
}
69-
70-
@SubscribeEvent
71-
public void registerBlocks(RegistryEvent.Register<Block> event) {
72-
event.getRegistry().registerAll(blockMagicMirror);
73-
}
74-
75-
@SubscribeEvent
76-
public void registerItems(RegistryEvent.Register<Item> event) {
77-
event.getRegistry().registerAll(itemBlockMagicMirror);
78-
}
47+
// Register commands
48+
Commands.registerCommands();
7949

80-
@SubscribeEvent
81-
public void registerRenders(ModelRegistryEvent event) {
82-
ModelLoader.setCustomModelResourceLocation(itemBlockMagicMirror, 0, new ModelResourceLocation(new ResourceLocation(MOD_ID, "magic_mirror"), "inventory"));
50+
// Register modifiers
51+
MagicMirrorModifier.register(new MagicMirrorModifierArmor());
8352
}
8453
}

src/main/java/com/tomboshoven/minecraft/magicmirror/blocks/BlockMagicMirror.java

+64-37
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.tomboshoven.minecraft.magicmirror.blocks;
22

3+
import com.tomboshoven.minecraft.magicmirror.blocks.modifiers.MagicMirrorModifier;
4+
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.TileEntityMagicMirrorBase;
35
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.TileEntityMagicMirrorCore;
46
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.TileEntityMagicMirrorPart;
57
import mcp.MethodsReturnNonnullByDefault;
@@ -14,12 +16,16 @@
1416
import net.minecraft.block.state.BlockStateContainer;
1517
import net.minecraft.block.state.IBlockState;
1618
import net.minecraft.entity.EntityLivingBase;
19+
import net.minecraft.entity.player.EntityPlayer;
20+
import net.minecraft.init.SoundEvents;
1721
import net.minecraft.item.ItemStack;
1822
import net.minecraft.tileentity.TileEntity;
1923
import net.minecraft.util.EnumBlockRenderType;
2024
import net.minecraft.util.EnumFacing;
25+
import net.minecraft.util.EnumHand;
2126
import net.minecraft.util.IStringSerializable;
2227
import net.minecraft.util.Rotation;
28+
import net.minecraft.util.SoundCategory;
2329
import net.minecraft.util.math.AxisAlignedBB;
2430
import net.minecraft.util.math.BlockPos;
2531
import net.minecraft.world.IBlockAccess;
@@ -28,18 +34,19 @@
2834
import javax.annotation.Nullable;
2935
import javax.annotation.ParametersAreNonnullByDefault;
3036

37+
@SuppressWarnings("deprecation")
3138
@ParametersAreNonnullByDefault
3239
@MethodsReturnNonnullByDefault
3340
public class BlockMagicMirror extends BlockHorizontal {
3441
/**
3542
* Property describing whether the mirror is completely constructed.
3643
*/
37-
private static final PropertyBool COMPLETE = PropertyBool.create("complete");
44+
public static final PropertyBool COMPLETE = PropertyBool.create("complete");
3845

3946
/**
4047
* Property describing which part of the mirror is being represented by this block.
4148
*/
42-
private static final PropertyEnum<EnumPartType> PART = PropertyEnum.create("part", EnumPartType.class);
49+
public static final PropertyEnum<EnumPartType> PART = PropertyEnum.create("part", EnumPartType.class);
4350

4451
/**
4552
* The bounding boxes of the various orientations of this block; should be indexed by facing.horizontalIndex()
@@ -55,12 +62,16 @@ public class BlockMagicMirror extends BlockHorizontal {
5562
new AxisAlignedBB(0, 0, 0, 0.125, 1, 1),
5663
};
5764

58-
public BlockMagicMirror() {
65+
/**
66+
* Create a new Magic Mirror block.
67+
* This is typically not necessary. Use Blocks.blockMagicMirror instead.
68+
*/
69+
BlockMagicMirror() {
5970
super(new Material(MapColor.GRAY));
6071

6172
// By default, we're the bottom part of a broken mirror
6273
setDefaultState(
63-
this.blockState.getBaseState()
74+
blockState.getBaseState()
6475
.withProperty(COMPLETE, Boolean.FALSE)
6576
.withProperty(PART, EnumPartType.BOTTOM)
6677
);
@@ -92,8 +103,8 @@ public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Bloc
92103
// Break the mirror if the other part is broken.
93104
if (state.getValue(COMPLETE)) {
94105
if (
95-
(state.getValue(PART) == EnumPartType.TOP && worldIn.getBlockState(pos.down()).getBlock() != this) ||
96-
(state.getValue(PART) == EnumPartType.BOTTOM && worldIn.getBlockState(pos.up()).getBlock() != this)
106+
state.getValue(PART) == EnumPartType.TOP && worldIn.getBlockState(pos.down()).getBlock() != this ||
107+
state.getValue(PART) == EnumPartType.BOTTOM && worldIn.getBlockState(pos.up()).getBlock() != this
97108
) {
98109
worldIn.setBlockState(pos, state.withProperty(COMPLETE, false));
99110
}
@@ -114,13 +125,13 @@ public int getMetaFromState(IBlockState state) {
114125

115126
@Override
116127
public IBlockState getStateFromMeta(int meta) {
117-
return this.getDefaultState()
128+
return getDefaultState()
118129
.withProperty(FACING, EnumFacing.byHorizontalIndex(meta & 3))
119-
.withProperty(COMPLETE, (meta & (1 << 2)) != 0)
120-
.withProperty(PART, (meta & (1 << 3)) != 0 ? EnumPartType.TOP : EnumPartType.BOTTOM);
130+
.withProperty(COMPLETE, (meta & 1 << 2) != 0)
131+
.withProperty(PART, (meta & 1 << 3) == 0 ? EnumPartType.BOTTOM : EnumPartType.TOP);
121132
}
122133

123-
134+
@Override
124135
public BlockFaceShape getBlockFaceShape(IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face) {
125136
// Only the opposite face is default
126137
return state.getValue(FACING).getOpposite() == face ? BlockFaceShape.SOLID : BlockFaceShape.UNDEFINED;
@@ -152,8 +163,8 @@ public boolean hasTileEntity() {
152163
}
153164

154165
@Override
155-
public boolean hasTileEntity(IBlockState blockState) {
156-
return blockState.getValue(COMPLETE);
166+
public boolean hasTileEntity(IBlockState state) {
167+
return state.getValue(COMPLETE);
157168
}
158169

159170
@Nullable
@@ -166,42 +177,51 @@ public TileEntity createTileEntity(World world, IBlockState state) {
166177
return new TileEntityMagicMirrorPart();
167178
}
168179

180+
@Override
169181
public IBlockState withRotation(IBlockState state, Rotation rot) {
170182
return state.withProperty(FACING, rot.rotate(state.getValue(FACING)));
171183
}
172184

185+
@Override
173186
public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) {
174187
// Make sure the mirror is facing the right way when placed
175188
return getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite());
176189
}
177190

178191
@Override
179-
public String getTranslationKey() {
180-
return super.getTranslationKey();
181-
}
192+
public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
193+
// First, see if we can add a modifier
194+
ItemStack heldItem = playerIn.getHeldItem(hand);
195+
if (!heldItem.isEmpty()) {
196+
for (MagicMirrorModifier modifier : MagicMirrorModifier.getModifiers()) {
197+
if (modifier.canModify(worldIn, pos, heldItem)) {
198+
modifier.apply(worldIn, pos, heldItem);
199+
worldIn.playSound(pos.getX() + .5, pos.getY() + .5, pos.getZ() + .5, SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, SoundCategory.BLOCKS, .6f, .6f, true);
200+
return true;
201+
}
202+
}
203+
}
182204

183-
/**
184-
* @param blockState: The blockstate to evaluate.
185-
* @return Which direction this mirror block is facing in.
186-
*/
187-
public EnumFacing getFacing(IBlockState blockState) {
188-
return blockState.getValue(FACING);
189-
}
205+
// Then, see if any existing modifier can do something.
206+
TileEntity tileEntity = worldIn.getTileEntity(pos);
207+
if (tileEntity instanceof TileEntityMagicMirrorBase) {
208+
if (((TileEntityMagicMirrorBase) tileEntity).tryActivate(playerIn, hand)) {
209+
return true;
210+
}
211+
}
190212

191-
/**
192-
* @param blockState: The blockstate to evaluate.
193-
* @return Which part is represented by this block.
194-
*/
195-
public EnumPartType getPart(IBlockState blockState) {
196-
return blockState.getValue(PART);
213+
return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ);
197214
}
198215

199-
/**
200-
* @param blockState: The blockstate to evaluate.
201-
* @return Whether the mirror is completely constructed.
202-
*/
203-
public boolean isComplete(IBlockState blockState) {
204-
return blockState.getValue(COMPLETE);
216+
@Override
217+
public void breakBlock(World worldIn, BlockPos pos, IBlockState state) {
218+
if (state.getValue(COMPLETE)) {
219+
TileEntity tileEntity = worldIn.getTileEntity(pos);
220+
if (tileEntity instanceof TileEntityMagicMirrorBase) {
221+
((TileEntityMagicMirrorBase) tileEntity).removeModifiers(worldIn, pos);
222+
}
223+
}
224+
super.breakBlock(worldIn, pos, state);
205225
}
206226

207227
/**
@@ -212,9 +232,13 @@ public enum EnumPartType implements IStringSerializable {
212232
BOTTOM("bottom", 1),
213233
;
214234

215-
String name;
216-
int value;
235+
private final String name;
236+
private final int value;
217237

238+
/**
239+
* @param name The name of the part.
240+
* @param value The integer value of the part; used for setting block metadata.
241+
*/
218242
EnumPartType(String name, int value) {
219243
this.name = name;
220244
this.value = value;
@@ -225,8 +249,11 @@ public String getName() {
225249
return name;
226250
}
227251

252+
/**
253+
* @return The integer value of the part; used for setting block metadata.
254+
*/
228255
int getValue() {
229-
return this.value;
256+
return value;
230257
}
231258
}
232259
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.tomboshoven.minecraft.magicmirror.blocks;
2+
3+
import com.tomboshoven.minecraft.magicmirror.ModMagicMirror;
4+
import net.minecraft.block.Block;
5+
import net.minecraft.creativetab.CreativeTabs;
6+
import net.minecraftforge.event.RegistryEvent.Register;
7+
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
8+
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
9+
10+
/**
11+
* Collection of all blocks in the mod.
12+
*/
13+
@EventBusSubscriber
14+
public final class Blocks {
15+
/**
16+
* A magic mirror block. Shows you your reflection, and more!
17+
*/
18+
public static final Block blockMagicMirror = new BlockMagicMirror()
19+
.setRegistryName(ModMagicMirror.MOD_ID, "magic_mirror")
20+
.setTranslationKey(String.format("%s.magic_mirror", ModMagicMirror.MOD_ID))
21+
.setCreativeTab(CreativeTabs.MISC);
22+
23+
private Blocks() {
24+
}
25+
26+
@SuppressWarnings("BoundedWildcard")
27+
@SubscribeEvent
28+
public static void registerBlocks(Register<Block> event) {
29+
event.getRegistry().registerAll(blockMagicMirror);
30+
}
31+
}

0 commit comments

Comments
 (0)