Skip to content

Commit e70c263

Browse files
committed
1.1.4
1 parent febe017 commit e70c263

16 files changed

+158
-38
lines changed

Changelog.txt

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
1.1.3:
22
- Fixed display bug, thanks to discord user @karolofgutovo for reporting
33
- Created ponder system with 1 ponder about printing (contraption ponder coming soon)
4-
- (Technical) Created datagen
4+
- (Technical) Created datagen
5+
1.1.4:
6+
- Fixed a bug with deployers placing at the wrong offsets
7+
- Created bulk apply system to reduce pain of having to put a schematic on each individual deployer

common/build.gradle

-1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,5 @@ sourceSets.main {
4848
resources { // include generated resources in resources
4949
srcDir("src/generated/resources")
5050
exclude(".cache/**")
51-
exclude("assets/create/**")
5251
}
5352
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// 1.20.1 2024-08-02T18:23:47.1883203 Create: Pattern Schematics/Registrate Provider for create_pattern_schematics [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)]
1+
// 1.20.1 2024-08-03T11:14:26.6944428 Create: Pattern Schematics/Registrate Provider for create_pattern_schematics [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)]
22
ef2d06ece9923cc75b5e3dc3070df2808f1cdb74 assets\create_pattern_schematics\models\item\pattern_schematic.json
3-
9ad4b95266a9c56f7ce57c88934358f2c2e4de96 assets\create_pattern_schematics\lang\en_us.json
4-
52ad853ba880d0ee6276b86c52c2307abc8ee35e assets\create_pattern_schematics\lang\en_ud.json
3+
f7107be3778ab449ccffc8ced9d7a10a266a157b assets\create_pattern_schematics\lang\en_us.json
4+
6f95b3f285b0f5f9cd97a1f1636be1310db6950d assets\create_pattern_schematics\lang\en_ud.json
55
19e25b53bb643c63106b1f83e2f1fe5a6ac63f13 assets\create_pattern_schematics\models\item\empty_pattern_schematic.json

common/src/generated/resources/assets/create_pattern_schematics/lang/en_ud.json

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
{
2+
"create_pattern_schematics.contraption_application.applied_to": " oʇ ɔıʇɐɯǝɥɔs uɹǝʇʇɐd pǝıןddⱯ",
3+
"create_pattern_schematics.contraption_application.deployers": "sɹǝʎoןdǝp ",
24
"create_pattern_schematics.ponder.schematic_printing.header": "sɔıʇɐɯǝɥɔs uɹǝʇʇɐd ɥʇıʍ suɹǝʇʇɐd buıʇuıɹԀ",
35
"create_pattern_schematics.ponder.schematic_printing.text_1": "ǝɔɹnos ɐ sɐ ǝsn oʇ ɔıʇɐɯǝɥɔs ɐ ǝʌɐs ʇsɹıɟ ʇsnɯ noʎ 'sɔıʇɐɯǝɥɔs uɹǝʇʇɐd ǝsn o⟘",
46
"create_pattern_schematics.ponder.schematic_printing.text_2": "ɔıʇɐɯǝɥɔs uɹǝʇʇɐd ʎʇdɯǝ uɐ ɥʇıʍ ǝןqɐʇ ɔıʇɐɯǝɥɔs ɐ ǝsn 'uǝɥ⟘",

common/src/generated/resources/assets/create_pattern_schematics/lang/en_us.json

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
{
2+
"create_pattern_schematics.contraption_application.applied_to": "Applied pattern schematic to ",
3+
"create_pattern_schematics.contraption_application.deployers": " deployers",
24
"create_pattern_schematics.ponder.schematic_printing.header": "Printing patterns with pattern schematics",
35
"create_pattern_schematics.ponder.schematic_printing.text_1": "To use pattern schematics, you must first save a schematic to use as a source",
46
"create_pattern_schematics.ponder.schematic_printing.text_2": "Then, use a schematic table with an empty pattern schematic",

common/src/main/java/com/cak/pattern_schematics/PatternSchematicsClient.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.cak.pattern_schematics;
22

33
import com.cak.pattern_schematics.content.ponder.PatternSchematicsPonderTags;
4+
import com.cak.pattern_schematics.content.ponder.PatternSchematicsPonderIndex;
45
import com.cak.pattern_schematics.foundation.mirror.PatternSchematicHandler;
56
import com.cak.pattern_schematics.registry.PlatformPackets;
67

@@ -15,6 +16,7 @@ public static void init() {
1516

1617
public static void setup() {
1718
PatternSchematicsPonderTags.register();
19+
PatternSchematicsPonderIndex.register();
1820
}
1921

2022
}

common/src/main/java/com/cak/pattern_schematics/foundation/mirror/PatternSchematicWorld.java

-13
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525

2626
public class PatternSchematicWorld extends SchematicWorld {
2727

28-
2928
public Vec3i cloneScaleMin;
3029
public Vec3i cloneScaleMax;
3130
public Vec3i cloneOffset;
@@ -52,18 +51,6 @@ public void putExtraData(ItemStack blueprint, StructureTemplate template) {
5251
sourceBounds = template.getBoundingBox(SchematicItem.getSettings(blueprint), anchor);
5352
}
5453

55-
//TODO : Remove by release, i don't think ill need this, like ever
56-
// public boolean setCloneBlock(BlockPos pos, BlockState state, int i) {
57-
// AtomicBoolean result = new AtomicBoolean(false);
58-
// System.out.println(pos);
59-
// forEachClone(clonePos -> {
60-
// System.out.println("=>" + applyCloneToRealLoc(pos, clonePos));
61-
// if (super.setBlock(applyCloneToRealLoc(pos, clonePos), state, i))
62-
// result.set(true);
63-
// });
64-
// return result.get();
65-
// }
66-
6754
@Override
6855
public boolean addFreshEntity(Entity entityIn) {
6956
return applyToClones(clonePos -> {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.cak.pattern_schematics.foundation.mixin_accessors;
2+
3+
import com.simibubi.create.content.logistics.filter.FilterItemStack;
4+
5+
public interface MovementContextAccessor {
6+
7+
void pattern_schematics$setFilter(FilterItemStack stack);
8+
9+
}
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,133 @@
11
package com.cak.pattern_schematics.mixin;
22

3+
import com.cak.pattern_schematics.foundation.mixin_accessors.MovementContextAccessor;
4+
import com.cak.pattern_schematics.registry.PatternSchematicsRegistry;
35
import com.simibubi.create.AllBlocks;
46
import com.simibubi.create.Create;
57
import com.simibubi.create.content.contraptions.AbstractContraptionEntity;
68
import com.simibubi.create.content.contraptions.Contraption;
79
import com.simibubi.create.content.contraptions.behaviour.MovementContext;
10+
import com.simibubi.create.content.kinetics.deployer.DeployerBlock;
11+
import com.simibubi.create.content.logistics.filter.FilterItemStack;
12+
import net.minecraft.client.gui.screens.Screen;
813
import net.minecraft.core.BlockPos;
914
import net.minecraft.core.Direction;
15+
import net.minecraft.nbt.CompoundTag;
16+
import net.minecraft.network.chat.Component;
1017
import net.minecraft.world.InteractionHand;
1118
import net.minecraft.world.entity.player.Player;
19+
import net.minecraft.world.item.ItemStack;
20+
import net.minecraft.world.level.block.Block;
1221
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
22+
import org.apache.commons.lang3.tuple.MutablePair;
1323
import org.apache.commons.lang3.tuple.Pair;
1424
import org.spongepowered.asm.mixin.Mixin;
1525
import org.spongepowered.asm.mixin.Shadow;
26+
import org.spongepowered.asm.mixin.Unique;
1627
import org.spongepowered.asm.mixin.injection.At;
1728
import org.spongepowered.asm.mixin.injection.Inject;
1829
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
1930

31+
import java.awt.*;
32+
import java.util.Arrays;
33+
import java.util.HashMap;
34+
import java.util.HashSet;
35+
import java.util.Set;
36+
import java.util.stream.Collectors;
37+
2038
/**
2139
* Adding interaction for applying schematics onto deployers that are in assembled schematics
22-
* */
40+
*/
2341
@Mixin(value = AbstractContraptionEntity.class, remap = false)
2442
public class AbstractContraptionEntityMixin {
2543

26-
// @Shadow protected Contraption contraption;
27-
//
28-
// @Inject(method = "handlePlayerInteraction", at = @At("HEAD"), cancellable = true)
29-
// public void handlePlayerInteraction(
30-
// Player player, BlockPos localPos, Direction side,
31-
// InteractionHand interactionHand, CallbackInfoReturnable<Boolean> cir
32-
// ) {
33-
// Pair<StructureTemplate.StructureBlockInfo, MovementContext> actor = contraption.getActorAt(localPos);
34-
// if (actor != null && actor.getLeft().state().is(AllBlocks.DEPLOYER.get())) {
35-
// Create.LOGGER.info("Found deployer");
36-
// cir.setReturnValue(true);
37-
// }
38-
// }
44+
@Shadow
45+
protected Contraption contraption;
46+
47+
@Inject(method = "handlePlayerInteraction", at = @At("HEAD"), cancellable = true)
48+
public void handlePlayerInteraction(
49+
Player player, BlockPos localPos, Direction side,
50+
InteractionHand interactionHand, CallbackInfoReturnable<Boolean> cir
51+
) {
52+
if (player.level().isClientSide || !player.isShiftKeyDown() || !player.getItemInHand(interactionHand).is(PatternSchematicsRegistry.PATTERN_SCHEMATIC.get()))
53+
return;
54+
55+
Pair<StructureTemplate.StructureBlockInfo, MovementContext> actor = contraption.getActorAt(localPos);
56+
57+
if (actor == null || !actor.getLeft().state().is(AllBlocks.DEPLOYER.get()))
58+
return;
59+
60+
int appliedCount = pattern_schematics$performBulkSchematicApply(actor.getLeft().state().getValue(DeployerBlock.FACING), actor.getRight().localPos, player.getItemInHand(interactionHand));
61+
62+
player.displayClientMessage(
63+
Component.translatable("create_pattern_schematics.contraption_application.applied_to")
64+
.append(Component.literal(String.valueOf(appliedCount)))
65+
.append(Component.translatable("create_pattern_schematics.contraption_application.deployers")),
66+
true
67+
);
68+
69+
cir.setReturnValue(true);
70+
}
71+
72+
@Unique
73+
private int pattern_schematics$performBulkSchematicApply(Direction facingDirection, BlockPos localPos, ItemStack item) {
74+
Set<MovementContext> deployerActors = pattern_schematics$collectDeployerSurface(facingDirection, localPos);
75+
76+
FilterItemStack newFilter = FilterItemStack.of(item);
77+
CompoundTag newFilterTag = newFilter.serializeNBT();
78+
79+
for (MovementContext context : deployerActors) {
80+
context.blockEntityData.put("Filter", newFilterTag.copy());
81+
((MovementContextAccessor) context).pattern_schematics$setFilter(newFilter);
82+
}
83+
return deployerActors.size();
84+
}
85+
86+
@Unique
87+
private Set<MovementContext> pattern_schematics$collectDeployerSurface(Direction facingDirection, BlockPos localPos) {
88+
Set<MovementContext> allDeployers = contraption.getActors().stream()
89+
.filter(actor ->
90+
actor.getLeft().state().is(AllBlocks.DEPLOYER.get())
91+
&& actor.getLeft().state().getValue(DeployerBlock.FACING) == facingDirection
92+
)
93+
.map(MutablePair::getRight).collect(Collectors.toSet());
94+
95+
return pattern_schematics$getConnectedDeployers(facingDirection, localPos, allDeployers);
96+
}
97+
98+
@Unique
99+
private Set<MovementContext> pattern_schematics$getConnectedDeployers(
100+
Direction facingDirection, BlockPos localPos, Set<MovementContext> allDeployers
101+
) {
102+
HashMap<BlockPos, MovementContext> deployerPositions = new HashMap<>();
103+
allDeployers.forEach(context -> deployerPositions.put(context.localPos, context));
104+
105+
Set<BlockPos> frontier = new HashSet<>();
106+
pattern_schematics$searchForConnected(pattern_schematics$getSearchDirections(facingDirection), localPos, deployerPositions, frontier);
107+
108+
// Create.LOGGER.info("Found {} connected deployers", frontier.size());
109+
110+
Set<MovementContext> validDeployers = new HashSet<>();
111+
for (BlockPos pos : frontier) {
112+
validDeployers.add(deployerPositions.get(pos));
113+
}
114+
return validDeployers;
115+
}
116+
117+
@Unique
118+
private void pattern_schematics$searchForConnected(Set<Direction> directions, BlockPos currentPos, HashMap<BlockPos, MovementContext> deployerPositions, Set<BlockPos> frontier) {
119+
if (frontier.contains(currentPos) || !deployerPositions.containsKey(currentPos) || frontier.size() > 512) return;
120+
121+
//This block is a deployer
122+
frontier.add(currentPos);
123+
for (Direction direction : directions) {
124+
pattern_schematics$searchForConnected(directions, currentPos.offset(direction.getNormal()), deployerPositions, frontier);
125+
}
126+
}
127+
128+
@Unique
129+
private Set<Direction> pattern_schematics$getSearchDirections(Direction facingDirection) {
130+
return Arrays.stream(Direction.values()).filter(direction -> direction.getAxis() != facingDirection.getAxis()).collect(Collectors.toSet());
131+
}
39132

40133
}

common/src/main/java/com/cak/pattern_schematics/mixin/DeployerMovementBehaviorMixin.java

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public BlockState getBlockState(SchematicWorld instance, BlockPos globalPos) {
5555
public BlockPos pattern_Schematics$getSourceOfLocal(BlockPos position, PatternSchematicWorld patternSchematicWorld) {
5656
position = position.subtract(patternSchematicWorld.anchor);
5757
BoundingBox box = patternSchematicWorld.getBounds();
58+
position = position.subtract(new Vec3i(box.minX(), box.minY(), box.minZ()));
5859
return new BlockPos(
5960
pattern_Schematics$repeatingBounds(position.getX(), box.minX(), box.maxX()),
6061
pattern_Schematics$repeatingBounds(position.getY(), box.minY(), box.maxY()),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.cak.pattern_schematics.mixin;
2+
3+
import com.cak.pattern_schematics.foundation.mixin_accessors.MovementContextAccessor;
4+
import com.simibubi.create.content.contraptions.behaviour.MovementContext;
5+
import com.simibubi.create.content.logistics.filter.FilterItemStack;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.Shadow;
8+
9+
@Mixin(MovementContext.class)
10+
public class MovementContextMixin implements MovementContextAccessor {
11+
12+
@Shadow private FilterItemStack filter;
13+
14+
@Override
15+
public void pattern_schematics$setFilter(FilterItemStack stack) {
16+
filter = stack;
17+
}
18+
19+
}

common/src/main/java/com/cak/pattern_schematics/registry/PatternSchematicsLang.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ public static void register() {
1414
"create_pattern_schematics.schematic.tool.clone.description.1", "Point at the Schematic and [CTRL]-Scroll to repeat it.",
1515
"create_pattern_schematics.schematic.tool.clone.description.2", "",
1616
"create_pattern_schematics.schematic.tool.clone.description.3", "",
17-
"create_pattern_schematics.ponder.schematic_printing.header", "Printing with pattern schematics"
17+
"create_pattern_schematics.ponder.schematic_printing.header", "Printing with pattern schematics",
18+
"create_pattern_schematics.contraption_application.applied_to", "Applied pattern schematic to ",
19+
"create_pattern_schematics.contraption_application.deployers", " deployer(s)"
1820
);
1921
}
2022

common/src/main/resources/pattern_schematics.common.mixins.json

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"CreateClientMixin",
1111
"DeployBaseMixin",
1212
"DeployerMovementBehaviorMixin",
13+
"MovementContextMixin",
1314
"SchematicInstancesMixin",
1415
"SchematicItemMixin",
1516
"SchematicPrinterMixin",

fabric/build.gradle

+3-3
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ dependencies {
6262
modImplementation("com.simibubi.create:create-fabric-${minecraft_version}:${create_fabric_version}")
6363

6464
// Development QOL
65-
modLocalRuntime("maven.modrinth:lazydfu:${lazydfu_version}")
66-
modLocalRuntime("com.terraformersmc:modmenu:${modmenu_version}")
65+
// modLocalRuntime("maven.modrinth:lazydfu:${lazydfu_version}")
66+
// modLocalRuntime("com.terraformersmc:modmenu:${modmenu_version}")
6767

6868
// Recipe Viewers - Create Fabric supports JEI, REI, and EMI.
6969
// See root gradle.properties to choose which to use at runtime.
@@ -85,7 +85,7 @@ dependencies {
8585
processResources {
8686
// set up properties for filling into metadata
8787
Map<String, String> properties = Map.of(
88-
"version", version,
88+
"version", mod_version,
8989
"fabric_loader_version", fabric_loader_version,
9090
"fabric_api_version", fabric_api_version,
9191
"minecraft_version", minecraft_version,

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ org.gradle.jvmargs = -Xmx2G
22

33
# Mod Info
44
archives_base_name = pattern_schematics
5-
mod_version = 1.1.3
5+
mod_version = 1.1.4
66
maven_group = com.cak.pattern_schematics
77

88
minecraft_version = 1.20.1

settings.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ include("common")
1212
include("fabric")
1313
include("forge")
1414

15-
rootProject.name = "create-multiloader-addon-tempate"
15+
rootProject.name = "pattern_schematics"

0 commit comments

Comments
 (0)