Fix FactionsIndex bug

This commit is contained in:
Magnus Ulf 2020-01-16 10:56:05 +01:00
parent 6bb73d438d
commit 9c6a107bff
3 changed files with 31 additions and 15 deletions

View File

@ -86,7 +86,21 @@ public class FactionsIndex
{
if (mplayer == null) throw new NullPointerException("mplayer");
if (!FactionColl.get().isActive()) throw new IllegalStateException("The FactionColl is not yet fully activated.");
if (!mplayer.attached()) return;
// TODO: This is not optimal but here we remove a player from the index when
// the mplayer object is deattached. Optimally it should be removed
// automatically because it is stored as a weak reference.
// But sometimes that doesn't happen so we do this instead.
// Is there a memory leak somewhere?
if (!mplayer.attached())
{
Faction factionIndexed = this.mplayer2faction.remove(mplayer);
if (factionIndexed != null)
{
faction2mplayers.get(factionIndexed).remove(mplayer);
}
return;
}
Faction factionActual = mplayer.getFaction();
Faction factionIndexed = this.getFaction(mplayer);

View File

@ -9,15 +9,11 @@ import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.Parameter;
import com.massivecraft.massivecore.pager.Pager;
import com.massivecraft.massivecore.pager.Stringifier;
import com.massivecraft.massivecore.predicate.PredicateAnd;
import com.massivecraft.massivecore.predicate.PredicateVisibleTo;
import com.massivecraft.massivecore.store.SenderColl;
import com.massivecraft.massivecore.util.Txt;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import java.util.List;
import java.util.function.Predicate;
public class CmdFactionsList extends FactionsCommand
{
@ -46,8 +42,6 @@ public class CmdFactionsList extends FactionsCommand
// NOTE: The faction list is quite slow and mostly thread safe.
// We run it asynchronously to spare the primary server thread.
Predicate<MPlayer> predicateOnline = PredicateAnd.get(mp -> mp.getId() != null, SenderColl.PREDICATE_ONLINE, PredicateVisibleTo.get(sender));
// Pager Create
final Pager<Faction> pager = new Pager<>(this, "Faction List", page, (Stringifier<Faction>) (faction, index) -> {
if (faction.isNone())
@ -58,7 +52,7 @@ public class CmdFactionsList extends FactionsCommand
{
return Txt.parse("%s<i> %d/%d online, %d/%d/%d",
faction.getName(msender),
faction.getMPlayersWhere(predicateOnline).size(),
faction.getMPlayersWhereOnlineTo(sender).size(),
faction.getMPlayers().size(),
faction.getLandCount(),
faction.getPowerRounded(),

View File

@ -33,7 +33,8 @@ import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
public class MPlayer extends SenderEntity<MPlayer> implements FactionsParticipator, MPerm.MPermable {
public class MPlayer extends SenderEntity<MPlayer> implements FactionsParticipator, MPerm.MPermable
{
// -------------------------------------------- //
// META
// -------------------------------------------- //
@ -60,7 +61,8 @@ public class MPlayer extends SenderEntity<MPlayer> implements FactionsParticipat
// -------------------------------------------- //
@Override
public MPlayer load(MPlayer that) {
public MPlayer load(MPlayer that)
{
this.setLastActivityMillis(that.lastActivityMillis);
this.setFactionId(that.factionId);
this.rankId = that.rankId;
@ -79,7 +81,8 @@ public class MPlayer extends SenderEntity<MPlayer> implements FactionsParticipat
// -------------------------------------------- //
@Override
public boolean isDefault() {
public boolean isDefault()
{
// Last activity millis is data we use for clearing out cleanable players. So it does not in itself make the player data worth keeping.
if (this.hasFaction()) return false;
// Role means nothing without a faction.
@ -98,18 +101,23 @@ public class MPlayer extends SenderEntity<MPlayer> implements FactionsParticipat
// -------------------------------------------- //
@Override
public void postAttach(String id) {
public void postAttach(String id)
{
FactionsIndex.get().update(this);
}
@Override
public void preDetach(String id) {
public void postDetach(String id)
{
//System.out.println("Detaching: " + id + " : " + this.getFactionId());
FactionsIndex.get().update(this);
}
@Override
public void preClean() {
if (this.getRank().isLeader()) {
public void preClean()
{
if (this.getRank().isLeader())
{
this.getFaction().promoteNewLeader();
}