Rewrite the nms part, fix nope error completely

This commit is contained in:
Shevchik
2014-03-06 21:32:24 +04:00
parent 805131ce85
commit 28e483267d
11 changed files with 189 additions and 140 deletions

View File

@@ -1,7 +1,6 @@
package com.cnaude.chairs.core;
import java.io.File;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -9,24 +8,21 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector;
import com.cnaude.chairs.commands.ChairsCommand;
import com.cnaude.chairs.commands.ChairsIgnoreList;
import com.cnaude.chairs.core.api.ChairsAPI;
import com.cnaude.chairs.listeners.NANLoginListener;
import com.cnaude.chairs.listeners.TrySitEventListener;
import com.cnaude.chairs.listeners.TryUnsitEventListener;
import com.cnaude.chairs.sitaddons.ChairEffects;
import com.cnaude.chairs.sitaddons.CommandRestrict;
import com.cnaude.chairs.vehiclearrow.GetVehicleArrowClass;
import com.cnaude.chairs.vehiclearrow.NMSAccess;
public class Chairs extends JavaPlugin {
public ChairEffects chairEffects;
@@ -54,28 +50,16 @@ public class Chairs extends JavaPlugin {
public PlayerSitData getPlayerSitData() {
return psitdata;
}
private Class<?> vehiclearrowclass;
protected Class<?> getVehicleArrowClass() {
return vehiclearrowclass;
private NMSAccess nmsaccess = new NMSAccess();
protected NMSAccess getNMSAccess() {
return nmsaccess;
}
GetVehicleArrowClass genvehiclearrow = new GetVehicleArrowClass();
@Override
public void onEnable() {
log = this.getLogger();
//load vehiclearrowclass
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 = genvehiclearrow.getVehicleArrowClass(arrowclass, entityarrow, craftserver);
arrow.remove();
nmsaccess.setupVehicleArrow();
} catch (Exception e) {
e.printStackTrace();
log.severe("Failed to generate VehicleArrow class, exiting");
@@ -100,24 +84,26 @@ public class Chairs extends JavaPlugin {
getServer().getPluginManager().registerEvents(new TryUnsitEventListener(this), this);
getServer().getPluginManager().registerEvents(new CommandRestrict(this), this);
getCommand("chairs").setExecutor(new ChairsCommand(this, ignoreList));
new ChairsAPI(getPlayerSitData());
}
@Override
public void onDisable() {
for (Player player : getServer().getOnlinePlayers()) {
if (psitdata.isSitting(player)) {
psitdata.unSitPlayer(player, false, true);
psitdata.unsitPlayerNow(player);
}
}
if (ignoreList != null) {
ignoreList.save();
}
chairEffects.cancelHealing();
chairEffects.cancelPickup();
chairEffects = null;
if (chairEffects != null) {
chairEffects.cancelHealing();
chairEffects.cancelPickup();
chairEffects = null;
}
log = null;
genvehiclearrow = null;
vehiclearrowclass = null;
nmsaccess = null;
psitdata = null;
}

View File

@@ -1,9 +1,6 @@
package com.cnaude.chairs.core;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import org.bukkit.Bukkit;
@@ -11,7 +8,6 @@ import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
public class PlayerSitData {
@@ -28,14 +24,6 @@ public class PlayerSitData {
public boolean isSitting(Player player) {
return sit.containsKey(player.getName());
}
public boolean isAroowOccupied(Entity entity) {
for (Entity usedentity : sit.values()) {
if (usedentity.getEntityId() == entity.getEntityId()) {
return true;
}
}
return false;
}
public boolean isBlockOccupied(Block block) {
return sitblock.containsKey(block);
}
@@ -70,8 +58,7 @@ public class PlayerSitData {
},1000,1000);
sittask.put(player.getName(), task);
}
public void reSitPlayer(final Player player)
{
public void reSitPlayer(final Player player) {
try {
final Entity prevarrow = sit.get(player.getName());
sit.remove(player.getName());
@@ -91,31 +78,31 @@ public class PlayerSitData {
}
}
private Entity sitPlayerOnArrow(Player player, Location arrowloc) throws NoSuchMethodException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, InstantiationException, InvocationTargetException {
Entity arrow = player.getWorld().spawnArrow(arrowloc, new Vector(0, 0 ,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 = plugin.getVehicleArrowClass().getDeclaredConstructor(Bukkit.getServer().getClass(), nmsarrow.getClass());
ctor.setAccessible(true);
Object vehiclearrow = ctor.newInstance(Bukkit.getServer(), nmsarrow);
bukkitEntityField.set(nmsarrow, vehiclearrow);
Entity arrow = plugin.getNMSAccess().spawnArrow(arrowloc);
arrow.setPassenger(player);
return arrow;
}
public void unSitPlayer(final Player player, boolean restoreposition, boolean correctleaveposition) {
public void unsitPlayerNormal(Player player) {
unsitPlayer(player, false, true, false);
}
public void unsitPlayerForce(Player player) {
unsitPlayer(player, true, true, false);
}
public void unsitPlayerNow(Player player) {
unsitPlayer(player, true, false, true);
}
private void unsitPlayer(final Player player, boolean eject, boolean restoreposition, boolean correctleaveposition) {
final Entity arrow = sit.get(player.getName());
sit.remove(player.getName());
player.eject();
if (eject) {
player.eject();
}
arrow.remove();
final Location tploc = sitstopteleportloc.get(player.getName());
if (restoreposition) {
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable()
{
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
@Override
public void run()
{
public void run() {
player.teleport(tploc);
player.setSneaking(false);
}

View File

@@ -0,0 +1,18 @@
package com.cnaude.chairs.core.api;
import org.bukkit.entity.Player;
import com.cnaude.chairs.core.PlayerSitData;
public class ChairsAPI {
private static PlayerSitData pdata;
public ChairsAPI(PlayerSitData pdata) {
ChairsAPI.pdata = pdata;
}
public static boolean isSitting(Player player) {
return pdata.isSitting(player);
}
}