public static WorldObject CreateWorldObject(AceObject aceO) { WeenieType objWeenieType = (WeenieType?)aceO.WeenieType ?? WeenieType.Generic; switch (objWeenieType) { case WeenieType.LifeStone: return(new Lifestone(aceO)); case WeenieType.Door: return(new Door(aceO)); case WeenieType.Portal: return(new Portal(aceO)); case WeenieType.Book: return(new Book(aceO)); // case WeenieType.PKModifier: // return new PKModifier(aceO); case WeenieType.Cow: return(new Cow(aceO)); case WeenieType.Creature: return(new Creature(aceO)); case WeenieType.Container: return(new Container(aceO)); case WeenieType.Scroll: return(new Scroll(aceO)); case WeenieType.Vendor: return(new Vendor(aceO)); case WeenieType.Coin: return(new Coin(aceO)); case WeenieType.Key: return(new Key(aceO)); default: return(new GenericObject(aceO)); } }
public List <Biota> GetBiotasByType(WeenieType type) { // warning: this query is currently unindexed! using (var context = new ShardDbContext()) { var iType = (int)type; var results = context.Biota.Where(r => r.WeenieType == iType); var biotas = new List <Biota>(); foreach (var result in results) { biotas.Add(GetBiota(context, result.Id)); } return(biotas); } }
/// <summary> /// This method is used to get all inventory items of a type in this container (example of usage get all items of coin on player) /// </summary> public List <WorldObject> GetInventoryItemsOfTypeWeenieType(WeenieType type) { var items = new List <WorldObject>(); // first search me / add all items of type. var localInventory = Inventory.Values.Where(wo => wo.WeenieType == type).ToList(); items.AddRange(localInventory); // next search all containers for coin.. run function again for each container. var sideContainers = Inventory.Values.Where(i => i.WeenieType == WeenieType.Container).ToList(); foreach (var container in sideContainers) { items.AddRange(((Container)container).GetInventoryItemsOfTypeWeenieType(type)); } return(items); }
public List <Biota> GetBiotasByType(WeenieType type) { // warning: this query is currently unindexed! using (var context = new ShardDbContext()) { context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; var iType = (int)type; var results = context.Biota.Where(r => r.WeenieType == iType); var biotas = new List <Biota>(); foreach (var result in results) { var biota = GetBiota(result.Id); biotas.Add(biota); } return(biotas); } }
/// <summary> /// This method is used to get all inventory items of Coin in this container (example of usage get all items of coin on player) /// </summary> public virtual List <WorldObject> GetInventoryItemsOfTypeWeenieType(WeenieType type) { List <WorldObject> items = new List <WorldObject>(); // first search me / add all items of type. var localInventory = InventoryObjects.Where(wo => wo.Value.WeenieType == type).ToList(); foreach (var wo in localInventory) { items.Add(wo.Value); } // next search all containers for coin.. run function again for each container. var containers = InventoryObjects.Where(wo => wo.Value.WeenieType == WeenieType.Container).ToList(); foreach (var container in containers) { items.AddRange((container.Value as Container).GetInventoryItemsOfTypeWeenieType(type)); } return(items); }
private bool CreateCurrency(WeenieType type, uint amount) { // todo: we need to look up this object to understand it by its weenie id. // todo: support more then hard coded coin. const uint coinWeenieId = 273; WorldObject wochk = WorldObjectFactory.CreateNewWorldObject(coinWeenieId); ushort maxstacksize = wochk.MaxStackSize.Value; wochk = null; List <WorldObject> payout = new List <WorldObject>(); while (amount > 0) { WorldObject currancystack = WorldObjectFactory.CreateNewWorldObject(coinWeenieId); // payment contains a max stack if (maxstacksize <= amount) { currancystack.StackSize = maxstacksize; payout.Add(currancystack); amount = amount - maxstacksize; } else // not a full stack { currancystack.StackSize = (ushort)amount; payout.Add(currancystack); amount = amount - amount; } } // add money to player inventory. foreach (WorldObject wo in payout) { TryCreateInInventoryWithNetworking(wo); } UpdateCurrencyClientCalculations(WeenieType.Coin); return(true); }
private List <WorldObject> SpendCurrency(uint amount, WeenieType type) { if (type == WeenieType.Coin && amount > CoinValue) { return(null); } List <WorldObject> currency = new List <WorldObject>(); currency.AddRange(GetInventoryItemsOfTypeWeenieType(type)); currency = currency.OrderBy(o => o.Value).ToList(); List <WorldObject> cost = new List <WorldObject>(); uint payment = 0; WorldObject changeobj = WorldObjectFactory.CreateNewWorldObject(273); uint change = 0; foreach (WorldObject wo in currency) { if (payment + wo.StackSize.Value <= amount) { // add to payment payment = payment + (uint)wo.StackSize.Value; cost.Add(wo); } else if (payment + wo.StackSize.Value > amount) { // add payment payment = payment + (uint)wo.StackSize.Value; cost.Add(wo); // calculate change if (payment > amount) { change = payment - amount; // add new change object. changeobj.SetStackSize((int)change); wo.SetStackSize(wo.StackSize - (int)change); } break; } else if (payment == amount) { break; } } // destroy all stacks of currency required / sale foreach (WorldObject wo in cost) { TryConsumeFromInventoryWithNetworking(wo); } // if there is change - readd - do this at the end to try to prevent exploiting if (change > 0) { TryCreateInInventoryWithNetworking(changeobj); } UpdateCoinValue(false); return(cost); }
public static CreateResult Create(CharacterCreateInfo characterCreateInfo, Weenie weenie, ObjectGuid guid, uint accountId, WeenieType weenieType, out Player player) { var heritageGroup = DatManager.PortalDat.CharGen.HeritageGroups[characterCreateInfo.Heritage]; if (weenieType == WeenieType.Admin) { player = new Admin(weenie, guid, accountId); } else if (weenieType == WeenieType.Sentinel) { player = new Sentinel(weenie, guid, accountId); } else { player = new Player(weenie, guid, accountId); } player.SetProperty(PropertyInt.HeritageGroup, (int)characterCreateInfo.Heritage); player.SetProperty(PropertyString.HeritageGroup, heritageGroup.Name); player.SetProperty(PropertyInt.Gender, (int)characterCreateInfo.Gender); player.SetProperty(PropertyString.Sex, characterCreateInfo.Gender == 1 ? "Male" : "Female"); //player.SetProperty(PropertyDataId.Icon, cgh.IconImage); // I don't believe this is used anywhere in the client, but it might be used by a future custom launcher // pull character data from the dat file var sex = heritageGroup.Genders[(int)characterCreateInfo.Gender]; player.SetProperty(PropertyDataId.MotionTable, sex.MotionTable); player.SetProperty(PropertyDataId.SoundTable, sex.SoundTable); player.SetProperty(PropertyDataId.PhysicsEffectTable, sex.PhysicsTable); player.SetProperty(PropertyDataId.Setup, sex.SetupID); player.SetProperty(PropertyDataId.PaletteBase, sex.BasePalette); player.SetProperty(PropertyDataId.CombatTable, sex.CombatTable); // Check the character scale if (sex.Scale != 100u) { player.SetProperty(PropertyFloat.DefaultScale, (sex.Scale / 100f)); // Scale is stored as a percentage } // Get the hair first, because we need to know if you're bald, and that's the name of that tune! var hairstyle = sex.HairStyleList[Convert.ToInt32(characterCreateInfo.Apperance.HairStyle)]; // Olthoi and Gear Knights have a "Body Style" instead of a hair style. These styles have multiple model/texture changes, instead of a single head/hairstyle. // Storing this value allows us to send the proper appearance ObjDesc if (hairstyle.ObjDesc.AnimPartChanges.Count > 1) { player.SetProperty(PropertyInt.Hairstyle, (int)characterCreateInfo.Apperance.HairStyle); } // Certain races (Undead, Tumeroks, Others?) have multiple body styles available. This is controlled via the "hair style". if (hairstyle.AlternateSetup > 0) { player.SetProperty(PropertyDataId.Setup, hairstyle.AlternateSetup); } player.SetProperty(PropertyDataId.EyesTexture, sex.GetEyeTexture(characterCreateInfo.Apperance.Eyes, hairstyle.Bald)); player.SetProperty(PropertyDataId.DefaultEyesTexture, sex.GetDefaultEyeTexture(characterCreateInfo.Apperance.Eyes, hairstyle.Bald)); player.SetProperty(PropertyDataId.NoseTexture, sex.GetNoseTexture(characterCreateInfo.Apperance.Nose)); player.SetProperty(PropertyDataId.DefaultNoseTexture, sex.GetDefaultNoseTexture(characterCreateInfo.Apperance.Nose)); player.SetProperty(PropertyDataId.MouthTexture, sex.GetMouthTexture(characterCreateInfo.Apperance.Mouth)); player.SetProperty(PropertyDataId.DefaultMouthTexture, sex.GetDefaultMouthTexture(characterCreateInfo.Apperance.Mouth)); player.Character.HairTexture = sex.GetHairTexture(characterCreateInfo.Apperance.HairStyle); player.Character.DefaultHairTexture = sex.GetDefaultHairTexture(characterCreateInfo.Apperance.HairStyle); // HeadObject can be null if we're dealing with GearKnight or Olthoi var headObject = sex.GetHeadObject(characterCreateInfo.Apperance.HairStyle); if (headObject != null) { player.SetProperty(PropertyDataId.HeadObject, (uint)headObject); } // Skin is stored as PaletteSet (list of Palettes), so we need to read in the set to get the specific palette var skinPalSet = DatManager.PortalDat.ReadFromDat <PaletteSet>(sex.SkinPalSet); player.SetProperty(PropertyDataId.SkinPalette, skinPalSet.GetPaletteID(characterCreateInfo.Apperance.SkinHue)); player.SetProperty(PropertyFloat.Shade, characterCreateInfo.Apperance.SkinHue); // Hair is stored as PaletteSet (list of Palettes), so we need to read in the set to get the specific palette var hairPalSet = DatManager.PortalDat.ReadFromDat <PaletteSet>(sex.HairColorList[Convert.ToInt32(characterCreateInfo.Apperance.HairColor)]); player.SetProperty(PropertyDataId.HairPalette, hairPalSet.GetPaletteID(characterCreateInfo.Apperance.HairHue)); // Eye Color player.SetProperty(PropertyDataId.EyesPalette, sex.EyeColorList[Convert.ToInt32(characterCreateInfo.Apperance.EyeColor)]); if (characterCreateInfo.Apperance.HeadgearStyle < 0xFFFFFFFF) // No headgear is max UINT { var hat = GetClothingObject(sex.GetHeadgearWeenie(characterCreateInfo.Apperance.HeadgearStyle), characterCreateInfo.Apperance.HeadgearColor, characterCreateInfo.Apperance.HeadgearHue); if (hat != null) { player.TryEquipObject(hat, hat.ValidLocations ?? 0); } else { player.TryAddToInventory(CreateIOU(sex.GetHeadgearWeenie(characterCreateInfo.Apperance.HeadgearStyle))); } } var shirt = GetClothingObject(sex.GetShirtWeenie(characterCreateInfo.Apperance.ShirtStyle), characterCreateInfo.Apperance.ShirtColor, characterCreateInfo.Apperance.ShirtHue); if (shirt != null) { player.TryEquipObject(shirt, shirt.ValidLocations ?? 0); } else { player.TryAddToInventory(CreateIOU(sex.GetShirtWeenie(characterCreateInfo.Apperance.ShirtStyle))); } var pants = GetClothingObject(sex.GetPantsWeenie(characterCreateInfo.Apperance.PantsStyle), characterCreateInfo.Apperance.PantsColor, characterCreateInfo.Apperance.PantsHue); if (pants != null) { player.TryEquipObject(pants, pants.ValidLocations ?? 0); } else { player.TryAddToInventory(CreateIOU(sex.GetPantsWeenie(characterCreateInfo.Apperance.PantsStyle))); } var shoes = GetClothingObject(sex.GetFootwearWeenie(characterCreateInfo.Apperance.FootwearStyle), characterCreateInfo.Apperance.FootwearColor, characterCreateInfo.Apperance.FootwearHue); if (shoes != null) { player.TryEquipObject(shoes, shoes.ValidLocations ?? 0); } else { player.TryAddToInventory(CreateIOU(sex.GetFootwearWeenie(characterCreateInfo.Apperance.FootwearStyle))); } string templateName = heritageGroup.Templates[characterCreateInfo.TemplateOption].Name; //player.SetProperty(PropertyString.Title, templateName); player.SetProperty(PropertyString.Template, templateName); player.AddTitle(heritageGroup.Templates[characterCreateInfo.TemplateOption].Title, true); // stats uint totalAttributeCredits = heritageGroup.AttributeCredits; uint usedAttributeCredits = 0; player.Strength.StartingValue = ValidateAttributeCredits(characterCreateInfo.StrengthAbility, usedAttributeCredits, totalAttributeCredits); usedAttributeCredits += player.Strength.StartingValue; player.Endurance.StartingValue = ValidateAttributeCredits(characterCreateInfo.EnduranceAbility, usedAttributeCredits, totalAttributeCredits); usedAttributeCredits += player.Endurance.StartingValue; player.Coordination.StartingValue = ValidateAttributeCredits(characterCreateInfo.CoordinationAbility, usedAttributeCredits, totalAttributeCredits); usedAttributeCredits += player.Coordination.StartingValue; player.Quickness.StartingValue = ValidateAttributeCredits(characterCreateInfo.QuicknessAbility, usedAttributeCredits, totalAttributeCredits); usedAttributeCredits += player.Quickness.StartingValue; player.Focus.StartingValue = ValidateAttributeCredits(characterCreateInfo.FocusAbility, usedAttributeCredits, totalAttributeCredits); usedAttributeCredits += player.Focus.StartingValue; player.Self.StartingValue = ValidateAttributeCredits(characterCreateInfo.SelfAbility, usedAttributeCredits, totalAttributeCredits); usedAttributeCredits += player.Self.StartingValue; if (usedAttributeCredits > heritageGroup.AttributeCredits) { return(CreateResult.TooManySkillCreditsUsed); } // data we don't care about //characterCreateInfo.CharacterSlot; //characterCreateInfo.ClassId; // characters start with max vitals player.Health.Current = player.Health.Base; player.Stamina.Current = player.Stamina.Base; player.Mana.Current = player.Mana.Base; // set initial skill credit amount. 52 for all but "Olthoi", which have 68 player.SetProperty(PropertyInt.AvailableSkillCredits, (int)heritageGroup.SkillCredits); for (int i = 0; i < characterCreateInfo.SkillAdvancementClasses.Count; i++) { var sac = characterCreateInfo.SkillAdvancementClasses[i]; if (sac == SkillAdvancementClass.Inactive) { continue; } if (!DatManager.PortalDat.SkillTable.SkillBaseHash.ContainsKey((uint)i)) { log.ErrorFormat("Character {0} tried to create with skill {1} that was not found in Portal dat.", characterCreateInfo.Name, i); return(CreateResult.InvalidSkillRequested); } var skill = DatManager.PortalDat.SkillTable.SkillBaseHash[(uint)i]; var trainedCost = skill.TrainedCost; var specializedCost = skill.UpgradeCostFromTrainedToSpecialized; foreach (var skillGroup in heritageGroup.Skills) { if (skillGroup.SkillNum == i) { trainedCost = skillGroup.NormalCost; specializedCost = skillGroup.PrimaryCost; break; } } if (sac == SkillAdvancementClass.Specialized) { if (!player.TrainSkill((Skill)i, trainedCost)) { return(CreateResult.FailedToTrainSkill); } if (!player.SpecializeSkill((Skill)i, specializedCost)) { return(CreateResult.FailedToSpecializeSkill); } } else if (sac == SkillAdvancementClass.Trained) { if (!player.TrainSkill((Skill)i, trainedCost)) { return(CreateResult.FailedToTrainSkill); } } else if (sac == SkillAdvancementClass.Untrained) { player.UntrainSkill((Skill)i, 0); } } var isDualWieldTrainedOrSpecialized = player.Skills[Skill.DualWield].AdvancementClass > SkillAdvancementClass.Untrained; // Set Heritage based Melee and Ranged Masteries GetMasteries(player.HeritageGroup, out WeaponType meleeMastery, out WeaponType rangedMastery); player.SetProperty(PropertyInt.MeleeMastery, (int)meleeMastery); player.SetProperty(PropertyInt.RangedMastery, (int)rangedMastery); // Set innate augs SetInnateAugmentations(player); // grant starter items based on skills var starterGearConfig = StarterGearFactory.GetStarterGearConfiguration(); var grantedWeenies = new List <uint>(); foreach (var skillGear in starterGearConfig.Skills) { var charSkill = player.Skills[(Skill)skillGear.SkillId]; if (charSkill.AdvancementClass == SkillAdvancementClass.Trained || charSkill.AdvancementClass == SkillAdvancementClass.Specialized) { foreach (var item in skillGear.Gear) { if (grantedWeenies.Contains(item.WeenieId)) { var existingItem = player.Inventory.Values.FirstOrDefault(i => i.WeenieClassId == item.WeenieId); if (existingItem == null || (existingItem.MaxStackSize ?? 1) <= 1) { continue; } existingItem.SetStackSize(existingItem.StackSize + item.StackSize); continue; } var loot = WorldObjectFactory.CreateNewWorldObject(item.WeenieId); if (loot != null) { if (loot.StackSize.HasValue && loot.MaxStackSize.HasValue) { loot.SetStackSize((item.StackSize <= loot.MaxStackSize) ? item.StackSize : loot.MaxStackSize); } } else { player.TryAddToInventory(CreateIOU(item.WeenieId)); } if (loot != null && player.TryAddToInventory(loot)) { grantedWeenies.Add(item.WeenieId); } if (isDualWieldTrainedOrSpecialized && loot != null) { if (loot.WeenieType == WeenieType.MeleeWeapon) { var dualloot = WorldObjectFactory.CreateNewWorldObject(item.WeenieId); if (dualloot != null) { player.TryAddToInventory(dualloot); } else { player.TryAddToInventory(CreateIOU(item.WeenieId)); } } } } var heritageLoot = skillGear.Heritage.FirstOrDefault(sh => sh.HeritageId == characterCreateInfo.Heritage); if (heritageLoot != null) { foreach (var item in heritageLoot.Gear) { if (grantedWeenies.Contains(item.WeenieId)) { var existingItem = player.Inventory.Values.FirstOrDefault(i => i.WeenieClassId == item.WeenieId); if (existingItem == null || (existingItem.MaxStackSize ?? 1) <= 1) { continue; } existingItem.SetStackSize(existingItem.StackSize + item.StackSize); continue; } var loot = WorldObjectFactory.CreateNewWorldObject(item.WeenieId); if (loot != null) { if (loot.StackSize.HasValue && loot.MaxStackSize.HasValue) { loot.SetStackSize((item.StackSize <= loot.MaxStackSize) ? item.StackSize : loot.MaxStackSize); } } else { player.TryAddToInventory(CreateIOU(item.WeenieId)); } if (loot != null && player.TryAddToInventory(loot)) { grantedWeenies.Add(item.WeenieId); } if (isDualWieldTrainedOrSpecialized && loot != null) { if (loot.WeenieType == WeenieType.MeleeWeapon) { var dualloot = WorldObjectFactory.CreateNewWorldObject(item.WeenieId); if (dualloot != null) { player.TryAddToInventory(dualloot); } else { player.TryAddToInventory(CreateIOU(item.WeenieId)); } } } } } foreach (var spell in skillGear.Spells) { // Olthoi Spitter is a special case if (characterCreateInfo.Heritage == (int)HeritageGroup.OlthoiAcid) { player.AddKnownSpell(spell.SpellId); // Continue to next spell as Olthoi spells do not have the SpecializedOnly field continue; } if (charSkill.AdvancementClass == SkillAdvancementClass.Trained && spell.SpecializedOnly == false) { player.AddKnownSpell(spell.SpellId); } else if (charSkill.AdvancementClass == SkillAdvancementClass.Specialized) { player.AddKnownSpell(spell.SpellId); } } } } player.Name = characterCreateInfo.Name; player.Character.Name = characterCreateInfo.Name; // Index used to determine the starting location var startArea = characterCreateInfo.StartArea; var starterArea = DatManager.PortalDat.CharGen.StarterAreas[(int)startArea]; player.Location = new Position(starterArea.Locations[0].ObjCellID, starterArea.Locations[0].Frame.Origin.X, starterArea.Locations[0].Frame.Origin.Y, starterArea.Locations[0].Frame.Origin.Z, starterArea.Locations[0].Frame.Orientation.X, starterArea.Locations[0].Frame.Orientation.Y, starterArea.Locations[0].Frame.Orientation.Z, starterArea.Locations[0].Frame.Orientation.W); var instantiation = new Position(0xA9B40019, 84, 7.1f, 94, 0, 0, -0.0784591f, 0.996917f); // ultimate fallback. var spellFreeRide = new Spell(); switch (starterArea.Name) { case "OlthoiLair": //todo: check this when olthoi play is allowed in ace spellFreeRide = null; // no training area for olthoi, so they start and fall back to same place. instantiation = new Position(player.Location); break; case "Shoushi": spellFreeRide = DatabaseManager.World.GetCachedSpell(3813); // Free Ride to Shoushi break; case "Yaraq": spellFreeRide = DatabaseManager.World.GetCachedSpell(3814); // Free Ride to Yaraq break; case "Sanamar": spellFreeRide = DatabaseManager.World.GetCachedSpell(3535); // Free Ride to Sanamar break; case "Holtburg": default: spellFreeRide = DatabaseManager.World.GetCachedSpell(3815); // Free Ride to Holtburg break; } if (spellFreeRide != null && spellFreeRide.Name != "") { instantiation = new Position(spellFreeRide.PositionObjCellId.Value, spellFreeRide.PositionOriginX.Value, spellFreeRide.PositionOriginY.Value, spellFreeRide.PositionOriginZ.Value, spellFreeRide.PositionAnglesX.Value, spellFreeRide.PositionAnglesY.Value, spellFreeRide.PositionAnglesZ.Value, spellFreeRide.PositionAnglesW.Value); } player.Instantiation = new Position(instantiation); player.Sanctuary = new Position(player.Location); player.SetProperty(PropertyBool.RecallsDisabled, true); if (player is Sentinel || player is Admin) { player.Character.IsPlussed = true; player.CloakStatus = CloakStatus.Off; player.ChannelsAllowed = player.ChannelsActive; } CharacterCreateSetDefaultCharacterOptions(player); return(CreateResult.Success); }
/// <summary> /// Converts a decal specific IntValueKey to the actual IntValueKey. /// If this is not an IntValueKey, 0 will be returned. /// </summary> public static ObjectClass FromWeenieType(ItemType itemType, WeenieType weenieType) { var result = ObjectClass.Unknown; if ((itemType & ItemType.MeleeWeapon) != 0) { result = ObjectClass.MeleeWeapon; } else if ((itemType & ItemType.Armor) != 0) { result = ObjectClass.Armor; } else if ((itemType & ItemType.Clothing) != 0) { result = ObjectClass.Clothing; } else if ((itemType & ItemType.Jewelry) != 0) { result = ObjectClass.Jewelry; } else if ((itemType & ItemType.Creature) != 0) { result = ObjectClass.Monster; } else if ((itemType & ItemType.Food) != 0) { result = ObjectClass.Food; } else if ((itemType & ItemType.Money) != 0) { result = ObjectClass.Money; } else if ((itemType & ItemType.Misc) != 0) { result = ObjectClass.Misc; } else if ((itemType & ItemType.MissileWeapon) != 0) { result = ObjectClass.MissileWeapon; } else if ((itemType & ItemType.Container) != 0) { result = ObjectClass.Container; } else if ((itemType & ItemType.Useless) != 0) { result = ObjectClass.Bundle; } else if ((itemType & ItemType.Gem) != 0) { result = ObjectClass.Gem; } else if ((itemType & ItemType.SpellComponents) != 0) { result = ObjectClass.SpellComponent; } else if ((itemType & ItemType.Key) != 0) { result = ObjectClass.Key; } else if ((itemType & ItemType.Caster) != 0) { result = ObjectClass.WandStaffOrb; } else if ((itemType & ItemType.Portal) != 0) { result = ObjectClass.Portal; } else if ((itemType & ItemType.PromissoryNote) != 0) { result = ObjectClass.TradeNote; } else if ((itemType & ItemType.ManaStone) != 0) { result = ObjectClass.ManaStone; } else if ((itemType & ItemType.Service) != 0) { result = ObjectClass.Services; } else if ((itemType & ItemType.MagicWieldable) != 0) { result = ObjectClass.Plant; } else if ((itemType & ItemType.CraftCookingBase) != 0) { result = ObjectClass.BaseCooking; } else if ((itemType & ItemType.CraftAlchemyBase) != 0) { result = ObjectClass.BaseAlchemy; } //else if ((itemType & ItemType.01000000) // result = ObjectClass.BaseFletching; else if ((itemType & ItemType.CraftFletchingBase) != 0) { result = ObjectClass.CraftedCooking; } else if ((itemType & ItemType.CraftAlchemyIntermediate) != 0) { result = ObjectClass.CraftedAlchemy; } else if ((itemType & ItemType.CraftFletchingIntermediate) != 0) { result = ObjectClass.CraftedFletching; } else if ((itemType & ItemType.TinkeringTool) != 0) { result = ObjectClass.Ust; } else if ((itemType & ItemType.TinkeringMaterial) != 0) { result = ObjectClass.Salvage; } /* * if (Behavior & 0x00000008) * result = ObjectClass.Player; * else if (Behavior & 0x00000200) * result = ObjectClass.Vendor; * else if (Behavior & 0x00001000) * result = ObjectClass.Door; * else if (Behavior & 0x00002000) * result = ObjectClass.Corpse; * else if (Behavior & 0x00004000) * result = ObjectClass.Lifestone; * else if (Behavior & 0x00008000) * result = ObjectClass.Food; * else if (Behavior & 0x00010000) * result = ObjectClass.HealingKit; * else if (Behavior & 0x00020000) * result = ObjectClass.Lockpick; * else if (Behavior & 0x00040000) * result = ObjectClass.Portal; * else if (Behavior & 0x00800000) * result = ObjectClass.Foci; * else if (Behavior & 0x00000001) * result = ObjectClass.Container; */ /*if (((itemType & ItemType.Writable) != 0) && (Behavior & 0x00000100) && result == ObjectClass.Unknown) * { * if (pCreate->m_Behavior & 0x00000002) * result = ObjectClass.Journal; * else if (pCreate->m_Behavior & 0x00000004) * result = ObjectClass.Sign; * else if (!(pCreate->m_Behavior & 0x0000000F)) * result = ObjectClass.Book; * }*/ /*if (((itemType & ItemType.Writable) != 0) && ((GameDataFlags1 & 0x00400000) != 0)) * result = ObjectClass.Scroll;*/ //throw new Exception($"Unable to convert WeenieType {input} to an ObjectClass."); return(result); }
private List <WorldObject> SpendCurrency(uint amount, WeenieType type) { if (CoinValue - amount >= 0) { List <WorldObject> currency = new List <WorldObject>(); currency.AddRange(GetInventoryItemsOfTypeWeenieType(type)); currency = currency.OrderBy(o => o.Value).ToList(); List <WorldObject> cost = new List <WorldObject>(); uint payment = 0; WorldObject changeobj = WorldObjectFactory.CreateNewWorldObject(273); uint change = 0; foreach (WorldObject wo in currency) { if (payment + wo.StackSize.Value <= amount) { // add to payment payment = payment + wo.StackSize.Value; cost.Add(wo); } else if (payment + wo.StackSize.Value > amount) { // add payment payment = payment + wo.StackSize.Value; cost.Add(wo); // calculate change if (payment > amount) { change = payment - amount; // add new change object. changeobj.StackSize = (ushort)change; wo.StackSize -= (ushort)change; } break; } else if (payment == amount) { break; } } // destroy all stacks of currency required / sale foreach (WorldObject wo in cost) { TryRemoveFromInventoryWithNetworking(wo); /*TryRemoveFromInventory(wo.Guid); * ObjectGuid clearContainer = new ObjectGuid(0); * Session.Network.EnqueueSend(new GameMessagePublicUpdateInstanceID(wo, PropertyInstanceId.Container, clearContainer)); * * // clean up the shard database. * throw new NotImplementedException(); * // todo fix for EF * //DatabaseManager.Shard.DeleteObject(wo.SnapShotOfAceObject(), null);*/ Session.Network.EnqueueSend(new GameMessageDeleteObject(wo)); } // if there is change - readd - do this at the end to try to prevent exploiting if (change > 0) { TryCreateInInventoryWithNetworking(changeobj); } UpdateCurrencyClientCalculations(WeenieType.Coin); return(cost); } return(null); }
public static CreateResult Create(CharacterCreateInfo characterCreateInfo, Weenie weenie, ObjectGuid guid, uint accountId, WeenieType weenieType, out Player player) { var heritageGroup = DatManager.PortalDat.CharGen.HeritageGroups[characterCreateInfo.Heritage]; if (weenieType == WeenieType.Admin) { player = new Admin(weenie, guid, accountId); } else if (weenieType == WeenieType.Sentinel) { player = new Sentinel(weenie, guid, accountId); } else { player = new Player(weenie, guid, accountId); } player.SetProperty(PropertyInt.HeritageGroup, (int)characterCreateInfo.Heritage); player.SetProperty(PropertyString.HeritageGroup, heritageGroup.Name); player.SetProperty(PropertyInt.Gender, (int)characterCreateInfo.Gender); player.SetProperty(PropertyString.Sex, characterCreateInfo.Gender == 1 ? "Male" : "Female"); //player.SetProperty(PropertyDataId.Icon, cgh.IconImage); // I don't believe this is used anywhere in the client, but it might be used by a future custom launcher // pull character data from the dat file var sex = heritageGroup.Genders[(int)characterCreateInfo.Gender]; player.SetProperty(PropertyDataId.MotionTable, sex.MotionTable); player.SetProperty(PropertyDataId.SoundTable, sex.SoundTable); player.SetProperty(PropertyDataId.PhysicsEffectTable, sex.PhysicsTable); player.SetProperty(PropertyDataId.Setup, sex.SetupID); player.SetProperty(PropertyDataId.PaletteBase, sex.BasePalette); player.SetProperty(PropertyDataId.CombatTable, sex.CombatTable); // Check the character scale if (sex.Scale != 100u) { player.SetProperty(PropertyFloat.DefaultScale, (sex.Scale / 100f)); // Scale is stored as a percentage } // Get the hair first, because we need to know if you're bald, and that's the name of that tune! var hairstyle = sex.HairStyleList[Convert.ToInt32(characterCreateInfo.Apperance.HairStyle)]; // Olthoi and Gear Knights have a "Body Style" instead of a hair style. These styles have multiple model/texture changes, instead of a single head/hairstyle. // Storing this value allows us to send the proper appearance ObjDesc if (hairstyle.ObjDesc.AnimPartChanges.Count > 1) { player.SetProperty(PropertyInt.Hairstyle, (int)characterCreateInfo.Apperance.HairStyle); } // Certain races (Undead, Tumeroks, Others?) have multiple body styles available. This is controlled via the "hair style". if (hairstyle.AlternateSetup > 0) { player.SetProperty(PropertyDataId.Setup, hairstyle.AlternateSetup); } player.SetProperty(PropertyDataId.EyesTexture, sex.GetEyeTexture(characterCreateInfo.Apperance.Eyes, hairstyle.Bald)); player.SetProperty(PropertyDataId.DefaultEyesTexture, sex.GetDefaultEyeTexture(characterCreateInfo.Apperance.Eyes, hairstyle.Bald)); player.SetProperty(PropertyDataId.NoseTexture, sex.GetNoseTexture(characterCreateInfo.Apperance.Nose)); player.SetProperty(PropertyDataId.DefaultNoseTexture, sex.GetDefaultNoseTexture(characterCreateInfo.Apperance.Nose)); player.SetProperty(PropertyDataId.MouthTexture, sex.GetMouthTexture(characterCreateInfo.Apperance.Mouth)); player.SetProperty(PropertyDataId.DefaultMouthTexture, sex.GetDefaultMouthTexture(characterCreateInfo.Apperance.Mouth)); player.Character.HairTexture = sex.GetHairTexture(characterCreateInfo.Apperance.HairStyle); player.Character.DefaultHairTexture = sex.GetDefaultHairTexture(characterCreateInfo.Apperance.HairStyle); // HeadObject can be null if we're dealing with GearKnight or Olthoi var headObject = sex.GetHeadObject(characterCreateInfo.Apperance.HairStyle); if (headObject != null) { player.SetProperty(PropertyDataId.HeadObject, (uint)headObject); } // Skin is stored as PaletteSet (list of Palettes), so we need to read in the set to get the specific palette var skinPalSet = DatManager.PortalDat.ReadFromDat <PaletteSet>(sex.SkinPalSet); player.SetProperty(PropertyDataId.SkinPalette, skinPalSet.GetPaletteID(characterCreateInfo.Apperance.SkinHue)); player.SetProperty(PropertyFloat.Shade, characterCreateInfo.Apperance.SkinHue); // Hair is stored as PaletteSet (list of Palettes), so we need to read in the set to get the specific palette var hairPalSet = DatManager.PortalDat.ReadFromDat <PaletteSet>(sex.HairColorList[Convert.ToInt32(characterCreateInfo.Apperance.HairColor)]); player.SetProperty(PropertyDataId.HairPalette, hairPalSet.GetPaletteID(characterCreateInfo.Apperance.HairHue)); // Eye Color player.SetProperty(PropertyDataId.EyesPalette, sex.EyeColorList[Convert.ToInt32(characterCreateInfo.Apperance.EyeColor)]); string templateName = heritageGroup.Templates[characterCreateInfo.TemplateOption].Name; //player.SetProperty(PropertyString.Title, templateName); player.SetProperty(PropertyString.Template, templateName); player.AddTitle(heritageGroup.Templates[characterCreateInfo.TemplateOption].Title, true); // set player attributes to 10/100/10/10/100/100 player.Strength.StartingValue = 10; player.Endurance.StartingValue = 100; player.Coordination.StartingValue = 10; player.Quickness.StartingValue = 60; player.Focus.StartingValue = 100; player.Self.StartingValue = 100; //unspecialize and untrain all skills //retrain/specialize appropriate war mage skills player.AvailableSkillCredits = 80; player.UnspecializeSkill(Skill.WarMagic, 0); player.UnspecializeSkill(Skill.Alchemy, 0); player.UnspecializeSkill(Skill.ArcaneLore, 0); player.UnspecializeSkill(Skill.ArmorTinkering, 0); player.UnspecializeSkill(Skill.AssessCreature, 0); player.UnspecializeSkill(Skill.Cooking, 0); player.UnspecializeSkill(Skill.CreatureEnchantment, 0); player.UnspecializeSkill(Skill.Deception, 0); player.UnspecializeSkill(Skill.DirtyFighting, 0); player.UnspecializeSkill(Skill.DualWield, 0); player.UnspecializeSkill(Skill.FinesseWeapons, 0); player.UnspecializeSkill(Skill.Fletching, 0); player.UnspecializeSkill(Skill.Healing, 0); player.UnspecializeSkill(Skill.HeavyWeapons, 0); player.UnspecializeSkill(Skill.ItemEnchantment, 0); player.UnspecializeSkill(Skill.ItemTinkering, 0); player.UnspecializeSkill(Skill.Jump, 0); player.UnspecializeSkill(Skill.Leadership, 0); player.UnspecializeSkill(Skill.LifeMagic, 0); player.UnspecializeSkill(Skill.LightWeapons, 0); player.UnspecializeSkill(Skill.Lockpick, 0); player.UnspecializeSkill(Skill.Loyalty, 0); player.UnspecializeSkill(Skill.MagicDefense, 0); player.UnspecializeSkill(Skill.MagicItemTinkering, 0); player.UnspecializeSkill(Skill.ManaConversion, 0); player.UnspecializeSkill(Skill.MeleeDefense, 0); player.UnspecializeSkill(Skill.MissileDefense, 0); player.UnspecializeSkill(Skill.MissileWeapons, 0); player.UnspecializeSkill(Skill.Recklessness, 0); player.UnspecializeSkill(Skill.Run, 0); player.UnspecializeSkill(Skill.Salvaging, 0); player.UnspecializeSkill(Skill.Shield, 0); player.UnspecializeSkill(Skill.SneakAttack, 0); player.UnspecializeSkill(Skill.Summoning, 0); player.UnspecializeSkill(Skill.TwoHandedCombat, 0); player.UnspecializeSkill(Skill.VoidMagic, 0); player.UnspecializeSkill(Skill.WeaponTinkering, 0); player.UntrainSkill(Skill.WarMagic, 0); player.UntrainSkill(Skill.Alchemy, 0); player.UntrainSkill(Skill.ArcaneLore, 0); player.UntrainSkill(Skill.ArmorTinkering, 0); player.UntrainSkill(Skill.AssessCreature, 0); player.UntrainSkill(Skill.Cooking, 0); player.UntrainSkill(Skill.CreatureEnchantment, 0); player.UntrainSkill(Skill.Deception, 0); player.UntrainSkill(Skill.DirtyFighting, 0); player.UntrainSkill(Skill.DualWield, 0); player.UntrainSkill(Skill.FinesseWeapons, 0); player.UntrainSkill(Skill.Fletching, 0); player.UntrainSkill(Skill.Healing, 0); player.UntrainSkill(Skill.HeavyWeapons, 0); player.UntrainSkill(Skill.ItemEnchantment, 0); player.UntrainSkill(Skill.ItemTinkering, 0); player.UntrainSkill(Skill.Jump, 0); player.UntrainSkill(Skill.Leadership, 0); player.UntrainSkill(Skill.LifeMagic, 0); player.UntrainSkill(Skill.LightWeapons, 0); player.UntrainSkill(Skill.Lockpick, 0); player.UntrainSkill(Skill.Loyalty, 0); player.UntrainSkill(Skill.MagicDefense, 0); player.UntrainSkill(Skill.MagicItemTinkering, 0); player.UntrainSkill(Skill.ManaConversion, 0); player.UntrainSkill(Skill.MeleeDefense, 0); player.UntrainSkill(Skill.MissileDefense, 0); player.UntrainSkill(Skill.MissileWeapons, 0); player.UntrainSkill(Skill.Recklessness, 0); player.UntrainSkill(Skill.Run, 0); player.UntrainSkill(Skill.Salvaging, 0); player.UntrainSkill(Skill.Shield, 0); player.UntrainSkill(Skill.SneakAttack, 0); player.UntrainSkill(Skill.Summoning, 0); player.UntrainSkill(Skill.TwoHandedCombat, 0); player.UntrainSkill(Skill.VoidMagic, 0); player.UntrainSkill(Skill.WeaponTinkering, 0); player.TrainSkill(Skill.ArcaneLore, 0); player.TrainSkill(Skill.Jump, 0); player.TrainSkill(Skill.MagicDefense, 0); player.TrainSkill(Skill.Run, 0); player.TrainSkill(Skill.WarMagic, 0); player.TrainSkill(Skill.ManaConversion, 0); player.TrainSkill(Skill.LifeMagic, 0); player.SpecializeSkill(Skill.WarMagic, 0); player.SpecializeSkill(Skill.MagicDefense, 0); player.SpecializeSkill(Skill.ManaConversion, 0); player.SpecializeSkill(Skill.LifeMagic, 0); // data we don't care about //characterCreateInfo.CharacterSlot; //characterCreateInfo.ClassId; // characters start with max vitals player.Health.Current = player.Health.Base; player.Stamina.Current = player.Stamina.Base; player.Mana.Current = player.Mana.Base; // Set Heritage based Melee and Ranged Masteries GetMasteries(player.HeritageGroup, out WeaponType meleeMastery, out WeaponType rangedMastery); player.SetProperty(PropertyInt.MeleeMastery, (int)meleeMastery); player.SetProperty(PropertyInt.RangedMastery, (int)rangedMastery); SetInnateAugmentations(player); AddWeeniesToInventoryX(player, new HashSet <uint> { 15271, 6799, 6801, 1000036, 25702, 1000030, 24207, 1000031 }); player.Name = characterCreateInfo.Name; player.Character.Name = characterCreateInfo.Name; player.Instantiation = new Position(8323335, 260.085388f, -20.421343f, -59.994999f, 0.0f, -0.0f, -0.707107f, -0.707107f); player.Sanctuary = new Position(8323335, 260.085388f, -20.421343f, -59.994999f, 0.0f, -0.0f, -0.707107f, -0.707107f); player.SetProperty(PropertyBool.RecallsDisabled, false); player.AvailableSkillCredits = 0; player.AvailableExperience += 191226310247; player.TotalExperience += 191226310247; player.Level = 275; SpendAllXpX(player); if (PropertyManager.GetBool("pk_server").Item) { player.SetProperty(PropertyInt.PlayerKillerStatus, (int)PlayerKillerStatus.PK); } else if (PropertyManager.GetBool("pkl_server").Item) { player.SetProperty(PropertyInt.PlayerKillerStatus, (int)PlayerKillerStatus.NPK); } if ((PropertyManager.GetBool("pk_server").Item || PropertyManager.GetBool("pkl_server").Item) && PropertyManager.GetBool("pk_server_safe_training_academy").Item) { player.SetProperty(PropertyFloat.MinimumTimeSincePk, -PropertyManager.GetDouble("pk_new_character_grace_period").Item); player.SetProperty(PropertyInt.PlayerKillerStatus, (int)PlayerKillerStatus.NPK); } if (player is Sentinel || player is Admin) { player.Character.IsPlussed = true; player.CloakStatus = CloakStatus.Off; player.ChannelsAllowed = player.ChannelsActive; } CharacterCreateSetDefaultCharacterOptions(player); return(CreateResult.Success); }
public static CreateResult Create(CharacterCreateInfo characterCreateInfo, Weenie weenie, ObjectGuid guid, uint accountId, WeenieType weenieType, out Player player) { var heritageGroup = DatManager.PortalDat.CharGen.HeritageGroups[characterCreateInfo.Heritage]; if (weenieType == WeenieType.Admin) { player = new Admin(weenie, guid, accountId); } else if (weenieType == WeenieType.Sentinel) { player = new Sentinel(weenie, guid, accountId); } else { player = new Player(weenie, guid, accountId); } player.SetProperty(PropertyInt.HeritageGroup, (int)characterCreateInfo.Heritage); player.SetProperty(PropertyString.HeritageGroup, heritageGroup.Name); player.SetProperty(PropertyInt.Gender, (int)characterCreateInfo.Gender); player.SetProperty(PropertyString.Sex, characterCreateInfo.Gender == 1 ? "Male" : "Female"); //player.SetProperty(PropertyDataId.Icon, cgh.IconImage); // I don't believe this is used anywhere in the client, but it might be used by a future custom launcher // pull character data from the dat file var sex = heritageGroup.Genders[(int)characterCreateInfo.Gender]; player.SetProperty(PropertyDataId.MotionTable, sex.MotionTable); player.SetProperty(PropertyDataId.SoundTable, sex.SoundTable); player.SetProperty(PropertyDataId.PhysicsEffectTable, sex.PhysicsTable); player.SetProperty(PropertyDataId.Setup, sex.SetupID); player.SetProperty(PropertyDataId.PaletteBase, sex.BasePalette); player.SetProperty(PropertyDataId.CombatTable, sex.CombatTable); // Check the character scale if (sex.Scale != 100u) { player.SetProperty(PropertyFloat.DefaultScale, (sex.Scale / 100f)); // Scale is stored as a percentage } // Get the hair first, because we need to know if you're bald, and that's the name of that tune! var hairstyle = sex.HairStyleList[Convert.ToInt32(characterCreateInfo.Apperance.HairStyle)]; // Olthoi and Gear Knights have a "Body Style" instead of a hair style. These styles have multiple model/texture changes, instead of a single head/hairstyle. // Storing this value allows us to send the proper appearance ObjDesc if (hairstyle.ObjDesc.AnimPartChanges.Count > 1) { player.SetProperty(PropertyInt.Hairstyle, (int)characterCreateInfo.Apperance.HairStyle); } // Certain races (Undead, Tumeroks, Others?) have multiple body styles available. This is controlled via the "hair style". if (hairstyle.AlternateSetup > 0) { player.SetProperty(PropertyDataId.Setup, hairstyle.AlternateSetup); } player.SetProperty(PropertyDataId.EyesTexture, sex.GetEyeTexture(characterCreateInfo.Apperance.Eyes, hairstyle.Bald)); player.SetProperty(PropertyDataId.DefaultEyesTexture, sex.GetDefaultEyeTexture(characterCreateInfo.Apperance.Eyes, hairstyle.Bald)); player.SetProperty(PropertyDataId.NoseTexture, sex.GetNoseTexture(characterCreateInfo.Apperance.Nose)); player.SetProperty(PropertyDataId.DefaultNoseTexture, sex.GetDefaultNoseTexture(characterCreateInfo.Apperance.Nose)); player.SetProperty(PropertyDataId.MouthTexture, sex.GetMouthTexture(characterCreateInfo.Apperance.Mouth)); player.SetProperty(PropertyDataId.DefaultMouthTexture, sex.GetDefaultMouthTexture(characterCreateInfo.Apperance.Mouth)); player.Character.HairTexture = sex.GetHairTexture(characterCreateInfo.Apperance.HairStyle); player.Character.DefaultHairTexture = sex.GetDefaultHairTexture(characterCreateInfo.Apperance.HairStyle); // HeadObject can be null if we're dealing with GearKnight or Olthoi var headObject = sex.GetHeadObject(characterCreateInfo.Apperance.HairStyle); if (headObject != null) { player.SetProperty(PropertyDataId.HeadObject, (uint)headObject); } // Skin is stored as PaletteSet (list of Palettes), so we need to read in the set to get the specific palette var skinPalSet = DatManager.PortalDat.ReadFromDat <PaletteSet>(sex.SkinPalSet); player.SetProperty(PropertyDataId.SkinPalette, skinPalSet.GetPaletteID(characterCreateInfo.Apperance.SkinHue)); player.SetProperty(PropertyFloat.Shade, characterCreateInfo.Apperance.SkinHue); // Hair is stored as PaletteSet (list of Palettes), so we need to read in the set to get the specific palette var hairPalSet = DatManager.PortalDat.ReadFromDat <PaletteSet>(sex.HairColorList[Convert.ToInt32(characterCreateInfo.Apperance.HairColor)]); player.SetProperty(PropertyDataId.HairPalette, hairPalSet.GetPaletteID(characterCreateInfo.Apperance.HairHue)); // Eye Color player.SetProperty(PropertyDataId.EyesPalette, sex.EyeColorList[Convert.ToInt32(characterCreateInfo.Apperance.EyeColor)]); if (characterCreateInfo.Apperance.HeadgearStyle < 0xFFFFFFFF) // No headgear is max UINT { var hat = GetClothingObject(sex.GetHeadgearWeenie(characterCreateInfo.Apperance.HeadgearStyle), characterCreateInfo.Apperance.HeadgearColor, characterCreateInfo.Apperance.HeadgearHue); if (hat != null) { player.TryEquipObject(hat, hat.ValidLocations ?? 0); } else { player.TryAddToInventory(CreateIOU(sex.GetHeadgearWeenie(characterCreateInfo.Apperance.HeadgearStyle))); } } var shirt = GetClothingObject(sex.GetShirtWeenie(characterCreateInfo.Apperance.ShirtStyle), characterCreateInfo.Apperance.ShirtColor, characterCreateInfo.Apperance.ShirtHue); if (shirt != null) { player.TryEquipObject(shirt, shirt.ValidLocations ?? 0); } else { player.TryAddToInventory(CreateIOU(sex.GetShirtWeenie(characterCreateInfo.Apperance.ShirtStyle))); } var pants = GetClothingObject(sex.GetPantsWeenie(characterCreateInfo.Apperance.PantsStyle), characterCreateInfo.Apperance.PantsColor, characterCreateInfo.Apperance.PantsHue); if (pants != null) { player.TryEquipObject(pants, pants.ValidLocations ?? 0); } else { player.TryAddToInventory(CreateIOU(sex.GetPantsWeenie(characterCreateInfo.Apperance.PantsStyle))); } var shoes = GetClothingObject(sex.GetFootwearWeenie(characterCreateInfo.Apperance.FootwearStyle), characterCreateInfo.Apperance.FootwearColor, characterCreateInfo.Apperance.FootwearHue); if (shoes != null) { player.TryEquipObject(shoes, shoes.ValidLocations ?? 0); } else { player.TryAddToInventory(CreateIOU(sex.GetFootwearWeenie(characterCreateInfo.Apperance.FootwearStyle))); } string templateName = heritageGroup.Templates[characterCreateInfo.TemplateOption].Name; //player.SetProperty(PropertyString.Title, templateName); player.SetProperty(PropertyString.Template, templateName); player.AddTitle(heritageGroup.Templates[characterCreateInfo.TemplateOption].Title, true); // attributes var result = ValidateAttributeCredits(characterCreateInfo, heritageGroup.AttributeCredits); if (result != CreateResult.Success) { return(result); } player.Strength.StartingValue = characterCreateInfo.StrengthAbility; player.Endurance.StartingValue = characterCreateInfo.EnduranceAbility; player.Coordination.StartingValue = characterCreateInfo.CoordinationAbility; player.Quickness.StartingValue = characterCreateInfo.QuicknessAbility; player.Focus.StartingValue = characterCreateInfo.FocusAbility; player.Self.StartingValue = characterCreateInfo.SelfAbility; // data we don't care about //characterCreateInfo.CharacterSlot; //characterCreateInfo.ClassId; // characters start with max vitals player.Health.Current = player.Health.Base; player.Stamina.Current = player.Stamina.Base; player.Mana.Current = player.Mana.Base; // set initial skill credit amount. 52 for all but "Olthoi", which have 68 player.SetProperty(PropertyInt.AvailableSkillCredits, (int)heritageGroup.SkillCredits); if (characterCreateInfo.SkillAdvancementClasses.Count != 55) { return(CreateResult.ClientServerSkillsMismatch); } for (int i = 0; i < characterCreateInfo.SkillAdvancementClasses.Count; i++) { var sac = characterCreateInfo.SkillAdvancementClasses[i]; if (sac == SkillAdvancementClass.Inactive) { continue; } if (!DatManager.PortalDat.SkillTable.SkillBaseHash.ContainsKey((uint)i)) { log.ErrorFormat("Character {0} tried to create with skill {1} that was not found in Portal dat.", characterCreateInfo.Name, i); return(CreateResult.InvalidSkillRequested); } var skill = DatManager.PortalDat.SkillTable.SkillBaseHash[(uint)i]; var trainedCost = skill.TrainedCost; var specializedCost = skill.UpgradeCostFromTrainedToSpecialized; foreach (var skillGroup in heritageGroup.Skills) { if (skillGroup.SkillNum == i) { trainedCost = skillGroup.NormalCost; specializedCost = skillGroup.PrimaryCost; break; } } if (sac == SkillAdvancementClass.Specialized) { if (!player.TrainSkill((Skill)i, trainedCost)) { return(CreateResult.FailedToTrainSkill); } if (!player.SpecializeSkill((Skill)i, specializedCost)) { return(CreateResult.FailedToSpecializeSkill); } } else if (sac == SkillAdvancementClass.Trained) { if (!player.TrainSkill((Skill)i, trainedCost, true)) { return(CreateResult.FailedToTrainSkill); } } else if (sac == SkillAdvancementClass.Untrained) { player.UntrainSkill((Skill)i, 0); } } var isDualWieldTrainedOrSpecialized = player.Skills[Skill.DualWield].AdvancementClass > SkillAdvancementClass.Untrained; // Set Heritage based Melee and Ranged Masteries GetMasteries(player.HeritageGroup, out WeaponType meleeMastery, out WeaponType rangedMastery); player.SetProperty(PropertyInt.MeleeMastery, (int)meleeMastery); player.SetProperty(PropertyInt.RangedMastery, (int)rangedMastery); // Set innate augs SetInnateAugmentations(player); // grant starter items based on skills var starterGearConfig = StarterGearFactory.GetStarterGearConfiguration(); var grantedWeenies = new List <uint>(); foreach (var skillGear in starterGearConfig.Skills) { var charSkill = player.Skills[(Skill)skillGear.SkillId]; if (charSkill.AdvancementClass == SkillAdvancementClass.Trained || charSkill.AdvancementClass == SkillAdvancementClass.Specialized) { foreach (var item in skillGear.Gear) { if (grantedWeenies.Contains(item.WeenieId)) { var existingItem = player.Inventory.Values.FirstOrDefault(i => i.WeenieClassId == item.WeenieId); if (existingItem == null || (existingItem.MaxStackSize ?? 1) <= 1) { continue; } existingItem.SetStackSize(existingItem.StackSize + item.StackSize); continue; } var loot = WorldObjectFactory.CreateNewWorldObject(item.WeenieId); if (loot != null) { if (loot.StackSize.HasValue && loot.MaxStackSize.HasValue) { loot.SetStackSize((item.StackSize <= loot.MaxStackSize) ? item.StackSize : loot.MaxStackSize); } } else { player.TryAddToInventory(CreateIOU(item.WeenieId)); } if (loot != null && player.TryAddToInventory(loot)) { grantedWeenies.Add(item.WeenieId); } if (isDualWieldTrainedOrSpecialized && loot != null) { if (loot.WeenieType == WeenieType.MeleeWeapon) { var dualloot = WorldObjectFactory.CreateNewWorldObject(item.WeenieId); if (dualloot != null) { player.TryAddToInventory(dualloot); } else { player.TryAddToInventory(CreateIOU(item.WeenieId)); } } } } var heritageLoot = skillGear.Heritage.FirstOrDefault(sh => sh.HeritageId == characterCreateInfo.Heritage); if (heritageLoot != null) { foreach (var item in heritageLoot.Gear) { if (grantedWeenies.Contains(item.WeenieId)) { var existingItem = player.Inventory.Values.FirstOrDefault(i => i.WeenieClassId == item.WeenieId); if (existingItem == null || (existingItem.MaxStackSize ?? 1) <= 1) { continue; } existingItem.SetStackSize(existingItem.StackSize + item.StackSize); continue; } var loot = WorldObjectFactory.CreateNewWorldObject(item.WeenieId); if (loot != null) { if (loot.StackSize.HasValue && loot.MaxStackSize.HasValue) { loot.SetStackSize((item.StackSize <= loot.MaxStackSize) ? item.StackSize : loot.MaxStackSize); } } else { player.TryAddToInventory(CreateIOU(item.WeenieId)); } if (loot != null && player.TryAddToInventory(loot)) { grantedWeenies.Add(item.WeenieId); } if (isDualWieldTrainedOrSpecialized && loot != null) { if (loot.WeenieType == WeenieType.MeleeWeapon) { var dualloot = WorldObjectFactory.CreateNewWorldObject(item.WeenieId); if (dualloot != null) { player.TryAddToInventory(dualloot); } else { player.TryAddToInventory(CreateIOU(item.WeenieId)); } } } } } foreach (var spell in skillGear.Spells) { // Olthoi Spitter is a special case if (characterCreateInfo.Heritage == (int)HeritageGroup.OlthoiAcid) { player.AddKnownSpell(spell.SpellId); // Continue to next spell as Olthoi spells do not have the SpecializedOnly field continue; } if (charSkill.AdvancementClass == SkillAdvancementClass.Trained && spell.SpecializedOnly == false) { player.AddKnownSpell(spell.SpellId); } else if (charSkill.AdvancementClass == SkillAdvancementClass.Specialized) { player.AddKnownSpell(spell.SpellId); } } } } player.Name = characterCreateInfo.Name; player.Character.Name = characterCreateInfo.Name; player.Instantiation = new Position(8323335, 260.085388f, -20.421343f, -59.994999f, 0.0f, -0.0f, -0.707107f, -0.707107f); player.Sanctuary = new Position(8323335, 260.085388f, -20.421343f, -59.994999f, 0.0f, -0.0f, -0.707107f, -0.707107f); player.SetProperty(PropertyBool.RecallsDisabled, false); player.AvailableSkillCredits = 50; player.AvailableExperience += 191226310247; player.TotalExperience += 191226310247; player.Level = 275; if (PropertyManager.GetBool("pk_server").Item) { player.SetProperty(PropertyInt.PlayerKillerStatus, (int)PlayerKillerStatus.PK); } else if (PropertyManager.GetBool("pkl_server").Item) { player.SetProperty(PropertyInt.PlayerKillerStatus, (int)PlayerKillerStatus.NPK); } if ((PropertyManager.GetBool("pk_server").Item || PropertyManager.GetBool("pkl_server").Item) && PropertyManager.GetBool("pk_server_safe_training_academy").Item) { player.SetProperty(PropertyFloat.MinimumTimeSincePk, -PropertyManager.GetDouble("pk_new_character_grace_period").Item); player.SetProperty(PropertyInt.PlayerKillerStatus, (int)PlayerKillerStatus.NPK); } if (player is Sentinel || player is Admin) { player.Character.IsPlussed = true; player.CloakStatus = CloakStatus.Off; player.ChannelsAllowed = player.ChannelsActive; } CharacterCreateSetDefaultCharacterOptions(player); return(CreateResult.Success); }