Gridarta Editor
AbstractGameObject.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2023 The Gridarta Developers.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 package net.sf.gridarta.model.gameobject;
21 
30 import org.jetbrains.annotations.NotNull;
31 import org.jetbrains.annotations.Nullable;
32 
38 public abstract class AbstractGameObject<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends AbstractBaseObject<G, A, R, G> implements GameObject<G, A, R> {
39 
43  private static final long serialVersionUID = 1L;
44 
50  @NotNull
51  private R archetype;
52 
64  @Nullable
66 
74  protected AbstractGameObject(@NotNull final R archetype, @NotNull final FaceObjectProviders faceObjectProviders, @NotNull final AnimationObjects animationObjects) {
76  this.archetype = archetype;
78  }
79 
80  @Override
81  @NotNull
82  public String getAttributeString(@NotNull final String attributeName, final boolean queryArchetype) {
83  final String result = getAttributeValue(attributeName);
84  if (result != null) {
85  return result;
86  }
87  return queryArchetype ? archetype.getAttributeString(attributeName) : "";
88  }
89 
90  @Nullable
91  @Override
92  protected String getEffectiveFaceName(@NotNull final String faceName) {
93  final String normalizedFaceName = faceName.isEmpty() ? null : faceName.intern();
94  //Strings are interned
95  //noinspection StringEquality
96  return normalizedFaceName != null && !normalizedFaceName.isEmpty() && normalizedFaceName != archetype.getFaceName() ? normalizedFaceName : null;
97  }
98 
99  @Override
100  public void notifyBeginChange() {
101  final MapSquare<G, A, R> mapSquare = getMapSquareOptional();
102  if (mapSquare != null) {
104  }
105  }
106 
107  @Override
108  public void notifyEndChange() {
109  final MapSquare<G, A, R> mapSquare = getMapSquareOptional();
110  if (mapSquare != null) {
111  mapSquare.getMapModel().endGameObjectChange(getThis());
112  }
113  }
114 
115  @Override
116  public void notifyTransientChange() {
117  final MapSquare<G, A, R> mapSquare = getMapSquareOptional();
118  if (mapSquare != null) {
120  }
121  }
122 
123  @NotNull
124  @Override
125  @SuppressWarnings("unchecked")
126  public G clone() {
128  clone.container = null;
129  return clone.getThis();
130  }
131 
132  @NotNull
133  @Override
134  public G asGameObject() {
135  return getThis();
136  }
137 
138  @NotNull
139  @Override
140  public G newInstance(@NotNull final GameObjectFactory<G, A, R> gameObjectFactory) {
141  return gameObjectFactory.cloneGameObject(getThis());
142  }
143 
144  @Override
145  public void visit(@NotNull final BaseObjectVisitor<G, A, R> baseObjectVisitor) {
146  baseObjectVisitor.visit(this);
147  }
148 
149  @Override
150  public void remove() {
151  final G head = getHead();
152  for (G tail = head.getMultiNext(); tail != null; tail = tail.getMultiNext()) {
153  final GameObjectContainer<G, A, R> tailContainer = tail.getContainer();
154  if (tailContainer == null) {
156  }
157  tailContainer.remove(tail);
158  }
159  final GameObjectContainer<G, A, R> headContainer = head.getContainer();
160  if (headContainer == null) {
162  }
163  headContainer.remove(head);
164  }
165 
166  @Nullable
167  @Override
169  return container;
170  }
171 
172  @Override
173  public boolean isTop() {
174  return container == null || container.isTop(getThis());
175  }
176 
177  @Override
178  public boolean isBottom() {
179  return container == null || container.isBottom(getThis());
180  }
181 
182  @Override
183  public void moveTop() {
184  if (container != null) {
186  }
187  }
188 
189  @Override
190  public void moveUp() {
191  if (container != null) {
193  }
194  }
195 
196  @Override
197  public void moveDown() {
198  if (container != null) {
200  }
201  }
202 
203  @Override
204  public void moveBottom() {
205  if (container != null) {
207  }
208  }
209 
210  @Override
211  public void insertBefore(@NotNull final G node) {
212  if (container == null) {
214  }
215  container.insertBefore(node, getThis());
216  }
217 
218  @Override
219  public void insertAfter(@NotNull final G node) {
220  if (container == null) {
222  }
223  container.insertAfter(getThis(), node);
224  }
225 
226  @Nullable
227  @Override
229  return container == null ? null : container.asGameObject();
230  }
231 
232  @NotNull
233  @Override
234  public G getTopContainer() {
235  if (container != null) {
236  final G gameObject = container.asGameObject();
237  if (gameObject != null) {
238  return gameObject.getTopContainer();
239  }
240  }
241 
242  return getThis();
243  }
244 
245  @Override
246  public void setContainer(@Nullable final GameObjectContainer<G, A, R> container, final int mapX, final int mapY) {
247  this.container = container;
248  setMapX(mapX);
249  setMapY(mapY);
250  }
251 
252  @Override
253  public boolean isInContainer() {
254  return container != null && container instanceof GameObject;
255  }
256 
257  @NotNull
258  @Override
260  if (container == null) {
261  throw new IllegalStateException("not inside a container");
262  }
263  return container.getMapSquare();
264  }
265 
266  @Nullable
267  @Override
269  return container == null ? null : container.getMapSquareOptional();
270  }
271 
272  @Nullable
273  @Override
274  public G getPrev() {
275  return container == null ? null : container.getPrev(getThis());
276  }
277 
278  @Nullable
279  @Override
280  public G getNext() {
281  return container == null ? null : container.getNext(getThis());
282  }
283 
284  @NotNull
285  @Override
286  public R getArchetype() {
287  return archetype;
288  }
289 
290  @Override
291  public void setArchetype(@NotNull final R archetype) {
292  if (this.archetype == archetype) {
293  return;
294  }
295 
297  try {
298  this.archetype = archetype;
299  updateArchetype();
300  } finally {
302  }
303  }
304 
305  @Override
306  public boolean hasUndefinedArchetype() {
307  return archetype.isUndefinedArchetype();
308  }
309 
310  @Override
311  public void markModified() {
314  }
315 
316 }
net.sf.gridarta.model.gameobject.AbstractGameObject.moveTop
void moveTop()
Definition: AbstractGameObject.java:183
net.sf.gridarta.model.baseobject.GameObjectContainer.isBottom
boolean isBottom(@NotNull final G gameObject)
Returns whether this game object is the bottom-most one.
Definition: GameObjectContainer.java:304
net.sf.gridarta.model.gameobject.GameObjectFactory< G, A, R >
net.sf.gridarta.model.gameobject.AbstractGameObject.getMapSquareOptional
MapSquare< G, A, R > getMapSquareOptional()
Definition: AbstractGameObject.java:268
net.sf.gridarta.model.baseobject.AbstractBaseObject.getHead
T getHead()
Definition: AbstractBaseObject.java:505
net.sf.gridarta.model.baseobject.GameObjectContainer.getNext
G getNext(@NotNull final G gameObject)
Returns the GameObject succeeding a given game object.
Definition: GameObjectContainer.java:220
net.sf.gridarta.model.gameobject.AbstractGameObject.AbstractGameObject
AbstractGameObject(@NotNull final R archetype, @NotNull final FaceObjectProviders faceObjectProviders, @NotNull final AnimationObjects animationObjects)
Creates a new instance.
Definition: AbstractGameObject.java:74
net.sf.gridarta.model.gameobject.AbstractGameObject.asGameObject
G asGameObject()
Definition: AbstractGameObject.java:134
net.sf.gridarta.model.gameobject.AbstractGameObject.visit
void visit(@NotNull final BaseObjectVisitor< G, A, R > baseObjectVisitor)
Definition: AbstractGameObject.java:145
net.sf.gridarta.model.baseobject.AbstractBaseObject.setMapX
void setMapX(final int mapX)
Definition: AbstractBaseObject.java:463
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.model.mapmodel.MapModel.transientGameObjectChange
void transientGameObjectChange(@NotNull G gameObject)
Method to notify the model that a game object was changed but need not be restored by undo/redo.
net.sf.gridarta.model.baseobject.GameObjectContainer.getMapSquareOptional
abstract MapSquare< G, A, R > getMapSquareOptional()
Returns the MapSquare this game object is part of.
net.sf.gridarta.model.gameobject.AbstractGameObject.moveDown
void moveDown()
Definition: AbstractGameObject.java:197
net.sf.gridarta.model.mapmodel.MapSquare
A single Map Square.
Definition: MapSquare.java:45
net.sf.gridarta.model.anim.AnimationObjects
AnimationObjects is a container for AnimationObjects.
Definition: AnimationObjects.java:30
net.sf.gridarta.model.baseobject.BaseObjectVisitor
Definition: BaseObjectVisitor.java:27
net.sf.gridarta.model.baseobject.AbstractBaseObject.beginGameObjectChange
void beginGameObjectChange()
Records that this game object is about to change.
Definition: AbstractBaseObject.java:720
net.sf.gridarta.model.gameobject.AbstractGameObject.getNext
G getNext()
Definition: AbstractGameObject.java:280
net.sf
net.sf.gridarta.model.gameobject.AbstractGameObject.notifyTransientChange
void notifyTransientChange()
Definition: AbstractGameObject.java:116
net.sf.gridarta.model.baseobject.AbstractBaseObject
Default implementation for GameObject implementing classes.
Definition: AbstractBaseObject.java:46
net.sf.gridarta.model.mapmodel
Definition: AboveFloorInsertionMode.java:20
net.sf.gridarta.model.baseobject.AbstractBaseObject.faceName
String faceName
The name of the face.
Definition: AbstractBaseObject.java:149
net.sf.gridarta.model.gameobject.AbstractGameObject.isTop
boolean isTop()
Definition: AbstractGameObject.java:173
net.sf.gridarta.model.baseobject.AbstractBaseObject.updateArchetype
void updateArchetype()
Called whenever getArchetype() has changed.
Definition: AbstractBaseObject.java:359
net.sf.gridarta.model.baseobject.AbstractBaseObject.mapX
int mapX
The map x position if on map.
Definition: AbstractBaseObject.java:117
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.face.FaceObjectProviders
Provider for faces of GameObjects and Archetypes.
Definition: FaceObjectProviders.java:46
net.sf.gridarta.model.gameobject.GameObject
Reflects a game object (object on a map).
Definition: GameObject.java:36
net.sf.gridarta.model.gameobject.AbstractGameObject.clone
G clone()
Definition: AbstractGameObject.java:126
net.sf.gridarta.model.gameobject.AbstractGameObject.isBottom
boolean isBottom()
Definition: AbstractGameObject.java:178
net.sf.gridarta.model.baseobject.GameObjectContainer.moveBottom
void moveBottom(@NotNull final G gameObject)
Moves a game object to bottom.
Definition: GameObjectContainer.java:389
net.sf.gridarta.model.baseobject.GameObjectContainer.getPrev
G getPrev(@NotNull final G gameObject)
Returns the GameObject preceding a given game object.
Definition: GameObjectContainer.java:203
net.sf.gridarta.model.gameobject.AbstractGameObject.getTopContainer
G getTopContainer()
Definition: AbstractGameObject.java:234
net.sf.gridarta.model.mapmodel.MapModel.beginGameObjectChange
void beginGameObjectChange(@NotNull G gameObject)
Method to notify the model that a game object is about to change.
net.sf.gridarta.model.gameobject.AbstractGameObject.archetype
R archetype
The Archetype of this game object.
Definition: AbstractGameObject.java:51
net.sf.gridarta.model.baseobject.AbstractBaseObject.setMapY
void setMapY(final int mapY)
Definition: AbstractBaseObject.java:468
net.sf.gridarta.model.gameobject.AbstractGameObject.setArchetype
void setArchetype(@NotNull final R archetype)
Definition: AbstractGameObject.java:291
net
net.sf.gridarta.model.gameobject.AbstractGameObject.moveBottom
void moveBottom()
Definition: AbstractGameObject.java:204
net.sf.gridarta.model.baseobject.AbstractBaseObject.mapY
int mapY
The map y position if on map.
Definition: AbstractBaseObject.java:123
net.sf.gridarta.model.gameobject.AbstractGameObject.notifyEndChange
void notifyEndChange()
@noinspection AbstractMethodOverridesAbstractMethod // needed because of public modifier
Definition: AbstractGameObject.java:108
net.sf.gridarta.model.baseobject.GameObjectContainer.insertBefore
void insertBefore(@NotNull final G gameObject, @Nullable final G nextGameObject)
Adds a game object before another.
Definition: GameObjectContainer.java:507
net.sf.gridarta.model.baseobject.GameObjectContainer.remove
void remove(@NotNull final G gameObject)
Removes a game object from this container.
Definition: GameObjectContainer.java:250
net.sf.gridarta.model.gameobject.AbstractGameObject.getAttributeString
String getAttributeString(@NotNull final String attributeName, final boolean queryArchetype)
Definition: AbstractGameObject.java:82
net.sf.gridarta.model.gameobject.AbstractGameObject.getPrev
G getPrev()
Definition: AbstractGameObject.java:274
net.sf.gridarta.model.baseobject.GameObjectContainer.asGameObject
abstract G asGameObject()
Returns this instance as a GameObject or.
net.sf.gridarta.model.gameobject.AbstractGameObject.newInstance
G newInstance(@NotNull final GameObjectFactory< G, A, R > gameObjectFactory)
Definition: AbstractGameObject.java:140
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.model.baseobject.AbstractBaseObject.getAttributeValue
String getAttributeValue(@NotNull final String attributeName)
Returns an attribute value by attribute name.
Definition: AbstractBaseObject.java:273
net.sf.gridarta.model.gameobject.AbstractGameObject.hasUndefinedArchetype
boolean hasUndefinedArchetype()
Definition: AbstractGameObject.java:306
net.sf.gridarta.model.gameobject.AbstractGameObject.insertBefore
void insertBefore(@NotNull final G node)
Definition: AbstractGameObject.java:211
net.sf.gridarta.model.gameobject.AbstractGameObject.getArchetype
R getArchetype()
Definition: AbstractGameObject.java:286
net.sf.gridarta.model.mapmodel.MapSquare.getMapModel
MapModel< G, A, R > getMapModel()
Returns the MapModel this map square is part of.
Definition: MapSquare.java:99
net.sf.gridarta.model.baseobject.AbstractBaseObject.getThis
abstract T getThis()
Returns.
net.sf.gridarta.model.baseobject.GameObjectContainer.moveTop
void moveTop(@NotNull final G gameObject)
Moves a game object to top.
Definition: GameObjectContainer.java:314
net.sf.gridarta.model.gameobject.AbstractGameObject.getMapSquare
MapSquare< G, A, R > getMapSquare()
Definition: AbstractGameObject.java:259
net.sf.gridarta.model.baseobject.GameObjectContainer.insertAfter
void insertAfter(@Nullable final G previousGameObject, @NotNull final G gameObject)
Adds a game object after another.
Definition: GameObjectContainer.java:461
net.sf.gridarta.model.gameobject.AbstractGameObject.setContainer
void setContainer(@Nullable final GameObjectContainer< G, A, R > container, final int mapX, final int mapY)
Definition: AbstractGameObject.java:246
net.sf.gridarta.model.gameobject.AbstractGameObject.serialVersionUID
static final long serialVersionUID
The serial version UID.
Definition: AbstractGameObject.java:43
net.sf.gridarta.model.gameobject.NotInsideContainerException
This exception is thrown in case a method of a GameObject without a container or the wrong container ...
Definition: NotInsideContainerException.java:34
net.sf.gridarta.model.mapmodel.MapModel.endGameObjectChange
void endGameObjectChange(@NotNull G gameObject)
Method to notify the model that a game object was changed.
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.model.gameobject.AbstractGameObject.getEffectiveFaceName
String getEffectiveFaceName(@NotNull final String faceName)
Returns the effective face name for faceName for a given real face name.
Definition: AbstractGameObject.java:92
net.sf.gridarta.model.baseobject
Definition: AbstractBaseObject.java:20
net.sf.gridarta.model.gameobject.AbstractGameObject.isInContainer
boolean isInContainer()
Definition: AbstractGameObject.java:253
net.sf.gridarta.model.face
The face is the appearance of an object.
Definition: AbstractFaceObjects.java:20
net.sf.gridarta.model.anim
Gridarta can handle frame information of animations and allow the selection of an animation using a t...
Definition: AbstractAnimationObjects.java:20
net.sf.gridarta.model.gameobject.AbstractGameObject.markModified
void markModified()
Definition: AbstractGameObject.java:311
net.sf.gridarta.model.gameobject.AbstractGameObject.getContainer
GameObjectContainer< G, A, R > getContainer()
Definition: AbstractGameObject.java:168
net.sf.gridarta.model.gameobject.AbstractGameObject.container
GameObjectContainer< G, A, R > container
Container of this GameObject.
Definition: AbstractGameObject.java:65
net.sf.gridarta.model.gameobject.AbstractGameObject.insertAfter
void insertAfter(@NotNull final G node)
Definition: AbstractGameObject.java:219
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.model.baseobject.AbstractBaseObject.animationObjects
final AnimationObjects animationObjects
The AnimationObjects for looking up animations.
Definition: AbstractBaseObject.java:57
net.sf.gridarta.model.baseobject.AbstractBaseObject.endGameObjectChange
void endGameObjectChange()
Records that this game object has changed.
Definition: AbstractBaseObject.java:733
net.sf.gridarta.model.baseobject.GameObjectContainer.moveUp
void moveUp(@NotNull final G gameObject)
Moves a game object up.
Definition: GameObjectContainer.java:339
net.sf.gridarta.model.baseobject.GameObjectContainer
Base class for classes that contain GameObjects as children in the sense of containment.
Definition: GameObjectContainer.java:50
net.sf.gridarta.model.gameobject.AbstractGameObject.notifyBeginChange
void notifyBeginChange()
@noinspection AbstractMethodOverridesAbstractMethod // needed because of public modifier
Definition: AbstractGameObject.java:100
net.sf.gridarta.model.gameobject.AbstractGameObject.moveUp
void moveUp()
Definition: AbstractGameObject.java:190
net.sf.gridarta.model.baseobject.GameObjectContainer.moveDown
void moveDown(@NotNull final G gameObject)
Moves a game object down.
Definition: GameObjectContainer.java:364
net.sf.gridarta.model.gameobject.AbstractGameObject
Abstract base class of GameObject implementations.
Definition: AbstractGameObject.java:38
net.sf.gridarta.model.baseobject.GameObjectContainer.isTop
boolean isTop(@NotNull final G gameObject)
Returns whether this game object is the top-most one.
Definition: GameObjectContainer.java:293
net.sf.gridarta.model.baseobject.GameObjectContainer.getMapSquare
abstract MapSquare< G, A, R > getMapSquare()
Returns the MapSquare this game object is part of.
net.sf.gridarta.model.gameobject.AbstractGameObject.getContainerGameObject
G getContainerGameObject()
Definition: AbstractGameObject.java:228
net.sf.gridarta.model.baseobject.AbstractBaseObject.faceObjectProviders
final transient FaceObjectProviders faceObjectProviders
The FaceObjectProviders for looking up faces.
Definition: AbstractBaseObject.java:93