remove all copy constructors and copy methods for all watchers

This commit is contained in:
Ingmar Goudt 2019-12-29 19:18:20 +01:00
parent e8303d551d
commit 702a1f2498
160 changed files with 94 additions and 1445 deletions

View file

@ -149,16 +149,6 @@ class ExertedThisTurnWatcher extends Watcher {
exertedThisTurnCreatures = new HashSet<>();
}
public ExertedThisTurnWatcher(final ExertedThisTurnWatcher watcher) {
super(watcher);
exertedThisTurnCreatures = new HashSet<>(watcher.exertedThisTurnCreatures);
}
@Override
public Watcher copy() {
return new ExertedThisTurnWatcher(this);
}
@Override
public void watch(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.BECOMES_EXERTED) {

View file

@ -45,15 +45,10 @@ class MeleeWatcher extends Watcher {
private Map<UUID, Set<UUID>> playersAttacked = new HashMap<>(0);
MeleeWatcher() {
public MeleeWatcher() {
super(WatcherScope.GAME);
}
MeleeWatcher(final MeleeWatcher watcher) {
super(watcher);
this.playersAttacked.putAll(watcher.playersAttacked);
}
@Override
public void watch(GameEvent event, Game game) {
if (event.getType() == EventType.BEGIN_COMBAT_STEP_PRE) {
@ -72,11 +67,6 @@ class MeleeWatcher extends Watcher {
}
return 0;
}
@Override
public MeleeWatcher copy() {
return new MeleeWatcher(this);
}
}
class MeleeDynamicValue implements DynamicValue {

View file

@ -1,10 +1,8 @@
package mage.watchers;
import mage.Mana;
import mage.constants.WatcherScope;
import mage.game.Game;
import mage.game.turn.Step;
import mage.game.events.GameEvent;
import org.apache.log4j.Logger;
@ -12,6 +10,7 @@ import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.util.*;
/**
@ -85,35 +84,48 @@ public abstract class Watcher implements Serializable {
public <T extends Watcher> T copy() {
try {
List<?> constructors = Arrays.asList(this.getClass().getConstructors());
//use getDeclaredConstructors to allow for package-private constructors (i.e. omit public)
List<?> constructors = Arrays.asList(this.getClass().getDeclaredConstructors());
if (constructors.size() > 1) {
logger.error(getClass().getSimpleName() + " has multiple constructors");
return null;
}
Constructor<? extends Watcher> constructor = (Constructor<? extends Watcher>) constructors.get(0);
if (constructor.getParameterCount() > 0) {
logger.error(getClass().getSimpleName() + " constructor has arguments, should be 0 and inject the parameters by setters");
return null;
}
constructor.setAccessible(true);
T watcher = (T) constructor.newInstance();
Object[] args = new Object[constructor.getParameterCount()];
for (int index = 0; index < constructor.getParameterTypes().length; index++) {
Class<?> parameterType = constructor.getParameterTypes()[index];
if(parameterType.isPrimitive()){
if(parameterType.getSimpleName().equalsIgnoreCase("boolean")){
args[index]=false;
}
}
else {
args[index] = null;
}
}
T watcher = (T) constructor.newInstance(args);
List<Field> allFields = new ArrayList<>();
allFields.addAll(Arrays.asList(getClass().getDeclaredFields()));
allFields.addAll(Arrays.asList(getClass().getSuperclass().getDeclaredFields()));
for (Field field : allFields) {
field.setAccessible(true);
if (field.getType() == Set.class) {
((Set) field.get(watcher)).clear();
((Set) field.get(watcher)).addAll((Set) field.get(this));
} else if (field.getType() == Map.class) {
((Map) field.get(watcher)).clear();
((Map) field.get(watcher)).putAll((Map) field.get(this));
} else if (field.getType() == List.class) {
((List) field.get(watcher)).clear();
((List) field.get(watcher)).addAll((List) field.get(this));
} else {
if (field.getType() != Logger.class) {
if (!Modifier.isStatic(field.getModifiers())) {
field.setAccessible(true);
if (field.getType() == Set.class) {
((Set) field.get(watcher)).clear();
((Set) field.get(watcher)).addAll((Set) field.get(this));
} else if (field.getType() == Map.class) {
((Map) field.get(watcher)).clear();
((Map) field.get(watcher)).putAll((Map) field.get(this));
} else if (field.getType() == List.class) {
((List) field.get(watcher)).clear();
((List) field.get(watcher)).addAll((List) field.get(this));
} else {
field.set(watcher, field.get(this));
}
}

View file

@ -30,18 +30,6 @@ public class CardsCycledOrDiscardedThisTurnWatcher extends Watcher {
super(WatcherScope.GAME);
}
public CardsCycledOrDiscardedThisTurnWatcher(final CardsCycledOrDiscardedThisTurnWatcher watcher) {
super(watcher);
for (Entry<UUID, Cards> entry : watcher.cycledOrDiscardedCardsThisTurn.entrySet()) {
cycledOrDiscardedCardsThisTurn.put(entry.getKey(), entry.getValue().copy());
}
for (Entry<UUID, Set<MageObjectReference>> entry : watcher.numberOfCycledOrDiscardedCardsThisTurn.entrySet()) {
Set<MageObjectReference> cycledOrDiscardedCards = new HashSet<>();
cycledOrDiscardedCards.addAll(entry.getValue());
numberOfCycledOrDiscardedCardsThisTurn.put(entry.getKey(), cycledOrDiscardedCards);
}
numberOfCycledOrDiscardedCardsThisTurn.putAll(watcher.numberOfCycledOrDiscardedCardsThisTurn);
}
@Override
public void watch(GameEvent event, Game game) {
@ -81,8 +69,4 @@ public class CardsCycledOrDiscardedThisTurnWatcher extends Watcher {
numberOfCycledOrDiscardedCardsThisTurn.clear();
}
@Override
public CardsCycledOrDiscardedThisTurnWatcher copy() {
return new CardsCycledOrDiscardedThisTurnWatcher(this);
}
}

View file

@ -33,17 +33,6 @@ public class CommanderInfoWatcher extends Watcher {
this.checkCommanderDamage = checkCommanderDamage;
}
public CommanderInfoWatcher(final CommanderInfoWatcher watcher) {
super(watcher);
this.damageToPlayer.putAll(watcher.damageToPlayer);
this.checkCommanderDamage = watcher.checkCommanderDamage;
}
@Override
public CommanderInfoWatcher copy() {
return new CommanderInfoWatcher(this);
}
@Override
public void watch(GameEvent event, Game game) {
if (checkCommanderDamage && event.getType() == EventType.DAMAGED_PLAYER && event instanceof DamagedPlayerEvent) {

View file

@ -23,26 +23,11 @@ public class DamagedByWatcher extends Watcher {
private final boolean watchPlaneswalkers;
public DamagedByWatcher() {
this(false);
}
public DamagedByWatcher(boolean watchPlaneswalkers) {
super(WatcherScope.CARD);
this.watchPlaneswalkers = watchPlaneswalkers;
}
public DamagedByWatcher(final DamagedByWatcher watcher) {
super(watcher);
this.damagedBySource.addAll(watcher.damagedBySource);
this.watchPlaneswalkers = watcher.watchPlaneswalkers;
}
@Override
public DamagedByWatcher copy() {
return new DamagedByWatcher(this);
}
@Override
public void watch(GameEvent event, Game game) {
boolean eventHasAppropriateType = (event.getType() == EventType.DAMAGED_CREATURE) ||

View file

@ -22,16 +22,6 @@ public class FirstTimeStepWatcher extends Watcher {
this.eventType = eventType;
}
public FirstTimeStepWatcher(final FirstTimeStepWatcher watcher) {
super(watcher);
this.eventType = watcher.eventType;
}
@Override
public FirstTimeStepWatcher copy() {
return new FirstTimeStepWatcher(this);
}
@Override
public void watch(GameEvent event, Game game) {
if (event.getType() == eventType) {