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