Fix sign editing (#423)
This commit is contained in:
parent
8acc90b89c
commit
1d50a98b14
@ -9,7 +9,6 @@ import io.izzel.arclight.common.bridge.core.network.play.TimestampedPacket;
|
|||||||
import io.izzel.arclight.common.bridge.core.server.MinecraftServerBridge;
|
import io.izzel.arclight.common.bridge.core.server.MinecraftServerBridge;
|
||||||
import io.izzel.arclight.common.bridge.core.server.management.PlayerInteractionManagerBridge;
|
import io.izzel.arclight.common.bridge.core.server.management.PlayerInteractionManagerBridge;
|
||||||
import io.izzel.arclight.common.bridge.core.server.management.PlayerListBridge;
|
import io.izzel.arclight.common.bridge.core.server.management.PlayerListBridge;
|
||||||
import io.izzel.arclight.common.bridge.core.tileentity.SignTileEntityBridge;
|
|
||||||
import io.izzel.arclight.common.mod.ArclightConstants;
|
import io.izzel.arclight.common.mod.ArclightConstants;
|
||||||
import io.izzel.arclight.common.mod.util.ArclightCaptures;
|
import io.izzel.arclight.common.mod.util.ArclightCaptures;
|
||||||
import io.netty.util.concurrent.Future;
|
import io.netty.util.concurrent.Future;
|
||||||
@ -64,6 +63,7 @@ import net.minecraft.world.level.LevelReader;
|
|||||||
import net.minecraft.world.level.block.Blocks;
|
import net.minecraft.world.level.block.Blocks;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
import net.minecraft.world.level.block.entity.SignBlockEntity;
|
import net.minecraft.world.level.block.entity.SignBlockEntity;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.phys.AABB;
|
import net.minecraft.world.phys.AABB;
|
||||||
import net.minecraft.world.phys.BlockHitResult;
|
import net.minecraft.world.phys.BlockHitResult;
|
||||||
import net.minecraft.world.phys.HitResult;
|
import net.minecraft.world.phys.HitResult;
|
||||||
@ -75,7 +75,6 @@ import org.bukkit.Bukkit;
|
|||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.craftbukkit.v.CraftServer;
|
import org.bukkit.craftbukkit.v.CraftServer;
|
||||||
import org.bukkit.craftbukkit.v.block.CraftBlock;
|
|
||||||
import org.bukkit.craftbukkit.v.block.CraftSign;
|
import org.bukkit.craftbukkit.v.block.CraftSign;
|
||||||
import org.bukkit.craftbukkit.v.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v.entity.CraftPlayer;
|
||||||
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
|
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
|
||||||
@ -129,7 +128,6 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
|||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
@ -1642,47 +1640,58 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "updateSignText", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;resetLastActionTime()V"))
|
/**
|
||||||
private void arclight$noSignEdit(ServerboundSignUpdatePacket p_244542_1_, List<String> p_244542_2_, CallbackInfo ci) {
|
* @author IzzelAliz
|
||||||
|
* @reason
|
||||||
|
*/
|
||||||
|
@Overwrite
|
||||||
|
private void updateSignText(ServerboundSignUpdatePacket packet, List<TextFilter.FilteredText> list) {
|
||||||
if (((ServerPlayerEntityBridge) player).bridge$isMovementBlocked()) {
|
if (((ServerPlayerEntityBridge) player).bridge$isMovementBlocked()) {
|
||||||
ci.cancel();
|
return;
|
||||||
}
|
}
|
||||||
}
|
this.player.resetLastActionTime();
|
||||||
|
ServerLevel serverlevel = this.player.getLevel();
|
||||||
private Component[] arclight$lines;
|
BlockPos blockpos = packet.getPos();
|
||||||
|
if (serverlevel.hasChunkAt(blockpos)) {
|
||||||
@Inject(method = "updateSignText", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/entity/SignBlockEntity;isEditable()Z"))
|
BlockState blockstate = serverlevel.getBlockState(blockpos);
|
||||||
public void arclight$onSignChangePre(ServerboundSignUpdatePacket p_244542_1_, List<String> p_244542_2_, CallbackInfo ci) {
|
BlockEntity blockentity = serverlevel.getBlockEntity(blockpos);
|
||||||
String[] lines = p_244542_2_.toArray(new String[0]);
|
if (!(blockentity instanceof SignBlockEntity signblockentity)) {
|
||||||
Player player = getCraftPlayer();
|
return;
|
||||||
CraftBlock block = CraftBlock.at(this.player.level, p_244542_1_.getPos());
|
|
||||||
String[] bukkitLines = new String[lines.length];
|
|
||||||
for (int i = 0; i < lines.length; i++) {
|
|
||||||
bukkitLines[i] = ChatFormatting.stripFormatting(
|
|
||||||
new TextComponent(
|
|
||||||
Objects.requireNonNull(
|
|
||||||
ChatFormatting.stripFormatting(lines[i])
|
|
||||||
)
|
|
||||||
).getString()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
SignChangeEvent event = new SignChangeEvent(block, player, bukkitLines);
|
|
||||||
Bukkit.getPluginManager().callEvent(event);
|
|
||||||
if (!event.isCancelled()) {
|
|
||||||
for (int i = 0; i < lines.length; i++) {
|
|
||||||
arclight$lines = CraftSign.sanitizeLines(event.getLines());
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Redirect(method = "updateSignText", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/entity/SignBlockEntity;setMessage(ILnet/minecraft/network/chat/Component;)V"))
|
if (!signblockentity.isEditable() || !this.player.getUUID().equals(signblockentity.getPlayerWhoMayEdit())) {
|
||||||
public void arclight$onSignChangePost(SignBlockEntity signTileEntity, int line, Component signText) {
|
LOGGER.warn("Player {} just tried to change non-editable sign", this.player.getName().getString());
|
||||||
if (arclight$lines != null) {
|
this.send(blockentity.getUpdatePacket());
|
||||||
signTileEntity.setMessage(line, arclight$lines[line]);
|
return;
|
||||||
if (line == arclight$lines.length - 1) {
|
|
||||||
arclight$lines = null;
|
|
||||||
((SignTileEntityBridge) signTileEntity).bridge$setEditable(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Player player = ((ServerPlayerEntityBridge) this.player).bridge$getBukkitEntity();
|
||||||
|
int x = packet.getPos().getX();
|
||||||
|
int y = packet.getPos().getY();
|
||||||
|
int z = packet.getPos().getZ();
|
||||||
|
String[] lines = new String[4];
|
||||||
|
|
||||||
|
for (int i = 0; i < list.size(); ++i) {
|
||||||
|
TextFilter.FilteredText text = list.get(i);
|
||||||
|
|
||||||
|
if (this.player.isTextFilteringEnabled()) {
|
||||||
|
lines[i] = ChatFormatting.stripFormatting(new TextComponent(ChatFormatting.stripFormatting(text.getFiltered())).getString());
|
||||||
|
} else {
|
||||||
|
lines[i] = ChatFormatting.stripFormatting(new TextComponent(ChatFormatting.stripFormatting(text.getRaw())).getString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SignChangeEvent event = new SignChangeEvent(player.getWorld().getBlockAt(x, y, z), player, lines);
|
||||||
|
Bukkit.getPluginManager().callEvent(event);
|
||||||
|
if (!event.isCancelled()) {
|
||||||
|
Component[] components = CraftSign.sanitizeLines(event.getLines());
|
||||||
|
for (int i = 0; i < components.length; i++) {
|
||||||
|
signblockentity.setMessage(i, components[i]);
|
||||||
|
}
|
||||||
|
signblockentity.isEditable = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
signblockentity.setChanged();
|
||||||
|
serverlevel.sendBlockUpdated(blockpos, blockstate, blockstate, 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user