public static void F_CREATE_CHARACTER(BaseClient client, PacketIn packet) { GameClient cclient = (GameClient)client; CreateInfo Info; Info.slot = packet.GetUint8(); Info.race = packet.GetUint8(); Info.career = packet.GetUint8(); Info.sex = packet.GetUint8(); Info.model = packet.GetUint8(); Info.NameSize = packet.GetUint16(); packet.Skip(2); byte[] traits = new byte[8]; packet.Read(traits, 0, traits.Length); packet.Skip(7); string name = packet.GetString(Info.NameSize); ushort duplicate = 0; for (int i = 0; i < name.Length; i++) { if (i != 0) { if (name[i] == name[i - 1]) { duplicate++; } else { duplicate = 0; } if (duplicate > 3) { break; } } } if (name.Length > 2 && !CharMgr.NameIsUsed(name) && CharMgr.AllowName(name) && !CharMgr.NameIsDeleted(name) && duplicate < 3) { CharacterInfo CharInfo = CharMgr.GetCharacterInfo(Info.career); if (CharInfo == null) { Log.Error("ON_CREATE", "Can not find career :" + Info.career); } else { //Log.Success("OnCreate", "New Character : " + Name); Character Char = new Character { AccountId = cclient._Account.AccountId, bTraits = traits, Career = Info.career, CareerLine = CharInfo.CareerLine, ModelId = Info.model, Name = name, Race = Info.race, Realm = CharInfo.Realm, RealmId = Program.Rm.RealmId, Sex = Info.sex, FirstConnect = true }; if (!CharMgr.CreateChar(Char)) { Log.Error("CreateCharacter", "Hack : can not create more than 10 characters!"); } else { List <CharacterInfo_item> Items = CharMgr.GetCharacterInfoItem(Char.CareerLine); foreach (CharacterInfo_item Itm in Items) { if (Itm == null) { continue; } CharacterItem Citm = new CharacterItem { Counts = Itm.Count, CharacterId = Char.CharacterId, Entry = Itm.Entry, ModelId = Itm.ModelId, SlotId = Itm.SlotId, PrimaryDye = 0, SecondaryDye = 0 }; CharMgr.CreateItem(Citm); } Character_value CInfo = new Character_value { CharacterId = Char.CharacterId, Level = 1, Money = 0, Online = false, RallyPoint = CharInfo.RallyPt, RegionId = CharInfo.Region, Renown = 0, RenownRank = 1, RestXp = 0, Skills = CharInfo.Skills, Speed = 100, PlayedTime = 0, WorldO = CharInfo.WorldO, WorldX = CharInfo.WorldX, WorldY = CharInfo.WorldY, WorldZ = CharInfo.WorldZ, Xp = 0, ZoneId = CharInfo.ZoneId }; CharMgr.Database.AddObject(CInfo); Program.AcctMgr.UpdateRealmCharacters(Program.Rm.RealmId, (uint)CharMgr.Database.GetObjectCount <Character>(" Realm=1"), (uint)CharMgr.Database.GetObjectCount <Character>(" Realm=2")); CharacterClientData clientData = new CharacterClientData { CharacterId = Char.CharacterId }; CharMgr.Database.AddObject(clientData); Char.Value = CInfo; Char.ClientData = clientData; PacketOut Out = new PacketOut((byte)Opcodes.F_SEND_CHARACTER_RESPONSE, 32); Out.WritePascalString(cclient._Account.Username); cclient.SendPacket(Out); } } } else { PacketOut Out = new PacketOut((byte)Opcodes.F_SEND_CHARACTER_ERROR, 64); Out.FillString(cclient._Account.Username, 24); Out.WriteStringBytes("You have entered a duplicate or invalid name. Please enter a new name."); cclient.SendPacket(Out); } }
public static void F_REQUEST_LASTNAME(BaseClient client, PacketIn In) { GameClient cclient = client as GameClient; if (cclient.Plr == null) { return; } Player Plr = cclient.Plr; string lastName = In.GetStringToZero(); if (lastName == null) { lastName = ""; } if (Plr.noSurname == 1) { Plr.SendClientMessage("You have been flagged by a GM to not be able to set a last name", ChatLogFilters.CHATLOGFILTERS_USER_ERROR); // Send success, don't subtract gold SendUpdateLastNameSuccess(Plr); return; } // Check to see if the player actually changed their last name if (lastName == Plr.Info.Surname) { Plr.SendClientMessage("The new name is the same as the current name.", ChatLogFilters.CHATLOGFILTERS_USER_ERROR); // Send success, don't subtract gold SendUpdateLastNameSuccess(Plr); return; } // Check that the name does not exceed the character limit if (lastName.Length > GameData.Constants.LastNameCharacterLimit) { Plr.SendClientMessage("The new name is longer than the character limit.", ChatLogFilters.CHATLOGFILTERS_USER_ERROR); SendUpdateLastNameError(Plr); return; } // Check that lastName contains only valid characters string invalidCharsFound = FindInvalidCharsInLastName(lastName); if (invalidCharsFound.Length > 0) { string msg = string.Format( "The requested name '{0}' contains the invalid characters [{1}].", lastName, invalidCharsFound); Plr.SendClientMessage(msg, ChatLogFilters.CHATLOGFILTERS_USER_ERROR); SendUpdateLastNameError(Plr); return; } // Check for high enough level if (Plr._Value.Level < GameData.Constants.LastNameLevelRequirement) { Plr.SendClientMessage("You require Rank " + GameData.Constants.LastNameLevelRequirement + " in order to set a last name.", ChatLogFilters.CHATLOGFILTERS_USER_ERROR); SendUpdateLastNameError(Plr); return; } // Check that the player has enough gold if (Plr._Value.Money < GameData.Constants.LastNameChangeCost) { Plr.SendClientMessage("You do not have enough money.", ChatLogFilters.CHATLOGFILTERS_USER_ERROR); SendUpdateLastNameError(Plr); return; } // Check for abuse // Kick straight off for using invalid name. if (!CharMgr.AllowName(lastName)) { PacketOut Out = new PacketOut((byte)Opcodes.F_PLAYER_QUIT, 4); Out.WriteHexStringBytes("01000000"); Plr.SendPacket(Out); return; } if (lastName.Length > 1) { lastName = char.ToUpper(lastName[0]) + lastName.Substring(1).ToLower(); } // Update last name field Plr.SetLastName(lastName); Plr.RemoveMoney(Constants.LastNameChangeCost); SendUpdateLastNameSuccess(Plr); }