Role-playing character, controlled by players.
상속: Aura.Channel.World.Entities.PlayerCreature
예제 #1
0
		/// <summary>
		/// Called after an RP character was created, but before the player
		/// is warped into the dungeon.
		/// </summary>
		/// <remarks>
		/// Allows changes to the RP character, which are created based on
		/// actor data.
		/// </remarks>
		/// <param name="dungeon"></param>
		/// <param name="rpCharacter"></param>
		public virtual void OnRpCharacterCreated(Dungeon dungeon, RpCharacter rpCharacter)
		{
		}
예제 #2
0
		/// <summary>
		/// Creates a dungeon with the given parameters and warps the creature's
		/// party inside.
		/// </summary>
		/// <param name="dungeonName"></param>
		/// <param name="itemId"></param>
		/// <param name="leader"></param>
		/// <returns></returns>
		public bool CreateDungeonAndWarp(string dungeonName, int itemId, Creature leader)
		{
			lock (_createAndCleanUpLock)
			{
				try
				{
					var dungeon = this.CreateDungeon(dungeonName, itemId, leader);
					var regionId = dungeon.Regions.First().Id;

					// Warp the party currently standing on the altar into the dungeon.
					var party = leader.Party;
					var creators = party.GetCreaturesOnAltar(leader.RegionId);

					// Add creature to list in case something went wrong.
					// For example, there might be no altar, because the call
					// came from the dungeon command.
					if (creators.Count == 0)
						creators.Add(leader);

					// RP dungeon
					if (dungeon.HasRoles)
					{
						// Get roles
						var roles = dungeon.GetRoles();

						if (roles.Count < creators.Count)
						{
							Send.Notice(leader, Localization.Get("Your party has too few members for this role-playing dungeon."));
							return false;
						}

						// Create RP characters
						var rpCharacters = new List<RpCharacter>();
						for (int i = 0, j = 1; i < creators.Count; ++i)
						{
							var creator = creators[i];
							var pos = creator.GetPosition();

							// Get first role for leader or next available
							// one for members.
							var role = (creator == leader ? roles[0] : roles[j++]);

							// Get actor data
							var actorData = AuraData.ActorDb.Find(role);
							if (actorData == null)
							{
								Log.Error("DungeonManager.CreateDungeonAndWarp: Actor data not found for '{0}'.", role);
								return false;
							}

							try
							{
								var rpCharacter = new RpCharacter(actorData, creator, null);
								rpCharacter.SetLocation(regionId, pos.X, pos.Y);

								dungeon.RpCharacters.Add(rpCharacter.EntityId);
								dungeon.Script.OnRpCharacterCreated(dungeon, rpCharacter);

								rpCharacters.Add(rpCharacter);
							}
							catch
							{
								Log.Error("DungeonManager.CreateDungeonAndWarp: Failed to create RP character '{0}'.", role);
								throw;
							}
						}

						// Start RP sessions, which makes the players switch
						// to the RP characters inside the dungeon.
						foreach (var character in rpCharacters)
							character.Start();
					}
					// Normal dungeon
					else
					{
						// Warp in
						foreach (var creator in creators)
						{
							// Warp member to same position in the lobby region.
							var pos = creator.GetPosition();
							creator.Warp(regionId, pos);

							// TODO: This is a bit hacky, needs to be moved to Creature.Warp, with an appropriate check.
							Send.EntitiesDisappear(creator.Client, creators);
						}
					}

					return true;
				}
				catch (Exception ex)
				{
					Log.Exception(ex, "Failed to create and warp to dungeon.");
					return false;
				}
			}
		}