TreasureMapObjectiveTask class
Пакет: com.hypixel.hytale.builtin.adventure.objectives.task
Файл: com/hypixel/hytale/builtin/adventure/objectives/task/TreasureMapObjectiveTask.java
extends: ObjectiveTask
Поля (29)
| Модификаторы | Тип | Имя |
|---|---|---|
|
UUID |
var10 |
|
ItemContainerBlock |
var10 |
|
Vector3d |
var10 |
|
List |
var11 |
|
Vector3d |
var11 |
|
ObjectiveTaskMarker |
var12 |
|
WorldChunk |
var12 |
|
com.hypixel.hytale.protocol.ObjectiveTask |
var2 |
|
UUID |
var3 |
|
TransactionRecord[] |
var4 |
|
|
var4 |
|
String |
var4 |
|
TreasureMapObjectiveTaskAsset.ChestConfig[] |
var5 |
|
Ref |
var5 |
|
Vector3i |
var5 |
|
long |
var5 |
|
int |
var5 |
|
Store |
var6 |
|
SpawnTreasureChestTransactionRecord |
var6 |
|
Vector3i |
var6 |
|
|
var6 |
|
Ref |
var7 |
|
WorldChunk |
var7 |
|
double |
var7 |
|
TreasureChestBlock |
var8 |
|
Ref |
var8 |
|
ItemContainerBlock |
var9 |
|
TreasureChestBlock |
var9 |
|
float |
var9 |
Методы (12)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
|
for for(int var6 = 0; var6 < var5.length; var6++) |
|
|
for for(var6 = null; var5 < 500 && var6 == null; var5++) |
|
|
if if(var4 != null) |
|
|
if if(var5 == null) |
|
|
if if(var7 == null) |
|
|
if if(var7 == null) |
|
|
if if(var8 == null) |
|
|
if if(var9 == null) |
|
|
if if(var10 == null) |
|
|
if if(var12 != null) |
private |
void |
onTreasureChestOpeningEventvoid onTreasureChestOpeningEvent(@Nonnull Objective var1, @Nonnull TreasureChestOpeningEvent var2) |
abstract |
|
super super(var1, var2, var3) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.adventure.objectives.task;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.Objective;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.ObjectivePlugin;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.blockstates.TreasureChestBlock;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.task.TreasureMapObjectiveTaskAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.events.TreasureChestOpeningEvent;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.markers.ObjectiveTaskMarker;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.transaction.RegistrationTransactionRecord;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.transaction.SpawnTreasureChestTransactionRecord;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.transaction.TransactionRecord;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
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.util.TrigMathUtil;
class="kw">import com.hypixel.hytale.math.vector.Transform;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.modules.block.components.ItemContainerBlock;
class="kw">import com.hypixel.hytale.server.core.modules.item.ItemModule;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
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 it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.util.Collections;
class="kw">import java.util.List;
class="kw">import java.util.UUID;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;
class="kw">public class TreasureMapObjectiveTask class="kw">extends ObjectiveTask {
@Nonnull
class="kw">public class="kw">static class="kw">final BuilderCodec<TreasureMapObjectiveTask> CODEC = BuilderCodec.builder(
TreasureMapObjectiveTask.class, TreasureMapObjectiveTask::new, BASE_CODEC
)
.append(new KeyedCodec<>("CurrentCompletion", Codec.INTEGER), (var0, var1) -> var0.currentCompletion = var1, var0 -> var0.currentCompletion)
.add()
.append(new KeyedCodec<>("ChestCount", Codec.INTEGER), (var0, var1) -> var0.chestCount = var1, var0 -> var0.chestCount)
.add()
.append(new KeyedCodec<>("ChestUUIDs", new ArrayCodec<>(Codec.UUID_BINARY, UUID[]::new)), (var0, var1) -> {
var0.chestUUIDs.clear();
Collections.addAll(var0.chestUUIDs, var1);
}, var0 -> var0.chestUUIDs.toArray(UUID[]::new))
.add()
.build();
class="kw">public class="kw">static class="kw">final int CHEST_SPAWN_TRY = 500;
class="kw">private int currentCompletion;
class="kw">private int chestCount;
@Nonnull
class="kw">private class="kw">final List<UUID> chestUUIDs = new ObjectArrayList();
class="kw">public TreasureMapObjectiveTask(@Nonnull TreasureMapObjectiveTaskAsset var1, int var2, int var3) {
super(var1, var2, var3);
}
class="kw">protected TreasureMapObjectiveTask() {
}
@Nonnull
class="kw">public TreasureMapObjectiveTaskAsset getAsset() {
class="kw">return (TreasureMapObjectiveTaskAsset)super.getAsset();
}
@Nonnull
class="kw">public String getChestMarkerIDFromUUID(@Nonnull UUID var1) {
class="kw">return "TreasureChest_" + var1.toString();
}
@Nonnull
@Override
class="kw">protected TransactionRecord[] setup0(@Nonnull Objective var1, @Nonnull World var2, @Nonnull Store<EntityStore> var3) {
this.eventRegistry.register(TreasureChestOpeningEvent.class, var2.getName(), var2x -> this.onTreasureChestOpeningEvent(var1, var2x));
TransactionRecord[] var4 = this.serializedTransactionRecords;
if (var4 != null) {
class="kw">return RegistrationTransactionRecord.append(var4, this.eventRegistry);
}
TreasureMapObjectiveTaskAsset.ChestConfig[] var5 = this.getAsset().getChestConfigs();
var4 = new TransactionRecord[var5.length];
this.chestCount = var5.length;
for (int var6 = 0; var6 < var5.length; var6++) {
var4[var6] = this.spawnChest(var1, var2, var5[var6], var3);
}
class="kw">return RegistrationTransactionRecord.append(var4, this.eventRegistry);
}
@Override
class="kw">public boolean checkCompletion() {
class="kw">return this.currentCompletion >= this.chestCount;
}
class="kw">private void onTreasureChestOpeningEvent(@Nonnull Objective var1, @Nonnull TreasureChestOpeningEvent var2) {
UUID var3 = var2.getChestUUID();
if (this.chestUUIDs.contains(var3)) {
this.currentCompletion++;
var1.markDirty();
this.sendUpdateObjectiveTaskPacket(var1);
String var4 = this.getChestMarkerIDFromUUID(var3);
this.removeMarker(var4);
Ref var5 = var2.getPlayerRef();
Store var6 = var2.getStore();
if (this.checkCompletion()) {
this.consumeTaskConditions(var6, var5, var1.getActivePlayerUUIDs());
this.complete(var1, var6);
var1.checkTaskSetCompletion(var6);
}
}
}
@Nonnull
class="kw">private TransactionRecord spawnChest(
@Nonnull Objective var1, @Nonnull World var2, @Nonnull TreasureMapObjectiveTaskAsset.ChestConfig var3, @Nonnull ComponentAccessor<EntityStore> var4
) {
Vector3i var5 = this.calculateChestSpawnPosition(var3, var1, var2, var4);
SpawnTreasureChestTransactionRecord var6 = new SpawnTreasureChestTransactionRecord(var2.getWorldConfig().getUuid(), var5);
if (var5 == null) {
class="kw">return var6.fail("Position not safe to spawn chest");
}
Ref var7 = this.spawnChestBlock(var2, var5, var3.getChestBlockTypeKey(), var6);
if (var7 == null) {
class="kw">return var6;
}
TreasureChestBlock var8 = var7.getStore().getComponent(var7, TreasureChestBlock.getComponentType());
assert var8 != null;
ItemContainerBlock var9 = var7.getStore().getComponent(var7, ItemContainerBlock.getComponentType());
assert var9 != null;
UUID var10 = UUID.randomUUID();
List var11 = ItemModule.get().getRandomItemDrops(var3.getDroplistId());
var8.setObjectiveData(var1.getObjectiveUUID(), var10);
var9.getItemContainer().addItemStacks(var11);
this.chestUUIDs.add(var10);
ObjectivePlugin.get().getLogger().at(Level.INFO).log("Spawned chest at: %s", var5);
ObjectiveTaskMarker var12 = new ObjectiveTaskMarker(
this.getChestMarkerIDFromUUID(var10), new Transform(var5), "Home.png", Message.translation("server.objectives.treasure.marker")
);
this.addMarker(var12);
class="kw">return var6;
}
@Nullable
class="kw">private Ref<ChunkStore> spawnChestBlock(@Nonnull World var1, @Nonnull Vector3i var2, String var3, @Nonnull SpawnTreasureChestTransactionRecord var4) {
long var5 = ChunkUtil.indexChunkFromBlock(var2.x, var2.z);
WorldChunk var7 = var1.getChunk(var5);
if (var7 == null) {
class="kw">return null;
} else {
var7.setBlock(var2.x, var2.y, var2.z, var3);
Ref var8 = var7.getBlockComponentEntity(var2.x, var2.y, var2.z);
if (var8 == null) {
var4.fail("Missing block entity");
class="kw">return null;
} else {
TreasureChestBlock var9 = var1.getChunkStore().getStore().getComponent(var8, TreasureChestBlock.getComponentType());
if (var9 == null) {
var4.fail("Missing TreasureChestBlock!");
class="kw">return null;
} else {
ItemContainerBlock var10 = var1.getChunkStore().getStore().getComponent(var8, ItemContainerBlock.getComponentType());
if (var10 == null) {
var4.fail("Missing ItemContainerBlock!");
class="kw">return null;
} else {
class="kw">return var8;
}
}
}
}
}
@Nullable
class="kw">private Vector3i calculateChestSpawnPosition(
@Nonnull TreasureMapObjectiveTaskAsset.ChestConfig var1, @Nonnull Objective var2, @Nonnull World var3, @Nonnull ComponentAccessor<EntityStore> var4
) {
int var5 = 0;
Vector3i var6;
for (var6 = null; var5 < 500 && var6 == null; var5++) {
double var7 = Math.random() * (float) (Math.PI * 2);
float var9 = MathUtil.randomFloat(var1.getMinRadius(), var1.getMaxRadius());
Vector3d var10 = var2.getPosition(var4);
Vector3d var11 = new Vector3d(var10).floor();
var11.add(var9 * TrigMathUtil.cos(var7), 0.0, var9 * TrigMathUtil.sin(var7));
WorldChunk var12 = var3.getChunk(ChunkUtil.indexChunkFromBlock(var11.x, var11.z));
if (var12 != null) {
var11.y = var12.getHeight(MathUtil.floor(var11.x), MathUtil.floor(var11.z));
var6 = var1.getWorldLocationProvider().runCondition(var3, Vector3dUtil.toVector3i(var11));
}
}
class="kw">return var6;
}
@Nonnull
class="kw">public com.hypixel.hytale.protocol.ObjectiveTask toPacket(@Nonnull Objective var1) {
com.hypixel.hytale.protocol.ObjectiveTask var2 = new com.hypixel.hytale.protocol.ObjectiveTask();
var2.taskDescriptionKey = Message.translation(this.asset.getDescriptionKey(var1.getObjectiveId(), this.taskSetIndex, this.taskIndex))
.getFormattedMessage();
var2.currentCompletion = this.currentCompletion;
var2.completionNeeded = this.chestCount;
class="kw">return var2;
}
@Nonnull
@Override
class="kw">public String toString() {
class="kw">return "TreasureMapObjectiveTask{currentCompletion="
+ this.currentCompletion
+ ", chestCount="
+ this.chestCount
+ ", chestUUIDs="
+ this.chestUUIDs
+ "} "
+ super.toString();
}
}