OptionHolder class

Пакет: com.hypixel.hytale.server.npc.decisionmaker.core

Файл: com/hypixel/hytale/server/npc/decisionmaker/core/Evaluator.java

implements: IWeightedElement

Поля (3)

МодификаторыТипИмя
protected long lastUsedNanos
protected final OptionType option
protected double utility

Методы (7)

МодификаторыВозвратСигнатура
abstract public abstract double calculateUtilitypublic abstract double calculateUtility(int var1, ArchetypeChunk<EntityStore> var2, CommandBuffer<EntityStore> var3, EvaluationContext var4)
public OptionType getOptionpublic OptionType getOption()
public double getTotalUtilitypublic double getTotalUtility(double var1)
public double getWeightpublic double getWeight()
public double getWeightCoefficientpublic double getWeightCoefficient()
public void setLastUsedNanospublic void setLastUsedNanos(long var1)
public double tryPickpublic double tryPick(double var1, double var3)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.npc.decisionmaker.core;

class="kw">import com.hypixel.hytale.common.map.IWeightedElement;
class="kw">import com.hypixel.hytale.component.ArchetypeChunk;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.npc.entities.NPCEntity;
class="kw">import com.hypixel.hytale.server.npc.instructions.ExecutionSupport;
class="kw">import java.util.Comparator;
class="kw">import java.util.List;
class="kw">import java.util.concurrent.ThreadLocalRandom;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class="kw">abstract class Evaluator<OptionType class="kw">extends Option> {
   class="kw">public class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">public class="kw">static long NOT_USED = 0L;
   class="kw">protected List<Evaluator<OptionType>.OptionHolder> options;

   class="kw">public Evaluator() {
   }

   class="kw">public void initialise() {
      this.options.sort(Comparator.comparingDouble(Evaluator.OptionHolder::getWeightCoefficient).reversed());

      for (Evaluator.OptionHolder var2 : this.options) {
         var2.option.sortConditions();
      }
   }

   class="kw">public void setupNPC(ExecutionSupport var1) {
      for (Evaluator.OptionHolder var3 : this.options) {
         var3.option.setupNPC(var1);
      }
   }

   class="kw">public void setupNPC(Holder<EntityStore> var1) {
      for (Evaluator.OptionHolder var3 : this.options) {
         var3.option.setupNPC(var1);
      }
   }

   @Nullable
   class="kw">public Evaluator<OptionType>.OptionHolder evaluate(
      int var1, @Nonnull ArchetypeChunk<EntityStore> var2, CommandBuffer<EntityStore> var3, @Nonnull EvaluationContext var4
   ) {
      NPCEntity var5 = null;
      UUIDComponent var6 = null;
      Evaluator.OptionHolder var7 = null;
      double var8 = var4.getMinimumWeightCoefficient();
      int var10 = this.options.size();
      HytaleLogger.Api var11 = LOGGER.at(Level.FINE);

      for (int var12 = 0; var12 < this.options.size(); var12++) {
         Evaluator.OptionHolder var13 = this.options.get(var12);
         if (var13.getWeightCoefficient() < var8) {
            var10 = var12;
            break;
         }

         double var14 = var13.calculateUtility(var1, var2, var3, var4);
         if (var11.isEnabled()) {
            if (var5 == null) {
               var5 = var2.getComponent(var1, NPCEntity.getComponentType());
               assert var5 != null;
            }

            if (var6 == null) {
               var6 = var2.getComponent(var1, UUIDComponent.getComponentType());
               assert var6 != null;
            }

            var11.log("%s with uuid %s: Scored option %s at %s", var5.getRoleName(), var6.getUuid(), var13.option, var14);
         }

         if (!(var14 <= 0.0) && (var7 == null || var14 > var7.utility)) {
            var7 = var13;
         }
      }

      if (var7 == null) {
         class="kw">return null;
      }

      float var21 = var4.getPredictability();
      if (var21 == 1.0F) {
         class="kw">return var7;
      }

      double var22 = var7.utility * var21;
      double var15 = 0.0;

      for (int var17 = 0; var17 < var10; var17++) {
         Evaluator.OptionHolder var18 = this.options.get(var17);
         if (var18.utility >= var22) {
            var15 += var18.getTotalUtility(var22);
         }
      }

      double var23 = ThreadLocalRandom.current().nextDouble(var15);

      for (int var19 = 0; var19 < var10; var19++) {
         Evaluator.OptionHolder var20 = this.options.get(var19);
         if (!(var20.utility < var22)) {
            var23 = var20.tryPick(var23, var22);
            if (var23 <= 0.0) {
               var7 = var20;
               break;
            }
         }
      }

      class="kw">return var7;
   }

   class="kw">public class="kw">abstract class OptionHolder class="kw">implements IWeightedElement {
      class="kw">protected class="kw">final OptionType option;
      class="kw">protected double utility;
      class="kw">protected long lastUsedNanos = Evaluator.NOT_USED;

      class="kw">public OptionHolder(OptionType nullx) {
         this.option = nullx;
      }

      class="kw">public void setLastUsedNanos(long var1) {
         this.lastUsedNanos = var1;
      }

      @Override
      class="kw">public double getWeight() {
         class="kw">return this.utility;
      }

      class="kw">public double getWeightCoefficient() {
         class="kw">return this.option.getWeightCoefficient();
      }

      class="kw">public OptionType getOption() {
         class="kw">return this.option;
      }

      class="kw">public double getTotalUtility(double var1) {
         class="kw">return this.utility;
      }

      class="kw">public double tryPick(double var1, double var3) {
         class="kw">return var1 - this.utility;
      }

      class="kw">public class="kw">abstract double calculateUtility(int var1, ArchetypeChunk<EntityStore> var2, CommandBuffer<EntityStore> var3, EvaluationContext var4);
   }
}