Nothing important

This commit is contained in:
tanyaofei 2024-08-12 11:46:03 +08:00
parent a00b1d22b9
commit 640ef370b3
19 changed files with 195 additions and 155 deletions

View File

@ -1,9 +1,13 @@
package io.github.hello09x.fakeplayer.core;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import io.github.hello09x.fakeplayer.api.spi.NMSBridge;
import io.github.hello09x.fakeplayer.core.manager.invsee.DefaultInvseeImpl;
import io.github.hello09x.fakeplayer.core.manager.invsee.Invsee;
import io.github.hello09x.fakeplayer.core.manager.FakeplayerList;
import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager;
import io.github.hello09x.fakeplayer.core.manager.invsee.DefaultInvseeManagerImpl;
import io.github.hello09x.fakeplayer.core.manager.invsee.InvseeManager;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
@ -14,10 +18,16 @@ public class FakeplayerModule extends AbstractModule {
@Override
protected void configure() {
super.bind(Plugin.class).toInstance(Main.getInstance());
super.bind(NMSBridge.class).toInstance(this.nmsBridge());
super.bind(Invsee.class).to(DefaultInvseeImpl.class);
}
@Provides
@Singleton
public InvseeManager invseeManager(FakeplayerManager fakeplayerManager, FakeplayerList fakeplayerList) {
return new DefaultInvseeManagerImpl(fakeplayerManager, fakeplayerList);
}
@Provides
@Singleton
private NMSBridge nmsBridge() {
var bridge = ServiceLoader
.load(NMSBridge.class, NMSBridge.class.getClassLoader())

View File

@ -14,10 +14,9 @@ import io.github.hello09x.fakeplayer.core.listener.FakeplayerLifecycleListener;
import io.github.hello09x.fakeplayer.core.listener.FakeplayerListener;
import io.github.hello09x.fakeplayer.core.listener.PlayerListener;
import io.github.hello09x.fakeplayer.core.manager.FakeplayerAutofishManager;
import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager;
import io.github.hello09x.fakeplayer.core.manager.FakeplayerReplenishManager;
import io.github.hello09x.fakeplayer.core.manager.WildFakeplayerManager;
import io.github.hello09x.fakeplayer.core.repository.UsedIdRepository;
import io.github.hello09x.fakeplayer.core.manager.invsee.InvseeManager;
import io.github.hello09x.fakeplayer.core.util.update.UpdateChecker;
import lombok.Getter;
import org.bukkit.plugin.java.JavaPlugin;
@ -66,6 +65,7 @@ public final class Main extends JavaPlugin {
manager.registerEvents(injector.getInstance(FakeplayerListener.class), this);
manager.registerEvents(injector.getInstance(FakeplayerAutofishManager.class), this);
manager.registerEvents(injector.getInstance(FakeplayerReplenishManager.class), this);
manager.registerEvents(injector.getInstance(InvseeManager.class), this);
}
if (injector.getInstance(FakeplayerConfig.class).isCheckForUpdates()) {
@ -106,10 +106,6 @@ public final class Main extends JavaPlugin {
@Override
public void onDisable() {
{
Exceptions.suppress(this, () -> injector.getInstance(FakeplayerManager.class).onDisable());
Exceptions.suppress(this, () -> injector.getInstance(UsedIdRepository.class).onDisable());
}
{
Exceptions.suppress(this, () -> {
var messenger = getServer().getMessenger();

View File

@ -119,7 +119,7 @@ public class CommandRegistry {
.withPermission(Permission.kill)
.withShortDescription("fakeplayer.command.kill.description")
.withRequirement(CommandSupports::hasFakeplayer)
.withOptionalArguments(targets("names"))
.withOptionalArguments(fakeplayers("names"))
.executes(killCommand::kill),
command("list")
.withPermission(Permission.list)

View File

@ -37,22 +37,26 @@ public abstract class CommandSupports {
public static @NotNull CommandAPICommand[] newActionCommands(@NotNull ActionType action) {
return new CommandAPICommand[]{
command("once")
.withShortDescription("fakeplayer.command.action.once")
.withOptionalArguments(fakeplayer("name"))
.executes(actionCommand.action(action, ActionSetting.once())),
command("continuous")
.withShortDescription("fakeplayer.command.action.continuous")
.withOptionalArguments(fakeplayer("name"))
.executes(actionCommand.action(action, ActionSetting.continuous())),
command("stop")
.withOptionalArguments(fakeplayer("name"))
.executes(actionCommand.action(action, ActionSetting.stop())),
command("interval")
.withShortDescription("fakeplayer.command.action.interval")
.withOptionalArguments(
int32("interval", 1),
int32("ticks", 1),
fakeplayer("name"))
.executes((sender, args) -> {
int interval = (int) args.getOptional("interval").orElse(1);
int interval = (int) args.getOptional("ticks").orElse(1);
actionCommand.action(sender, args, action, ActionSetting.interval(interval));
})
}),
command("stop")
.withShortDescription("fakeplayer.command.action.stop")
.withOptionalArguments(fakeplayer("name"))
.executes(actionCommand.action(action, ActionSetting.stop()))
};
}
@ -88,7 +92,7 @@ public abstract class CommandSupports {
return fakeplayer(nodeName, null);
}
public static @NotNull Argument<List<Player>> targets(@NotNull String nodeName) {
public static @NotNull Argument<List<Player>> fakeplayers(@NotNull String nodeName) {
return new CustomArgument<List<Player>, String>(new StringArgument(nodeName), info -> {
var sender = info.sender();
var arg = info.currentInput();
@ -174,7 +178,7 @@ public abstract class CommandSupports {
}
public static boolean isCmdAvailable(@NotNull CommandSender sender) {
return hasFakeplayer(sender) && (sender.hasPermission(Permission.cmd) || !config.getAllowCommands().isEmpty());
return (sender.hasPermission(Permission.cmd) || !config.getAllowCommands().isEmpty()) && hasFakeplayer(sender);
}
}

View File

@ -1,11 +1,13 @@
package io.github.hello09x.fakeplayer.core.command.impl;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import dev.jorel.commandapi.CommandAPI;
import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException;
import dev.jorel.commandapi.executors.CommandArguments;
import io.github.hello09x.devtools.core.translation.TranslatorUtils;
import io.github.hello09x.devtools.core.utils.ComponentUtils;
import io.github.hello09x.fakeplayer.core.manager.invsee.InvseeManager;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@ -16,6 +18,12 @@ import static net.kyori.adventure.text.Component.translatable;
@Singleton
public class InvseeCommand extends AbstractCommand {
private final InvseeManager invseeManager;
@Inject
public InvseeCommand(InvseeManager invseeManager) {
this.invseeManager = invseeManager;
}
/**
* 查看背包
@ -28,7 +36,7 @@ public class InvseeCommand extends AbstractCommand {
TranslatorUtils.getLocale(sender)
));
}
manager.openInventory(sender, fake);
invseeManager.invsee(sender, fake);
}
}

View File

@ -5,6 +5,7 @@ import dev.jorel.commandapi.executors.CommandExecutor;
import io.github.hello09x.fakeplayer.core.Main;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import org.jetbrains.annotations.Range;
import java.util.HashMap;
import java.util.Map;
@ -18,7 +19,7 @@ public class MoveCommand extends AbstractCommand {
/**
* 假人移动
*/
public CommandExecutor move(float forward, float strafing) {
public CommandExecutor move(@Range(from = 0, to = 1) float forward, @Range(from = 0, to = 1) float strafing) {
return (sender, args) -> {
var fake = getFakeplayer(sender, args);
var handle = bridge.fromPlayer(fake);

View File

@ -3,6 +3,7 @@ package io.github.hello09x.fakeplayer.core.listener;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import io.github.hello09x.devtools.core.utils.ComponentUtils;
import io.github.hello09x.devtools.core.utils.Exceptions;
import io.github.hello09x.devtools.core.utils.MetadataUtils;
import io.github.hello09x.fakeplayer.core.Main;
import io.github.hello09x.fakeplayer.core.config.FakeplayerConfig;
@ -21,6 +22,7 @@ import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.server.PluginDisableEvent;
import org.bukkit.metadata.MetadataValue;
import org.jetbrains.annotations.NotNull;
@ -159,4 +161,12 @@ public class FakeplayerListener implements Listener {
}
}
@EventHandler
public void onPluginDisable(@NotNull PluginDisableEvent event) {
if (event.getPlugin() == Main.getInstance()) {
Exceptions.suppress(Main.getInstance(), manager::onDisable);
Exceptions.suppress(Main.getInstance(), usedIdRepository::onDisable);
}
}
}

View File

@ -7,9 +7,6 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.jetbrains.annotations.NotNull;
@ -44,31 +41,4 @@ public class PlayerListener implements Listener {
}
}
/**
* 右键假人打开其背包
*/
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void invsee(@NotNull PlayerInteractAtEntityEvent event) {
if (!(event.getRightClicked() instanceof Player target) || manager.isNotFake(target)) {
return;
}
manager.openInventory(event.getPlayer(), target);
}
/**
* 客户端操作假人背包时(将假人的背包物品移动到玩家背包时)的时候如果是拖拽的, 会被处理成放置到假人的盔甲栏上
*/
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void onDragInventory(@NotNull InventoryDragEvent event) {
var top = event.getView().getTopInventory();
if (top.getType() == InventoryType.PLAYER && top.getHolder() instanceof Player player && manager.isFake(player)) {
if (event.getNewItems().keySet().stream().anyMatch(slot -> slot > 35)) { // > 35 表示从假人背包移动到玩家背包
event.setCancelled(true);
}
}
}
}

View File

@ -13,7 +13,6 @@ import io.github.hello09x.fakeplayer.core.config.FakeplayerConfig;
import io.github.hello09x.fakeplayer.core.constant.MetadataKeys;
import io.github.hello09x.fakeplayer.core.entity.Fakeplayer;
import io.github.hello09x.fakeplayer.core.entity.SpawnOption;
import io.github.hello09x.fakeplayer.core.manager.invsee.Invsee;
import io.github.hello09x.fakeplayer.core.manager.naming.NameManager;
import io.github.hello09x.fakeplayer.core.repository.model.Config;
import io.github.hello09x.fakeplayer.core.util.AddressUtils;
@ -21,8 +20,6 @@ import io.github.hello09x.fakeplayer.core.util.Commands;
import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Sound;
import org.bukkit.SoundCategory;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.metadata.FixedMetadataValue;
@ -51,7 +48,6 @@ public class FakeplayerManager {
public final static String REMOVAL_REASON_PREFIX = "[fakeplayer] ";
private final static Logger log = Main.getInstance().getLogger();
private final Invsee invsee;
private final NameManager nameManager;
private final FakeplayerList playerList;
@ -61,8 +57,7 @@ public class FakeplayerManager {
private final ScheduledExecutorService lagMonitor;
@Inject
public FakeplayerManager(Invsee invsee, NameManager nameManager, FakeplayerList playerList, UserConfigManager configManager, NMSBridge nms, FakeplayerConfig config) {
this.invsee = invsee;
public FakeplayerManager(NameManager nameManager, FakeplayerList playerList, UserConfigManager configManager, NMSBridge nms, FakeplayerConfig config) {
this.nameManager = nameManager;
this.playerList = playerList;
this.configManager = configManager;
@ -461,28 +456,6 @@ public class FakeplayerManager {
}
}
/**
* 让玩家打开假人背包
*
* @param viewer 玩家
* @param target 假人
* @return 是否打开成功
*/
public boolean openInventory(@NotNull Player viewer, @NotNull Player target) {
var fp = this.playerList.getByName(target.getName());
if (fp == null) {
return false;
}
if (!viewer.isOp() && !fp.isCreatedBy(viewer)) {
return false;
}
this.invsee.openInventory(viewer, target);
var pos = target.getLocation();
pos.getWorld().playSound(pos, Sound.BLOCK_CHEST_OPEN, SoundCategory.BLOCKS, 0.3f, 1.0f);
return true;
}
/**
* 检测限制, 不满足条件则抛出异常
*

View File

@ -1,42 +0,0 @@
package io.github.hello09x.fakeplayer.core.manager.invsee;
import io.github.hello09x.devtools.core.translation.PluginTranslator;
import io.github.hello09x.devtools.core.translation.TranslatorUtils;
import io.github.hello09x.devtools.core.utils.ComponentUtils;
import io.github.hello09x.devtools.core.utils.SingletonSupplier;
import io.github.hello09x.fakeplayer.core.Main;
import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager;
import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryView;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Optional;
import static net.kyori.adventure.text.Component.text;
import static net.kyori.adventure.text.Component.translatable;
public abstract class AbstractInvsee implements Invsee {
protected final PluginTranslator translator;
protected final static SingletonSupplier<FakeplayerManager> manager = new SingletonSupplier<>(() -> Main.getInjector().getInstance(FakeplayerManager.class));
protected AbstractInvsee(PluginTranslator translator) {
this.translator = translator;
}
protected void setTitle(@Nullable InventoryView view, @NotNull Player owner) {
if (view == null) {
return;
}
var locale = Optional.ofNullable(manager.get().getCreator(owner)).map(TranslatorUtils::getLocale).orElseGet(() -> TranslatorUtils.getDefaultLocale(Main.getInstance()));
view.setTitle(ComponentUtils.toString(translatable(
"fakeplayer.manager.inventory.title",
text(owner.getName())
), locale));
}
}

View File

@ -0,0 +1,81 @@
package io.github.hello09x.fakeplayer.core.manager.invsee;
import io.github.hello09x.devtools.core.utils.ComponentUtils;
import io.github.hello09x.fakeplayer.core.manager.FakeplayerList;
import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager;
import org.bukkit.Sound;
import org.bukkit.SoundCategory;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
import org.bukkit.inventory.InventoryView;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static net.kyori.adventure.text.Component.text;
import static net.kyori.adventure.text.Component.translatable;
/**
* @author tanyaofei
* @since 2024/8/12
**/
public abstract class AbstractInvseeManager implements InvseeManager {
protected final FakeplayerManager manager;
protected final FakeplayerList fakeplayerList;
protected AbstractInvseeManager(FakeplayerManager manager, FakeplayerList fakeplayerList) {
this.manager = manager;
this.fakeplayerList = fakeplayerList;
}
@Override
public boolean invsee(@NotNull Player viewer, @NotNull Player whom) {
var fp = fakeplayerList.getByUUID(whom.getUniqueId());
if (fp == null) {
return false;
}
if (!viewer.isOp() && !fp.isCreatedBy(viewer)) {
return false;
}
var view = this.openInventory(viewer, whom);
if (view == null) {
return false;
}
whom.getLocation().getWorld().playSound(
whom.getLocation(),
Sound.BLOCK_CHEST_OPEN,
SoundCategory.BLOCKS,
0.3F, 1.0F
);
view.setTitle(ComponentUtils.toString(translatable(
"fakeplayer.manager.inventory.title",
text(whom.getName())
), viewer.locale()));
return true;
}
protected abstract @Nullable InventoryView openInventory(@NotNull Player viewer, @NotNull Player whom);
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
public void rightClickToInvsee(@NotNull PlayerInteractAtEntityEvent event) {
if (!((event.getRightClicked()) instanceof Player whom)) {
return;
}
this.invsee(event.getPlayer(), whom); // fakeplayer check here
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void fixDragInventory(@NotNull InventoryDragEvent event) {
var top = event.getView().getTopInventory();
if (top.getType() == InventoryType.PLAYER && top.getHolder() instanceof Player whom && manager.isFake(whom)) {
if (event.getNewItems().keySet().stream().anyMatch(slot -> slot > 35)) { // > 35 表示从假人背包拖动到玩家背包, 这种操作会出现问题
event.setCancelled(true);
}
}
}
}

View File

@ -1,23 +0,0 @@
package io.github.hello09x.fakeplayer.core.manager.invsee;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import io.github.hello09x.devtools.core.translation.PluginTranslator;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@Singleton
public class DefaultInvseeImpl extends AbstractInvsee {
@Inject
public DefaultInvseeImpl(PluginTranslator translator) {
super(translator);
}
@Override
public void openInventory(@NotNull Player visitor, @NotNull Player visited) {
var view = visitor.openInventory(visited.getInventory());
super.setTitle(view, visited);
}
}

View File

@ -0,0 +1,32 @@
package io.github.hello09x.fakeplayer.core.manager.invsee;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import io.github.hello09x.fakeplayer.core.manager.FakeplayerList;
import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager;
import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryView;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* 默认实现, 无法看到装备栏
*
* @author tanyaofei
* @since 2024/8/12
**/
@Singleton
public class DefaultInvseeManagerImpl extends AbstractInvseeManager {
@Inject
public DefaultInvseeManagerImpl(FakeplayerManager manager, FakeplayerList fakeplayerList) {
super(manager, fakeplayerList);
}
@Override
protected @Nullable InventoryView openInventory(@NotNull Player viewer, @NotNull Player whom) {
return viewer.openInventory(whom.getInventory());
}
}

View File

@ -1,11 +0,0 @@
package io.github.hello09x.fakeplayer.core.manager.invsee;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public interface Invsee {
void openInventory(@NotNull Player visitor, @NotNull Player visited);
}

View File

@ -0,0 +1,15 @@
package io.github.hello09x.fakeplayer.core.manager.invsee;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.jetbrains.annotations.NotNull;
/**
* @author tanyaofei
* @since 2024/8/12
**/
public interface InvseeManager extends Listener {
boolean invsee(@NotNull Player viewer, @NotNull Player whom);
}

View File

@ -6,6 +6,10 @@ fakeplayer.action.jump=jumping
fakeplayer.action.look-at-entity=looking at nearby entities
fakeplayer.action.mine=digging
fakeplayer.action.use=using item or interacting
fakeplayer.command.action.continuous=Do it every tick
fakeplayer.command.action.interval=Do it every specified ticks
fakeplayer.command.action.once=Do it once
fakeplayer.command.action.stop=Stop
fakeplayer.command.attack.description=Attack entity
fakeplayer.command.cmd.description=Execute command
fakeplayer.command.cmd.error.execute-failed=Failed to execute the command. Please check whether the command is correct or whether the fake player has permission

View File

@ -6,6 +6,10 @@ fakeplayer.action.jump=\u8DF3\u8DC3
fakeplayer.action.look-at-entity=\u770B\u5411\u9644\u8FD1\u5B9E\u4F53
fakeplayer.action.mine=\u6316\u6398
fakeplayer.action.use=\u4F7F\u7528\u7269\u54C1\u6216\u4EA4\u4E92
fakeplayer.command.action.continuous=\u6BCF 1 tick \u6267\u884C\u4E00\u6B21
fakeplayer.command.action.interval=\u6307\u5B9A\u95F4\u9694\u6267\u884C
fakeplayer.command.action.once=\u6267\u884C\u4E00\u6B21
fakeplayer.command.action.stop=\u505C\u6B62
fakeplayer.command.attack.description=\u653B\u51FB
fakeplayer.command.cmd.description=\u6267\u884C\u547D\u4EE4
fakeplayer.command.cmd.error.execute-failed=\u6267\u884C\u547D\u4EE4\u5931\u8D25, \u8BF7\u68C0\u67E5\u547D\u4EE4\u662F\u5426\u6B63\u786E\u6216\u5047\u4EBA\u662F\u5426\u6709\u6743\u9650

View File

@ -6,6 +6,10 @@ fakeplayer.action.jump=\u8DF3\u8E8D
fakeplayer.action.look-at-entity=\u7747\u5411\u9644\u8FD1\u5BE6\u9AD4
fakeplayer.action.mine=\u6316\u6398
fakeplayer.action.use=\u4F7F\u7528\u7269\u54C1\u6216\u4EA4\u4E92
fakeplayer.command.action.continuous=\u6BCF 1 tick \u57F7\u884C\u4E00\u6B21
fakeplayer.command.action.interval=\u6307\u5B9A\u9593\u9694\u57F7\u884C
fakeplayer.command.action.once=\u57F7\u884C\u4E00\u6B21
fakeplayer.command.action.stop=\u505C\u6B62
fakeplayer.command.attack.description=\u653B\u64CA
fakeplayer.command.cmd.description=\u57F7\u884C\u6307\u4EE4
fakeplayer.command.cmd.error.execute-failed=\u57F7\u884C\u6307\u4EE4\u5931\u6557, \u8ACB\u6AA2\u67E5\u6307\u4EE4\u662F\u5426\u6B63\u78BA\u6216\u8005\u5047\u4EBA\u6709\u5187\u6B0A\u9650

View File

@ -6,6 +6,10 @@ fakeplayer.action.jump=\u8DF3\u8E8D
fakeplayer.action.look-at-entity=\u770B\u5411\u9644\u8FD1\u5BE6\u9AD4
fakeplayer.action.mine=\u6316\u6398
fakeplayer.action.use=\u4F7F\u7528\u7269\u54C1\u6216\u4EA4\u4E92
fakeplayer.command.action.continuous=\u6BCF 1 tick \u57F7\u884C\u4E00\u6B21
fakeplayer.command.action.interval=\u6307\u5B9A\u9593\u9694\u57F7\u884C
fakeplayer.command.action.once=\u57F7\u884C\u4E00\u6B21
fakeplayer.command.action.stop=\u505C\u6B62
fakeplayer.command.attack.description=\u653B\u64CA
fakeplayer.command.cmd.description=\u57F7\u884C\u547D\u4EE4
fakeplayer.command.cmd.error.execute-failed=\u57F7\u884C\u547D\u4EE4\u5931\u6557, \u8ACB\u6AA2\u67E5\u547D\u4EE4\u662F\u5426\u6B63\u78BA\u6216\u5047\u4EBA\u662F\u5426\u6709\u6B0A\u9650