1+ #include " ScreenPanel.h"
2+
3+ ScreenPanel::ScreenPanel ()
4+ {
5+ }
6+
7+ ScreenPanel::~ScreenPanel ()
8+ {
9+ if (pScreenEntity.IsValid ()) {
10+ pScreenEntity->Despawn ();
11+ }
12+ }
13+
14+ void ScreenPanel::Create (Color color, int size)
15+ {
16+ m_col = color;
17+ m_size = size;
18+
19+ pScreenEntity.Set ((CPointWorldText*)(CreateEntityByName (" point_worldtext" ).GetPtr ()));
20+ if (!pScreenEntity) return ;
21+
22+ CEntityKeyValues* pMenuKV = new CEntityKeyValues ();
23+
24+ pMenuKV->SetBool (" enabled" , false );
25+ pMenuKV->SetFloat (" world_units_per_pixel" , (0.25 / 300 ) * size);
26+ pMenuKV->SetInt (" justify_horizontal" , 0 );
27+ pMenuKV->SetInt (" justify_vertical" , 2 );
28+ pMenuKV->SetInt (" reorient_mode" , 0 );
29+ pMenuKV->SetInt (" fullbright" , 1 );
30+ pMenuKV->SetFloat (" font_size" , size);
31+ pMenuKV->SetColor (" color" , color);
32+
33+ pScreenEntity->DispatchSpawn (pMenuKV);
34+ }
35+
36+ void ScreenPanel::SetupViewForPlayer (Player* player)
37+ {
38+ m_player = player;
39+
40+ if (!pScreenEntity) return ;
41+ if (!player) return ;
42+ if (player->IsFakeClient ()) return ;
43+
44+ CBaseViewModel* pViewModel = player->EnsureCustomView (1 );
45+ if (!pViewModel) return ;
46+
47+ pScreenEntity->SetParent (pViewModel);
48+ pScreenEntity->m_hOwnerEntity (pViewModel->GetRefEHandle ());
49+ }
50+
51+ void ScreenPanel::SetText (std::string text)
52+ {
53+ m_text = text;
54+
55+ if (!pScreenEntity) return ;
56+
57+ pScreenEntity->SetText (m_text.c_str ());
58+ pScreenEntity->Enable ();
59+ }
60+
61+ void ScreenPanel::SetPosition (float posX, float posY)
62+ {
63+ m_posX = posX;
64+ m_posY = posY;
65+
66+ if (!m_player) return ;
67+ if (m_player->IsFakeClient ()) return ;
68+
69+ CCSPlayerPawn* pawn = m_player->GetPlayerPawn ();
70+ if (!pawn) return ;
71+ if (pawn->m_lifeState () == 2 ) {
72+ if (m_player->GetPlayerController ()->m_bControllingBot ()) {
73+ return ;
74+ } else {
75+ auto pPawn = m_player->GetPawn ();
76+ if (!pPawn) return ;
77+
78+ auto observerPawn = pPawn->m_pObserverServices ->m_hObserverTarget ();
79+ if (!observerPawn) return ;
80+
81+ auto observerController = ((CCSPlayerPawn*)(observerPawn.Get ()))->m_hOriginalController ();
82+ if (!observerController) return ;
83+
84+ auto observer = g_playerManager->GetPlayer (observerController->entindex () - 1 );
85+ if (!observer) return ;
86+ pawn = observer->GetPlayerPawn ();
87+ }
88+ }
89+ if (!pawn) return ;
90+
91+ QAngle eyeAngles = pawn->m_angEyeAngles ();
92+ Vector fwd, right, up;
93+ AngleVectors (eyeAngles, &fwd, &right, &up);
94+
95+ Vector eyePos (0.0 , 0.0 , 0.0 );
96+ eyePos += fwd * 7.12 ;
97+ eyePos += right * (-9.3 + (posX * 18.66 ));
98+ eyePos += up * (-4.82 + (posY * 10.47 ));
99+
100+ QAngle ang (0 , eyeAngles.y + 270 , 90 - eyeAngles.x );
101+
102+ eyePos += pawn->m_CBodyComponent ->m_pSceneNode ->m_vecAbsOrigin () + Vector (0 , 0 , pawn->m_vecViewOffset ->m_vecZ ());
103+
104+ pScreenEntity->Teleport (&eyePos, &ang, nullptr );
105+ }
106+
107+ bool ScreenPanel::IsValidEntity ()
108+ {
109+ return pScreenEntity.IsValid ();
110+ }
111+
112+ void ScreenPanel::RegeneratePanel (bool recreate)
113+ {
114+ if (recreate) {
115+ if (pScreenEntity.IsValid ()) pScreenEntity->Despawn ();
116+
117+ Create (m_col, m_size);
118+ SetupViewForPlayer (m_player);
119+ SetText (m_text);
120+ SetPosition (m_posX, m_posY);
121+ } else {
122+ SetupViewForPlayer (m_player);
123+ SetPosition (m_posX, m_posY);
124+ }
125+ }
126+
127+ Player* ScreenPanel::GetPlayer ()
128+ {
129+ return m_player;
130+ }
131+
132+ int ScreenPanel::GetEntityIndex ()
133+ {
134+ if (!pScreenEntity) return 0 ;
135+
136+ return pScreenEntity->GetEntityIndex ().Get ();
137+ }
138+
139+ bool ScreenPanel::IsRenderingTo (CHandle<CBaseEntity> renderingTo)
140+ {
141+ return renderingTo == pRenderingTo;
142+ }
143+
144+ void ScreenPanel::SetRenderingTo (CBaseEntity* ent)
145+ {
146+ pRenderingTo.Set (ent);
147+ }
0 commit comments