示例#1
0
 /// <summary>
 /// Binds character to current location
 /// </summary>
 /// <param name="ch"></param>
 public static void BindCharacter(DOLCharacters ch)
 {
     ch.BindRegion = ch.Region;
     ch.BindHeading = ch.Direction;
     ch.BindXpos = ch.Xpos;
     ch.BindYpos = ch.Ypos;
     ch.BindZpos = ch.Zpos;
 }
		/// <summary>
		/// Verify whether created character is valid
		/// </summary>
		/// <param name="ch">The character to check</param>
		/// <returns>True if valid</returns>
		public static bool IsCharacterValid(DOLCharacters ch)
		{
			bool valid = true;
			try
			{
				if ((eRealm)ch.Realm < eRealm._FirstPlayerRealm || (eRealm)ch.Realm > eRealm._LastPlayerRealm)
				{
					if (log.IsWarnEnabled)
						log.WarnFormat("Wrong realm: {0} on character creation from Account: {1}", ch.Realm, ch.AccountName);
					valid = false;
				}
				if (ch.Level != 1)
				{
					if (log.IsWarnEnabled)
						log.WarnFormat("Wrong level: {0} on character creation from Account: {1}", ch.Level, ch.AccountName);
					valid = false;
				}
				if (!GlobalConstants.STARTING_CLASSES_DICT.ContainsKey((eRealm)ch.Realm) || !GlobalConstants.STARTING_CLASSES_DICT[(eRealm)ch.Realm].Contains((eCharacterClass)ch.Class))
				{
					if (log.IsWarnEnabled)
						log.WarnFormat("Wrong class: {0}, realm:{1} on character creation from Account: {2}", ch.Class, ch.Realm, ch.AccountName);
					valid = false;
				}
				if (!GlobalConstants.RACES_CLASSES_DICT.ContainsKey((eRace)ch.Race) || !GlobalConstants.RACES_CLASSES_DICT[(eRace)ch.Race].Contains((eCharacterClass)ch.Class))
				{
					if (log.IsWarnEnabled)
						log.WarnFormat("Wrong race: {0}, class:{1} on character creation from Account: {2}", ch.Race, ch.Class, ch.AccountName);
					valid = false;
				}
				int pointsUsed;
				var stats = new Dictionary<eStat, int>{{eStat.STR, ch.Strength},{eStat.CON, ch.Constitution},{eStat.DEX, ch.Dexterity},{eStat.QUI, ch.Quickness},
					{eStat.INT, ch.Intelligence},{eStat.PIE, ch.Piety},{eStat.EMP, ch.Empathy},{eStat.CHR, ch.Charisma},};
				
				valid &= IsCustomPointsDistributionValid(ch, stats, out pointsUsed);
				
				if (pointsUsed != MAX_STARTING_BONUS_POINTS)
				{
					if (log.IsWarnEnabled)
						log.WarnFormat("Points used: {0} on character creation from Account: {1}", pointsUsed, ch.AccountName);
					valid = false;
				}
				
				eGender gender = ch.Gender == 0 ? eGender.Male : eGender.Female;
				
				if (GlobalConstants.RACE_GENDER_CONSTRAINTS_DICT.ContainsKey((eRace)ch.Race) && GlobalConstants.RACE_GENDER_CONSTRAINTS_DICT[(eRace)ch.Race] != gender)
				{
					if (log.IsWarnEnabled)
						log.WarnFormat("Wrong Race gender: {0}, race: {1} on character creation from Account: {2}", ch.Gender, ch.Race, ch.AccountName);
					valid = false;
				}
				
				if (GlobalConstants.CLASS_GENDER_CONSTRAINTS_DICT.ContainsKey((eCharacterClass)ch.Class) && GlobalConstants.CLASS_GENDER_CONSTRAINTS_DICT[(eCharacterClass)ch.Class] != gender)
				{
					if (log.IsWarnEnabled)
						log.WarnFormat("Wrong class gender: {0}, class:{1} on character creation from Account: {2}", ch.Gender, ch.Class, ch.AccountName);
					valid = false;
				}
			}
			catch (Exception e)
			{
				if (log.IsErrorEnabled)
					log.ErrorFormat("CharacterCreation error on account {0}, slot {1}. Exception:{2}", ch.AccountName, ch.AccountSlot, e);

				valid = false;
			}

			return valid;
		}
		/// <summary>
		/// Check if Custom Creation Points Distribution is Valid.
		/// </summary>
		/// <param name="character"></param>
		/// <param name="stats"></param>
		/// <param name="points"></param>
		/// <returns></returns>
		public static bool IsCustomPointsDistributionValid(DOLCharacters character, IDictionary<eStat, int> stats, out int points)
		{
			ICharacterClass charClass = ScriptMgr.FindCharacterClass(character.Class);

			if (charClass != null)
			{
				points = 0;							
				
				// check if each stat is valid.
				foreach(var stat in stats.Keys)
				{
					int raceAmount = GlobalConstants.STARTING_STATS_DICT[(eRace)character.Race][stat];
					
					int classAmount = 0;
					
					for (int level = character.Level; level > 5; level--)
					{
						if (charClass.PrimaryStat != eStat.UNDEFINED && charClass.PrimaryStat == stat)
							classAmount++;
						if (charClass.SecondaryStat != eStat.UNDEFINED && charClass.SecondaryStat == stat && (level - 6) % 2 == 0)
							classAmount++;
						if (charClass.TertiaryStat != eStat.UNDEFINED && charClass.TertiaryStat == stat && (level - 6) % 3 == 0)
							classAmount++;
					}
					
					int above = stats[stat] - raceAmount - classAmount;
					
					// Miss Some points...
					if (above < 0)
						return false;
					
					points += above;
					points += Math.Max(0, above - 10); //two points used
					points += Math.Max(0, above - 15); //three points used
				}
				
				return points == MAX_STARTING_BONUS_POINTS;
			}
			
			points = -1;
			return false;
		}
		/// <summary>
		/// Check if a Character Needs update based to packet data
		/// </summary>
		/// <param name="pdata">packet data</param>
		/// <param name="client">client</param>
		/// <param name="character">db character</param>
		/// <returns>True if character need refreshment false if no refresh needed.</returns>
		private bool CheckCharacterForUpdates(CreationCharacterData pdata, GameClient client, DOLCharacters character)
		{
			int newModel = character.CurrentModel;

			if (pdata.CustomMode == 1 || pdata.CustomMode == 2 || pdata.CustomMode == 3)
			{
				bool flagChangedStats = false;
				
				if (Properties.ALLOW_CUSTOMIZE_FACE_AFTER_CREATION)
				{
					character.EyeSize = (byte)pdata.EyeSize;
					character.LipSize = (byte)pdata.LipSize;
					character.EyeColor = (byte)pdata.EyeColor;
					character.HairColor = (byte)pdata.HairColor;
					character.FaceType = (byte)pdata.FaceType;
					character.HairStyle = (byte)pdata.HairStyle;
					character.MoodType = (byte)pdata.MoodType;
				}
				
				if (pdata.CustomMode != 3 && client.Version >= GameClient.eClientVersion.Version189)
				{
					var stats = new Dictionary<eStat, int>();
					stats[eStat.STR] = pdata.Strength; // Strength
					stats[eStat.DEX] = pdata.Dexterity; // Dexterity
					stats[eStat.CON] = pdata.NewConstitution; // New Constitution
					stats[eStat.QUI] = pdata.Quickness; // Quickness
					stats[eStat.INT] = pdata.Intelligence; // Intelligence
					stats[eStat.PIE] = pdata.Piety; // Piety
					stats[eStat.EMP] = pdata.Empathy; // Empathy
					stats[eStat.CHR] = pdata.Charisma; // Charisma

					// check for changed stats.
					flagChangedStats |= stats[eStat.STR] != character.Strength;
					flagChangedStats |= stats[eStat.CON] != character.Constitution;
					flagChangedStats |= stats[eStat.DEX] != character.Dexterity;
					flagChangedStats |= stats[eStat.QUI] != character.Quickness;
					flagChangedStats |= stats[eStat.INT] != character.Intelligence;
					flagChangedStats |= stats[eStat.PIE] != character.Piety;
					flagChangedStats |= stats[eStat.EMP] != character.Empathy;
					flagChangedStats |= stats[eStat.CHR] != character.Charisma;

					if (flagChangedStats)
					{
						ICharacterClass charClass = ScriptMgr.FindCharacterClass(character.Class);

						if (charClass != null)
						{
							int points;							
							bool valid = IsCustomPointsDistributionValid(character, stats, out points);

							// Hacking attemp ?
							if (points > MAX_STARTING_BONUS_POINTS)
							{
								if ((ePrivLevel)client.Account.PrivLevel == ePrivLevel.Player)
								{
									if (ServerProperties.Properties.BAN_HACKERS)
										client.BanAccount(string.Format("Autoban Hack char update : Wrong allowed points:{0}", points));

									client.Disconnect();
									return false;
								}
							}
							
							// Error in setting points
							if (!valid)
							{
							    return true;
							}
							
							if (Properties.ALLOW_CUSTOMIZE_STATS_AFTER_CREATION)
							{
								// Set Stats, valid is ok.
								character.Strength = stats[eStat.STR];
								character.Constitution = stats[eStat.CON];
								character.Dexterity = stats[eStat.DEX];
								character.Quickness = stats[eStat.QUI];
								character.Intelligence = stats[eStat.INT];
								character.Piety = stats[eStat.PIE];
								character.Empathy = stats[eStat.EMP];
								character.Charisma = stats[eStat.CHR];
	
								if (log.IsInfoEnabled)
									log.InfoFormat("Character {0} Stats updated in cache!", character.Name);
	
								if (client.Player != null)
								{
									foreach(var stat in stats.Keys)
										client.Player.ChangeBaseStat(stat, (short)(stats[stat] - client.Player.GetBaseStat(stat)));
									
									if (log.IsInfoEnabled)
										log.InfoFormat("Character {0} Player Stats updated in cache!", character.Name);
								}
							}
						}
						else if (log.IsErrorEnabled)
							log.ErrorFormat("No CharacterClass with ID {0} found", character.Class);
					}
				}


				if (pdata.CustomMode == 2) // change player customization
				{
					if (client.Account.PrivLevel == 1 && ((pdata.CreationModel >> 11) & 3) == 0)
					{
						if (ServerProperties.Properties.BAN_HACKERS) // Player size must be > 0 (from 1 to 3)
						{
							client.BanAccount(string.Format("Autoban Hack char update : zero character size in model:{0}", newModel));
							client.Disconnect();
							return false;
						}
						return true;
					}
					
					character.CustomisationStep = 2; // disable config button

					if (Properties.ALLOW_CUSTOMIZE_FACE_AFTER_CREATION)
					{
						if (pdata.CreationModel != character.CreationModel)
							character.CurrentModel = newModel;
	
						if (log.IsInfoEnabled)
							log.InfoFormat("Character {0} face properties configured by account {1}!", character.Name, client.Account.Name);
					}
				}
				else if (pdata.CustomMode == 3) //auto config -- seems someone thinks this is not possible?
				{
					character.CustomisationStep = 3; // enable config button to player
				}
				
				//Save the character in the database
				GameServer.Database.SaveObject(character);
			}
			
			return false;
		}
		private bool CreateCharacter(CreationCharacterData pdata, GameClient client, int accountSlot)
		{
			Account account = client.Account;
			var ch = new DOLCharacters();
			ch.AccountName = account.Name;
			ch.Name = pdata.CharName;
			
			if (pdata.CustomMode == 0x01)
			{
				ch.EyeSize = (byte)pdata.EyeSize;
				ch.LipSize = (byte)pdata.LipSize;
				ch.EyeColor = (byte)pdata.EyeColor;
				ch.HairColor = (byte)pdata.HairColor;
				ch.FaceType = (byte)pdata.FaceType;
				ch.HairStyle = (byte)pdata.HairStyle;
				ch.MoodType = (byte)pdata.MoodType;
				ch.CustomisationStep = 2; // disable config button
				
				if (log.IsDebugEnabled)
					log.Debug("Disable Config Button");
			}
			
			ch.Level = 1;
			// Set Realm and Class
			ch.Realm = pdata.Realm;
			ch.Class = pdata.Class;
			
			// Set Account Slot, Gender
			ch.AccountSlot = accountSlot + ch.Realm * 100;
			ch.Gender = pdata.Gender;

			// Set Race
			ch.Race = pdata.Race;
			
			ch.CreationModel = pdata.CreationModel;
			ch.CurrentModel = ch.CreationModel;
			ch.Region = pdata.Region;

			ch.Strength = pdata.Strength;
			ch.Dexterity = pdata.Dexterity;
			ch.Constitution = pdata.Constitution;
			ch.Quickness = pdata.Quickness;
			ch.Intelligence = pdata.Intelligence;
			ch.Piety = pdata.Piety;
			ch.Empathy = pdata.Empathy;
			ch.Charisma = pdata.Charisma;
			
			// defaults
			ch.CreationDate = DateTime.Now;

			ch.Endurance = 100;
			ch.MaxEndurance = 100;
			ch.Concentration = 100;
			ch.MaxSpeed = GamePlayer.PLAYER_BASE_SPEED;
			
			if (log.IsDebugEnabled)
				log.DebugFormat("Creation {0} character, class:{1}, realm:{2}", client.Version, ch.Class, ch.Realm);
			
			// Is class disabled ?
			int occurences = 0;
			List<string> disabled_classes = Properties.DISABLED_CLASSES.SplitCSV(true);
			occurences = (from j in disabled_classes
			              where j == ch.Class.ToString()
			              select j).Count();

			if (occurences > 0 && (ePrivLevel)client.Account.PrivLevel == ePrivLevel.Player)
			{
				if (log.IsDebugEnabled)
					log.DebugFormat("Client {0} tried to create a disabled classe: {1}", client.Account.Name, (eCharacterClass)ch.Class);
				
			    return true;
			}
			
			// check if race disabled
			List<string> disabled_races = Properties.DISABLED_RACES.SplitCSV(true);
			occurences = (from j in disabled_races
			              where j == ch.Race.ToString()
			              select j).Count();
			
			if (occurences > 0 && (ePrivLevel)client.Account.PrivLevel == ePrivLevel.Player)
			{
				if (log.IsDebugEnabled)
					log.DebugFormat("Client {0} tried to create a disabled race: {1}", client.Account.Name, (eRace)ch.Race);

				return true;
			}

			
			// If sending invalid Class ID
			if (!Enum.IsDefined(typeof(eCharacterClass), (eCharacterClass)ch.Class))
			{
				if (log.IsErrorEnabled)
					log.ErrorFormat("{0} tried to create a character with wrong class ID: {1}, realm:{2}", client.Account.Name, ch.Class, ch.Realm);
				
				if (ServerProperties.Properties.BAN_HACKERS)
				{
					client.BanAccount(string.Format("Autoban character create class: id:{0} realm:{1} name:{2} account:{3}", ch.Class, ch.Realm, ch.Name, account.Name));
					client.Disconnect();
					return false;
				}
			    return true;
			}

			// check if client tried to create invalid char
			if (!IsCharacterValid(ch))
			{
				if (log.IsWarnEnabled)
				{
					log.WarnFormat("{0} tried to create invalid character:\nchar name={1}, gender={2}, race={3}, realm={4}, class={5}, region={6}" +
					               "\nstr={7}, con={8}, dex={9}, qui={10}, int={11}, pie={12}, emp={13}, chr={14}", ch.AccountName, ch.Name, ch.Gender,
					              ch.Race, ch.Realm, ch.Class, ch.Region, ch.Strength, ch.Constitution, ch.Dexterity, ch.Quickness, ch.Intelligence, ch.Piety, ch.Empathy, ch.Charisma);
				}
			    return true;
			}

			//Save the character in the database
			GameServer.Database.AddObject(ch);
			
			// Fire the character creation event
			// This is Where Most Creation Script should take over to update any data they would like !
			GameEventMgr.Notify(DatabaseEvent.CharacterCreated, null, new CharacterEventArgs(ch, client));
			
			//write changes
			GameServer.Database.SaveObject(ch);

			// Log creation
			AuditMgr.AddAuditEntry(client, AuditType.Account, AuditSubtype.CharacterCreate, "", pdata.CharName);

			client.Account.Characters = null;

			if (log.IsInfoEnabled)
				log.InfoFormat("Character {0} created on Account {1}!", pdata.CharName, account);

			// Reload Account Relations
			GameServer.Database.FillObjectRelations(client.Account);

		    return true;
		}
示例#6
0
		/// <summary>
        /// Constructs a new event argument class for the
        /// character events 
		/// </summary>
		/// <param name="character"></param>
		/// <param name="client"></param>
		public CharacterEventArgs(DOLCharacters character, GameClient client)
		{
			m_character = character;
			m_client = client;
		}
示例#7
0
 /// <summary>
 /// Kicks an active playing character from the server
 /// </summary>
 /// <param name="cha">the character</param>
 private void KickCharacter(DOLCharacters cha)
 {
     GameClient playingclient = WorldMgr.GetClientByPlayerName(cha.Name, true, false);
     if (playingclient != null)
     {
         playingclient.Out.SendPlayerQuit(true);
         playingclient.Disconnect();
     }
 }
示例#8
0
 public static IList<StartupLocation> GetAllStartupLocationForCharacter(DOLCharacters ch, GameClient.eClientVersion cli)
 {
     return m_cachedLocations.Where(sl => sl.MinVersion <= (int)cli)
         .Where(sl => sl.ClassID == 0 || sl.ClassID == ch.Class)
         .Where(sl => sl.RaceID == 0 || sl.RaceID == ch.Race)
         .Where(sl => sl.RealmID == 0 || sl.RealmID == ch.Realm)
         .Where(sl => sl.ClientRegionID == 0 || sl.ClientRegionID == ch.Region)
         .OrderByDescending(sl => sl.MinVersion).ThenByDescending(sl => sl.ClientRegionID)
         .ThenByDescending(sl => sl.RealmID).ThenByDescending(sl => sl.ClassID)
         .ThenByDescending(sl => sl.RaceID).ToList();
 }
			/// <summary>
			/// Verify whether created character is valid
			/// </summary>
			/// <param name="ch">The character to check</param>
			/// <returns>True if valid</returns>
			public static bool IsCharacterValid(DOLCharacters ch)
			{
				bool valid = true;
				try
				{
					if (ch.Realm > 3)
					{
						if (log.IsWarnEnabled)
							log.Warn("Wrong realm: " + ch.Realm);
						valid = false;
					}
					if (ch.Level != 1)
					{
						if (log.IsWarnEnabled)
							log.Warn("Wrong level: " + ch.Level);
						valid = false;
					}
					if (Array.IndexOf(STARTING_CLASSES[ch.Realm], ch.Class) == -1)
					{
						if (log.IsWarnEnabled)
							log.Warn("Wrong class: " + ch.Class + ", realm:" + ch.Realm);
						valid = false;
					}
					if (Array.IndexOf(RACES_CLASSES[ch.Race], ch.Class) == -1)
					{
						if (log.IsWarnEnabled)
							log.Warn("Wrong race: " + ch.Race + ", class:" + ch.Class);
						valid = false;
					}
					int pointsUsed = 0;
					pointsUsed += PointsUsed(ch.Race, STR, ch.Strength);
					pointsUsed += PointsUsed(ch.Race, CON, ch.Constitution);
					pointsUsed += PointsUsed(ch.Race, DEX, ch.Dexterity);
					pointsUsed += PointsUsed(ch.Race, QUI, ch.Quickness);
					pointsUsed += PointsUsed(ch.Race, INT, ch.Intelligence);
					pointsUsed += PointsUsed(ch.Race, PIE, ch.Piety);
					pointsUsed += PointsUsed(ch.Race, EMP, ch.Empathy);
					pointsUsed += PointsUsed(ch.Race, CHA, ch.Charisma);
					if (pointsUsed != 30)
					{
						if (log.IsWarnEnabled)
						{
							log.Warn("Points used: " + pointsUsed);
						}

						valid = false;
					}

					if (ch.Gender > 0 && (ch.Race == (byte)eRace.AlbionMinotaur || ch.Race == (byte)eRace.MidgardMinotaur || ch.Race == (byte)eRace.HiberniaMinotaur))
					{
						log.Warn("Wrong minotaur gender: " + ch.Gender + ", race: " + ch.Race);
						valid = false;
					}

					if (ch.Gender == 0 && (ch.Class == (int)eCharacterClass.Bainshee || ch.Class == (int)eCharacterClass.Valkyrie))
					{
						log.Warn("Wrong class gender: " + ch.Gender + ", class:" + ch.Class);
						valid = false;
					}

				}
				catch (Exception e)
				{
					if (log.IsErrorEnabled)
					{
						log.Error(string.Format("CharacterCreation error on account {0}, slot {1}.", ch.AccountName, ch.AccountSlot), e);
					}

					valid = false;
				}

				return valid;
			}
		private int CheckCharacterForUpdates(GameClient client, GSPacketIn packet, DOLCharacters character, string charName, byte customizationMode)
		{
			int newModel = character.CurrentModel;

			if (customizationMode == 1 || customizationMode == 2 || customizationMode == 3)
			{
				bool flagChangedStats = false;
				character.EyeSize = (byte)packet.ReadByte();
				character.LipSize = (byte)packet.ReadByte();
				character.EyeColor = (byte)packet.ReadByte();
				character.HairColor = (byte)packet.ReadByte();
				character.FaceType = (byte)packet.ReadByte();
				character.HairStyle = (byte)packet.ReadByte();
				packet.Skip(3);
				character.MoodType = (byte)packet.ReadByte();
				packet.Skip(89); // Skip location string, race string, classe string, level ,class ,realm and startRaceGender
				newModel = packet.ReadShortLowEndian(); //read new model

				if (customizationMode != 3 && client.Version >= GameClient.eClientVersion.Version189)
				{
					packet.Skip(6); // Region ID + character Internal ID
					int[] stats = new int[8];
					stats[0] = (byte)packet.ReadByte(); // Strength
					stats[2] = (byte)packet.ReadByte(); // Dexterity
					stats[1] = (byte)packet.ReadByte(); // Constitution
					stats[3] = (byte)packet.ReadByte(); // Quickness
					stats[4] = (byte)packet.ReadByte(); // Intelligence
					stats[5] = (byte)packet.ReadByte(); // Piety
					stats[6] = (byte)packet.ReadByte(); // Empathy
					stats[7] = (byte)packet.ReadByte(); // Charisma

					packet.Skip(43);// armor models/armor color/weapon models/active weapon slots/siZone
					if (client.Version >= GameClient.eClientVersion.Version199)
					{
						// skip 4 bytes added in 1.99
						packet.Skip(4);
					}

					// what is this?
					byte newConstitution = (byte)packet.ReadByte();
					if (newConstitution > 0 && newConstitution < 255) // added 255 check, still not sure why this is here - tolakram
						stats[1] = newConstitution;


					flagChangedStats |= stats[0] != character.Strength;
					flagChangedStats |= stats[1] != character.Constitution;
					flagChangedStats |= stats[2] != character.Dexterity;
					flagChangedStats |= stats[3] != character.Quickness;
					flagChangedStats |= stats[4] != character.Intelligence;
					flagChangedStats |= stats[5] != character.Piety;
					flagChangedStats |= stats[6] != character.Empathy;
					flagChangedStats |= stats[7] != character.Charisma;

					//
					// !! Stat changes disabled by Tolakram until someone figures out why this can create invalid stats !!
					//
					flagChangedStats = false;

					if (flagChangedStats)
					{
						ICharacterClass charClass = ScriptMgr.FindCharacterClass(character.Class);

						if (charClass != null)
						{
							int points = 0;
							int[] leveledStats = new int[8];
							int[] raceStats = new int[8];
							bool valid = true;
							for (int j = 0; j < 8; j++)
							{
								eStat stat = (eStat)ValidateCharacter.eStatIndex[j];
								raceStats[j] = ValidateCharacter.STARTING_STATS[character.Race][j];
								for (int level = character.Level; level > 5; level--)
								{
									if (charClass.PrimaryStat != eStat.UNDEFINED && charClass.PrimaryStat == stat)
									{
										leveledStats[j]++;
									}
									if (charClass.SecondaryStat != eStat.UNDEFINED && charClass.SecondaryStat == stat)
									{
										if ((level - 6) % 2 == 0)
											leveledStats[j]++;
									}
									if (charClass.TertiaryStat != eStat.UNDEFINED && charClass.TertiaryStat == stat)
									{
										if ((level - 6) % 3 == 0)
											leveledStats[j]++;
									}
								}

								int result = stats[j] - leveledStats[j] - raceStats[j];

								bool validBeginStat = result >= 0;
								int pointsUsed = result;
								string statCategory = "";

								if (charClass.PrimaryStat != eStat.UNDEFINED && charClass.PrimaryStat == stat)
									statCategory = "1)";
								if (charClass.SecondaryStat != eStat.UNDEFINED && charClass.SecondaryStat == stat)
									statCategory = "2)";
								if (charClass.TertiaryStat != eStat.UNDEFINED && charClass.TertiaryStat == stat)
									statCategory = "3)";

								pointsUsed += Math.Max(0, result - 10); //two points used
								pointsUsed += Math.Max(0, result - 15); //three points used

								log.Info(string.Format("{0,-2} {1,-3}:{2, 3} {3,3} {4,3} {5,3} {6,2} {7} {8}",
								                       statCategory,
								                       (stat == eStat.STR) ? "STR" : stat.ToString(),
								                       stats[j],
								                       leveledStats[j],
								                       stats[j] - leveledStats[j],
								                       raceStats[j],
								                       result,
								                       pointsUsed,
								                       (validBeginStat) ? "" : "Not Valid"));

								points += pointsUsed;

								if (!validBeginStat)
								{
									valid = false;
									if (client.Account.PrivLevel == 1)
									{
										if (ServerProperties.Properties.BAN_HACKERS)
										{
											DBBannedAccount b = new DBBannedAccount();
											b.Author = "SERVER";
											b.Ip = client.TcpEndpointAddress;
											b.Account = client.Account.Name;
											b.DateBan = DateTime.Now;
											b.Type = "B";
											b.Reason = String.Format("Autoban Hack char update : Wrong {0} point:{1}", (stat == eStat.STR) ? "STR" : stat.ToString(), result);
											GameServer.Database.AddObject(b);
											GameServer.Database.SaveObject(b);
											GameServer.Instance.LogCheatAction(b.Reason + ". Account: " + b.Account);
										}

										client.Disconnect();
										return 1;
									}
								}
							}

							if (valid)
							{
								character.Strength = (byte)stats[0];
								character.Constitution = (byte)stats[1];
								character.Dexterity = (byte)stats[2];
								character.Quickness = (byte)stats[3];
								character.Intelligence = (byte)stats[4];
								character.Piety = (byte)stats[5];
								character.Empathy = (byte)stats[6];
								character.Charisma = (byte)stats[7];

								DOLCharacters[] chars = client.Account.Characters;

								for (int z = 0; z < chars.Length; z++)
								{
									if (chars[z].Name != character.Name) continue;

									//Log.Error(string.Format("found activePlayer:[{0}] {1} {2}", client.ActiveCharIndex, client.Player.Name, character.Name));

									if (log.IsInfoEnabled)
										log.Info(String.Format("Character {0} updated in cache!\n", charName));

									if (client.Player != null)
									{
										client.Player.DBCharacter.Strength = (byte)stats[0];
										client.Player.DBCharacter.Constitution = (byte)stats[1];
										client.Player.DBCharacter.Dexterity = (byte)stats[2];
										client.Player.DBCharacter.Quickness = (byte)stats[3];
										client.Player.DBCharacter.Intelligence = (byte)stats[4];
										client.Player.DBCharacter.Piety = (byte)stats[5];
										client.Player.DBCharacter.Empathy = (byte)stats[6];
										client.Player.DBCharacter.Charisma = (byte)stats[7];
									}

									client.Account.Characters[z].Strength = (byte)stats[0];
									client.Account.Characters[z].Constitution = (byte)stats[1];
									client.Account.Characters[z].Dexterity = (byte)stats[2];
									client.Account.Characters[z].Quickness = (byte)stats[3];
									client.Account.Characters[z].Intelligence = (byte)stats[4];
									client.Account.Characters[z].Piety = (byte)stats[5];
									client.Account.Characters[z].Empathy = (byte)stats[6];
									client.Account.Characters[z].Charisma = (byte)stats[7];
								}
							}
						}
						else
						{
							if (log.IsErrorEnabled)
								log.Error("No CharacterClass with ID " + character.Class + " found");
						}
					}
				}
				else
				{
					packet.Skip(58); // skip all other things
					if (client.Version >= GameClient.eClientVersion.Version199)
					{
						// skip 4 bytes added in 1.99
						packet.Skip(4);
					}
				}

				if (customizationMode == 2) // change player customization
				{
					if (client.Account.PrivLevel == 1 && ((newModel >> 11) & 3) == 0) // Player size must be > 0 (from 1 to 3)
					{
						DBBannedAccount b = new DBBannedAccount();
						b.Author = "SERVER";
						b.Ip = client.TcpEndpointAddress;
						b.Account = client.Account.Name;
						b.DateBan = DateTime.Now;
						b.Type = "B";
						b.Reason = String.Format("Autoban Hack char update : zero character size in model:{0}", newModel);
						GameServer.Database.AddObject(b);
						GameServer.Database.SaveObject(b);
						GameServer.Instance.LogCheatAction(b.Reason + ". Account: " + b.Account);
						client.Disconnect();
						return 1;
					}

					if ((ushort)newModel != character.CreationModel)
					{
						character.CurrentModel = newModel;
					}

					character.CustomisationStep = 2; // disable config button

					GameServer.Database.SaveObject(character);

					if (log.IsInfoEnabled)
						log.Info(String.Format("Character {0} face proprieties configured by account {1}!\n", charName, client.Account.Name));
				}
				else if (customizationMode == 3) //auto config -- seems someone thinks this is not possible?
				{
					character.CustomisationStep = 3; // enable config button to player

					GameServer.Database.SaveObject(character);

					//if (log.IsInfoEnabled)
					//	log.Info(String.Format("Character {0} face proprieties auto updated!\n", charName));
				}
				else if (customizationMode == 1 && flagChangedStats) //changed stat only for 1.89+
				{
					GameServer.Database.SaveObject(character);

					if (log.IsInfoEnabled)
						log.Info(String.Format("Character {0} stat updated!\n", charName));
				}
			}

			return 1;
		}
		private void CreateCharacter(GameClient client, GSPacketIn packet, string charName, int accountSlot)
		{
			Account account = client.Account;
			DOLCharacters ch = new DOLCharacters();
			ch.AccountName = account.Name;
			ch.Name = charName;

			if (packet.ReadByte() == 0x01)
			{
				ch.EyeSize = (byte)packet.ReadByte();
				ch.LipSize = (byte)packet.ReadByte();
				ch.EyeColor = (byte)packet.ReadByte();
				ch.HairColor = (byte)packet.ReadByte();
				ch.FaceType = (byte)packet.ReadByte();
				ch.HairStyle = (byte)packet.ReadByte();
				packet.Skip(3);
				ch.MoodType = (byte)packet.ReadByte();
				ch.CustomisationStep = 2; // disable config button
				packet.Skip(13);
				log.Debug("Disable Config Button");
			}
			else
			{
				packet.Skip(23);
			}

			packet.Skip(24); //Location String
			ch.LastName = "";
			ch.GuildID = "";
			packet.Skip(24); //Skip class name
			packet.Skip(24); //Skip race name
			ch.Level = packet.ReadByte(); //not safe!
			ch.Level = 1;
			ch.Class = packet.ReadByte();
			if (ServerProperties.Properties.START_AS_BASE_CLASS)
			{
				ch.Class = RevertClass(ch);
			}
			ch.Realm = packet.ReadByte();

			if (log.IsDebugEnabled)
				log.Debug("Creation " + client.Version + " character, class:" + ch.Class + ", realm:" + ch.Realm);

			// Is class disabled ?
			int occurences = 0;
			List<string> disabled_classes = Properties.DISABLED_CLASSES.SplitCSV(true);
			occurences = (from j in disabled_classes
			              where j == ch.Class.ToString()
			              select j).Count();

			if (occurences > 0 && (ePrivLevel)client.Account.PrivLevel == ePrivLevel.Player)
			{
				log.Debug("Client " + client.Account.Name + " tried to create a disabled classe: " + (eCharacterClass)ch.Class);
				client.Out.SendCharacterOverview((eRealm)ch.Realm);
			    return;
			}

			if (client.Version >= GameClient.eClientVersion.Version193)
			{
				ValidateCharacter.init_post193_tables();
			}
			else
			{
				ValidateCharacter.init_pre193_tables();
			}

			if (!Enum.IsDefined(typeof(eCharacterClass), (eCharacterClass)ch.Class))
			{
				log.Error(client.Account.Name + " tried to create a character with wrong class ID: " + ch.Class + ", realm:" + ch.Realm);
				if (ServerProperties.Properties.BAN_HACKERS)
				{
					DBBannedAccount b = new DBBannedAccount();
					b.Author = "SERVER";
					b.Ip = client.TcpEndpointAddress;
					b.Account = client.Account.Name;
					b.DateBan = DateTime.Now;
					b.Type = "B";
					b.Reason = string.Format("Autoban character create class: id:{0} realm:{1} name:{2} account:{3}", ch.Class, ch.Realm, ch.Name, account.Name);
					GameServer.Database.AddObject(b);
					GameServer.Database.SaveObject(b);
					GameServer.Instance.LogCheatAction(b.Reason + ". Account: " + b.Account);
					client.Disconnect();
				}
			    return;
			}

			ch.AccountSlot = accountSlot + ch.Realm * 100;

			//The following byte contains
			//1bit=start location ... in ShroudedIsles you can choose ...
			//1bit=first race bit
			//1bit=unknown
			//1bit=gender (0=male, 1=female)
			//4bit=race
			byte startRaceGender = (byte)packet.ReadByte();

			ch.Race = (startRaceGender & 0x0F) + ((startRaceGender & 0x40) >> 2);

			List<string> disabled_races = new List<string>(Properties.DISABLED_RACES.SplitCSV(true));
			occurences = (from j in disabled_races
			              where j == ch.Race.ToString()
			              select j).Count();
			if (occurences > 0 && (ePrivLevel)client.Account.PrivLevel == ePrivLevel.Player)
			{
				log.Debug("Client " + client.Account.Name + " tried to create a disabled race: " + (eRace)ch.Race);
				client.Out.SendCharacterOverview((eRealm)ch.Realm);
			    return;
			}

			ch.Gender = ((startRaceGender >> 4) & 0x01);

			bool siStartLocation = ((startRaceGender >> 7) != 0);

			ch.CreationModel = packet.ReadShortLowEndian();
			ch.CurrentModel = ch.CreationModel;
			ch.Region = packet.ReadByte();
			packet.Skip(1); //TODO second byte of region unused currently
			packet.Skip(4); //TODO Unknown Int / last used?

			ch.Strength = (byte)packet.ReadByte();
			ch.Dexterity = (byte)packet.ReadByte();
			ch.Constitution = (byte)packet.ReadByte();
			ch.Quickness = (byte)packet.ReadByte();
			ch.Intelligence = (byte)packet.ReadByte();
			ch.Piety = (byte)packet.ReadByte();
			ch.Empathy = (byte)packet.ReadByte();
			ch.Charisma = (byte)packet.ReadByte();

			packet.Skip(44); //TODO equipment

			if (client.Version >= GameClient.eClientVersion.Version199)
			{
				// skip 4 bytes added in 1.99
				packet.Skip(4);
			}

			// log.DebugFormat("STR {0}, CON {1}, DEX {2}, QUI {3}, INT {4}, PIE {5}, EMP {6}, CHA {7}", ch.Strength, ch.Constitution, ch.Dexterity, ch.Quickness, ch.Intelligence, ch.Piety, ch.Empathy, ch.Charisma);

			// check if client tried to create invalid char
			if (!ValidateCharacter.IsCharacterValid(ch))
			{
				if (log.IsWarnEnabled)
				{
					log.Warn(ch.AccountName + " tried to create invalid character:" +
							 "\nchar name=" + ch.Name + ", gender=" + ch.Gender + ", race=" + ch.Race + ", realm=" + ch.Realm + ", class=" + ch.Class + ", region=" + ch.Region +
							 "\nstr=" + ch.Strength + ", con=" + ch.Constitution + ", dex=" + ch.Dexterity + ", qui=" + ch.Quickness + ", int=" + ch.Intelligence + ", pie=" + ch.Piety + ", emp=" + ch.Empathy + ", chr=" + ch.Charisma);
				}

				// This is not live like but unfortunately we are missing code / packet support to stay on character create screen if something is invalid
				client.Out.SendCharacterOverview((eRealm)ch.Realm);
			    return;
			}

			ch.CreationDate = DateTime.Now;

			ch.Endurance = 100;
			ch.MaxEndurance = 100;
			ch.Concentration = 100;
			ch.MaxSpeed = GamePlayer.PLAYER_BASE_SPEED;

			#region Starting Locations

			//if the server property for disable tutorial is set, we load in the classic starting locations
			if (ch.Region == 27 && ServerProperties.Properties.DISABLE_TUTORIAL)
			{
				switch (ch.Realm)
				{
						case 1: ch.Region = 1; break;
						case 2: ch.Region = 100; break;
						case 3: ch.Region = 200; break;
				}
			}

			ch.Xpos = 505603;
			ch.Ypos = 494709;
			ch.Zpos = 2463;
			ch.Direction = 5947;

			if (ch.Region == 51 && ch.Realm == 1)//Albion ShroudedIsles start point (I hope)
			{
				ch.Xpos = 526252;
				ch.Ypos = 542415;
				ch.Zpos = 3165;
				ch.Direction = 5286;
			}
			if (ch.Region != 51 && ch.Realm == 1)//Albion start point (Church outside Camelot/humberton)
			{
				ch.Xpos = 505603;
				ch.Ypos = 494709;
				ch.Zpos = 2463;
				ch.Direction = 5947;
				//ch.Region = 1;
				//DOLConsole.WriteLine(String.Format("Character ClassName:"+ch.ClassName+" created!"));
				//DOLConsole.WriteLine(String.Format("Character RaceName:"+ch.RaceName+" created!"));
			}
			if (ch.Region == 151 && ch.Realm == 2)//Midgard ShroudedIsles start point
			{
				ch.Xpos = 293720;
				ch.Ypos = 356408;
				ch.Zpos = 3488;
				ch.Direction = 6670;
			}
			if (ch.Region != 151 && ch.Realm == 2)//Midgard start point (Fort Atla)
			{
				ch.Xpos = 749103;
				ch.Ypos = 815835;
				ch.Zpos = 4408;
				ch.Direction = 7915;
				//ch.Region = 100;
				//DOLConsole.WriteLine(String.Format("Character ClassName:"+ch.ClassName+" created!"));
				//DOLConsole.WriteLine(String.Format("Character RaceName:"+ch.RaceName+" created!"));
			}
			if (ch.Region == 181 && ch.Realm == 3)//Hibernia ShroudedIsles start point
			{
				ch.Xpos = 426483;
				ch.Ypos = 440626;
				ch.Zpos = 5952;
				ch.Direction = 2403;
			}
			if (ch.Region != 181 && ch.Realm == 3)//Hibernia start point (Mag Mel)
			{
				ch.Xpos = 345900;
				ch.Ypos = 490867;
				ch.Zpos = 5200;
				ch.Direction = 4826;
				//ch.Region = 200;
				//DOLConsole.WriteLine(String.Format("Character ClassName:"+ch.ClassName+" created!"));
				//DOLConsole.WriteLine(String.Format("Character RaceName:"+ch.RaceName+" created!"));
			}

			// chars are bound on creation
			ch.BindRegion = ch.Region;
			ch.BindHeading = ch.Direction;
			ch.BindXpos = ch.Xpos;
			ch.BindYpos = ch.Ypos;
			ch.BindZpos = ch.Zpos;

			#endregion Starting Locations

			#region starting guilds

			if (account.PrivLevel == 1 && Properties.STARTING_GUILD)
			{
				switch (ch.Realm)
				{
					case 1:
						switch (ServerProperties.Properties.SERV_LANGUAGE)
						{
							case "EN":
								ch.GuildID = GuildMgr.GuildNameToGuildID("Clan Cotswold");
								break;
							case "DE":
								ch.GuildID = GuildMgr.GuildNameToGuildID("Klan Cotswold");
								break;
							default:
								ch.GuildID = GuildMgr.GuildNameToGuildID("Clan Cotswold");
								break;
						}
						break;
					case 2:
						switch (ServerProperties.Properties.SERV_LANGUAGE)
						{
							case "EN":
								ch.GuildID = GuildMgr.GuildNameToGuildID("Mularn Protectors");
								break;
							case "DE":
								ch.GuildID = GuildMgr.GuildNameToGuildID("Beschützer von Mularn");
								break;
							default:
								ch.GuildID = GuildMgr.GuildNameToGuildID("Mularn Protectors");
								break;
						}
						break;
					case 3:
						switch (ServerProperties.Properties.SERV_LANGUAGE)
						{
							case "EN":
								ch.GuildID = GuildMgr.GuildNameToGuildID("Tir na Nog Adventurers");
								break;
							case "DE":
								ch.GuildID = GuildMgr.GuildNameToGuildID("Tir na Nog-Abenteurer");
								break;
							default:
								ch.GuildID = GuildMgr.GuildNameToGuildID("Tir na Nog Adventurers");
								break;
						}
						break;
						default: break;
				}

				if (ch.GuildID != "")
					ch.GuildRank = 8;
			}

			#endregion Starting Guilds

			if (Properties.STARTING_BPS > 0)
				ch.BountyPoints = Properties.STARTING_BPS;
			
			if (Properties.STARTING_MONEY > 0)
			{
				long value = Properties.STARTING_MONEY;
				ch.Copper = Money.GetCopper(value);
				ch.Silver = Money.GetSilver(value);
				ch.Gold = Money.GetGold(value);
				ch.Platinum = Money.GetPlatinum(value);
			}

			if (Properties.STARTING_REALM_LEVEL > 0)
			{
				int realmLevel = Properties.STARTING_REALM_LEVEL;
				long rpamount = 0;
				if (realmLevel < GamePlayer.REALMPOINTS_FOR_LEVEL.Length)
					rpamount = GamePlayer.REALMPOINTS_FOR_LEVEL[realmLevel];

				// thanks to Linulo from http://daoc.foren.4players.de/viewtopic.php?t=40839&postdays=0&postorder=asc&start=0
				if (rpamount == 0)
					rpamount = (long)(25.0 / 3.0 * (realmLevel * realmLevel * realmLevel) - 25.0 / 2.0 * (realmLevel * realmLevel) + 25.0 / 6.0 * realmLevel);

				ch.RealmPoints = rpamount;
				ch.RealmLevel = realmLevel;
				ch.RealmSpecialtyPoints = realmLevel;
			}

			ch.RespecAmountRealmSkill += 2;

			SetBasicCraftingForNewCharacter(ch);

			//Save the character in the database
			GameServer.Database.AddObject(ch);
			//Fire the character creation event
			GameEventMgr.Notify(DatabaseEvent.CharacterCreated, null, new CharacterEventArgs(ch, client));
			//add equipment
			StartupEquipment.AddEquipment(ch);
			//write changes
			GameServer.Database.SaveObject(ch);

			// Log creation
			AuditMgr.AddAuditEntry(client, AuditType.Account, AuditSubtype.CharacterCreate, "", charName);

			client.Account.Characters = null;

			if (log.IsInfoEnabled)
				log.Info(String.Format("Character {0} created!", charName));

			GameServer.Database.FillObjectRelations(client.Account);
			client.Out.SendCharacterOverview((eRealm)ch.Realm);

		    return;
		}
		private void SetBasicCraftingForNewCharacter(DOLCharacters ch)
		{
			string serializedAllCraftingSkills = "";
			foreach (int craftingSkillId in Enum.GetValues(typeof(eCraftingSkill)))
			{
				if (craftingSkillId > 0)
				{
					serializedAllCraftingSkills += (int)craftingSkillId + "|1;";
					if (craftingSkillId == (int)eCraftingSkill._Last)
					{
						break;
					}
				}
			}
			if (serializedAllCraftingSkills.Length > 0)
			{
				serializedAllCraftingSkills = serializedAllCraftingSkills.Remove(serializedAllCraftingSkills.Length - 1);
			}
			ch.SerializedCraftingSkills = serializedAllCraftingSkills;
			ch.CraftingPrimarySkill = (int)eCraftingSkill.BasicCrafting;
		}
		private static int RevertClass(DOLCharacters ch)
		{
			switch (ch.Class)
			{
					//Alb
					case (int)eCharacterClass.Armsman: return (int)eCharacterClass.Fighter;
					case (int)eCharacterClass.Mercenary: return (int)eCharacterClass.Fighter;
					case (int)eCharacterClass.Paladin: return (int)eCharacterClass.Fighter;
					case (int)eCharacterClass.MaulerAlb: return (int)eCharacterClass.Fighter;
					case (int)eCharacterClass.Reaver: return (int)eCharacterClass.Fighter;
					case (int)eCharacterClass.Cleric: return (int)eCharacterClass.Acolyte;
					case (int)eCharacterClass.Friar: return (int)eCharacterClass.Acolyte;
					case (int)eCharacterClass.Heretic: return (int)eCharacterClass.Acolyte;
					case (int)eCharacterClass.Infiltrator: return (int)eCharacterClass.AlbionRogue;
					case (int)eCharacterClass.Scout: return (int)eCharacterClass.AlbionRogue;
					case (int)eCharacterClass.Minstrel: return (int)eCharacterClass.AlbionRogue;
					case (int)eCharacterClass.Cabalist: return (int)eCharacterClass.Mage;
					case (int)eCharacterClass.Sorcerer: return (int)eCharacterClass.Mage;
					case (int)eCharacterClass.Theurgist: return (int)eCharacterClass.Elementalist;
					case (int)eCharacterClass.Wizard: return (int)eCharacterClass.Elementalist;
					case (int)eCharacterClass.Necromancer: return (int)eCharacterClass.Disciple;
					//Hib
					case (int)eCharacterClass.Hero: return (int)eCharacterClass.Guardian;
					case (int)eCharacterClass.Champion: return (int)eCharacterClass.Guardian;
					case (int)eCharacterClass.Blademaster: return (int)eCharacterClass.Guardian;
					case (int)eCharacterClass.MaulerHib: return (int)eCharacterClass.Guardian;
					case (int)eCharacterClass.Bard: return (int)eCharacterClass.Naturalist;
					case (int)eCharacterClass.Druid: return (int)eCharacterClass.Naturalist;
					case (int)eCharacterClass.Warden: return (int)eCharacterClass.Naturalist;
					case (int)eCharacterClass.Ranger: return (int)eCharacterClass.Stalker;
					case (int)eCharacterClass.Nightshade: return (int)eCharacterClass.Stalker;
					case (int)eCharacterClass.Vampiir: return (int)eCharacterClass.Stalker;
					case (int)eCharacterClass.Bainshee: return (int)eCharacterClass.Magician;
					case (int)eCharacterClass.Eldritch: return (int)eCharacterClass.Magician;
					case (int)eCharacterClass.Enchanter: return (int)eCharacterClass.Magician;
					case (int)eCharacterClass.Mentalist: return (int)eCharacterClass.Magician;
					case (int)eCharacterClass.Animist: return (int)eCharacterClass.Forester;
					case (int)eCharacterClass.Valewalker: return (int)eCharacterClass.Forester;
					//Mid
					case (int)eCharacterClass.Berserker: return (int)eCharacterClass.Viking;
					case (int)eCharacterClass.MaulerMid: return (int)eCharacterClass.Viking;
					case (int)eCharacterClass.Savage: return (int)eCharacterClass.Viking;
					case (int)eCharacterClass.Skald: return (int)eCharacterClass.Viking;
					case (int)eCharacterClass.Thane: return (int)eCharacterClass.Viking;
					case (int)eCharacterClass.Valkyrie: return (int)eCharacterClass.Viking;
					case (int)eCharacterClass.Warrior: return (int)eCharacterClass.Viking;
					case (int)eCharacterClass.Hunter: return (int)eCharacterClass.MidgardRogue;
					case (int)eCharacterClass.Shadowblade: return (int)eCharacterClass.MidgardRogue;
					case (int)eCharacterClass.Healer: return (int)eCharacterClass.Seer;
					case (int)eCharacterClass.Shaman: return (int)eCharacterClass.Seer;
					case (int)eCharacterClass.Bonedancer: return (int)eCharacterClass.Mystic;
					case (int)eCharacterClass.Runemaster: return (int)eCharacterClass.Mystic;
					case (int)eCharacterClass.Warlock: return (int)eCharacterClass.Mystic;
					case (int)eCharacterClass.Spiritmaster: return (int)eCharacterClass.Mystic;
					//older client support
					default: return ch.Class;

			}
		}
示例#14
0
			public DOLCharactersBackup(DOLCharacters character)
				: base()
			{
				DOLCharacters_ID = character.ObjectId;
				DeleteDate = DateTime.Now;

				this.AccountName = character.AccountName;
				this.AccountSlot = character.AccountSlot;
				this.ActiveWeaponSlot = character.ActiveWeaponSlot;
                this.ActiveSaddleBags = character.ActiveSaddleBags;
				this.Advisor = character.Advisor;
				this.Autoloot = character.Autoloot;
				this.BindHeading = character.BindHeading;
				this.BindHouseHeading = character.BindHouseHeading;
				this.BindHouseRegion = character.BindHouseRegion;
				this.BindHouseXpos = character.BindHouseXpos;
				this.BindHouseYpos = character.BindHouseYpos;
				this.BindHouseZpos = character.BindHouseZpos;
				this.BindRegion = character.BindRegion;
				this.BindXpos = character.BindXpos;
				this.BindYpos = character.BindYpos;
				this.BindZpos = character.BindZpos;
				this.BountyPoints = character.BountyPoints;
				this.CancelStyle = character.CancelStyle;
				this.CapturedKeeps = character.CapturedKeeps;
				this.CapturedRelics = character.CapturedRelics;
				this.CapturedTowers = character.CapturedTowers;
				this.Champion = character.Champion;
				this.ChampionExperience = character.ChampionExperience;
				this.ChampionLevel = character.ChampionLevel;
				this.Charisma = character.Charisma;
				this.Class = character.Class;
				this.Concentration = character.Concentration;
				this.ConLostAtDeath = character.ConLostAtDeath;
				this.Constitution = character.Constitution;
				this.Copper = character.Copper;
				this.CraftingPrimarySkill = character.CraftingPrimarySkill;
				this.CreationDate = character.CreationDate;
				this.CreationModel = character.CreationModel;
				this.CurrentModel = character.CurrentModel;
				this.CurrentTitleType = character.CurrentTitleType;
				this.CustomisationStep = character.CustomisationStep;
				this.DeathCount = character.DeathCount;
				this.DeathsPvP = character.DeathsPvP;
				this.DeathTime = character.DeathTime;
				this.Dexterity = character.Dexterity;
				this.Direction = character.Direction;
				this.DisabledAbilities = character.DisabledAbilities;
				this.DisabledSpells = character.DisabledSpells;
				this.Empathy = character.Empathy;
				this.Endurance = character.Endurance;
				this.Experience = character.Experience;
				this.EyeColor = character.EyeColor;
				this.EyeSize = character.EyeSize;
				this.FaceType = character.FaceType;
				this.FlagClassName = character.FlagClassName;
				this.GainRP = character.GainRP;
				this.GainXP = character.GainXP;
				this.Gender = character.Gender;
				this.Gold = character.Gold;
				this.GravestoneRegion = character.GravestoneRegion;
				this.GuildID = character.GuildID;
				this.GuildNote = character.GuildNote;
				this.GuildRank = character.GuildRank;
				this.HairColor = character.HairColor;
				this.HairStyle = character.HairStyle;
				this.HasGravestone = character.HasGravestone;
				this.Health = character.Health;
                this.IgnoreStatistics = character.IgnoreStatistics;
                this.Intelligence = character.Intelligence;
				this.IsAnonymous = character.IsAnonymous;
				this.IsCloakHoodUp = character.IsCloakHoodUp;
				this.IsCloakInvisible = character.IsCloakInvisible;
				this.IsHelmInvisible = character.IsHelmInvisible;
				this.IsLevelRespecUsed = character.IsLevelRespecUsed;
				this.IsLevelSecondStage = character.IsLevelSecondStage;
				this.KillsAlbionDeathBlows = character.KillsAlbionDeathBlows;
				this.KillsAlbionPlayers = character.KillsAlbionPlayers;
				this.KillsAlbionSolo = character.KillsAlbionSolo;
				this.KillsDragon = character.KillsDragon;
				this.KillsEpicBoss = character.KillsEpicBoss;
				this.KillsHiberniaDeathBlows = character.KillsHiberniaDeathBlows;
				this.KillsHiberniaPlayers = character.KillsHiberniaPlayers;
				this.KillsHiberniaSolo = character.KillsHiberniaSolo;
				this.KillsLegion = character.KillsLegion;
				this.KillsMidgardDeathBlows = character.KillsMidgardDeathBlows;
				this.KillsMidgardPlayers = character.KillsMidgardPlayers;
				this.KillsMidgardSolo = character.KillsMidgardSolo;
				this.LastFreeLevel = character.LastFreeLevel;
				this.LastFreeLeveled = character.LastFreeLeveled;
				this.LastName = character.LastName;
				this.LastPlayed = character.LastPlayed;
				this.Level = character.Level;
				this.LipSize = character.LipSize;
				this.Mana = character.Mana;
				this.MaxEndurance = character.MaxEndurance;
				this.MaxSpeed = character.MaxSpeed;
				this.Mithril = character.Mithril;
				this.ML = character.ML;
				this.MLExperience = character.MLExperience;
				this.MLGranted = character.MLGranted;
				this.MLLevel = character.MLLevel;
				this.MoodType = character.MoodType;
				this.Name = character.Name;
				this.NoHelp = character.NoHelp;
                this.NotDisplayedInHerald = character.NotDisplayedInHerald;
				this.Piety = character.Piety;
				this.Platinum = character.Platinum;
				this.PlayedTime = character.PlayedTime;
				this.Quickness = character.Quickness;
				this.Race = character.Race;
				this.Realm = character.Realm;
				this.RealmLevel = character.RealmLevel;
				this.RealmPoints = character.RealmPoints;
				this.Region = character.Region;
				this.RespecAmountAllSkill = character.RespecAmountAllSkill;
				this.RespecAmountChampionSkill = character.RespecAmountChampionSkill;
				this.RespecAmountDOL = character.RespecAmountDOL;
				this.RespecAmountRealmSkill = character.RespecAmountRealmSkill;
				this.RespecAmountSingleSkill = character.RespecAmountSingleSkill;
				this.RespecBought = character.RespecBought;
				this.RPFlag = character.RPFlag;
				this.SafetyFlag = character.SafetyFlag;
				this.SerializedAbilities = character.SerializedAbilities;
				this.SerializedCraftingSkills = character.SerializedCraftingSkills;
				this.SerializedFriendsList = character.SerializedFriendsList;
				this.SerializedIgnoreList = character.SerializedIgnoreList;
				this.SerializedRealmAbilities = character.SerializedRealmAbilities;
				this.SerializedSpecs = character.SerializedSpecs;
				this.ShowGuildLogins = character.ShowGuildLogins;
				this.ShowXFireInfo = character.ShowXFireInfo;
				this.Silver = character.Silver;
				this.SpellQueue = character.SpellQueue;
				this.Strength = character.Strength;
				this.UsedLevelCommand = character.UsedLevelCommand;
				this.Xpos = character.Xpos;
				this.Ypos = character.Ypos;
				this.Zpos = character.Zpos;
			}
示例#15
0
        /// <summary>
        /// Add starter equipment to the character
        /// </summary>
        /// <param name="c">The character</param>
        public static void AddEquipment(DOLCharacters c)
        {
            Hashtable usedSlots = new Hashtable();

            // 0 = for all classes, then quickcheck if it contains the classid
            var items = GameServer.Database.SelectObjects<StarterEquipment>("`Class` = '0' OR `Class` LIKE '%" + c.Class + "%'");

            foreach (StarterEquipment item in items)
            {
                if (item.Template == null)
                {
                    GameServer.Instance.Logger.Error("StartupEquipment.cs error adding starter equipment for class " + c.Class + " cannot find itemtemplate for " + item.TemplateID);
                    continue;
                }

                // deeper check if item is suitable to classid
                if (!Util.IsEmpty(item.Class, true))
                {
                    int charClass;
                    bool isFind = false;
                    foreach (string currentItem in item.Class.SplitCSV(true))
                    {
                        int.TryParse(currentItem, out charClass);
                        if (charClass == c.Class)
                        {
                            isFind = true;
                            break;
                        }
                    }
                    if (!isFind)
                        continue;
                }

                InventoryItem inventoryItem = GameInventoryItem.Create<ItemTemplate>(item.Template);
                inventoryItem.OwnerID = c.ObjectId;
                inventoryItem.Realm = c.Realm;

                //if equipable item, equip
                foreach (eInventorySlot slot in GameLivingInventory.EQUIP_SLOTS)
                {
                    if (slot == (eInventorySlot)inventoryItem.Item_Type)
                    {
                        eInventorySlot chosenSlot = eInventorySlot.FirstEmptyBackpack;

                        if (slot == eInventorySlot.LeftHandWeapon && (eObjectType)inventoryItem.Object_Type != eObjectType.Shield && usedSlots.ContainsKey(eInventorySlot.RightHandWeapon) == false)
                        {
                            chosenSlot = eInventorySlot.RightHandWeapon;
                        }
                        else
                        {
                            chosenSlot = slot;
                        }

                        if (usedSlots.ContainsKey(chosenSlot))
                        {
                            GameServer.Instance.Logger.Error("Cannot add item " + item.TemplateID + " to class " + item.Class + " already an item for that slot assigned!");
                            continue;
                        }

                        inventoryItem.SlotPosition = (int)chosenSlot;
                        usedSlots[chosenSlot] = true;
                        if (c.ActiveWeaponSlot == 0)
                        {
                            switch (inventoryItem.SlotPosition)
                            {
                                case Slot.RIGHTHAND:
                                    c.ActiveWeaponSlot = (byte)GamePlayer.eActiveWeaponSlot.Standard;
                                    break;
                                case Slot.TWOHAND:
                                    c.ActiveWeaponSlot = (byte)GamePlayer.eActiveWeaponSlot.TwoHanded;
                                    break;
                                case Slot.RANGED:
                                    c.ActiveWeaponSlot = (byte)GamePlayer.eActiveWeaponSlot.Distance;
                                    break;
                            }
                        }
                    }
                }
                if (inventoryItem.SlotPosition == 0)
                {
                    //otherwise stick the item in the backpack
                    for (int i = (int)eInventorySlot.FirstBackpack; i < (int)eInventorySlot.LastBackpack; i++)
                    {
                        if (usedSlots[i] == null)
                        {
                            inventoryItem.SlotPosition = i;
                            usedSlots[i] = true;
                            break;
                        }
                    }
                }
                GameServer.Database.AddObject(inventoryItem);
            }
        }
示例#16
0
 public virtual bool CountsTowardsSlashLevel(DOLCharacters player)
 {
     return true;
 }
示例#17
0
        /// <summary>
        /// Command Handling Tests.
        /// </summary>
        /// <param name="client"></param>
        /// <param name="args"></param>
        public void OnCommand(GameClient client, string[] args)
        {
            // Needs all arguments
            if (args.Length < 6)
            {
                DisplaySyntax(client);
                return;
            }

            // Parse Arguments
            int version;
            int regionId;
            int realmId;
            int classId;
            int raceId;

            if (!int.TryParse(args[1], out version))
            {
                DisplaySyntax(client);
                return;
            }
            if (!int.TryParse(args[2], out regionId))
            {
                DisplaySyntax(client);
                return;
            }
            if (!int.TryParse(args[3], out realmId))
            {
                DisplaySyntax(client);
                return;
            }
            if (!int.TryParse(args[4], out classId))
            {
                DisplaySyntax(client);
                return;
            }
            if (!int.TryParse(args[5], out raceId))
            {
                DisplaySyntax(client);
                return;
            }

            // Build a temp character with given params.
            var chtmp = new DOLCharacters();
            chtmp.AllowAdd = false;
            chtmp.Region = regionId;
            chtmp.Realm = realmId;
            chtmp.Class = classId;
            chtmp.Race = raceId;

            // Test params againt database value and return results.
            var locs = StartupLocations.GetAllStartupLocationForCharacter(chtmp, (GameClient.eClientVersion)version);

            if (locs.Count < 1)
            {
                DisplayMessage(client, "No configuration for startup locations found with these constraints !");
            }
            else
            {
                foreach (StartupLocation l in locs)
                {
                    DisplayMessage(client, string.Format("--- Loc Id:{0}, X:{1}, Y:{2}, Z:{3}, Head:{4}, Region:{5}", l.StartupLoc_ID, l.XPos, l.YPos, l.ZPos, l.Heading, l.Region));
                }
            }
        }