From feda25f1d25dc8a396ffee9280dd7e8c96b280a8 Mon Sep 17 00:00:00 2001 From: Devin French Date: Sat, 6 May 2017 18:37:10 -0700 Subject: [PATCH] runelite-api: Add queries --- .../main/java/net/runelite/api/Client.java | 6 ++ .../src/main/java/net/runelite/api/NPC.java | 2 +- .../main/java/net/runelite/api/Player.java | 2 +- .../src/main/java/net/runelite/api/Query.java | 47 +++++++++ .../net/runelite/api/queries/ActorQuery.java | 96 +++++++++++++++++++ .../net/runelite/api/queries/NPCQuery.java | 43 +++++++++ .../net/runelite/api/queries/PlayerQuery.java | 43 +++++++++ .../java/net/runelite/api/widgets/Widget.java | 4 +- 8 files changed, 239 insertions(+), 4 deletions(-) create mode 100644 runelite-api/src/main/java/net/runelite/api/Query.java create mode 100644 runelite-api/src/main/java/net/runelite/api/queries/ActorQuery.java create mode 100644 runelite-api/src/main/java/net/runelite/api/queries/NPCQuery.java create mode 100644 runelite-api/src/main/java/net/runelite/api/queries/PlayerQuery.java diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index 11bed4ceea..3377566b69 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -62,6 +62,12 @@ public class Client .toArray(size -> new Player[size]); } + @SuppressWarnings("unchecked") + public T[] runQuery(Query query) + { + return (T[]) query.result(this); + } + public int getBoostedSkillLevel(Skill skill) { int[] boostedLevels = client.getBoostedSkillLevels(); diff --git a/runelite-api/src/main/java/net/runelite/api/NPC.java b/runelite-api/src/main/java/net/runelite/api/NPC.java index 5517e5341c..09ea53d912 100644 --- a/runelite-api/src/main/java/net/runelite/api/NPC.java +++ b/runelite-api/src/main/java/net/runelite/api/NPC.java @@ -38,7 +38,7 @@ public class NPC extends Actor @Override public String getName() { - return npc.getComposition().getName(); + return npc.getComposition().getName().replace('\u00A0', ' '); } @Override diff --git a/runelite-api/src/main/java/net/runelite/api/Player.java b/runelite-api/src/main/java/net/runelite/api/Player.java index 1ded49b923..ef7057956c 100644 --- a/runelite-api/src/main/java/net/runelite/api/Player.java +++ b/runelite-api/src/main/java/net/runelite/api/Player.java @@ -41,7 +41,7 @@ public class Player extends Actor @Override public String getName() { - return player.getName(); + return player.getName().replace('\u00A0', ' '); } @Override diff --git a/runelite-api/src/main/java/net/runelite/api/Query.java b/runelite-api/src/main/java/net/runelite/api/Query.java new file mode 100644 index 0000000000..d54e174cc2 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/Query.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2017, Devin French + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api; + +import java.util.function.Predicate; + +public abstract class Query +{ + protected Predicate predicate; + + protected Query() + { + } + + protected abstract EntityType[] result(Client client); + + protected Predicate and(Predicate other) + { + if (predicate == null) + { + return other; + } + return predicate.and(other); + } +} diff --git a/runelite-api/src/main/java/net/runelite/api/queries/ActorQuery.java b/runelite-api/src/main/java/net/runelite/api/queries/ActorQuery.java new file mode 100644 index 0000000000..d12e61c126 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/queries/ActorQuery.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2017, Devin French + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api.queries; + +import net.runelite.api.Actor; +import net.runelite.api.Point; +import net.runelite.api.Query; + +public abstract class ActorQuery extends Query +{ + @SuppressWarnings("unchecked") + public QueryType nameEquals(String... names) + { + predicate = and(actor -> + { + for (String name : names) + { + String actorName = actor.getName(); + if (actorName != null && actorName.equals(name)) + { + return true; + } + } + return false; + }); + return (QueryType) this; + } + + @SuppressWarnings("unchecked") + public QueryType nameContains(String... names) + { + predicate = and(actor -> + { + for (String name : names) + { + String actorName = actor.getName(); + if (actorName != null && actorName.contains(name)) + { + return true; + } + } + return false; + }); + return (QueryType) this; + } + + @SuppressWarnings("unchecked") + public QueryType atLocalLocation(Point location) + { + predicate = and(actor -> actor.getLocalLocation().equals(location)); + return (QueryType) this; + } + + @SuppressWarnings("unchecked") + public QueryType isLevel(int level) + { + predicate = and(actor -> actor.getCombatLevel() == level); + return (QueryType) this; + } + + @SuppressWarnings("unchecked") + public QueryType animationEquals(int animation) + { + predicate = and(actor -> actor.getAnimation() == animation); + return (QueryType) this; + } + + @SuppressWarnings("unchecked") + public QueryType isInteractingWith(Actor actor) + { + predicate = and(a -> a.getInteracting().equals(a)); + return (QueryType) this; + } +} diff --git a/runelite-api/src/main/java/net/runelite/api/queries/NPCQuery.java b/runelite-api/src/main/java/net/runelite/api/queries/NPCQuery.java new file mode 100644 index 0000000000..0601ca84eb --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/queries/NPCQuery.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2017, Devin French + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api.queries; + +import net.runelite.api.Client; +import net.runelite.api.NPC; + +import java.util.Arrays; +import java.util.Objects; + +public class NPCQuery extends ActorQuery +{ + @Override + protected NPC[] result(Client client) + { + return Arrays.stream(client.getNpcs()) + .filter(Objects::nonNull) + .filter(predicate) + .toArray(NPC[]::new); + } +} diff --git a/runelite-api/src/main/java/net/runelite/api/queries/PlayerQuery.java b/runelite-api/src/main/java/net/runelite/api/queries/PlayerQuery.java new file mode 100644 index 0000000000..a375cf8dd7 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/queries/PlayerQuery.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2017, Devin French + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api.queries; + +import net.runelite.api.Client; +import net.runelite.api.Player; + +import java.util.Arrays; +import java.util.Objects; + +public class PlayerQuery extends ActorQuery +{ + @Override + protected Player[] result(Client client) + { + return Arrays.stream(client.getPlayers()) + .filter(Objects::nonNull) + .filter(predicate) + .toArray(Player[]::new); + } +} diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java index fac06fb052..12862c82df 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java @@ -109,7 +109,7 @@ public class Widget public String getText() { - return widget.getText(); + return widget.getText().replace('\u00A0', ' '); } public void setText(String text) @@ -124,7 +124,7 @@ public class Widget public String getName() { - return widget.getName(); + return widget.getName().replace('\u00A0', ' '); } public int getModelId()