Initial commit

This commit is contained in:
kaenganxt
2014-10-19 18:10:52 +02:00
commit aa84ee03b5
32 changed files with 4176 additions and 0 deletions

View File

@@ -0,0 +1,169 @@
package de.anura.core;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerToggleFlightEvent;
import org.bukkit.util.Vector;
public class Features implements Listener {
public enum Feature {
DOUBLE_JUMP(1);
private Feature(int id) {
this.featureId = id;
}
private final int featureId;
private static final HashMap<Integer, Feature> BY_ID = new HashMap<>();
public static Feature getById(Integer id)
{
return BY_ID.get(id);
}
static {
for (Feature feature : values()) {
BY_ID.put(feature.featureId, feature);
}
}
}
public Features()
{
Bukkit.getPluginManager().registerEvents(this, AnuraCore.getInstance());
}
private final HashMap<Player, ArrayList<Feature>> playerFeatures = new HashMap<>();
private final HashMap<Player, Boolean> canDoubleJump = new HashMap<>();
public void updateFeatures(Player P)
{
if(!mainLobby()) return;
try {
ResultSet rs = API.getMySql().querySelect("SELECT featureId FROM coreFeatures WHERE playerId = (SELECT id FROM players WHERE uuid = '"+P.getUniqueId().toString()+"')");
resetPlayerFeatures(P);
playerFeatures.put(P, new ArrayList<Feature>());
while(rs.next())
{
if(Feature.getById(rs.getInt("featureId")) != null)
{
this.addFeature(P, Feature.getById(rs.getInt("featureId")));
}
}
} catch (SQLException ex) {
System.err.println("Could not update player features because of a sql exception: "+ex.getLocalizedMessage());
}
}
public void updateFeaturesAll()
{
if(!mainLobby()) return;
for(Player P : Bukkit.getOnlinePlayers())
{
updateFeatures(P);
}
}
public void reset()
{
for(Player P : Bukkit.getOnlinePlayers())
{
this.resetPlayerFeatures(P);
}
}
public boolean hasFeature(Player P, Feature f)
{
if(!mainLobby()) return false;
if(playerFeatures.containsKey(P))
{
return playerFeatures.get(P).contains(f);
}
return false;
}
private void resetPlayerFeatures(Player P)
{
if(!playerFeatures.containsKey(P)) return;
for(Feature f : (ArrayList<Feature>)playerFeatures.get(P).clone())
{
removeFeature(P, f);
}
}
public void removeFeature(Player P, Feature f)
{
if(!mainLobby()) return;
if(playerFeatures.containsKey(P)) playerFeatures.get(P).remove(f);
if(f.equals(Feature.DOUBLE_JUMP))
{
if(!P.getGameMode().equals(GameMode.CREATIVE))
{
P.setAllowFlight(false);
P.setFoodLevel(20);
}
this.canDoubleJump.put(P, false);
}
}
public void addFeature(Player P, Feature f)
{
if(!mainLobby()) return;
if(playerFeatures.containsKey(P) && !hasFeature(P, f)) playerFeatures.get(P).add(f);
if(f.equals(Feature.DOUBLE_JUMP))
{
P.setAllowFlight(true);
this.canDoubleJump.put(P, true);
}
}
private boolean mainLobby()
{
return AnuraCore.getInstance().getConfig().getBoolean("is-main-lobby");
}
@EventHandler
public void onPlayerMove(PlayerMoveEvent event)
{
if(!mainLobby()) return;
Player P = event.getPlayer();
if(this.hasFeature(P, Feature.DOUBLE_JUMP))
{
if(this.canDoubleJump.containsKey(P) && !this.canDoubleJump.get(P) && ((Entity)P).isOnGround())
{
this.canDoubleJump.put(P, true);
P.setFoodLevel(20);
}
}
}
@EventHandler
public void onToggleFlight(PlayerToggleFlightEvent event)
{
if(!mainLobby()) return;
Player P = event.getPlayer();
if(this.hasFeature(P, Feature.DOUBLE_JUMP) && !P.getGameMode().equals(GameMode.CREATIVE))
{
if(this.canDoubleJump.containsKey(P) && this.canDoubleJump.get(P))
{
this.canDoubleJump.put(P, false);
P.setFoodLevel(1);
Vector v = P.getLocation().getDirection();
P.setVelocity(v.multiply(new Vector(1,2,1)));
P.setVelocity(P.getVelocity().setY(1));
}
else
{
Vector v = P.getVelocity();
P.setVelocity(v.setY(-0.4));
}
event.setCancelled(true);
}
}
}