package ml.acayrin.punch;
import java.util.*;
import org.bukkit.*;
import org.bukkit.command.*;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.event.*;
import org.bukkit.entity.*;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.scheduler.BukkitScheduler;
public class Punch extends JavaPlugin implements Listener {
private String prefix = "&7[&aPunchPower&7] >> ";
// Store stacks
private HashMap<Player,Integer> stacks = new HashMap<Player,Integer>();
public void loadConfiguration() {
this.getConfig().options().copyDefaults(true);
this.saveConfig();
}
public String mess(String mess) {
return ChatColor.translateAlternateColorCodes('&', mess);
}
public void onEnable() {
getLogger().info("Punch mode activated!");
getLogger().info("Plugin by Acayrin");
loadConfiguration();
// Scheduler to increase stack overtime
BukkitScheduler scheduler = getServer().getScheduler();
scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
@Override
public void run() {
// Increase 1 stack every 1 second
for (Player player : getServer().getOnlinePlayers()) {
if (stacks.get(player) == null) stacks.put(player,0);
if (player != null && stacks.get(player) != null && stacks.get(player) < MaxStackAmount) stacks.replace(player,stacks.get(player)+SchedulerAmount);
player.sendMessage(mess("&aCurrent stack &c"+stacks.get(player)+" &astack(s)"));
}
}
}, 0L, Scheduler);
}
public void onDisable() {
getLogger().info("Punch mode deactivated!");
}
@EventHandler
public void onQuit(PlayerQuitEvent event) {
// Reset stacks on disconnect
Player player = event.getPlayer();
stacks.remove(player);
getLogger().info("Reset stacks for "+player.getName());
}
@EventHandler
public void onJoin(PlayerJoinEvent event) {
// Reset stacks on disconnect
Player player = event.getPlayer();
stacks.put(player,1);
}
// Listen for Player Hit Player event
@EventHandler
public void onPlayerDamage(EntityDamageByEntityEvent event) {
Entity damager = event.getDamager();
if (damager instanceof Player) {
Player player = (Player) damager;
double damage = event.getDamage();
int CurStack = stacks.get(player);
if (CurStack == MaxStackAmount) {
// Set damage
// Current damage + (Damage per stack x Max Stack Amount) = Flat Damage
// Current damage + (Current damage x (Current stacks / Max stacks) x 100) = Percentage damage
if (DPSType == 1) {
event.setDamage(damage+(DPS*MaxStackAmount));
player.sendMessage(mess("&aYou dealt &c"+(damage+(DPS*MaxStackAmount))));
} else {
event.setDamage(damage+(damage*((CurStack/MaxStackAmount)*100)));
player.sendMessage(mess("&aYou dealt &c"+(damage+(damage*((CurStack/MaxStackAmount)*100)))));
}
double x = player.getLocation().getX();
double y = player.getLocation().getY();
double z = player.getLocation().getZ();
// Make a primedTNT
player.getWorld().createExplosion(x,y,z,ExplodeDamage,CanCauseFire,CanBreakBlock);
stacks.replace(player,0);
} else {
if (DPSType == 1) {
event.setDamage(damage+(DPS*MaxStackAmount));
player.sendMessage(mess("&aYou dealt &c"+(damage+(DPS*MaxStackAmount))));
} else {
event.setDamage(damage+(damage*((CurStack/MaxStackAmount)*100)));
player.sendMessage(mess("&aYou dealt &c"+(damage+(damage*((CurStack/MaxStackAmount)*100)))));
}
stacks.replace(player,CurStack + StackOnHit);
}
}
}
// Commands
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (cmd.getName().equalsIgnoreCase("punch")) {
if (args.length == 0) {
sender.sendMessage(mess("&7-----[ &bPunchPower by Acayrin &7]-----"));
sender.sendMessage(mess("&a/punch reload &7>> &bReload plugin"));
sender.sendMessage(mess("&a/punch me &7>> &bGet current information"));
return true;
}
if (args[0].equalsIgnoreCase("reload")) {
this.reloadConfig();
sender.sendMessage(mess(prefix + " Config reloaded!"));
}
if (args[0].equalsIgnoreCase("me")) {
sender.sendMessage(mess("&aPlayer name &b"+sender.getName()));
sender.sendMessage(mess("&aStacks &c"+stacks.get(Bukkit.getPlayer(sender.getName()))));
if (DPSType == 1) {
sender.sendMessage(mess("&aDamage extra &c"+(DPS*MaxStackAmount)));
} else {
sender.sendMessage(mess("&aDamage extra &c"+((stacks.get(Bukkit.getPlayer(sender.getName())))/MaxStackAmount)*100));
}
}
}
return true;
}
// Config zone
private int DPS = this.getConfig().getInt("DamagePerStack");
private int StackOnHit = this.getConfig().getInt("OnHitStack");
private int MaxStackAmount = this.getConfig().getInt("MaxStackAmount");
private float ExplodeDamage = this.getConfig().getInt("ExplosionDPS");
private boolean CanCauseFire = this.getConfig().getBoolean("CanCauseFire");
private boolean CanBreakBlock = this.getConfig().getBoolean("CanBreakBlock");
private int DPSType = this.getConfig().getInt("DamageType");
private int Scheduler = this.getConfig().getInt("RestackTime")*20;
private int SchedulerAmount = this.getConfig().getInt("RestackAmount");
}