hytale-server/com/hypixel/hytale/builtin/npccombatactionevaluator/conditions/TargetMemoryCountCondition....

60 lines
2.9 KiB
Java

package com.hypixel.hytale.builtin.npccombatactionevaluator.conditions;
import com.hypixel.hytale.builtin.npccombatactionevaluator.memory.TargetMemory;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.codec.codecs.EnumCodec;
import com.hypixel.hytale.component.ArchetypeChunk;
import com.hypixel.hytale.component.CommandBuffer;
import com.hypixel.hytale.component.ComponentType;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.server.npc.decisionmaker.core.EvaluationContext;
import com.hypixel.hytale.server.npc.decisionmaker.core.conditions.base.ScaledCurveCondition;
import javax.annotation.Nonnull;
public class TargetMemoryCountCondition extends ScaledCurveCondition {
public static final EnumCodec<TargetMemoryCountCondition.TargetType> TARGET_TYPE_CODEC = new EnumCodec<>(TargetMemoryCountCondition.TargetType.class)
.documentKey(TargetMemoryCountCondition.TargetType.All, "All known targets.")
.documentKey(TargetMemoryCountCondition.TargetType.Friendly, "Known friendly targets.")
.documentKey(TargetMemoryCountCondition.TargetType.Hostile, "Known hostile targets.");
public static final BuilderCodec<TargetMemoryCountCondition> CODEC = BuilderCodec.builder(
TargetMemoryCountCondition.class, TargetMemoryCountCondition::new, ScaledCurveCondition.ABSTRACT_CODEC
)
.documentation("A scaled curve condition that returns a utility value based on the number of known targets in the memory.")
.<TargetMemoryCountCondition.TargetType>appendInherited(
new KeyedCodec<>("TargetType", TARGET_TYPE_CODEC),
(condition, e) -> condition.targetType = e,
condition -> condition.targetType,
(condition, parent) -> condition.targetType = parent.targetType
)
.documentation("The type of targets to count.")
.add()
.build();
protected static final ComponentType<EntityStore, TargetMemory> TARGET_MEMORY_COMPONENT_TYPE = TargetMemory.getComponentType();
protected TargetMemoryCountCondition.TargetType targetType = TargetMemoryCountCondition.TargetType.Hostile;
@Override
protected double getInput(
int selfIndex,
@Nonnull ArchetypeChunk<EntityStore> archetypeChunk,
Ref<EntityStore> target,
CommandBuffer<EntityStore> commandBuffer,
EvaluationContext context
) {
TargetMemory memory = archetypeChunk.getComponent(selfIndex, TARGET_MEMORY_COMPONENT_TYPE);
return switch (this.targetType) {
case Hostile -> memory.getKnownHostiles().size();
case Friendly -> memory.getKnownFriendlies().size();
case All -> memory.getKnownFriendlies().size() + memory.getKnownHostiles().size();
};
}
private static enum TargetType {
Hostile,
Friendly,
All;
}
}