API para programadores
A referência Java gerada permite pesquisar classes, métodos e assinaturas, com a versão e o commit do código-fonte registados para cada módulo.
Requisitos
O BetterStructures exige:
- Java 21 ou superior
- Servidor Spigot/Paper
- Plugin WorldEdit, dependência obrigatória
Dependências opcionais:
- WorldGuard para proteger regiões; a integração completa também exige EliteMobs
- EliteMobs para criar mobs de elite
- MythicMobs para integrar mobs MythicMobs
- Terralith, Iris, Terra e TerraformGenerator para compatibilidade com biomas personalizados
Repositório público
Maven
<repositories>
<repository>
<id>magmaguy-repo-releases</id>
<name>MagmaGuy's Repository</name>
<url>https://repo.magmaguy.com/releases</url>
</repository>
</repositories>
<dependency>
<groupId>com.magmaguy</groupId>
<artifactId>BetterStructures</artifactId>
<version>2.7.7</version>
<scope>provided</scope>
</dependency>
Consulte o repositório Maven para ver as versões disponíveis. O exemplo usa a versão publicada 2.7.7; o código atual está na versão 2.7.7. Escolha a versão correspondente ao plugin instalado.
Gradle
repositories {
maven {
name = "magmaguyRepoReleases"
url = uri("https://repo.magmaguy.com/releases")
}
}
dependencies {
compileOnly("com.magmaguy:BetterStructures:2.7.7")
}
Consulte o repositório Maven para ver as versões disponíveis. O exemplo usa a versão publicada 2.7.7; o código atual está na versão 2.7.7. Escolha a versão correspondente ao plugin instalado.
Eventos
Os eventos pertencem a com.magmaguy.betterstructures.api.
Importações dos pacotes
import com.magmaguy.betterstructures.api.BuildCustomMarkerEvent;
import com.magmaguy.betterstructures.api.BuildPasteCompleteEvent;
import com.magmaguy.betterstructures.api.BuildPlaceEvent;
import com.magmaguy.betterstructures.api.ChestFillEvent;
import com.magmaguy.betterstructures.api.WorldGenerationFinishEvent;
import com.magmaguy.betterstructures.buildingfitter.FitAnything;
import com.magmaguy.betterstructures.modules.ModularWorld;
import com.magmaguy.betterstructures.thirdparty.WorldGuard;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Container;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import java.util.List;
BuildPlaceEvent
É disparado antes de colocar uma construção. O objeto FitAnything disponibiliza, entre outros dados, a construção escolhida e a sua posição.
Não tente substituir a construção que vai ser colocada! Pode alterar pequenos detalhes, mas substituir a construção inteira provavelmente causa um encaixe inadequado.
Pode ser cancelado.
ChestFillEvent
É disparado ao preencher um baú. Usa o inventário do snapshot do contentor para guardar os dados a aplicar com segurança.
Pode alterar o saque com addItem() ou removeItem() de Inventory sobre o inventário obtido por getContainer().getSnapshotInventory().
getTreasureConfigFilename() identifica a configuração da tabela usada nesse baú.
Pode ser cancelado.
BuildCustomMarkerEvent
É disparado uma vez por cada placa [custom], depois de colocados os blocos, o saque, os mobs e as entidades da estrutura. O BetterStructures remove primeiro a placa, pelo que o bloco em getLocation() é ar e pode colocar lá qualquer coisa.
getId(): linhas 2 a 4 da placa unidas sem separadores, por exemploZombie_PlusgetLines(): linhas 2 a 4 individualmente, sem espaços nas extremidades, com as linhas vazias como strings vaziasgetLocation(): a localização da placa no mundogetFitAnything(): a estrutura a ser colocada, tal como emBuildPlaceEvent
NÃO pode ser cancelado.
BuildPasteCompleteEvent
É disparado quando uma estrutura normal termina de ser colocada, depois de todos os seus BuildCustomMarkerEvent. A colocação é distribuída por vários ticks, pelo que este é o momento fiável para trabalhar com a estrutura colocada. BuildPlaceEvent é disparado antes de qualquer destes passos. Se um passo de conclusão falhar, por exemplo um boss de placa que não consegue aparecer, a colocação para e este evento não é disparado.
getFitAnything(): a estrutura que foi colocadagetLowestCorner()egetHighestCorner(): os cantos de blocos do schematic colocado, em coordenadas do mundo, ambos inclusivosgetBoundingBox(): o espaço ocupado por esses blocosgetContainerLocations(): todos os baús, baús armadilhados, caixas de shulker e barris do schematic, quer o BetterStructures os tenha preenchido com saque ou não
NÃO pode ser cancelado.
WorldGenerationFinishEvent
É disparado quando uma masmorra modular gerada no seu próprio mundo (isWorldGeneration: true) termina de ser colocada. As masmorras colocadas em mundos existentes não o disparam. Disponibiliza o objeto ModularWorld com os dados do mundo gerado, incluindo posições iniciais, baús e saídas.
NÃO pode ser cancelado.
Use getModularWorld() para aceder aos dados. Consulte ModularWorld para os métodos disponíveis.
Exemplo de listener
public class MyBetterStructuresListener implements Listener {
@EventHandler
public void onBuildPlace(BuildPlaceEvent event) {
FitAnything build = event.getFitAnything();
Location location = build.getLocation();
// Custom logic here
// event.setCancelled(true); // To prevent placement
}
@EventHandler
public void onChestFill(ChestFillEvent event) {
Container container = event.getContainer();
Inventory inv = container.getSnapshotInventory();
// Modify inventory here
inv.addItem(new ItemStack(Material.DIAMOND, 1));
}
@EventHandler
public void onCustomMarker(BuildCustomMarkerEvent event) {
if (!event.getId().equals("Zombie_Plus")) return;
// Spawn your own mob at the marker
event.getLocation().getWorld().spawnEntity(event.getLocation().add(0.5, 0, 0.5), EntityType.ZOMBIE);
}
@EventHandler
public void onPasteComplete(BuildPasteCompleteEvent event) {
for (Location containerLocation : event.getContainerLocations()) {
if (!(containerLocation.getBlock().getState() instanceof Container container)) continue;
// Replace the contents with your own loot
container.getInventory().clear();
container.getInventory().addItem(new ItemStack(Material.EMERALD, 3));
}
}
@EventHandler
public void onWorldGenFinish(WorldGenerationFinishEvent event) {
ModularWorld world = event.getModularWorld();
// Access generated world data
List<Location> spawns = world.getSpawnLocations();
}
}
Classes principais
FitAnything
FitAnything é instanciada ao colocar uma construção e gere todos os aspetos dessa colocação, incluindo o preenchimento de baús e a criação de mobs.
Getters disponíveis:
getSchematicContainer(): devolve o contentor do schematicgetSchematicClipboard(): devolve o objeto Clipboard do WorldEditgetSchematicOffset(): devolve o Vector de desvio da colocaçãogetLocation(): devolve a Location da colocação
Estes métodos servem para criar proteções de regiões personalizadas ou analisar as posições das construções.
ModularWorld
ModularWorld representa um mundo modular gerado e é disponibilizada por WorldGenerationFinishEvent. Contém os dados de posições e métodos para criar entidades e contentores nesse mundo.
Métodos principais:
getWorld(): devolve a instância Bukkit WorldgetWorldFolder(): devolve a pasta do mundo como FilegetCenter(): devolve o ponto inicial da masmorra, a partir do qual são medidas as faixas de dificuldadegetHorizontalSize(): devolve a largura da masmorra em blocos,(2 × radius − 1) × moduleSizeXZgetDifficultyId(Location): devolve o ID de dificuldade de instância do EliteMobs para uma localização:2a menos de um sexto da largura a partir do centro (medido como o maior dos desvios em X e Z),1a menos de um terço e0nos restantes casosgetSpawnLocations(): devolve todas as posições iniciais marcadas,List<Location>getChestLocations(): devolve todas as posições de baús,List<Location>getBarrelLocations(): devolve todas as posições de barris,List<Location>getExitLocations(): devolve todas as posições de saída.ExitLocationé um record aninhado privado; fora do plugin, só pode guardar o resultado numa lista com wildcard. Não existe atualmente um tipo público para os elementos.spawnChests(): cria baús nas posições marcadas e devolveList<Block>spawnBarrels(): cria barris nas posições marcadas e devolveList<Block>spawnInaccessibleExitLocations(): coloca os schematics superiores dos elevadores e devolveList<Location>spawnAccessibleExitLocations(): coloca os schematics inferiores dos elevadores e devolveList<Location>spawnOtherEntities(): no tick seguinte, processa as placas de conjuntos de aparecimento que a colocação ainda não tenha tratado e depois dispara novamenteWorldGenerationFinishEvent. Normalmente, a colocação trata ela própria de todas as placas de conjuntos. Chamá-lo a partir de um listener deWorldGenerationFinishEventfaz com que se repita a cada tick.spawnInstancedEntities(): cria os bosses de instância em fila dos conjuntos de aparecimento com omaxLeveldo respetivo conjunto, cada um com o ID de dificuldade degetDifficultyId, e devolveList<InstancedBossEntity>. Cada boss guarda o nome do ficheiro do conjunto como dados personalizados na chavebetterstructures:spawnpool.
WorldGuard
A classe WorldGuard gere as proteções de regiões. O método public static ProtectedRegion generateProtectedRegion(FitAnything fitAnything, String regionName) permite integrar um esquema personalizado de proteção com o BetterStructures.
Outros métodos úteis:
checkArea(Location, Player): verifica se o local pertence a uma região protegida pelo BetterStructures; devolve true se estiver protegido e avisa o jogadorProtect(...): cria regiões protegidas por códigoUnprotect(CustomBossEntity): remove a proteção quando um boss é morto