Update 5.14
This commit is contained in:
parent
2a038c3baf
commit
3dc9e40cd5
@ -0,0 +1,25 @@
|
|||||||
|
package io.izzel.taboolib.common.event;
|
||||||
|
|
||||||
|
import io.izzel.taboolib.module.event.EventCancellable;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class PlayerAttackEvent extends EventCancellable<PlayerAttackEvent> {
|
||||||
|
|
||||||
|
private Player player;
|
||||||
|
private Entity target;
|
||||||
|
|
||||||
|
public PlayerAttackEvent(Player player, Entity target) {
|
||||||
|
this.player = player;
|
||||||
|
this.target = target;
|
||||||
|
async(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Player getPlayer() {
|
||||||
|
return this.player;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Entity getTarget() {
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package io.izzel.taboolib.common.listener;
|
||||||
|
|
||||||
|
import io.izzel.taboolib.common.event.PlayerAttackEvent;
|
||||||
|
import io.izzel.taboolib.module.nms.NMS;
|
||||||
|
import io.izzel.taboolib.module.packet.Packet;
|
||||||
|
import io.izzel.taboolib.module.packet.TPacket;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author sky
|
||||||
|
* @Since 2020-01-14 21:26
|
||||||
|
*/
|
||||||
|
public class ListenerPlayerAttack {
|
||||||
|
|
||||||
|
@TPacket(type = TPacket.Type.RECEIVE)
|
||||||
|
static boolean e(Player player, Packet packet) {
|
||||||
|
if (packet.is("PacketPlayInUseEntity") && packet.read("action").equals("ATTACK")) {
|
||||||
|
try {
|
||||||
|
Entity entityById = NMS.handle().getEntityById(packet.read("a", Integer.TYPE));
|
||||||
|
if (entityById != null && new PlayerAttackEvent(player, entityById).call().isCancelled()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch (Throwable ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -9,12 +9,16 @@ import io.izzel.taboolib.module.inject.TListener;
|
|||||||
import io.izzel.taboolib.module.locale.TLocale;
|
import io.izzel.taboolib.module.locale.TLocale;
|
||||||
import io.izzel.taboolib.module.locale.logger.TLogger;
|
import io.izzel.taboolib.module.locale.logger.TLogger;
|
||||||
import io.izzel.taboolib.module.tellraw.TellrawJson;
|
import io.izzel.taboolib.module.tellraw.TellrawJson;
|
||||||
|
import io.izzel.taboolib.util.ArrayUtil;
|
||||||
import io.izzel.taboolib.util.item.Items;
|
import io.izzel.taboolib.util.item.Items;
|
||||||
|
import io.izzel.taboolib.util.lite.Signs;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||||
import org.bukkit.event.server.ServerCommandEvent;
|
import org.bukkit.event.server.ServerCommandEvent;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author sky
|
* @author sky
|
||||||
*/
|
*/
|
||||||
@ -39,6 +43,12 @@ public class ListenerPlayerCommand implements Listener {
|
|||||||
e.setCancelled(true);
|
e.setCancelled(true);
|
||||||
e.getPlayer().sendMessage(InternalPluginBridge.handle().setPlaceholders(e.getPlayer(), "§8[§3§lTabooLib§8] §7PlaceholderAPI Test: §f%player_name%"));
|
e.getPlayer().sendMessage(InternalPluginBridge.handle().setPlaceholders(e.getPlayer(), "§8[§3§lTabooLib§8] §7PlaceholderAPI Test: §f%player_name%"));
|
||||||
}
|
}
|
||||||
|
if (e.getMessage().equalsIgnoreCase("/fakesignTest") && e.getPlayer().hasPermission("&")) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
Signs.fakeSign(e.getPlayer(), ArrayUtil.asArray("§nFakeSign Test"), lines -> {
|
||||||
|
e.getPlayer().sendMessage("§8[§3§lTabooLib§8] §7FakeSign Lines: §f" + Arrays.toString(lines));
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
@ -2,11 +2,13 @@ package io.izzel.taboolib.module.nms;
|
|||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import io.izzel.taboolib.module.inject.TInject;
|
import io.izzel.taboolib.module.inject.TInject;
|
||||||
|
import io.izzel.taboolib.module.nms.impl.Position;
|
||||||
import io.izzel.taboolib.module.nms.nbt.Attribute;
|
import io.izzel.taboolib.module.nms.nbt.Attribute;
|
||||||
import io.izzel.taboolib.module.nms.nbt.NBTAttribute;
|
import io.izzel.taboolib.module.nms.nbt.NBTAttribute;
|
||||||
import io.izzel.taboolib.module.nms.nbt.NBTCompound;
|
import io.izzel.taboolib.module.nms.nbt.NBTCompound;
|
||||||
import io.izzel.taboolib.module.nms.nbt.NBTList;
|
import io.izzel.taboolib.module.nms.nbt.NBTList;
|
||||||
import org.bukkit.Particle;
|
import org.bukkit.Particle;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
@ -70,4 +72,10 @@ public abstract class NMS {
|
|||||||
abstract public List<NBTAttribute> getBaseAttribute(ItemStack item);
|
abstract public List<NBTAttribute> getBaseAttribute(ItemStack item);
|
||||||
|
|
||||||
abstract public Object toNMS(Attribute attribute);
|
abstract public Object toNMS(Attribute attribute);
|
||||||
|
|
||||||
|
abstract public Entity getEntityById(int id);
|
||||||
|
|
||||||
|
abstract public Position fromBlockPosition(Object blockPosition);
|
||||||
|
|
||||||
|
abstract public void openSignEditor(Player player, Block block);
|
||||||
}
|
}
|
||||||
|
@ -12,12 +12,15 @@ import net.minecraft.server.v1_12_R1.MinecraftServer;
|
|||||||
import net.minecraft.server.v1_12_R1.NBTTagCompound;
|
import net.minecraft.server.v1_12_R1.NBTTagCompound;
|
||||||
import net.minecraft.server.v1_13_R2.EnumHand;
|
import net.minecraft.server.v1_13_R2.EnumHand;
|
||||||
import net.minecraft.server.v1_13_R2.IRegistry;
|
import net.minecraft.server.v1_13_R2.IRegistry;
|
||||||
import net.minecraft.server.v1_8_R3.*;
|
|
||||||
import net.minecraft.server.v1_8_R3.NBTBase;
|
import net.minecraft.server.v1_8_R3.NBTBase;
|
||||||
|
import net.minecraft.server.v1_8_R3.*;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Particle;
|
import org.bukkit.Particle;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.craftbukkit.v1_12_R1.CraftParticle;
|
import org.bukkit.craftbukkit.v1_12_R1.CraftParticle;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.CraftServer;
|
import org.bukkit.craftbukkit.v1_13_R2.CraftServer;
|
||||||
|
import org.bukkit.craftbukkit.v1_13_R2.CraftWorld;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftVillager;
|
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftVillager;
|
||||||
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
|
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
|
||||||
@ -267,6 +270,31 @@ public class NMSImpl extends NMS {
|
|||||||
return SimpleReflection.getFieldValue(GenericAttributes.class, null, attribute.name());
|
return SimpleReflection.getFieldValue(GenericAttributes.class, null, attribute.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Entity getEntityById(int id) {
|
||||||
|
for (World world : Bukkit.getServer().getWorlds()) {
|
||||||
|
net.minecraft.server.v1_13_R2.Entity entity = ((CraftWorld) world).getHandle().getEntity(id);
|
||||||
|
if (entity != null) {
|
||||||
|
return entity.getBukkitEntity();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public io.izzel.taboolib.module.nms.impl.Position fromBlockPosition(Object blockPosition) {
|
||||||
|
return blockPosition instanceof net.minecraft.server.v1_12_R1.BlockPosition ? new io.izzel.taboolib.module.nms.impl.Position(((net.minecraft.server.v1_12_R1.BlockPosition) blockPosition).getX(), ((net.minecraft.server.v1_12_R1.BlockPosition) blockPosition).getY(), ((net.minecraft.server.v1_12_R1.BlockPosition) blockPosition).getZ()) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void openSignEditor(Player player, Block block) {
|
||||||
|
try {
|
||||||
|
((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer) player).getHandle().playerConnection.sendPacket(new net.minecraft.server.v1_12_R1.PacketPlayOutOpenSignEditor(new net.minecraft.server.v1_12_R1.BlockPosition(block.getX(), block.getY(), block.getZ())));
|
||||||
|
} catch (Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Object toNBTBase(io.izzel.taboolib.module.nms.nbt.NBTBase base) {
|
private Object toNBTBase(io.izzel.taboolib.module.nms.nbt.NBTBase base) {
|
||||||
switch (base.getType().getId()) {
|
switch (base.getType().getId()) {
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -0,0 +1,40 @@
|
|||||||
|
package io.izzel.taboolib.module.nms.impl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author sky
|
||||||
|
* @Since 2020-01-14 22:02
|
||||||
|
*/
|
||||||
|
public class Position {
|
||||||
|
|
||||||
|
private int x, y, z;
|
||||||
|
|
||||||
|
public Position(int x, int y, int z) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.z = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getX() {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getY() {
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getZ() {
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setX(int x) {
|
||||||
|
this.x = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setY(int y) {
|
||||||
|
this.y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setZ(int z) {
|
||||||
|
this.z = z;
|
||||||
|
}
|
||||||
|
}
|
133
src/main/scala/io/izzel/taboolib/util/lite/Signs.java
Normal file
133
src/main/scala/io/izzel/taboolib/util/lite/Signs.java
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
package io.izzel.taboolib.util.lite;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import io.izzel.taboolib.TabooLib;
|
||||||
|
import io.izzel.taboolib.Version;
|
||||||
|
import io.izzel.taboolib.module.nms.NMS;
|
||||||
|
import io.izzel.taboolib.module.nms.impl.Position;
|
||||||
|
import io.izzel.taboolib.module.packet.Packet;
|
||||||
|
import io.izzel.taboolib.module.packet.TPacket;
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.Sign;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author sky
|
||||||
|
* @Since 2020-01-14 21:43
|
||||||
|
*/
|
||||||
|
public class Signs {
|
||||||
|
|
||||||
|
private static List<Data> signs = Lists.newCopyOnWriteArrayList();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 向玩家发送虚拟牌子,并返回编辑内容
|
||||||
|
*
|
||||||
|
* @param player 玩家
|
||||||
|
* @param origin 原始内容
|
||||||
|
* @param catcher 编辑内容
|
||||||
|
*/
|
||||||
|
public static void fakeSign(Player player, String[] origin, Consumer<String[]> catcher) {
|
||||||
|
Validate.isTrue(Version.isAfter(Version.v1_8), "Unsupported Version: " + Version.getCurrentVersion());
|
||||||
|
Location location = player.getLocation();
|
||||||
|
location.setY(0);
|
||||||
|
try {
|
||||||
|
player.sendBlockChange(location, Material.WALL_SIGN, (byte) 0);
|
||||||
|
player.sendSignChange(location, format(origin));
|
||||||
|
} catch (Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
}
|
||||||
|
NMS.handle().openSignEditor(player, location.getBlock());
|
||||||
|
signs.add(new Data(player.getName(), catcher, location.getBlockX(), location.getBlockY(), location.getBlockZ()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void fakeSign(Player player, Consumer<String[]> catcher) {
|
||||||
|
fakeSign(player, new String[0], catcher);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isSign(Block block) {
|
||||||
|
return block.getState() instanceof Sign;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String[] getLines(Block block) {
|
||||||
|
return isSign(block) ? ((Sign) block.getState()).getLines() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setLines(Block block, String[] lines) {
|
||||||
|
if (isSign(block)) {
|
||||||
|
Sign sign = (Sign) block.getState();
|
||||||
|
for (int i = 0; i < lines.length && i < 4; i++) {
|
||||||
|
sign.setLine(i, lines[i]);
|
||||||
|
}
|
||||||
|
sign.update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@TPacket(type = TPacket.Type.RECEIVE)
|
||||||
|
static boolean onPacket(Player player, Packet packet) {
|
||||||
|
if (packet.is("PacketPlayInUpdateSign")) {
|
||||||
|
try {
|
||||||
|
Position position = NMS.handle().fromBlockPosition(packet.read("a"));
|
||||||
|
if (position == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Data data = getData(player, position);
|
||||||
|
if (data == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Bukkit.getScheduler().runTask(TabooLib.getPlugin(), () -> {
|
||||||
|
try {
|
||||||
|
data.catcher.accept(packet.read("b", new String[0]));
|
||||||
|
} catch (Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
signs.remove(data);
|
||||||
|
} catch (Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static String[] format(String[] signs) {
|
||||||
|
List<String> list = Lists.newArrayList(signs);
|
||||||
|
while (list.size() < 4) {
|
||||||
|
list.add("");
|
||||||
|
}
|
||||||
|
while (list.size() > 4) {
|
||||||
|
list.remove(4);
|
||||||
|
}
|
||||||
|
return list.toArray(new String[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Data getData(Player player, Position position) {
|
||||||
|
return signs.stream().filter(sign -> sign.player.equals(player.getName()) && sign.isSign(position)).findFirst().orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
static class Data {
|
||||||
|
|
||||||
|
private String player;
|
||||||
|
private Consumer<String[]> catcher;
|
||||||
|
private int x, y, z;
|
||||||
|
|
||||||
|
public Data(String player, Consumer<String[]> catcher, int x, int y, int z) {
|
||||||
|
this.player = player;
|
||||||
|
this.catcher = catcher;
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.z = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSign(Position position) {
|
||||||
|
return this.x == position.getX() && this.y == position.getY() && this.z == position.getZ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user