protected override void ParseData(SqliteDataReader reader) { mInfos.Clear(); SkillSlotInfo info; if (reader != null) { if (reader.HasRows == true) { while (reader.Read()) { info = new SkillSlotInfo(); info.VocationId = DBTextResource.ParseUI_s(GetReaderString(reader, "vocation"), 0); info.SlotPos = DBTextResource.ParseUI(GetReaderString(reader, "slot_pos")); info.SetType = (SlotSetType)DBTextResource.ParseUI(GetReaderString(reader, "slot_set_type")); info.NotOpenNotice = GetReaderString(reader, "not_open_notice"); if (mInfos.ContainsKey(info.VocationId) == false) { mInfos.Add(info.VocationId, new VocationSkillSlotInfo()); } mInfos[info.VocationId].mSlotInfos[info.SlotPos] = info; } } } }
/// <summary> /// 新增一个技能槽默认技能ID /// </summary> /// <param name="require_race">职业ID,参照 DBDataAllSkill.Require_race 取值</param> /// <param name="slot_pos"></param> /// <param name="active_skill_id"></param> public void AddSlotDefaultSkillId(uint require_race, uint slot_pos, uint all_skill_id) { foreach (var item in mInfos) { if ((item.Key == require_race) || (require_race == DBDataAllSkill.CommonVocationType)) { SkillSlotInfo slot_info = item.Value.GetSlotInfo(slot_pos); if (slot_info != null) { if (slot_info.DefaultAllSkillIds == null) { slot_info.DefaultAllSkillIds = new List <uint>(); } slot_info.DefaultAllSkillIds.Add(all_skill_id); } } } }
public void _RecvHandler(ProxySocket Socket, uint Serial, NewProxy Proxy, ref MemoryStream Buffer) { Packet Packet = new Packet(Buffer.ToArray()); try { switch ((ServerAction)Packet.Action) { #region Location case ServerAction.Location: { PlayerLocation Loc = Packet.Read <PlayerLocation>(0); Clients[Serial].Aisling.Location.X = Loc.X; Clients[Serial].Aisling.Location.Y = Loc.Y; Clients[Serial].Aisling.LastRefresh = DateTime.Now; } break; #endregion #region Map Info case ServerAction.MapInfo: { MapInfo Info = Packet.Read <MapInfo>(0); Clients[Serial].Aisling.Location.Map = Info.MapNumber; //if (Clients[Serial].Aisling.Map.Number != Info.MapNumber) Clients[Serial].Aisling.Map.Entities.Clear(); Clients[Serial].Aisling.Map.Number = Info.MapNumber; Clients[Serial].Aisling.Map.Width = Info.TileX; Clients[Serial].Aisling.Map.Height = Info.TileY; new System.Threading.Thread(new System.Threading.ThreadStart(Clients[Serial].WaitForMapLoad)).Start(); Clients[Serial].Aisling.LastRefresh = DateTime.Now; } break; #endregion #region Animation case ServerAction.Animation: { string PString = Packet.GetPacketString(Packet.Data); Net.ServerStructs.Animation AnimationStruct = Packet.Read <Net.ServerStructs.Animation>(0); Types.Animation Animation = new Types.Animation(AnimationStruct.ToWho, AnimationStruct.FromWho, AnimationStruct.Number, AnimationStruct.Speed); Clients[Serial].Aisling.Map.Entities[Animation.ToWho].Animations.Add(Animation); if (Clients[Serial].Aisling.Map.Entities[Animation.ToWho].Animations.Count > 30) { Clients[Serial].Aisling.Map.Entities[Animation.ToWho].Animations = new List <Types.Animation>( from var in Clients[Serial].Aisling.Map.Entities[Animation.ToWho].Animations where var.TimeElapsed < new TimeSpan(0, 5, 0) select var ); } if (AnimationStruct.ToWho == Clients[Serial].Aisling.Serial) { Clients[Serial].Aisling.Animations.Add(Animation); } else { if (Clients[Serial].Aisling.Map.Entities.ContainsKey(Animation.ToWho) && Clients[Serial].Aisling.Map.Entities.ContainsKey(Animation.FromWho)) { if (Clients[Serial].Aisling.Map.Entities[Animation.FromWho].EntityType == MapEntity.Type.Player) { if (Clients[Serial].Aisling.Map.Entities[Animation.ToWho].EntityType == MapEntity.Type.Monster) { if (!(Clients[Serial].Aisling.Map.Entities[Animation.FromWho] as AislingEntity).Targets.Contains(Animation.ToWho)) { (Clients[Serial].Aisling.Map.Entities[Animation.FromWho] as AislingEntity).Targets.Add(Animation.ToWho); } } foreach (MapEntity Entity in Clients[Serial].Aisling.Map.FindEntities((MapEntity MapEnt) => MapEnt.EntityType == MapEntity.Type.Monster && MapEnt.Serial == Animation.ToWho)) { (Entity as Monster).Animations.Add(Animation); } (Clients[Serial].Aisling.Map.Entities[Animation.FromWho] as AislingEntity).Targets = new List <uint> ( from var in (Clients[Serial].Aisling.Map.Entities[Animation.FromWho] as AislingEntity).Targets where Clients[Serial].Aisling.Map.Entities.ContainsKey(var) select var ); } } } } break; #endregion #region Skill Slot Info case ServerAction.SkillSlotInfo: { SkillSlotInfo Info = Packet.Read <SkillSlotInfo>(0); if (Info.Slot <= 36) { Clients[Serial].Aisling.TemSkills[(int)(Info.Slot - 1)] = new SkillSlot() { Icon = Info.Icon, Name = Info.Name }; } else if (Info.Slot <= 72) { Clients[Serial].Aisling.MedSkills[(int)(Info.Slot - 37)] = new SkillSlot() { Icon = Info.Icon, Name = Info.Name }; } else if (Info.Slot <= 90) { Clients[Serial].Aisling.WorldSkills[(int)(Info.Slot - 73)] = new SkillSlot() { Icon = Info.Icon, Name = Info.Name }; } } break; #endregion #region Spell Slot Info case ServerAction.SpellSlotInfo: { SpellSlotInfo Info = Packet.Read <SpellSlotInfo>(0); if (Info.Slot <= 36) { Clients[Serial].Aisling.TemSpells[Info.Slot - 1] = new SpellSlot() { Lines = Info.Lines, Name = Info.Name, Prompt = Info.Prompt, TargetType = Info.TargetType }; } else if (Info.Slot <= 72) { Clients[Serial].Aisling.MedSpells[Info.Slot - 37] = new SpellSlot() { Lines = Info.Lines, Name = Info.Name, Prompt = Info.Prompt, TargetType = Info.TargetType }; } else if (Info.Slot <= 90) { Clients[Serial].Aisling.WorldSpells[Info.Slot - 73] = new SpellSlot() { Lines = Info.Lines, Name = Info.Name, Prompt = Info.Prompt, TargetType = Info.TargetType }; } } break; #endregion #region Remove Slot case ServerAction.RemoveItem: { RemoveSlot Info = Packet.Read <RemoveSlot>(0); Clients[Serial].Aisling.Inventory[Info.Slot - 1] = null; } break; case ServerAction.RemoveSpell: { RemoveSlot Info = Packet.Read <RemoveSlot>(0); if (Info.Slot <= 36) { Clients[Serial].Aisling.TemSpells[(int)(Info.Slot - 1)] = null; } else if (Info.Slot <= 72) { Clients[Serial].Aisling.MedSpells[(int)(Info.Slot - 37)] = null; } else if (Info.Slot <= 90) { Clients[Serial].Aisling.WorldSpells[(int)(Info.Slot - 73)] = null; } } break; case ServerAction.RemoveSkill: { RemoveSlot Info = Packet.Read <RemoveSlot>(0); if (Info.Slot <= 36) { Clients[Serial].Aisling.TemSkills[(int)(Info.Slot - 1)] = null; } else if (Info.Slot <= 72) { Clients[Serial].Aisling.MedSkills[(int)(Info.Slot - 37)] = null; } else if (Info.Slot <= 90) { Clients[Serial].Aisling.WorldSkills[(int)(Info.Slot - 73)] = null; } } break; #endregion #region Spell Bar case ServerAction.SpellBar: { PlayerSpellBar PlayerBar = Packet.Read <PlayerSpellBar>(0); Types.SpellBar SpellBar = new SpellBar(PlayerBar.Icon, PlayerBar.Color); if (!Clients[Serial].Aisling.SpellBar.ContainsKey(PlayerBar.Icon)) { Clients[Serial].Aisling.SpellBar.Add(PlayerBar.Icon, SpellBar); } if (SpellBar.Color == PlayerSpellBar.SpellIconColor.Gone) { Clients[Serial].Aisling.SpellBar.Remove(SpellBar.Icon); } } break; #endregion #region Client Walk case ServerAction.ClientWalk: { ClientSpriteWalk WalkingDirection = Packet.Read <ClientSpriteWalk>(0); Clients[Serial].Aisling.Location.AbsX = WalkingDirection.X; Clients[Serial].Aisling.Location.AbsY = WalkingDirection.Y; switch (WalkingDirection.Direction) { case FaceDirection.Down: Clients[Serial].Aisling.Location.AbsY++; break; case FaceDirection.Up: Clients[Serial].Aisling.Location.AbsY--; break; case FaceDirection.Left: Clients[Serial].Aisling.Location.AbsX--; break; case FaceDirection.Right: Clients[Serial].Aisling.Location.AbsX++; break; } Clients[Serial].Aisling.Location.AbsLocation = WalkingDirection.Direction; Clients[Serial].Aisling.LastBattle = DateTime.Now; } break; #endregion #region HPBar Display case ServerAction.DisplayHPBAR: { HPBAR EntityBar = Packet.Read <HPBAR>(0); Console.WriteLine(EntityBar.Percent); if (Clients[Serial].Aisling.Map.Entities.ContainsKey(EntityBar.Serial)) { Clients[Serial].Aisling.Map.Entities[EntityBar.Serial].HPPercent = EntityBar.Percent; } if (EntityBar.Serial == Clients[Serial].Aisling.Serial) { Clients[Serial].HPPercent = EntityBar.Percent; } foreach (MapEntity Entity in Clients[Serial].Aisling.Map.FindEntities((MapEntity MapEnt) => MapEnt.EntityType == MapEntity.Type.Monster && MapEnt.Serial == EntityBar.Serial)) { try { if (EntityBar.Percent < 100) { (Entity as Monster).WasHit = true; } (Clients[Serial].EntityFromSerial(EntityBar.Serial) as Monster).WasPramhed = false; (Clients[Serial].EntityFromSerial(EntityBar.Serial) as Monster).HPPercent = EntityBar.Percent; } catch { } } //if we hit our target, reset hit count to zero if (Clients[Serial].Aisling.testSer == EntityBar.Serial) { Clients[Serial].Aisling.test = 0; //we hit it, so it's not pramhed Clients[Serial].Aisling.Map.Entities[EntityBar.Serial].WasPramhed = false; } } break; #endregion #region Adding Sprites / Monsters / Npcs / Items case ServerAction.AddSprites: { AddSprites Sprites = AddSprites.FromPacket(Packet); foreach (AddSprites.MonsterSprite Monster in Sprites.Monsters) { if (!Clients[Serial].Aisling.Map.Entities.ContainsKey(Monster.Serial)) { Clients[Serial].Aisling.Map.Entities.Add(Monster.Serial, new Monster() { Icon = Monster.Icon, IsPet = Monster.IsPet, HPPercent = 100, Date = DateTime.Now, Location = new Location() { X = Monster.X, Y = Monster.Y, Direction = Monster.Direction, Map = Clients[Serial].Aisling.Location.Map }, Serial = Monster.Serial } ); } } foreach (AddSprites.NPCSprite NPC in Sprites.NPCs) { if (Clients[Serial].Aisling.Map.Entities.ContainsKey(NPC.Serial)) { Clients[Serial].Aisling.Map.Entities.Remove(NPC.Serial); } Clients[Serial].Aisling.Map.Entities.Add(NPC.Serial, new NPC() { Icon = NPC.Icon, Location = new Location() { X = NPC.X, Y = NPC.Y, Direction = NPC.Direction, Map = Clients[Serial].Aisling.Location.Map }, Name = NPC.Name, Serial = NPC.Serial } ); } foreach (AddSprites.ItemSprite Item in Sprites.Items) { if (Clients[Serial].Aisling.Map.Entities.ContainsKey(Item.Serial)) { Clients[Serial].Aisling.Map.Entities.Remove(Item.Serial); } Clients[Serial].Aisling.Map.Entities.Add(Item.Serial, new Item() { Icon = Item.Icon, Location = new Location() { X = Item.X, Y = Item.Y, Direction = (FaceDirection)FaceDirection.Up, Map = Clients[Serial].Aisling.Location.Map, }, Serial = Item.Serial } ); } } break; #endregion #region Adding Players case ServerAction.AddPlayer: { if (Packet.Data[11] == 0x00 && Packet.Data[12] == 0x00 && Packet.Data[13] == 0x00 && Packet.Data[14] == 0x00) { Packet.Data[13] = 0x50; } if (Packet[11] == 0xFF && Packet[12] == 0xFF) { ShowPlayerForm Info = Packet.Read <ShowPlayerForm>(0); if (Packet.Data[11] == 0x00 && Packet.Data[12] == 0x00 && Packet.Data[13] == 0x00 && Packet.Data[14] == 0x00) { Info.Name = "icube"; } if (!(new Location() { X = Info.X, Y = Info.Y }.OnScreenOf(Clients[Serial].Aisling.Location))) { break; } if (Info.Serial == Clients[Serial].Aisling.Serial) { Clients[Serial].Aisling.Location.X = Info.X; Clients[Serial].Aisling.Location.Y = Info.Y; } else { if (Clients[Serial].Aisling.Map.Entities.ContainsKey(Info.Serial)) { Clients[Serial].Aisling.Map.Entities.Remove(Info.Serial); } Clients[Serial].Aisling.Map.Entities.Add(Info.Serial, new AislingEntity() { LegendInfo = new LegendInfo.Entry[0], Location = new Location() { X = Info.X, Y = Info.Y, Map = Clients[Serial].Aisling.Location.Map, Direction = Info.Direction }, Name = Info.Name.value, Serial = Info.Serial, HoverMessage = Info.HoverMessage.value } ); } } else { ShowPlayer Info = null; Info = Packet.Read <ShowPlayer>(0); Console.WriteLine(Info.Name); if (!(new Location() { X = Info.X, Y = Info.Y }.OnScreenOf(Clients[Serial].Aisling.Location))) { break; } if (Packet.Data[11] == 0x00 && Packet.Data[12] == 0x00 && Packet.Data[13] == 0x00 && Packet.Data[14] == 0x00) { Info.Name = "icube"; } if (Info.Serial == Clients[Serial].Aisling.Serial) { Clients[Serial].Aisling.Location.X = Info.X; Clients[Serial].Aisling.Location.Y = Info.Y; } else { if (Clients[Serial].Aisling.Map.Entities.ContainsKey(Info.Serial)) { Clients[Serial].Aisling.Map.Entities.Remove(Info.Serial); } Clients[Serial].Aisling.Map.Entities.Add(Info.Serial, new AislingEntity() { LegendInfo = new LegendInfo.Entry[0], Location = new Location() { X = Info.X, Y = Info.Y, Map = Clients[Serial].Aisling.Location.Map, Direction = Info.Direction }, Name = Info.Name.value, Serial = Info.Serial, HoverMessage = Info.HoverMessage.value } ); } } } break; #endregion #region Remove Sprite case ServerAction.RemoveSprite: { uint EntitySerial = Packet.Read <RemoveSprite>(0).ID; if (Clients[Serial].Aisling.Map.Entities.ContainsKey(EntitySerial)) { Clients[Serial].Aisling.Map.Entities.Remove(EntitySerial); } } break; #endregion #region Stats Updated case ServerAction.StatsUpdated: { bool[] Bools = Packet.Read <StatsUpdate>(0).BitMaskValues(); int Index = 3; if (Bools[2]) { StatsStructA StructA = Packet.Read <StatsStructA>(Index); Clients[Serial].Aisling.Stats.STR = StructA.STR; Clients[Serial].Aisling.Stats.INT = StructA.INT; Clients[Serial].Aisling.Stats.WIS = StructA.WIS; Clients[Serial].Aisling.Stats.CON = StructA.CON; Clients[Serial].Aisling.Stats.DEX = StructA.DEX; Clients[Serial].Aisling.Stats.Points = StructA.Points; Clients[Serial].Aisling.Stats.MaxHP = StructA.HPMax; Clients[Serial].Aisling.Stats.MaxMP = StructA.MPMax; Clients[Serial].Aisling.Stats.WeightCurr = StructA.WeightCurr; Clients[Serial].Aisling.Stats.WeightMax = StructA.WeightMax; Clients[Serial].Aisling.Stats.Ability = StructA.Ability; Clients[Serial].Aisling.Stats.Level = StructA.Level; Index += 28; } if (Bools[3]) { StatsStructB StructB = Packet.Read <StatsStructB>(Index); Clients[Serial].Aisling.Stats.CurHP = StructB.HPCurr; Clients[Serial].Aisling.Stats.CurMP = StructB.MPCurr; Index += 8; } if (Bools[4]) { StatsStructC StructC = Packet.Read <StatsStructC>(Index); Clients[Serial].Aisling.Stats.AbilityExperience = StructC.AExp; Clients[Serial].Aisling.Stats.LevelExperience = StructC.EXP; Clients[Serial].Aisling.Stats.Gold = StructC.Gold; Clients[Serial].Aisling.Stats.GP = StructC.GP; Clients[Serial].Aisling.Stats.NextLevel = StructC.NextLev; Clients[Serial].Aisling.Stats.NextAbility = StructC.NextAB; Index += 24; } if (Bools[5]) { StatsStructD StructD = Packet.Read <StatsStructD>(Index); Clients[Serial].Aisling.Stats.AC = StructD.AC; Clients[Serial].Aisling.Stats.MR = StructD.MR; Clients[Serial].Aisling.Stats.HIT = StructD.HIT; Clients[Serial].Aisling.Stats.DAM = StructD.DAM; Clients[Serial].Aisling.Stats.AttackElement = StructD.AEle; Clients[Serial].Aisling.Stats.DefenseElement = StructD.DEle; Index += 13; } } break; #endregion #region Entity Walked case ServerAction.EntityWalked: { SpriteWalk EntityWalk = Packet.Read <SpriteWalk>(0); ushort XDIFF = EntityWalk.X, YDIFF = EntityWalk.Y; switch (EntityWalk.Direction) { case FaceDirection.Down: YDIFF++; break; case FaceDirection.Left: XDIFF--; break; case FaceDirection.Right: XDIFF++; break; case FaceDirection.Up: YDIFF--; break; } if (Clients[Serial].Aisling.Map.Entities.ContainsKey(EntityWalk.Serial)) { if (Clients[Serial].Aisling.Map.Entities[EntityWalk.Serial].EntityType == MapEntity.Type.Monster) { (Clients[Serial].Aisling.Map.Entities[EntityWalk.Serial] as Monster).WasHit = false; } Clients[Serial].Aisling.Map.Entities[EntityWalk.Serial].WasHit = false; Clients[Serial].Aisling.Map.Entities[EntityWalk.Serial].Location.X = XDIFF; Clients[Serial].Aisling.Map.Entities[EntityWalk.Serial].Location.Y = YDIFF; Clients[Serial].Aisling.Map.Entities[EntityWalk.Serial].Location.Direction = EntityWalk.Direction; } if (Clients[Serial].AttackTargetSerial == EntityWalk.Serial) { Clients[Serial].Aisling.AttackLoops = 0; Clients[Serial].Aisling.test2 = false; } } break; #endregion #region Appendage case ServerAction.Appendage: { Appendage BodyItems = Packet.Read <Appendage>(0); Clients[Serial].Aisling.Body[(Aisling.SpriteBody.Appendage.Slot)BodyItems.Slot] = new Aisling.SpriteBody.Appendage(BodyItems.Icon, BodyItems.Name); Clients[Serial].Aisling.Body[(Aisling.SpriteBody.Appendage.Slot)BodyItems.Slot].Icon = BodyItems.Icon; } break; #endregion #region Entity Turned case ServerAction.EntityTurn: { EntityDirection EntityDir = Packet.Read <EntityDirection>(0); if (Clients[Serial].Aisling.Map.Entities.ContainsKey(EntityDir.Serial)) { Clients[Serial].Aisling.Map.Entities[EntityDir.Serial].Location.Direction = EntityDir.FaceDirection; if (Clients[Serial].Aisling.Map.Entities[EntityDir.Serial].EntityType == MapEntity.Type.Monster) { (Clients[Serial].Aisling.Map.Entities[EntityDir.Serial] as Monster).WasSuained = false; } } } break; #endregion #region Body Animation case ServerAction.BodyAnimation: { SpriteAnimation EntityAnimation = Packet.Read <SpriteAnimation>(0); if (Clients[Serial].Aisling.Serial == EntityAnimation.ID) { Clients[Serial].Aisling.AttackLanded = true; } else { Clients[Serial].Aisling.AttackLanded = false; } //we enganged attacking if (EntityAnimation.ID == Clients[Serial].Aisling.Serial) { if (EntityAnimation.Animation == 1 || EntityAnimation.Animation == 129 || EntityAnimation.Animation == 139 || EntityAnimation.Animation == 132) { Clients[Serial].Aisling.Swings++; Clients[Serial].Aisling.EngagedCombat = true; } else { Clients[Serial].Aisling.EngagedCombat = false; } } else { Clients[Serial].Aisling.EngagedCombat = false; if (Clients[Serial].Aisling.Map.Entities[EntityAnimation.ID].EntityType == MapEntity.Type.Player) { var v = from var in Clients[Serial].Aisling.Map.EntityList where var.Location.X == Clients[Serial].Aisling.Map.Entities[EntityAnimation.ID].Location.InfrontOf.X && var.Location.Y == Clients[Serial].Aisling.Map.Entities[EntityAnimation.ID].Location.InfrontOf.Y select var; if (v.Count() > 0) { foreach (var ent in v) { if (!(Clients[Serial].Aisling.Map.Entities[EntityAnimation.ID] as AislingEntity).Targets.Contains(ent.Serial)) { (Clients[Serial].Aisling.Map.Entities[EntityAnimation.ID] as AislingEntity).Targets.Add(ent.Serial); } } } (Clients[Serial].Aisling.Map.Entities[EntityAnimation.ID] as AislingEntity).Targets = new List <uint> ( from var in (Clients[Serial].Aisling.Map.Entities[EntityAnimation.ID] as AislingEntity).Targets where Clients[Serial].Aisling.Map.Entities.ContainsKey(var) select var ); } } } break; #endregion #region Sound Played case ServerAction.SoundPlay: { PlaySound SoundNumber = Packet.Read <PlaySound>(0); Clients[Serial].Aisling.LastSound = new Sounds() { Number = SoundNumber.Number }; if (Clients[Serial].AttackTargetSerial > 0) { Clients[Serial].Aisling.testSer = Clients[Serial].AttackTargetSerial; } } break; #endregion #region Chat Messages case ServerAction.Chat: { Chat ChatMessage = Packet.Read <Chat>(0); Clients[Serial].Aisling.ChatMessages.Add(new Aisling.ChatMessage(Convert.ToBoolean(ChatMessage.Type), ChatMessage.Serial, ChatMessage.Message)); } break; #endregion #region Bar Messages case ServerAction.Bar: { BarMessage BarMessage = Packet.Read <BarMessage>(0); Clients[Serial].Aisling.BarMessages.Add(new Aisling.BarMessage((Aisling.BarMessage.MessageType)BarMessage.Type, BarMessage.Message)); if (BarMessage.Message.value.ToLower().StartsWith("these items are cursed")) { if (Clients[Serial].Aisling.Map.Entities.ContainsKey(Clients[Serial].ItemTargetSerial)) { (Clients[Serial].Aisling.Map.Entities[Clients[Serial].ItemTargetSerial] as Item).IsBanned = true; } } } break; #endregion #region Group case ServerAction.GroupRequest: { GroupRequest Request = Packet.Read <GroupRequest>(0); } break; #endregion #region Remove Appendage case ServerAction.RemoveAppendage: { if (Clients[Serial].Aisling.Body[(Aisling.SpriteBody.Appendage.Slot)Packet[2]] != null) { string ItemRemoved = Clients[Serial].Aisling.Body[(Aisling.SpriteBody.Appendage.Slot)Packet[2]].Name; } Clients[Serial].Aisling.Body[(Aisling.SpriteBody.Appendage.Slot)Packet[2]] = null; } break; #endregion default: { } break; } if (Clients[Serial].Aisling.EngagedCombat) { Clients[Serial].Aisling.test++; Clients[Serial].Aisling.EngagedCombat = false; } } catch { } }