Clickable signs based on lines

Tireyy

New Member
I am working on a system that when a player place a sign in creative and puts on line 0 [BH] and on line 2 <Worldname> and clicks on it then it formats automaticly and when a player click again it will teleport the player to the world on line 2

I tried using this


Code:
package com.svenkoggel.bhbedrock;

import cn.nukkit.event.EventHandler;
import cn.nukkit.event.Listener;
import cn.nukkit.event.player.PlayerInteractEvent;
import cn.nukkit.event.block.BlockPlaceEvent;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockID;
import cn.nukkit.block.BlockSign;  // Importeer BlockSign
import cn.nukkit.utils.TextFormat;
import cn.nukkit.Player;
import cn.nukkit.level.Level;

public class JoinSigns implements Listener {

    private final Main plugin;

    public JoinSigns(Main plugin) {
        this.plugin = plugin;
    }

    // Detecteer wanneer een speler een bord plaatst
    @EventHandler
    public void onSignPlace(BlockPlaceEvent event) {
        Block block = event.getBlock();

        // Zorg ervoor dat het een bord is
        if (block.getId() == BlockID.SIGN_POST || block.getId() == BlockID.WALL_SIGN) {
            BlockSign sign = (BlockSign) block;  // Cast naar BlockSign
            String[] lines = sign.getLines();  // Verkrijg de lijnen van het bord

            // Controleer of de eerste regel [BH] is
            if (lines[0] != null && lines[0].equalsIgnoreCase("[BH]") && lines[1] != null && !lines[1].isEmpty()) {
                String mapName = lines[1];  // Naam van de wereld uit regel 2
                setSignLines(sign, mapName);   // Stel de lijnen van het bord in
            }
        }
    }

    // Detecteer wanneer een speler op een bord klikt
    @EventHandler
    public void onSignClick(PlayerInteractEvent event) {
        if (event.getAction().equals(PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK)) {  // Rechtermuisklik
            Player player = event.getPlayer();
            Block block = event.getBlock();

            // Check of de speler interact met een bord
            if (block.getId() == BlockID.SIGN_POST || block.getId() == BlockID.WALL_SIGN) {
                BlockSign sign = (BlockSign) block;  // Cast naar BlockSign
                String[] lines = sign.getLines();  // Verkrijg de lijnen van het bord

                // Controleer of de lijnen niet null zijn en of de eerste regel "Join" is
                if (lines != null && lines[0] != null && lines[0].equalsIgnoreCase("Join") && lines[2] != null && lines[2].contains("<")) {
                    String mapName = lines[2].replace("<", "").replace(">", "");  // Haal mapnaam uit de sign

                    // Controleer of de wereld bestaat
                    Level level = player.getServer().getLevelByName(mapName);
                    if (level != null) {
                        // Teleporteer de speler naar de wereld
                        player.teleport(level.getSpawnLocation());
                        player.sendMessage(TextFormat.GREEN + "You have been teleported to the world: " + mapName);
                    } else {
                        // Als de wereld niet bestaat
                        player.sendMessage(TextFormat.RED + "This game is unloaded.");
                    }
                } else {
                    player.sendMessage(TextFormat.RED + "Invalid sign format.");
                }
            }
        }
    }

I also tried BlockState and Sign instead of BlockSign but it gives me this error everytime


Description    Resource    Path    Location    Type
BlockSign cannot be resolved to a type    JoinSigns.java    /BountyHunterBedrock/src/main/java/com/svenkoggel/bhbedrock    line 29    Java Problem
BlockSign cannot be resolved to a type    JoinSigns.java    /BountyHunterBedrock/src/main/java/com/svenkoggel/bhbedrock    line 29    Java Problem
BlockSign cannot be resolved to a type    JoinSigns.java    /BountyHunterBedrock/src/main/java/com/svenkoggel/bhbedrock    line 49    Java Problem
BlockSign cannot be resolved to a type    JoinSigns.java    /BountyHunterBedrock/src/main/java/com/svenkoggel/bhbedrock    line 49    Java Problem
BlockSign cannot be resolved to a type    JoinSigns.java    /BountyHunterBedrock/src/main/java/com/svenkoggel/bhbedrock    line 74    Java Problem
The import cn.nukkit.block.BlockSign cannot be resolved    JoinSigns.java    /BountyHunterBedrock/src/main/java/com/svenkoggel/bhbedrock    line 9    Java Problem



    // Methode om de lijnen van een bord in te stellen
    private void setSignLines(BlockSign sign, String mapName) {
        sign.setLine(0, TextFormat.GREEN + "Join");
        sign.setLine(1, TextFormat.DARK_BLUE + " ");
        sign.setLine(2, TextFormat.DARK_BLUE + "<" + mapName + ">");  // Gebruik de mapnaam in de derde lijn
        sign.setLine(3, TextFormat.GREEN + " ");
        sign.update();  // Werk het bord bij
    }
}
 

PetteriM1

Moderator
Staff member
BlockEntity be = block.getLevel().getBlockEntity(block)
if (be instanceof BlockEntitySign)
((BlockEntitySign) be).getText()
 
Top