Repackage everything

This commit is contained in:
Shevchik
2014-01-12 02:07:15 +04:00
parent b5ceb814ae
commit 6205d80ae1
11 changed files with 43 additions and 20 deletions

View File

@@ -0,0 +1,30 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.cnaude.chairs.core;
import org.bukkit.Material;
/**
*
* @author cnaude
*/
public class ChairBlock {
private Material mat;
private double sitHeight;
public ChairBlock(Material m, double s) {
mat = m;
sitHeight = s;
}
public Material getMat() {
return mat;
}
public double getSitHeight() {
return sitHeight;
}
}

View File

@@ -0,0 +1,191 @@
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;
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.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.GenVehicleArrowClass;
public class Chairs extends JavaPlugin {
public ChairEffects chairEffects;
public List<ChairBlock> allowedBlocks;
public List<Material> validSigns;
public boolean autoRotate, signCheck, notifyplayer;
public boolean ignoreIfBlockInHand;
public double distance;
public HashSet<String> disabledRegions = new HashSet<String>();
public int maxChairWidth;
public boolean sitHealEnabled;
public int sitMaxHealth;
public int sitHealthPerInterval;
public int sitHealInterval;
public boolean sitPickupEnabled;
public boolean sitDisableAllCommands = false;
public HashSet<String> sitDisabledCommands = new HashSet<String>();
private Logger log;
public ChairsIgnoreList ignoreList;
public String msgSitting, msgStanding, msgOccupied, msgNoPerm, msgReloaded, msgDisabled, msgEnabled, msgCommandRestricted;
private PlayerSitData psitdata;
public PlayerSitData getPlayerSitData()
{
return psitdata;
}
private Class<?> vehiclearrowclass;
protected Class<?> getVehicleArrowClass()
{
return vehiclearrowclass;
}
GenVehicleArrowClass genvehiclearrow = new GenVehicleArrowClass();
@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.genAndLoadClass(arrowclass, entityarrow, craftserver);
arrow.remove();
} catch (Exception e) {
e.printStackTrace();
log.severe("Failed to generate VehicleArrow class, exiting");
getServer().getPluginManager().disablePlugin(this);
return;
}
chairEffects = new ChairEffects(this);
ignoreList = new ChairsIgnoreList(this);
ignoreList.load();
psitdata = new PlayerSitData(this);
getConfig().options().copyDefaults(true);
saveConfig();
loadConfig();
if (sitHealEnabled) {
chairEffects.startHealing();
}
if (sitPickupEnabled) {
chairEffects.startPickup();
}
getServer().getPluginManager().registerEvents(new TrySitEventListener(this, ignoreList), this);
getServer().getPluginManager().registerEvents(new TryUnsitEventListener(this), this);
getServer().getPluginManager().registerEvents(new CommandRestrict(this), this);
getCommand("chairs").setExecutor(new ChairsCommand(this, ignoreList));
}
@Override
public void onDisable() {
for (Player player : getServer().getOnlinePlayers()) {
if (psitdata.isSitting(player)) {
psitdata.unSitPlayer(player, false, true);
}
}
if (ignoreList != null) {
ignoreList.save();
}
chairEffects.cancelHealing();
chairEffects.cancelPickup();
chairEffects = null;
log = null;
genvehiclearrow = null;
vehiclearrowclass = null;
psitdata = null;
}
public void loadConfig() {
FileConfiguration config = YamlConfiguration.loadConfiguration(new File(this.getDataFolder(),"config.yml"));
autoRotate = config.getBoolean("auto-rotate");
signCheck = config.getBoolean("sign-check");
distance = config.getDouble("distance");
maxChairWidth = config.getInt("max-chair-width");
notifyplayer = config.getBoolean("notify-player");
ignoreIfBlockInHand = config.getBoolean("ignore-if-item-in-hand");
disabledRegions = new HashSet<String>(config.getStringList("disabledWGRegions"));
sitHealEnabled = config.getBoolean("sit-effects.healing.enabled", false);
sitHealInterval = config.getInt("sit-effects.healing.interval",20);
sitMaxHealth = config.getInt("sit-effects.healing.max-percent",100);
sitHealthPerInterval = config.getInt("sit-effects.healing.amount",1);
sitPickupEnabled = config.getBoolean("sit-effects.itempickup.enabled", false);
sitDisableAllCommands = config.getBoolean("sit-restrictions.commands.all");
sitDisabledCommands = new HashSet<String>(config.getStringList("sit-restrictions.commands.list"));
msgSitting = ChatColor.translateAlternateColorCodes('&',config.getString("messages.sitting"));
msgStanding = ChatColor.translateAlternateColorCodes('&',config.getString("messages.standing"));
msgOccupied = ChatColor.translateAlternateColorCodes('&',config.getString("messages.occupied"));
msgNoPerm = ChatColor.translateAlternateColorCodes('&',config.getString("messages.no-permission"));
msgEnabled = ChatColor.translateAlternateColorCodes('&',config.getString("messages.enabled"));
msgDisabled = ChatColor.translateAlternateColorCodes('&',config.getString("messages.disabled"));
msgReloaded = ChatColor.translateAlternateColorCodes('&',config.getString("messages.reloaded"));
msgCommandRestricted = ChatColor.translateAlternateColorCodes('&',config.getString("messages.command-restricted"));
allowedBlocks = new ArrayList<ChairBlock>();
for (String s : config.getStringList("sit-blocks")) {
String type;
double sh = 0.7;
String tmp[] = s.split("[:]");
type = tmp[0];
if (tmp.length == 2) {
sh = Double.parseDouble(tmp[1]);
}
Material mat = Material.matchMaterial(type);
if (mat != null) {
logInfo("Allowed block: " + mat.toString() + " => " + sh);
allowedBlocks.add(new ChairBlock(mat,sh));
} else {
logError("Invalid block: " + type);
}
}
validSigns = new ArrayList<Material>();
for (String type : config.getStringList("valid-signs")) {
try {
validSigns.add(Material.matchMaterial(type));
}
catch (Exception e) {
logError(e.getMessage());
}
}
}
public void logInfo(String _message) {
log.log(Level.INFO, _message);
}
public void logError(String _message) {
log.log(Level.SEVERE, _message);
}
}

View File

@@ -0,0 +1,151 @@
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;
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 {
private Chairs plugin;
public PlayerSitData(Chairs plugin) {
this.plugin = plugin;
}
private HashMap<String, Entity> sit = new HashMap<String, Entity>();
private HashMap<Block, String> sitblock = new HashMap<Block, String>();
private HashMap<String, Block> sitblockbr = new HashMap<String, Block>();
private HashMap<String, Location> sitstopteleportloc = new HashMap<String, Location>();
private HashMap<String, Integer> sittask = new HashMap<String, Integer>();
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);
}
public Player getPlayerOnChair(Block chair)
{
return Bukkit.getPlayerExact(sitblock.get(chair));
}
public void sitPlayer(Player player, Location sitlocation)
{
try {
if (plugin.notifyplayer)
{
player.sendMessage(plugin.msgSitting);
}
Block block = sitlocation.getBlock();
sitstopteleportloc.put(player.getName(), player.getLocation());
player.teleport(sitlocation);
Location arrowloc = block.getLocation().add(0.5, 0 , 0.5);
Entity arrow = sitPlayerOnArrow(player, arrowloc);
sit.put(player.getName(), arrow);
sitblock.put(block, player.getName());
sitblockbr.put(player.getName(), block);
startReSitTask(player);
} catch (Exception e) {
e.printStackTrace();
}
}
public void startReSitTask(final Player player)
{
int task =
Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable()
{
public void run()
{
reSitPlayer(player);
}
},1000,1000);
sittask.put(player.getName(), task);
}
public void reSitPlayer(final Player player)
{
try {
final Entity prevarrow = sit.get(player.getName());
sit.remove(player.getName());
player.eject();
Block block = sitblockbr.get(player.getName());
Location arrowloc = block.getLocation().add(0.5, 0 , 0.5);
Entity arrow = sitPlayerOnArrow(player, arrowloc);
sit.put(player.getName(), arrow);
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable()
{
public void run()
{
prevarrow.remove();
}
},100);
} catch (Exception e) {
e.printStackTrace();
}
}
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);
arrow.setPassenger(player);
return arrow;
}
public void unSitPlayer(final Player player, boolean restoreposition, boolean correctleaveposition)
{
final Entity arrow = sit.get(player.getName());
sit.remove(player.getName());
player.eject();
arrow.remove();
final Location tploc = sitstopteleportloc.get(player.getName());
if (restoreposition)
{
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable()
{
public void run()
{
player.teleport(tploc);
player.setSneaking(false);
}
},1);
} else if (correctleaveposition)
{
player.teleport(tploc);
}
sitblock.remove(sitblockbr.get(player.getName()));
sitblockbr.remove(player.getName());
sitstopteleportloc.remove(player.getName());
Bukkit.getScheduler().cancelTask(sittask.get(player.getName()));
sittask.remove(player.getName());
if (plugin.notifyplayer)
{
player.sendMessage(plugin.msgStanding);
}
}
}