/// <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; }
/// <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; }
/// <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(); } }
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; } }
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; }
/// <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); } }
public virtual bool CountsTowardsSlashLevel(DOLCharacters player) { return true; }
/// <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)); } } }