v0.985 Code cleanup + Permissions fix + More settings

This commit is contained in:
Your Name
2011-04-08 00:46:56 +02:00
parent c4e6c65467
commit 6e828996db
11 changed files with 161 additions and 423 deletions

View File

@@ -40,38 +40,19 @@ public class NijiPermissionsResolver implements PermissionsResolver {
} }
@Override @Override
public String getGroup(String player) { public String getGroup(Player player) {
if (!load()) if (!load())
return ""; return "";
return perms.getHandler().getGroup(player); return perms.getHandler().getGroup(player.getWorld().getName(), player.getName());
} }
@Override
public String getGroupPrefix(String player) {
if (!load())
return "";
return perms.getHandler().getGroupPrefix(player);
}
@Override
public String getGroupSuffix(String player) {
if (!load())
return "";
return perms.getHandler().getGroupSuffix(player);
}
@Override
public boolean canGroupBuild(String group) {
if (!load())
return false;
return perms.getHandler().canGroupBuild(group);
}
@Override @Override
public boolean inGroup(Player player, String group) { public boolean inGroup(Player player, String group) {
if (!load()) if (!load())
return false; return false;
return perms.getHandler().inGroup(player.getName(), group); return perms.getHandler().inGroup(player.getWorld().getName(), player.getName(), group);
} }
@Override @Override

View File

@@ -9,16 +9,10 @@ public interface PermissionsResolver {
public abstract boolean permission(CommandSender player, String permCmd); public abstract boolean permission(CommandSender player, String permCmd);
public abstract String getGroup(String player); public abstract String getGroup(Player player);
public abstract boolean inGroup(Player player, String group); public abstract boolean inGroup(Player player, String group);
public abstract String getGroupPrefix(String player);
public abstract String getGroupSuffix(String player);
public abstract boolean canGroupBuild(String group);
public abstract void reloadPerms(); public abstract void reloadPerms();
} }

View File

@@ -18,7 +18,7 @@ public class defaultResolver implements PermissionsResolver {
} }
@Override @Override
public String getGroup(String player) { public String getGroup(Player player) {
return ""; return "";
} }
@@ -27,21 +27,6 @@ public class defaultResolver implements PermissionsResolver {
return false; return false;
} }
@Override
public String getGroupPrefix(String player) {
return "";
}
@Override
public String getGroupSuffix(String player) {
return "";
}
@Override
public boolean canGroupBuild(String group) {
return false;
}
@Override @Override
public boolean load() { public boolean load() {
return true; return true;

View File

@@ -4,20 +4,14 @@ import java.io.File;
import java.io.FilenameFilter; import java.io.FilenameFilter;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DatabaseMetaData; import java.sql.DatabaseMetaData;
import java.sql.Date;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@@ -45,28 +39,22 @@ import com.nidefawl.Stats.udpates.Update2;
import com.nidefawl.Stats.util.Updater; import com.nidefawl.Stats.util.Updater;
public class Stats extends JavaPlugin { public class Stats extends JavaPlugin {
public final static Logger log = Logger.getLogger("Minecraft"); public final static Logger log = Logger.getLogger("Minecraft");
public final static Double version = 0.972; public final static double version = 0.985;
public final static String logprefix = "[Stats-" + version + "]"; public final static String logprefix = "[Stats-" + version + "]";
public final static String defaultCategory = "stats"; public final static String defaultCategory = "stats";
public boolean enabled = false; public boolean enabled = false;
public boolean updated = false; public boolean updated = false;
protected HashMap<String, PlayerStat> stats = new HashMap<String, PlayerStat>(); private HashMap<String, PlayerStat> stats = new HashMap<String, PlayerStat>();
protected HashMap<String, Long> lastPlayerActivity = new HashMap<String, Long>(); private itemResolver items = null;
protected itemResolver items = null; private PermissionsResolver perms = null;
private static PermissionsResolver perms = null; private StatsPlayerListener playerListener = null;
private static StatsPlayerListener playerListener; private StatsVehicleListener vehicleListener = null;
private static StatsVehicleListener vehicleListener; private StatsBlockListener blockListener = null;
private static StatsBlockListener blockListener; private StatsEntityListener entityListener = null;
private static StatsEntityListener entityListener; private StatsServerListener serverListener = null;
private static StatsServerListener serverListener; private Updater updater = null;
long lastDebugWrite = System.currentTimeMillis();
/**
* LWC updater
*
* TODO: Remove when Bukkit has an updater that is working
*/
private Updater updater;
/** /**
* @return the Updater instance * @return the Updater instance
@@ -138,11 +126,44 @@ public class Stats extends JavaPlugin {
} }
return result; return result;
} }
private void updateTimedStats(PlayerStat stat) {
//check if new items already added if (playerListener.distWalked.containsKey(stat.getName())) {
//if not then write them to file and update stat-keys in database int distance = (int) Math.floor(playerListener.distWalked.get(stat.getName()));
private void update2() { if (distance >= 1) {
Category cat = stat.categories.get("stats");
if (cat == null)
cat = stat.newCategory("stats");
cat.add("move", distance);
playerListener.distWalked.put(stat.getName(), 0.0f);
stat.setLastActivity();
}
}
if (vehicleListener.distBoat.containsKey(stat.getName())) {
int distance = (int) Math.floor(vehicleListener.distBoat.get(stat.getName()));
if (distance >= 1) {
Category cat = stat.categories.get("boat");
if (cat == null)
cat = stat.newCategory("boat");
cat.add("move", distance);
vehicleListener.distBoat.put(stat.getName(), 0.0f);
stat.setLastActivity();
}
}
if (vehicleListener.distCart.containsKey(stat.getName())) {
int distance = (int) Math.floor(vehicleListener.distCart.get(stat.getName()));
if (distance >= 1) {
Category cat = stat.categories.get("minecart");
if (cat == null)
cat = stat.newCategory("minecart");
cat.add("move", distance);
vehicleListener.distCart.put(stat.getName(), 0.0f);
stat.setLastActivity();
}
}
if (StatsSettings.afkTimer > 0 && !stat.isAfk()) {
updateStat(stat.getName(), defaultCategory, "playedfor", (int) (System.currentTimeMillis() - stat.lastUpdate) / 1000, false);
}
stat.lastUpdate = System.currentTimeMillis();
} }
public void setSavedStats(CommandSender sender, String player, String category, String key, String value) { public void setSavedStats(CommandSender sender, String player, String category, String key, String value) {
ArrayList<String> tounload = new ArrayList<String>(); ArrayList<String> tounload = new ArrayList<String>();
@@ -247,7 +268,7 @@ public class Stats extends JavaPlugin {
Messaging.send(player, StatsSettings.premessage + "No Playedtime yet!"); Messaging.send(player, StatsSettings.premessage + "No Playedtime yet!");
return true; return true;
} }
Messaging.send(player, StatsSettings.premessage + "You played for "+ChatColor.WHITE + GetTimeString(playedFor)); Messaging.send(player, StatsSettings.premessage + "You played for "+ChatColor.WHITE + StatsView.GetTimeString(playedFor));
return true; return true;
} }
} }
@@ -297,138 +318,13 @@ public class Stats extends JavaPlugin {
sender.sendMessage(StatsSettings.premessage + ChatColor.WHITE + "Debugging " + (StatsSettings.debugOutput ? "enabled. Check server log." : "disabled.")); sender.sendMessage(StatsSettings.premessage + ChatColor.WHITE + "Debugging " + (StatsSettings.debugOutput ? "enabled. Check server log." : "disabled."));
return true; return true;
} }
if(!Perms().permission(sender, "stats.view.own")) { return StatsView.onCommand(this, sender, args);
sender.sendMessage(ChatColor.RED + "You don't have permission to view your stats!");
return true;
}
Player who = null;
if(sender instanceof Player) {
who = (Player)sender;
}
int offs = 0;
if(args.length>0) {
who = playerMatch(args[0]);
if(who!=null) {
if(!Perms().permission(sender, "stats.view.others")) {
sender.sendMessage(ChatColor.RED + "You don't have permission to view others stats!");
return true;
}
offs++;
} else {
if ((sender instanceof ConsoleCommandSender)) {
sender.sendMessage(ChatColor.RED + "Player '"+args[0]+"' is not online!");
return false;
} else {
who = (Player)sender;
}
}
}
if (args.length == offs + 1) {
if (isStat(who.getName(), args[offs])) {
printStat(sender, who, "stats", args[offs]);
return true;
} else if (getItems().getItem(args[offs]) != 0 && !(args[offs].equals("boat") || args[offs].equals("minecart"))) {
printStat(sender, who, "blockcreate", args[offs]);
printStat(sender, who, "blockdestroy", args[offs]);
return true;
} else if (isCat(who.getName(), args[offs])) {
sender.sendMessage(StatsSettings.premessage + "Please choose: (/stats " + args[offs] + " <stat-name>)");
sender.sendMessage(StatsSettings.premessage + ChatColor.WHITE + getCatEntries(who.getName(), args[offs]));
return true;
} else {
sender.sendMessage(StatsSettings.premessage + ChatColor.RED + "stat/category '" + args[offs] + "' not found. Possible values:");
sender.sendMessage(StatsSettings.premessage + ChatColor.WHITE + getCats(who.getName()));
return true;
}
} else if (args.length == offs + 2) {
if (isCat(who.getName(), args[offs])) {
printStat(sender, who, args[offs], args[offs + 1]);
return true;
} else {
sender.sendMessage(StatsSettings.premessage + ChatColor.RED + "stat/category '" + args[offs] + "' not found. Possible values:");
sender.sendMessage(StatsSettings.premessage + ChatColor.WHITE + getCats(who.getName()));
return true;
}
}
int playedTime = get(who.getName(), "stats", "playedfor");
int movedBlocks = get(who.getName(), "stats", "move");
int totalCreate = get(who.getName(), "stats", "totalblockcreate");
int totalDestroy = get(who.getName(), "stats", "totalblockdestroy");
int tkills = get(who.getName(), "kills", "total");
int tdeaths = get(who.getName(), "deaths", "total");
int pdeaths = get(who.getName(), "deaths", "player");
int pkills = get(who.getName(), "kills", "player");
int totalDamage = get(who.getName(), "damagetaken", "total");
int totalDamageDealt = get(who.getName(), "damagedealt", "total");
try {
sender.sendMessage("------------------------------------------------");
sender.sendMessage(ChatColor.GOLD + " stats for " + ChatColor.WHITE + who.getName() + ChatColor.GOLD + ": (" + ChatColor.WHITE + "/stats help for more" + ChatColor.GOLD + ")");
sender.sendMessage("------------------------------------------------");
String s1 = ChatColor.GOLD + "[" + ChatColor.YELLOW + "Playedtime" + ChatColor.GOLD + "]" + ChatColor.YELLOW;
while (MinecraftFontWidthCalculator.getStringWidth(sender,s1) < 120)
s1 += " ";
s1 += ChatColor.WHITE + GetTimeString(playedTime);
sender.sendMessage(s1);
s1 = ChatColor.GOLD + "[" + ChatColor.YELLOW + "Moved" + ChatColor.GOLD + "]" + ChatColor.YELLOW;
while (MinecraftFontWidthCalculator.getStringWidth(sender,s1) < 120)
s1 += " ";
s1 += ChatColor.WHITE + String.valueOf(movedBlocks) + " blocks";
sender.sendMessage(s1);
printStatFormatted(sender, "Blocks", "created", totalCreate, "destroyed", totalDestroy);
printStatFormatted(sender, "Deaths", "total", tdeaths, "player", pdeaths);
printStatFormatted(sender, "Kills", "total", tkills, "player", pkills);
printStatFormatted(sender, "Damage", "dealt", totalDamageDealt, "taken", totalDamage);
sender.sendMessage("------------------------------------------------");
} catch (Exception e) {
// TODO: handle exception
}
return true;
} }
return false; return false;
} }
private void printStatFormatted(CommandSender sender, String name, String title1, int value1, String title2, int value2) {
String s1 = ChatColor.GOLD + "[" + ChatColor.YELLOW + name + ChatColor.GOLD + "]" + ChatColor.YELLOW;
while (MinecraftFontWidthCalculator.getStringWidth(sender,s1) < 120)
s1 += " ";
if (title2 != null)
s1 += ChatColor.WHITE + title1 + "/" + title2;
else
s1 += ChatColor.WHITE + title1;
while (MinecraftFontWidthCalculator.getStringWidth(sender,s1) < 240)
s1 += " ";
if (title2 != null)
s1 += value1 + "/" + value2;
else
s1 += value1;
sender.sendMessage(s1);
}
public void printStat(CommandSender sendTo, Player statPlayer, String cat, String stat) {
long statVal = get(statPlayer.getName(), cat, stat);
String statString = "" + statVal;
if (stat.equalsIgnoreCase("playedfor")) {
statString = GetTimeString((int) statVal);
}
if (stat.equalsIgnoreCase("lastlogout") || stat.equalsIgnoreCase("lastlogin")) {
Date logDate = new Date(statVal * 1000);
SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yy hh:mm");
statString = format.format(logDate);
}
sendTo.sendMessage(StatsSettings.premessage + cat + "/" + stat + ": " + ChatColor.WHITE + statString);
}
public String GetTimeString(int Seconds) {
int days = (int) Math.ceil(Seconds / (24 * 3600));
int hours = (int) Math.ceil((Seconds - (24 * 3600 * days)) / 3600);
int minutes = (int) Math.ceil((Seconds - (24 * 3600 * days + 3600 * hours)) / 60);
String timeString = "";
timeString += days + "d " + hours + "h " + minutes + "m";
return timeString;
}
public void CreatePermissionResolver() { public void CreatePermissionResolver() {
@@ -569,7 +465,6 @@ public class Stats extends JavaPlugin {
Update1.execute(this); Update1.execute(this);
Update2.execute(this); Update2.execute(this);
items = new hModItemResolver(new File(getDataFolder(),"items.txt")); items = new hModItemResolver(new File(getDataFolder(),"items.txt"));
update2();
stats = new HashMap<String, PlayerStat>(); stats = new HashMap<String, PlayerStat>();
CreatePermissionResolver(); CreatePermissionResolver();
enabled = true; enabled = true;
@@ -586,13 +481,7 @@ public class Stats extends JavaPlugin {
getServer().getScheduler().scheduleSyncRepeatingTask(this, new SaveTask(this), StatsSettings.delay * 20, StatsSettings.delay * 20); getServer().getScheduler().scheduleSyncRepeatingTask(this, new SaveTask(this), StatsSettings.delay * 20, StatsSettings.delay * 20);
} }
public Player playerMatch(String name) {
List<Player> list = getServer().matchPlayer(name);
for (Player p : list)
if (p != null && p.getName().equalsIgnoreCase(name))
return p;
return null;
}
public static class SaveTask implements Runnable { public static class SaveTask implements Runnable {
private Stats statsInstance; private Stats statsInstance;
@@ -629,26 +518,42 @@ public class Stats extends JavaPlugin {
} }
public void initialize() { public void initialize() {
getServer().getPluginManager().registerEvent(Event.Type.PLUGIN_DISABLE, serverListener, Priority.Normal, this);
getServer().getPluginManager().registerEvent(Event.Type.PLUGIN_ENABLE, serverListener, Priority.Normal, this);
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_JOIN, playerListener, Priority.Highest, this); getServer().getPluginManager().registerEvent(Event.Type.PLAYER_JOIN, playerListener, Priority.Highest, this);
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_COMMAND_PREPROCESS, playerListener, Priority.Normal, this); getServer().getPluginManager().registerEvent(Event.Type.PLAYER_COMMAND_PREPROCESS, playerListener, Priority.Normal, this);
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_QUIT, playerListener, Priority.Normal, this); getServer().getPluginManager().registerEvent(Event.Type.PLAYER_QUIT, playerListener, Priority.Normal, this);
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_CHAT, playerListener, Priority.Monitor, this); getServer().getPluginManager().registerEvent(Event.Type.PLAYER_CHAT, playerListener, Priority.Monitor, this);
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_MOVE, playerListener, Priority.Monitor, this);
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_ANIMATION, playerListener, Priority.Monitor, this);
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_TELEPORT, playerListener, Priority.Monitor, this); getServer().getPluginManager().registerEvent(Event.Type.PLAYER_TELEPORT, playerListener, Priority.Monitor, this);
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_INTERACT, playerListener, Priority.Monitor, this);
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_DROP_ITEM, playerListener, Priority.Monitor, this); getServer().getPluginManager().registerEvent(Event.Type.PLAYER_DROP_ITEM, playerListener, Priority.Monitor, this);
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_PICKUP_ITEM, playerListener, Priority.Monitor, this); getServer().getPluginManager().registerEvent(Event.Type.PLAYER_PICKUP_ITEM, playerListener, Priority.Monitor, this);
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_RESPAWN, playerListener, Priority.Monitor, this); getServer().getPluginManager().registerEvent(Event.Type.PLAYER_RESPAWN, playerListener, Priority.Monitor, this);
if(StatsSettings.logPlayerAnimations) {
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_ANIMATION, playerListener, Priority.Monitor, this);
}
if(StatsSettings.logMove) {
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_MOVE, playerListener, Priority.Monitor, this);
}
if(StatsSettings.logBlockCreate) {
getServer().getPluginManager().registerEvent(Event.Type.BLOCK_PLACE, blockListener, Priority.Monitor, this); getServer().getPluginManager().registerEvent(Event.Type.BLOCK_PLACE, blockListener, Priority.Monitor, this);
getServer().getPluginManager().registerEvent(Event.Type.BLOCK_IGNITE, blockListener, Priority.Monitor, this); }
if(StatsSettings.logBlockDestroy) {
getServer().getPluginManager().registerEvent(Event.Type.BLOCK_BREAK, blockListener, Priority.Monitor, this); getServer().getPluginManager().registerEvent(Event.Type.BLOCK_BREAK, blockListener, Priority.Monitor, this);
getServer().getPluginManager().registerEvent(Event.Type.ENTITY_DEATH, entityListener, Priority.Lowest, this); }
if(StatsSettings.logItemUse) {
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_INTERACT, playerListener, Priority.Monitor, this);
}
if(StatsSettings.logBlockIgnite){
getServer().getPluginManager().registerEvent(Event.Type.BLOCK_IGNITE, blockListener, Priority.Monitor, this);
}
if(StatsSettings.logDamage) {
getServer().getPluginManager().registerEvent(Event.Type.ENTITY_DEATH, entityListener, Priority.Highest, this);
getServer().getPluginManager().registerEvent(Event.Type.ENTITY_DAMAGE, entityListener, Priority.Highest, this); getServer().getPluginManager().registerEvent(Event.Type.ENTITY_DAMAGE, entityListener, Priority.Highest, this);
}
if(StatsSettings.logVehicle) {
getServer().getPluginManager().registerEvent(Event.Type.VEHICLE_ENTER, vehicleListener, Priority.Monitor, this); getServer().getPluginManager().registerEvent(Event.Type.VEHICLE_ENTER, vehicleListener, Priority.Monitor, this);
getServer().getPluginManager().registerEvent(Event.Type.VEHICLE_MOVE, vehicleListener, Priority.Monitor, this); getServer().getPluginManager().registerEvent(Event.Type.VEHICLE_MOVE, vehicleListener, Priority.Monitor, this);
getServer().getPluginManager().registerEvent(Event.Type.PLUGIN_DISABLE, serverListener, Priority.Normal, this); }
getServer().getPluginManager().registerEvent(Event.Type.PLUGIN_ENABLE, serverListener, Priority.Normal, this);
} }
public void updateStat(Player player, String statType, boolean resetAfkTimer) { public void updateStat(Player player, String statType, boolean resetAfkTimer) {
@@ -690,7 +595,7 @@ public class Stats extends JavaPlugin {
cat = ps.newCategory(category); cat = ps.newCategory(category);
cat.add(key, val); cat.add(key, val);
if (resetAfkTimer) if (resetAfkTimer)
ps.setLastUpdate(); ps.setLastActivity();
if (StatsSettings.debugOutput) if (StatsSettings.debugOutput)
log.info(logprefix + " [DEBUG]: adding " + val + " to " + category + "/" + key + " of " + player); log.info(logprefix + " [DEBUG]: adding " + val + " to " + category + "/" + key + " of " + player);
} }
@@ -702,118 +607,6 @@ public class Stats extends JavaPlugin {
ps.put(category, key, val); ps.put(category, key, val);
} }
public boolean isCat(String player, String category) {
PlayerStat ps = stats.get(player);
if (ps == null)
return false;
Category cat = ps.get(category);
if (cat == null)
return false;
return true;
}
String viewStats(String player, String stat) {
return stat;
}
public void updateMove(String player, Location from, Location to) {
if (!enabled)
return;
if (player == null || player.length() < 1) {
LogError("updateMove got empty player for " + player);
return;
}
PlayerStat ps = stats.get(player);
if (ps == null)
return;
ps.UpdateMove(from.toVector().distance(to.toVector()));
}
public void updateVehicleMove(String player, Vehicle vhc, Location from, Location to) {
if (!enabled)
return;
if (player == null || player.length() < 1) {
LogError("updateVehicleMove got empty player for " + player);
return;
}
PlayerStat ps = stats.get(player);
if (ps == null)
return;
double Distance = from.toVector().distance(to.toVector());
if (vhc instanceof org.bukkit.entity.Boat) {
ps.UpdateBoatMove(Distance);
} else if (vhc instanceof org.bukkit.entity.Minecart) {
ps.UpdateMinecartMove(Distance);
}
}
public String getCatEntries(String player, String category) {
PlayerStat ps = stats.get(player);
if (ps == null)
return "player not found";
Set<String> cats = ps.getCats();
if (cats.size() == 0)
return "no categories founnd";
Category cat = ps.get(category);
if (cat == null)
return "category not found";
Set<String> entris = cat.getEntries();
int length = (entris.size() - 1);
int on = 0;
String list = "";
for (String currentName : entris) {
if (currentName == null) {
++on;
continue;
}
list += (on >= length) ? currentName : currentName + ", ";
++on;
}
list += " ";
return list;
}
public String getCats(String player) {
PlayerStat ps = stats.get(player);
if (ps == null)
return "no categories found";
Set<String> cats = ps.getCats();
if (cats.size() == 0)
return "no categories found";
int length = (cats.size() - 1);
int on = 0;
String list = "";
for (String currentName : cats) {
if (currentName == null) {
++on;
continue;
}
list += (on >= length) ? currentName : currentName + ", ";
++on;
}
list += " ";
return list;
}
public boolean isStat(String player, String stat) {
PlayerStat ps = stats.get(player);
if (ps == null)
return false;
Category cat = ps.get("stats");
if (cat == null)
return false;
if (cat.get(stat) == 0)
return false;
return true;
}
public int get(String player, String category, String key) { public int get(String player, String category, String key) {
PlayerStat ps = stats.get(player); PlayerStat ps = stats.get(player);
if (ps == null) if (ps == null)
@@ -840,7 +633,6 @@ public class Stats extends JavaPlugin {
} }
PlayerStat ps = new PlayerStatSQL(player.getName(), this); PlayerStat ps = new PlayerStatSQL(player.getName(), this);
ps.load(); ps.load();
ps.skipTeleports = 2;
stats.put(player.getName(), ps); stats.put(player.getName(), ps);
if (StatsSettings.debugOutput) if (StatsSettings.debugOutput)
LogInfo("player " + player.getName() + " has been loaded."); LogInfo("player " + player.getName() + " has been loaded.");
@@ -850,6 +642,7 @@ public class Stats extends JavaPlugin {
entityListener.UnloadPlayer(player); entityListener.UnloadPlayer(player);
if (stats.containsKey(player)) { if (stats.containsKey(player)) {
PlayerStat ps = stats.get(player); PlayerStat ps = stats.get(player);
updateTimedStats(ps);
ps.save(); ps.save();
stats.remove(player); stats.remove(player);
return; return;
@@ -874,15 +667,11 @@ public class Stats extends JavaPlugin {
e.printStackTrace(); e.printStackTrace();
} }
for (PlayerStat stat : stats.values()) { for (PlayerStat stat : stats.values()) {
if (stat == null || playerMatch(stat.getName()) == null) { if (stat == null || getServer().getPlayer(stat.getName()) == null) {
stat.unload = true; stat.unload = true;
continue; continue;
} }
if (StatsSettings.afkTimer > 0 && !stat.isAfk()) { updateTimedStats(stat);
updateStat(stat.getName(), defaultCategory, "playedfor", (int) StatsSettings.delay, false);
} else if (StatsSettings.debugOutput) {
log.info("Stats debug: not updating playedfor for afk player " + stat.getName());
}
stat.save(false); stat.save(false);
} }
StatsSQLConnectionManager.closeConnection(StatsSettings.useMySQL); StatsSQLConnectionManager.closeConnection(StatsSettings.useMySQL);
@@ -943,14 +732,20 @@ public class Stats extends JavaPlugin {
} }
} }
public void onLoad() { public void setStats(HashMap<String, PlayerStat> stats) {
this.stats = stats;
} }
/**
* @param perms the perms to set public HashMap<String, PlayerStat> getStats() {
*/ return stats;
public static void setPerms(PermissionsResolver perms) { }
Stats.perms = perms;
public PermissionsResolver getPerms() {
return perms;
}
public void setPerms(PermissionsResolver perms) {
this.perms = perms;
} }
} }

View File

@@ -281,7 +281,6 @@ public class StatsEntityListener extends EntityListener {
PlayerStat ps = plugin.getPlayerStat(p.getName()); PlayerStat ps = plugin.getPlayerStat(p.getName());
if (ps == null) if (ps == null)
return; return;
ps.skipTeleports = 1;
plugin.updateStat(p, "deaths", "total", 1,false); plugin.updateStat(p, "deaths", "total", 1,false);
String otherReason = otherDeathCauses.get(p); String otherReason = otherDeathCauses.get(p);
otherReason = otherReason != null ? otherReason : "unknown"; otherReason = otherReason != null ? otherReason : "unknown";

View File

@@ -1,13 +1,14 @@
package com.nidefawl.Stats; package com.nidefawl.Stats;
import java.util.HashMap;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.craftbukkit.entity.CraftItem; import org.bukkit.craftbukkit.entity.CraftItem;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.event.player.*; import org.bukkit.event.player.*;
import com.nidefawl.Stats.datasource.PlayerStat;
public class StatsPlayerListener extends PlayerListener { public class StatsPlayerListener extends PlayerListener {
public HashMap<String, Float> distWalked = new HashMap<String, Float>();
protected Stats plugin; protected Stats plugin;
public StatsPlayerListener(Stats plugin) { public StatsPlayerListener(Stats plugin) {
@@ -64,8 +65,12 @@ public class StatsPlayerListener extends PlayerListener {
public void onPlayerMove(PlayerMoveEvent event) { public void onPlayerMove(PlayerMoveEvent event) {
if (event.isCancelled()) if (event.isCancelled())
return; return;
plugin.updateMove(event.getPlayer().getName(), event.getFrom(), event.getTo()); if (distWalked.containsKey(event.getPlayer().getName())) {
float newDistance = distWalked.get(event.getPlayer().getName()) + (float) (event.getFrom().toVector().distance(event.getTo().toVector()));
distWalked.put(event.getPlayer().getName(), newDistance);
} else {
distWalked.put(event.getPlayer().getName(), (float) (event.getFrom().toVector().distance(event.getTo().toVector())));
}
} }
/** /**
@@ -78,16 +83,8 @@ public class StatsPlayerListener extends PlayerListener {
public void onPlayerTeleport(PlayerTeleportEvent event) { public void onPlayerTeleport(PlayerTeleportEvent event) {
if (event.isCancelled()) if (event.isCancelled())
return; return;
if (event.getTo().equals(event.getPlayer().getWorld().getSpawnLocation())) if(event.getFrom().toVector().distance(event.getTo().toVector())>5)
return; plugin.updateStat(event.getPlayer(), "teleport", true);
PlayerStat ps = plugin.getPlayerStat(event.getPlayer().getName());
if (ps == null)
return;
if (ps.skipTeleports > 0) {
ps.skipTeleports--;
return;
}
plugin.updateStat(event.getPlayer(), "teleport", false);
} }
/** /**

View File

@@ -20,6 +20,14 @@ public class StatsSettings {
public static boolean useMySQL; public static boolean useMySQL;
public static String libPath; public static String libPath;
public static String premessage = ChatColor.YELLOW + "[Stats]" + ChatColor.WHITE; public static String premessage = ChatColor.YELLOW + "[Stats]" + ChatColor.WHITE;
public static boolean logMove;
public static boolean logVehicle;
public static boolean logBlockCreate;
public static boolean logBlockDestroy;
public static boolean logDamage;
public static boolean logItemUse;
public static boolean logBlockIgnite;
public static boolean logPlayerAnimations;
public static void load(Stats plugin) { public static void load(Stats plugin) {
@@ -41,7 +49,15 @@ public class StatsSettings {
premessage = properties.getString("stats-message-prefix", "&e[Stats]&f", ""); premessage = properties.getString("stats-message-prefix", "&e[Stats]&f", "");
debugOutput = properties.getBoolean("stats-debug", false, ""); debugOutput = properties.getBoolean("stats-debug", false, "");
deathNotifying = properties.getBoolean("stats-deathnotify", true, ""); deathNotifying = properties.getBoolean("stats-deathnotify", true, "");
autoUpdate = properties.getBoolean("stats-autoUpdate", true, ""); autoUpdate = properties.getBoolean("stats-autoUpdate", false, "");
logMove = properties.getBoolean("stats-log-move", true, "disable/enable logging player move events");
logVehicle = properties.getBoolean("stats-log-vehicle", true, "disable/enable logging of vehicle events");
logBlockCreate = properties.getBoolean("stats-log-blockcreate", true, "disable/enable logging blockcreate");
logBlockDestroy = properties.getBoolean("stats-log-blockdestroy", true, "disable/enable logging blockdestroy");
logDamage = properties.getBoolean("stats-log-damage-events", true, "disable/enable logging of damage AND death events");
logItemUse = properties.getBoolean("stats-log-itemuse", true, "disable/enable logging of item use events");
logBlockIgnite = properties.getBoolean("stats-log-block-ignite", true, "disable/enable logging of block ignite events");
logPlayerAnimations = properties.getBoolean("stats-log-player-animations", true, "disable/enable logging of player-animations (armswing)");
if (premessage.length() > 0) if (premessage.length() > 0)
if (premessage.charAt(premessage.length() - 1) != ' ') if (premessage.charAt(premessage.length() - 1) != ' ')
premessage += " "; premessage += " ";

View File

@@ -1,5 +1,8 @@
package com.nidefawl.Stats; package com.nidefawl.Stats;
import java.util.HashMap;
import org.bukkit.entity.Boat;
import org.bukkit.entity.Minecart;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.vehicle.*; import org.bukkit.event.vehicle.*;
@@ -10,7 +13,8 @@ import org.bukkit.event.vehicle.*;
*/ */
public class StatsVehicleListener extends VehicleListener { public class StatsVehicleListener extends VehicleListener {
private Stats plugin; private Stats plugin;
public HashMap<String,Float> distBoat = new HashMap<String,Float>();
public HashMap<String,Float> distCart = new HashMap<String,Float>();
public StatsVehicleListener(Stats plugin) { public StatsVehicleListener(Stats plugin) {
this.plugin = plugin; this.plugin = plugin;
} }
@@ -84,6 +88,21 @@ public class StatsVehicleListener extends VehicleListener {
return; return;
if (!(event.getVehicle().getPassenger() instanceof Player)) if (!(event.getVehicle().getPassenger() instanceof Player))
return; return;
plugin.updateVehicleMove(((Player) event.getVehicle().getPassenger()).getName(), event.getVehicle(), event.getFrom(), event.getTo()); Player p = (Player) event.getVehicle().getPassenger();
if(event.getVehicle() instanceof Boat) {
if(distBoat.containsKey(p.getName())) {
float newDistance = distBoat.get(p.getName()) + (float) (event.getFrom().toVector().distance(event.getTo().toVector()));
distBoat.put(p.getName(), newDistance);
} else {
distBoat.put(p.getName(), (float) (event.getFrom().toVector().distance(event.getTo().toVector())));
}
} else if (event.getVehicle() instanceof Minecart) {
if(distBoat.containsKey(p.getName())) {
float newDistance = distBoat.get(p.getName()) + (float) (event.getFrom().toVector().distance(event.getTo().toVector()));
distBoat.put(p.getName(), newDistance);
} else {
distBoat.put(p.getName(), (float) (event.getFrom().toVector().distance(event.getTo().toVector())));
}
}
} }
} }

View File

@@ -3,23 +3,17 @@ package com.nidefawl.Stats.datasource;
import java.io.File; import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import java.util.Set; import java.util.Set;
import java.util.logging.Logger;
import org.bukkit.block.Block;
import com.nidefawl.Stats.StatsSettings; import com.nidefawl.Stats.StatsSettings;
public abstract class PlayerStat { public abstract class PlayerStat {
private String name; private String name;
public HashMap<String, Category> categories; public HashMap<String, Category> categories;
static final Logger log = Logger.getLogger("Minecraft");
private double moveDistance = 0;
private double minecartDistance = 0;
private double boatDistance = 0;
private int lastBoatEnter = 0; private int lastBoatEnter = 0;
private int lastMinecartEnter = 0; private int lastMinecartEnter = 0;
private long lastUpdate = System.currentTimeMillis(); public long lastUpdate = System.currentTimeMillis();
public int skipTeleports = 0;
Block lastFace = null;
public boolean unload = false; public boolean unload = false;
private long lastActivity = System.currentTimeMillis();
public PlayerStat(String name) { public PlayerStat(String name) {
this.name = name; this.name = name;
@@ -48,7 +42,6 @@ public abstract class PlayerStat {
cat = newCategory(category); cat = newCategory(category);
else else
cat = categories.get(category); cat = categories.get(category);
cat.put(key, val); cat.put(key, val);
} }
@@ -61,7 +54,6 @@ public abstract class PlayerStat {
PlayerStat psold = new PlayerStatFile(name, directory); PlayerStat psold = new PlayerStatFile(name, directory);
psold.load(); psold.load();
copy(psold); copy(psold);
String location = directory + "/" + name + ".txt"; String location = directory + "/" + name + ".txt";
File fold = new File(location); File fold = new File(location);
File fnew = new File(location + ".bak"); File fnew = new File(location + ".bak");
@@ -74,42 +66,6 @@ public abstract class PlayerStat {
public abstract void load(); public abstract void load();
public void UpdateMove(double distance) {
moveDistance += distance;
if (moveDistance > 10.0F) {
Category cat = categories.get("stats");
if (cat == null)
cat = newCategory("stats");
cat.add("move", 10);
moveDistance = 0;
setLastUpdate();
}
}
public void UpdateMinecartMove(double distance) {
minecartDistance += distance;
if (minecartDistance >= 10.0F) {
Category cat = categories.get("minecart");
if (cat == null)
cat = newCategory("minecart");
cat.add("move", 10);
minecartDistance = 0;
setLastUpdate();
}
}
public void UpdateBoatMove(double distance) {
boatDistance += distance;
if (boatDistance >= 10.0F) {
Category cat = categories.get("boat");
if (cat == null)
cat = newCategory("boat");
cat.add("move", 10);
boatDistance = 0;
setLastUpdate();
}
}
public void setLastMinecartEnter(int lastMinecartEnter) { public void setLastMinecartEnter(int lastMinecartEnter) {
this.lastMinecartEnter = lastMinecartEnter; this.lastMinecartEnter = lastMinecartEnter;
} }
@@ -145,15 +101,14 @@ public abstract class PlayerStat {
* @param lastUpdate * @param lastUpdate
* the lastUpdate to set * the lastUpdate to set
*/ */
public void setLastUpdate() { public void setLastActivity() {
this.lastUpdate = System.currentTimeMillis(); this.lastActivity = System.currentTimeMillis();
} }
/** /**
* @return the lastUpdate * @return the lastUpdate
*/ */
public boolean isAfk() { public boolean isAfk() {
return System.currentTimeMillis() - lastUpdate > StatsSettings.afkTimer * 1000; return System.currentTimeMillis() - lastActivity > StatsSettings.afkTimer * 1000;
} }
} }

View File

@@ -1,14 +1,11 @@
package com.nidefawl.Stats.datasource; package com.nidefawl.Stats.datasource;
import java.util.logging.Logger;
import java.sql.*; import java.sql.*;
import com.nidefawl.Stats.Stats; import com.nidefawl.Stats.Stats;
import com.nidefawl.Stats.StatsSettings; import com.nidefawl.Stats.StatsSettings;
public class PlayerStatSQL extends PlayerStat { public class PlayerStatSQL extends PlayerStat {
static final Logger log = Logger.getLogger("Minecraft");
public final String logprefix = "[Stats-" + Stats.version + "]";
Stats plugin = null; Stats plugin = null;
public PlayerStatSQL(String name, Stats plugin) { public PlayerStatSQL(String name, Stats plugin) {

View File

@@ -1,6 +1,6 @@
name: Stats name: Stats
main: com.nidefawl.Stats.Stats main: com.nidefawl.Stats.Stats
version: 0.972 version: 0.985
author: nidefawl author: nidefawl
commands: commands:
stats: stats: