+ update
This commit is contained in:
parent
dbf319addb
commit
a9700dfdd3
@ -0,0 +1,23 @@
|
|||||||
|
package me.skymc.taboolib.common.playercontanier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author sky
|
||||||
|
*/
|
||||||
|
public class Container {
|
||||||
|
|
||||||
|
private final Object container;
|
||||||
|
private final boolean uniqueId;
|
||||||
|
|
||||||
|
public Container(Object container, boolean uniqueId) {
|
||||||
|
this.container = container;
|
||||||
|
this.uniqueId = uniqueId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getContainer() {
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isUniqueId() {
|
||||||
|
return uniqueId;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package me.skymc.taboolib.common.playercontanier;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author sky
|
||||||
|
* @Since 2018-09-14 23:45
|
||||||
|
*/
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface PlayerContainer {
|
||||||
|
|
||||||
|
boolean uniqueId() default false;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,92 @@
|
|||||||
|
package me.skymc.taboolib.common.playercontanier;
|
||||||
|
|
||||||
|
import com.ilummc.tlib.logger.TLogger;
|
||||||
|
import me.skymc.taboolib.TabooLib;
|
||||||
|
import me.skymc.taboolib.TabooLibLoader;
|
||||||
|
import me.skymc.taboolib.listener.TListener;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.bukkit.event.server.PluginDisableEvent;
|
||||||
|
import org.bukkit.event.server.PluginEnableEvent;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author sky
|
||||||
|
* @Since 2018-09-14 23:45
|
||||||
|
*/
|
||||||
|
@TListener
|
||||||
|
public class PlayerContainerLoader implements Listener {
|
||||||
|
|
||||||
|
private static Map<String, List<Container>> pluginContainer = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
PlayerContainerLoader() {
|
||||||
|
load();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void load() {
|
||||||
|
Arrays.stream(Bukkit.getPluginManager().getPlugins()).forEach(PlayerContainerLoader::load);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void load(Plugin plugin) {
|
||||||
|
if (!(TabooLib.isTabooLib(plugin) || TabooLib.isDependTabooLib(plugin))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
TabooLibLoader.getPluginClasses(plugin).ifPresent(classes -> {
|
||||||
|
for (Class pluginClass : classes) {
|
||||||
|
for (Field field : pluginClass.getDeclaredFields()) {
|
||||||
|
PlayerContainer annotation = field.getAnnotation(PlayerContainer.class);
|
||||||
|
if (annotation == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
field.setAccessible(true);
|
||||||
|
try {
|
||||||
|
pluginContainer.computeIfAbsent(plugin.getName(), name -> new ArrayList<>()).add(new Container(field.get(pluginClass), annotation.uniqueId()));
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unload() {
|
||||||
|
Arrays.stream(Bukkit.getPluginManager().getPlugins()).forEach(PlayerContainerLoader::unload);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unload(Plugin plugin) {
|
||||||
|
pluginContainer.remove(plugin.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onEnable(PluginEnableEvent e) {
|
||||||
|
load(e.getPlugin());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onDisable(PluginDisableEvent e) {
|
||||||
|
unload(e.getPlugin());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void onQuit(PlayerQuitEvent e) {
|
||||||
|
for (List<Container> containers : pluginContainer.values()) {
|
||||||
|
for (Container container : containers) {
|
||||||
|
if (container.getContainer() instanceof Map) {
|
||||||
|
((Map) container.getContainer()).remove(container.isUniqueId() ? e.getPlayer().getUniqueId() : e.getPlayer().getName());
|
||||||
|
} else if (container.getContainer() instanceof Collection) {
|
||||||
|
((Collection) container.getContainer()).remove(container.isUniqueId() ? e.getPlayer().getUniqueId() : e.getPlayer().getName());
|
||||||
|
} else {
|
||||||
|
TLogger.getGlobalLogger().error("Invalid Container: " + container.getContainer().getClass().getSimpleName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,58 +1,44 @@
|
|||||||
package me.skymc.taboolib.damage;
|
package me.skymc.taboolib.damage;
|
||||||
|
|
||||||
import me.skymc.taboolib.TabooLib;
|
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.entity.Projectile;
|
||||||
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
/**
|
||||||
|
* @author sky
|
||||||
|
*/
|
||||||
public class DamageUtils {
|
public class DamageUtils {
|
||||||
|
|
||||||
|
public static Player getAttackerInDamageEvent(EntityDamageByEntityEvent e) {
|
||||||
|
if (e.getDamager() instanceof Player) {
|
||||||
|
return (Player) e.getDamager();
|
||||||
|
} else if (e.getDamager() instanceof Projectile && ((Projectile) e.getDamager()).getShooter() instanceof Player) {
|
||||||
|
return (Player) ((Projectile) e.getDamager()).getShooter();
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// *********************************
|
||||||
|
//
|
||||||
|
// Deprecated
|
||||||
|
//
|
||||||
|
// *********************************
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public static void damage(Player player, LivingEntity victim, double damage) {
|
public static void damage(Player player, LivingEntity victim, double damage) {
|
||||||
dmg(player, victim, damage);
|
dmg(player, victim, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public static void damage(Player player, Entity victim, double damage) {
|
public static void damage(Player player, Entity victim, double damage) {
|
||||||
if (victim instanceof LivingEntity) {
|
dmg(player, (LivingEntity) victim, damage);
|
||||||
dmg(player, (LivingEntity) victim, damage);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void dmg(LivingEntity paramLivingEntity1, LivingEntity paramLivingEntity2, double paramDouble) {
|
@Deprecated
|
||||||
if ((paramLivingEntity2.hasMetadata("NPC")) || (paramLivingEntity1.hasMetadata("NPC"))) {
|
public static void dmg(LivingEntity attacker, LivingEntity victim, double damage) {
|
||||||
return;
|
attacker.damage(damage, victim);
|
||||||
}
|
|
||||||
|
|
||||||
Object localObject1;
|
|
||||||
try {
|
|
||||||
localObject1 = paramLivingEntity1.getClass().getDeclaredMethod("getHandle").invoke(paramLivingEntity1);
|
|
||||||
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException localIllegalAccessException1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Object localObject2;
|
|
||||||
try {
|
|
||||||
localObject2 = paramLivingEntity2.getClass().getDeclaredMethod("getHandle").invoke(paramLivingEntity2);
|
|
||||||
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException localIllegalAccessException2) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Class<?> DamageSource = nmsClass("DamageSource");
|
|
||||||
Object localObject3 = DamageSource.getDeclaredMethod("playerAttack", nmsClass("EntityHuman")).invoke(DamageSource, localObject1);
|
|
||||||
|
|
||||||
localObject2.getClass().getDeclaredMethod("damageEntity", new Class[]{DamageSource, Float.TYPE}).invoke(localObject2, localObject3, (float) paramDouble);
|
|
||||||
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException ignored) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Class<?> nmsClass(String paramString) {
|
|
||||||
String str = "net.minecraft.server." + TabooLib.getVersion() + "." + paramString;
|
|
||||||
try {
|
|
||||||
return Class.forName(str);
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,19 +4,11 @@ import org.bukkit.entity.Player;
|
|||||||
import org.bukkit.entity.Projectile;
|
import org.bukkit.entity.Projectile;
|
||||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public class GetDamager {
|
public class GetDamager {
|
||||||
|
|
||||||
public static Player get(EntityDamageByEntityEvent e) {
|
public static Player get(EntityDamageByEntityEvent e) {
|
||||||
Player p = null;
|
return DamageUtils.getAttackerInDamageEvent(e);
|
||||||
if (e.getDamager() instanceof Projectile) {
|
|
||||||
Projectile arrow = (Projectile) e.getDamager();
|
|
||||||
if (arrow.getShooter() instanceof Player) {
|
|
||||||
p = (Player) arrow.getShooter();
|
|
||||||
}
|
|
||||||
} else if (e.getDamager() instanceof Player) {
|
|
||||||
p = (Player) e.getDamager();
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,22 +1,13 @@
|
|||||||
package me.skymc.taboolib.damage;
|
package me.skymc.taboolib.damage;
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.entity.Projectile;
|
|
||||||
import org.bukkit.event.entity.EntityDeathEvent;
|
import org.bukkit.event.entity.EntityDeathEvent;
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public class GetKiller {
|
public class GetKiller {
|
||||||
|
|
||||||
public static Player get(EntityDeathEvent e) {
|
public static Player get(EntityDeathEvent e) {
|
||||||
Player p = null;
|
return e.getEntity().getKiller();
|
||||||
if (e.getEntity().getKiller() instanceof Projectile) {
|
|
||||||
Projectile arrow = (Projectile) e.getEntity().getKiller();
|
|
||||||
if (arrow.getShooter() instanceof Player) {
|
|
||||||
p = (Player) arrow.getShooter();
|
|
||||||
}
|
|
||||||
} else if (e.getEntity().getKiller() != null) {
|
|
||||||
p = e.getEntity().getKiller();
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ public class VectorUtils {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 物品丢弃
|
* 物品丢弃
|
||||||
*
|
* <p>
|
||||||
* 常用参数:
|
* 常用参数:
|
||||||
* itemDrop(player, itemStack, 0.2, 0.5)
|
* itemDrop(player, itemStack, 0.2, 0.5)
|
||||||
*
|
*
|
||||||
@ -57,7 +57,7 @@ public class VectorUtils {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 生物抛射
|
* 生物抛射
|
||||||
*
|
* <p>
|
||||||
* 常用参数:
|
* 常用参数:
|
||||||
* entityPush(entity, location, 15)
|
* entityPush(entity, location, 15)
|
||||||
*
|
*
|
||||||
@ -69,17 +69,17 @@ public class VectorUtils {
|
|||||||
Location from = entity.getLocation();
|
Location from = entity.getLocation();
|
||||||
|
|
||||||
Vector test = to.clone().subtract(from).toVector();
|
Vector test = to.clone().subtract(from).toVector();
|
||||||
Double elevation = test.getY();
|
double elevation = test.getY();
|
||||||
|
|
||||||
Double launchAngle = calculateLaunchAngle(from, to, velocity, elevation, 20.0D);
|
Double launchAngle = calculateLaunchAngle(from, to, velocity, elevation, 20.0D);
|
||||||
Double distance = Math.sqrt(Math.pow(test.getX(), 2.0D) + Math.pow(test.getZ(), 2.0D));
|
double distance = Math.sqrt(Math.pow(test.getX(), 2.0D) + Math.pow(test.getZ(), 2.0D));
|
||||||
if (distance == 0.0D) {
|
if (distance == 0.0D) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (launchAngle == null) {
|
if (launchAngle == null) {
|
||||||
launchAngle = Math.atan((40.0D * elevation + Math.pow(velocity, 2.0D)) / (40.0D * elevation + 2.0D * Math.pow(velocity, 2.0D)));
|
launchAngle = Math.atan((40.0D * elevation + Math.pow(velocity, 2.0D)) / (40.0D * elevation + 2.0D * Math.pow(velocity, 2.0D)));
|
||||||
}
|
}
|
||||||
Double hangTime = calculateHangTime(launchAngle, velocity, elevation, 20.0D);
|
double hangTime = calculateHangTime(launchAngle, velocity, elevation, 20.0D);
|
||||||
|
|
||||||
test.setY(Math.tan(launchAngle) * distance);
|
test.setY(Math.tan(launchAngle) * distance);
|
||||||
test = normalizeVector(test);
|
test = normalizeVector(test);
|
||||||
@ -113,7 +113,7 @@ public class VectorUtils {
|
|||||||
|
|
||||||
private static Double calculateLaunchAngle(Location from, Location to, double v, double elevation, double g) {
|
private static Double calculateLaunchAngle(Location from, Location to, double v, double elevation, double g) {
|
||||||
Vector vector = from.clone().subtract(to).toVector();
|
Vector vector = from.clone().subtract(to).toVector();
|
||||||
Double distance = Math.sqrt(Math.pow(vector.getX(), 2.0D) + Math.pow(vector.getZ(), 2.0D));
|
double distance = Math.sqrt(Math.pow(vector.getX(), 2.0D) + Math.pow(vector.getZ(), 2.0D));
|
||||||
double v2 = Math.pow(v, 2.0D);
|
double v2 = Math.pow(v, 2.0D);
|
||||||
double v4 = Math.pow(v, 4.0D);
|
double v4 = Math.pow(v, 4.0D);
|
||||||
double check = g * (g * Math.pow(distance, 2.0D) + 2.0D * elevation * v2);
|
double check = g * (g * Math.pow(distance, 2.0D) + 2.0D * elevation * v2);
|
||||||
|
@ -1,53 +0,0 @@
|
|||||||
package me.skymc.taboolib.events;
|
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.Cancellable;
|
|
||||||
import org.bukkit.event.HandlerList;
|
|
||||||
import org.bukkit.event.player.PlayerEvent;
|
|
||||||
|
|
||||||
public class DefaultEvent2 extends PlayerEvent {
|
|
||||||
|
|
||||||
private static final HandlerList handlers;
|
|
||||||
|
|
||||||
static {
|
|
||||||
handlers = new HandlerList();
|
|
||||||
}
|
|
||||||
|
|
||||||
private DefaultEvent2(final Player who) {
|
|
||||||
super(who);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HandlerList getHandlerList() {
|
|
||||||
return DefaultEvent2.handlers;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public HandlerList getHandlers() {
|
|
||||||
return DefaultEvent2.handlers;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Pre extends DefaultEvent2 implements Cancellable {
|
|
||||||
private boolean cancelled;
|
|
||||||
|
|
||||||
public Pre(Player who) {
|
|
||||||
super(who);
|
|
||||||
this.cancelled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isCancelled() {
|
|
||||||
return this.cancelled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setCancelled(final boolean cancelled) {
|
|
||||||
this.cancelled = cancelled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Post extends DefaultEvent2 {
|
|
||||||
public Post(Player who) {
|
|
||||||
super(who);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user