1 /* $Id$ */
2 /***************************************************************************
3  *                   (C) Copyright 2003-2010 - Stendhal                    *
4  ***************************************************************************
5  ***************************************************************************
6  *                                                                         *
7  *   This program is free software; you can redistribute it and/or modify  *
8  *   it under the terms of the GNU General Public License as published by  *
9  *   the Free Software Foundation; either version 2 of the License, or     *
10  *   (at your option) any later version.                                   *
11  *                                                                         *
12  ***************************************************************************/
13 package games.stendhal.server.core.engine;
14 
15 import games.stendhal.common.constants.Events;
16 import games.stendhal.server.entity.ActiveEntity;
17 import games.stendhal.server.entity.Blood;
18 import games.stendhal.server.entity.DressedEntity;
19 import games.stendhal.server.entity.Entity;
20 import games.stendhal.server.entity.RPEntity;
21 import games.stendhal.server.entity.creature.BabyDragon;
22 import games.stendhal.server.entity.creature.Cat;
23 import games.stendhal.server.entity.creature.Creature;
24 import games.stendhal.server.entity.creature.Pet;
25 import games.stendhal.server.entity.creature.PurpleDragon;
26 import games.stendhal.server.entity.creature.Sheep;
27 import games.stendhal.server.entity.item.Corpse;
28 import games.stendhal.server.entity.item.Item;
29 import games.stendhal.server.entity.item.ItemInformation;
30 import games.stendhal.server.entity.mapstuff.ExpirationTracker;
31 import games.stendhal.server.entity.mapstuff.Fire;
32 import games.stendhal.server.entity.mapstuff.WeatherEntity;
33 import games.stendhal.server.entity.mapstuff.area.AreaEntity;
34 import games.stendhal.server.entity.mapstuff.area.FlyOverArea;
35 import games.stendhal.server.entity.mapstuff.area.WalkBlocker;
36 import games.stendhal.server.entity.mapstuff.area.Wall;
37 import games.stendhal.server.entity.mapstuff.block.Block;
38 import games.stendhal.server.entity.mapstuff.block.BlockTarget;
39 import games.stendhal.server.entity.mapstuff.chest.Chest;
40 import games.stendhal.server.entity.mapstuff.game.GameBoard;
41 import games.stendhal.server.entity.mapstuff.office.ArrestWarrant;
42 import games.stendhal.server.entity.mapstuff.office.RentedSign;
43 import games.stendhal.server.entity.mapstuff.portal.Door;
44 import games.stendhal.server.entity.mapstuff.portal.Gate;
45 import games.stendhal.server.entity.mapstuff.portal.HousePortal;
46 import games.stendhal.server.entity.mapstuff.portal.Portal;
47 import games.stendhal.server.entity.mapstuff.sign.Sign;
48 import games.stendhal.server.entity.mapstuff.sound.LoopedSoundSource;
49 import games.stendhal.server.entity.mapstuff.spawner.GrowingPassiveEntityRespawnPoint;
50 import games.stendhal.server.entity.mapstuff.spawner.PassiveEntityRespawnPoint;
51 import games.stendhal.server.entity.mapstuff.spawner.SheepFood;
52 import games.stendhal.server.entity.mapstuff.useable.FishSource;
53 import games.stendhal.server.entity.mapstuff.useable.GoldSource;
54 import games.stendhal.server.entity.mapstuff.useable.UseableEntity;
55 import games.stendhal.server.entity.mapstuff.useable.WaterSpringSource;
56 import games.stendhal.server.entity.mapstuff.useable.WellSource;
57 import games.stendhal.server.entity.npc.NPC;
58 import games.stendhal.server.entity.npc.TrainingDummy;
59 import games.stendhal.server.entity.player.Player;
60 import games.stendhal.server.entity.spell.Spell;
61 import games.stendhal.server.entity.trade.Earning;
62 import games.stendhal.server.entity.trade.Market;
63 import games.stendhal.server.entity.trade.Offer;
64 import games.stendhal.server.events.AttackEvent;
65 import games.stendhal.server.events.BestiaryEvent;
66 import games.stendhal.server.events.BuddyLoginEvent;
67 import games.stendhal.server.events.BuddyLogoutEvent;
68 import games.stendhal.server.events.ExamineEvent;
69 import games.stendhal.server.events.GlobalVisualEffectEvent;
70 import games.stendhal.server.events.GroupChangeEvent;
71 import games.stendhal.server.events.GroupInviteEvent;
72 import games.stendhal.server.events.HealedEvent;
73 import games.stendhal.server.events.ImageEffectEvent;
74 import games.stendhal.server.events.PlayerLoggedOnEvent;
75 import games.stendhal.server.events.PlayerLoggedOutEvent;
76 import games.stendhal.server.events.PrivateTextEvent;
77 import games.stendhal.server.events.ProgressStatusEvent;
78 import games.stendhal.server.events.ReachedAchievementEvent;
79 import games.stendhal.server.events.ShowItemListEvent;
80 import games.stendhal.server.events.ShowOutfitListEvent;
81 import games.stendhal.server.events.SoundEvent;
82 import games.stendhal.server.events.TextEvent;
83 import games.stendhal.server.events.TradeStateChangeEvent;
84 import games.stendhal.server.events.TransitionGraphEvent;
85 import games.stendhal.server.events.ViewChangeEvent;
86 import marauroa.common.game.Definition.DefinitionClass;
87 import marauroa.common.game.Definition.Type;
88 import marauroa.common.game.RPClass;
89 
90 /**
91  * defines all RPClass
92  */
93 public class RPClassGenerator {
94 	private static boolean inited = false;
95 	private RPClass action;
96 
97 	/**
98 	 * creates the RPClass definitions, unless this was already done.
99 	 */
createRPClassesWithoutBaking()100 	public void createRPClassesWithoutBaking() {
101 		if (inited) {
102 			return;
103 		}
104 		inited = true;
105 
106 		if (!RPClass.hasRPClass("entity")) {
107 			Entity.generateRPClass();
108 		}
109 
110 		// Entity sub-classes
111 		if (!RPClass.hasRPClass("active_entity")) {
112 			ActiveEntity.generateRPClass();
113 		}
114 		if (!RPClass.hasRPClass("area")) {
115 			AreaEntity.generateRPClass();
116 		}
117 		if (!RPClass.hasRPClass("blood")) {
118 			Blood.generateRPClass();
119 		}
120 		if (!RPClass.hasRPClass("chest")) {
121 			Chest.generateRPClass();
122 		}
123 		if (!RPClass.hasRPClass("corpse")) {
124 			Corpse.generateRPClass();
125 		}
126 		if (!RPClass.hasRPClass("door")) {
127 			Door.generateRPClass();
128 		}
129 		if (!RPClass.hasRPClass("expiration_tracker")) {
130 			ExpirationTracker.generateRPClass();
131 		}
132 		if (!RPClass.hasRPClass("fire")) {
133 			Fire.generateRPClass();
134 		}
135 		if (!RPClass.hasRPClass("block")) {
136 			Block.generateRPClass();
137 		}
138 		if (!RPClass.hasRPClass("blocktarget")) {
139 			BlockTarget.generateRPClass();
140 		}
141 		if (!RPClass.hasRPClass("fish_source")) {
142 			FishSource.generateRPClass();
143 		}
144 		if (!RPClass.hasRPClass("game_board")) {
145 			GameBoard.generateRPClass();
146 		}
147 		if (!RPClass.hasRPClass("gate")) {
148 			Gate.generateGateRPClass();
149 		}
150 		if (!RPClass.hasRPClass("gold_source")) {
151 			GoldSource.generateRPClass();
152 		}
153 		if (!RPClass.hasRPClass("water_source")) {
154 			WaterSpringSource.generateRPClass();
155 		}
156 		if (!RPClass.hasRPClass("well_source")) {
157 			WellSource.generateRPClass();
158 		}
159 		if (!RPClass.hasRPClass("weather_entity")) {
160 			WeatherEntity.generateRPClass();
161 		}
162 		if (!RPClass.hasRPClass("item")) {
163 			Item.generateRPClass();
164 		}
165 		if (!RPClass.hasRPClass("item_information")) {
166 			ItemInformation.generateRPClass();
167 		}
168 		if (!RPClass.hasRPClass("plant_grower")) {
169 			PassiveEntityRespawnPoint.generateRPClass();
170 		}
171 		if (!RPClass.hasRPClass("portal")) {
172 			Portal.generateRPClass();
173 		}
174 		if (!RPClass.hasRPClass("sign")) {
175 			Sign.generateRPClass();
176 		}
177 		if (!RPClass.hasRPClass("spell")) {
178 			Spell.generateRPClass();
179 		}
180 		if (!RPClass.hasRPClass("walkblocker")) {
181 			WalkBlocker.generateRPClass();
182 		}
183 		if (!RPClass.hasRPClass("flyover")) {
184 			FlyOverArea.generateRPClass();
185 		}
186 		if (!RPClass.hasRPClass("house_portal")) {
187 			HousePortal.generateRPClass();
188 		}
189 		if (!RPClass.hasRPClass("useable_entity")) {
190 			UseableEntity.generateRPClass();
191 		}
192 		if (!RPClass.hasRPClass("wall")) {
193 			Wall.generateRPClass();
194 		}
195 		// ActiveEntity sub-classes
196 		if (!RPClass.hasRPClass("rpentity")) {
197 			RPEntity.generateRPClass();
198 		}
199 
200 		// RPEntity sub-classes
201 		if (!RPClass.hasRPClass("dressed_entity")) {
202 			DressedEntity.generateRPClass();
203 		}
204 
205 		// DressedEntity sub-classes
206 		if (!RPClass.hasRPClass("npc")) {
207 			NPC.generateRPClass();
208 		}
209 		if (!RPClass.hasRPClass("player")) {
210 			Player.generateRPClass();
211 		}
212 
213 		// NPC sub-classes
214 		if (!RPClass.hasRPClass("creature")) {
215 			Creature.generateRPClass();
216 		}
217 		if (!RPClass.hasRPClass(TrainingDummy.RPCLASS_NAME)) {
218 			TrainingDummy.generateRPClass();
219 		}
220 
221 		// Creature sub-classes
222 		if (!RPClass.hasRPClass("sheep")) {
223 			Sheep.generateRPClass();
224 		}
225 		if (!RPClass.hasRPClass("pet")) {
226 			Pet.generateRPClass();
227 		}
228 		if (!RPClass.hasRPClass("cat")) {
229 			Cat.generateRPClass();
230 		}
231 		if (!RPClass.hasRPClass("baby_dragon")) {
232 			BabyDragon.generateRPClass();
233 		}
234 		if (!RPClass.hasRPClass("purple_dragon")) {
235 			PurpleDragon.generateRPClass();
236 		}
237 
238 		// PassiveEntityRespawnPoint sub-class
239 		if (!RPClass.hasRPClass("ambient_sound_source")) {
240 			LoopedSoundSource.generateRPClass();
241 		}
242 		if (!RPClass.hasRPClass("growing_entity_spawner")) {
243 			GrowingPassiveEntityRespawnPoint.generateRPClass();
244 		}
245 		if (!RPClass.hasRPClass("food")) {
246 			SheepFood.generateRPClass();
247 		}
248 
249 		// zone storage
250 		if (!RPClass.hasRPClass("arrest_warrant")) {
251 			ArrestWarrant.generateRPClass();
252 		}
253 		if (!RPClass.hasRPClass("rented_sign")) {
254 			RentedSign.generateRPClass();
255 		}
256 		if (!RPClass.hasRPClass(Market.MARKET_RPCLASS_NAME)) {
257 			Market.generateRPClass();
258 		}
259 		if (!RPClass.hasRPClass(Offer.OFFER_RPCLASS_NAME)) {
260 			Offer.generateRPClass();
261 		}
262 		if (!RPClass.hasRPClass(Earning.EARNING_RPCLASS_NAME)) {
263 			Earning.generateRPClass();
264 		}
265 
266 		// rpevents
267 		if (!RPClass.hasRPClass(Events.ATTACK)) {
268 			AttackEvent.generateRPClass();
269 		}
270 		if (!RPClass.hasRPClass("buddy_login")) {
271 			BuddyLoginEvent.generateRPClass();
272 		}
273 		if (!RPClass.hasRPClass("buddy_logout")) {
274 			BuddyLogoutEvent.generateRPClass();
275 		}
276 		if (!RPClass.hasRPClass("examine")) {
277 			ExamineEvent.generateRPClass();
278 		}
279 		if (!RPClass.hasRPClass("healed")) {
280 			HealedEvent.generateRPClass();
281 		}
282 		if (!RPClass.hasRPClass(Events.IMAGE)) {
283 			ImageEffectEvent.generateRPClass();
284 		}
285 		if (!RPClass.hasRPClass(Events.PRIVATE_TEXT)) {
286 			PrivateTextEvent.generateRPClass();
287 		}
288 		if (!RPClass.hasRPClass(Events.PROGRESS_STATUS_CHANGE)) {
289 			ProgressStatusEvent.generateRPClass();
290 		}
291 		if (!RPClass.hasRPClass("show_item_list")) {
292 			ShowItemListEvent.generateRPClass();
293 		}
294 		if (!RPClass.hasRPClass(Events.SOUND)) {
295 			SoundEvent.generateRPClass();
296 		}
297 		if (!RPClass.hasRPClass(Events.PUBLIC_TEXT)) {
298 			TextEvent.generateRPClass();
299 		}
300 		if (!RPClass.hasRPClass(Events.GROUP_CHANGE)) {
301 			GroupChangeEvent.generateRPClass();
302 		}
303 		if (!RPClass.hasRPClass(Events.GROUP_INVITE)) {
304 			GroupInviteEvent.generateRPClass();
305 		}
306 		if (!RPClass.hasRPClass("transition_graph")) {
307 			TransitionGraphEvent.generateRPClass();
308 		}
309 		if (!RPClass.hasRPClass(Events.TRADE_STATE_CHANGE)) {
310 			TradeStateChangeEvent.generateRPClass();
311 		}
312 
313 		if (!RPClass.hasRPClass(Events.PLAYER_LOGGED_ON)) {
314 			PlayerLoggedOnEvent.generateRPClass();
315 		}
316 
317 		if (!RPClass.hasRPClass(Events.PLAYER_LOGGED_OUT)) {
318 			PlayerLoggedOutEvent.generateRPClass();
319 		}
320 
321 		if (!RPClass.hasRPClass(Events.REACHED_ACHIEVEMENT)) {
322 			ReachedAchievementEvent.generateRPClass();
323 		}
324 
325 		if (!RPClass.hasRPClass(Events.VIEW_CHANGE)) {
326 			ViewChangeEvent.generateRPClass();
327 		}
328 
329 		if (!RPClass.hasRPClass(Events.GLOBAL_VISUAL)) {
330 			GlobalVisualEffectEvent.generateRPClass();
331 		}
332 
333 		if (!RPClass.hasRPClass(Events.BESTIARY)) {
334 			BestiaryEvent.generateRPClass();
335 		}
336 
337 		if (!RPClass.hasRPClass(Events.OUTFIT_LIST)) {
338 			ShowOutfitListEvent.generateRPClass();
339 		}
340 
341 		if (!RPClass.hasRPClass("action")) {
342 			createActionRPClass();
343 			createChatActionRPClass();
344 			createCidActionRPClass();
345 			createMoveToActionRPClass();
346 			createTellActionRPClass();
347 		}
348 	}
349 
350 	/**
351 	 * creates the RPClass definitions, unless this was already done.
352 	 */
createRPClasses()353 	public void createRPClasses() {
354 		if (inited) {
355 			return;
356 		}
357 		createRPClassesWithoutBaking();
358 		RPClass.bakeAll();
359 	}
360 
createActionRPClass()361 	private void createActionRPClass() {
362 		action = new RPClass("action");
363 		action.add(DefinitionClass.ATTRIBUTE, "zone", Type.STRING);
364 	}
365 
createChatActionRPClass()366 	private void createChatActionRPClass() {
367 		RPClass clazz = new RPClass("chat");
368 		clazz.isA(action);
369 		clazz.add(DefinitionClass.ATTRIBUTE, "type", Type.STRING);
370 		clazz.add(DefinitionClass.ATTRIBUTE, "text", Type.LONG_STRING);
371 	}
372 
createCidActionRPClass()373 	private void createCidActionRPClass() {
374 		RPClass clazz = new RPClass("cstatus");
375 		clazz.isA(action);
376 		clazz.addAttribute("cid", Type.STRING);
377 		clazz.addAttribute("version", Type.STRING);
378 		clazz.addAttribute("build", Type.STRING);
379 		clazz.addAttribute("dist", Type.STRING);
380 	}
381 
createMoveToActionRPClass()382 	private void createMoveToActionRPClass() {
383 		RPClass clazz = new RPClass("moveto");
384 		clazz.isA(action);
385 		clazz.addAttribute("double_click", Type.FLAG);
386 		clazz.addAttribute("extend", Type.INT);
387 		clazz.addAttribute("x", Type.INT);
388 		clazz.addAttribute("y", Type.INT);
389 	}
390 
createTellActionRPClass()391 	private void createTellActionRPClass() {
392 		RPClass clazz = new RPClass("tell");
393 		clazz.isA(action);
394 		clazz.add(DefinitionClass.ATTRIBUTE, "type", Type.STRING);
395 		clazz.add(DefinitionClass.ATTRIBUTE, "text", Type.LONG_STRING);
396 		clazz.add(DefinitionClass.ATTRIBUTE, "target", Type.LONG_STRING);
397 	}
398 }
399