Implementation for basic Fountains

This commit is contained in:
Shaun Bennett 2016-04-17 13:51:15 +10:00
parent 9c2cd6a883
commit fed9f675d3
3 changed files with 143 additions and 0 deletions

View File

@ -0,0 +1,52 @@
package mineplex.core.brawl.fountain;
import java.util.concurrent.atomic.AtomicLong;
/**
* A fountain represents an atomic counter that is trying to hit a goal. Once the fountain
* reaches it's goal you can either reset it or let it stay completed for an indefinite time.
*
* @author Shaun Bennett
*/
public class Fountain
{
// Cached count for the fountain
private AtomicLong _count = new AtomicLong(0);
// The System.currentTimeMillis() when cached count was last updated
private long _cacheLastUpdated;
// The goal that this fountain is trying to reach
private long _goal;
// Redis repository to store the count
private FountainRedisRepository _redisRepository;
public Fountain(String dataKey, long goal)
{
_goal = goal;
_redisRepository = new FountainRedisRepository(dataKey);
updateCount();
}
public void updateCount()
{
_count.set(_redisRepository.getCount());
_cacheLastUpdated = System.currentTimeMillis();
}
public long getCount()
{
return _count.get();
}
public long getGoal()
{
return _goal;
}
public double getFillPercent()
{
return Math.min(100, (((double) getCount()) / _goal));
}
}

View File

@ -0,0 +1,31 @@
package mineplex.core.brawl.fountain;
import mineplex.core.MiniPlugin;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.plugin.java.JavaPlugin;
/**
* @author Shaun Bennett
*/
public class FountainManager extends MiniPlugin
{
private Fountain _gemFountain;
public FountainManager(JavaPlugin plugin)
{
super("Fountain", plugin);
_gemFountain = new Fountain("GemFountain", 1000000);
}
@EventHandler
public void updateFountainCount(UpdateEvent event)
{
if (event.getType() != UpdateType.SLOW)
return;
_gemFountain.updateCount();
}
}

View File

@ -0,0 +1,60 @@
package mineplex.core.brawl.fountain;
import mineplex.serverdata.Region;
import mineplex.serverdata.redis.RedisRepository;
import redis.clients.jedis.Jedis;
/**
* Redis repository to store the count for {@link Fountain}
* @author Shaun Bennett
*/
public class FountainRedisRepository extends RedisRepository
{
private String _dataKey;
public FountainRedisRepository(String dataKey)
{
super(Region.ALL);
_dataKey = dataKey;
}
/**
* Get the current count inside the fountain
* @return The current count for the fountain
*/
public long getCount()
{
long count = 0;
try (Jedis jedis = getResource(false))
{
count = Long.parseLong(jedis.get(getKey()));
}
return count;
}
/**
* Increment the current fountain count by {@code increment} and then return the latest
* count of the fountain. This is handled in an atomic process through redis
* @param increment Amount to increment the fountain by
* @return The new count for the fountain
*/
public long incrementCount(long increment)
{
long count = 0;
try (Jedis jedis = getResource(true))
{
count = jedis.incrBy(getKey(), increment);
}
return count;
}
private String getKey()
{
return getKey(_dataKey);
}
}