Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Interaction system #140

Merged
merged 39 commits into from
Sep 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
1f8e89a
lets go
OliverSchlueter Jul 18, 2024
8d1e593
Remove old playerCommand, serverCommand and message
OliverSchlueter Jul 18, 2024
e4a6ae7
move interactiontype enum
OliverSchlueter Jul 18, 2024
36e80f3
action trigger
OliverSchlueter Jul 18, 2024
a2b63bc
setup commands
OliverSchlueter Jul 26, 2024
4e9daf9
private constructor instead of enum
OliverSchlueter Jul 28, 2024
2fadd1e
add command and more
OliverSchlueter Aug 1, 2024
c64448b
more commands
OliverSchlueter Aug 1, 2024
5a78a30
saving & loading
OliverSchlueter Aug 1, 2024
36abc73
fix saving & loading
OliverSchlueter Aug 1, 2024
aee6664
test
OliverSchlueter Aug 3, 2024
7164089
maybe now?
OliverSchlueter Aug 3, 2024
863d156
Add wait action
OliverSchlueter Aug 29, 2024
8ce9276
Add javadocs
OliverSchlueter Aug 29, 2024
7f2e775
Add checks to actions
OliverSchlueter Aug 29, 2024
b7bc0e0
Move default actions
OliverSchlueter Aug 29, 2024
14ffbe9
Add ExecuteRandomActionAction
OliverSchlueter Aug 29, 2024
d54f737
add action executor and ActionExecutionContext
OliverSchlueter Aug 30, 2024
046e80c
fix running actions
OliverSchlueter Aug 30, 2024
b42c708
fix ExecuteRandomActionAction
OliverSchlueter Aug 30, 2024
a279bfd
add docs
OliverSchlueter Aug 30, 2024
16ffcd3
remove send_randomly subcommand
OliverSchlueter Aug 30, 2024
7f142ce
add addBefore and addAfter
OliverSchlueter Sep 15, 2024
40ebac9
remove message, playercommand and servercommand messages
OliverSchlueter Sep 15, 2024
0e85c41
fix action saving
OliverSchlueter Sep 15, 2024
17dfadb
add moveUp and moveDown
OliverSchlueter Sep 15, 2024
f6ac812
Update version to 2.2.2-NIS
OliverSchlueter Sep 15, 2024
724f97a
Add player_command_as_op action
OliverSchlueter Sep 15, 2024
725fa28
Catch errors in actions
OliverSchlueter Sep 15, 2024
cb358ea
Add amount_npc_actions metric
OliverSchlueter Sep 15, 2024
b391bd7
Update version to 2.2.2-NIS2
OliverSchlueter Sep 15, 2024
69d7c72
fix fflags cmd
OliverSchlueter Sep 15, 2024
623ede9
fix migrating server commands to console command action
OliverSchlueter Sep 16, 2024
db23897
dont add empty list
OliverSchlueter Sep 16, 2024
3b6640c
add any_click trigger
OliverSchlueter Sep 16, 2024
d07746e
add migration for sendMessagesRandomly
OliverSchlueter Sep 16, 2024
e7acdb0
update version to 2.2.2-NIS3 (I forgot)
OliverSchlueter Sep 17, 2024
d94f4fb
Add oob checks
OliverSchlueter Sep 19, 2024
e1575f6
remove old messages
OliverSchlueter Sep 22, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ dependencies {
compileOnly("io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT")

compileOnly("de.oliver:FancyLib:${findProperty("fancyLibVersion")}")
compileOnly("de.oliver.FancyAnalytics:logger:${findProperty("fancyLoggerVersion")}")

implementation("me.dave:ChatColorHandler:${findProperty("chatcolorhandlerVersion")}")
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
package de.oliver.fancynpcs.api;

import de.oliver.fancyanalytics.logger.ExtendedFancyLogger;
import de.oliver.fancylib.serverSoftware.schedulers.FancyScheduler;
import de.oliver.fancylib.translations.Translator;
import de.oliver.fancynpcs.api.actions.ActionManager;
import de.oliver.fancynpcs.api.utils.SkinCache;
import org.bukkit.Bukkit;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.concurrent.ScheduledExecutorService;
import java.util.function.Function;
import java.util.logging.Logger;

public interface FancyNpcsPlugin {

Expand All @@ -24,6 +27,10 @@ static FancyNpcsPlugin get() {

JavaPlugin getPlugin();

Logger getLogger();

ExtendedFancyLogger getFancyLogger();

ScheduledExecutorService getNpcThread();

FancyScheduler getScheduler();
Expand All @@ -36,6 +43,8 @@ static FancyNpcsPlugin get() {

AttributeManager getAttributeManager();

ActionManager getActionManager();

Translator getTranslator();

SkinCache getSkinCache();
Expand Down
65 changes: 10 additions & 55 deletions api/src/main/java/de/oliver/fancynpcs/api/Npc.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
package de.oliver.fancynpcs.api;

import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import de.oliver.fancylib.RandomUtils;
import de.oliver.fancylib.translations.Translator;
import de.oliver.fancynpcs.api.actions.ActionTrigger;
import de.oliver.fancynpcs.api.actions.NpcAction;
import de.oliver.fancynpcs.api.actions.executor.ActionExecutionContext;
import de.oliver.fancynpcs.api.actions.executor.ActionExecutor;
import de.oliver.fancynpcs.api.events.NpcInteractEvent;
import de.oliver.fancynpcs.api.events.NpcInteractEvent.InteractionType;
import de.oliver.fancynpcs.api.utils.Interval;
import de.oliver.fancynpcs.api.utils.Interval.Unit;
import me.dave.chatcolorhandler.ChatColorHandler;
import me.dave.chatcolorhandler.ModernChatColorHandler;
import me.dave.chatcolorhandler.parsers.custom.PlaceholderAPIParser;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
Expand All @@ -19,7 +17,6 @@

import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

Expand Down Expand Up @@ -144,10 +141,10 @@ public void moveForAll() {
}

public void interact(Player player) {
interact(player, InteractionType.CUSTOM);
interact(player, ActionTrigger.CUSTOM);
}

public void interact(Player player, InteractionType interactionType) {
public void interact(Player player, ActionTrigger actionTrigger) {
if (data.getInteractionCooldown() > 0) {
final long interactionCooldownMillis = (long) (data.getInteractionCooldown() * 1000);
final long lastInteractionMillis = lastPlayerInteraction.getOrDefault(player.getUniqueId(), 0L);
Expand All @@ -163,7 +160,8 @@ public void interact(Player player, InteractionType interactionType) {
lastPlayerInteraction.put(player.getUniqueId(), System.currentTimeMillis());
}

NpcInteractEvent npcInteractEvent = new NpcInteractEvent(this, data.getPlayerCommands(), data.getServerCommands(), data.getOnClick(), player, interactionType);
List<NpcAction.NpcActionData> actions = data.getActions(actionTrigger);
NpcInteractEvent npcInteractEvent = new NpcInteractEvent(this, data.getOnClick(), actions, player, actionTrigger);
npcInteractEvent.callEvent();

if (npcInteractEvent.isCancelled()) {
Expand All @@ -175,51 +173,8 @@ public void interact(Player player, InteractionType interactionType) {
data.getOnClick().accept(player);
}

// message
if (data.getMessages() != null && !data.getMessages().isEmpty()) {
if (data.isSendMessagesRandomly()) {
String randomMessage = data.getMessages().get(new Random().nextInt(data.getMessages().size()));
player.sendMessage(ModernChatColorHandler.translate(randomMessage, player));
} else {
for (String msg : data.getMessages()) {
player.sendMessage(ModernChatColorHandler.translate(msg, player));
}
}
}

// serverCommand
for (String command : data.getServerCommands()) {
command = command.replace("{player}", player.getName());

String finalCommand = ChatColorHandler.translate(command, player, List.of(PlaceholderAPIParser.class));
FancyNpcsPlugin.get().getScheduler().runTask(null, () -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), finalCommand));
}

// playerCommand
if (data.getPlayerCommands() != null && !data.getPlayerCommands().isEmpty()) {
for (String cmd : data.getPlayerCommands()) {
String command = ChatColorHandler.translate(cmd, player, List.of(PlaceholderAPIParser.class));

if (command.toLowerCase().startsWith("server")) {
String[] args = cmd.split(" ");
if (args.length < 2) {
return;
}
String server = args[1];

ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("Connect");
out.writeUTF(server);
player.sendPluginMessage(FancyNpcsPlugin.get().getPlugin(), "BungeeCord", out.toByteArray());
return;
}

FancyNpcsPlugin.get().getScheduler().runTask(
player.getLocation(),
() -> player.chat("/" + command)
);
}
}
// actions
ActionExecutor.execute(new ActionExecutionContext(actionTrigger, this, player));
}

protected abstract void refreshEntityData(Player serverPlayer);
Expand Down
96 changes: 29 additions & 67 deletions api/src/main/java/de/oliver/fancynpcs/api/NpcData.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package de.oliver.fancynpcs.api;

import de.oliver.fancynpcs.api.actions.ActionTrigger;
import de.oliver.fancynpcs.api.actions.NpcAction;
import de.oliver.fancynpcs.api.utils.NpcEquipmentSlot;
import de.oliver.fancynpcs.api.utils.SkinFetcher;
import net.kyori.adventure.text.format.NamedTextColor;
Expand All @@ -9,6 +11,7 @@
import org.bukkit.inventory.ItemStack;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;

public class NpcData {
Expand All @@ -28,11 +31,8 @@ public class NpcData {
private EntityType type;
private Map<NpcEquipmentSlot, ItemStack> equipment;
private Consumer<Player> onClick;
private Map<ActionTrigger, List<NpcAction.NpcActionData>> actions;
private boolean turnToPlayer;
private List<String> playerCommands;
private List<String> serverCommands;
private List<String> messages;
private boolean sendMessagesRandomly;
private float interactionCooldown;
private float scale;
private Map<NpcAttribute, String> attributes;
Expand All @@ -54,10 +54,7 @@ public NpcData(
Map<NpcEquipmentSlot, ItemStack> equipment,
boolean turnToPlayer,
Consumer<Player> onClick,
List<String> messages,
boolean sendMessagesRandomly,
List<String> serverCommands,
List<String> playerCommands,
Map<ActionTrigger, List<NpcAction.NpcActionData>> actions,
float interactionCooldown,
float scale,
Map<NpcAttribute, String> attributes,
Expand All @@ -77,11 +74,8 @@ public NpcData(
this.type = type;
this.equipment = equipment;
this.onClick = onClick;
this.actions = actions;
this.turnToPlayer = turnToPlayer;
this.serverCommands = serverCommands;
this.playerCommands = playerCommands;
this.messages = messages;
this.sendMessagesRandomly = sendMessagesRandomly;
this.interactionCooldown = interactionCooldown;
this.scale = scale;
this.attributes = attributes;
Expand All @@ -106,11 +100,8 @@ public NpcData(String name, UUID creator, Location location) {
this.glowingColor = NamedTextColor.WHITE;
this.onClick = p -> {
};
this.actions = new ConcurrentHashMap<>();
this.turnToPlayer = false;
this.messages = new ArrayList<>();
this.serverCommands = new ArrayList<>();
this.playerCommands = new ArrayList<>();
this.sendMessagesRandomly = false;
this.interactionCooldown = 0;
this.scale = 1;
this.equipment = new HashMap<>();
Expand Down Expand Up @@ -248,81 +239,52 @@ public NpcData setOnClick(Consumer<Player> onClick) {
return this;
}

public boolean isTurnToPlayer() {
return turnToPlayer;
public Map<ActionTrigger, List<NpcAction.NpcActionData>> getActions() {
return actions;
}

public NpcData setTurnToPlayer(boolean turnToPlayer) {
this.turnToPlayer = turnToPlayer;
public NpcData setActions(Map<ActionTrigger, List<NpcAction.NpcActionData>> actions) {
this.actions = actions;
isDirty = true;
return this;
}

public List<String> getServerCommands() {
return serverCommands;
public List<NpcAction.NpcActionData> getActions(ActionTrigger trigger) {
return actions.getOrDefault(trigger, new ArrayList<>());
}

public NpcData setServerCommands(List<String> serverCommands) {
this.serverCommands = serverCommands;
public NpcData setActions(ActionTrigger trigger, List<NpcAction.NpcActionData> actions) {
this.actions.put(trigger, actions);
isDirty = true;
return this;
}

public void addServerCommand(String command) {
serverCommands.add(command);
isDirty = true;
}
public NpcData addAction(ActionTrigger trigger, int order, NpcAction action, String value) {
List<NpcAction.NpcActionData> a = actions.getOrDefault(trigger, new ArrayList<>());
a.add(new NpcAction.NpcActionData(order, action, value));
actions.put(trigger, a);

public void removeServerCommand(int index) {
serverCommands.remove(index);
isDirty = true;
}

public List<String> getPlayerCommands() {
return playerCommands;
}

public NpcData setPlayerCommands(List<String> playerCommands) {
this.playerCommands = playerCommands;
isDirty = true;
return this;
}

public List<String> getMessages() {
return messages;
}

public NpcData setMessages(List<String> messages) {
this.messages = messages;
return this;
}
public NpcData removeAction(ActionTrigger trigger, NpcAction action) {
List<NpcAction.NpcActionData> a = actions.getOrDefault(trigger, new ArrayList<>());
a.removeIf(ad -> ad.action().equals(action));
actions.put(trigger, a);

public void addPlayerCommand(String command) {
playerCommands.add(command);
isDirty = true;
return this;
}

public void removePlayerCommand(int index) {
playerCommands.remove(index);
isDirty = true;
}

public boolean isSendMessagesRandomly() {
return sendMessagesRandomly;
}

public void setSendMessagesRandomly(boolean sendMessagesRandomly) {
this.sendMessagesRandomly = sendMessagesRandomly;
}

public void addMessage(String message) {
messages.add(message);
isDirty = true;
public boolean isTurnToPlayer() {
return turnToPlayer;
}

public void removeMessage(int index) {
messages.remove(index);
public NpcData setTurnToPlayer(boolean turnToPlayer) {
this.turnToPlayer = turnToPlayer;
isDirty = true;
return this;
}

public float getInteractionCooldown() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package de.oliver.fancynpcs.api.actions;

import java.util.List;

public interface ActionManager {

void registerAction(NpcAction action);

NpcAction getActionByName(String name);

void unregisterAction(NpcAction action);

List<NpcAction> getAllActions();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package de.oliver.fancynpcs.api.actions;

public enum ActionTrigger {
/**
* represents any click interaction by a player.
*/
ANY_CLICK,
/**
* represents a left click interaction by a player.
*/
LEFT_CLICK,
/**
* represents a right click interaction by a player.
*/
RIGHT_CLICK,
/**
* represents interactions invoked by the API.
*/
CUSTOM,
;

/**
* Gets the ActionTrigger by its name.
*
* @param name the name of the ActionTrigger
* @return the ActionTrigger or null if not found
*/
public static ActionTrigger getByName(final String name) {
for (ActionTrigger trigger : values()) {
if (trigger.name().equalsIgnoreCase(name)) {
return trigger;
}
}
return null;
}
}
Loading
Loading