#include #include #include #include #include // get_angle #include #include #include #include "emoticon.h" CEmoticon::CEmoticon() { OnReset(); } void CEmoticon::ConKeyEmoticon(IConsole::IResult *pResult, void *pUserData) { CEmoticon *pSelf = (CEmoticon *)pUserData; if(pSelf->Client()->State() != IClient::STATE_DEMOPLAYBACK) ((CEmoticon *)pUserData)->m_Active = pResult->GetInteger(0) != 0; } void CEmoticon::ConEmote(IConsole::IResult *pResult, void *pUserData) { ((CEmoticon *)pUserData)->Emote(pResult->GetInteger(0)); } void CEmoticon::OnConsoleInit() { Console()->Register("+emote", "", CFGFLAG_CLIENT, ConKeyEmoticon, this, "Open emote selector"); Console()->Register("emote", "i", CFGFLAG_CLIENT, ConEmote, this, "Use emote"); } void CEmoticon::OnReset() { m_WasActive = false; m_Active = false; m_SelectedEmote = -1; } void CEmoticon::OnMessage(int MsgType, void *pRawMsg) { } bool CEmoticon::OnMouseMove(float x, float y) { if(!m_Active) return false; m_SelectorMouse += vec2(x,y); return true; } void CEmoticon::DrawCircle(float x, float y, float r, int Segments) { IGraphics::CFreeformItem Array[32]; int NumItems = 0; float FSegments = (float)Segments; for(int i = 0; i < Segments; i+=2) { float a1 = i/FSegments * 2*pi; float a2 = (i+1)/FSegments * 2*pi; float a3 = (i+2)/FSegments * 2*pi; float Ca1 = cosf(a1); float Ca2 = cosf(a2); float Ca3 = cosf(a3); float Sa1 = sinf(a1); float Sa2 = sinf(a2); float Sa3 = sinf(a3); Array[NumItems++] = IGraphics::CFreeformItem( x, y, x+Ca1*r, y+Sa1*r, x+Ca3*r, y+Sa3*r, x+Ca2*r, y+Sa2*r); if(NumItems == 32) { m_pClient->Graphics()->QuadsDrawFreeform(Array, 32); NumItems = 0; } } if(NumItems) m_pClient->Graphics()->QuadsDrawFreeform(Array, NumItems); } void CEmoticon::OnRender() { if(!m_Active) { if(m_WasActive && m_SelectedEmote != -1) Emote(m_SelectedEmote); m_WasActive = false; return; } m_WasActive = true; int x, y; Input()->MouseRelative(&x, &y); m_SelectorMouse.x += x; m_SelectorMouse.y += y; if (length(m_SelectorMouse) > 140) m_SelectorMouse = normalize(m_SelectorMouse) * 140; float SelectedAngle = GetAngle(m_SelectorMouse) + 2*pi/24; if (SelectedAngle < 0) SelectedAngle += 2*pi; if (length(m_SelectorMouse) > 100) m_SelectedEmote = (int)(SelectedAngle / (2*pi) * 12.0f); CUIRect Screen = *UI()->Screen(); Graphics()->MapScreen(Screen.x, Screen.y, Screen.w, Screen.h); Graphics()->BlendNormal(); Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(0,0,0,0.3f); DrawCircle(Screen.w/2, Screen.h/2, 160, 64); Graphics()->QuadsEnd(); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_EMOTICONS].m_Id); Graphics()->QuadsBegin(); for (int i = 0; i < 12; i++) { float Angle = 2*pi*i/12.0; if (Angle > pi) Angle -= 2*pi; bool Selected = m_SelectedEmote == i; float Size = Selected ? 96 : 64; float NudgeX = 120 * cosf(Angle); float NudgeY = 120 * sinf(Angle); RenderTools()->SelectSprite(SPRITE_OOP + i); IGraphics::CQuadItem QuadItem(Screen.w/2 + NudgeX, Screen.h/2 + NudgeY, Size, Size); Graphics()->QuadsDraw(&QuadItem, 1); } Graphics()->QuadsEnd(); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_CURSOR].m_Id); Graphics()->QuadsBegin(); Graphics()->SetColor(1,1,1,1); IGraphics::CQuadItem QuadItem(m_SelectorMouse.x+Screen.w/2,m_SelectorMouse.y+Screen.h/2,24,24); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); } void CEmoticon::Emote(int Emoticon) { CNetMsg_Cl_Emoticon Msg; Msg.m_Emoticon = Emoticon; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); }