Crossfire JXClient, Trunk
MapUpdaterState.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 
33 import java.util.Collection;
34 import java.util.HashSet;
35 import java.util.Set;
36 import org.jetbrains.annotations.NotNull;
37 
50 
54  @NotNull
55  private final Object sync = new Object();
56 
60  @NotNull
61  private final FacesManager facesManager;
62 
66  @NotNull
67  private final Animations animations;
68 
72  @NotNull
73  private final CfAnimations cfAnimations;
74 
78  private int mapWidth;
79 
83  private int mapHeight;
84 
88  @NotNull
89  private final CfMap map = new CfMap();
90 
94  @NotNull
96 
100  @NotNull
102 
106  @NotNull
108 
112  @NotNull
114 
118  @NotNull
119  private final Collection<Location> outOfViewMultiFaces = new HashSet<>();
120 
127  public MapUpdaterState(@NotNull final FacesManager facesManager, @NotNull final Animations animations, @NotNull final CfAnimations cfAnimations) {
128  this.facesManager = facesManager;
129  this.animations = animations;
130  this.cfAnimations = cfAnimations;
131 
133 
134  @NotNull
135  @Override
136  public Object mapBegin() {
137  return MapUpdaterState.this.mapBegin();
138  }
139 
140  @Override
141  public void mapFace(@NotNull final Location location, final int faceNum) {
142  MapUpdaterState.this.mapFace(location, faceNum, false);
143  }
144 
145  @Override
146  public void mapEnd() {
147  MapUpdaterState.this.mapEnd(false);
148  }
149 
150  });
151  }
152 
157  public void addCrossfireMapListener(@NotNull final MapListener listener) {
158  mapListeners.add(listener);
159  }
160 
165  public void removeCrossfireMapListener(@NotNull final MapListener listener) {
166  mapListeners.remove(listener);
167  }
168 
173  public void addCrossfireNewmapListener(@NotNull final NewmapListener listener) {
174  newmapListeners.add(listener);
175  }
176 
181  public void removeCrossfireNewmapListener(@NotNull final NewmapListener listener) {
182  newmapListeners.remove(listener);
183  }
184 
189  public void addCrossfireMapScrollListener(@NotNull final MapScrollListener listener) {
190  mapScrollListeners.add(listener);
191  }
192 
197  public void removeCrossfireMapScrollListener(@NotNull final MapScrollListener listener) {
198  mapScrollListeners.remove(listener);
199  }
200 
205  public void addMapSizeListener(@NotNull final MapSizeListener listener) {
206  mapSizeListeners.add(listener);
207  }
208 
213  public void removeMapSizeListener(@NotNull final MapSizeListener listener) {
214  mapSizeListeners.remove(listener);
215  }
216 
220  public void reset() {
221  synchronized (sync) {
223  }
224  }
225 
226  @NotNull
227  @Override
228  public Object mapBegin() {
229  return sync;
230  }
231 
232  @Override
233  public void mapClear(final int x, final int y) {
234  assert Thread.holdsLock(sync);
235  cfAnimations.mapRemove(x, y);
236  outOfViewMultiFaces.clear();
237  synchronized (map) {
238  map.clearSquare(x, y);
239  }
240  }
241 
242  @Override
243  public void mapFace(@NotNull final Location location, final int faceNum) {
244  mapFace(location, faceNum, true);
245  }
246 
253  public void mapFace(@NotNull final Location location, final int faceNum, final boolean clearAnimation) {
254  assert Thread.holdsLock(sync);
255  if (clearAnimation) {
256  cfAnimations.mapRemove(location);
257  }
258  final Face face = facesManager.getFace2(faceNum);
259  final int x = location.getX();
260  final int y = location.getY();
261  if (x >= mapWidth || y >= mapHeight) {
262  if (face == null) {
263  outOfViewMultiFaces.remove(location);
264  } else if (face.getTileWidth() > 1 || face.getTileHeight() > 1) {
265  outOfViewMultiFaces.add(location);
266  }
267  }
268  synchronized (map) {
269  map.setFace(x, y, location.getLayer(), face);
270  }
271  }
272 
273  @Override
274  public void mapAnimation(@NotNull final Location location, final int animationNum, final int animationType) {
275  assert Thread.holdsLock(sync);
276  final Animation animation = animations.get(animationNum);
277  if (animation == null) {
278  System.err.println("unknown animation id "+animationNum+", ignoring");
279  return;
280  }
281 
282  synchronized (map) {
283  map.setFace(location.getX(), location.getY(), location.getLayer(), null);
284  }
285  cfAnimations.mapAdd(location, animation, animationType);
286  }
287 
288  @Override
289  public void mapAnimationSpeed(@NotNull final Location location, final int animationSpeed) {
290  assert Thread.holdsLock(sync);
291  cfAnimations.mapUpdateSpeed(location, animationSpeed);
292  }
293 
294  @Override
295  public void mapSmooth(@NotNull final Location location, final int smooth) {
296  assert Thread.holdsLock(sync);
297  synchronized (map) {
298  map.setSmooth(location.getX(), location.getY(), location.getLayer(), smooth);
299  }
300  }
301 
302  @Override
303  public void mapDarkness(final int x, final int y, final int darkness) {
304  assert Thread.holdsLock(sync);
305  synchronized (map) {
306  map.setDarkness(x, y, darkness);
307  }
308  }
309 
310  @Override
311  public void magicMap(final int x, final int y, final byte @NotNull [] @NotNull [] data) {
312  assert Thread.holdsLock(sync);
313  synchronized (map) {
314  map.setMagicMap(x, y, data);
315  }
316  }
317 
318  @Override
319  public void mapEnd() {
320  mapEnd(true);
321  }
322 
329  public void mapEnd(final boolean alwaysProcess) {
330  assert Thread.holdsLock(sync);
331  synchronized (map) {
332  final Set<CfMapSquare> squares = map.getDirtyMapSquares();
333  if (!alwaysProcess && squares.isEmpty()) {
334  return;
335  }
336 
337  for (MapListener listener : mapListeners) {
338  listener.mapChanged(map, squares);
339  }
340  }
341  }
342 
343  @Override
344  public void mapScroll(final int dx, final int dy) {
345  assert Thread.holdsLock(sync);
346  synchronized (map) {
347  for (Location location : outOfViewMultiFaces) {
348  cfAnimations.mapRemove(location);
349  map.setFace(location.getX(), location.getY(), location.getLayer(), null);
350  }
351  outOfViewMultiFaces.clear();
352 
353  if (map.processMapScroll(dx, dy, mapWidth, mapHeight)) {
355  } else {
356  cfAnimations.mapScroll(dx, dy);
357  }
358  }
359 
360  for (MapScrollListener mapscrollListener : mapScrollListeners) {
361  mapscrollListener.mapScrolled(dx, dy);
362  }
363  }
364 
365  @Override
366  public void faceUpdated(@NotNull final Face face) {
367  synchronized (mapBegin()) {
368  //noinspection NestedSynchronizedStatement
369  synchronized (map) {
370  map.updateFace(face.getFaceNum(), mapWidth, mapHeight);
371  }
372  mapEnd();
373  }
374  }
375 
376  @Override
377  public void newMap(final int mapWidth, final int mapHeight) {
378  synchronized (sync) {
379  final boolean changed = this.mapWidth != mapWidth || this.mapHeight != mapHeight;
380  this.mapWidth = mapWidth;
381  this.mapHeight = mapHeight;
382  //noinspection NestedSynchronizedStatement
383  synchronized (map) {
385  }
386 
388 
389  if (changed) {
390  for (MapSizeListener listener : mapSizeListeners) {
391  listener.mapSizeChanged(mapWidth, mapHeight);
392  }
393  }
394 
395  for (NewmapListener listener : newmapListeners) {
396  listener.commandNewmapReceived();
397  }
398  }
399  }
400 
405  @NotNull
406  public CfMap getMap() {
407  return map;
408  }
409 
414  public int getMapWidth() {
415  synchronized (map) {
416  return mapWidth;
417  }
418  }
419 
424  public int getMapHeight() {
425  synchronized (map) {
426  return mapHeight;
427  }
428  }
429 
430  @Override
431  public void tick(final int tickNo) {
432  synchronized (sync) {
433  cfAnimations.tick(tickNo);
434  }
435  }
436 
437 }
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapSizeListeners
final EventListenerList2< MapSizeListener > mapSizeListeners
Definition: MapUpdaterState.java:113
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.map.CfAnimations
Definition: CfAnimations.java:46
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapFace
void mapFace(@NotNull final Location location, final int faceNum, final boolean clearAnimation)
Definition: MapUpdaterState.java:253
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapEnd
void mapEnd()
Definition: MapUpdaterState.java:319
com.realtime.crossfire.jxclient.server
com.realtime.crossfire.jxclient.map.CfAnimations.mapRemove
void mapRemove(final int x, final int y)
Definition: CfAnimations.java:293
com.realtime.crossfire.jxclient.animations.Animations.get
Animation get(final int animationId)
Definition: Animations.java:125
com.realtime.crossfire.jxclient.map.MapUpdaterState.newMap
void newMap(final int mapWidth, final int mapHeight)
Definition: MapUpdaterState.java:377
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapDarkness
void mapDarkness(final int x, final int y, final int darkness)
Definition: MapUpdaterState.java:303
com.realtime.crossfire.jxclient.map.MapScrollListener
Definition: MapScrollListener.java:31
com.realtime.crossfire.jxclient.map.CfAnimations.mapClear
void mapClear()
Definition: CfAnimations.java:267
com.realtime.crossfire.jxclient.map.MapUpdaterState.sync
final Object sync
Definition: MapUpdaterState.java:55
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapScroll
void mapScroll(final int dx, final int dy)
Definition: MapUpdaterState.java:344
com.realtime.crossfire.jxclient.map.CfAnimations.mapScroll
void mapScroll(final int dx, final int dy)
Definition: CfAnimations.java:322
com.realtime.crossfire.jxclient.map.MapUpdaterState.removeCrossfireMapScrollListener
void removeCrossfireMapScrollListener(@NotNull final MapScrollListener listener)
Definition: MapUpdaterState.java:197
com.realtime.crossfire.jxclient.map.MapUpdaterState.addCrossfireNewmapListener
void addCrossfireNewmapListener(@NotNull final NewmapListener listener)
Definition: MapUpdaterState.java:173
com.realtime.crossfire.jxclient.map.CfMap.setFace
void setFace(final int x, final int y, final int layer, @Nullable final Face face)
Definition: CfMap.java:253
com.realtime.crossfire.jxclient.map.MapUpdaterState.addMapSizeListener
void addMapSizeListener(@NotNull final MapSizeListener listener)
Definition: MapUpdaterState.java:205
com.realtime.crossfire.jxclient.util.EventListenerList2
Definition: EventListenerList2.java:37
com.realtime.crossfire.jxclient.map.NewmapListener
Definition: NewmapListener.java:31
com.realtime.crossfire.jxclient.faces.FacesManagerListener
Definition: FacesManagerListener.java:32
com.realtime.crossfire.jxclient.map.MapUpdaterState.MapUpdaterState
MapUpdaterState(@NotNull final FacesManager facesManager, @NotNull final Animations animations, @NotNull final CfAnimations cfAnimations)
Definition: MapUpdaterState.java:127
com.realtime.crossfire.jxclient.map.CfMap
Definition: CfMap.java:46
com.realtime.crossfire.jxclient.faces
Definition: AbstractFaceQueue.java:23
com.realtime.crossfire.jxclient.map.MapUpdaterState.addCrossfireMapScrollListener
void addCrossfireMapScrollListener(@NotNull final MapScrollListener listener)
Definition: MapUpdaterState.java:189
com.realtime.crossfire.jxclient.map.MapUpdaterState.newmapListeners
final EventListenerList2< NewmapListener > newmapListeners
Definition: MapUpdaterState.java:101
com.realtime.crossfire.jxclient.map.Location
Definition: Location.java:32
com.realtime.crossfire.jxclient.map.CfMap.setDarkness
void setDarkness(final int x, final int y, final int darkness)
Definition: CfMap.java:160
com.realtime.crossfire.jxclient.faces.Face.getTileHeight
int getTileHeight()
Definition: Face.java:154
com.realtime.crossfire.jxclient.map.MapListener
Definition: MapListener.java:34
com.realtime.crossfire.jxclient.map.MapUpdaterState.removeCrossfireMapListener
void removeCrossfireMapListener(@NotNull final MapListener listener)
Definition: MapUpdaterState.java:165
com.realtime.crossfire.jxclient.server.crossfire.CrossfireUpdateMapListener
Definition: CrossfireUpdateMapListener.java:33
com.realtime.crossfire.jxclient.map.MapUpdaterState.outOfViewMultiFaces
final Collection< Location > outOfViewMultiFaces
Definition: MapUpdaterState.java:119
com.realtime.crossfire.jxclient.map.CfMap.reset
void reset(final int mapWidth, final int mapHeight)
Definition: CfMap.java:134
com.realtime.crossfire.jxclient.map.MapUpdaterState.addCrossfireMapListener
void addCrossfireMapListener(@NotNull final MapListener listener)
Definition: MapUpdaterState.java:157
com.realtime.crossfire.jxclient.map.MapUpdaterState.magicMap
void magicMap(final int x, final int y, final byte @NotNull[] @NotNull[] data)
Definition: MapUpdaterState.java:311
com.realtime.crossfire.jxclient.animations
Definition: Animation.java:23
com.realtime.crossfire.jxclient.map.MapUpdaterState
Definition: MapUpdaterState.java:49
com.realtime.crossfire.jxclient.map.MapUpdaterState.tick
void tick(final int tickNo)
Definition: MapUpdaterState.java:431
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapEnd
void mapEnd(final boolean alwaysProcess)
Definition: MapUpdaterState.java:329
com.realtime.crossfire.jxclient.map.MapUpdaterState.removeMapSizeListener
void removeMapSizeListener(@NotNull final MapSizeListener listener)
Definition: MapUpdaterState.java:213
com.realtime.crossfire.jxclient.map.CfAnimations.mapSetSize
void mapSetSize(final int mapWidth, final int mapHeight)
Definition: CfAnimations.java:331
com.realtime.crossfire.jxclient.faces.FacesManager.getFace2
Face getFace2(int faceNum)
com.realtime.crossfire.jxclient.map.MapUpdaterState.getMapHeight
int getMapHeight()
Definition: MapUpdaterState.java:424
com.realtime.crossfire.jxclient.map.CfMap.setSmooth
void setSmooth(final int x, final int y, final int layer, final int smooth)
Definition: CfMap.java:189
com.realtime.crossfire.jxclient.map.MapUpdaterState.faceUpdated
void faceUpdated(@NotNull final Face face)
Definition: MapUpdaterState.java:366
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapWidth
int mapWidth
Definition: MapUpdaterState.java:78
com.realtime.crossfire.jxclient.map.CfMap.clearSquare
void clearSquare(final int x, final int y)
Definition: CfMap.java:386
com.realtime.crossfire.jxclient.faces.Face.getTileWidth
int getTileWidth()
Definition: Face.java:146
com.realtime.crossfire.jxclient.map.MapUpdaterState.cfAnimations
final CfAnimations cfAnimations
Definition: MapUpdaterState.java:73
com.realtime.crossfire.jxclient.util
Definition: Codec.java:23
com.realtime.crossfire.jxclient.server.crossfire
Definition: AbstractCrossfireServerConnection.java:23
com.realtime.crossfire.jxclient.faces.FacesManager
Definition: FacesManager.java:40
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapFace
void mapFace(@NotNull final Location location, final int faceNum)
Definition: MapUpdaterState.java:243
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapScrollListeners
final EventListenerList2< MapScrollListener > mapScrollListeners
Definition: MapUpdaterState.java:107
com.realtime.crossfire
com.realtime.crossfire.jxclient.map.CfAnimations.setMapListener
void setMapListener(@NotNull final CfAnimationsMapListener mapListener)
Definition: CfAnimations.java:260
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapAnimationSpeed
void mapAnimationSpeed(@NotNull final Location location, final int animationSpeed)
Definition: MapUpdaterState.java:289
com.realtime.crossfire.jxclient.map.MapUpdaterState.reset
void reset()
Definition: MapUpdaterState.java:220
com.realtime
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapListeners
final EventListenerList2< MapListener > mapListeners
Definition: MapUpdaterState.java:95
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapBegin
Object mapBegin()
Definition: MapUpdaterState.java:228
com
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapHeight
int mapHeight
Definition: MapUpdaterState.java:83
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapClear
void mapClear(final int x, final int y)
Definition: MapUpdaterState.java:233
com.realtime.crossfire.jxclient.animations.Animations
Definition: Animations.java:38
com.realtime.crossfire.jxclient.map.CfMap.processMapScroll
boolean processMapScroll(final int dx, final int dy, final int width, final int height)
Definition: CfMap.java:789
com.realtime.crossfire.jxclient.map.MapSizeListener
Definition: MapSizeListener.java:31
com.realtime.crossfire.jxclient.map.MapUpdaterState.map
final CfMap map
Definition: MapUpdaterState.java:89
com.realtime.crossfire.jxclient.animations.Animation
Definition: Animation.java:32
com.realtime.crossfire.jxclient.map.CfMap.getDirtyMapSquares
Set< CfMapSquare > getDirtyMapSquares()
Definition: CfMap.java:749
com.realtime.crossfire.jxclient.server.crossfire.CrossfireTickListener
Definition: CrossfireTickListener.java:31
com.realtime.crossfire.jxclient.map.MapUpdaterState.animations
final Animations animations
Definition: MapUpdaterState.java:67
com.realtime.crossfire.jxclient.map.CfAnimationsMapListener
Definition: CfAnimationsMapListener.java:5
com.realtime.crossfire.jxclient.map.MapUpdaterState.removeCrossfireNewmapListener
void removeCrossfireNewmapListener(@NotNull final NewmapListener listener)
Definition: MapUpdaterState.java:181
com.realtime.crossfire.jxclient.map.MapUpdaterState.facesManager
final FacesManager facesManager
Definition: MapUpdaterState.java:61
com.realtime.crossfire.jxclient.map.CfMap.setMagicMap
void setMagicMap(final int x0, final int y0, final byte @NotNull[] @NotNull[] data)
Definition: CfMap.java:223
com.realtime.crossfire.jxclient.map.MapUpdaterState.getMapWidth
int getMapWidth()
Definition: MapUpdaterState.java:414
com.realtime.crossfire.jxclient.map.CfAnimations.mapUpdateSpeed
void mapUpdateSpeed(@NotNull final Location location, final int speed)
Definition: CfAnimations.java:312
com.realtime.crossfire.jxclient.map.CfAnimations.mapAdd
void mapAdd(@NotNull final Location location, @NotNull final Animation animation, final int type)
Definition: CfAnimations.java:284
com.realtime.crossfire.jxclient.faces.Face
Definition: Face.java:37
com.realtime.crossfire.jxclient.map.CfMap.updateFace
void updateFace(final int faceNum, final int width, final int height)
Definition: CfMap.java:762
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapAnimation
void mapAnimation(@NotNull final Location location, final int animationNum, final int animationType)
Definition: MapUpdaterState.java:274
com.realtime.crossfire.jxclient.map.CfAnimations.tick
void tick(final int tickNo)
Definition: CfAnimations.java:341
com.realtime.crossfire.jxclient.map.MapUpdaterState.getMap
CfMap getMap()
Definition: MapUpdaterState.java:406
com.realtime.crossfire.jxclient.map.MapUpdaterState.mapSmooth
void mapSmooth(@NotNull final Location location, final int smooth)
Definition: MapUpdaterState.java:295