public NPC(NPCData data) : base(EOGame.Instance) { Index = data.Index; X = data.X; Y = data.Y; Direction = data.Direction; Data = (NPCRecord)World.Instance.ENF.Data[data.ID]; HP = Data.HP; bool success = true; npcSheet = new EONPCSpriteSheet(this); int tries = 0; do { try { //attempt to get standing frame 1. It will have non-black pixels if it exists. Frame = NPCFrame.StandingFrame1; Texture2D tmp = npcSheet.GetNPCTexture(); Color[] tmpData = new Color[tmp.Width * tmp.Height]; tmp.GetData(tmpData); hasStandFrame1 = tmpData.Any(_c => _c.R != 0 || _c.G != 0 || _c.B != 0); //get the first non-transparent pixel to determine offsets for name labels and damage counters Frame = NPCFrame.Standing; tmp = npcSheet.GetNPCTexture(); tmpData = new Color[tmp.Width * tmp.Height]; tmp.GetData(tmpData); int i = 0; while (i < tmpData.Length && tmpData[i].A == 0) { i++; } TopPixel = i == tmpData.Length - 1 ? 0 : i / tmp.Height; } //this block throws errors sometimes..no idea why. Keep looping until it works. catch (InvalidOperationException) { success = false; tries++; } } while (!success && tries < 3); if (tries >= 3) { throw new InvalidOperationException("Something weird happened initializing this NPC."); } m_chatBubble = new EOChatBubble(this); m_damageCounter = new DamageCounter(this, GetType()); }
public NPC(NPCData data) : base(EOGame.Instance) { ApplyData(data); bool success = true; npcSheet = new EONPCSpriteSheet(this); int tries = 0; do { try { //attempt to get standing frame 1. It will have non-black pixels if it exists. Frame = NPCFrame.StandingFrame1; Texture2D tmp = npcSheet.GetNPCTexture(); Color[] tmpData = new Color[tmp.Width*tmp.Height]; tmp.GetData(tmpData); hasStandFrame1 = tmpData.Any(_c => _c.R != 0 || _c.G != 0 || _c.B != 0); //get the first non-transparent pixel to determine offsets for name labels and damage counters Frame = NPCFrame.Standing; tmp = npcSheet.GetNPCTexture(); tmpData = new Color[tmp.Width*tmp.Height]; tmp.GetData(tmpData); int i = 0; while (i < tmpData.Length && tmpData[i].A == 0) i++; TopPixel = i == tmpData.Length - 1 ? 0 : i/tmp.Height; } //this block throws errors sometimes..no idea why. Keep looping until it works. catch (InvalidOperationException) { success = false; tries++; } } while (!success && tries < 3); if(tries >= 3) throw new InvalidOperationException("Something weird happened initializing this NPC."); m_chatBubble = new EOChatBubble(this); m_damageCounter = new DamageCounter(this, GetType()); }
/// <summary> /// Construct a character renderer in-game /// </summary> /// <param name="charToRender">The character data that should be wrapped by this renderer</param> public EOCharacterRenderer(Character charToRender) { //this has been happening when shit gets disconnected due to invalid sequence or internal packet id if (charToRender == null) { EOGame.Instance.LostConnectionDialog(); return; } spriteSheet = new EOSpriteSheet(charToRender); _char = charToRender; _data = charToRender.RenderData; Texture2D tmpSkin = spriteSheet.GetSkin(false, out m_skinSourceRect); if (_char != World.Instance.MainPlayer.ActiveCharacter) { drawArea = new Rectangle( _char.OffsetX + 304 - World.Instance.MainPlayer.ActiveCharacter.OffsetX, _char.OffsetY + 91 - World.Instance.MainPlayer.ActiveCharacter.OffsetY, m_skinSourceRect.Width, m_skinSourceRect.Height); //set based on size of the sprite and location of charToRender } else { drawArea = new Rectangle((618 - m_skinSourceRect.Width) / 2 + 4, (298 - m_skinSourceRect.Height) / 2 - 29, m_skinSourceRect.Width, m_skinSourceRect.Height); noLocUpdate = true; //make sure not to update the drawArea rectangle in the update method } Data.SetUpdate(true); _prevKeyState = Keyboard.GetState(); //get the top pixel! Color[] skinData = new Color[m_skinSourceRect.Width * m_skinSourceRect.Height]; tmpSkin.GetData(0, m_skinSourceRect, skinData, 0, skinData.Length); int i = 0; while (i < skinData.Length && skinData[i].A == 0) i++; //account for adjustment in drawing the skin in the draw method TopPixel = (Data.gender == 0 ? 12 : 13) + (i == skinData.Length - 1 ? 0 : i / m_skinSourceRect.Height); m_chatBubble = new EOChatBubble(this); m_damageCounter = new DamageCounter(this, GetType()); }