Initial commit
This commit is contained in:
169
src/de/anura/core/Features.java
Normal file
169
src/de/anura/core/Features.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user