Merge branch 'master' into 'master'

[Mobile] Update netcode, fix swapped players

See merge request core-developers/forge!6368
This commit is contained in:
Michael Kamensky
2022-03-08 04:45:33 +00:00
11 changed files with 68 additions and 52 deletions

View File

@@ -1000,6 +1000,12 @@ public final class CMatchUI
public void showPromptMessage(final PlayerView playerView, final String message) { public void showPromptMessage(final PlayerView playerView, final String message) {
cPrompt.setMessage(message); cPrompt.setMessage(message);
} }
@Override
public void showCardPromptMessage(PlayerView playerView, String message, CardView card) {
cPrompt.setMessage(message, card);
}
// no override for now // no override for now
public void showPromptMessage(final PlayerView playerView, final String message, final CardView card ) { public void showPromptMessage(final PlayerView playerView, final String message, final CardView card ) {
cPrompt.setMessage(message,card); cPrompt.setMessage(message,card);

View File

@@ -339,7 +339,7 @@ public class Forge implements ApplicationListener {
protected void afterDbLoaded() { protected void afterDbLoaded() {
//init here to fix crash if the assets are missing //init here to fix crash if the assets are missing
transitionTexture = new Texture(GuiBase.isAndroid() ? Gdx.files.internal("fallback_skin").child("transition.png") : Gdx.files.classpath("fallback_skin").child("transition.png")); transitionTexture = new Texture(Gdx.files.classpath("fallback_skin").child("transition.png"));
destroyThis = false; //Allow back() destroyThis = false; //Allow back()

View File

@@ -200,7 +200,6 @@ public class PlayerStatisticScene extends UIScene {
back.getLabel().setText(Forge.getLocalizer().getMessage("lblBack")); back.getLabel().setText(Forge.getLocalizer().getMessage("lblBack"));
ScrollPane scrollPane = ui.findActor("enemies"); ScrollPane scrollPane = ui.findActor("enemies");
scrollPane.setActor(enemiesGroup); scrollPane.setActor(enemiesGroup);
enemiesGroup.setFillParent(true);
this.init = true; this.init = true;
} }
} }

View File

@@ -108,7 +108,7 @@ public class FSkin {
{ {
if (!dir.exists() || !dir.isDirectory()) { if (!dir.exists() || !dir.isDirectory()) {
//if skins directory doesn't exist, point to internal assets/skin directory instead for the sake of the splash screen //if skins directory doesn't exist, point to internal assets/skin directory instead for the sake of the splash screen
preferredDir = GuiBase.isAndroid() ? Gdx.files.internal("fallback_skin") : Gdx.files.classpath("fallback_skin"); preferredDir = Gdx.files.classpath("fallback_skin");
} }
else { else {
if (splashScreen != null) { if (splashScreen != null) {

View File

@@ -97,9 +97,7 @@ public class SplashScreen extends FContainer {
private float progress = 0; private float progress = 0;
private boolean finished, openAdventure; private boolean finished, openAdventure;
//for transition image only... //for transition image only...
TextureRegion transition_bg = new TextureRegion(new Texture(GuiBase.isAndroid() TextureRegion transition_bg = new TextureRegion(new Texture(Gdx.files.classpath("fallback_skin").child("title_bg_lq.png")));
? Gdx.files.internal("fallback_skin").child("title_bg_lq.png")
: Gdx.files.classpath("fallback_skin").child("title_bg_lq.png")));
public void drawBackground(Graphics g) { public void drawBackground(Graphics g) {
float percentage = progress / DURATION; float percentage = progress / DURATION;

View File

@@ -12,6 +12,7 @@ import forge.deck.Deck;
import forge.game.player.Player; import forge.game.player.Player;
import forge.item.IPaperCard; import forge.item.IPaperCard;
import forge.screens.TransitionScreen; import forge.screens.TransitionScreen;
import forge.util.collect.FCollection;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Function; import com.google.common.base.Function;
@@ -157,13 +158,18 @@ public class MatchController extends AbstractGuiGame {
public void openView(final TrackableCollection<PlayerView> myPlayers) { public void openView(final TrackableCollection<PlayerView> myPlayers) {
final boolean noHumans = !hasLocalPlayers(); final boolean noHumans = !hasLocalPlayers();
final FCollectionView<PlayerView> allPlayers = getGameView().getPlayers(); FCollectionView<PlayerView> players = getGameView().getPlayers();
if (players.size() == 2 && myPlayers != null && myPlayers.size() == 1 && myPlayers.get(0).equals(players.get(1))) {
players = new FCollection<>(new PlayerView[]{players.get(1), players.get(0)});
}
final List<VPlayerPanel> playerPanels = new ArrayList<>(); final List<VPlayerPanel> playerPanels = new ArrayList<>();
for (final PlayerView p : allPlayers) { boolean init = false;
for (final PlayerView p : players) {
final boolean isLocal = isLocalPlayer(p); final boolean isLocal = isLocalPlayer(p);
final VPlayerPanel playerPanel = new VPlayerPanel(p, isLocal || noHumans, allPlayers.size()); final VPlayerPanel playerPanel = new VPlayerPanel(p, isLocal || noHumans, players.size());
if (isLocal && !playerPanels.isEmpty()) { if (isLocal && !init) {
playerPanels.add(0, playerPanel); //ensure local player always first among player panels playerPanels.add(0, playerPanel); //ensure local player always first among player panels
init = true;
} }
else { else {
playerPanels.add(playerPanel); playerPanels.add(playerPanel);
@@ -194,7 +200,7 @@ public class MatchController extends AbstractGuiGame {
actuateMatchPreferences(); actuateMatchPreferences();
//reset daytime every match //reset daytime every match
updateDayTime(null); updateDayTime(null);
Forge.openScreen(view); Forge.openScreen(view, GuiBase.isNetworkplay());
} }
@Override @Override
@@ -203,7 +209,7 @@ public class MatchController extends AbstractGuiGame {
} }
@Override @Override
public void showPromptMessage(final PlayerView player, final String message, final CardView card) { public void showCardPromptMessage(final PlayerView player, final String message, final CardView card) {
view.getPrompt(player).setMessage(message, card); view.getPrompt(player).setMessage(message, card);
} }

View File

@@ -123,10 +123,10 @@ public abstract class InputBase implements java.io.Serializable, Input {
controller.getGui().showPromptMessage(getOwner(), message); controller.getGui().showPromptMessage(getOwner(), message);
} }
protected final void showMessage(final String message, final SpellAbilityView sav) { protected final void showMessage(final String message, final SpellAbilityView sav) {
controller.getGui().showPromptMessage(getOwner(), message, sav.getHostCard()); controller.getGui().showCardPromptMessage(getOwner(), message, sav.getHostCard());
} }
protected final void showMessage(final String message, final CardView card) { protected final void showMessage(final String message, final CardView card) {
controller.getGui().showPromptMessage(getOwner(), message, card); controller.getGui().showCardPromptMessage(getOwner(), message, card);
} }
protected String getTurnPhasePriorityMessage(final Game game) { protected String getTurnPhasePriorityMessage(final Game game) {

View File

@@ -5,7 +5,6 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.ObjectInputStream; import java.io.ObjectInputStream;
import java.io.ObjectStreamClass; import java.io.ObjectStreamClass;
import java.io.StreamCorruptedException;
import io.netty.handler.codec.serialization.ClassResolver; import io.netty.handler.codec.serialization.ClassResolver;
@@ -23,16 +22,19 @@ public class CObjectInputStream extends ObjectInputStream {
if (type < 0) { if (type < 0) {
throw new EOFException(); throw new EOFException();
} else { } else {
switch(type) { ObjectStreamClass resultClassDescriptor = super.readClassDescriptor();
case 0: Class localClass;
return super.readClassDescriptor(); try {
case 1: localClass = Class.forName(resultClassDescriptor.getName());
String className = readUTF(); } catch (ClassNotFoundException e) {
Class<?> clazz = classResolver.resolve(className); System.err.println("[Class Not Found Exception]\nNo local class for " + resultClassDescriptor.getName());
return ObjectStreamClass.lookupAny(clazz); return resultClassDescriptor;
default:
throw new StreamCorruptedException("Unexpected class descriptor type: " + type);
} }
ObjectStreamClass localClassDescriptor = ObjectStreamClass.lookupAny(localClass);
if (localClassDescriptor != null && type == 1) {
resultClassDescriptor = localClassDescriptor; // Use local class descriptor for deserialization by default
}
return resultClassDescriptor;
} }
} }

View File

@@ -32,21 +32,22 @@ public enum ProtocolMethod {
// Server -> Client // Server -> Client
setGameView (Mode.SERVER, Void.TYPE, GameView.class), setGameView (Mode.SERVER, Void.TYPE, GameView.class),
openView (Mode.SERVER, Void.TYPE, TrackableCollection/*PlayerView*/.class), openView (Mode.SERVER, Void.TYPE, TrackableCollection/*PlayerView*/.class),
afterGameEnd (Mode.SERVER), afterGameEnd (Mode.SERVER, Void.TYPE),
showCombat (Mode.SERVER), showCombat (Mode.SERVER, Void.TYPE),
showPromptMessage (Mode.SERVER, Void.TYPE, PlayerView.class, String.class), showPromptMessage (Mode.SERVER, Void.TYPE, PlayerView.class, String.class),
showCardPromptMessage (Mode.SERVER, Void.TYPE, PlayerView.class, String.class, CardView.class),
updateButtons (Mode.SERVER, Void.TYPE, PlayerView.class, String.class, String.class, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE), updateButtons (Mode.SERVER, Void.TYPE, PlayerView.class, String.class, String.class, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE),
flashIncorrectAction(Mode.SERVER), flashIncorrectAction(Mode.SERVER, Void.TYPE),
alertUser (Mode.SERVER), alertUser (Mode.SERVER, Void.TYPE),
updatePhase (Mode.SERVER, Void.TYPE, Boolean.TYPE), updatePhase (Mode.SERVER, Void.TYPE, Boolean.TYPE),
updateTurn (Mode.SERVER, Void.TYPE, PlayerView.class), updateTurn (Mode.SERVER, Void.TYPE, PlayerView.class),
updatePlayerControl (Mode.SERVER), updatePlayerControl (Mode.SERVER, Void.TYPE),
enableOverlay (Mode.SERVER), enableOverlay (Mode.SERVER, Void.TYPE),
disableOverlay (Mode.SERVER), disableOverlay (Mode.SERVER, Void.TYPE),
finishGame (Mode.SERVER), finishGame (Mode.SERVER, Void.TYPE),
showManaPool (Mode.SERVER, Void.TYPE, PlayerView.class), showManaPool (Mode.SERVER, Void.TYPE, PlayerView.class),
hideManaPool (Mode.SERVER, Void.TYPE, PlayerView.class), hideManaPool (Mode.SERVER, Void.TYPE, PlayerView.class),
updateStack (Mode.SERVER), updateStack (Mode.SERVER, Void.TYPE),
updateZones (Mode.SERVER, Void.TYPE, Iterable/*PlayerZoneUpdate*/.class), updateZones (Mode.SERVER, Void.TYPE, Iterable/*PlayerZoneUpdate*/.class),
tempShowZones (Mode.SERVER, Iterable/*PlayerZoneUpdate*/.class, PlayerView.class, Iterable/*PlayerZoneUpdate*/.class), tempShowZones (Mode.SERVER, Iterable/*PlayerZoneUpdate*/.class, PlayerView.class, Iterable/*PlayerZoneUpdate*/.class),
hideZones (Mode.SERVER, Void.TYPE, PlayerView.class, Iterable/*PlayerZoneUpdate*/.class), hideZones (Mode.SERVER, Void.TYPE, PlayerView.class, Iterable/*PlayerZoneUpdate*/.class),
@@ -71,11 +72,11 @@ public enum ProtocolMethod {
manipulateCardList (Mode.SERVER, List.class, String.class, Iterable.class, Iterable.class, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE), manipulateCardList (Mode.SERVER, List.class, String.class, Iterable.class, Iterable.class, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE),
setCard (Mode.SERVER, Void.TYPE, CardView.class), setCard (Mode.SERVER, Void.TYPE, CardView.class),
setSelectables (Mode.SERVER, Void.TYPE, Iterable/*CardView*/.class), setSelectables (Mode.SERVER, Void.TYPE, Iterable/*CardView*/.class),
clearSelectables (Mode.SERVER), clearSelectables (Mode.SERVER, Void.TYPE),
refreshField (Mode.SERVER), refreshField (Mode.SERVER, Void.TYPE),
// TODO case "setPlayerAvatar": // TODO case "setPlayerAvatar":
openZones (Mode.SERVER, PlayerZoneUpdates.class, PlayerView.class, Collection/*ZoneType*/.class, Map/*PlayerView,Object*/.class), openZones (Mode.SERVER, PlayerZoneUpdates.class, PlayerView.class, Collection/*ZoneType*/.class, Map/*PlayerView,Object*/.class),
restoreOldZones (Mode.SERVER, Void.TYPE, PlayerView.class, PlayerZoneUpdates.class), restoreOldZones (Mode.SERVER, Void.TYPE, PlayerView.class, Iterable/*PlayerZoneUpdates*/.class),
isUiSetToSkipPhase (Mode.SERVER, Boolean.TYPE, PlayerView.class, PhaseType.class), isUiSetToSkipPhase (Mode.SERVER, Boolean.TYPE, PlayerView.class, PhaseType.class),
setRememberedActions(Mode.SERVER, Void.TYPE), setRememberedActions(Mode.SERVER, Void.TYPE),
nextRememberedAction(Mode.SERVER, Void.TYPE), nextRememberedAction(Mode.SERVER, Void.TYPE),
@@ -85,18 +86,18 @@ public enum ProtocolMethod {
// which client and server wait for one another's response and block // which client and server wait for one another's response and block
// the threads that're supposed to give that response // the threads that're supposed to give that response
useMana (Mode.CLIENT, Void.TYPE, Byte.TYPE), useMana (Mode.CLIENT, Void.TYPE, Byte.TYPE),
undoLastAction (Mode.CLIENT, Void.TYPE, Boolean.TYPE), undoLastAction (Mode.CLIENT, Void.TYPE),
selectPlayer (Mode.CLIENT, Void.TYPE, PlayerView.class, ITriggerEvent.class), selectPlayer (Mode.CLIENT, Void.TYPE, PlayerView.class, ITriggerEvent.class),
selectCard (Mode.CLIENT, Void.TYPE, CardView.class, List.class, ITriggerEvent.class), selectCard (Mode.CLIENT, Void.TYPE, CardView.class, List.class, ITriggerEvent.class),
selectButtonOk (Mode.CLIENT), selectButtonOk (Mode.CLIENT, Void.TYPE),
selectButtonCancel (Mode.CLIENT), selectButtonCancel (Mode.CLIENT, Void.TYPE),
selectAbility (Mode.CLIENT, Void.TYPE, SpellAbilityView.class), selectAbility (Mode.CLIENT, Void.TYPE, SpellAbilityView.class),
passPriorityUntilEndOfTurn(Mode.CLIENT), passPriorityUntilEndOfTurn(Mode.CLIENT, Void.TYPE),
passPriority (Mode.CLIENT), passPriority (Mode.CLIENT, Void.TYPE),
nextGameDecision (Mode.CLIENT, Void.TYPE, NextGameDecision.class), nextGameDecision (Mode.CLIENT, Void.TYPE, NextGameDecision.class),
getActivateDescription (Mode.CLIENT, String.class, CardView.class), getActivateDescription (Mode.CLIENT, String.class, CardView.class),
concede (Mode.CLIENT), concede (Mode.CLIENT, Void.TYPE),
alphaStrike (Mode.CLIENT), alphaStrike (Mode.CLIENT, Void.TYPE),
reorderHand (Mode.CLIENT, Void.TYPE, CardView.class, Integer.TYPE); reorderHand (Mode.CLIENT, Void.TYPE, CardView.class, Integer.TYPE);
private enum Mode { private enum Mode {
@@ -161,13 +162,17 @@ public enum ProtocolMethod {
if(!GuiBase.hasPropertyConfig()) if(!GuiBase.hasPropertyConfig())
return; //if the experimental network option is enabled, then check the args, else let the default decoder handle it return; //if the experimental network option is enabled, then check the args, else let the default decoder handle it
for (int iArg = 0; iArg < args.length; iArg++) { try {
final Object arg = args[iArg]; for (int iArg = 0; iArg < args.length; iArg++) {
final Class<?> type = this.args[iArg]; final Object arg = args[iArg];
if (!ReflectionUtil.isInstance(arg, type)) { final Class<?> type = this.args[iArg];
//throw new InternalError(String.format("Protocol method %s: illegal argument (%d) of type %s, %s expected", name(), iArg, arg.getClass().getName(), type.getName())); if (!ReflectionUtil.isInstance(arg, type)) {
System.err.println(String.format("InternalError: Protocol method %s: illegal argument (%d) of type %s, %s expected (ProtocolMethod.java)", name(), iArg, arg.getClass().getName(), type.getName())); //throw new InternalError(String.format("Protocol method %s: illegal argument (%d) of type %s, %s expected", name(), iArg, arg.getClass().getName(), type.getName()));
System.err.println(String.format("InternalError: Protocol method %s: illegal argument (%d) of type %s, %s expected (ProtocolMethod.java)", name(), iArg, arg.getClass().getName(), type.getName()));
}
} }
} catch (Exception e) {
e.printStackTrace();
} }
} }

View File

@@ -76,9 +76,9 @@ public class NetGuiGame extends AbstractGuiGame {
} }
@Override @Override
public void showPromptMessage(final PlayerView playerView, final String message, final CardView card) { public void showCardPromptMessage(final PlayerView playerView, final String message, final CardView card) {
updateGameView(); updateGameView();
send(ProtocolMethod.showPromptMessage, playerView, message); send(ProtocolMethod.showCardPromptMessage, playerView, message, card);
} }
@Override @Override

View File

@@ -39,7 +39,7 @@ public interface IGuiGame {
void afterGameEnd(); void afterGameEnd();
void showCombat(); void showCombat();
void showPromptMessage(PlayerView playerView, String message); void showPromptMessage(PlayerView playerView, String message);
void showPromptMessage(PlayerView playerView, String message, CardView card); void showCardPromptMessage(PlayerView playerView, String message, CardView card);
void updateButtons(PlayerView owner, boolean okEnabled, boolean cancelEnabled, boolean focusOk); void updateButtons(PlayerView owner, boolean okEnabled, boolean cancelEnabled, boolean focusOk);
void updateButtons(PlayerView owner, String label1, String label2, boolean enable1, boolean enable2, boolean focus1); void updateButtons(PlayerView owner, String label1, String label2, boolean enable1, boolean enable2, boolean focus1);
void flashIncorrectAction(); void flashIncorrectAction();