No longer need ProtocolLib

Tons of hacks...
This commit is contained in:
Shevchik
2013-12-14 14:33:29 +04:00
parent 04562288dd
commit 17d2554649
349 changed files with 48496 additions and 89 deletions

View File

@@ -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);
}
}

View File

@@ -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)
{

View 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;
}
}

View File

@@ -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();
}
}