TeleportPlugin class
Пакет: com.hypixel.hytale.builtin.teleport
Файл: com/hypixel/hytale/builtin/teleport/TeleportPlugin.java
extends: JavaPlugin
Поля (50)
| Модификаторы | Тип | Имя |
|---|---|---|
|
public static final TeleportPlugin.WarpMarkerProvider |
INSTANCE |
static |
TeleportPlugin |
instance |
|
|
instance |
|
CommandRegistry |
var1 |
|
ModelAsset |
var1 |
|
BsonDocument |
var1 |
|
|
var1 |
|
Path |
var1 |
|
World |
var1 |
|
World |
var1 |
|
Warp |
var12 |
|
Transform |
var13 |
|
Vector3d |
var14 |
|
int |
var15 |
|
Holder |
var16 |
|
EntitySection |
var17 |
|
EventRegistry |
var2 |
|
Path |
var2 |
|
Warp[] |
var2 |
|
Map |
var2 |
|
WorldChunk |
var2 |
|
String |
var2 |
|
Store |
var2 |
|
Store |
var2 |
|
Path |
var3 |
|
BsonDocument |
var3 |
|
ModelAsset |
var3 |
|
BlockChunk |
var3 |
|
Transform |
var3 |
|
String |
var3 |
|
Warp |
var3 |
|
TeleportPlugin |
var3 |
|
ComponentType |
var3 |
|
Path |
var4 |
|
int |
var4 |
|
Holder |
var4 |
|
Warp |
var4 |
|
Holder |
var4 |
|
Map |
var4 |
|
BsonArray |
var5 |
|
int |
var5 |
|
Rotation3f |
var5 |
|
TeleportPlugin.WarpComponent |
var5 |
|
GameplayConfig |
var5 |
|
World |
var6 |
|
Rotation3f |
var6 |
|
String |
var7 |
|
ChunkColumn |
var8 |
|
MapMarker |
var8 |
|
Holder[] |
var9 |
Методы (30)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
abstract |
throw new |
UnsupportedOperationExceptionthrow new UnsupportedOperationException("WarpComponent must be created manually") |
|
public |
WarpMarkerProviderpublic WarpMarkerProvider() |
public |
boolean |
addWarpboolean addWarp(@Nonnull Warp var1, boolean var2) |
|
public Component<EntityStore> |
clonepublic Component<EntityStore> clone() |
static |
CompletableFuture<Ref<EntityStore>> |
createWarpEntityCompletableFuture<Ref<EntityStore>> createWarpEntity(@Nonnull Warp var0) |
abstract |
|
createWarpEntity createWarpEntity(var1) |
|
public static ComponentType<EntityStore, TeleportPlugin.WarpComponent> |
getComponentTypepublic static ComponentType<EntityStore, TeleportPlugin.WarpComponent> getComponentType() |
public |
Map<String, Warp> |
getWarpsMap<String, Warp> getWarps() |
|
|
if if(var1 == null) |
|
|
if if(var1 != null) |
|
|
if if(var3 != null) |
|
|
if if(var3 != null) |
|
|
if if(var9 != null) |
|
|
if if(var13 != null) |
|
|
if if(var15 >= 0 && var15 < var9.length) |
|
|
if if(var16 != null) |
|
|
if if(!var2 && var4 != null) |
|
|
if if(var4 == null) |
|
|
if if(var3 == null) |
public |
boolean |
isWarpsLoadedboolean isWarpsLoaded() |
public |
void |
loadWarpsvoid loadWarps() |
private |
void |
onChunkPreLoadProcessvoid onChunkPreLoadProcess(@Nonnull ChunkPreLoadProcessEvent var1) |
private |
void |
onModelAssetChangevoid onModelAssetChange(@Nonnull LoadedAssetsEvent<String, ModelAsset, DefaultAssetMap<String, ModelAsset>> var1) |
public |
boolean |
removeWarpboolean removeWarp(@Nonnull String var1) |
static |
CompletableFuture<Void> |
removeWarpEntityCompletableFuture<Void> removeWarpEntity(@Nonnull Warp var0) |
static |
void |
removeWarpEntityvoid removeWarpEntity(@Nonnull World var0, @Nonnull Warp var1) |
abstract |
|
removeWarpEntity removeWarpEntity(var3) |
public |
void |
saveWarpsvoid saveWarps() |
abstract |
|
super super(var1) |
|
public void |
updatepublic void update(@Nonnull World var1, @Nonnull Player var2, @Nonnull MarkersCollector var3) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.teleport;
class="kw">import com.hypixel.hytale.assetstore.event.LoadedAssetsEvent;
class="kw">import com.hypixel.hytale.assetstore.map.DefaultAssetMap;
class="kw">import com.hypixel.hytale.builtin.teleport.commands.teleport.SpawnCommand;
class="kw">import com.hypixel.hytale.builtin.teleport.commands.teleport.TeleportCommand;
class="kw">import com.hypixel.hytale.builtin.teleport.commands.warp.WarpCommand;
class="kw">import com.hypixel.hytale.builtin.teleport.components.TeleportHistory;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.Component;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.RemoveReason;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.event.EventRegistry;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Transform;
class="kw">import com.hypixel.hytale.protocol.packets.worldmap.MapMarker;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.GameplayConfig;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.Model;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.ModelAsset;
class="kw">import com.hypixel.hytale.server.core.command.system.CommandRegistry;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.entity.nameplate.Nameplate;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.BoundingBox;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HiddenFromAdventurePlayers;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.Intangible;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.ModelComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.tracker.NetworkId;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPlugin;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
class="kw">import com.hypixel.hytale.server.core.universe.Universe;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.ChunkColumn;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.EntitySection;
class="kw">import com.hypixel.hytale.server.core.universe.world.events.AddWorldEvent;
class="kw">import com.hypixel.hytale.server.core.universe.world.events.AllWorldsLoadedEvent;
class="kw">import com.hypixel.hytale.server.core.universe.world.events.ChunkPreLoadProcessEvent;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldmap.WorldMapManager;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldmap.markers.MapMarkerBuilder;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldmap.markers.MarkersCollector;
class="kw">import com.hypixel.hytale.server.core.util.BsonUtil;
class="kw">import java.io.IOException;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.util.Locale;
class="kw">import java.util.Map;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.concurrent.atomic.AtomicBoolean;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.bson.BsonArray;
class="kw">import org.bson.BsonDocument;
class="kw">import org.joml.Vector3d;
class="kw">public class TeleportPlugin class="kw">extends JavaPlugin {
class="kw">private class="kw">static TeleportPlugin instance;
class="kw">public class="kw">static class="kw">final String WARP_MODEL_ID = "Warp";
class="kw">private ComponentType<EntityStore, TeleportHistory> teleportHistoryComponentType;
class="kw">private ComponentType<EntityStore, TeleportPlugin.WarpComponent> warpComponentType;
@Nonnull
class="kw">private class="kw">final AtomicBoolean loaded = new AtomicBoolean();
@Nonnull
class="kw">private class="kw">final Map<String, Warp> warps = new ConcurrentHashMap<>();
class="kw">private Model warpModel;
@Nonnull
class="kw">public class="kw">static TeleportPlugin get() {
class="kw">return instance;
}
class="kw">public TeleportPlugin(@Nonnull JavaPluginInit var1) {
super(var1);
}
@Nonnull
class="kw">public ComponentType<EntityStore, TeleportHistory> getTeleportHistoryComponentType() {
class="kw">return this.teleportHistoryComponentType;
}
class="kw">public boolean isWarpsLoaded() {
class="kw">return this.loaded.get();
}
@Override
class="kw">protected void setup() {
instance = this;
CommandRegistry var1 = this.getCommandRegistry();
EventRegistry var2 = this.getEventRegistry();
var1.registerCommand(new TeleportCommand());
var1.registerCommand(new WarpCommand());
var1.registerCommand(new SpawnCommand());
var2.register(LoadedAssetsEvent.class, ModelAsset.class, this::onModelAssetChange);
var2.registerGlobal(ChunkPreLoadProcessEvent.class, this::onChunkPreLoadProcess);
var2.registerGlobal(
AddWorldEvent.class, var0 -> var0.getWorld().getWorldMapManager().addMarkerProvider("warps", TeleportPlugin.WarpMarkerProvider.INSTANCE)
);
var2.registerGlobal(AllWorldsLoadedEvent.class, var1x -> this.loadWarps());
this.teleportHistoryComponentType = EntityStore.REGISTRY.registerComponent(TeleportHistory.class, TeleportHistory::new);
this.warpComponentType = EntityStore.REGISTRY.registerComponent(TeleportPlugin.WarpComponent.class, () -> {
throw new UnsupportedOperationException("WarpComponent must be created manually");
});
}
@Override
class="kw">protected void start() {
ModelAsset var1 = ModelAsset.getAssetMap().getAsset("Warp");
if (var1 == null) {
throw new IllegalStateException(String.format("Default warp model '%s' not found", "Warp"));
}
this.warpModel = Model.createUnitScaleModel(var1);
}
@Override
class="kw">protected void shutdown() {
}
class="kw">public void loadWarps() {
BsonDocument var1 = null;
Path var2 = Universe.get().getPath();
Path var3 = var2.resolve("warps.bson");
Path var4 = var2.resolve("warps.json");
if (Files.exists(var3) && !Files.exists(var4)) {
try {
Files.move(var3, var4);
} catch (IOException var10) {
}
}
if (Files.exists(var4)) {
var1 = BsonUtil.readDocument(var4).join();
}
if (var1 != null) {
BsonArray var5 = var1.containsKey("Warps") ? var1.getArray("Warps") : var1.getArray("warps");
this.warps.clear();
for (Warp var9 : Warp.ARRAY_CODEC.decode(var5)) {
this.warps.put(var9.getId().toLowerCase(Locale.ROOT), var9);
}
this.getLogger().at(Level.INFO).log("Loaded %d warps", var5.size());
} else {
this.getLogger().at(Level.INFO).log("Loaded 0 warps (No warps.json found)");
}
this.loaded.set(true);
}
class="kw">public void saveWarps() {
Path var1 = Universe.get().getPath().resolve("warps.json");
Universe.get().getStorageManager().doSave(var1, () -> {
Warp[] var2 = this.warps.values().toArray(Warp[]::new);
BsonDocument var3 = new BsonDocument("Warps", Warp.ARRAY_CODEC.encode(var2));
this.getLogger().at(Level.INFO).log("Saving %d warps to warps.json", var2.length);
class="kw">return BsonUtil.writeDocument(var1, var3);
}).exceptionally(var1x -> {
((HytaleLogger.Api)this.getLogger().at(Level.SEVERE).withCause(var1x)).log("Failed to save warps");
class="kw">return null;
});
}
class="kw">public Map<String, Warp> getWarps() {
class="kw">return this.warps;
}
class="kw">private void onModelAssetChange(@Nonnull LoadedAssetsEvent<String, ModelAsset, DefaultAssetMap<String, ModelAsset>> var1) {
Map var2 = var1.getLoadedAssets();
ModelAsset var3 = var2.get("Warp");
if (var3 != null) {
this.warpModel = Model.createUnitScaleModel(var3);
}
}
class="kw">private void onChunkPreLoadProcess(@Nonnull ChunkPreLoadProcessEvent var1) {
WorldChunk var2 = var1.getChunk();
BlockChunk var3 = var2.getBlockChunk();
if (var3 != null) {
int var4 = var3.getX();
int var5 = var3.getZ();
World var6 = var2.getWorld();
String var7 = var6.getName();
ChunkColumn var8 = var1.getHolder().getComponent(ChunkColumn.getComponentType());
assert var8 != null;
Holder[] var9 = var8.getSectionHolders();
if (var9 != null) {
for (Entry var11 : this.warps.entrySet()) {
Warp var12 = var11.getValue();
Transform var13 = var12.getTransform();
if (var13 != null) {
Vector3d var14 = var13.getPosition();
if (ChunkUtil.isInsideChunk(var4, var5, MathUtil.floor(var14.x), MathUtil.floor(var14.z)) && var12.getWorld().equals(var7)) {
int var15 = ChunkUtil.chunkCoordinate(var14.y);
if (var15 >= 0 && var15 < var9.length) {
Holder var16 = var9[var15];
if (var16 != null) {
EntitySection var17 = var16.ensureAndGetComponent(EntitySection.getComponentType());
var17.loadEntityHolder(this.createWarp(var12, var6.getEntityStore().getStore()));
}
}
}
}
}
}
}
}
@Nonnull
class="kw">public Holder<EntityStore> createWarp(@Nonnull Warp var1, @Nonnull Store<EntityStore> var2) {
Transform var3 = var1.getTransform();
Holder var4 = EntityStore.REGISTRY.newHolder();
Rotation3f var5 = var3.getRotation();
Rotation3f var6 = new Rotation3f(
Float.isFinite(var5.pitch()) ? var5.pitch() : 0.0F, Float.isFinite(var5.yaw()) ? var5.yaw() : 0.0F, Float.isFinite(var5.roll()) ? var5.roll() : 0.0F
);
var4.addComponent(TransformComponent.getComponentType(), new TransformComponent(var3.getPosition(), var6));
var4.addComponent(NetworkId.getComponentType(), new NetworkId(var2.getExternalData().takeNextNetworkId()));
var4.ensureComponent(Intangible.getComponentType());
var4.addComponent(BoundingBox.getComponentType(), new BoundingBox(this.warpModel.getBoundingBox()));
var4.addComponent(ModelComponent.getComponentType(), new ModelComponent(this.warpModel));
var4.addComponent(Nameplate.getComponentType(), new Nameplate(var1.getId()));
var4.ensureComponent(HiddenFromAdventurePlayers.getComponentType());
var4.ensureComponent(EntityStore.REGISTRY.getNonSerializedComponentType());
var4.addComponent(this.warpComponentType, new TeleportPlugin.WarpComponent(var1));
class="kw">return var4;
}
class="kw">public boolean addWarp(@Nonnull Warp var1, boolean var2) {
String var3 = var1.getId().toLowerCase(Locale.ROOT);
Warp var4 = var2 ? this.warps.put(var3, var1) : this.warps.putIfAbsent(var3, var1);
if (!var2 && var4 != null) {
class="kw">return false;
}
if (var4 == null) {
createWarpEntity(var1);
} else {
removeWarpEntity(var4).thenCompose(var1x -> createWarpEntity(var1));
}
this.saveWarps();
class="kw">return true;
}
class="kw">public boolean removeWarp(@Nonnull String var1) {
String var2 = var1.toLowerCase(Locale.ROOT);
Warp var3 = this.warps.remove(var2);
if (var3 == null) {
class="kw">return false;
}
removeWarpEntity(var3);
this.saveWarps();
class="kw">return true;
}
class="kw">private class="kw">static CompletableFuture<Ref<EntityStore>> createWarpEntity(@Nonnull Warp var0) {
World var1 = Universe.get().getWorld(var0.getWorld());
class="kw">return var1 == null ? CompletableFuture.completedFuture(null) : CompletableFuture.supplyAsync(() -> createWarpEntity(var1, var0), var1);
}
class="kw">private class="kw">static CompletableFuture<Void> removeWarpEntity(@Nonnull Warp var0) {
World var1 = Universe.get().getWorld(var0.getWorld());
class="kw">return var1 == null ? CompletableFuture.completedFuture(null) : CompletableFuture.runAsync(() -> removeWarpEntity(var1, var0), var1);
}
@Nullable
class="kw">private class="kw">static Ref<EntityStore> createWarpEntity(@Nonnull World var0, @Nonnull Warp var1) {
assert var0.isInThread();
Store var2 = var0.getEntityStore().getStore();
TeleportPlugin var3 = get();
Holder var4 = var3.createWarp(var1, var2);
class="kw">return var2.addEntity(var4, AddReason.LOAD);
}
class="kw">private class="kw">static void removeWarpEntity(@Nonnull World var0, @Nonnull Warp var1) {
assert var0.isInThread();
Store var2 = var0.getEntityStore().getStore();
ComponentType var3 = TeleportPlugin.WarpComponent.getComponentType();
var2.forEachEntityParallel(var3, (var2x, var3x, var4) -> {
TeleportPlugin.WarpComponent var5 = var3x.getComponent(var2x, var3);
if (var5 != null && var5.warp().getId().equals(var1.getId())) {
var4.removeEntity(var3x.getReferenceTo(var2x), RemoveReason.REMOVE);
}
});
}
class="kw">public record WarpComponent(Warp warp) class="kw">implements Component<EntityStore> {
class="kw">public WarpComponent {
}
class="kw">public class="kw">static ComponentType<EntityStore, TeleportPlugin.WarpComponent> getComponentType() {
class="kw">return TeleportPlugin.get().warpComponentType;
}
@Nonnull
@Override
class="kw">public Component<EntityStore> clone() {
class="kw">return new TeleportPlugin.WarpComponent(this.warp);
}
}
class="kw">public class="kw">static class WarpMarkerProvider class="kw">implements WorldMapManager.MarkerProvider {
class="kw">public class="kw">static class="kw">final TeleportPlugin.WarpMarkerProvider INSTANCE = new TeleportPlugin.WarpMarkerProvider();
class="kw">public WarpMarkerProvider() {
}
@Override
class="kw">public void update(@Nonnull World var1, @Nonnull Player var2, @Nonnull MarkersCollector var3) {
Map var4 = TeleportPlugin.get().getWarps();
if (!var4.isEmpty()) {
GameplayConfig var5 = var1.getGameplayConfig();
if (var5.getWorldMapConfig().isDisplayWarps()) {
for (Warp var7 : var4.values()) {
if (var7.getWorld().equals(var1.getName())) {
MapMarker var8 = new MapMarkerBuilder("Warp-" + var7.getId(), "Warp.png", var7.getTransform())
.withName(Message.translation("server.map.warp").param("warpName", var7.getId()))
.build();
var3.add(var8);
}
}
}
}
}
}
}