/// <summary> /// 人物技能模板信息和魔法模板信息 /// </summary> private void LoadSkillTemplateAndSpellTemplate() { ////////////////////////////////////////////////////////////////////////// // 开始人物技能模板信息和魔法模板信息 for (uint iIndex = 0; iIndex < DBCInstances.SkillLineEntry.Count; ++iIndex) { SkillLineEntry skillLineEntry = DBCInstances.SkillLineEntry.LookupRowEntry(iIndex); if (skillLineEntry == null) { continue; } WowSkillTemplate wowSkillTemplate = new WowSkillTemplate(); wowSkillTemplate.Serial = skillLineEntry.ID; m_GlobalSkillTemplates.AddSkillTemplate(wowSkillTemplate.Serial, wowSkillTemplate); } for (uint iIndex = 0; iIndex < DBCInstances.SpellEntry.Count; ++iIndex) { SpellEntry spellEntry = DBCInstances.SpellEntry.LookupRowEntry(iIndex); if (spellEntry == null) { continue; } WowSpellTemplate wowSpellTemplate = new WowSpellTemplate(); wowSpellTemplate.Serial = spellEntry.ID; m_GlobalSpellTemplates.AddSpellTemplate(wowSpellTemplate.Serial, wowSpellTemplate); } LOGs.WriteLine(LogMessageType.MSG_INFO, "Wow世界:读取脚本内全部的 人物技能模板信息和魔法模板信息 完成"); }
/// <summary> /// /// </summary> internal bool SaveNewCreature() { XPQuery <CharacterBase> characters = new XPQuery <CharacterBase>(OneDatabase.Session); var characterList = from character in characters where character.Oid == m_CharacterAccountGuid select character; if (characterList.Count() > WOW_MAX_CHARACTER_COUNT) // 人物过多 { return(false); } CharacterBase newCharacter = new CharacterBase(OneDatabase.Session); this.Serial = newCharacter.Oid; newCharacter.CharacterName = this.Name; //newCharacter.Account = this.AccountGuid; newCharacter.Gender = (byte)this.Gender; newCharacter.Skin = (byte)this.Skin; newCharacter.Face = (byte)this.Face; newCharacter.HairStyle = (byte)this.HairColor; newCharacter.HairColor = (byte)this.HairColor; newCharacter.FacialHair = (byte)this.FacialHair; newCharacter.Race = (byte)this.Race; newCharacter.Class = (int)this.Class; newCharacter.Level = (int)this.Level; newCharacter.MapId = (int)this.MapId; newCharacter.ZoneId = (int)this.ZoneId; newCharacter.PositionX = this.X; newCharacter.PositionY = this.Y; newCharacter.PositionZ = this.Z; newCharacter.Orientation = this.O; newCharacter.Guild = null; // 人物的坐骑航线标记点 32位值|32位值|32位值|32位值 // 00000000000000000000000000000000|...|...|... // 以位域标示 1~TaxiId~32| 32~TaxiId~64|65~TaxiId~96|96~TaxiId~128 newCharacter.TaxiMask = this.TaxiMask; newCharacter.IsGhost = false; newCharacter.IsCinematic = false; newCharacter.IsNeedRename = false; newCharacter.TotalTime = 0; newCharacter.LevelTime = 0; newCharacter.LogoutTime = DateTime.Now; newCharacter.CreatingTime = DateTime.Now; newCharacter.IsBanned = false; newCharacter.IsDelete = false; newCharacter.DeleteTime = DateTime.Now; CharacterHomeBind newCharacterHomeBind = new CharacterHomeBind(OneDatabase.Session); //newCharacterHomeBind.Owner = newCharacter.Oid; newCharacterHomeBind.MapId = (int)this.BindMapId; newCharacterHomeBind.ZoneId = (int)this.BindZoneId; newCharacterHomeBind.PositionX = this.BindX; newCharacterHomeBind.PositionY = this.BindY; newCharacterHomeBind.PositionZ = this.BindZ; foreach (BaseSkill baseSkill in SkillManager.ToArray()) { WowSkill wowSkill = baseSkill as WowSkill; if (wowSkill == null) { continue; } if (wowSkill.Serial != 0) { continue; } WowSkillTemplate wowSkillTemplate = wowSkill.SkillTemplate as WowSkillTemplate; if (wowSkillTemplate == null) { continue; } CharacterSkill newCharactersSkill = new CharacterSkill(OneDatabase.Session); wowSkill.Serial = newCharactersSkill.Oid; //newCharactersSkill.Owner = newCharacter.Oid; newCharactersSkill.SkillId = wowSkillTemplate.Serial; newCharactersSkill.Value = wowSkill.Level; } foreach (BaseSpell baseSpell in SpellManager.ToArray()) { WowSpell wowSpell = baseSpell as WowSpell; if (wowSpell == null) { continue; } if (wowSpell.Serial != 0) { continue; } WowSpellTemplate wowSpellTemplate = baseSpell.SpellTemplate as WowSpellTemplate; if (wowSpellTemplate == null) { continue; } CharacterSpell newCharacterSpell = new CharacterSpell(OneDatabase.Session); wowSpell.Serial = newCharacterSpell.Oid; //newCharacterSpell.Owner = newCharacter.Oid; newCharacterSpell.SpellId = wowSpellTemplate.Serial; //newCharacterSpell.Slot = baseSpell.Slot; } foreach (WowActionBar baseActionBar in ActionBarManager.ToArray()) { WowActionBar wowActionBar = baseActionBar as WowActionBar; if (baseActionBar == null) { continue; } if (wowActionBar.Serial != 0) { continue; } CharacterActionBar newCharactersAction = new CharacterActionBar(OneDatabase.Session); wowActionBar.Serial = newCharactersAction.Oid; //newCharactersAction.Owner= newCharacter.Oid; newCharactersAction.Slot = wowActionBar.ActionBarSlotId; newCharactersAction.ActionId = wowActionBar.Action; newCharactersAction.ActionType = wowActionBar.Type; } foreach (BaseItem baseItem in BagManager.EquipmentBag.SubItemsToArray()) { WowItem wowItem = baseItem as WowItem; if (wowItem == null) { continue; } if (wowItem.Serial != 0) { continue; } WowItemTemplate wowItemTemplate = wowItem.ItemTemplate as WowItemTemplate; if (wowItemTemplate == null) { continue; } CharacterItem newCharactersItem = new CharacterItem(OneDatabase.Session); wowItem.Serial = newCharactersItem.Oid; //newCharactersItem.Owner = newCharacter.Oid; newCharactersItem.ItemTemplateGuid = (ulong)wowItemTemplate.Serial; newCharactersItem.Amount = (int)wowItem.Amount; newCharactersItem.BagId = (int)BagManager.EquipmentBag.Item.SlotId; newCharactersItem.SlotId = (int)wowItem.SlotId; } foreach (WowReputation baseReputation in ReputationManager.ToArray()) { WowReputation wowReputation = baseReputation as WowReputation; if (wowReputation == null) { continue; } if (wowReputation.Serial != 0) { continue; } CharacterReputation newCharacterReputation = new CharacterReputation(OneDatabase.Session); wowReputation.Serial = newCharacterReputation.Oid; //newCharacterReputation.Owner = newCharacter.Oid; newCharacterReputation.FactionId = wowReputation.FactionId; newCharacterReputation.Reputation = wowReputation.Reputation; newCharacterReputation.Flag = wowReputation.Flag; } return(true); }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> internal static void World_HandleCharCreate(NetState netState, PacketReader packetReader) { WorldExtendData extendData = netState.GetComponent <WorldExtendData>(WorldExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("World_PacketHandlers.World_HandleCharEnum(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("World_PacketHandlers.World_HandleCharEnum(...) - extendData.IsLoggedIn == false error!"); return; } string strName = packetReader.ReadUTF8StringSafe(); byte iRace = packetReader.ReadByte(); byte iClass = packetReader.ReadByte(); byte iGender = packetReader.ReadByte(); byte iSkin = packetReader.ReadByte(); byte iFace = packetReader.ReadByte(); byte iHairStyle = packetReader.ReadByte(); byte iHairColor = packetReader.ReadByte(); byte iFacialHair = packetReader.ReadByte(); byte iOutFitId = packetReader.ReadByte(); if (WorldPacketHandlers.VerifyName(strName) == false) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } if (ProcessServer.WowZoneCluster.World.GlobalPlayerInfo.GetPlayerInfo(strName) != null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } WowCharacterCreateInfo wowCharacterCreateInfo = ProcessServer.WowZoneCluster.World.GlobalCreateInfo.GetCreateInfo(iRace, iClass); if (wowCharacterCreateInfo == null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } if ((iRace == WowRace.BloodElf || iRace == WowRace.Draenei) && extendData.CommonData.IsTBC == false) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } WowCharacterLevelInfo[] wowCharacterLevelInfo = ProcessServer.WowZoneCluster.World.GlobalLevelInfo.GetLevelInfo(iRace, iClass); if (wowCharacterLevelInfo == null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } WowCharacter wowPlayerInfo = new WowCharacter(); wowPlayerInfo.Serial = 0; wowPlayerInfo.IsTBC = extendData.CommonData.IsTBC; wowPlayerInfo.AccountGuid = extendData.CommonData.AccountsGuid; wowPlayerInfo.Name = strName; wowPlayerInfo.Race = iRace; wowPlayerInfo.Class = iClass; wowPlayerInfo.Gender = iGender; wowPlayerInfo.Skin = iSkin; wowPlayerInfo.Face = iFace; wowPlayerInfo.HairStyle = iHairStyle; wowPlayerInfo.HairColor = iHairColor; wowPlayerInfo.FacialHair = iFacialHair; wowPlayerInfo.X = wowCharacterCreateInfo.PositionX; wowPlayerInfo.Y = wowCharacterCreateInfo.PositionY; wowPlayerInfo.Z = wowCharacterCreateInfo.PositionZ; wowPlayerInfo.MapId = wowCharacterCreateInfo.Map; wowPlayerInfo.ZoneId = wowCharacterCreateInfo.Zone; wowPlayerInfo.BindX = 0; wowPlayerInfo.BindY = 0; wowPlayerInfo.BindZ = 0; wowPlayerInfo.BindMapId = 0; wowPlayerInfo.BindZoneId = 0; ChrRacesEntry chrRacesEntry = DBCInstances.ChrRacesEntry.LookupIDEntry(iRace); if (chrRacesEntry == null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } if (chrRacesEntry.m_TeamId == 7) { wowPlayerInfo.TeamId = WowTeam.ALLIANCE; } else { wowPlayerInfo.TeamId = WowTeam.HORDE; } ChrClassesEntry chrClassesEntry = DBCInstances.ChrClassesEntry.LookupIDEntry(iClass); if (chrClassesEntry == null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } wowPlayerInfo.PowerType = chrClassesEntry.m_PowerType; switch (iRace) { case (byte)WowRace.Tauren: wowPlayerInfo.TaxiMask[0] = 1 << (22 - 1); break; case (byte)WowRace.Human: wowPlayerInfo.TaxiMask[0] = 1 << (2 - 1); break; case (byte)WowRace.Dwarf: wowPlayerInfo.TaxiMask[0] = 1 << (6 - 1); break; case (byte)WowRace.Gnome: wowPlayerInfo.TaxiMask[0] = 1 << (6 - 1); break; case (byte)WowRace.Orc: wowPlayerInfo.TaxiMask[0] = 1 << (23 - 1); break; case (byte)WowRace.Troll: wowPlayerInfo.TaxiMask[0] = 1 << (23 - 1); break; case (byte)WowRace.Undead: wowPlayerInfo.TaxiMask[0] = 1 << (11 - 1); break; case (byte)WowRace.Nightelf: wowPlayerInfo.TaxiMask[0] = 1 << (27 - 1); break; case (byte)WowRace.BloodElf: wowPlayerInfo.TaxiMask[2] = 1 << (18 - 1); break; case (byte)WowRace.Draenei: wowPlayerInfo.TaxiMask[2] = 1 << (30 - 1); break; } wowPlayerInfo.Size = (iRace == WowRace.Tauren) ? 1.3f : 1.0f; wowPlayerInfo.Health = wowCharacterLevelInfo[0].Health; wowPlayerInfo.Mana = wowCharacterLevelInfo[0].Mana; wowPlayerInfo.Rage = 0; wowPlayerInfo.Focus = 0; wowPlayerInfo.Energy = 0; wowPlayerInfo.MaxHealth = wowCharacterLevelInfo[0].Health; wowPlayerInfo.MaxMana = wowCharacterLevelInfo[0].Mana; wowPlayerInfo.MaxRage = 0; wowPlayerInfo.MaxFocus = 0; wowPlayerInfo.MaxEnergy = 0; wowPlayerInfo.BaseHealth = wowCharacterLevelInfo[0].Health; wowPlayerInfo.BaseMana = wowCharacterLevelInfo[0].Mana; wowPlayerInfo.FactionTemplate = 0; wowPlayerInfo.Level = 1; wowPlayerInfo.Strength = wowCharacterLevelInfo[0].Strength; wowPlayerInfo.Agility = wowCharacterLevelInfo[0].Agility; wowPlayerInfo.Stamina = wowCharacterLevelInfo[0].Stamina; wowPlayerInfo.Intellect = wowCharacterLevelInfo[0].Intellect; wowPlayerInfo.Spirit = wowCharacterLevelInfo[0].Spirit; wowPlayerInfo.BoundingRadius = 0.388999998569489f; wowPlayerInfo.CombatReach = 1.5f; if (iGender == 0) { wowPlayerInfo.DisplayId = wowCharacterCreateInfo.MaleDisplayId; wowPlayerInfo.NativeDisplayId = wowCharacterCreateInfo.MaleDisplayId; } else { wowPlayerInfo.DisplayId = wowCharacterCreateInfo.FemaleDisplayId; wowPlayerInfo.NativeDisplayId = wowCharacterCreateInfo.FemaleDisplayId; } wowPlayerInfo.AttackPower = 0; wowPlayerInfo.NextLevelXP = 400; wowPlayerInfo.MaxLevel = 10; for (uint iIndex = 0; iIndex < DBCInstances.FactionEntry.Count; iIndex++) { FactionEntry factionEntry = DBCInstances.FactionEntry.LookupRowEntry(iIndex); if (factionEntry == null) { continue; } if (factionEntry.m_RepListId < 0) { continue; } int iReputation = 0; if ((factionEntry.m_BaseRepMask1 & (1 << (iRace - 1))) != 0) { iReputation = (int)factionEntry.m_BaseRepValue1; } else if ((factionEntry.m_BaseRepMask2 & (1 << (iRace - 1))) != 0) { iReputation = (int)factionEntry.m_BaseRepValue2; } else if ((factionEntry.m_BaseRepMask3 & (1 << (iRace - 1))) != 0) { iReputation = (int)factionEntry.m_BaseRepValue3; } else if ((factionEntry.m_BaseRepMask4 & (1 << (iRace - 1))) != 0) { iReputation = (int)factionEntry.m_BaseRepValue4; } else { continue; } WowReputation wowReputation = new WowReputation() { FactionId = factionEntry.ID, Reputation = iReputation, }; if ((int)wowReputation.CalcRating() <= (int)WowFactionRating.Hostile) { wowReputation.Flag |= (byte)WowFactionFlag.FactionFlagAtWar; } if ((factionEntry.m_Team == 469 && wowPlayerInfo.TeamId == WowTeam.ALLIANCE) || (factionEntry.m_Team == 67 && wowPlayerInfo.TeamId == WowTeam.HORDE)) { wowReputation.Flag |= (byte)WowFactionFlag.FactionFlagVisible; } wowPlayerInfo.ReputationManager.AddReputation(wowReputation.FactionId, wowReputation); } foreach (WowPlayerInfoSkill wowPlayerInfoSkill in wowCharacterCreateInfo.WowPlayerSkills.Skills) { WowSkillTemplate wowSkillTemplate = ProcessServer.WowZoneCluster.World.GlobalSkillTemplates.GetSkillTemplate((long)wowPlayerInfoSkill.Skill) as WowSkillTemplate; if (wowSkillTemplate == null) { continue; } WowSkill wowSkill = new WowSkill() { Serial = wowSkillTemplate.SkillId, SkillTemplate = wowSkillTemplate }; wowPlayerInfo.SkillManager.AddSkill(wowSkill.Serial, wowSkill); } foreach (WowPlayerInfoSpell wowPlayerInfoSpell in wowCharacterCreateInfo.WowPlayerSpells.Spells) { WowSpellTemplate wowSpellTemplate = ProcessServer.WowZoneCluster.World.GlobalSpellTemplates.GetSpellTemplate((long)wowPlayerInfoSpell.Spell) as WowSpellTemplate; if (wowSpellTemplate == null) { continue; } WowSpell wowSpell = new WowSpell() { Serial = wowSpellTemplate.SpellId, SpellTemplate = wowSpellTemplate }; wowPlayerInfo.SpellManager.AddSpell(wowSpell.Serial, wowSpell); } foreach (WowPlayerInfoItem wowPlayerInfoItem in wowCharacterCreateInfo.WowPlayerItems.Items) { WowItemTemplate wowItemTemplate = ProcessServer.WowZoneCluster.World.ItemTemplateManager.GetItemTemplate((long)wowPlayerInfoItem.ItemId) as WowItemTemplate; if (wowItemTemplate == null) { continue; } WowItemContainer equipmentBag = wowPlayerInfo.BagManager.EquipmentBag; if (equipmentBag == null) { break; } WowItem wowItem = equipmentBag.FindSubItemAtSlot(wowItemTemplate.InventoryType) as WowItem; if (wowItem == null) { wowItem = new WowItem() { ItemTemplate = wowItemTemplate }; equipmentBag.AddSubItem(wowItemTemplate.InventoryType, wowItem); } else { WowItemContainer mainBag = wowPlayerInfo.BagManager.MainBag; if (mainBag == null) { break; } wowItem = new WowItem() { ItemTemplate = wowItemTemplate }; mainBag.AddToFreeSlot(wowItem); } } foreach (WowPlayerInfoAction wowPlayerInfoAction in wowCharacterCreateInfo.WowPlayerActions.Actions) { WowActionBar wowActionBar = new WowActionBar() { Serial = wowPlayerInfoAction.Button, Action = wowPlayerInfoAction.Action, Type = wowPlayerInfoAction.Type }; wowPlayerInfo.ActionBarManager.AddActionBar(wowActionBar.Serial, wowActionBar); } if (wowPlayerInfo.SaveNewCreature() == false) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } ProcessServer.WowZoneCluster.World.GlobalPlayerInfo.AddPlayerInfo(wowPlayerInfo.Name, wowPlayerInfo.Serial, wowPlayerInfo); netState.Send(new Word_CharCreateResponse()); }