Fix FactionsIndex bug
This commit is contained in:
parent
6bb73d438d
commit
9c6a107bff
@ -86,7 +86,21 @@ public class FactionsIndex
|
|||||||
{
|
{
|
||||||
if (mplayer == null) throw new NullPointerException("mplayer");
|
if (mplayer == null) throw new NullPointerException("mplayer");
|
||||||
if (!FactionColl.get().isActive()) throw new IllegalStateException("The FactionColl is not yet fully activated.");
|
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 factionActual = mplayer.getFaction();
|
||||||
Faction factionIndexed = this.getFaction(mplayer);
|
Faction factionIndexed = this.getFaction(mplayer);
|
||||||
|
@ -9,15 +9,11 @@ import com.massivecraft.massivecore.MassiveException;
|
|||||||
import com.massivecraft.massivecore.command.Parameter;
|
import com.massivecraft.massivecore.command.Parameter;
|
||||||
import com.massivecraft.massivecore.pager.Pager;
|
import com.massivecraft.massivecore.pager.Pager;
|
||||||
import com.massivecraft.massivecore.pager.Stringifier;
|
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 com.massivecraft.massivecore.util.Txt;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Predicate;
|
|
||||||
|
|
||||||
public class CmdFactionsList extends FactionsCommand
|
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.
|
// NOTE: The faction list is quite slow and mostly thread safe.
|
||||||
// We run it asynchronously to spare the primary server thread.
|
// 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
|
// Pager Create
|
||||||
final Pager<Faction> pager = new Pager<>(this, "Faction List", page, (Stringifier<Faction>) (faction, index) -> {
|
final Pager<Faction> pager = new Pager<>(this, "Faction List", page, (Stringifier<Faction>) (faction, index) -> {
|
||||||
if (faction.isNone())
|
if (faction.isNone())
|
||||||
@ -58,7 +52,7 @@ public class CmdFactionsList extends FactionsCommand
|
|||||||
{
|
{
|
||||||
return Txt.parse("%s<i> %d/%d online, %d/%d/%d",
|
return Txt.parse("%s<i> %d/%d online, %d/%d/%d",
|
||||||
faction.getName(msender),
|
faction.getName(msender),
|
||||||
faction.getMPlayersWhere(predicateOnline).size(),
|
faction.getMPlayersWhereOnlineTo(sender).size(),
|
||||||
faction.getMPlayers().size(),
|
faction.getMPlayers().size(),
|
||||||
faction.getLandCount(),
|
faction.getLandCount(),
|
||||||
faction.getPowerRounded(),
|
faction.getPowerRounded(),
|
||||||
|
@ -33,7 +33,8 @@ import java.util.Iterator;
|
|||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.Set;
|
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
|
// META
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
@ -60,7 +61,8 @@ public class MPlayer extends SenderEntity<MPlayer> implements FactionsParticipat
|
|||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MPlayer load(MPlayer that) {
|
public MPlayer load(MPlayer that)
|
||||||
|
{
|
||||||
this.setLastActivityMillis(that.lastActivityMillis);
|
this.setLastActivityMillis(that.lastActivityMillis);
|
||||||
this.setFactionId(that.factionId);
|
this.setFactionId(that.factionId);
|
||||||
this.rankId = that.rankId;
|
this.rankId = that.rankId;
|
||||||
@ -79,7 +81,8 @@ public class MPlayer extends SenderEntity<MPlayer> implements FactionsParticipat
|
|||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
@Override
|
@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.
|
// 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;
|
if (this.hasFaction()) return false;
|
||||||
// Role means nothing without a faction.
|
// Role means nothing without a faction.
|
||||||
@ -98,18 +101,23 @@ public class MPlayer extends SenderEntity<MPlayer> implements FactionsParticipat
|
|||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void postAttach(String id) {
|
public void postAttach(String id)
|
||||||
|
{
|
||||||
FactionsIndex.get().update(this);
|
FactionsIndex.get().update(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void preDetach(String id) {
|
public void postDetach(String id)
|
||||||
|
{
|
||||||
|
//System.out.println("Detaching: " + id + " : " + this.getFactionId());
|
||||||
FactionsIndex.get().update(this);
|
FactionsIndex.get().update(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void preClean() {
|
public void preClean()
|
||||||
if (this.getRank().isLeader()) {
|
{
|
||||||
|
if (this.getRank().isLeader())
|
||||||
|
{
|
||||||
this.getFaction().promoteNewLeader();
|
this.getFaction().promoteNewLeader();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user