Public Repository for the Magicbane Shadowbane Emulator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
3.9 KiB

// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.powers;
import engine.Enum;
import engine.Enum.GameObjectType;
import engine.math.Vector3fImmutable;
import engine.objects.AbstractCharacter;
import engine.objects.AbstractWorldObject;
import engine.objects.PlayerCharacter;
import java.util.HashSet;
//This package creates a list of AbstractWorldObjects
//sorted by range from a specified point.
public class RangeBasedAwo implements Comparable<RangeBasedAwo> {
private float range;
private AbstractWorldObject awo;
public RangeBasedAwo(Float range, AbstractWorldObject awo) {
super();
this.range = range;
this.awo = awo;
}
public static HashSet<RangeBasedAwo> createList(HashSet<AbstractWorldObject> awolist, Vector3fImmutable searchLoc) {
HashSet<RangeBasedAwo> rbal = new HashSet<>();
for (AbstractWorldObject awo : awolist) {
RangeBasedAwo rba = new RangeBasedAwo(searchLoc.distance(awo.getLoc()), awo);
rbal.add(rba);
}
return rbal;
}
public static HashSet<AbstractWorldObject> getSortedList(HashSet<AbstractWorldObject> awolist, Vector3fImmutable searchLoc, int maxPlayers, int maxMobs) {
int playerCnt = 0;
int mobCnt = 0;
int maxCnt = (maxPlayers > maxMobs) ? maxPlayers : maxMobs;
HashSet<RangeBasedAwo> rbal = RangeBasedAwo.createList(awolist, searchLoc);
awolist = new HashSet<>();
for (RangeBasedAwo rba : rbal) {
if (awolist.size() >= maxCnt)
return awolist;
AbstractWorldObject awo = rba.awo;
if (awo.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) {
if (playerCnt < maxPlayers) {
awolist.add(awo);
playerCnt++;
}
} else if (awo.getObjectType().equals(Enum.GameObjectType.Mob)) {
if (mobCnt < maxMobs) {
awolist.add(awo);
mobCnt++;
}
}
}
return awolist;
}
public static HashSet<AbstractCharacter> getTrackList(HashSet<AbstractWorldObject> awolist, PlayerCharacter pc, int max) {
Vector3fImmutable searchLoc = pc.getLoc();
int cnt = 0;
HashSet<RangeBasedAwo> rbal = RangeBasedAwo.createList(awolist, searchLoc);
HashSet<AbstractCharacter> aclist = new HashSet<>();
for (RangeBasedAwo rba : rbal) {
if (aclist.size() >= max)
return aclist;
AbstractWorldObject awo = rba.awo;
if (awo.getObjectType().equals(GameObjectType.PlayerCharacter))
if (((PlayerCharacter) awo).isCSR())
continue;
if (AbstractWorldObject.IsAbstractCharacter(awo) && !(pc.equals(awo))) {
aclist.add((AbstractCharacter) awo);
cnt++;
}
}
return aclist;
}
@Override
public int compareTo(RangeBasedAwo obj) throws ClassCastException {
return (int) (this.range - obj.range);
}
public float getRange() {
return this.range;
}
public AbstractWorldObject getAwo() {
return this.awo;
}
}