Skip to content

Commit

Permalink
Add some API and remove NPC Metadata Strings
Browse files Browse the repository at this point in the history
  • Loading branch information
fullwall committed Jan 1, 2023
1 parent efa4600 commit f8f3d10
Show file tree
Hide file tree
Showing 6 changed files with 128 additions and 150 deletions.
10 changes: 10 additions & 0 deletions src/main/java/net/citizensnpcs/api/ai/Navigator.java
Expand Up @@ -23,6 +23,16 @@ public interface Navigator {
*/
void cancelNavigation(CancelReason reason);

/**
* @see #canNavigateTo(Location, NavigatorParameters)
*/
boolean canNavigateTo(Location dest);

/**
* Returns whether the NPC can navigate to the given destination with the navigator parameters.
*/
boolean canNavigateTo(Location dest, NavigatorParameters params);

/**
* Returns the {@link NavigatorParameters} local to this navigator. These parameters are copied to local target
* parameters when a new target is started.
Expand Down
Expand Up @@ -110,25 +110,25 @@ public void run() {
if (next.getY() > prev.getY()) {
npc.getEntity().setVelocity(npc.getEntity().getVelocity().setY(0.3));
if (sneakingForScaffolding) {
npc.data().set(NPC.SNEAKING_METADATA, sneakingForScaffolding = false);
npc.data().set(NPC.Metadata.SNEAKING, sneakingForScaffolding = false);
}
} else if ((isScaffolding(in) || isScaffolding(next.getType()))) {
if (loc.distance(next.getLocation().add(0.5, 1, 0.5)) < 0.4) {
npc.data().set(NPC.SNEAKING_METADATA, sneakingForScaffolding = true);
npc.data().set(NPC.Metadata.SNEAKING, sneakingForScaffolding = true);
}
} else if (next.getY() < prev.getY()) {
npc.getEntity().setVelocity(npc.getEntity().getVelocity().setY(-0.2));
}
} else if (sneakingForScaffolding) {
npc.data().set(NPC.SNEAKING_METADATA, sneakingForScaffolding = false);
npc.data().set(NPC.Metadata.SNEAKING, sneakingForScaffolding = false);
}
}
});
npc.getNavigator().getLocalParameters().addSingleUseCallback(new NavigatorCallback() {
@Override
public void onCompletion(CancelReason cancelReason) {
npc.data().set("running-ladder", false);
npc.data().set(NPC.SNEAKING_METADATA, false);
npc.data().set(NPC.Metadata.SNEAKING, false);
}
});
added = true;
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/net/citizensnpcs/api/gui/InventoryMenu.java
Expand Up @@ -217,9 +217,9 @@ private void handleClick(InventoryClickEvent event) {
return;
}

if (!isOurInventory(clicked)) {
if (!isOurInventory(clicked))
return;
}

switch (event.getAction()) {
case COLLECT_TO_CURSOR:
event.setCancelled(true);
Expand All @@ -230,8 +230,10 @@ private void handleClick(InventoryClickEvent event) {
default:
break;
}

if (event.getSlot() < 0)
return;

InventoryMenuSlot slot = page.ctx.getSlot(event.getSlot());
CitizensInventoryClickEvent ev = new CitizensInventoryClickEvent(event, pickupAmount);
PageContext pg = page;
Expand Down
28 changes: 14 additions & 14 deletions src/main/java/net/citizensnpcs/api/npc/AbstractNPC.java
Expand Up @@ -56,15 +56,15 @@ public abstract class AbstractNPC implements NPC {
private final int id;
private Supplier<ItemStack> itemProvider = () -> {
Material id = Material.STONE;
int data = data().get(NPC.ITEM_DATA_METADATA, data().get("falling-block-data", 0));
if (data().has(NPC.ITEM_ID_METADATA)) {
id = Material.getMaterial(data().<String> get(NPC.ITEM_ID_METADATA), false);
int data = data().get(NPC.Metadata.ITEM_DATA, data().get("falling-block-data", 0));
if (data().has(NPC.Metadata.ITEM_ID)) {
id = Material.getMaterial(data().<String> get(NPC.Metadata.ITEM_ID), false);
}
if (id == Material.AIR) {
id = Material.STONE;
Messaging.severe(getId(), "invalid Material: converted to stone");
}
return new org.bukkit.inventory.ItemStack(id, data().get(NPC.ITEM_AMOUNT_METADATA, 1), (short) data);
return new org.bukkit.inventory.ItemStack(id, data().get(NPC.Metadata.ITEM_AMOUNT, 1), (short) data);
};
private final MetadataStore metadata = new SimpleMetadataStore() {
@Override
Expand Down Expand Up @@ -323,12 +323,12 @@ public boolean hasTrait(Class<? extends Trait> trait) {

@Override
public boolean isFlyable() {
return data().get(NPC.FLYABLE_METADATA, false);
return data().get(NPC.Metadata.FLYABLE, false);
}

@Override
public boolean isProtected() {
return data().get(NPC.DEFAULT_PROTECTED_METADATA, true);
return data().get(NPC.Metadata.DEFAULT_PROTECTED, true);
}

@Override
Expand Down Expand Up @@ -409,21 +409,21 @@ public void removeTrait(Class<? extends Trait> traitClass) {
public boolean requiresNameHologram() {
return getEntityType() != EntityType.ARMOR_STAND
&& ((name.length() > 16 && getEntityType() == EntityType.PLAYER)
|| data().get(NPC.ALWAYS_USE_NAME_HOLOGRAM_METADATA, false)
|| data().get(NPC.Metadata.ALWAYS_USE_NAME_HOLOGRAM, false)
|| (coloredNameStringCache != null && coloredNameStringCache.contains("§x"))
|| !Placeholders.replace(name, null, this).equals(name));
}

@Override
public void save(DataKey root) {
if (!metadata.get(NPC.SHOULD_SAVE_METADATA, true))
if (!metadata.get(NPC.Metadata.SHOULD_SAVE, true))
return;

metadata.saveTo(root.getRelative("metadata"));
root.setString("name", name);
root.setString("uuid", uuid.toString());

if (data().has(NPC.ITEM_ID_METADATA)) {
if (data().has(NPC.Metadata.ITEM_ID)) {
ItemStack stack = itemProvider.get();
ItemStorage.saveItem(root.getRelative("itemprovider"), stack);
} else {
Expand Down Expand Up @@ -458,12 +458,12 @@ public void save(DataKey root) {

@Override
public void setAlwaysUseNameHologram(boolean use) {
data().setPersistent(NPC.ALWAYS_USE_NAME_HOLOGRAM_METADATA, use);
data().setPersistent(NPC.Metadata.ALWAYS_USE_NAME_HOLOGRAM, use);
}

@Override
public void setFlyable(boolean flyable) {
data().setPersistent(NPC.FLYABLE_METADATA, flyable);
data().setPersistent(NPC.Metadata.FLYABLE, flyable);
}

@Override
Expand Down Expand Up @@ -503,12 +503,12 @@ public void setName(String name) {

@Override
public void setProtected(boolean isProtected) {
data().setPersistent(NPC.DEFAULT_PROTECTED_METADATA, isProtected);
data().setPersistent(NPC.Metadata.DEFAULT_PROTECTED, isProtected);
}

@Override
public void setUseMinecraftAI(boolean use) {
data().setPersistent(NPC.USE_MINECRAFT_AI_METADATA, use);
data().setPersistent(NPC.Metadata.USE_MINECRAFT_AI, use);
}

private void teleport(final Entity entity, Location location, int delay) {
Expand Down Expand Up @@ -581,6 +581,6 @@ public void updateCustomName() {

@Override
public boolean useMinecraftAI() {
return data().get(NPC.USE_MINECRAFT_AI_METADATA, false);
return data().get(NPC.Metadata.USE_MINECRAFT_AI, false);
}
}
142 changes: 23 additions & 119 deletions src/main/java/net/citizensnpcs/api/npc/NPC.java
Expand Up @@ -257,6 +257,8 @@ public interface NPC extends Agent, Cloneable {
*/
public boolean isSpawned();

public boolean isUpdating(NPCUpdate update);

/**
* Loads the {@link NPC} from the given {@link DataKey}. This reloads all traits, respawns the NPC and sets it up
* for execution. Should not be called often.
Expand Down Expand Up @@ -285,6 +287,8 @@ public interface NPC extends Agent, Cloneable {
*/
public void save(DataKey key);

public void scheduleUpdate(NPCUpdate update);

/**
* Sets whether to always use a name hologram instead of the in-built Minecraft name.
*
Expand Down Expand Up @@ -572,125 +576,25 @@ public enum Metadata {
public String getKey() {
return key;
}

public static Metadata byKey(String name) {
for (Metadata v : NPC.Metadata.values()) {
if (v.key.equals(name))
return v;
}
return null;
}

public static Metadata byName(String name) {
try {
return valueOf(name);
} catch (IllegalArgumentException iae) {
return null;
}
}
}

public static final String ALWAYS_USE_NAME_HOLOGRAM_METADATA = "always-use-name-hologram";
/**
* The Minecraft ambient sound played. String - Minecraft sound name
*/
public static final String AMBIENT_SOUND_METADATA = "ambient-sound";
/**
* Whether the NPC is collidable with Players or not. Boolean.
*/
public static final String COLLIDABLE_METADATA = "collidable";
/**
* Whether the NPC can damage other Entities. Boolean.
*/
public static final String DAMAGE_OTHERS_METADATA = "damage-others";
/**
* The Minecraft sound played when the NPC dies. String - Minecraft sound name.
*/
public static final String DEATH_SOUND_METADATA = "death-sound";
/**
* Whether the NPC is 'protected' i.e. invulnerable to damage. Boolean.
*/
public static final String DEFAULT_PROTECTED_METADATA = "protected";
public static final String DISABLE_DEFAULT_STUCK_ACTION_METADATA = "disable-default-stuck-action";
/**
* Whether the NPC drops its inventory after death. Boolean.
*/
public static final String DROPS_ITEMS_METADATA = "drops-items";
/**
* Whether the NPC is 'flyable' i.e. will fly when pathfinding. Boolean.
*/
public static final String FLYABLE_METADATA = "flyable";
/**
* Whether the NPC is currently glowing. Boolean.
*/
public static final String GLOWING_METADATA = "glowing";
/**
* The Minecraft sound to play when hurt. String - Minecraft sound name.
*/
public static final String HURT_SOUND_METADATA = "hurt-sound";
/**
* The Item amount. Integer.
*/
public static final String ITEM_AMOUNT_METADATA = "item-type-amount";
/**
* The Item data. Byte.
*/
public static final String ITEM_DATA_METADATA = "item-type-data";
/**
* The Item ID. String.
*/
public static final String ITEM_ID_METADATA = "item-type-id";
/**
* Whether to keep chunk loaded. Boolean.
*/
public static final String KEEP_CHUNK_LOADED_METADATA = "keep-chunk-loaded";
/**
* Whether the NPC is leashable. Boolean.
*/
public static final String LEASH_PROTECTED_METADATA = "protected-leash";
/**
* The Minecart item data. Byte.
*/
public static final String MINECART_ITEM_DATA_METADATA = "minecart-item-data";
/**
* The Minecart item name.
*/
public static final String MINECART_ITEM_METADATA = "minecart-item-name";
/**
* The Minecart item offset as defined by Minecraft. {@link Minecart#setDisplayBlockOffset(int)}
*/
public static final String MINECART_OFFSET_METADATA = "minecart-item-offset";
/**
* Whether the NPC's nameplate should be visible. Boolean.
*/
public static final String NAMEPLATE_VISIBLE_METADATA = "nameplate-visible";
/**
* Whether to open doors while pathfinding. Boolean.
*/
public static final String PATHFINDER_OPEN_DOORS_METADATA = "pathfinder-open-doors";
/**
* Whether to remove players from the player list. Boolean defaults to true.
*/
public static final String REMOVE_FROM_PLAYERLIST_METADATA = "removefromplayerlist";
/**
* The Integer delay to respawn in ticks after death. Only works if non-zero.
*/
public static final String RESPAWN_DELAY_METADATA = "respawn-delay";
/**
* The fake NPC scoreboard team name because Minecraft requires a team name. Usually will be a random UUID in String
* form.
*/
public static final String SCOREBOARD_FAKE_TEAM_NAME_METADATA = "fake-scoreboard-team-name";
/**
* Whether to save / persist across server restarts. Boolean.
*/
public static final String SHOULD_SAVE_METADATA = "should-save";
/**
* Whether to suppress sounds. Boolean.
*/
public static final String SILENT_METADATA = "silent-sounds";
/**
* Whether to sneak. Boolean.
*/
public static final String SNEAKING_METADATA = "citizens-sneaking";
/**
* Whether to allow swimming. Boolean.
*/
public static final String SWIMMING_METADATA = "swim";
/**
* Whether to prevent NPC being targeted by hostile mobs. Boolean.
*/
public static final String TARGETABLE_METADATA = "protected-target";
/**
* Whether to use Minecraft AI. Boolean.
*/
public static final String USE_MINECRAFT_AI_METADATA = "minecraft-ai";
/**
* Whether to block Minecraft villager trades. Boolean defaults to true.
*/
public static final String VILLAGER_BLOCK_TRADES = "villager-trades";
public enum NPCUpdate {
PACKET;
}
}

0 comments on commit f8f3d10

Please sign in to comment.