Skip to content

Commit 6cbf251

Browse files
authored
Merge pull request #36 from TBoshoven/1.15.2-banner
Banner modifier
2 parents 4ad2494 + a336eea commit 6cbf251

14 files changed

+361
-17
lines changed

MagicMirror/src/main/java/com/tomboshoven/minecraft/magicmirror/MagicMirrorMod.java

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.tomboshoven.minecraft.magicmirror.blocks.Blocks;
44
import com.tomboshoven.minecraft.magicmirror.blocks.modifiers.ArmorMagicMirrorModifier;
5+
import com.tomboshoven.minecraft.magicmirror.blocks.modifiers.BannerMagicMirrorModifier;
56
import com.tomboshoven.minecraft.magicmirror.blocks.modifiers.CreatureMagicMirrorModifier;
67
import com.tomboshoven.minecraft.magicmirror.blocks.modifiers.MagicMirrorModifier;
78
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.TileEntities;
@@ -49,6 +50,7 @@ public MagicMirrorMod() {
4950

5051
// Register modifiers
5152
MagicMirrorModifier.register(new ArmorMagicMirrorModifier());
53+
MagicMirrorModifier.register(new BannerMagicMirrorModifier());
5254
MagicMirrorModifier.register(new CreatureMagicMirrorModifier());
5355
}
5456
}

MagicMirror/src/main/java/com/tomboshoven/minecraft/magicmirror/blocks/MagicMirrorBlock.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,10 @@ public class MagicMirrorBlock extends HorizontalBlock {
9696
* @param modifier The modifier to attach to the mirror.
9797
*/
9898
private static void attachModifier(World worldIn, BlockPos pos, ItemStack heldItem, MagicMirrorModifier modifier) {
99+
// Item stack may change by attaching
100+
ItemStack originalHeldItem = heldItem.copy();
99101
modifier.apply(worldIn, pos, heldItem);
100-
MessageAttachModifier message = new MessageAttachModifier(pos, heldItem, modifier);
102+
MessageAttachModifier message = new MessageAttachModifier(pos, originalHeldItem, modifier);
101103
PacketDistributor.PacketTarget target = PacketDistributor.TRACKING_CHUNK.with(() -> worldIn.getChunkAt(pos));
102104
Network.CHANNEL.send(target, message);
103105
}

MagicMirror/src/main/java/com/tomboshoven/minecraft/magicmirror/blocks/modifiers/ArmorMagicMirrorModifier.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import mcp.MethodsReturnNonnullByDefault;
66
import net.minecraft.item.ItemStack;
77
import net.minecraft.item.Items;
8+
import net.minecraft.nbt.CompoundNBT;
89
import net.minecraft.util.math.BlockPos;
910
import net.minecraft.world.World;
1011

@@ -33,7 +34,14 @@ public boolean canModify(World worldIn, BlockPos pos, ItemStack heldItem) {
3334
}
3435

3536
@Override
36-
MagicMirrorTileEntityModifier createTileEntityModifier() {
37+
MagicMirrorTileEntityModifier createTileEntityModifier(CompoundNBT nbt) {
38+
MagicMirrorTileEntityModifier teModifier = new ArmorMagicMirrorTileEntityModifier(this);
39+
teModifier.read(nbt);
40+
return teModifier;
41+
}
42+
43+
@Override
44+
MagicMirrorTileEntityModifier createTileEntityModifier(ItemStack usedItem) {
3745
return new ArmorMagicMirrorTileEntityModifier(this);
3846
}
3947
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.tomboshoven.minecraft.magicmirror.blocks.modifiers;
2+
3+
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.modifiers.BannerMagicMirrorTileEntityModifier;
4+
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.modifiers.MagicMirrorTileEntityModifier;
5+
import mcp.MethodsReturnNonnullByDefault;
6+
import net.minecraft.item.BannerItem;
7+
import net.minecraft.item.DyeColor;
8+
import net.minecraft.item.Item;
9+
import net.minecraft.item.ItemStack;
10+
import net.minecraft.nbt.CompoundNBT;
11+
import net.minecraft.util.math.BlockPos;
12+
import net.minecraft.world.World;
13+
14+
import javax.annotation.ParametersAreNonnullByDefault;
15+
16+
/**
17+
* A magic mirror modifier that changes the mirror's background to a banner image.
18+
*/
19+
@ParametersAreNonnullByDefault
20+
@MethodsReturnNonnullByDefault
21+
public class BannerMagicMirrorModifier extends MagicMirrorModifier {
22+
@Override
23+
public String getName() {
24+
return "banner";
25+
}
26+
27+
@Override
28+
public boolean canModify(World worldIn, BlockPos pos, ItemStack heldItem) {
29+
// Must be activated using a banner.
30+
if (!(heldItem.getItem() instanceof BannerItem)) {
31+
return false;
32+
}
33+
34+
// Must not have a banner modifier yet.
35+
return !hasModifierOfType(worldIn, pos);
36+
}
37+
38+
@Override
39+
MagicMirrorTileEntityModifier createTileEntityModifier(CompoundNBT nbt) {
40+
MagicMirrorTileEntityModifier teModifier = new BannerMagicMirrorTileEntityModifier(this);
41+
teModifier.read(nbt);
42+
return teModifier;
43+
}
44+
45+
@Override
46+
MagicMirrorTileEntityModifier createTileEntityModifier(ItemStack usedItem) {
47+
Item bannerType = usedItem.getItem();
48+
DyeColor bannerColor = bannerType instanceof BannerItem ? ((BannerItem) bannerType).getColor() : DyeColor.BLACK;
49+
CompoundNBT bannerTag = usedItem.getTag();
50+
if (bannerTag != null) {
51+
// Get the block tag instead of the item stack tag
52+
bannerTag = bannerTag.getCompound("BlockEntityTag");
53+
}
54+
return new BannerMagicMirrorTileEntityModifier(this, bannerColor, bannerTag, usedItem.hasDisplayName() ? usedItem.getDisplayName() : null);
55+
}
56+
}

MagicMirror/src/main/java/com/tomboshoven/minecraft/magicmirror/blocks/modifiers/CreatureMagicMirrorModifier.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import mcp.MethodsReturnNonnullByDefault;
66
import net.minecraft.item.ItemStack;
77
import net.minecraft.item.Items;
8+
import net.minecraft.nbt.CompoundNBT;
89
import net.minecraft.util.math.BlockPos;
910
import net.minecraft.world.World;
1011

@@ -38,7 +39,14 @@ public boolean canModify(World worldIn, BlockPos pos, ItemStack heldItem) {
3839
}
3940

4041
@Override
41-
MagicMirrorTileEntityModifier createTileEntityModifier() {
42+
MagicMirrorTileEntityModifier createTileEntityModifier(CompoundNBT nbt) {
43+
MagicMirrorTileEntityModifier teModifier = new CreatureMagicMirrorTileEntityModifier(this);
44+
teModifier.read(nbt);
45+
return teModifier;
46+
}
47+
48+
@Override
49+
MagicMirrorTileEntityModifier createTileEntityModifier(ItemStack usedItem) {
4250
return new CreatureMagicMirrorTileEntityModifier(this);
4351
}
4452
}

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

+10-4
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ public void apply(IBlockReader worldIn, BlockPos pos, ItemStack heldItem) {
133133
* @param heldItem The item used on the block.
134134
*/
135135
private void apply(MagicMirrorBaseTileEntity tileEntity, ItemStack heldItem) {
136-
tileEntity.addModifier(createTileEntityModifier());
136+
tileEntity.addModifier(createTileEntityModifier(heldItem));
137137
heldItem.shrink(1);
138138
}
139139

@@ -144,15 +144,21 @@ private void apply(MagicMirrorBaseTileEntity tileEntity, ItemStack heldItem) {
144144
* @param nbt The NBT tag to use for the modifier.
145145
*/
146146
public void apply(MagicMirrorBaseTileEntity tileEntity, CompoundNBT nbt) {
147-
MagicMirrorTileEntityModifier magicMirrorTileEntityModifier = createTileEntityModifier();
148-
magicMirrorTileEntityModifier.read(nbt);
147+
MagicMirrorTileEntityModifier magicMirrorTileEntityModifier = createTileEntityModifier(nbt);
149148
tileEntity.addModifier(magicMirrorTileEntityModifier);
150149
}
151150

152151
/**
152+
* @param nbt The NBT tag of the modifier.
153153
* @return A new instance of the tile entity modifier.
154154
*/
155-
abstract MagicMirrorTileEntityModifier createTileEntityModifier();
155+
abstract MagicMirrorTileEntityModifier createTileEntityModifier(CompoundNBT nbt);
156+
157+
/**
158+
* @param usedItem The item used to attach the modifier.
159+
* @return A new instance of the tile entity modifier.
160+
*/
161+
abstract MagicMirrorTileEntityModifier createTileEntityModifier(ItemStack usedItem);
156162

157163
/**
158164
* Find out whether the mirror at the given position already has a modifier of the current type.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
package com.tomboshoven.minecraft.magicmirror.blocks.tileentities.modifiers;
2+
3+
import com.google.common.collect.Lists;
4+
import com.tomboshoven.minecraft.magicmirror.blocks.modifiers.MagicMirrorModifier;
5+
import com.tomboshoven.minecraft.magicmirror.blocks.tileentities.MagicMirrorBaseTileEntity;
6+
import com.tomboshoven.minecraft.magicmirror.reflection.Reflection;
7+
import com.tomboshoven.minecraft.magicmirror.reflection.modifiers.BannerReflectionModifier;
8+
import com.tomboshoven.minecraft.magicmirror.reflection.modifiers.BannerReflectionModifierClient;
9+
import mcp.MethodsReturnNonnullByDefault;
10+
import net.minecraft.block.BannerBlock;
11+
import net.minecraft.entity.player.PlayerEntity;
12+
import net.minecraft.inventory.InventoryHelper;
13+
import net.minecraft.item.DyeColor;
14+
import net.minecraft.item.ItemStack;
15+
import net.minecraft.nbt.CompoundNBT;
16+
import net.minecraft.nbt.ListNBT;
17+
import net.minecraft.tileentity.BannerPattern;
18+
import net.minecraft.util.Hand;
19+
import net.minecraft.util.math.BlockPos;
20+
import net.minecraft.util.text.ITextComponent;
21+
import net.minecraft.world.World;
22+
import net.minecraftforge.fml.DistExecutor;
23+
import org.apache.commons.lang3.tuple.Pair;
24+
25+
import javax.annotation.Nullable;
26+
import javax.annotation.ParametersAreNonnullByDefault;
27+
import java.util.List;
28+
29+
30+
@ParametersAreNonnullByDefault
31+
@MethodsReturnNonnullByDefault
32+
public class BannerMagicMirrorTileEntityModifier extends MagicMirrorTileEntityModifier {
33+
/**
34+
* The initial color of the banner (before any patterns are applied)
35+
*/
36+
private DyeColor baseColor = DyeColor.BLACK;
37+
/**
38+
* The banner NBT tag, stored here for removal.
39+
*/
40+
@Nullable
41+
private CompoundNBT bannerNBT;
42+
/**
43+
* The banner name.
44+
*/
45+
@Nullable
46+
private ITextComponent name;
47+
/**
48+
* The object that modifies the reflection in the mirror to show the banner in the background.
49+
*/
50+
@Nullable
51+
private BannerReflectionModifier reflectionModifier;
52+
53+
public BannerMagicMirrorTileEntityModifier(MagicMirrorModifier modifier) {
54+
super(modifier);
55+
}
56+
57+
public BannerMagicMirrorTileEntityModifier(MagicMirrorModifier modifier, DyeColor baseColor, @Nullable CompoundNBT bannerNBT, @Nullable ITextComponent name) {
58+
super(modifier);
59+
this.baseColor = baseColor;
60+
this.bannerNBT = bannerNBT != null ? bannerNBT.copy() : null;
61+
this.name = name;
62+
}
63+
64+
@Override
65+
public void remove(World world, BlockPos pos) {
66+
ItemStack itemStack = new ItemStack(BannerBlock.forColor(baseColor));
67+
if (bannerNBT != null) {
68+
itemStack.getOrCreateTag().put("BlockEntityTag", bannerNBT);
69+
}
70+
if (name != null) {
71+
itemStack.setDisplayName(name);
72+
}
73+
InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), itemStack);
74+
}
75+
76+
@Override
77+
public CompoundNBT write(CompoundNBT nbt) {
78+
super.write(nbt);
79+
nbt.putInt("BannerColor", baseColor.getId());
80+
if (bannerNBT != null) {
81+
nbt.put("BannerData", bannerNBT.copy());
82+
}
83+
nbt.putString("BannerName", ITextComponent.Serializer.toJson(name));
84+
return nbt;
85+
}
86+
87+
@Override
88+
public void read(CompoundNBT nbt) {
89+
super.read(nbt);
90+
baseColor = DyeColor.byId(nbt.getInt("BannerColor"));
91+
CompoundNBT bannerData = nbt.getCompound("BannerData");
92+
if (!bannerData.isEmpty()) {
93+
bannerNBT = bannerData.copy();
94+
}
95+
name = ITextComponent.Serializer.fromJson(nbt.getString("BannerName"));
96+
}
97+
98+
@Override
99+
public void activate(MagicMirrorBaseTileEntity tileEntity) {
100+
Reflection reflection = tileEntity.getReflection();
101+
if (reflection != null) {
102+
List<Pair<BannerPattern, DyeColor>> patternList = Lists.newArrayList();
103+
patternList.add(Pair.of(BannerPattern.BASE, baseColor));
104+
if (bannerNBT != null) {
105+
// Get the patterns from the NBT data
106+
ListNBT patterns = bannerNBT.getList("Patterns", 10);
107+
int size = patterns.size();
108+
for (int i = 0; i < size; ++i) {
109+
CompoundNBT pattern = patterns.getCompound(i);
110+
BannerPattern bannerPattern = BannerPattern.byHash(pattern.getString("Pattern"));
111+
if (bannerPattern != null) {
112+
DyeColor bannerPatternColor = DyeColor.byId(pattern.getInt("Color"));
113+
patternList.add(Pair.of(bannerPattern, bannerPatternColor));
114+
}
115+
}
116+
}
117+
118+
reflectionModifier = createReflectionModifier(patternList);
119+
120+
reflection.addModifier(reflectionModifier);
121+
}
122+
}
123+
124+
private static BannerReflectionModifier createReflectionModifier(List<? extends Pair<BannerPattern, DyeColor>> patternList) {
125+
return DistExecutor.runForDist(
126+
() -> () -> new BannerReflectionModifierClient(patternList),
127+
() -> () -> new BannerReflectionModifier(patternList)
128+
);
129+
}
130+
131+
@Override
132+
public void deactivate(MagicMirrorBaseTileEntity tileEntity) {
133+
if (reflectionModifier != null) {
134+
Reflection reflection = tileEntity.getReflection();
135+
if (reflection != null) {
136+
reflection.removeModifier(reflectionModifier);
137+
}
138+
}
139+
}
140+
141+
@Override
142+
public boolean tryPlayerActivate(MagicMirrorBaseTileEntity tileEntity, PlayerEntity playerIn, Hand hand) {
143+
// No activation behavior
144+
return false;
145+
}
146+
}

MagicMirror/src/main/java/com/tomboshoven/minecraft/magicmirror/reflection/ReflectionClient.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -115,13 +115,13 @@ public void render(float partialTicks) {
115115
frameBuffer.framebufferClear(IS_RUNNING_ON_MAC);
116116
frameBuffer.bindFramebuffer(true);
117117

118-
reflectionRenderer.setupPerspective();
118+
reflectionRenderer.setUp();
119119

120120
reflectionRenderer.render(angle, partialTicks, renderTypeBuffer);
121121

122122
renderTypeBuffer.finish();
123123

124-
reflectionRenderer.tearDownPerspective();
124+
reflectionRenderer.tearDown();
125125

126126
frameBuffer.unbindFramebuffer();
127127
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.tomboshoven.minecraft.magicmirror.reflection.modifiers;
2+
3+
import com.google.common.collect.ImmutableList;
4+
import com.tomboshoven.minecraft.magicmirror.reflection.renderers.ReflectionRendererBase;
5+
import mcp.MethodsReturnNonnullByDefault;
6+
import net.minecraft.item.DyeColor;
7+
import net.minecraft.tileentity.BannerPattern;
8+
import org.apache.commons.lang3.tuple.Pair;
9+
10+
import javax.annotation.ParametersAreNonnullByDefault;
11+
import java.util.Collection;
12+
import java.util.List;
13+
14+
/**
15+
* A reflection modifier that changes the background of the reflection.
16+
*/
17+
@ParametersAreNonnullByDefault
18+
@MethodsReturnNonnullByDefault
19+
public class BannerReflectionModifier extends ReflectionModifier {
20+
ImmutableList<Pair<BannerPattern, DyeColor>> patternList;
21+
22+
public BannerReflectionModifier(Collection<? extends Pair<BannerPattern, DyeColor>> patternList) {
23+
this.patternList = ImmutableList.copyOf(patternList);
24+
}
25+
26+
@Override
27+
public ReflectionRendererBase apply(ReflectionRendererBase reflectionRenderer) {
28+
// Nothing to do on the server side
29+
return reflectionRenderer;
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.tomboshoven.minecraft.magicmirror.reflection.modifiers;
2+
3+
import com.tomboshoven.minecraft.magicmirror.reflection.renderers.ReflectionRendererBase;
4+
import com.tomboshoven.minecraft.magicmirror.reflection.renderers.modifiers.BannerReflectionRendererModifier;
5+
import mcp.MethodsReturnNonnullByDefault;
6+
import net.minecraft.item.DyeColor;
7+
import net.minecraft.tileentity.BannerPattern;
8+
import org.apache.commons.lang3.tuple.Pair;
9+
10+
import javax.annotation.ParametersAreNonnullByDefault;
11+
import java.util.Collection;
12+
13+
@ParametersAreNonnullByDefault
14+
@MethodsReturnNonnullByDefault
15+
public class BannerReflectionModifierClient extends BannerReflectionModifier {
16+
public BannerReflectionModifierClient(Collection<? extends Pair<BannerPattern, DyeColor>> patternList) {
17+
super(patternList);
18+
}
19+
20+
@Override
21+
public ReflectionRendererBase apply(ReflectionRendererBase reflectionRenderer) {
22+
super.apply(reflectionRenderer);
23+
return new BannerReflectionRendererModifier(reflectionRenderer, patternList);
24+
}
25+
}

0 commit comments

Comments
 (0)