mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 18:28:00 +00:00
- CheckStyle.
This commit is contained in:
@@ -293,7 +293,7 @@ public class Deck extends DeckBase {
|
||||
|
||||
double best = 1.0;
|
||||
|
||||
for( Entry<CardPrinted, Integer> kv : this.getMain()) {
|
||||
for (Entry<CardPrinted, Integer> kv : this.getMain()) {
|
||||
CardPrinted evalCard = kv.getKey();
|
||||
int count = kv.getValue();
|
||||
if (ranker.getRanking(evalCard.getName(), evalCard.getEdition()) != null) {
|
||||
@@ -320,12 +320,12 @@ public class Deck extends DeckBase {
|
||||
int deckSize = main.countAll();
|
||||
int deckDistinct = main.countDistinct();
|
||||
Integer max = type.getDeckMaximum();
|
||||
|
||||
if (deckSize < type.getDeckMinimum() || (max != null && deckSize > max) ||
|
||||
(type.isSingleton() && deckDistinct != deckSize)) {
|
||||
|
||||
if (deckSize < type.getDeckMinimum() || (max != null && deckSize > max)
|
||||
|| (type.isSingleton() && deckDistinct != deckSize)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -106,7 +106,7 @@ public class DeckSection extends ItemPool<CardPrinted> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Add all from a List of CardPrinted
|
||||
* Add all from a List of CardPrinted.
|
||||
*
|
||||
* @param list
|
||||
* CardPrinteds to add
|
||||
|
||||
@@ -78,7 +78,7 @@ public class Generate2ColorDeck extends GenerateColoredDeckBase {
|
||||
|
||||
public final ItemPoolView<CardPrinted> get2ColorDeck(final int size, final PlayerType pt) {
|
||||
addCreaturesAndSpells(size, cmcLevels, cmcAmounts, pt);
|
||||
|
||||
|
||||
// Add lands
|
||||
int numLands = (int) (getLandsPercentage() * size);
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ public abstract class GenerateColoredDeckBase {
|
||||
protected float getLandsPercentage() { return 0.44f; }
|
||||
protected float getCreatPercentage() { return 0.34f; }
|
||||
protected float getSpellPercentage() { return 0.22f; }
|
||||
|
||||
|
||||
StringBuilder tmpDeck = new StringBuilder();
|
||||
|
||||
// protected final float landsPercentage = 0.42f;
|
||||
@@ -87,7 +87,7 @@ public abstract class GenerateColoredDeckBase {
|
||||
protected void addCreaturesAndSpells(int size, List<FilterCMC> cmcLevels, int[] cmcAmounts, PlayerType pt) {
|
||||
final Iterable<CardPrinted> cards = selectCardsOfMatchingColorForPlayer(pt);
|
||||
// build subsets based on type
|
||||
|
||||
|
||||
final Iterable<CardPrinted> creatures = Iterables.filter(cards, Predicates.compose(CardRulesPredicates.Presets.IS_CREATURE, CardPrinted.FN_GET_RULES));
|
||||
final int creatCnt = (int) (getCreatPercentage() * size);
|
||||
tmpDeck.append("Creature Count:").append(creatCnt).append("\n");
|
||||
@@ -200,7 +200,7 @@ public abstract class GenerateColoredDeckBase {
|
||||
|
||||
for (int i = 0; i < cmcAmounts.length; i++) {
|
||||
Iterable<CardPrinted> matchingCards = Iterables.filter(source, Predicates.compose(cmcLevels.get(i), CardPrinted.FN_GET_RULES));
|
||||
curved.addAll( Aggregates.random(matchingCards, cmcAmounts[i]));
|
||||
curved.addAll(Aggregates.random(matchingCards, cmcAmounts[i]));
|
||||
}
|
||||
|
||||
for (CardPrinted c : curved) {
|
||||
@@ -249,7 +249,7 @@ public abstract class GenerateColoredDeckBase {
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
protected static void increment(Map<String, Integer> map, String key, int delta)
|
||||
{
|
||||
final Integer boxed = map.get(key);
|
||||
|
||||
@@ -70,7 +70,7 @@ public class GenerateDeckUtil {
|
||||
|
||||
@Override
|
||||
public boolean apply(CardRules subject) {
|
||||
CardManaCost mc = subject.getManaCost();
|
||||
CardManaCost mc = subject.getManaCost();
|
||||
return !mc.isPureGeneric() && mc.canBePaidWithManaOfColor(allowedColor);
|
||||
// return allowedColor.containsAllColorsFrom(mc.getColorProfile());
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ public enum GameEndReason {
|
||||
/** The Wins game spell effect. */
|
||||
WinsGameSpellEffect, // ones that could be both hardcoded (felidar) and
|
||||
// scripted ( such as Mayael's Aria )
|
||||
|
||||
/** Used to end multiplayer games where the all humans have lost or conceded while AIs cannot end match by themselves*/
|
||||
|
||||
/** Used to end multiplayer games where the all humans have lost or conceded while AIs cannot end match by themselves.*/
|
||||
AllHumansLost,
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ public class GameFormat {
|
||||
|
||||
protected final transient List<String> allowedSetCodes_ro;
|
||||
protected final transient List<String> bannedCardNames_ro;
|
||||
|
||||
|
||||
protected final transient Predicate<CardPrinted> filterRules;
|
||||
protected final transient Predicate<CardPrinted> filterPrinted;
|
||||
|
||||
@@ -61,25 +61,27 @@ public class GameFormat {
|
||||
this.name = fName;
|
||||
this.allowedSetCodes = Lists.newArrayList(sets);
|
||||
this.bannedCardNames = bannedCards == null ? new ArrayList<String>() : Lists.newArrayList(bannedCards);
|
||||
|
||||
|
||||
this.allowedSetCodes_ro = Collections.unmodifiableList(allowedSetCodes);
|
||||
this.bannedCardNames_ro = Collections.unmodifiableList(bannedCardNames);
|
||||
|
||||
|
||||
this.filterRules = this.buildFilterRules();
|
||||
this.filterPrinted = this.buildFilterPritned();
|
||||
}
|
||||
|
||||
private Predicate<CardPrinted> buildFilterPritned() {
|
||||
final Predicate<CardPrinted> banNames = CardPrinted.Predicates.namesExcept(this.bannedCardNames);
|
||||
if (this.allowedSetCodes == null || this.allowedSetCodes.isEmpty() )
|
||||
if (this.allowedSetCodes == null || this.allowedSetCodes.isEmpty()) {
|
||||
return banNames;
|
||||
}
|
||||
return Predicates.and(banNames, CardPrinted.Predicates.printedInSets(this.allowedSetCodes, true));
|
||||
}
|
||||
|
||||
private Predicate<CardPrinted> buildFilterRules() {
|
||||
final Predicate<CardPrinted> banNames = CardPrinted.Predicates.namesExcept(this.bannedCardNames);
|
||||
if ( this.allowedSetCodes == null || this.allowedSetCodes.isEmpty() )
|
||||
if (this.allowedSetCodes == null || this.allowedSetCodes.isEmpty()) {
|
||||
return banNames;
|
||||
}
|
||||
return Predicates.and(banNames, Predicates.compose(CardRulesPredicates.wasPrintedInSets(this.allowedSetCodes), CardPrinted.FN_GET_RULES));
|
||||
}
|
||||
|
||||
|
||||
@@ -32,8 +32,8 @@ public enum GameLossReason {
|
||||
|
||||
// 104.3e and others
|
||||
/** The Spell effect. */
|
||||
SpellEffect,
|
||||
|
||||
SpellEffect,
|
||||
|
||||
OpponentWon
|
||||
|
||||
/*
|
||||
|
||||
@@ -53,9 +53,9 @@ public class GameNew {
|
||||
for (int i = 0; i < stackOfCards.getValue(); i++) {
|
||||
|
||||
final Card card = cardPrinted.toForgeCard(player);
|
||||
|
||||
|
||||
// apply random pictures for cards
|
||||
if ( player.isComputer() ) {
|
||||
if (player.isComputer()) {
|
||||
final int cntVariants = cardPrinted.getCard().getEditionInfo(cardPrinted.getEdition()).getCopiesCount();
|
||||
if (cntVariants > 1) {
|
||||
card.setRandomPicture(generator.nextInt(cntVariants - 1) + 1);
|
||||
@@ -70,41 +70,43 @@ public class GameNew {
|
||||
}
|
||||
|
||||
if (!useAnte && card.hasKeyword("Remove CARDNAME from your deck before playing if you're not playing for ante.")) {
|
||||
if(!removedAnteCards.containsKey(player))
|
||||
if (!removedAnteCards.containsKey(player)) {
|
||||
removedAnteCards.put(player, new ArrayList<String>());
|
||||
}
|
||||
removedAnteCards.get(player).add(card.getName());
|
||||
} else {
|
||||
library.add(card);
|
||||
}
|
||||
|
||||
|
||||
// mark card as difficult for AI to play
|
||||
if ( player.isComputer() && card.getSVar("RemAIDeck").equals("True") && !rAICards.contains(card.getName())) {
|
||||
if (player.isComputer() && card.getSVar("RemAIDeck").equals("True") && !rAICards.contains(card.getName())) {
|
||||
rAICards.add(card.getName());
|
||||
// get card picture so that it is in the image cache
|
||||
// ImageCache.getImage(card);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Shuffling
|
||||
// Ai may cheat
|
||||
if ( player.isComputer() && Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_SMOOTH_LAND) ) {
|
||||
// Ai may cheat
|
||||
if (player.isComputer() && Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_SMOOTH_LAND)) {
|
||||
// do this instead of shuffling Computer's deck
|
||||
final Iterable<Card> c1 = GameNew.smoothComputerManaCurve(player.getCardsIn(ZoneType.Library));
|
||||
player.getZone(ZoneType.Library).setCards(c1);
|
||||
} else
|
||||
} else {
|
||||
player.shuffle();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Constructor for new game allowing card lists to be put into play
|
||||
* immediately, and life totals to be adjusted, for computer and human.
|
||||
*
|
||||
* TODO: Accept something like match state as parameter. Match should be aware of players,
|
||||
* their decks and other special starting conditions.
|
||||
* TODO: Accept something like match state as parameter. Match should be aware of players,
|
||||
* their decks and other special starting conditions.
|
||||
*/
|
||||
public static void newGame(final Map<Player, PlayerStartConditions> playersConditions, final GameState game, final boolean canRandomFoil ) {
|
||||
public static void newGame(final Map<Player, PlayerStartConditions> playersConditions, final GameState game, final boolean canRandomFoil) {
|
||||
Singletons.getModel().getMatch().getInput().clearInput();
|
||||
|
||||
Card.resetUniqueNumber();
|
||||
@@ -118,12 +120,12 @@ public class GameNew {
|
||||
final Map<Player, List<String>> removedAnteCards = new HashMap<Player, List<String>>();
|
||||
final List<String> rAICards = new ArrayList<String>();
|
||||
|
||||
for( Entry<Player, PlayerStartConditions> p : playersConditions.entrySet() ) {
|
||||
for (Entry<Player, PlayerStartConditions> p : playersConditions.entrySet()) {
|
||||
final Player player = p.getKey();
|
||||
player.setStartingLife(p.getValue().getStartingLife());
|
||||
// what if I call it for AI player?
|
||||
PlayerZone bf = player.getZone(ZoneType.Battlefield);
|
||||
Iterable<Card> onTable = p.getValue().getCardsOnTable();
|
||||
Iterable<Card> onTable = p.getValue().getCardsOnTable();
|
||||
if (onTable != null) {
|
||||
for (final Card c : onTable) {
|
||||
c.addController(player);
|
||||
@@ -134,24 +136,23 @@ public class GameNew {
|
||||
c.refreshUniqueNumber();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
prepareSingleLibrary(player, p.getValue().getDeck(), removedAnteCards, rAICards, canRandomFoil);
|
||||
player.updateObservers();
|
||||
bf.updateObservers();
|
||||
player.getZone(ZoneType.Hand).updateObservers();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if (rAICards.size() > 0) {
|
||||
String message = buildFourColumnList("AI deck contains the following cards that it can't play or may be buggy:", rAICards);
|
||||
JOptionPane.showMessageDialog(null, message, "", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
|
||||
|
||||
if (!removedAnteCards.isEmpty()) {
|
||||
StringBuilder ante = new StringBuilder("The following ante cards were removed:\n\n");
|
||||
for(Entry<Player, List<String>> ants : removedAnteCards.entrySet() ) {
|
||||
ante.append(buildFourColumnList( "From the " + ants.getKey().getName() + "'s deck:", ants.getValue()));
|
||||
for (Entry<Player, List<String>> ants : removedAnteCards.entrySet()) {
|
||||
ante.append(buildFourColumnList("From the " + ants.getKey().getName() + "'s deck:", ants.getValue()));
|
||||
}
|
||||
JOptionPane.showMessageDialog(null, ante.toString(), "", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
@@ -161,14 +162,14 @@ public class GameNew {
|
||||
|
||||
public static void restartGame(final GameState game, final Player startingTurn, Map<Player, List<Card>> playerLibraries) {
|
||||
MatchController match = Singletons.getModel().getMatch();
|
||||
|
||||
|
||||
Map<LobbyPlayer, PlayerStartConditions> players = match.getPlayers();
|
||||
Map<Player, PlayerStartConditions> playersConditions = new HashMap<Player, PlayerStartConditions>();
|
||||
|
||||
|
||||
for (Player p : game.getPlayers()) {
|
||||
playersConditions.put(p, players.get(p.getLobbyPlayer()));
|
||||
}
|
||||
|
||||
|
||||
match.getInput().clearInput();
|
||||
|
||||
//Card.resetUniqueNumber();
|
||||
@@ -179,18 +180,18 @@ public class GameNew {
|
||||
trigHandler.clearDelayedTrigger();
|
||||
trigHandler.cleanUpTemporaryTriggers();
|
||||
trigHandler.suppressMode(TriggerType.ChangesZone);
|
||||
|
||||
|
||||
game.getStack().reset();
|
||||
GameAction action = game.getAction();
|
||||
|
||||
|
||||
for( Entry<Player, PlayerStartConditions> p : playersConditions.entrySet() ) {
|
||||
|
||||
for (Entry<Player, PlayerStartConditions> p : playersConditions.entrySet()) {
|
||||
final Player player = p.getKey();
|
||||
player.setStartingLife(p.getValue().getStartingLife());
|
||||
player.setNumLandsPlayed(0);
|
||||
// what if I call it for AI player?
|
||||
PlayerZone bf = player.getZone(ZoneType.Battlefield);
|
||||
Iterable<Card> onTable = p.getValue().getCardsOnTable();
|
||||
Iterable<Card> onTable = p.getValue().getCardsOnTable();
|
||||
if (onTable != null) {
|
||||
for (final Card c : onTable) {
|
||||
c.addController(player);
|
||||
@@ -204,7 +205,7 @@ public class GameNew {
|
||||
|
||||
PlayerZone library = player.getZone(ZoneType.Library);
|
||||
List<Card> newLibrary = playerLibraries.get(player);
|
||||
for(Card c : newLibrary) {
|
||||
for (Card c : newLibrary) {
|
||||
action.moveTo(library, c);
|
||||
}
|
||||
|
||||
@@ -215,7 +216,7 @@ public class GameNew {
|
||||
}
|
||||
|
||||
trigHandler.clearSuppression(TriggerType.ChangesZone);
|
||||
|
||||
|
||||
PhaseHandler phaseHandler = game.getPhaseHandler();
|
||||
phaseHandler.setPlayerTurn(startingTurn);
|
||||
|
||||
@@ -232,7 +233,7 @@ public class GameNew {
|
||||
*/
|
||||
private static void actuateGame(final GameState game, boolean isRestartedGame) {
|
||||
if (!isRestartedGame) {
|
||||
// Deciding which cards go to ante
|
||||
// Deciding which cards go to ante
|
||||
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_ANTE)) {
|
||||
final String nl = System.getProperty("line.separator");
|
||||
final StringBuilder msg = new StringBuilder();
|
||||
@@ -241,7 +242,7 @@ public class GameNew {
|
||||
Predicate<Card> goodForAnte = Predicates.not(CardPredicates.Presets.BASIC_LANDS);
|
||||
Card ante = Aggregates.random(Iterables.filter(lib, goodForAnte));
|
||||
if (ante == null) {
|
||||
throw new RuntimeException(p + " library is empty.");
|
||||
throw new RuntimeException(p + " library is empty.");
|
||||
}
|
||||
game.getGameLog().add("Ante", p + " anted " + ante, 0);
|
||||
VAntes.SINGLETON_INSTANCE.addAnteCard(p, ante);
|
||||
@@ -251,7 +252,7 @@ public class GameNew {
|
||||
JOptionPane.showMessageDialog(null, msg, "Ante", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
|
||||
GameOutcome lastGameOutcome = Singletons.getModel().getMatch().getLastGameOutcome();
|
||||
GameOutcome lastGameOutcome = Singletons.getModel().getMatch().getLastGameOutcome();
|
||||
// Only cut/coin toss if it's the first game of the match
|
||||
if (lastGameOutcome == null) {
|
||||
GameNew.seeWhoPlaysFirstDice();
|
||||
@@ -262,18 +263,18 @@ public class GameNew {
|
||||
}
|
||||
}
|
||||
|
||||
// Draw 7 cards
|
||||
// Draw 7 cards
|
||||
for (final Player p : game.getPlayers()) {
|
||||
// Should this be p.getMaxHandSize() for Vanguard compatibility?
|
||||
p.drawCards(7);
|
||||
}
|
||||
|
||||
|
||||
game.getPhaseHandler().setPhaseState(PhaseType.MULLIGAN);
|
||||
InputControl control = Singletons.getModel().getMatch().getInput();
|
||||
control.setInput(new InputMulligan());
|
||||
} // newGame()
|
||||
|
||||
private static String buildFourColumnList(String firstLine, List<String> cAnteRemoved ) {
|
||||
|
||||
private static String buildFourColumnList(String firstLine, List<String> cAnteRemoved) {
|
||||
StringBuilder sb = new StringBuilder(firstLine);
|
||||
sb.append("\n");
|
||||
for (int i = 0; i < cAnteRemoved.size(); i++) {
|
||||
@@ -352,33 +353,34 @@ public class GameNew {
|
||||
private static void seeWhoPlaysFirstDice() {
|
||||
int playerDie = 0;
|
||||
int computerDie = 0;
|
||||
|
||||
|
||||
while (playerDie == computerDie) {
|
||||
playerDie = MyRandom.getRandom().nextInt(20);
|
||||
computerDie = MyRandom.getRandom().nextInt(20);
|
||||
}
|
||||
|
||||
|
||||
// Play the Flip Coin sound
|
||||
Singletons.getModel().getGame().getEvents().post(new FlipCoinEvent());
|
||||
|
||||
|
||||
List<Player> allPlayers = Singletons.getModel().getGame().getPlayers();
|
||||
setPlayersFirstTurn(allPlayers.get(MyRandom.getRandom().nextInt(allPlayers.size())), true);
|
||||
}
|
||||
|
||||
|
||||
private static void setPlayersFirstTurn(Player goesFirst, boolean firstGame) {
|
||||
StringBuilder sb = new StringBuilder(goesFirst.toString());
|
||||
if (firstGame) {
|
||||
sb.append(" has won the coin toss.");
|
||||
}
|
||||
else {
|
||||
sb.append(" lost the last game.");
|
||||
sb.append(" lost the last game.");
|
||||
}
|
||||
if ( goesFirst.isHuman() ) {
|
||||
if( !humanPlayOrDraw(sb.toString()) )
|
||||
if (goesFirst.isHuman()) {
|
||||
if (!humanPlayOrDraw(sb.toString())) {
|
||||
goesFirst = goesFirst.getOpponent();
|
||||
}
|
||||
} else {
|
||||
sb.append("\nComputer Going First");
|
||||
JOptionPane.showMessageDialog(null, sb.toString(),
|
||||
JOptionPane.showMessageDialog(null, sb.toString(),
|
||||
"Play or Draw?", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
Singletons.getModel().getGame().getPhaseHandler().setPlayerTurn(goesFirst);
|
||||
@@ -386,11 +388,11 @@ public class GameNew {
|
||||
|
||||
private static boolean humanPlayOrDraw(String message) {
|
||||
final String[] possibleValues = { "Play", "Draw" };
|
||||
|
||||
final Object playDraw = JOptionPane.showOptionDialog(null, message + "\n\nWould you like to play or draw?",
|
||||
"Play or Draw?", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null,
|
||||
|
||||
final Object playDraw = JOptionPane.showOptionDialog(null, message + "\n\nWould you like to play or draw?",
|
||||
"Play or Draw?", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null,
|
||||
possibleValues, possibleValues[0]);
|
||||
|
||||
|
||||
return !playDraw.equals(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,8 +68,8 @@ public final class GameOutcome implements Iterable<Entry<LobbyPlayer, PlayerStat
|
||||
for (final Player n : list) {
|
||||
this.playerRating.put(n.getLobbyPlayer(), n.getStats());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks if is draw.
|
||||
@@ -77,10 +77,11 @@ public final class GameOutcome implements Iterable<Entry<LobbyPlayer, PlayerStat
|
||||
* @return true, if is draw
|
||||
*/
|
||||
public boolean isDraw() {
|
||||
for( PlayerStatistics pv : playerRating.values())
|
||||
{
|
||||
if ( pv.getOutcome().hasWon() )
|
||||
return false;
|
||||
for (PlayerStatistics pv : playerRating.values()) {
|
||||
|
||||
if (pv.getOutcome().hasWon()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -103,10 +104,11 @@ public final class GameOutcome implements Iterable<Entry<LobbyPlayer, PlayerStat
|
||||
* @return the winner
|
||||
*/
|
||||
public LobbyPlayer getWinner() {
|
||||
for( Entry<LobbyPlayer, PlayerStatistics> ps : playerRating.entrySet())
|
||||
{
|
||||
if ( ps.getValue().getOutcome().hasWon() )
|
||||
return ps.getKey();
|
||||
for (Entry<LobbyPlayer, PlayerStatistics> ps : playerRating.entrySet()) {
|
||||
|
||||
if (ps.getValue().getOutcome().hasWon()) {
|
||||
return ps.getKey();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -155,10 +157,11 @@ public final class GameOutcome implements Iterable<Entry<LobbyPlayer, PlayerStat
|
||||
* @return the win spell effect
|
||||
*/
|
||||
public String getWinSpellEffect() {
|
||||
for( PlayerStatistics pv : playerRating.values())
|
||||
{
|
||||
if ( pv.getOutcome().hasWon() )
|
||||
return pv.getOutcome().altWinSourceName;
|
||||
for (PlayerStatistics pv : playerRating.values()) {
|
||||
|
||||
if (pv.getOutcome().hasWon()) {
|
||||
return pv.getOutcome().altWinSourceName;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user