No longer need ProtocolLib
Tons of hacks...
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
package com.cnaude.chairs;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
@@ -12,9 +15,11 @@ import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Arrow;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.HandlerList;
|
||||
@@ -22,9 +27,6 @@ import org.bukkit.plugin.PluginManager;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
import com.comphenix.protocol.ProtocolManager;
|
||||
|
||||
public class Chairs extends JavaPlugin {
|
||||
public ChairEffects chairEffects;
|
||||
public List<ChairBlock> allowedBlocks;
|
||||
@@ -42,11 +44,28 @@ public class Chairs extends JavaPlugin {
|
||||
public PluginManager pm;
|
||||
public ChairsIgnoreList ignoreList;
|
||||
public String msgSitting, msgStanding, msgOccupied, msgNoPerm, msgReloaded, msgDisabled, msgEnabled;
|
||||
private ProtocolManager protocolManager;
|
||||
|
||||
private Class<?> vehiclearrowclass;
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
log = this.getLogger();
|
||||
try {
|
||||
World world = getServer().getWorlds().get(0);
|
||||
Arrow arrow = world.spawnArrow(new Location(world, 0, 0, 0), new Vector(0, 0, 0), 0, 0);
|
||||
String arrowclass = arrow.getClass().getName();
|
||||
Method getHandle;
|
||||
getHandle = arrow.getClass().getDeclaredMethod("getHandle");
|
||||
getHandle.setAccessible(true);
|
||||
Class<?> entityarrow = getHandle.invoke(arrow).getClass();
|
||||
Class<?> craftserver = getServer().getClass();
|
||||
vehiclearrowclass = new GenVehicleArrowClass().genAndLoadClass(arrowclass, entityarrow, craftserver);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
log.severe("Failed to generate VehicleArrow class, exiting");
|
||||
getServer().getPluginManager().disablePlugin(this);
|
||||
return;
|
||||
}
|
||||
ignoreList = new ChairsIgnoreList(this);
|
||||
ignoreList.load();
|
||||
pm = this.getServer().getPluginManager();
|
||||
@@ -59,14 +78,11 @@ public class Chairs extends JavaPlugin {
|
||||
logInfo("Enabling sitting effects.");
|
||||
chairEffects = new ChairEffects(this);
|
||||
}
|
||||
protocolManager = ProtocolLibrary.getProtocolManager();
|
||||
new PacketListener(protocolManager, this);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
protocolManager.getAsynchronousManager().unregisterAsyncHandlers(this);
|
||||
protocolManager = null;
|
||||
for (String pName : new HashSet<String>(sit.keySet())) {
|
||||
ejectPlayerOnDisable(Bukkit.getPlayerExact(pName));
|
||||
}
|
||||
@@ -93,21 +109,37 @@ public class Chairs extends JavaPlugin {
|
||||
protected HashMap<String, Integer> sittask = new HashMap<String, Integer>();
|
||||
protected void sitPlayer(Player player, Location sitlocation)
|
||||
{
|
||||
if (notifyplayer && !msgSitting.isEmpty()) {
|
||||
player.sendMessage(msgSitting);
|
||||
}
|
||||
Block block = sitlocation.getBlock();
|
||||
sitstopteleportloc.put(player.getName(), player.getLocation());
|
||||
Entity arrow = block.getWorld().spawnArrow(block.getLocation().add(0.5, 0 , 0.5), new Vector(0, 0.1, 0), 0, 0);
|
||||
player.teleport(sitlocation);
|
||||
player.setSneaking(false);
|
||||
arrow.setPassenger(player);
|
||||
sit.put(player.getName(), arrow);
|
||||
sitblock.put(block, player.getName());
|
||||
sitblockbr.put(player.getName(), block);
|
||||
startReSitTask(player);
|
||||
player.teleport(player.getWorld().getSpawnLocation());
|
||||
try {
|
||||
if (notifyplayer && !msgSitting.isEmpty())
|
||||
{
|
||||
player.sendMessage(msgSitting);
|
||||
}
|
||||
Block block = sitlocation.getBlock();
|
||||
sitstopteleportloc.put(player.getName(), player.getLocation());
|
||||
player.teleport(sitlocation);
|
||||
player.setSneaking(false);
|
||||
Location arrowloc = block.getLocation().add(0.5, 0 , 0.5);
|
||||
Entity arrow = player.getWorld().spawnArrow(arrowloc, new Vector(0, 0.1 ,0), 0, 0);
|
||||
Method getHandleMethod = arrow.getClass().getDeclaredMethod("getHandle");
|
||||
getHandleMethod.setAccessible(true);
|
||||
Object nmsarrow = getHandleMethod.invoke(arrow);
|
||||
Field bukkitEntityField = nmsarrow.getClass().getSuperclass().getDeclaredField("bukkitEntity");
|
||||
bukkitEntityField.setAccessible(true);
|
||||
Constructor<?> ctor = vehiclearrowclass.getDeclaredConstructor(this.getServer().getClass(), nmsarrow.getClass());
|
||||
ctor.setAccessible(true);
|
||||
Object vehiclearrow = ctor.newInstance(this.getServer(), nmsarrow);
|
||||
bukkitEntityField.set(nmsarrow, vehiclearrow);
|
||||
arrow.setPassenger(player);
|
||||
sit.put(player.getName(), (Entity) vehiclearrow);
|
||||
sitblock.put(block, player.getName());
|
||||
sitblockbr.put(player.getName(), block);
|
||||
startReSitTask(player);
|
||||
player.teleport(player.getWorld().getSpawnLocation());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
protected void startReSitTask(final Player player)
|
||||
{
|
||||
int task =
|
||||
@@ -122,19 +154,33 @@ public class Chairs extends JavaPlugin {
|
||||
}
|
||||
protected void reSitPlayer(final Player player)
|
||||
{
|
||||
player.eject();
|
||||
final Entity prevarrow = sit.get(player.getName());
|
||||
Block block = sitblockbr.get(player.getName());
|
||||
final Entity arrow = block.getWorld().spawnArrow(block.getLocation().add(0.5, 0, 0.5), new Vector(0, 0.01, 0), 0, 0);
|
||||
arrow.setPassenger(player);
|
||||
sit.put(player.getName(), arrow);
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable()
|
||||
{
|
||||
public void run()
|
||||
try {
|
||||
player.eject();
|
||||
final Entity prevarrow = sit.get(player.getName());
|
||||
Block block = sitblockbr.get(player.getName());
|
||||
Location arrowloc = block.getLocation().add(0.5, 0 , 0.5);
|
||||
Entity arrow = player.getWorld().spawnArrow(arrowloc, new Vector(0, 0.1 ,0), 0, 0);
|
||||
Method getHandleMethod = arrow.getClass().getDeclaredMethod("getHandle");
|
||||
getHandleMethod.setAccessible(true);
|
||||
Object nmsarrow = getHandleMethod.invoke(arrow);
|
||||
Field bukkitEntityField = nmsarrow.getClass().getSuperclass().getDeclaredField("bukkitEntity");
|
||||
bukkitEntityField.setAccessible(true);
|
||||
Constructor<?> ctor = vehiclearrowclass.getDeclaredConstructor(this.getServer().getClass(), nmsarrow.getClass());
|
||||
ctor.setAccessible(true);
|
||||
Object vehiclearrow = ctor.newInstance(this.getServer(), nmsarrow);
|
||||
bukkitEntityField.set(nmsarrow, vehiclearrow);
|
||||
arrow.setPassenger(player);
|
||||
sit.put(player.getName(), arrow);
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable()
|
||||
{
|
||||
prevarrow.remove();
|
||||
}
|
||||
},100);
|
||||
public void run()
|
||||
{
|
||||
prevarrow.remove();
|
||||
}
|
||||
},100);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
protected void unSitPlayer(final Player player, boolean ignoretp)
|
||||
{
|
||||
@@ -241,7 +287,5 @@ public class Chairs extends JavaPlugin {
|
||||
public void logError(String _message) {
|
||||
log.log(Level.SEVERE, _message);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@@ -16,6 +16,7 @@ import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.event.vehicle.VehicleExitEvent;
|
||||
import org.bukkit.material.Stairs;
|
||||
import org.bukkit.material.Step;
|
||||
import org.bukkit.material.WoodenStep;
|
||||
@@ -46,6 +47,20 @@ public class EventListener implements Listener {
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onExitVehicle(VehicleExitEvent e)
|
||||
{
|
||||
if (e.getVehicle().getPassenger() instanceof Player)
|
||||
{
|
||||
Player player = (Player) e.getVehicle().getPassenger();
|
||||
if (plugin.sit.containsKey(player.getName()))
|
||||
{
|
||||
e.setCancelled(true);
|
||||
plugin.unSitPlayer(player, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority=EventPriority.HIGHEST,ignoreCancelled=true)
|
||||
public void onBlockBreak(BlockBreakEvent event)
|
||||
{
|
||||
|
90
src/com/cnaude/chairs/GenVehicleArrowClass.java
Normal file
90
src/com/cnaude/chairs/GenVehicleArrowClass.java
Normal file
@@ -0,0 +1,90 @@
|
||||
package com.cnaude.chairs;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
import org.apache.bcel.Constants;
|
||||
import org.apache.bcel.generic.ALOAD;
|
||||
import org.apache.bcel.generic.ClassGen;
|
||||
import org.apache.bcel.generic.ConstantPoolGen;
|
||||
import org.apache.bcel.generic.InstructionConstants;
|
||||
import org.apache.bcel.generic.InstructionFactory;
|
||||
import org.apache.bcel.generic.InstructionList;
|
||||
import org.apache.bcel.generic.InvokeInstruction;
|
||||
import org.apache.bcel.generic.MethodGen;
|
||||
import org.apache.bcel.generic.Type;
|
||||
|
||||
public class GenVehicleArrowClass {
|
||||
|
||||
|
||||
public Class<?> genAndLoadClass(String arrowclass, Class<?> entityarrow, Class<?> craftserver) throws IOException, ClassNotFoundException {
|
||||
ClassGen cg = new ClassGen(
|
||||
"VehicleArrow",
|
||||
arrowclass,
|
||||
"<generated>",
|
||||
Constants.ACC_PUBLIC | Constants.ACC_SUPER,
|
||||
new String[]{"org.bukkit.entity.Vehicle"}
|
||||
);
|
||||
ConstantPoolGen cp = cg.getConstantPool();
|
||||
InstructionList il = new InstructionList();
|
||||
MethodGen mg = new MethodGen(
|
||||
Constants.ACC_PUBLIC,
|
||||
Type.VOID,
|
||||
new Type[] { Type.getType(craftserver), Type.getType(entityarrow) },
|
||||
new String[] { "server", "entity" },
|
||||
"<init>",
|
||||
"VehicleArrow",
|
||||
il,
|
||||
cp
|
||||
);
|
||||
InstructionFactory factory = new InstructionFactory(cg);
|
||||
il.append(new ALOAD(0));
|
||||
il.append(new ALOAD(1));
|
||||
il.append(new ALOAD(2));
|
||||
InvokeInstruction ii = factory.createInvoke(
|
||||
arrowclass,
|
||||
"<init>",
|
||||
Type.VOID,
|
||||
new Type[] {Type.getType(craftserver), Type.getType(entityarrow)},
|
||||
Constants.INVOKESPECIAL
|
||||
);
|
||||
il.append(ii);
|
||||
il.append(InstructionConstants.RETURN);
|
||||
mg.setMaxStack();
|
||||
cg.addMethod(mg.getMethod());
|
||||
il.dispose();
|
||||
cg.getJavaClass().dump("VehicleArrow.class");
|
||||
File arrowfile = new File("VehicleArrow.class");
|
||||
InputStream arrwoinputstrean = new FileInputStream(arrowfile);
|
||||
File jarfile = new File("VehicleArrow.jar");
|
||||
final ZipOutputStream zipout = new ZipOutputStream(new FileOutputStream(jarfile));
|
||||
ZipEntry entry = new ZipEntry(arrowfile.getName());
|
||||
zipout.putNextEntry(entry);
|
||||
byte[] buffer = new byte[1024];
|
||||
int bytesRead;
|
||||
while ((bytesRead = arrwoinputstrean.read(buffer)) != -1) {
|
||||
zipout.write(buffer, 0, bytesRead);
|
||||
}
|
||||
zipout.closeEntry();
|
||||
arrwoinputstrean.close();
|
||||
zipout.close();
|
||||
URL url = jarfile.toURI().toURL();
|
||||
URL[] urls = new URL[]{url};
|
||||
URLClassLoader cl = new URLClassLoader(urls);
|
||||
Class<?> vehiclearrowclass = cl.loadClass("VehicleArrow");
|
||||
cl.close();
|
||||
arrowfile.delete();
|
||||
jarfile.delete();
|
||||
return vehiclearrowclass;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@@ -1,51 +0,0 @@
|
||||
package com.cnaude.chairs;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.comphenix.protocol.PacketType;
|
||||
import com.comphenix.protocol.ProtocolManager;
|
||||
import com.comphenix.protocol.events.ListenerPriority;
|
||||
import com.comphenix.protocol.events.PacketAdapter;
|
||||
import com.comphenix.protocol.events.PacketEvent;
|
||||
|
||||
public class PacketListener {
|
||||
|
||||
private ProtocolManager pm;
|
||||
private Chairs pluginInstance;
|
||||
public PacketListener(ProtocolManager pm, Chairs plugin)
|
||||
{
|
||||
this.pm = pm;
|
||||
this.pluginInstance = plugin;
|
||||
playerDismountListener();
|
||||
}
|
||||
|
||||
private void playerDismountListener()
|
||||
{
|
||||
pm.getAsynchronousManager().registerAsyncHandler(
|
||||
new PacketAdapter(PacketAdapter
|
||||
.params(pluginInstance, PacketType.Play.Client.STEER_VEHICLE)
|
||||
.clientSide()
|
||||
.listenerPriority(ListenerPriority.HIGHEST)
|
||||
.optionIntercept()
|
||||
)
|
||||
{
|
||||
@Override
|
||||
public void onPacketReceiving(final PacketEvent e)
|
||||
{
|
||||
if (!e.isCancelled())
|
||||
{
|
||||
final Player player = e.getPlayer();
|
||||
if (e.getPacket().getBooleans().getValues().get(1))
|
||||
{
|
||||
//just eject player if he is sitting on chair
|
||||
if (pluginInstance.sit.containsKey(player.getName()))
|
||||
{
|
||||
pluginInstance.unSitPlayer(player,false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}).syncStart();
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user