@@ -70,18 +70,6 @@ void CClientResManager::RenderImageEntity(const CNetObj_CustomImageEntity *pPrev
7070 Graphics ()->QuadsEnd ();
7171}
7272
73- void CClientResManager::OnMapLoad ()
74- {
75- for (int i = 0 ; i < m_lResources.size (); i++)
76- {
77- if (m_lResources[i].m_Sample .IsValid ())
78- m_pClient->m_pSounds ->UnloadSample (&m_lResources[i].m_Sample );
79- if (m_lResources[i].m_Texture .IsValid ())
80- Graphics ()->UnloadTexture (&m_lResources[i].m_Texture );
81- }
82- m_lResources.clear ();
83- }
84-
8573void CClientResManager::OnRender ()
8674{
8775 int Num = Client ()->SnapNumItems (IClient::SNAP_CURRENT);
@@ -122,15 +110,11 @@ void CClientResManager::OnMessage(int MsgType, void *pRawMsg)
122110 Console ()->Print (IConsole::OUTPUT_LEVEL_ADDINFO, " resource" , " invalid resource size" );
123111 return ;
124112 }
113+
114+ if (FindResource (*static_cast <const Uuid *>(pMsg->m_Uuid ))) // there couldn't be uuid collision, if that happened, then the server-side resource name must be wrong.
125115 {
126- CClientResource TargetRes;
127- TargetRes.m_Uuid = *static_cast <const Uuid *>(pMsg->m_Uuid );
128- sorted_array<CClientResource>::range r = ::find_binary (m_lResources.all (), TargetRes);
129- if (!r.empty ()) // there couldn't be uuid collision, if that happened, then the server-side resource name must be wrong.
130- {
131- Console ()->Print (IConsole::OUTPUT_LEVEL_ADDINFO, " resource" , " invalid resource uuid" );
132- return ;
133- }
116+ Console ()->Print (IConsole::OUTPUT_LEVEL_ADDINFO, " resource" , " invalid resource uuid" );
117+ return ;
134118 }
135119 CClientResource Resource;
136120 str_copy (Resource.m_aName , pMsg->m_Name , sizeof (Resource.m_aName ));
@@ -146,6 +130,7 @@ void CClientResManager::OnMessage(int MsgType, void *pRawMsg)
146130 mem_copy (&Resource.m_Sha256 , pMsg->m_Sha256 , sizeof (SHA256_DIGEST));
147131 FormatResourcePath (Resource.m_aPath , sizeof (Resource.m_aPath ), Resource.m_aName , false , &Resource.m_Sha256 , &Resource.m_Crc );
148132 FormatResourcePath (Resource.m_aTempPath , sizeof (Resource.m_aTempPath ), Resource.m_aName , true , &Resource.m_Sha256 , &Resource.m_Crc );
133+ Resource.m_DownloadTemp = 0 ;
149134
150135 int Index = m_lResources.add (Resource);
151136 if (!LoadResource (&m_lResources[Index]))
@@ -158,41 +143,38 @@ void CClientResManager::OnMessage(int MsgType, void *pRawMsg)
158143 {
159144 CNetMsg_Sv_CustomResourceData *pMsg = (CNetMsg_Sv_CustomResourceData *) pRawMsg;
160145 Uuid TargetResource = *static_cast <const Uuid *>(pMsg->m_Uuid );
161-
162- CClientResource TargetRes;
163- TargetRes.m_Uuid = TargetResource;
164- sorted_array<CClientResource>::range r = ::find_binary (m_lResources.all (), TargetRes);
165- if (r.empty () || r.size () > 1 ) // there couldn't be uuid collision, if that happened, then the server-side resource name must be wrong.
146+ CClientResource *pResource = FindResource (TargetResource);
147+ if (!pResource)
166148 return ;
167-
168- CClientResource &Resource = r.front ();
169- Resource.m_DownloadedSize += pMsg->m_DataSize ;
170- if (Resource.m_DownloadedSize > Resource.m_DataSize )
149+ pResource->m_DownloadedSize += pMsg->m_DataSize ;
150+ if (pResource->m_DownloadedSize > pResource->m_DataSize )
171151 {
172- io_close (Resource.m_DownloadTemp );
173- Storage ()->RemoveFile (Resource.m_aTempPath , IStorage::TYPE_SAVE);
174- m_lResources.remove (Resource);
152+ io_close (pResource->m_DownloadTemp );
153+ pResource->m_DownloadTemp = 0 ;
154+ Storage ()->RemoveFile (pResource->m_aTempPath , IStorage::TYPE_SAVE);
155+ m_lResources.remove (*pResource);
175156 return ; // invalid!
176157 }
177- io_write (Resource. m_DownloadTemp , pMsg->m_Data , pMsg->m_DataSize );
178- if (Resource. m_DownloadedSize == Resource. m_DataSize )
158+ io_write (pResource-> m_DownloadTemp , pMsg->m_Data , pMsg->m_DataSize );
159+ if (pResource-> m_DownloadedSize == pResource-> m_DataSize )
179160 {
180161 char aBuf[128 ];
181- str_format (aBuf, sizeof (aBuf), Localize (" Resource '%s': download complete" ), Resource. m_aName );
162+ str_format (aBuf, sizeof (aBuf), Localize (" Resource '%s': download complete" ), pResource-> m_aName );
182163 UI ()->DoToast (aBuf);
183- io_close (Resource.m_DownloadTemp );
164+ io_close (pResource->m_DownloadTemp );
165+ pResource->m_DownloadTemp = 0 ;
184166
185- Storage ()->RemoveFile (Resource. m_aPath , IStorage::TYPE_SAVE);
186- Storage ()->RenameFile (Resource. m_aTempPath , Resource. m_aPath , IStorage::TYPE_SAVE);
167+ Storage ()->RemoveFile (pResource-> m_aPath , IStorage::TYPE_SAVE);
168+ Storage ()->RenameFile (pResource-> m_aTempPath , pResource-> m_aPath , IStorage::TYPE_SAVE);
187169
188- if (!LoadResource (&Resource ))
170+ if (!LoadResource (pResource ))
189171 {
190- Storage ()->RemoveFile (Resource. m_aPath , IStorage::TYPE_SAVE);
191- m_lResources.remove (Resource );
172+ Storage ()->RemoveFile (pResource-> m_aPath , IStorage::TYPE_SAVE);
173+ m_lResources.remove (*pResource );
192174 return ; // invalid!
193175 }
194176 }
195- else if ((pMsg->m_ChunkIndex + 1 ) % Resource. m_ChunkPerRequest == 0 )
177+ else if ((pMsg->m_ChunkIndex + 1 ) % pResource-> m_ChunkPerRequest == 0 )
196178 RequestDownload (&TargetResource);
197179 }
198180}
@@ -220,42 +202,28 @@ void CClientResManager::OnStateChange(int NewState, int OldState)
220202 }
221203}
222204
223- bool CClientResManager::IsResourceSound (Uuid ResID )
205+ CClientResManager::CClientResource * CClientResManager::FindResource (Uuid ResourceID )
224206{
225- CClientResource Res;
226- Res.m_Uuid = ResID;
227- sorted_array<CClientResource>::range r = ::find_binary (m_lResources.all (), Res);
228- if (r.empty () || r.size () > 1 ) // there couldn't be uuid collision, if that happened, then the server-side resource name must be wrong.
229- return false ;
230- return r.front ().m_Type == RESOURCE_SOUND;
231- }
232-
233- bool CClientResManager::IsResourceImage (Uuid ResID)
234- {
235- CClientResource Res;
236- Res.m_Uuid = ResID;
237- sorted_array<CClientResource>::range r = ::find_binary (m_lResources.all (), Res);
238- if (r.empty () || r.size () > 1 ) // there couldn't be uuid collision, if that happened, then the server-side resource name must be wrong.
239- return false ;
240- return r.front ().m_Type == RESOURCE_IMAGE;
207+ for (int i = 0 ; i < m_lResources.size (); i++)
208+ {
209+ if (m_lResources[i].m_Uuid == ResourceID)
210+ return &m_lResources[i];
211+ }
212+ return nullptr ;
241213}
242214
243215ISound::CSampleHandle CClientResManager::GetResourceSample (Uuid ResID)
244216{
245- CClientResource Res;
246- Res.m_Uuid = ResID;
247- sorted_array<CClientResource>::range r = ::find_binary (m_lResources.all (), Res);
248- if (r.empty () || r.size () > 1 ) // there couldn't be uuid collision, if that happened, then the server-side resource name must be wrong.
249- return ISound::CSampleHandle ();
250- return r.front ().m_Sample ;
217+ CClientResource *pResource = FindResource (ResID);
218+ if (pResource)
219+ return pResource->m_Sample ;
220+ return ISound::CSampleHandle ();
251221}
252222
253223IGraphics::CTextureHandle CClientResManager::GetResourceTexture (Uuid ResID)
254224{
255- CClientResource Res;
256- Res.m_Uuid = ResID;
257- sorted_array<CClientResource>::range r = ::find_binary (m_lResources.all (), Res);
258- if (r.empty () || r.size () > 1 ) // there couldn't be uuid collision, if that happened, then the server-side resource name must be wrong.
259- return IGraphics::CTextureHandle ();
260- return r.front ().m_Texture ;
225+ CClientResource *pResource = FindResource (ResID);
226+ if (pResource)
227+ return pResource->m_Texture ;
228+ return IGraphics::CTextureHandle ();
261229}
0 commit comments