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();
   }
}