|
You last visited: Today at 04:18
Advertisement
[Release] Chat Emoji (Devkit)
Discussion on [Release] Chat Emoji (Devkit) within the SRO PServer Guides & Releases forum part of the SRO Private Server category.
08/31/2022, 03:16
|
#1
|
elite*gold: 147
Join Date: Oct 2017
Posts: 548
Received Thanks: 882
|
[Release] Chat Emoji (Devkit)
Hey,
Today iam releasing a chat emoji based at devkit. Actually there are 2 ways to achieve such a thing easiest one will be the one which will be released today. the other one is hooking d3d write text thing , i already made a good progress in the second way but it ended up fucking textures so i gave up on it.
Basically what we gonna do today is detecting the exact height and width of the key of the emoji based at its location at the chatwindow then we gonna replace a ddj over it.
the first thing we can start at is creating our slots, the classes can be found at the end of thread. here we creating 2 dimensional array of 24 items which represents the biggest chat size could be,also intinializing emoji list with desired emojis.
Code:
void CIFChatViewer::initializeEmojis()
{
CIFEmojiSlot** emojiSlots = new CIFEmojiSlot*[24];
RECT emojiSlotsRect = {0,0,1,1};
for(int i=0;i<24;i++)
emojiSlots[i] = (CIFEmojiSlot*)CGWnd::CreateInstance(g_pCGInterface, GFX_RUNTIME_CLASS(CIFEmojiSlot), emojiSlotsRect, 14300+i, 0);
emojiList[":P"] = "interface\\bimbum\\tongue.ddj";
emojiList[":D"] = "interface\\bimbum\\smile2.ddj";
emojiList[":)"] = "interface\\bimbum\\smile1.ddj";
}
the actual juice is here, this function will be looping over all shown lines in of the active windows and checks if any of them contains special key defined at emojilist then it will be replace the key by a ddj
Code:
void CIFChatViewer::emojiHandler()
{
//get active chat
CIFTextBox* chatBox = m_ChatLists[0];
if(!chatBox || !chatBox->IsVisible())
{
for(int i=16;i<=19;i++)
{
chatBox = m_ChatLists[19-i];
if(chatBox && chatBox->IsVisible())
break;
}
}
CIFListCtrl* pList = m_CurrentActiveChatlist;
int totalIndexes = *(int*)((int)pList + 0x3A4);
int firstAppearIndex = *(int*)((int)pList + 0x380);
for(int i = firstAppearIndex;i<firstAppearIndex+totalIndexes;i++)
{
CIFListCtrl::SLineOfText* line = pList->GetTextByIndex(i);
if(line)
{
std::n_wstring str;
line->m_font->GetText(&str);
int k =0;
if(!str.empty())
{
for (std::map<std::string, std::string>::iterator it = emojiList.begin();
it != emojiList.end(); ++it) {
//first thing we checking if generally the line contains any of the emojis
if (str.rfind(TO_WSTRING(it->first).c_str()) != std::string::npos) {
hideEmojisByLine(i - firstAppearIndex);
//if it contains it will be looping over string to check if the found emoji key meets our conditions
for (int j = 0; j < str.length(); j++) {
if(k ==5) // number of emojis per one line
break;
if (str.substr(j, TO_WSTRING(it->first).length()) == TO_WSTRING(it->first).c_str()) {
std::n_wstring charBefore = str.substr(j - 1, 1);
std::n_wstring charAfter = str.substr(j + 2, 1);
//make sure the emoji meets our conditions.
if ((charBefore == L" " || charBefore == L":") &&
(charAfter == L" " || charAfter.empty())) {
int width = getWidth(str, pList, it->first,j);
renderEmoji(i - firstAppearIndex,totalIndexes,chatBox->GetPos().x + width,chatBox->GetPos().y,pList->GetNumberOfItems(),it->second,k);
k++;
}
}
}
}
}
}
}
}
}
thanks to b0ykoe from here we getting the exact width along to the special key.
Code:
int CIFChatViewer::getWidth(std::n_wstring str,CIFListCtrl* pList,std::string emojiCode,int index)
{
std::n_wstring tempStr;
CIFListCtrl::SLineOfText* tempLine;
int Width=0;
std::n_wstring tempText = str.substr(0, index);
if(pList)
{
tempLine = pList->GetTextByIndex(0);
if(tempLine)
{
CGFontTexture* cgFont = tempLine->m_font;
if(cgFont)
{
cgFont->GetText(&tempStr);
cgFont->sub_8B3B60(&tempText);
Width = cgFont->GetDimensions().width;
cgFont->sub_8B3B60(&tempStr);
}
}
}
return Width;
}
Note:
the full codes can be found at the end of thread, keep in mind that the current emojis per line are 5, however you can control them easily.
all given there are offsets so that you can populate devkit classes with them
usage:
Code:
CIFChatViewer* chatView = (CIFChatViewer*)g_pCGInterface->m_IRM.GetResObj(1, 1);
chatView->hideEmojis();
chatView->emojiHandler();
so where to insert that code ?
well its up to you. you may just insert it in any rendering function or hook all these functions (it wont be provided at the code)
Code:
0063AACF
00656160
00656060
00656160
0063AA50
0064CC30
00656324
Codes:
|
|
|
08/31/2022, 11:37
|
#2
|
elite*gold: 0
Join Date: Aug 2008
Posts: 59
Received Thanks: 5
|
Dance emoji like Audition ko bac ?
|
|
|
08/31/2022, 12:25
|
#3
|
elite*gold: 0
Join Date: Dec 2013
Posts: 66
Received Thanks: 6
|
bro you are the bottom of the man i love you discord name exadus
|
|
|
08/31/2022, 12:40
|
#4
|
elite*gold: 100
Join Date: Apr 2015
Posts: 956
Received Thanks: 1,174
|
King as always
|
|
|
09/01/2022, 18:21
|
#5
|
elite*gold: 0
Join Date: Jun 2021
Posts: 23
Received Thanks: 3
|
CIFChatViewer* chatView = (CIFChatViewer*)g_pCGInterface->m_IRM.GetResObj(1, 1);
chatView->hideEmojis();
chatView->emojiHandler();
when using this with rendering functions get crash.
what we need for active it?
we need some hook for work it?
can share a little code?
|
|
|
09/01/2022, 18:29
|
#6
|
elite*gold: 147
Join Date: Oct 2017
Posts: 548
Received Thanks: 882
|
Quote:
Originally Posted by Venom7x
CIFChatViewer* chatView = (CIFChatViewer*)g_pCGInterface->m_IRM.GetResObj(1, 1);
chatView->hideEmojis();
chatView->emojiHandler();
when using this with rendering functions get crash.
what we need for active it?
we need some hook for work it?
can share a little code?
|
forget to mention to override the chat class at the dll main
Code:
OverrideObject<CIFChatViewer, 0x00EEC168>();
edit: (its optional) few edits at the code and it wont be needing overriding
|
|
|
09/01/2022, 18:39
|
#7
|
elite*gold: 0
Join Date: Jun 2021
Posts: 23
Received Thanks: 3
|
CIFChatViewer* chatView = (CIFChatViewer*)g_pCGInterface->m_IRM.GetResObj(1, 1);
chatView->initializeEmojis();
chatView->hideEmojis();
chatView->emojiHandler();
using this. Thanks for share old friend.
|
|
|
09/01/2022, 18:51
|
#8
|
elite*gold: 147
Join Date: Oct 2017
Posts: 548
Received Thanks: 882
|
Quote:
Originally Posted by Venom7x
ah i was did it. but hideslots is giving error.
like here
|
the window is null, that means:
1- the pointer pointed to the parent isnt g_pCGInterface
Code:
emojiSlots[i] = (CIFEmojiSlot*)CGWnd::CreateInstance([B]g_pCGInterface[/B], GFX_RUNTIME_CLASS(CIFEmojiSlot), emojiSlotsRect, 14300+i, 0);
2- you didn't create instance at all
|
|
|
09/02/2022, 13:11
|
#9
|
elite*gold: 0
Join Date: Mar 2020
Posts: 18
Received Thanks: 2
|
anyone install for me ?
|
|
|
09/02/2022, 13:12
|
#10
|
elite*gold: 70
Join Date: May 2014
Posts: 206
Received Thanks: 20
|
unbelievable!
thanks for the great release!
|
|
|
09/02/2022, 22:57
|
#11
|
elite*gold: 0
Join Date: Oct 2007
Posts: 47
Received Thanks: 29
|
Quote:
Originally Posted by bimbum*
Hey,
Today iam releasing a chat emoji based at devkit. Actually there are 2 ways to achieve such a thing easiest one will be the one which will be released today. the other one is hooking d3d write text thing , i already made a good progress in the second way but it ended up fucking textures so i gave up on it.
Basically what we gonna do today is detecting the exact height and width of the key of the emoji based at its location at the chatwindow then we gonna replace a ddj over it.
the first thing we can start at is creating our slots, the classes can be found at the end of thread. here we creating 2 dimensional array of 24 items which represents the biggest chat size could be,also intinializing emoji list with desired emojis.
Code:
void CIFChatViewer::initializeEmojis()
{
CIFEmojiSlot** emojiSlots = new CIFEmojiSlot*[24];
RECT emojiSlotsRect = {0,0,1,1};
for(int i=0;i<24;i++)
emojiSlots[i] = (CIFEmojiSlot*)CGWnd::CreateInstance(g_pCGInterface, GFX_RUNTIME_CLASS(CIFEmojiSlot), emojiSlotsRect, 14300+i, 0);
emojiList[":P"] = "interface\\bimbum\\tongue.ddj";
emojiList[":D"] = "interface\\bimbum\\smile2.ddj";
emojiList[":)"] = "interface\\bimbum\\smile1.ddj";
}
the actual juice is here, this function will be looping over all shown lines in of the active windows and checks if any of them contains special key defined at emojilist then it will be replace the key by a ddj
Code:
void CIFChatViewer::emojiHandler()
{
//get active chat
CIFTextBox* chatBox = m_ChatLists[0];
if(!chatBox || !chatBox->IsVisible())
{
for(int i=16;i<=19;i++)
{
chatBox = m_ChatLists[19-i];
if(chatBox && chatBox->IsVisible())
break;
}
}
CIFListCtrl* pList = m_CurrentActiveChatlist;
int totalIndexes = *(int*)((int)pList + 0x3A4);
int firstAppearIndex = *(int*)((int)pList + 0x380);
for(int i = firstAppearIndex;i<firstAppearIndex+totalIndexes;i++)
{
CIFListCtrl::SLineOfText* line = pList->GetTextByIndex(i);
if(line)
{
std::n_wstring str;
line->m_font->GetText(&str);
int k =0;
if(!str.empty())
{
for (std::map<std::string, std::string>::iterator it = emojiList.begin();
it != emojiList.end(); ++it) {
//first thing we checking if generally the line contains any of the emojis
if (str.rfind(TO_WSTRING(it->first).c_str()) != std::string::npos) {
hideEmojisByLine(i - firstAppearIndex);
//if it contains it will be looping over string to check if the found emoji key meets our conditions
for (int j = 0; j < str.length(); j++) {
if(k ==5) // number of emojis per one line
break;
if (str.substr(j, TO_WSTRING(it->first).length()) == TO_WSTRING(it->first).c_str()) {
std::n_wstring charBefore = str.substr(j - 1, 1);
std::n_wstring charAfter = str.substr(j + 2, 1);
//make sure the emoji meets our conditions.
if ((charBefore == L" " || charBefore == L":") &&
(charAfter == L" " || charAfter.empty())) {
int width = getWidth(str, pList, it->first,j);
renderEmoji(i - firstAppearIndex,totalIndexes,chatBox->GetPos().x + width,chatBox->GetPos().y,pList->GetNumberOfItems(),it->second,k);
k++;
}
}
}
}
}
}
}
}
}
thanks to b0ykoe from here we getting the exact width along to the special key.
Code:
int CIFChatViewer::getWidth(std::n_wstring str,CIFListCtrl* pList,std::string emojiCode,int index)
{
std::n_wstring tempStr;
CIFListCtrl::SLineOfText* tempLine;
int Width=0;
std::n_wstring tempText = str.substr(0, index);
if(pList)
{
tempLine = pList->GetTextByIndex(0);
if(tempLine)
{
CGFontTexture* cgFont = tempLine->m_font;
if(cgFont)
{
cgFont->GetText(&tempStr);
cgFont->sub_8B3B60(&tempText);
Width = cgFont->GetDimensions().width;
cgFont->sub_8B3B60(&tempStr);
}
}
}
return Width;
}
Note:
the full codes can be found at the end of thread, keep in mind that the current emojis per line are 5, however you can control them easily.
all given there are offsets so that you can populate devkit classes with them
usage:
Code:
CIFChatViewer* chatView = (CIFChatViewer*)g_pCGInterface->m_IRM.GetResObj(1, 1);
chatView->hideEmojis();
chatView->emojiHandler();
so where to insert that code ?
well its up to you. you may just insert it in any rendering function or hook all these functions (it wont be provided at the code)
Code:
0063AACF
00656160
00656060
00656160
0063AA50
0064CC30
00656324
Codes:
|
Nice Release Bro as always Top .... Thanks
|
|
|
09/03/2022, 17:01
|
#12
|
elite*gold: 0
Join Date: Dec 2015
Posts: 41
Received Thanks: 2
|
Quote:
Originally Posted by bimbum*
Hey,
Today iam releasing a chat emoji based at devkit. Actually there are 2 ways to achieve such a thing easiest one will be the one which will be released today. the other one is hooking d3d write text thing , i already made a good progress in the second way but it ended up fucking textures so i gave up on it.
Basically what we gonna do today is detecting the exact height and width of the key of the emoji based at its location at the chatwindow then we gonna replace a ddj over it.
the first thing we can start at is creating our slots, the classes can be found at the end of thread. here we creating 2 dimensional array of 24 items which represents the biggest chat size could be,also intinializing emoji list with desired emojis.
Code:
void CIFChatViewer::initializeEmojis()
{
CIFEmojiSlot** emojiSlots = new CIFEmojiSlot*[24];
RECT emojiSlotsRect = {0,0,1,1};
for(int i=0;i<24;i++)
emojiSlots[i] = (CIFEmojiSlot*)CGWnd::CreateInstance(g_pCGInterface, GFX_RUNTIME_CLASS(CIFEmojiSlot), emojiSlotsRect, 14300+i, 0);
emojiList[":P"] = "interface\\bimbum\\tongue.ddj";
emojiList[":D"] = "interface\\bimbum\\smile2.ddj";
emojiList[":)"] = "interface\\bimbum\\smile1.ddj";
}
the actual juice is here, this function will be looping over all shown lines in of the active windows and checks if any of them contains special key defined at emojilist then it will be replace the key by a ddj
Code:
void CIFChatViewer::emojiHandler()
{
//get active chat
CIFTextBox* chatBox = m_ChatLists[0];
if(!chatBox || !chatBox->IsVisible())
{
for(int i=16;i<=19;i++)
{
chatBox = m_ChatLists[19-i];
if(chatBox && chatBox->IsVisible())
break;
}
}
CIFListCtrl* pList = m_CurrentActiveChatlist;
int totalIndexes = *(int*)((int)pList + 0x3A4);
int firstAppearIndex = *(int*)((int)pList + 0x380);
for(int i = firstAppearIndex;i<firstAppearIndex+totalIndexes;i++)
{
CIFListCtrl::SLineOfText* line = pList->GetTextByIndex(i);
if(line)
{
std::n_wstring str;
line->m_font->GetText(&str);
int k =0;
if(!str.empty())
{
for (std::map<std::string, std::string>::iterator it = emojiList.begin();
it != emojiList.end(); ++it) {
//first thing we checking if generally the line contains any of the emojis
if (str.rfind(TO_WSTRING(it->first).c_str()) != std::string::npos) {
hideEmojisByLine(i - firstAppearIndex);
//if it contains it will be looping over string to check if the found emoji key meets our conditions
for (int j = 0; j < str.length(); j++) {
if(k ==5) // number of emojis per one line
break;
if (str.substr(j, TO_WSTRING(it->first).length()) == TO_WSTRING(it->first).c_str()) {
std::n_wstring charBefore = str.substr(j - 1, 1);
std::n_wstring charAfter = str.substr(j + 2, 1);
//make sure the emoji meets our conditions.
if ((charBefore == L" " || charBefore == L":") &&
(charAfter == L" " || charAfter.empty())) {
int width = getWidth(str, pList, it->first,j);
renderEmoji(i - firstAppearIndex,totalIndexes,chatBox->GetPos().x + width,chatBox->GetPos().y,pList->GetNumberOfItems(),it->second,k);
k++;
}
}
}
}
}
}
}
}
}
thanks to b0ykoe from here we getting the exact width along to the special key.
Code:
int CIFChatViewer::getWidth(std::n_wstring str,CIFListCtrl* pList,std::string emojiCode,int index)
{
std::n_wstring tempStr;
CIFListCtrl::SLineOfText* tempLine;
int Width=0;
std::n_wstring tempText = str.substr(0, index);
if(pList)
{
tempLine = pList->GetTextByIndex(0);
if(tempLine)
{
CGFontTexture* cgFont = tempLine->m_font;
if(cgFont)
{
cgFont->GetText(&tempStr);
cgFont->sub_8B3B60(&tempText);
Width = cgFont->GetDimensions().width;
cgFont->sub_8B3B60(&tempStr);
}
}
}
return Width;
}
Note:
the full codes can be found at the end of thread, keep in mind that the current emojis per line are 5, however you can control them easily.
all given there are offsets so that you can populate devkit classes with them
usage:
Code:
CIFChatViewer* chatView = (CIFChatViewer*)g_pCGInterface->m_IRM.GetResObj(1, 1);
chatView->hideEmojis();
chatView->emojiHandler();
so where to insert that code ?
well its up to you. you may just insert it in any rendering function or hook all these functions (it wont be provided at the code)
Code:
0063AACF
00656160
00656060
00656160
0063AA50
0064CC30
00656324
Codes:
|
thanks for you but can make a video to help me how to use Devkit
Quote:
Originally Posted by bimbum*
Hey,
Today iam releasing a chat emoji based at devkit. Actually there are 2 ways to achieve such a thing easiest one will be the one which will be released today. the other one is hooking d3d write text thing , i already made a good progress in the second way but it ended up fucking textures so i gave up on it.
Basically what we gonna do today is detecting the exact height and width of the key of the emoji based at its location at the chatwindow then we gonna replace a ddj over it.
the first thing we can start at is creating our slots, the classes can be found at the end of thread. here we creating 2 dimensional array of 24 items which represents the biggest chat size could be,also intinializing emoji list with desired emojis.
Code:
void CIFChatViewer::initializeEmojis()
{
CIFEmojiSlot** emojiSlots = new CIFEmojiSlot*[24];
RECT emojiSlotsRect = {0,0,1,1};
for(int i=0;i<24;i++)
emojiSlots[i] = (CIFEmojiSlot*)CGWnd::CreateInstance(g_pCGInterface, GFX_RUNTIME_CLASS(CIFEmojiSlot), emojiSlotsRect, 14300+i, 0);
emojiList[":P"] = "interface\\bimbum\\tongue.ddj";
emojiList[":D"] = "interface\\bimbum\\smile2.ddj";
emojiList[":)"] = "interface\\bimbum\\smile1.ddj";
}
the actual juice is here, this function will be looping over all shown lines in of the active windows and checks if any of them contains special key defined at emojilist then it will be replace the key by a ddj
Code:
void CIFChatViewer::emojiHandler()
{
//get active chat
CIFTextBox* chatBox = m_ChatLists[0];
if(!chatBox || !chatBox->IsVisible())
{
for(int i=16;i<=19;i++)
{
chatBox = m_ChatLists[19-i];
if(chatBox && chatBox->IsVisible())
break;
}
}
CIFListCtrl* pList = m_CurrentActiveChatlist;
int totalIndexes = *(int*)((int)pList + 0x3A4);
int firstAppearIndex = *(int*)((int)pList + 0x380);
for(int i = firstAppearIndex;i<firstAppearIndex+totalIndexes;i++)
{
CIFListCtrl::SLineOfText* line = pList->GetTextByIndex(i);
if(line)
{
std::n_wstring str;
line->m_font->GetText(&str);
int k =0;
if(!str.empty())
{
for (std::map<std::string, std::string>::iterator it = emojiList.begin();
it != emojiList.end(); ++it) {
//first thing we checking if generally the line contains any of the emojis
if (str.rfind(TO_WSTRING(it->first).c_str()) != std::string::npos) {
hideEmojisByLine(i - firstAppearIndex);
//if it contains it will be looping over string to check if the found emoji key meets our conditions
for (int j = 0; j < str.length(); j++) {
if(k ==5) // number of emojis per one line
break;
if (str.substr(j, TO_WSTRING(it->first).length()) == TO_WSTRING(it->first).c_str()) {
std::n_wstring charBefore = str.substr(j - 1, 1);
std::n_wstring charAfter = str.substr(j + 2, 1);
//make sure the emoji meets our conditions.
if ((charBefore == L" " || charBefore == L":") &&
(charAfter == L" " || charAfter.empty())) {
int width = getWidth(str, pList, it->first,j);
renderEmoji(i - firstAppearIndex,totalIndexes,chatBox->GetPos().x + width,chatBox->GetPos().y,pList->GetNumberOfItems(),it->second,k);
k++;
}
}
}
}
}
}
}
}
}
thanks to b0ykoe from here we getting the exact width along to the special key.
Code:
int CIFChatViewer::getWidth(std::n_wstring str,CIFListCtrl* pList,std::string emojiCode,int index)
{
std::n_wstring tempStr;
CIFListCtrl::SLineOfText* tempLine;
int Width=0;
std::n_wstring tempText = str.substr(0, index);
if(pList)
{
tempLine = pList->GetTextByIndex(0);
if(tempLine)
{
CGFontTexture* cgFont = tempLine->m_font;
if(cgFont)
{
cgFont->GetText(&tempStr);
cgFont->sub_8B3B60(&tempText);
Width = cgFont->GetDimensions().width;
cgFont->sub_8B3B60(&tempStr);
}
}
}
return Width;
}
Note:
the full codes can be found at the end of thread, keep in mind that the current emojis per line are 5, however you can control them easily.
all given there are offsets so that you can populate devkit classes with them
usage:
Code:
CIFChatViewer* chatView = (CIFChatViewer*)g_pCGInterface->m_IRM.GetResObj(1, 1);
chatView->hideEmojis();
chatView->emojiHandler();
so where to insert that code ?
well its up to you. you may just insert it in any rendering function or hook all these functions (it wont be provided at the code)
Code:
0063AACF
00656160
00656060
00656160
0063AA50
0064CC30
00656324
Codes:
|
thanks for you but can make a video to help me how to use Devkit
any one can make video to see me how to add any thing on Devkit or how to use this Tool devkit
|
|
|
09/03/2022, 17:14
|
#13
|
elite*gold: 0
Join Date: Apr 2017
Posts: 987
Received Thanks: 456
|
Quote:
Originally Posted by eslamwiza
thanks for you but can make a video to help me how to use Devkit
thanks for you but can make a video to help me how to use Devkit
any one can make video to see me how to add any thing on Devkit or how to use this Tool devkit
|
|
|
|
09/29/2022, 04:31
|
#14
|
elite*gold: 90
Join Date: Aug 2019
Posts: 101
Received Thanks: 23
|
after finsh when build problem can help
|
|
|
09/29/2022, 04:50
|
#15
|
elite*gold: 312
Join Date: Jun 2011
Posts: 181
Received Thanks: 34
|
great work bro
can you release how can we make a specific map or region same like an event ctf or arena ?
i mean like to make this specific map or region all player spawn there with cape , Uniform , all have same weapon dg , hide names or change with something else , and countdown timer for event time , hide guild name
|
|
|
|
|
Similar Threads
|
[Release] STFilter-Devkit-Client - Database - Chat Item Link - New Reverse Scroll
05/03/2024 - SRO PServer Guides & Releases - 344 Replies
hi everyone , today i will release ST Filter version written by me based on sr_proxy , exclusively for Vietnamese people
This version still has some bugs so if you find any errors, please post them and I will fix it
Some Features Are Available :
Battle Royale Event
https://youtu.be/47EsgqQqZSs
Item Viewer
https://youtu.be/g3yKUEx9DlA
|
[Release] STFilter - Devkit - Client - Database - Chat Item Link - New Reverse Scroll
11/29/2021 - SRO Coding Corner - 11 Replies
hi everyone , today i will release ST Filter version written by me based on sr_proxy , exclusively for Vietnamese people
This version still has some bugs so if you find any errors, please post them and I will fix it
some features are available :
https://s1.uphinh.org/2021/11/28/7e950e5cf269a620 9.png
https://s1.uphinh.org/2021/11/28/8.png
https://s1.uphinh.org/2021/11/28/9.png
https://s1.uphinh.org/2021/11/28/10.png
https://s1.uphinh.org/2021/11/28/11.png...
|
All times are GMT +2. The time now is 04:18.
|
|