package com.hypixel.hytale.server.npc.blackboard.view.attitude; import com.hypixel.hytale.builtin.tagset.TagSetPlugin; import com.hypixel.hytale.builtin.tagset.config.NPCGroup; import com.hypixel.hytale.component.ComponentAccessor; import com.hypixel.hytale.component.ComponentType; import com.hypixel.hytale.component.Ref; import com.hypixel.hytale.server.core.asset.type.attitude.Attitude; import com.hypixel.hytale.server.core.entity.entities.Player; import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; import com.hypixel.hytale.server.npc.NPCPlugin; import com.hypixel.hytale.server.npc.asset.builder.BuilderManager; import com.hypixel.hytale.server.npc.config.AttitudeGroup; import com.hypixel.hytale.server.npc.entities.NPCEntity; import com.hypixel.hytale.server.npc.role.Role; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.IntSet; import java.util.Map; import java.util.logging.Level; import javax.annotation.Nonnull; import javax.annotation.Nullable; public class AttitudeMap { @Nullable private static final ComponentType NPC_COMPONENT_TYPE = NPCEntity.getComponentType(); private static final ComponentType PLAYER_COMPONENT_TYPE = Player.getComponentType(); private final Int2ObjectMap[] map; private AttitudeMap(Int2ObjectMap[] map) { this.map = map; } @Nullable public Attitude getAttitude(@Nonnull Role role, @Nonnull Ref target, @Nonnull ComponentAccessor componentAccessor) { int group = role.getWorldSupport().getAttitudeGroup(); if (group == Integer.MIN_VALUE) { return null; } else { Int2ObjectMap attitudeMap = this.map[group]; if (attitudeMap == null) { return null; } else { NPCEntity npc = componentAccessor.getComponent(target, NPC_COMPONENT_TYPE); int targetId; if (npc != null) { targetId = npc.getRoleIndex(); } else { if (!componentAccessor.getArchetype(target).contains(PLAYER_COMPONENT_TYPE)) { return null; } targetId = BuilderManager.getPlayerGroupID(); } return targetId == role.getRoleIndex() ? (Attitude)attitudeMap.get(BuilderManager.getSelfGroupID()) : (Attitude)attitudeMap.get(targetId); } } } public int getAttitudeGroupCount() { return this.map.length; } public void updateAttitudeGroup(int id, @Nonnull AttitudeGroup group) { Int2ObjectMap groupMap = AttitudeMap.Builder.createGroupMap(group); this.map[id] = groupMap; } public static class Builder { private final Int2ObjectMap[] map = new Int2ObjectMap[AttitudeGroup.getAssetMap().getNextIndex()]; public void addAttitudeGroups(@Nonnull Map groups) { groups.forEach((id, group) -> this.addAttitudeGroup(group)); } private void addAttitudeGroup(@Nonnull AttitudeGroup group) { String key = group.getId(); int index = AttitudeGroup.getAssetMap().getIndex(key); if (index == Integer.MIN_VALUE) { throw new IllegalArgumentException("Unknown key! " + key); } else { this.map[index] = createGroupMap(group); } } @Nonnull private static Int2ObjectMap createGroupMap(@Nonnull AttitudeGroup group) { TagSetPlugin.TagSetLookup npcGroups = TagSetPlugin.get(NPCGroup.class); Int2ObjectOpenHashMap groupMap = new Int2ObjectOpenHashMap(); for (Attitude attitude : Attitude.VALUES) { putGroups(group.getId(), npcGroups, group.getAttitudeGroups().get(attitude), attitude, groupMap); } groupMap.trim(); return groupMap; } private static void putGroups( String attitudeGroup, @Nonnull TagSetPlugin.TagSetLookup npcGroupLookup, @Nullable String[] group, Attitude targetAttitude, @Nonnull Int2ObjectMap targetMap ) { if (group != null) { for (String item : group) { int index = NPCGroup.getAssetMap().getIndex(item); if (index == Integer.MIN_VALUE) { NPCPlugin.get() .getLogger() .at(Level.SEVERE) .log("Creating attitude groups: NPC Group '%s' does not exist in attitude group '%s'!", item, attitudeGroup); } else { IntSet set = npcGroupLookup.getSet(index); if (set != null) { set.forEach(i -> targetMap.put(i, targetAttitude)); } } } } } @Nonnull public AttitudeMap build() { return new AttitudeMap(this.map); } } }