Crossfire JXClient, Trunk
PendingDirections.java
Go to the documentation of this file.
1 /*
2  * This file is part of JXClient, the Fullscreen Java Crossfire Client.
3  *
4  * JXClient is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * JXClient is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with JXClient; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * Copyright (C) 2005-2008 Yann Chachkoff
19  * Copyright (C) 2006-2017,2019-2023 Andreas Kirschbaum
20  * Copyright (C) 2010-2012,2014-2018,2020-2023 Nicolas Weeger
21  */
22 
23 package com.realtime.crossfire.jxclient.map;
24 
25 import java.util.ArrayList;
26 import java.util.List;
27 import java.util.stream.Collectors;
28 import org.jetbrains.annotations.NotNull;
29 
40 public class PendingDirections {
41 
46  @NotNull
47  private final List<@NotNull Rec> pendingDirections = new ArrayList<>();
48 
52  @NotNull
53  private State state = State.IDLE;
54 
58  private int runDirection = -1;
59 
63  public PendingDirections() {
64  reset();
65  }
66 
71  @NotNull
72  public Iterable<@NotNull Integer> getPendingDirections() {
73  synchronized (pendingDirections) {
74  return pendingDirections.stream().map(Rec::getDirection).collect(Collectors.toList());
75  }
76  }
77 
82  public int getRunDirection() {
83  synchronized (pendingDirections) {
84  return runDirection;
85  }
86  }
87 
91  public void clear() {
92  synchronized (pendingDirections) {
93  reset();
94  runDirection = -1;
95  }
96  }
97 
103  public void add(final int direction, final int packetNo) {
104  synchronized (pendingDirections) {
105  pendingDirections.add(new Rec(direction, packetNo));
106  }
107  }
108 
113  public void run(final int direction) {
114  synchronized (pendingDirections) {
115  runDirection = direction;
116  }
117  }
118 
123  public void comc(final int packetNo) {
124  synchronized (pendingDirections) {
125  if (pendingDirections.isEmpty()) {
126  return;
127  }
128  final Rec rec = pendingDirections.get(0);
129  if (rec.getPacketNo() != packetNo) {
130  // ignore unrelated command
131  return;
132  }
133  if (state != State.IDLE) {
134  reset();
135  return;
136  }
138  }
139  }
140 
145  public void mapScroll(final int direction) {
146  synchronized (pendingDirections) {
147  if (pendingDirections.isEmpty()) {
148  return;
149  }
150 
152  reset();
153  return;
154  }
155 
156  final Rec rec = pendingDirections.remove(0);
157  if (rec.getDirection() != direction) {
158  reset();
159  return;
160  }
161 
162  state = State.IDLE;
163  }
164  }
165 
169  public void tick() {
170  synchronized (pendingDirections) {
172  reset();
173  } else if (state != State.IDLE) {
174  state = State.IDLE;
175  }
176  }
177  }
178 
182  private void reset() {
183  synchronized (pendingDirections) {
184  if (!pendingDirections.isEmpty()) {
185  pendingDirections.clear();
186  }
187  if (state != State.IDLE) {
188  state = State.IDLE;
189  }
190  }
191  }
192 
193  @NotNull
194  @Override
195  public String toString() {
196  return pendingDirections.toString();
197  }
198 
202  private enum State {
203 
208 
213 
218 
219  }
220 
224  private static class Rec {
225 
229  private final int direction;
230 
234  private final int packetNo;
235 
241  private Rec(final int direction, final int packetNo) {
242  this.direction = direction;
243  this.packetNo = packetNo;
244  }
245 
250  private int getDirection() {
251  return direction;
252  }
253 
258  private int getPacketNo() {
259  return packetNo;
260  }
261 
262  @NotNull
263  @Override
264  public String toString() {
265  return Integer.toString(direction);
266  }
267 
268  }
269 
270 }
com.realtime.crossfire.jxclient.map.PendingDirections.toString
String toString()
Definition: PendingDirections.java:195
com.realtime.crossfire.jxclient.map.PendingDirections.Rec.getPacketNo
int getPacketNo()
Definition: PendingDirections.java:258
com.realtime.crossfire.jxclient.map.PendingDirections.Rec.getDirection
int getDirection()
Definition: PendingDirections.java:250
com.realtime.crossfire.jxclient.map.PendingDirections.state
State state
Definition: PendingDirections.java:53
com.realtime.crossfire.jxclient.map.PendingDirections.PendingDirections
PendingDirections()
Definition: PendingDirections.java:63
com.realtime.crossfire.jxclient.map.PendingDirections.State.IDLE
IDLE
Definition: PendingDirections.java:207
com.realtime.crossfire.jxclient.map.PendingDirections.State.EXPECT_MAP_SCROLL_OR_TICK
EXPECT_MAP_SCROLL_OR_TICK
Definition: PendingDirections.java:212
com.realtime.crossfire.jxclient.map.PendingDirections.reset
void reset()
Definition: PendingDirections.java:182
com.realtime.crossfire.jxclient.map.PendingDirections.runDirection
int runDirection
Definition: PendingDirections.java:58
com.realtime.crossfire.jxclient.map.PendingDirections.State
Definition: PendingDirections.java:202
com.realtime.crossfire.jxclient.map.PendingDirections.comc
void comc(final int packetNo)
Definition: PendingDirections.java:123
com.realtime.crossfire.jxclient.map.PendingDirections.add
void add(final int direction, final int packetNo)
Definition: PendingDirections.java:103
com.realtime.crossfire.jxclient.map.PendingDirections.run
void run(final int direction)
Definition: PendingDirections.java:113
com.realtime.crossfire.jxclient.map.PendingDirections.Rec.toString
String toString()
Definition: PendingDirections.java:264
com.realtime.crossfire.jxclient.map.PendingDirections.getPendingDirections
Iterable< @NotNull Integer > getPendingDirections()
Definition: PendingDirections.java:72
com.realtime.crossfire.jxclient.map.PendingDirections.Rec
Definition: PendingDirections.java:224
com.realtime.crossfire.jxclient.map.PendingDirections.tick
void tick()
Definition: PendingDirections.java:169
com.realtime.crossfire.jxclient.map.PendingDirections
Definition: PendingDirections.java:40
com.realtime.crossfire.jxclient.map.PendingDirections.Rec.packetNo
final int packetNo
Definition: PendingDirections.java:234
com.realtime.crossfire.jxclient.map.PendingDirections.State.EXPECT_TICK
EXPECT_TICK
Definition: PendingDirections.java:217
com.realtime.crossfire.jxclient.map.PendingDirections.mapScroll
void mapScroll(final int direction)
Definition: PendingDirections.java:145
com.realtime.crossfire.jxclient.map.PendingDirections.getRunDirection
int getRunDirection()
Definition: PendingDirections.java:82
com.realtime.crossfire.jxclient.map.PendingDirections.Rec.direction
final int direction
Definition: PendingDirections.java:229
com.realtime.crossfire.jxclient.map.PendingDirections.Rec.Rec
Rec(final int direction, final int packetNo)
Definition: PendingDirections.java:241
com.realtime.crossfire.jxclient.map.PendingDirections.clear
void clear()
Definition: PendingDirections.java:91
com.realtime.crossfire.jxclient.map.PendingDirections.pendingDirections
final List< @NotNull Rec > pendingDirections
Definition: PendingDirections.java:47