mirror of
https://github.com/tanyaofei/minecraft-fakeplayer.git
synced 2025-07-14 05:12:23 +08:00
Nothing important
This commit is contained in:
parent
a00b1d22b9
commit
640ef370b3
@ -1,9 +1,13 @@
|
|||||||
package io.github.hello09x.fakeplayer.core;
|
package io.github.hello09x.fakeplayer.core;
|
||||||
|
|
||||||
import com.google.inject.AbstractModule;
|
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.api.spi.NMSBridge;
|
||||||
import io.github.hello09x.fakeplayer.core.manager.invsee.DefaultInvseeImpl;
|
import io.github.hello09x.fakeplayer.core.manager.FakeplayerList;
|
||||||
import io.github.hello09x.fakeplayer.core.manager.invsee.Invsee;
|
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.Bukkit;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
@ -14,10 +18,16 @@ public class FakeplayerModule extends AbstractModule {
|
|||||||
@Override
|
@Override
|
||||||
protected void configure() {
|
protected void configure() {
|
||||||
super.bind(Plugin.class).toInstance(Main.getInstance());
|
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() {
|
private NMSBridge nmsBridge() {
|
||||||
var bridge = ServiceLoader
|
var bridge = ServiceLoader
|
||||||
.load(NMSBridge.class, NMSBridge.class.getClassLoader())
|
.load(NMSBridge.class, NMSBridge.class.getClassLoader())
|
||||||
|
@ -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.FakeplayerListener;
|
||||||
import io.github.hello09x.fakeplayer.core.listener.PlayerListener;
|
import io.github.hello09x.fakeplayer.core.listener.PlayerListener;
|
||||||
import io.github.hello09x.fakeplayer.core.manager.FakeplayerAutofishManager;
|
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.FakeplayerReplenishManager;
|
||||||
import io.github.hello09x.fakeplayer.core.manager.WildFakeplayerManager;
|
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 io.github.hello09x.fakeplayer.core.util.update.UpdateChecker;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
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(FakeplayerListener.class), this);
|
||||||
manager.registerEvents(injector.getInstance(FakeplayerAutofishManager.class), this);
|
manager.registerEvents(injector.getInstance(FakeplayerAutofishManager.class), this);
|
||||||
manager.registerEvents(injector.getInstance(FakeplayerReplenishManager.class), this);
|
manager.registerEvents(injector.getInstance(FakeplayerReplenishManager.class), this);
|
||||||
|
manager.registerEvents(injector.getInstance(InvseeManager.class), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (injector.getInstance(FakeplayerConfig.class).isCheckForUpdates()) {
|
if (injector.getInstance(FakeplayerConfig.class).isCheckForUpdates()) {
|
||||||
@ -106,10 +106,6 @@ public final class Main extends JavaPlugin {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
{
|
|
||||||
Exceptions.suppress(this, () -> injector.getInstance(FakeplayerManager.class).onDisable());
|
|
||||||
Exceptions.suppress(this, () -> injector.getInstance(UsedIdRepository.class).onDisable());
|
|
||||||
}
|
|
||||||
{
|
{
|
||||||
Exceptions.suppress(this, () -> {
|
Exceptions.suppress(this, () -> {
|
||||||
var messenger = getServer().getMessenger();
|
var messenger = getServer().getMessenger();
|
||||||
|
@ -119,7 +119,7 @@ public class CommandRegistry {
|
|||||||
.withPermission(Permission.kill)
|
.withPermission(Permission.kill)
|
||||||
.withShortDescription("fakeplayer.command.kill.description")
|
.withShortDescription("fakeplayer.command.kill.description")
|
||||||
.withRequirement(CommandSupports::hasFakeplayer)
|
.withRequirement(CommandSupports::hasFakeplayer)
|
||||||
.withOptionalArguments(targets("names"))
|
.withOptionalArguments(fakeplayers("names"))
|
||||||
.executes(killCommand::kill),
|
.executes(killCommand::kill),
|
||||||
command("list")
|
command("list")
|
||||||
.withPermission(Permission.list)
|
.withPermission(Permission.list)
|
||||||
|
@ -37,22 +37,26 @@ public abstract class CommandSupports {
|
|||||||
public static @NotNull CommandAPICommand[] newActionCommands(@NotNull ActionType action) {
|
public static @NotNull CommandAPICommand[] newActionCommands(@NotNull ActionType action) {
|
||||||
return new CommandAPICommand[]{
|
return new CommandAPICommand[]{
|
||||||
command("once")
|
command("once")
|
||||||
|
.withShortDescription("fakeplayer.command.action.once")
|
||||||
.withOptionalArguments(fakeplayer("name"))
|
.withOptionalArguments(fakeplayer("name"))
|
||||||
.executes(actionCommand.action(action, ActionSetting.once())),
|
.executes(actionCommand.action(action, ActionSetting.once())),
|
||||||
command("continuous")
|
command("continuous")
|
||||||
|
.withShortDescription("fakeplayer.command.action.continuous")
|
||||||
.withOptionalArguments(fakeplayer("name"))
|
.withOptionalArguments(fakeplayer("name"))
|
||||||
.executes(actionCommand.action(action, ActionSetting.continuous())),
|
.executes(actionCommand.action(action, ActionSetting.continuous())),
|
||||||
command("stop")
|
|
||||||
.withOptionalArguments(fakeplayer("name"))
|
|
||||||
.executes(actionCommand.action(action, ActionSetting.stop())),
|
|
||||||
command("interval")
|
command("interval")
|
||||||
|
.withShortDescription("fakeplayer.command.action.interval")
|
||||||
.withOptionalArguments(
|
.withOptionalArguments(
|
||||||
int32("interval", 1),
|
int32("ticks", 1),
|
||||||
fakeplayer("name"))
|
fakeplayer("name"))
|
||||||
.executes((sender, args) -> {
|
.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));
|
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);
|
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 -> {
|
return new CustomArgument<List<Player>, String>(new StringArgument(nodeName), info -> {
|
||||||
var sender = info.sender();
|
var sender = info.sender();
|
||||||
var arg = info.currentInput();
|
var arg = info.currentInput();
|
||||||
@ -174,7 +178,7 @@ public abstract class CommandSupports {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isCmdAvailable(@NotNull CommandSender sender) {
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
package io.github.hello09x.fakeplayer.core.command.impl;
|
package io.github.hello09x.fakeplayer.core.command.impl;
|
||||||
|
|
||||||
|
import com.google.inject.Inject;
|
||||||
import com.google.inject.Singleton;
|
import com.google.inject.Singleton;
|
||||||
import dev.jorel.commandapi.CommandAPI;
|
import dev.jorel.commandapi.CommandAPI;
|
||||||
import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException;
|
import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException;
|
||||||
import dev.jorel.commandapi.executors.CommandArguments;
|
import dev.jorel.commandapi.executors.CommandArguments;
|
||||||
import io.github.hello09x.devtools.core.translation.TranslatorUtils;
|
import io.github.hello09x.devtools.core.translation.TranslatorUtils;
|
||||||
import io.github.hello09x.devtools.core.utils.ComponentUtils;
|
import io.github.hello09x.devtools.core.utils.ComponentUtils;
|
||||||
|
import io.github.hello09x.fakeplayer.core.manager.invsee.InvseeManager;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@ -16,6 +18,12 @@ import static net.kyori.adventure.text.Component.translatable;
|
|||||||
@Singleton
|
@Singleton
|
||||||
public class InvseeCommand extends AbstractCommand {
|
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)
|
TranslatorUtils.getLocale(sender)
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
manager.openInventory(sender, fake);
|
invseeManager.invsee(sender, fake);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import dev.jorel.commandapi.executors.CommandExecutor;
|
|||||||
import io.github.hello09x.fakeplayer.core.Main;
|
import io.github.hello09x.fakeplayer.core.Main;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
import org.bukkit.scheduler.BukkitTask;
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
|
import org.jetbrains.annotations.Range;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
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) -> {
|
return (sender, args) -> {
|
||||||
var fake = getFakeplayer(sender, args);
|
var fake = getFakeplayer(sender, args);
|
||||||
var handle = bridge.fromPlayer(fake);
|
var handle = bridge.fromPlayer(fake);
|
||||||
|
@ -3,6 +3,7 @@ package io.github.hello09x.fakeplayer.core.listener;
|
|||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.google.inject.Singleton;
|
import com.google.inject.Singleton;
|
||||||
import io.github.hello09x.devtools.core.utils.ComponentUtils;
|
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.devtools.core.utils.MetadataUtils;
|
||||||
import io.github.hello09x.fakeplayer.core.Main;
|
import io.github.hello09x.fakeplayer.core.Main;
|
||||||
import io.github.hello09x.fakeplayer.core.config.FakeplayerConfig;
|
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.PlayerKickEvent;
|
||||||
import org.bukkit.event.player.PlayerLoginEvent;
|
import org.bukkit.event.player.PlayerLoginEvent;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.bukkit.event.server.PluginDisableEvent;
|
||||||
import org.bukkit.metadata.MetadataValue;
|
import org.bukkit.metadata.MetadataValue;
|
||||||
import org.jetbrains.annotations.NotNull;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,9 +7,6 @@ import org.bukkit.entity.Player;
|
|||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
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.bukkit.event.player.PlayerToggleSneakEvent;
|
||||||
import org.jetbrains.annotations.NotNull;
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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.constant.MetadataKeys;
|
||||||
import io.github.hello09x.fakeplayer.core.entity.Fakeplayer;
|
import io.github.hello09x.fakeplayer.core.entity.Fakeplayer;
|
||||||
import io.github.hello09x.fakeplayer.core.entity.SpawnOption;
|
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.manager.naming.NameManager;
|
||||||
import io.github.hello09x.fakeplayer.core.repository.model.Config;
|
import io.github.hello09x.fakeplayer.core.repository.model.Config;
|
||||||
import io.github.hello09x.fakeplayer.core.util.AddressUtils;
|
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 net.kyori.adventure.text.Component;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Sound;
|
|
||||||
import org.bukkit.SoundCategory;
|
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.metadata.FixedMetadataValue;
|
import org.bukkit.metadata.FixedMetadataValue;
|
||||||
@ -51,7 +48,6 @@ public class FakeplayerManager {
|
|||||||
public final static String REMOVAL_REASON_PREFIX = "[fakeplayer] ";
|
public final static String REMOVAL_REASON_PREFIX = "[fakeplayer] ";
|
||||||
|
|
||||||
private final static Logger log = Main.getInstance().getLogger();
|
private final static Logger log = Main.getInstance().getLogger();
|
||||||
private final Invsee invsee;
|
|
||||||
|
|
||||||
private final NameManager nameManager;
|
private final NameManager nameManager;
|
||||||
private final FakeplayerList playerList;
|
private final FakeplayerList playerList;
|
||||||
@ -61,8 +57,7 @@ public class FakeplayerManager {
|
|||||||
private final ScheduledExecutorService lagMonitor;
|
private final ScheduledExecutorService lagMonitor;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public FakeplayerManager(Invsee invsee, NameManager nameManager, FakeplayerList playerList, UserConfigManager configManager, NMSBridge nms, FakeplayerConfig config) {
|
public FakeplayerManager(NameManager nameManager, FakeplayerList playerList, UserConfigManager configManager, NMSBridge nms, FakeplayerConfig config) {
|
||||||
this.invsee = invsee;
|
|
||||||
this.nameManager = nameManager;
|
this.nameManager = nameManager;
|
||||||
this.playerList = playerList;
|
this.playerList = playerList;
|
||||||
this.configManager = configManager;
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检测限制, 不满足条件则抛出异常
|
* 检测限制, 不满足条件则抛出异常
|
||||||
*
|
*
|
||||||
|
@ -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));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -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());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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);
|
|
||||||
|
|
||||||
}
|
|
@ -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);
|
||||||
|
|
||||||
|
}
|
@ -6,6 +6,10 @@ fakeplayer.action.jump=jumping
|
|||||||
fakeplayer.action.look-at-entity=looking at nearby entities
|
fakeplayer.action.look-at-entity=looking at nearby entities
|
||||||
fakeplayer.action.mine=digging
|
fakeplayer.action.mine=digging
|
||||||
fakeplayer.action.use=using item or interacting
|
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.attack.description=Attack entity
|
||||||
fakeplayer.command.cmd.description=Execute command
|
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
|
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
|
||||||
|
@ -6,6 +6,10 @@ fakeplayer.action.jump=\u8DF3\u8DC3
|
|||||||
fakeplayer.action.look-at-entity=\u770B\u5411\u9644\u8FD1\u5B9E\u4F53
|
fakeplayer.action.look-at-entity=\u770B\u5411\u9644\u8FD1\u5B9E\u4F53
|
||||||
fakeplayer.action.mine=\u6316\u6398
|
fakeplayer.action.mine=\u6316\u6398
|
||||||
fakeplayer.action.use=\u4F7F\u7528\u7269\u54C1\u6216\u4EA4\u4E92
|
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.attack.description=\u653B\u51FB
|
||||||
fakeplayer.command.cmd.description=\u6267\u884C\u547D\u4EE4
|
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
|
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
|
||||||
|
@ -6,6 +6,10 @@ fakeplayer.action.jump=\u8DF3\u8E8D
|
|||||||
fakeplayer.action.look-at-entity=\u7747\u5411\u9644\u8FD1\u5BE6\u9AD4
|
fakeplayer.action.look-at-entity=\u7747\u5411\u9644\u8FD1\u5BE6\u9AD4
|
||||||
fakeplayer.action.mine=\u6316\u6398
|
fakeplayer.action.mine=\u6316\u6398
|
||||||
fakeplayer.action.use=\u4F7F\u7528\u7269\u54C1\u6216\u4EA4\u4E92
|
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.attack.description=\u653B\u64CA
|
||||||
fakeplayer.command.cmd.description=\u57F7\u884C\u6307\u4EE4
|
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
|
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
|
||||||
|
@ -6,6 +6,10 @@ fakeplayer.action.jump=\u8DF3\u8E8D
|
|||||||
fakeplayer.action.look-at-entity=\u770B\u5411\u9644\u8FD1\u5BE6\u9AD4
|
fakeplayer.action.look-at-entity=\u770B\u5411\u9644\u8FD1\u5BE6\u9AD4
|
||||||
fakeplayer.action.mine=\u6316\u6398
|
fakeplayer.action.mine=\u6316\u6398
|
||||||
fakeplayer.action.use=\u4F7F\u7528\u7269\u54C1\u6216\u4EA4\u4E92
|
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.attack.description=\u653B\u64CA
|
||||||
fakeplayer.command.cmd.description=\u57F7\u884C\u547D\u4EE4
|
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
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user