2013-04-22 09:37:53 +02:00
|
|
|
package com.massivecraft.factions.entity;
|
2013-04-11 08:49:14 +02:00
|
|
|
|
2017-03-24 13:05:58 +01:00
|
|
|
import com.massivecraft.factions.RelationParticipator;
|
|
|
|
import com.massivecraft.factions.TerritoryAccess;
|
|
|
|
import com.massivecraft.massivecore.collections.MassiveMap;
|
|
|
|
import com.massivecraft.massivecore.collections.MassiveSet;
|
|
|
|
import com.massivecraft.massivecore.ps.PS;
|
|
|
|
import com.massivecraft.massivecore.store.Coll;
|
|
|
|
import com.massivecraft.massivecore.util.MUtil;
|
|
|
|
|
2014-10-07 17:08:40 +02:00
|
|
|
import java.util.Collection;
|
2013-04-24 11:16:37 +02:00
|
|
|
import java.util.HashSet;
|
2014-10-13 11:42:40 +02:00
|
|
|
import java.util.LinkedHashMap;
|
2014-10-07 17:08:40 +02:00
|
|
|
import java.util.LinkedHashSet;
|
2016-03-15 20:43:54 +01:00
|
|
|
import java.util.List;
|
2014-10-13 11:42:40 +02:00
|
|
|
import java.util.Map;
|
2014-10-22 07:50:30 +02:00
|
|
|
import java.util.Map.Entry;
|
2013-04-24 11:16:37 +02:00
|
|
|
import java.util.Set;
|
2013-04-11 09:50:48 +02:00
|
|
|
|
2013-04-12 15:10:11 +02:00
|
|
|
public class BoardColl extends Coll<Board> implements BoardInterface
|
2013-04-11 08:49:14 +02:00
|
|
|
{
|
|
|
|
// -------------------------------------------- //
|
2014-09-17 13:17:33 +02:00
|
|
|
// INSTANCE & CONSTRUCT
|
2013-04-11 08:49:14 +02:00
|
|
|
// -------------------------------------------- //
|
|
|
|
|
2014-09-17 13:17:33 +02:00
|
|
|
private static BoardColl i = new BoardColl();
|
|
|
|
public static BoardColl get() { return i; }
|
|
|
|
private BoardColl()
|
2013-04-11 08:49:14 +02:00
|
|
|
{
|
2015-12-01 11:23:47 +01:00
|
|
|
this.setCreative(true);
|
|
|
|
this.setLowercasing(true);
|
2013-04-11 08:49:14 +02:00
|
|
|
}
|
2015-02-02 00:25:29 +01:00
|
|
|
|
|
|
|
// -------------------------------------------- //
|
|
|
|
// STACK TRACEABILITY
|
|
|
|
// -------------------------------------------- //
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onTick()
|
|
|
|
{
|
|
|
|
super.onTick();
|
|
|
|
}
|
2013-04-11 08:49:14 +02:00
|
|
|
|
2013-04-11 09:25:26 +02:00
|
|
|
// -------------------------------------------- //
|
|
|
|
// OVERRIDE: COLL
|
|
|
|
// -------------------------------------------- //
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String fixId(Object oid)
|
|
|
|
{
|
|
|
|
if (oid == null) return null;
|
|
|
|
if (oid instanceof String) return (String)oid;
|
2015-11-21 22:26:00 +01:00
|
|
|
if (oid instanceof Board) return ((Board)oid).getId();
|
2013-04-11 09:25:26 +02:00
|
|
|
|
|
|
|
return MUtil.extract(String.class, "worldName", oid);
|
|
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------------------- //
|
|
|
|
// OVERRIDE: BOARD
|
|
|
|
// -------------------------------------------- //
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public TerritoryAccess getTerritoryAccessAt(PS ps)
|
|
|
|
{
|
|
|
|
if (ps == null) return null;
|
|
|
|
Board board = this.get(ps.getWorld());
|
|
|
|
if (board == null) return null;
|
|
|
|
return board.getTerritoryAccessAt(ps);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Faction getFactionAt(PS ps)
|
|
|
|
{
|
|
|
|
if (ps == null) return null;
|
|
|
|
Board board = this.get(ps.getWorld());
|
|
|
|
if (board == null) return null;
|
|
|
|
return board.getFactionAt(ps);
|
|
|
|
}
|
|
|
|
|
|
|
|
// SET
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setTerritoryAccessAt(PS ps, TerritoryAccess territoryAccess)
|
|
|
|
{
|
|
|
|
if (ps == null) return;
|
|
|
|
Board board = this.get(ps.getWorld());
|
|
|
|
if (board == null) return;
|
|
|
|
board.setTerritoryAccessAt(ps, territoryAccess);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setFactionAt(PS ps, Faction faction)
|
|
|
|
{
|
|
|
|
if (ps == null) return;
|
|
|
|
Board board = this.get(ps.getWorld());
|
|
|
|
if (board == null) return;
|
|
|
|
board.setFactionAt(ps, faction);
|
|
|
|
}
|
|
|
|
|
|
|
|
// REMOVE
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void removeAt(PS ps)
|
|
|
|
{
|
|
|
|
if (ps == null) return;
|
|
|
|
Board board = this.get(ps.getWorld());
|
|
|
|
if (board == null) return;
|
|
|
|
board.removeAt(ps);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void removeAll(Faction faction)
|
|
|
|
{
|
|
|
|
for (Board board : this.getAll())
|
|
|
|
{
|
|
|
|
board.removeAll(faction);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void clean()
|
|
|
|
{
|
|
|
|
for (Board board : this.getAll())
|
|
|
|
{
|
|
|
|
board.clean();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-24 11:16:37 +02:00
|
|
|
// CHUNKS
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Set<PS> getChunks(Faction faction)
|
|
|
|
{
|
2017-03-12 17:55:01 +01:00
|
|
|
// Create
|
2013-04-24 11:16:37 +02:00
|
|
|
Set<PS> ret = new HashSet<PS>();
|
2017-03-12 17:55:01 +01:00
|
|
|
|
|
|
|
// Fill
|
2013-04-24 11:16:37 +02:00
|
|
|
for (Board board : this.getAll())
|
|
|
|
{
|
|
|
|
ret.addAll(board.getChunks(faction));
|
|
|
|
}
|
2017-03-12 17:55:01 +01:00
|
|
|
|
|
|
|
// Return
|
2013-04-24 11:16:37 +02:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2014-10-22 07:50:30 +02:00
|
|
|
@Override
|
|
|
|
public Set<PS> getChunks(String factionId)
|
|
|
|
{
|
2017-03-12 17:55:01 +01:00
|
|
|
// Create
|
2014-10-22 07:50:30 +02:00
|
|
|
Set<PS> ret = new HashSet<PS>();
|
2017-03-12 17:55:01 +01:00
|
|
|
|
|
|
|
// Fill
|
2014-10-22 07:50:30 +02:00
|
|
|
for (Board board : this.getAll())
|
|
|
|
{
|
|
|
|
ret.addAll(board.getChunks(factionId));
|
|
|
|
}
|
2017-03-12 17:55:01 +01:00
|
|
|
|
|
|
|
// Return
|
2014-10-22 07:50:30 +02:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Map<Faction, Set<PS>> getFactionToChunks()
|
|
|
|
{
|
2017-03-12 17:55:01 +01:00
|
|
|
// Create
|
2014-10-22 07:50:30 +02:00
|
|
|
Map<Faction, Set<PS>> ret = null;
|
2017-03-12 17:55:01 +01:00
|
|
|
|
|
|
|
// Fill
|
2014-10-22 07:50:30 +02:00
|
|
|
for (Board board : this.getAll())
|
|
|
|
{
|
|
|
|
// Use the first board directly
|
|
|
|
Map<Faction, Set<PS>> factionToChunks = board.getFactionToChunks();
|
|
|
|
if (ret == null)
|
|
|
|
{
|
|
|
|
ret = factionToChunks;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Merge the following boards
|
|
|
|
for (Entry<Faction, Set<PS>> entry : factionToChunks.entrySet())
|
|
|
|
{
|
|
|
|
Faction faction = entry.getKey();
|
|
|
|
Set<PS> chunks = ret.get(faction);
|
|
|
|
if (chunks == null)
|
|
|
|
{
|
|
|
|
ret.put(faction, entry.getValue());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
chunks.addAll(entry.getValue());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-03-12 17:55:01 +01:00
|
|
|
// Enforce create
|
2014-11-07 08:38:26 +01:00
|
|
|
if (ret == null) ret = new MassiveMap<Faction, Set<PS>>();
|
2017-03-12 17:55:01 +01:00
|
|
|
|
|
|
|
// Return
|
2014-10-22 07:50:30 +02:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2013-04-11 09:25:26 +02:00
|
|
|
// COUNT
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getCount(Faction faction)
|
2014-10-18 18:30:13 +02:00
|
|
|
{
|
|
|
|
return this.getCount(faction.getId());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getCount(String factionId)
|
2013-04-11 09:25:26 +02:00
|
|
|
{
|
|
|
|
int ret = 0;
|
|
|
|
for (Board board : this.getAll())
|
|
|
|
{
|
2014-10-18 18:30:13 +02:00
|
|
|
ret += board.getCount(factionId);
|
2013-04-11 09:25:26 +02:00
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2014-10-22 07:50:30 +02:00
|
|
|
@Override
|
|
|
|
public Map<Faction, Integer> getFactionToCount()
|
|
|
|
{
|
|
|
|
Map<Faction, Integer> ret = null;
|
|
|
|
for (Board board : this.getAll())
|
|
|
|
{
|
|
|
|
// Use the first board directly
|
|
|
|
Map<Faction, Integer> factionToCount = board.getFactionToCount();
|
|
|
|
if (ret == null)
|
|
|
|
{
|
|
|
|
ret = factionToCount;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Merge the following boards
|
|
|
|
for (Entry<Faction, Integer> entry : factionToCount.entrySet())
|
|
|
|
{
|
|
|
|
Faction faction = entry.getKey();
|
|
|
|
Integer count = ret.get(faction);
|
|
|
|
if (count == null)
|
|
|
|
{
|
|
|
|
ret.put(faction, entry.getValue());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ret.put(faction, count + entry.getValue());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-11-07 08:38:26 +01:00
|
|
|
if (ret == null) ret = new MassiveMap<Faction, Integer>();
|
2014-10-22 07:50:30 +02:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2016-04-19 17:57:28 +02:00
|
|
|
// COUNT
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean hasClaimed(Faction faction)
|
|
|
|
{
|
|
|
|
return this.hasClaimed(faction.getId());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean hasClaimed(String factionId)
|
|
|
|
{
|
|
|
|
for (Board board : this.getAll())
|
|
|
|
{
|
2017-03-12 17:55:01 +01:00
|
|
|
if (board.hasClaimed(factionId)) return true;
|
2016-04-19 17:57:28 +02:00
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-04-11 09:25:26 +02:00
|
|
|
// NEARBY DETECTION
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isBorderPs(PS ps)
|
|
|
|
{
|
|
|
|
if (ps == null) return false;
|
|
|
|
Board board = this.get(ps.getWorld());
|
|
|
|
if (board == null) return false;
|
|
|
|
return board.isBorderPs(ps);
|
|
|
|
}
|
|
|
|
|
2014-10-13 11:42:40 +02:00
|
|
|
@Override
|
|
|
|
public boolean isAnyBorderPs(Set<PS> pss)
|
|
|
|
{
|
|
|
|
for (PS ps : pss)
|
|
|
|
{
|
|
|
|
if (this.isBorderPs(ps)) return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-04-11 09:25:26 +02:00
|
|
|
@Override
|
|
|
|
public boolean isConnectedPs(PS ps, Faction faction)
|
|
|
|
{
|
|
|
|
if (ps == null) return false;
|
|
|
|
Board board = this.get(ps.getWorld());
|
|
|
|
if (board == null) return false;
|
|
|
|
return board.isConnectedPs(ps, faction);
|
|
|
|
}
|
|
|
|
|
2014-10-13 11:42:40 +02:00
|
|
|
@Override
|
|
|
|
public boolean isAnyConnectedPs(Set<PS> pss, Faction faction)
|
|
|
|
{
|
|
|
|
for (PS ps : pss)
|
|
|
|
{
|
|
|
|
if (this.isConnectedPs(ps, faction)) return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-04-11 09:25:26 +02:00
|
|
|
// MAP GENERATION
|
|
|
|
|
|
|
|
@Override
|
2016-03-15 20:43:54 +01:00
|
|
|
public List<Object> getMap(RelationParticipator observer, PS centerPs, double inDegrees, int width, int height)
|
2013-04-11 09:25:26 +02:00
|
|
|
{
|
|
|
|
if (centerPs == null) return null;
|
|
|
|
Board board = this.get(centerPs.getWorld());
|
|
|
|
if (board == null) return null;
|
2014-10-14 09:09:37 +02:00
|
|
|
return board.getMap(observer, centerPs, inDegrees, width, height);
|
2013-04-11 09:25:26 +02:00
|
|
|
}
|
|
|
|
|
2016-04-19 17:57:28 +02:00
|
|
|
// -------------------------------------------- //
|
|
|
|
// WORLDS
|
|
|
|
// -------------------------------------------- //
|
|
|
|
|
|
|
|
public Set<String> getClaimedWorlds(Faction faction)
|
|
|
|
{
|
|
|
|
return getClaimedWorlds(faction.getId());
|
|
|
|
}
|
|
|
|
|
|
|
|
public Set<String> getClaimedWorlds(String factionId)
|
|
|
|
{
|
2017-03-12 17:55:01 +01:00
|
|
|
// Create
|
2016-04-19 17:57:28 +02:00
|
|
|
Set<String> ret = new MassiveSet<>();
|
|
|
|
|
2017-03-12 17:55:01 +01:00
|
|
|
// Fill
|
2016-04-19 17:57:28 +02:00
|
|
|
for (Board board : this.getAll())
|
|
|
|
{
|
2017-03-12 17:55:01 +01:00
|
|
|
if (board.hasClaimed(factionId)) ret.add(board.getId());
|
2016-04-19 17:57:28 +02:00
|
|
|
}
|
|
|
|
|
2017-03-12 17:55:01 +01:00
|
|
|
// Return
|
2016-04-19 17:57:28 +02:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2014-10-07 17:08:40 +02:00
|
|
|
// -------------------------------------------- //
|
|
|
|
// UTIL
|
|
|
|
// -------------------------------------------- //
|
2014-09-17 13:17:33 +02:00
|
|
|
|
2014-10-07 17:08:40 +02:00
|
|
|
// Distance -1 returns 0 chunks always.
|
|
|
|
// Distance 0 returns 1 chunk only (the one supplied).
|
|
|
|
// Distance 1 returns 3x3 = 9 chunks.
|
2017-03-12 17:55:01 +01:00
|
|
|
public static Set<PS> getNearbyChunks(PS psChunk, int distance)
|
2014-09-17 13:17:33 +02:00
|
|
|
{
|
2014-10-07 17:08:40 +02:00
|
|
|
// Fix Args
|
2017-03-12 17:55:01 +01:00
|
|
|
if (psChunk == null) throw new NullPointerException("psChunk");
|
|
|
|
psChunk = psChunk.getChunk(true);
|
2014-10-07 17:08:40 +02:00
|
|
|
|
2017-03-12 17:55:01 +01:00
|
|
|
// Create
|
2014-10-07 17:08:40 +02:00
|
|
|
Set<PS> ret = new LinkedHashSet<PS>();
|
|
|
|
if (distance < 0) return ret;
|
2014-09-17 13:17:33 +02:00
|
|
|
|
2017-03-12 17:55:01 +01:00
|
|
|
// Fill
|
|
|
|
int chunkX = psChunk.getChunkX();
|
|
|
|
int xmin = chunkX - distance;
|
|
|
|
int xmax = chunkX + distance;
|
2014-09-17 13:17:33 +02:00
|
|
|
|
2017-03-12 17:55:01 +01:00
|
|
|
int chunkZ = psChunk.getChunkZ();
|
|
|
|
int zmin = chunkZ - distance;
|
|
|
|
int zmax = chunkZ + distance;
|
2014-10-07 17:08:40 +02:00
|
|
|
|
|
|
|
for (int x = xmin; x <= xmax; x++)
|
2014-09-17 13:17:33 +02:00
|
|
|
{
|
2017-03-12 17:55:01 +01:00
|
|
|
PS psChunkX = psChunk.withChunkX(x);
|
2014-10-07 17:08:40 +02:00
|
|
|
for (int z = zmin; z <= zmax; z++)
|
2014-09-17 13:17:33 +02:00
|
|
|
{
|
2017-03-12 17:55:01 +01:00
|
|
|
ret.add(psChunkX.withChunkZ(z));
|
2014-09-17 13:17:33 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-03-12 17:55:01 +01:00
|
|
|
// Return
|
2014-10-07 17:08:40 +02:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2014-10-13 11:42:40 +02:00
|
|
|
public static Set<PS> getNearbyChunks(Collection<PS> chunks, int distance)
|
|
|
|
{
|
|
|
|
// Fix Args
|
|
|
|
if (chunks == null) throw new NullPointerException("chunks");
|
|
|
|
|
2017-03-12 17:55:01 +01:00
|
|
|
// Create
|
2014-10-13 11:42:40 +02:00
|
|
|
Set<PS> ret = new LinkedHashSet<PS>();
|
|
|
|
|
|
|
|
if (distance < 0) return ret;
|
|
|
|
|
2017-03-12 17:55:01 +01:00
|
|
|
// Fill
|
2014-10-13 11:42:40 +02:00
|
|
|
for (PS chunk : chunks)
|
|
|
|
{
|
|
|
|
ret.addAll(getNearbyChunks(chunk, distance));
|
|
|
|
}
|
|
|
|
|
2017-03-12 17:55:01 +01:00
|
|
|
// Return
|
2014-10-13 11:42:40 +02:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2014-10-07 17:08:40 +02:00
|
|
|
public static Set<Faction> getDistinctFactions(Collection<PS> chunks)
|
|
|
|
{
|
|
|
|
// Fix Args
|
|
|
|
if (chunks == null) throw new NullPointerException("chunks");
|
|
|
|
|
2017-03-12 17:55:01 +01:00
|
|
|
// Create
|
2014-10-07 17:08:40 +02:00
|
|
|
Set<Faction> ret = new LinkedHashSet<Faction>();
|
|
|
|
|
2017-03-12 17:55:01 +01:00
|
|
|
// Fill
|
2014-10-07 17:08:40 +02:00
|
|
|
for (PS chunk : chunks)
|
|
|
|
{
|
2017-03-12 17:55:01 +01:00
|
|
|
Faction faction = get().getFactionAt(chunk);
|
2014-10-07 17:08:40 +02:00
|
|
|
if (faction == null) continue;
|
|
|
|
ret.add(faction);
|
|
|
|
}
|
|
|
|
|
2017-03-12 17:55:01 +01:00
|
|
|
// Return
|
2014-10-07 17:08:40 +02:00
|
|
|
return ret;
|
2014-09-17 13:17:33 +02:00
|
|
|
}
|
|
|
|
|
2014-10-13 11:42:40 +02:00
|
|
|
public static Map<PS, Faction> getChunkFaction(Collection<PS> chunks)
|
|
|
|
{
|
2017-03-12 17:55:01 +01:00
|
|
|
// Create
|
2014-10-13 11:42:40 +02:00
|
|
|
Map<PS, Faction> ret = new LinkedHashMap<PS, Faction>();
|
|
|
|
|
2017-03-12 17:55:01 +01:00
|
|
|
// Fill
|
|
|
|
Faction none = FactionColl.get().getNone();
|
2014-10-13 11:42:40 +02:00
|
|
|
for (PS chunk : chunks)
|
|
|
|
{
|
|
|
|
chunk = chunk.getChunk(true);
|
|
|
|
Faction faction = get().getFactionAt(chunk);
|
2017-03-12 17:55:01 +01:00
|
|
|
if (faction == null) faction = none;
|
2014-10-13 11:42:40 +02:00
|
|
|
ret.put(chunk, faction);
|
|
|
|
}
|
|
|
|
|
2017-03-12 17:55:01 +01:00
|
|
|
// Return
|
2014-10-13 11:42:40 +02:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2013-04-11 08:49:14 +02:00
|
|
|
}
|