Skip to content

Commit 158b1ce

Browse files
committed
Implemented skeletons!
Also fixed a bug that would stretch your reflection if your window size was non-default. Also fixed an issue that caused reflections to be zoomed based on player FoV (for example when using a bow).
1 parent 1068eaf commit 158b1ce

24 files changed

+545
-43
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.3.0"
16+
version = "1.12.2-0.0.4.0"
1717
group = "com.tomboshoven.minecraft"
1818
archivesBaseName = "magic-mirror"
1919

src/main/java/com/tomboshoven/minecraft/magicmirror/ModMagicMirror.java

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.tomboshoven.minecraft.magicmirror.blocks.Blocks;
44
import com.tomboshoven.minecraft.magicmirror.blocks.modifiers.MagicMirrorModifier;
55
import com.tomboshoven.minecraft.magicmirror.blocks.modifiers.MagicMirrorModifierArmor;
6+
import com.tomboshoven.minecraft.magicmirror.blocks.modifiers.MagicMirrorModifierCreature;
67
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.TileEntityMagicMirrorCore;
78
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.TileEntityMagicMirrorPart;
89
import com.tomboshoven.minecraft.magicmirror.commands.Commands;
@@ -50,5 +51,6 @@ public void init(FMLPreInitializationEvent event) {
5051

5152
// Register modifiers
5253
MagicMirrorModifier.register(new MagicMirrorModifierArmor());
54+
MagicMirrorModifier.register(new MagicMirrorModifierCreature());
5355
}
5456
}

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

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

33
import com.tomboshoven.minecraft.magicmirror.ModMagicMirror;
4+
import mcp.MethodsReturnNonnullByDefault;
45
import net.minecraft.block.Block;
56
import net.minecraft.creativetab.CreativeTabs;
67
import net.minecraftforge.event.RegistryEvent.Register;
78
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
89
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
910

11+
import javax.annotation.ParametersAreNonnullByDefault;
12+
1013
/**
1114
* Collection of all blocks in the mod.
1215
*/
1316
@EventBusSubscriber
17+
@ParametersAreNonnullByDefault
18+
@MethodsReturnNonnullByDefault
1419
public final class Blocks {
1520
/**
1621
* A magic mirror block. Shows you your reflection, and more!

src/main/java/com/tomboshoven/minecraft/magicmirror/blocks/modifiers/MagicMirrorModifier.java

+57-13
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.google.common.collect.Maps;
44
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.TileEntityMagicMirrorBase;
5+
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.modifiers.MagicMirrorTileEntityModifier;
6+
import mcp.MethodsReturnNonnullByDefault;
57
import net.minecraft.item.ItemStack;
68
import net.minecraft.nbt.NBTTagCompound;
79
import net.minecraft.tileentity.TileEntity;
@@ -10,6 +12,7 @@
1012
import net.minecraft.world.World;
1113

1214
import javax.annotation.Nullable;
15+
import javax.annotation.ParametersAreNonnullByDefault;
1316
import java.util.Collection;
1417
import java.util.Collections;
1518
import java.util.Map;
@@ -20,6 +23,8 @@
2023
* These are typically activated by right-clicking a mirror with an item.
2124
* In order to make a modifier available in the game, register it using the static register() method.
2225
*/
26+
@ParametersAreNonnullByDefault
27+
@MethodsReturnNonnullByDefault
2328
public abstract class MagicMirrorModifier {
2429
/**
2530
* A registry of all modifiers.
@@ -53,6 +58,38 @@ public static MagicMirrorModifier getModifier(String name) {
5358
return MODIFIERS.get(name);
5459
}
5560

61+
/**
62+
* Helper method to get a magic mirror tile entity at the given position.
63+
*
64+
* @param worldIn The world containing the magic mirror.
65+
* @param pos The position in the world of the block.
66+
* @return The tile entity, or null if it does not exist or is not a magic mirror tile entity.
67+
*/
68+
@Nullable
69+
private static TileEntityMagicMirrorBase getMagicMirrorTileEntity(IBlockAccess worldIn, BlockPos pos) {
70+
TileEntity tileEntity = worldIn.getTileEntity(pos);
71+
if (tileEntity instanceof TileEntityMagicMirrorBase) {
72+
return (TileEntityMagicMirrorBase) tileEntity;
73+
}
74+
return null;
75+
}
76+
77+
/**
78+
* Find out whether the mirror at the given position already has a modifier of a given type.
79+
*
80+
* @param world The world in which to check the block.
81+
* @param pos The position of the mirror block to check.
82+
* @param modifierType The type of modifier to test for.
83+
* @return Whether the mirror at the given position has the given modifier.
84+
*/
85+
private static boolean hasModifierOfType(IBlockAccess world, BlockPos pos, Class<? extends MagicMirrorModifier> modifierType) {
86+
TileEntityMagicMirrorBase magicMirrorTileEntity = getMagicMirrorTileEntity(world, pos);
87+
if (magicMirrorTileEntity == null) {
88+
return false;
89+
}
90+
return magicMirrorTileEntity.getModifiers().stream().anyMatch(modifierType::isInstance);
91+
}
92+
5693
/**
5794
* @return The name of the modifier.
5895
*/
@@ -95,29 +132,36 @@ public void apply(IBlockAccess worldIn, BlockPos pos, ItemStack heldItem) {
95132
* @param tileEntity The magic mirror tile entity to apply the modifier to.
96133
* @param heldItem The item used on the block.
97134
*/
98-
abstract void apply(TileEntityMagicMirrorBase tileEntity, ItemStack heldItem);
135+
private void apply(TileEntityMagicMirrorBase tileEntity, ItemStack heldItem) {
136+
tileEntity.addModifier(createTileEntityModifier());
137+
heldItem.shrink(1);
138+
}
99139

100140
/**
101141
* Apply the modifier to the magic mirror as specified in an NBT tag.
102142
*
103143
* @param tileEntity The magic mirror tile entity to apply the modifier to.
104144
* @param nbt The NBT tag to use for the modifier.
105145
*/
106-
public abstract void apply(TileEntityMagicMirrorBase tileEntity, NBTTagCompound nbt);
146+
public void apply(TileEntityMagicMirrorBase tileEntity, NBTTagCompound nbt) {
147+
MagicMirrorTileEntityModifier magicMirrorTileEntityModifier = createTileEntityModifier();
148+
magicMirrorTileEntityModifier.readFromNBT(nbt);
149+
tileEntity.addModifier(magicMirrorTileEntityModifier);
150+
}
107151

108152
/**
109-
* Helper method to get a magic mirror tile entity at the given position.
153+
* @return A new instance of the tile entity modifier.
154+
*/
155+
abstract MagicMirrorTileEntityModifier createTileEntityModifier();
156+
157+
/**
158+
* Find out whether the mirror at the given position already has a modifier of the current type.
110159
*
111-
* @param worldIn The world containing the magic mirror.
112-
* @param pos The position in the world of the block.
113-
* @return The tile entity, or null if it does not exist or is not a magic mirror tile entity.
160+
* @param world The world in which to check the block.
161+
* @param pos The position of the mirror block to check.
162+
* @return Whether the mirror at the given position has the current modifier.
114163
*/
115-
@Nullable
116-
static TileEntityMagicMirrorBase getMagicMirrorTileEntity(IBlockAccess worldIn, BlockPos pos) {
117-
TileEntity tileEntity = worldIn.getTileEntity(pos);
118-
if (tileEntity instanceof TileEntityMagicMirrorBase) {
119-
return (TileEntityMagicMirrorBase) tileEntity;
120-
}
121-
return null;
164+
boolean hasModifierOfType(IBlockAccess world, BlockPos pos) {
165+
return hasModifierOfType(world, pos, getClass());
122166
}
123167
}
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
package com.tomboshoven.minecraft.magicmirror.blocks.modifiers;
22

3-
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.TileEntityMagicMirrorBase;
3+
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.modifiers.MagicMirrorTileEntityModifier;
44
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.modifiers.MagicMirrorTileEntityModifierArmor;
5+
import mcp.MethodsReturnNonnullByDefault;
56
import net.minecraft.init.Items;
67
import net.minecraft.item.ItemStack;
7-
import net.minecraft.nbt.NBTTagCompound;
88
import net.minecraft.util.math.BlockPos;
99
import net.minecraft.world.World;
1010

11+
import javax.annotation.ParametersAreNonnullByDefault;
12+
1113
/**
1214
* A magic mirror modifier that allows it to be used as an armor stand for switching an entire set of armor.
1315
*/
16+
@ParametersAreNonnullByDefault
17+
@MethodsReturnNonnullByDefault
1418
public class MagicMirrorModifierArmor extends MagicMirrorModifier {
1519
@Override
1620
public String getName() {
@@ -25,24 +29,11 @@ public boolean canModify(World worldIn, BlockPos pos, ItemStack heldItem) {
2529
}
2630

2731
// Must not have an armor modifier yet.
28-
TileEntityMagicMirrorBase magicMirrorTileEntity = getMagicMirrorTileEntity(worldIn, pos);
29-
if (magicMirrorTileEntity == null) {
30-
return false;
31-
}
32-
return magicMirrorTileEntity.getModifiers().stream()
33-
.noneMatch(magicMirrorModifier -> magicMirrorModifier instanceof MagicMirrorTileEntityModifierArmor);
34-
}
35-
36-
@Override
37-
void apply(TileEntityMagicMirrorBase tileEntity, ItemStack heldItem) {
38-
tileEntity.addModifier(new MagicMirrorTileEntityModifierArmor(this));
39-
heldItem.shrink(1);
32+
return !hasModifierOfType(worldIn, pos);
4033
}
4134

4235
@Override
43-
public void apply(TileEntityMagicMirrorBase tileEntity, NBTTagCompound nbt) {
44-
MagicMirrorTileEntityModifierArmor magicMirrorTileEntityModifier = new MagicMirrorTileEntityModifierArmor(this);
45-
magicMirrorTileEntityModifier.readFromNBT(nbt);
46-
tileEntity.addModifier(magicMirrorTileEntityModifier);
36+
MagicMirrorTileEntityModifier createTileEntityModifier() {
37+
return new MagicMirrorTileEntityModifierArmor(this);
4738
}
4839
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.tomboshoven.minecraft.magicmirror.blocks.modifiers;
2+
3+
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.modifiers.MagicMirrorTileEntityModifier;
4+
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.modifiers.MagicMirrorTileEntityModifierCreature;
5+
import mcp.MethodsReturnNonnullByDefault;
6+
import net.minecraft.init.Items;
7+
import net.minecraft.item.ItemStack;
8+
import net.minecraft.util.math.BlockPos;
9+
import net.minecraft.world.World;
10+
11+
import javax.annotation.ParametersAreNonnullByDefault;
12+
13+
/**
14+
* A magic mirror modifier that changes the appearance of the reflection to be another creature's.
15+
*/
16+
@ParametersAreNonnullByDefault
17+
@MethodsReturnNonnullByDefault
18+
public class MagicMirrorModifierCreature extends MagicMirrorModifier {
19+
/**
20+
* Return whether the given item is a skull that can be used to apply this modifier.
21+
*
22+
* @param item The item to test.
23+
* @return Whether the item is a skull of the right type.
24+
*/
25+
private static boolean isSupportedSkull(ItemStack item) {
26+
// Only support skeleton skulls for now
27+
return item.getItem() == Items.SKULL && Items.SKULL.getDamage(item) == 0;
28+
}
29+
30+
@Override
31+
public String getName() {
32+
return "creature";
33+
}
34+
35+
@Override
36+
public boolean canModify(World worldIn, BlockPos pos, ItemStack heldItem) {
37+
return isSupportedSkull(heldItem) && !hasModifierOfType(worldIn, pos);
38+
}
39+
40+
@Override
41+
MagicMirrorTileEntityModifier createTileEntityModifier() {
42+
return new MagicMirrorTileEntityModifierCreature(this);
43+
}
44+
}

src/main/java/com/tomboshoven/minecraft/magicmirror/blocks/tileentities/modifiers/MagicMirrorTileEntityModifier.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,21 @@
22

33
import com.tomboshoven.minecraft.magicmirror.blocks.modifiers.MagicMirrorModifier;
44
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.TileEntityMagicMirrorBase;
5+
import mcp.MethodsReturnNonnullByDefault;
56
import net.minecraft.entity.player.EntityPlayer;
67
import net.minecraft.nbt.NBTTagCompound;
78
import net.minecraft.util.EnumHand;
89
import net.minecraft.util.math.BlockPos;
910
import net.minecraft.world.World;
1011

12+
import javax.annotation.ParametersAreNonnullByDefault;
13+
1114
/**
1215
* A magic mirror modifier as applied to a tile entity.
1316
* Instead of using this directly, apply it using a MagicMirrorModifier instance.
1417
*/
18+
@ParametersAreNonnullByDefault
19+
@MethodsReturnNonnullByDefault
1520
public abstract class MagicMirrorTileEntityModifier {
1621
/**
1722
* The modifier that applied this object to the tile entity.
@@ -53,7 +58,7 @@ public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
5358
*
5459
* @param nbt The NBT tag compound to read from.
5560
*/
56-
void readFromNBT(NBTTagCompound nbt) {
61+
public void readFromNBT(NBTTagCompound nbt) {
5762
}
5863

5964
/**

src/main/java/com/tomboshoven/minecraft/magicmirror/blocks/tileentities/modifiers/MagicMirrorTileEntityModifierArmor.java

+4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.tomboshoven.minecraft.magicmirror.reflection.modifiers.ReflectionModifierArmor;
99
import com.tomboshoven.minecraft.magicmirror.reflection.modifiers.ReflectionModifierArmor.Factory;
1010
import io.netty.buffer.ByteBuf;
11+
import mcp.MethodsReturnNonnullByDefault;
1112
import net.minecraft.client.Minecraft;
1213
import net.minecraft.entity.Entity;
1314
import net.minecraft.entity.player.EntityPlayer;
@@ -34,8 +35,11 @@
3435
import net.minecraftforge.fml.relauncher.SideOnly;
3536

3637
import javax.annotation.Nullable;
38+
import javax.annotation.ParametersAreNonnullByDefault;
3739
import java.util.Random;
3840

41+
@ParametersAreNonnullByDefault
42+
@MethodsReturnNonnullByDefault
3943
public class MagicMirrorTileEntityModifierArmor extends MagicMirrorTileEntityModifier {
4044
/**
4145
* The number of ticks this modifier needs to cool down.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.tomboshoven.minecraft.magicmirror.blocks.tileentities.modifiers;
2+
3+
import com.tomboshoven.minecraft.magicmirror.blocks.modifiers.MagicMirrorModifier;
4+
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.TileEntityMagicMirrorBase;
5+
import com.tomboshoven.minecraft.magicmirror.reflection.Reflection;
6+
import com.tomboshoven.minecraft.magicmirror.reflection.modifiers.ReflectionModifierCreature;
7+
import com.tomboshoven.minecraft.magicmirror.reflection.modifiers.ReflectionModifierCreature.Factory;
8+
import mcp.MethodsReturnNonnullByDefault;
9+
import net.minecraft.entity.player.EntityPlayer;
10+
import net.minecraft.init.Items;
11+
import net.minecraft.inventory.InventoryHelper;
12+
import net.minecraft.item.ItemStack;
13+
import net.minecraft.util.EnumHand;
14+
import net.minecraft.util.math.BlockPos;
15+
import net.minecraft.world.World;
16+
import net.minecraftforge.fml.common.SidedProxy;
17+
18+
import javax.annotation.Nullable;
19+
import javax.annotation.ParametersAreNonnullByDefault;
20+
21+
@ParametersAreNonnullByDefault
22+
@MethodsReturnNonnullByDefault
23+
public class MagicMirrorTileEntityModifierCreature extends MagicMirrorTileEntityModifier {
24+
/**
25+
* Factory for creating the reflection modifier.
26+
*/
27+
@SidedProxy(
28+
serverSide = "com.tomboshoven.minecraft.magicmirror.reflection.modifiers.ReflectionModifierCreature$Factory",
29+
clientSide = "com.tomboshoven.minecraft.magicmirror.reflection.modifiers.ReflectionModifierCreatureClient$Factory"
30+
)
31+
private static Factory reflectionModifierFactory;
32+
/**
33+
* The object that modifies the reflection in the mirror to show the replacement armor.
34+
*/
35+
@Nullable
36+
private ReflectionModifierCreature reflectionModifier;
37+
38+
/**
39+
* @param modifier The modifier that applied this object to the tile entity.
40+
*/
41+
public MagicMirrorTileEntityModifierCreature(MagicMirrorModifier modifier) {
42+
super(modifier);
43+
}
44+
45+
@Override
46+
public void remove(World world, BlockPos pos) {
47+
InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), new ItemStack(Items.SKULL, 1, 0));
48+
}
49+
50+
@Override
51+
public void activate(TileEntityMagicMirrorBase tileEntity) {
52+
Reflection reflection = tileEntity.getReflection();
53+
if (reflection != null) {
54+
reflectionModifier = tileEntity.getWorld().isRemote ? reflectionModifierFactory.createClient() : reflectionModifierFactory.createServer();
55+
reflection.addModifier(reflectionModifier);
56+
}
57+
}
58+
59+
@Override
60+
public void deactivate(TileEntityMagicMirrorBase tileEntity) {
61+
if (reflectionModifier != null) {
62+
Reflection reflection = tileEntity.getReflection();
63+
if (reflection != null) {
64+
reflection.removeModifier(reflectionModifier);
65+
}
66+
}
67+
}
68+
69+
@Override
70+
public boolean tryPlayerActivate(TileEntityMagicMirrorBase tileEntity, EntityPlayer playerIn, EnumHand hand) {
71+
// No behavior right now.
72+
return false;
73+
}
74+
}

0 commit comments

Comments
 (0)