use of com.cleanroommc.multiblocked.api.pattern.JsonBlockPattern in project Multiblocked by CleanroomMC.
the class TemplateBuilderWidget method onSelected.
@SideOnly(Side.CLIENT)
public void onSelected(ItemStack itemStack, int slot) {
if (this.selected != itemStack) {
this.selected = itemStack;
this.selectedSlot = slot;
if (selected != null && isRemote()) {
this.pos = null;
this.facing = null;
templateButton.setVisible(true);
if (ItemBlueprint.isRaw(itemStack)) {
BlockPos[] poses = ItemBlueprint.getPos(itemStack);
World world = table.getWorld();
sceneWidget.createScene(world);
if (poses != null && world.isAreaLoaded(poses[0], poses[1])) {
Set<BlockPos> rendered = new HashSet<>();
for (int x = poses[0].getX(); x <= poses[1].getX(); x++) {
for (int y = poses[0].getY(); y <= poses[1].getY(); y++) {
for (int z = poses[0].getZ(); z <= poses[1].getZ(); z++) {
if (!world.isAirBlock(new BlockPos(x, y, z))) {
rendered.add(new BlockPos(x, y, z));
}
}
}
}
sceneWidget.setRenderedCore(rendered, null);
}
} else if (itemStack.getSubCompound("pattern") != null) {
String json = itemStack.getSubCompound("pattern").getString("json");
JsonBlockPattern pattern = Multiblocked.GSON.fromJson(json, JsonBlockPattern.class);
int[] centerOffset = pattern.getCenterOffset();
String[][] patternString = pattern.pattern;
Set<BlockPos> rendered = new HashSet<>();
TrackedDummyWorld world = new TrackedDummyWorld();
sceneWidget.createScene(world);
int offset = Math.max(patternString.length, Math.max(patternString[0].length, patternString[0][0].length()));
for (int i = 0; i < patternString.length; i++) {
for (int j = 0; j < patternString[0].length; j++) {
for (int k = 0; k < patternString[0][0].length(); k++) {
char symbol = patternString[i][j].charAt(k);
BlockPos pos = pattern.getActualPosOffset(k - centerOffset[2], j - centerOffset[1], i - centerOffset[0], EnumFacing.NORTH).add(offset, offset, offset);
world.addBlock(pos, new BlockInfo(MbdComponents.DummyComponentBlock));
DummyComponentTileEntity tileEntity = (DummyComponentTileEntity) world.getTileEntity(pos);
ComponentDefinition definition = null;
assert tileEntity != null;
if (pattern.symbolMap.containsKey(symbol)) {
Set<BlockInfo> candidates = new HashSet<>();
for (String s : pattern.symbolMap.get(symbol)) {
SimplePredicate predicate = pattern.predicates.get(s);
if (predicate instanceof PredicateComponent && ((PredicateComponent) predicate).definition != null) {
definition = ((PredicateComponent) predicate).definition;
break;
} else if (predicate != null && predicate.candidates != null) {
candidates.addAll(Arrays.asList(predicate.candidates.get()));
}
}
definition = getComponentDefinition(definition, candidates);
}
if (definition != null) {
tileEntity.setDefinition(definition);
}
tileEntity.isFormed = false;
tileEntity.setWorld(world);
tileEntity.validate();
rendered.add(pos);
}
}
}
sceneWidget.setRenderedCore(rendered, null);
}
}
}
}
use of com.cleanroommc.multiblocked.api.pattern.JsonBlockPattern in project Multiblocked by CleanroomMC.
the class ControllerBuilderWidget method updateList.
protected void updateList() {
int size = files.size();
files.forEach(containers::waitToRemoved);
files.clear();
File path = new File(Multiblocked.location, "definition/controller");
if (!path.isDirectory()) {
if (!path.mkdirs()) {
return;
}
}
for (File file : Optional.ofNullable(path.listFiles((s, name) -> name.endsWith(".json"))).orElse(new File[0])) {
SelectableWidgetGroup widgetGroup = (SelectableWidgetGroup) new SelectableWidgetGroup(0, (containers.widgets.size() - size) * 22, containers.getSize().width, 20).setSelectedTexture(-2, 0xff00aa00).setOnSelected(W -> {
templateButton.setVisible(false);
selected = null;
onJsonSelected(file);
}).addWidget(new ImageWidget(0, 0, 150, 20, new ColorRectTexture(0x4faaaaaa))).addWidget(new ButtonWidget(134, 4, 12, 12, new ResourceTexture("multiblocked:textures/gui/option.png"), cd -> {
JsonElement jsonElement = FileUtility.loadJson(file);
if (jsonElement != null) {
try {
String recipeMap = jsonElement.getAsJsonObject().get("recipeMap").getAsString();
JsonBlockPattern pattern = Multiblocked.GSON.fromJson(jsonElement.getAsJsonObject().get("basePattern"), JsonBlockPattern.class);
ControllerDefinition definition = Multiblocked.GSON.fromJson(jsonElement, ControllerDefinition.class);
new ControllerWidget(this, definition, pattern, recipeMap, jsonObject -> {
if (jsonObject != null) {
FileUtility.saveJson(file, jsonObject);
}
});
} catch (Exception ignored) {
}
}
}).setHoverBorderTexture(1, -1).setHoverTooltip("multiblocked.gui.tips.settings")).addWidget(new ImageWidget(32, 0, 100, 20, new TextTexture(file.getName().replace(".json", "")).setWidth(100).setType(TextTexture.TextType.ROLL))).addWidget(new ImageWidget(4, 2, 18, 18, new ItemStackTexture(Items.PAPER)));
files.add(widgetGroup);
containers.addWidget(widgetGroup);
}
}
use of com.cleanroommc.multiblocked.api.pattern.JsonBlockPattern in project Multiblocked by CleanroomMC.
the class ControllerBuilderWidget method onJsonSelected.
@SideOnly(Side.CLIENT)
public void onJsonSelected(File file) {
JsonElement jsonElement = FileUtility.loadJson(file);
if (jsonElement != null) {
JsonBlockPattern pattern = Multiblocked.GSON.fromJson(jsonElement.getAsJsonObject().get("basePattern"), JsonBlockPattern.class);
updateScene(pattern);
}
}
use of com.cleanroommc.multiblocked.api.pattern.JsonBlockPattern in project Multiblocked by CleanroomMC.
the class ControllerScriptWidget method loadJson.
private void loadJson(ClickData clickData) {
if (selected != null && clickData.isRemote) {
JsonElement jsonElement = FileUtility.loadJson(selected);
if (jsonElement != null) {
try {
String recipeMap = jsonElement.getAsJsonObject().get("recipeMap").getAsString();
JsonBlockPattern pattern = Multiblocked.GSON.fromJson(jsonElement.getAsJsonObject().get("basePattern"), JsonBlockPattern.class);
ControllerDefinition definition = Multiblocked.GSON.fromJson(jsonElement, ControllerDefinition.class);
pattern.predicates.put("controller", new PredicateComponent(definition));
definition.basePattern = pattern.build();
for (File file : Optional.ofNullable(new File(Multiblocked.location, "recipe_map").listFiles((f, n) -> n.endsWith(".json"))).orElse(new File[0])) {
JsonObject config = (JsonObject) FileUtility.loadJson(file);
if (config != null && config.get("name").getAsString().equals(recipeMap)) {
definition.recipeMap = Multiblocked.GSON.fromJson(config, RecipeMap.class);
break;
}
}
controller.setDefinition(definition);
MbdComponents.DEFINITION_REGISTRY.put(definition.location, definition);
writeClientAction(-1, buffer -> buffer.writeString(definition.location.toString()));
} catch (Exception e) {
Multiblocked.LOGGER.error("tester: error while loading the controller json {}", selected.getName(), e);
}
textBox.setContent(Collections.singletonList(Multiblocked.GSON_PRETTY.toJson(jsonElement)));
tfGroup.computeMax();
}
}
}
use of com.cleanroommc.multiblocked.api.pattern.JsonBlockPattern in project Multiblocked by CleanroomMC.
the class ItemMultiblockBuilder method onItemUseFirst.
@Override
@Nonnull
@ParametersAreNonnullByDefault
public EnumActionResult onItemUseFirst(EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, EnumHand hand) {
if (!world.isRemote) {
TileEntity tileEntity = world.getTileEntity(pos);
ItemStack hold = player.getHeldItem(hand);
if (isItemMultiblockBuilder(hold) && tileEntity instanceof ControllerTileEntity) {
if (isRaw(hold)) {
((ControllerTileEntity) tileEntity).getPattern().autoBuild(player, new MultiblockState(world, pos));
return EnumActionResult.SUCCESS;
} else {
String json = hold.getOrCreateSubCompound("pattern").getString("json");
String controller = hold.getOrCreateSubCompound("pattern").getString("controller");
if (!json.isEmpty() && !controller.isEmpty()) {
if (controller.equals(((ControllerTileEntity) tileEntity).getDefinition().location.toString())) {
JsonBlockPattern jsonBlockPattern = Multiblocked.GSON.fromJson(json, JsonBlockPattern.class);
jsonBlockPattern.build().autoBuild(player, new MultiblockState(world, pos));
return EnumActionResult.SUCCESS;
}
}
}
}
}
return EnumActionResult.PASS;
}
Aggregations