Skip to content

Commit

Permalink
Add: a config replace boat and minecart as auto banish version when p…
Browse files Browse the repository at this point in the history
…lacing, a config disable thrown egg create little chickens.

Improve: raw json holo sing support multilines edit,char type behavior of common holo sign screen, color select widget of holo sign screens.
Bump version to 1.4.34.

Took 3 hours 47 minutes
  • Loading branch information
xkball committed Nov 25, 2024
1 parent f8e78de commit dac1735
Show file tree
Hide file tree
Showing 18 changed files with 462 additions and 180 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ mod_name=Power Tool
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
mod_license=GPL-3.0
# The mod version. See https://semver.org/
mod_version=1.4.33
mod_version=1.4.34
# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
# This should match the base package used for the mod sources.
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html
Expand Down
10 changes: 7 additions & 3 deletions src/main/java/org/teacon/powertool/PowerToolConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,17 @@ public class PowerToolConfig {
public static ModConfigSpec.ConfigValue<String> motdContent;

public static ModConfigSpec.ConfigValue<Boolean> disableTeleportToEnd;

public static ModConfigSpec.ConfigValue<Boolean> vehicleAutoVanish;

public static ModConfigSpec.ConfigValue<Boolean> noLittleChicken;

public static void init(ModContainer container) {
var builder = new ModConfigSpec.Builder();
motdContent = builder
.comment("Message-of-the-day content.")
.define("motd","");
motdContent = builder.comment("Message-of-the-day content.").define("motd","");
disableTeleportToEnd = builder.comment("Disable the access of the End.").define("disableTeleportToEnd", true);
vehicleAutoVanish = builder.comment("Replace boat and minecart as auto banish version when placing.(Not include chest boat.)").define("vehicleAutoVanish", true);
noLittleChicken = builder.comment("Disable thrown egg create little chickens.").define("noLittleChicken", true);
container.registerConfig(ModConfig.Type.SERVER, builder.build());
}

Expand Down
27 changes: 26 additions & 1 deletion src/main/java/org/teacon/powertool/PowerToolEvents.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,26 @@
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.animal.Chicken;
import net.minecraft.world.entity.vehicle.Boat;
import net.minecraft.world.entity.vehicle.ChestBoat;
import net.minecraft.world.entity.vehicle.Minecart;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.chunk.LevelChunk;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.event.entity.EntityJoinLevelEvent;
import net.neoforged.neoforge.event.entity.EntityTravelToDimensionEvent;
import net.neoforged.neoforge.event.entity.player.PlayerEvent;
import net.neoforged.neoforge.event.level.BlockEvent;
import net.neoforged.neoforge.event.level.ChunkWatchEvent;
import net.neoforged.neoforge.event.level.ExplosionEvent;
import net.neoforged.neoforge.network.PacketDistributor;
import org.teacon.powertool.attachment.PowerToolAttachments;
import org.teacon.powertool.entity.AutoVanishBoat;
import org.teacon.powertool.entity.AutoVanishMinecart;
import org.teacon.powertool.network.client.UpdateDisplayChunkDataPacket;
import org.teacon.powertool.utils.DelayServerExecutor;

import javax.annotation.Nullable;
import java.util.ArrayList;
Expand Down Expand Up @@ -136,4 +143,22 @@ public static void onChangeDimension(EntityTravelToDimensionEvent event) {
event.setCanceled(true);
}
}

@SubscribeEvent
public static void onAddEntity(EntityJoinLevelEvent event){
var entity = event.getEntity();
var level = event.getLevel();
if(PowerToolConfig.vehicleAutoVanish.get()){
if(entity instanceof Boat boat && !(entity instanceof ChestBoat) &&!(entity instanceof AutoVanishBoat)){
var newBoat = AutoVanishBoat.fromBoat(boat);
DelayServerExecutor.addTask(2,(server) -> level.addFreshEntity(newBoat));
event.setCanceled(true);
}
if(entity instanceof Minecart minecart && !(entity instanceof AutoVanishMinecart)){
var newMinecart = AutoVanishMinecart.fromMinecart(minecart);
DelayServerExecutor.addTask(2,(server) -> level.addFreshEntity(newMinecart));
event.setCanceled(true);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,55 +15,100 @@
import org.teacon.powertool.block.PowerToolBlocks;

import javax.annotation.ParametersAreNonnullByDefault;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;

@ParametersAreNonnullByDefault
public class RawJsonHolographicSignBlockEntity extends BaseHolographicSignBlockEntity{

public String content = "";
public List<String> content = new ArrayList<>();

public Component forFilter = Component.empty();
public Component forRender = Component.empty();
public List<Component> forFilter = new ArrayList<>();
public List<Component> forRender = new ArrayList<>();

public RawJsonHolographicSignBlockEntity( BlockPos pPos, BlockState pBlockState) {
super(PowerToolBlocks.RAW_JSON_HOLOGRAPHIC_SIGN_BLOCK_ENTITY.get(), pPos, pBlockState);
}

@Override
public void writeTo(CompoundTag tag, HolderLookup.Provider registries) {
tag.putString("content",content);
tag.putString("forRender",Component.Serializer.toJson(forRender,registries));
tag.putInt("contentSize",content.size());
for(int i = 0; i<content.size(); i++){
tag.putString("content_"+i,content.get(i));
}
tag.putInt("forRenderSize",forRender.size());
for(int i = 0; i<forRender.size(); i++){
tag.putString("forRender_"+i,Component.Serializer.toJson(forRender.get(i),registries));
}
super.writeTo(tag, registries);
}

@Override
public void readFrom(CompoundTag tag, HolderLookup.Provider registries) {
content = tag.getString("content");
forRender = Component.Serializer.fromJson(tag.getString("forRender"),registries);
var contentSize = tag.contains("contentSize") ? tag.getInt("contentSize") : 0;
content.clear();
for(int i = 0; i < contentSize; i++){
content.add(tag.getString("content_"+i));
}

var forRenderSize = tag.contains("forRenderSize") ? tag.getInt("forRenderSize") : 0;
forRender.clear();
for(var i = 0; i<forRenderSize; i++){
forRender.add(Component.Serializer.fromJson(tag.getString("forRender_"+i),registries));
}

forFilter.clear();
try {
forFilter = ParserUtils.parseJson(registries,new StringReader(content), ComponentSerialization.CODEC);
for(var ct : content){
forFilter.add(ParserUtils.parseJson(registries,new StringReader(ct), ComponentSerialization.CODEC));
}
}catch (Exception ignore){
}
super.readFrom(tag, registries);

if(tag.contains("content") || tag.contains("forRender")){
if (tag.contains("content")) content.add(tag.getString("content"));
if (tag.contains("forRender")) forRender.add(Component.Serializer.fromJson(tag.getString("forRender"),registries));

this.setChanged();
if (level != null) {
var state = this.getBlockState();
level.sendBlockUpdated(this.getBlockPos(), state, state, Block.UPDATE_CLIENTS);
}
}
}

@Override
public void filterMessage(ServerPlayer player) {
var task = player.getTextFilter()
.processStreamMessage(forFilter.getString());
task.thenAcceptAsync(filtered -> {
if (player.isTextFilteringEnabled()) {
this.forRender = Component.literal(filtered.filteredOrEmpty()).withStyle(forFilter.getStyle());
} else {
this.forRender = forFilter;
}
try {
this.forRender = ComponentUtils.updateForEntity(player.createCommandSourceStack(),forRender,null,0);
} catch (CommandSyntaxException ignored) {}
this.forRender.clear();
var taskList = new ArrayList<CompletableFuture<?>>();
//不用processMessageBundle 因为没有处理后list size和顺序不变的保证
for(var i = 0; i<forFilter.size();i++){
var task = player.getTextFilter()
.processStreamMessage(forFilter.get(i).getString());
int finalI = i;
task.thenAccept(filtered -> {
if (player.isTextFilteringEnabled()) {
this.forRender.add(finalI,Component.literal(filtered.filteredOrEmpty()).withStyle(forFilter.get(finalI).getStyle()));
} else {
this.forRender.add(finalI,forFilter.get(finalI));
}
try {
this.forRender.add(finalI,ComponentUtils.updateForEntity(player.createCommandSourceStack(),forRender.remove(finalI),null,0));
} catch (CommandSyntaxException ignored) {}

});
taskList.add(task);

}
var finalTask = CompletableFuture.allOf(taskList.toArray(new CompletableFuture<?>[0]));
finalTask.thenAcceptAsync((_void) -> {
this.setChanged();
if (level != null) {
var state = this.getBlockState();
level.sendBlockUpdated(this.getBlockPos(), state, state, Block.UPDATE_CLIENTS);
}
}, player.server);
},player.server);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -129,12 +129,15 @@ else if(!player.getAbilities().instabuild || player.isCrouching()){
return ClientLogicHolder.tryUseAdditional(level,pos) ? InteractionResult.SUCCESS : InteractionResult.PASS;
}
else if(level.getBlockEntity(pos) instanceof RawJsonHolographicSignBlockEntity be){
var clickEvent = be.forRender.getStyle().getClickEvent();
if(clickEvent == null) return InteractionResult.PASS;
var action = clickEvent.getAction();
if(action == ClickEvent.Action.RUN_COMMAND){
VanillaUtils.runCommand(clickEvent.getValue(),player);
for(var component : be.forRender){
var clickEvent = component.getStyle().getClickEvent();
if(clickEvent == null) return InteractionResult.PASS;
var action = clickEvent.getAction();
if(action == ClickEvent.Action.RUN_COMMAND){
VanillaUtils.runCommand(clickEvent.getValue(),player);
}
}

}
}
return InteractionResult.SUCCESS;
Expand Down Expand Up @@ -196,25 +199,27 @@ public static boolean tryUseAdditional(Level level, BlockPos pos) {
return tryOpenURL(be.url);
}
if(level.isClientSide() && level.getBlockEntity(pos) instanceof RawJsonHolographicSignBlockEntity be) {
var clickEvent = be.forRender.getStyle().getClickEvent();
if(clickEvent == null) return false;
var action = clickEvent.getAction();
if(action == ClickEvent.Action.OPEN_URL) return tryOpenURL(clickEvent.getValue());
if(action == ClickEvent.Action.OPEN_FILE){
Util.getPlatform().openFile(new File(clickEvent.getValue()));
return true;
}
if(action == ClickEvent.Action.COPY_TO_CLIPBOARD){
Minecraft.getInstance().keyboardHandler.setClipboard(clickEvent.getValue());
return true;
}
//交给服务端
//if(action == ClickEvent.Action.RUN_COMMAND)
if(action == ClickEvent.Action.SUGGEST_COMMAND){
var screen = new ChatScreen("");
screen.handleComponentClicked(be.forRender.getStyle());
Minecraft.getInstance().setScreen(screen);
return true;
for(var component : be.forRender){
var clickEvent = component.getStyle().getClickEvent();
if(clickEvent == null) return false;
var action = clickEvent.getAction();
if(action == ClickEvent.Action.OPEN_URL) return tryOpenURL(clickEvent.getValue());
if(action == ClickEvent.Action.OPEN_FILE){
Util.getPlatform().openFile(new File(clickEvent.getValue()));
return true;
}
if(action == ClickEvent.Action.COPY_TO_CLIPBOARD){
Minecraft.getInstance().keyboardHandler.setClipboard(clickEvent.getValue());
return true;
}
//交给服务端
//if(action == ClickEvent.Action.RUN_COMMAND)
if(action == ClickEvent.Action.SUGGEST_COMMAND){
var screen = new ChatScreen("");
screen.handleComponentClicked(component.getStyle());
Minecraft.getInstance().setScreen(screen);
return true;
}
}
}
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.teacon.powertool.block.holo_sign.SignType;
import org.teacon.powertool.client.gui.widget.ObjectInputBox;
import org.teacon.powertool.network.server.UpdateBlockEntityData;
import org.teacon.powertool.utils.VanillaUtils;

import java.util.Optional;
import java.util.function.Supplier;
Expand All @@ -30,7 +31,7 @@ public class BaseHolographicSignEditingScreen<T extends BaseHolographicSignBlock
protected final T sign;

protected float scale;
protected int colorInARGB; // White by default
protected int colorInARGB = 0xffffffff; // White by default
protected BaseHolographicSignBlockEntity.Align textAlign;
protected BaseHolographicSignBlockEntity.Shadow shadowType;
protected BaseHolographicSignBlockEntity.LayerArrange layerArrange;
Expand Down Expand Up @@ -69,12 +70,16 @@ public BaseHolographicSignEditingScreen(Component title,T theSign) {
this.bidirectional = theSign.bidirectional;
this.sign = theSign;
}

public int getDoneButtonY(){
return this.height / 4 + 120;
}

@Override
protected void init() {

this.addRenderableWidget(new Button.Builder(CommonComponents.GUI_DONE, btn -> this.onDone())
.pos(this.width / 2 - 100, this.height / 4 + 120)
.pos(this.width / 2 - 100, getDoneButtonY())
.size(200, 20).build());

int innerPadding = width / 100;
Expand Down Expand Up @@ -115,11 +120,10 @@ protected void init() {
.createNarration(displayed -> Component.translatable("powertool.gui.holographic_sign.narration.shadow", displayed.get()))
.build();

if(colorInARGB < 0) colorInARGB = 0xffffff;
this.colorInput = new ObjectInputBox<>(font, 200 + innerPadding * 2, 0, 50, 20, Component.empty(),ObjectInputBox.RGB_COLOR_VALIDATOR,ObjectInputBox.RGB_COLOR_RESPONDER);
this.colorInput.setValue(Integer.toHexString(this.colorInARGB).toUpperCase());
this.colorInput.setValue(VanillaUtils.hexColorFromInt(colorInARGB));
this.colorInput.setFocused(false);
this.colorInput.setMaxLength(6);
this.colorInput.setMaxLength(8);
this.colorInput.setCanLoseFocus(true);

this.zOffsetToggle = new Button.Builder(this.layerArrange.displayName, btn -> {
Expand Down Expand Up @@ -253,7 +257,8 @@ protected void onDone() {
@Override
public boolean charTyped(char pCodePoint, int pModifiers) {
if (this.colorInput.charTyped(pCodePoint, pModifiers)) return true;
return this.rotationInput.charTyped(pCodePoint, pModifiers);
if (this.rotationInput.charTyped(pCodePoint, pModifiers)) return true;
return super.charTyped(pCodePoint, pModifiers);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,14 +75,14 @@ public void tick() {

@Override
public boolean charTyped(char pCodePoint, int pModifiers) {
if(super.charTyped(pCodePoint, pModifiers)) return true;
this.signField.charTyped(pCodePoint);
return true;
if (this.colorInput.charTyped(pCodePoint, pModifiers)) return true;
if (this.rotationInput.charTyped(pCodePoint, pModifiers)) return true;
if(!colorInput.isFocused() && !rotationInput.isFocused() && this.signField.charTyped(pCodePoint)) return true;
return super.charTyped(pCodePoint, pModifiers);
}

@Override
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
if(super.keyPressed(keyCode, scanCode, modifiers)) return true;
if (keyCode == GLFW.GLFW_KEY_UP) {
// Move up one line
this.line = (this.line - 1) % this.messages.length;
Expand All @@ -101,7 +101,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
return true;
} else {
// Regular typing
return this.signField.keyPressed(keyCode) || super.keyPressed(keyCode, scanCode, modifiers);
return (!colorInput.isFocused() && !rotationInput.isFocused() && this.signField.keyPressed(keyCode)) || super.keyPressed(keyCode, scanCode, modifiers);
}
}

Expand Down
Loading

0 comments on commit dac1735

Please sign in to comment.