classpublicPriority 3
NearbyCountCondition
com.hypixel.hytale.server.npc.decisionmaker.core.conditions.NearbyCountCondition
extends ScaledCurveCondition
5
Methods
5
Public Methods
4
Fields
1
Constructors
Constants
BuilderCodec<NearbyCountCondition>CODEC= BuilderCodec.builder(
NearbyCountCondition.class, NearbyCountCondition::new, ScaledCurve...
Constructors
protected
NearbyCountCondition()Methods
Public Methods (5)
public
String getNpcGroup()public
int getNpcGroupIndex()public
double getRange()public
void setupNPC(Role role)@Override
public
String toString()@Nonnull@Override
Fields
Protected Fields (4)
protected
boolean includePlayersprotected
String npcGroupprotected
int npcGroupIndexprotected
double rangeInheritance
Parent
Current
Interface
Child
Use mouse wheel to zoom, drag to pan. Click nodes to navigate.
Related Classes
Source Code
package com.hypixel.hytale.server.npc.decisionmaker.core.conditions;
import com.hypixel.hytale.builtin.tagset.config.NPCGroup;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.codec.validation.Validators;
import com.hypixel.hytale.component.ArchetypeChunk;
import com.hypixel.hytale.component.CommandBuffer;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.server.npc.asset.builder.BuilderManager;
import com.hypixel.hytale.server.npc.decisionmaker.core.EvaluationContext;
import com.hypixel.hytale.server.npc.decisionmaker.core.conditions.base.ScaledCurveCondition;
import com.hypixel.hytale.server.npc.entities.NPCEntity;
import com.hypixel.hytale.server.npc.role.Role;
import com.hypixel.hytale.server.npc.role.support.PositionCache;
import com.hypixel.hytale.server.npc.role.support.WorldSupport;
import javax.annotation.Nonnull;
public class NearbyCountCondition extends ScaledCurveCondition {
public static final BuilderCodec<NearbyCountCondition> CODEC = BuilderCodec.builder(
NearbyCountCondition.class, NearbyCountCondition::new, ScaledCurveCondition.ABSTRACT_CODEC
)
.documentation("A scaled curve condition that returns a utility value based on the number of NPCs nearby belonging to a specific **NPCGroup**.")
.<Double>append(new KeyedCodec<>("Range", Codec.DOUBLE), (condition, d) -> condition.range = d, condition -> condition.range)
.documentation("The range within which to count NPCs.")
.addValidator(Validators.nonNull())
.addValidator(Validators.greaterThan(0.0))
.add()
.<String>append(new KeyedCodec<>("NPCGroup", Codec.STRING), (condition, s) -> condition.npcGroup = s, condition -> condition.npcGroup)
.documentation("The NPCGroup to count NPCs from.")
.addValidator(Validators.nonNull())
.addValidator(NPCGroup.VALIDATOR_CACHE.getValidator())
.add()
.afterDecode(condition -> condition.npcGroupIndex = NPCGroup.getAssetMap().getIndex(condition.npcGroup))
.build();
protected double range;
protected String npcGroup;
protected int npcGroupIndex;
protected boolean includePlayers;
protected NearbyCountCondition() {
}
public double getRange() {
return this.range;
}
public String getNpcGroup() {
return this.npcGroup;
}
public int getNpcGroupIndex() {
return this.npcGroupIndex;
}
@Override
public void setupNPC(@Nonnull Role role) {
PositionCache positionCache = role.getPositionCache();
positionCache.requireEntityDistanceSorted(this.range);
this.includePlayers = WorldSupport.hasTagInGroup(this.npcGroupIndex, BuilderManager.getPlayerGroupID());
if (this.includePlayers) {
positionCache.requirePlayerDistanceSorted(this.range);
}
}
@Override
protected double getInput(
int selfIndex,
@Nonnull ArchetypeChunk<EntityStore> archetypeChunk,
Ref<EntityStore> target,
CommandBuffer<EntityStore> commandBuffer,
EvaluationContext context
) {
NPCEntity selfNpcComponent = archetypeChunk.getComponent(selfIndex, NPCEntity.getComponentType());
assert selfNpcComponent != null;
PositionCache positionCache = selfNpcComponent.getRole().getPositionCache();
return (double)positionCache.countEntitiesInRange(
0.0, this.range, this.includePlayers, NearbyCountCondition::filterNPC, selfNpcComponent.getRole(), this, commandBuffer
);
}
protected static boolean filterNPC(
@Nonnull Role role, Ref<EntityStore> ref, @Nonnull NearbyCountCondition _this, @Nonnull ComponentAccessor<EntityStore> componentAccessor
) {
return WorldSupport.isGroupMember(role.getRoleIndex(), ref, _this.npcGroupIndex, componentAccessor);
}
@Nonnull
@Override
public String toString() {
return "NearbyCountCondition{range=" + this.range + ", npcGroup=" + this.npcGroup + ", npcGroupIndex=" + this.npcGroupIndex + "} " + super.toString();
}
}