| Welcome, Guest |
You have to register before you can post on our site.
|
| Online Users |
There are currently 37 online users. » 0 Member(s) | 36 Guest(s) Bing
|
| Latest Threads |
Last Chaos Server Sale
Forum: The Black Market (Buy, Sell, Trade)
Last Post: XWrongX2
01-26-2026, 11:07 PM
» Replies: 3
» Views: 602
|
All in One Exporter
Forum: Tools
Last Post: Kain88
01-25-2026, 07:04 AM
» Replies: 4
» Views: 424
|
HELP! ReZasCashServer It ...
Forum: Ep4 Support
Last Post: Kain88
01-24-2026, 03:24 PM
» Replies: 2
» Views: 152
|
Hi, does anyone know the ...
Forum: Help
Last Post: Desarija
01-21-2026, 11:29 AM
» Replies: 1
» Views: 110
|
LastChaos Nemesis
Forum: Server Advertising
Last Post: Desarija
01-20-2026, 04:06 PM
» Replies: 3
» Views: 226
|
Looking for EP4 Guidance
Forum: General Discussion
Last Post: xHypnosiaa
01-19-2026, 08:33 AM
» Replies: 1
» Views: 165
|
We're in need of creative...
Forum: Project Recruitment
Last Post: RGT
01-16-2026, 12:48 AM
» Replies: 0
» Views: 114
|
Last Chaos build deployme...
Forum: Ep4 Guides
Last Post: xHypnosiaa
01-08-2026, 11:14 AM
» Replies: 0
» Views: 68
|
Last Chaos global server ...
Forum: Ep4 Guides
Last Post: xHypnosiaa
01-07-2026, 07:01 PM
» Replies: 0
» Views: 29
|
EP-2/EP-3 Mixed files
Forum: Archived General Server Releases
Last Post: TeKnodE
01-06-2026, 09:53 PM
» Replies: 1
» Views: 293
|
|
|
| (Help) Premium with additional buff |
|
Posted by: ChaosHase - 05-27-2023, 10:42 AM - Forum: Ep4 Support
- Replies (2)
|
 |
Hello community.
I was wondering if it's possible when you activate premium that an additional skill can be performed.
which runs just as long as Premium.
creating the skill is no problem.
Installing it in the premium function is a bit complicated.
Can someone help me with that?
Thanks
|
|
|
| How to Refresh channel state with button on Channel Select when is Down or Busy? |
|
Posted by: Andrein95 - 05-21-2023, 10:22 AM - Forum: Ep4 Support
- Replies (3)
|
 |
Hello.
I managed to add a button 'Refresh' to update state when a channel is busy or down.
For example when the game server is still loading obv the client will mark as down.
Without make Exit and Relog I'd like to reload information.
I did this but does not work:
if (m_pWnd != NULL)
{
switch (m_cmdTpye)
{
case GotoLogin:
m_pWnd->GotoLogin();
break;
case ConnectServer:
m_pWnd->ConnectServer();
break;
case Refresh:
m_pWnd->UpdateServerList();
....
I tried also:
m_pWnd->ResetServerAndChannelData();
m_pWnd->Lock(TRUE);
Sleep(500);
m_pWnd->Lock(FALSE);
m_pWnd->UpdateServerList();
but does not work either.
If toggling m_pWnd->CloseUI() and m_pWnd->OpenUI() the form of selection does not appear anymore.
Does anyone how to fix this or If my approach is totally wrong?
Thanks
Best Regards
|
|
|
| discord rich presence |
|
Posted by: kdy - 05-16-2023, 03:19 PM - Forum: Ep4 Support
- Replies (3)
|
 |
hello, someone can send me a guide on how to put discord rich presence? i have tried several times but idk where to put the code, if someone can help me i would appreciate it ❤️
|
|
|
| Class change card |
|
Posted by: Desarija - 05-02-2023, 05:56 PM - Forum: Ep4 Support
- Replies (1)
|
 |
Hello,
I have created an item that allows me to change my main character class at Crean, for example from Knight to Titan. Everything works fine, but apparently the character animations are not changed correctly so the character goes into a broken state like in the image below. As soon as I try to move around my client crashed with Send Error.
I have tried to fix it with the SetAnimation function but that didn't work. Has anyone done this before and can give me a hint?
Of course I could avoid this by forcing a disconnect/relog but that's not my prefered solution.
|
|
|
| How to get UV Map from TopUI.tex? In other words how to map different portion of texture and apply in pTextureStock->Ob |
|
Posted by: Andrein95 - 05-01-2023, 10:18 PM - Forum: Ep4 Support
- Replies (12)
|
 |
Hello.
I'd like to take from topUI Mana bar.
From code and various example I can see clearly that:
//rett HP
Rectangle.SetUV(550, 108, 679, 119, fTexWidth, fTexHeight);
//inside recatngle
RectangleFill.SetUV(286, 220, 289, 227, fTexWidth, fTexHeight);
these two vars of type: UIRectUV map HP bar of topUI (second one from the top left).
What I can not understand is, where is the tool to get such informations?
If i want to grab or swap texture with another one, how to map coordinates in here?
Hope that I explained myself.
Best Regards
|
|
|
| Hint to implement List of icons under Mob Target of possibles drops. |
|
Posted by: Andrein95 - 04-30-2023, 12:56 PM - Forum: Ep4 Support
- Replies (5)
|
 |
Hello. I'd like to implement a list of icons distributed by line under the Target section with Mob name, Level and HP Bar.
For the icons I can use CUIIcons already implemented class, and I would work on TargetInfoNewUI in case of MOB for rendering this new feature.
The part that I dont know to organize is how to retrieve mob possible drop from its index.
Anyone has already solved this?
Any hints will be nice.
Thanks in Advanc
|
|
|
| Send struct with dinamic size inside of other struct |
|
Posted by: nicolasg - 04-29-2023, 10:24 PM - Forum: Ep4 Support
- No Replies
|
 |
Hello, I am trying to modify the existing merchant system, specifically I want to send an array with some data, in addition to the data that was originally sent...
This is the struct with the changes
// NICOLASG MARK (AUCTIONS) // Testing
struct TradeAgentBiddersList {
int bid_pos;
int bidder_job;
char bidder_charName[MAX_ID_NAME_LENGTH];
int bid_value;
TradeAgentBiddersList() {
bid_pos = 0;
bidder_job = 0;
strcpy(bidder_charName, "\0");
bid_value = 0;
}
};
// NICOLASG MARK END
struct TradeAgentItem {
tradeAgentIndex_t index; // °íÀ¯ ¹øÈ£
int item_index;
unsigned char plus; // °È ¼öÄ¡
unsigned char plus2; // Ãß°¡ ¼öÄ¡
int flag;
char serial[MAX_SERIAL_LENGTH + 1];
int item_jobclass;
int quantity;
int option_count;
int option_type[MAX_ITEM_OPTION];
int option_level[MAX_ITEM_OPTION];
int socketCount;
int socket[MAX_SOCKET_COUNT];
int item_origin[MAX_ORIGIN_OPTION];
GoldType_t nas;
int regist_date;
int expire_date;
int item_num0; //¾ÆÀÌÅÛ ¹°¸®°ø°Ý·Â
int item_num1; //¾ÆÀÌÅÛ ¸¶¹ý°ø°Ý·Â
int item_level;
int rareGrade;
char sell_charName[MAX_ID_NAME_LENGTH]; //MAX_ID_NAME_LENGTH = 64
#ifdef DURABILITY
int now_durability;
int max_durability;
#endif
// NICOLASG MARK (AUCTIONS) // Testing
int bidsListCount;
TradeAgentBiddersList* bidsList;
// NICOLASG MARK END
TradeAgentItem() {
memset(this, 0x00, sizeof(*this));
memset(this->socket, -1, sizeof(this->socket));
#ifdef DURABILITY
now_durability = 0;
max_durability = 0;
#endif
}
};
And this is the part of the code where I populate the package with the information
size_t BidsListSize = 0; // NICOLASG MARK (AUCTIONS)
for (int i = 0; i < packet->count; i++) {
cmd.GetRec("a_index", packet->list.index);
cmd.GetRec("a_item_serial", packet->list[i].item_index);
cmd.GetRec("a_item_plus", packet->list[i].plus);
cmd.GetRec("a_item_plus2", packet->list[i].plus2);
cmd.GetRec("a_item_flag", packet->list[i].flag);
cmd.GetRec("a_option_count", packet->list[i].option_count);
cmd.GetRec("a_option_0_type", packet->list[i].option_type[0]);
cmd.GetRec("a_option_0_level", packet->list[i].option_level[0]);
cmd.GetRec("a_option_1_type", packet->list[i].option_type[1]);
cmd.GetRec("a_option_1_level", packet->list[i].option_level[1]);
cmd.GetRec("a_option_2_type", packet->list[i].option_type[2]);
cmd.GetRec("a_option_2_level", packet->list[i].option_level[2]);
cmd.GetRec("a_option_3_type", packet->list[i].option_type[3]);
cmd.GetRec("a_option_3_level", packet->list[i].option_level[3]);
cmd.GetRec("a_option_4_type", packet->list[i].option_type[4]);
cmd.GetRec("a_option_4_level", packet->list[i].option_level[4]);
cmd.GetRec("a_quantity", packet->list[i].quantity);
cmd.GetRec("a_totalmoney", packet->list[i].nas);
cmd.GetRec("a_item_level", packet->list[i].item_level);
cmd.GetRec("a_item_origin_0", packet->list[i].item_origin[0]);
cmd.GetRec("a_item_origin_1", packet->list[i].item_origin[1]);
cmd.GetRec("a_item_origin_2", packet->list[i].item_origin[2]);
cmd.GetRec("a_item_origin_3", packet->list[i].item_origin[3]);
cmd.GetRec("a_item_origin_4", packet->list[i].item_origin[4]);
cmd.GetRec("a_item_origin_5", packet->list[i].item_origin[5]);
cmd.GetRec("a_socketCount", packet->list[i].socketCount);
cmd.GetRec("a_socket0", packet->list[i].socket[0]);
cmd.GetRec("a_socket1", packet->list[i].socket[1]);
cmd.GetRec("a_socket2", packet->list[i].socket[2]);
cmd.GetRec("a_socket3", packet->list[i].socket[3]);
cmd.GetRec("a_socket4", packet->list[i].socket[4]);
cmd.GetRec("a_socket5", packet->list[i].socket[5]);
cmd.GetRec("a_socket6", packet->list[i].socket[6]);
#ifdef DURABILITY
cmd.GetRec("a_now_dur", packet->list[i].now_durability);
cmd.GetRec("a_max_dur", packet->list[i].max_durability);
#endif
cmd.GetRec("a_num0", packet->list[i].item_num0);
cmd.GetRec("a_num1", packet->list[i].item_num1);
cmd.GetRec("regist_date", packet->list[i].regist_date);
cmd.GetRec("expire_date", packet->list[i].expire_date);
// NICOLASG MARK (AUCTIONS)
if (p->SellType == 1) {
sprintf(sql, "SELECT a_bid_pos, a_bidder_job, a_bidder_name, a_bidder_bid, a_show_name FROM t_tradeagent_auctions_history WHERE a_auction_index=%d", packet->list[i].index);
CDBCmd cmdHistory;
cmdHistory.Init(&gserver.m_dbchar);
cmdHistory.SetQuery(sql);
if (cmdHistory.Open()) {
int ListCount = cmdHistory.m_nrecords;
if (ListCount > 0) {
packet->list[i].bidsListCount = ListCount;
packet->list[i].bidsList = new TradeAgentBiddersList[ListCount];
int k = 0;
while (cmdHistory.MoveNext()) {
cmdHistory.GetRec("a_bid_pos", packet->list[i].bidsList[k].bid_pos);
cmdHistory.GetRec("a_bidder_job", packet->list[i].bidsList[k].bidder_job);
// TODO: if show name is 0
CLCString sell_charName(MAX_ID_NAME_LENGTH);
cmdHistory.GetRec("a_bidder_name", sell_charName);
strcpy(packet->list[i].bidsList[k].bidder_charName, (const char*)sell_charName);
cmdHistory.GetRec("a_bidder_bid", packet->list[i].bidsList[k].bid_value);
k++;
}
BidsListSize += sizeof(TradeAgentBiddersList) * k;
} else {
LOG_INFO("NICOLASG - No bids yet");
packet->list[i].bidsListCount = 0;
//packet->list[i].bidsList = NULL;
BidsListSize += sizeof(TradeAgentBiddersList);
}
} else {
LOG_INFO("NICOLASG - Bids listing for Auction:%d not found", packet->list[i].index);
packet->list[i].bidsListCount = 0;
//packet->list[i].bidsList = NULL;
BidsListSize += sizeof(TradeAgentBiddersList);
}
} else {
LOG_INFO("NICOLASG - Is not Auctions list request");
packet->list[i].bidsListCount = 0;
//packet->list[i].bidsList = NULL;
BidsListSize += sizeof(TradeAgentBiddersList);
}
// NICOLASG MARK END
cmd.MoveNext();
}
rmsg->setSize(sizeof(ResponseClient::TradeAgentSystemList) + (packet->count * sizeof(TradeAgentItem)) + BidsListSize); // NICOLASG MARK (AUCTIONS) OG: rmsg->setSize(sizeof(ResponseClient::TradeAgentSystemList) + (packet->count * sizeof(TradeAgentItem)));
SEND_Q(rmsg, desc);
My question is the following, so far have I done things correctly or am I a disaster? Also, is it possible to "retrieve" the structure: TradeAgentBiddersList once the package is delivered to the client?
To provide more information to contribute to an answer, this is the code I have modified on the client side
ResponseClient::TradeAgentSystemList* pPack = reinterpret_cast<ResponseClient::TradeAgentSystemList*>(istr->GetBuffer());
clearSearchList();
m_sCurPage = pPack->pageNo;
m_ucNextPage = pPack->nextPage;
m_nServerTime = pPack->curServerTime;
if (pPack->count > 0) {
m_nSearchCount = pPack->count;
m_pSearchList = new TradeAgentItem[pPack->count];
// NICOLASG MARK (AUCTIONS)
for (int i = 0; i < pPack->count; i++) {
m_pSearchList[i].index = pPack->list[i].index;
m_pSearchList[i].item_index = pPack->list[i].item_index;
m_pSearchList[i].plus = pPack->list[i].plus;
m_pSearchList[i].plus2 = pPack->list[i].plus2;
m_pSearchList[i].flag = pPack->list[i].flag;
strncpy(m_pSearchList[i].serial, pPack->list[i].serial, MAX_SERIAL_LENGTH);
m_pSearchList[i].item_jobclass = pPack->list[i].item_jobclass;
m_pSearchList[i].quantity = pPack->list[i].quantity;
m_pSearchList[i].option_count = pPack->list[i].option_count;
memcpy(m_pSearchList[i].option_type, pPack->list[i].option_type, sizeof(pPack->list[i].option_type));
memcpy(m_pSearchList[i].option_level, pPack->list[i].option_level, sizeof(pPack->list[i].option_level));
m_pSearchList[i].socketCount = pPack->list[i].socketCount;
memcpy(m_pSearchList[i].socket, pPack->list[i].socket, sizeof(pPack->list[i].socket));
memcpy(m_pSearchList[i].item_origin, pPack->list[i].item_origin, sizeof(pPack->list[i].item_origin));
m_pSearchList[i].nas = pPack->list[i].nas;
m_pSearchList[i].regist_date = pPack->list[i].regist_date;
m_pSearchList[i].expire_date = pPack->list[i].expire_date;
m_pSearchList[i].item_num0 = pPack->list[i].item_num0;
m_pSearchList[i].item_num1 = pPack->list[i].item_num1;
m_pSearchList[i].item_level = pPack->list[i].item_level;
m_pSearchList[i].rareGrade = pPack->list[i].rareGrade;
strncpy(m_pSearchList[i].sell_charName, pPack->list[i].sell_charName, MAX_ID_NAME_LENGTH);
#ifdef DURABILITY
m_pSearchList[i].now_durability = pPack->list[i].now_durability;
m_pSearchList[i].max_durability = pPack->list[i].max_durability;
#endif
int ListCount = pPack->list[i].bidsListCount;
if (ListCount > 0) {
m_pSearchList[i].bidsListCount = ListCount;
m_pSearchList[i].bidsList = new TradeAgentBiddersList[ListCount];
for (int k = 0; k < ListCount; k++) {
m_pSearchList[i].bidsList[k].bid_pos = pPack->list[i].bidsList[k].bid_pos;
m_pSearchList[i].bidsList[k].bidder_job = pPack->list[i].bidsList[k].bidder_job;
//strncpy(m_pSearchList[i].bidsList[k].bidder_charName, pPack->list[i].bidsList[k].bidder_charName, MAX_ID_NAME_LENGTH);
strcpy(m_pSearchList[i].bidsList[k].bidder_charName, pPack->list[i].bidsList[k].bidder_charName);
m_pSearchList[i].bidsList[k].bid_value = pPack->list[i].bidsList[k].bid_value;
}
} else {
m_pSearchList[i].bidsListCount = 0;
m_pSearchList[i].bidsList = new TradeAgentBiddersList;
//m_pSearchList[i].bidsList = NULL;
}
}
// Original
// memcpy(m_pSearchList, pPack->list, sizeof(TradeAgentItem) * pPack->count);
// NICOLASG MARK END
My client crashes when executing the line: m_pSearchList[i].bidsList[k].bidder_job = pPack->list[i].bidsList[k].bidder_job;, so I understand that something is wrong with the package...
[/i]
[i]
[/i]
|
|
|
| 100% Cooldown not work |
|
Posted by: JLT - 04-25-2023, 04:27 PM - Forum: Ep4 Support
- Replies (4)
|
 |
Hello guys, I can’t solve the problem, when using skills and wearing jewelry at 100% I get errors 5550, I set the DEF_SKILL_SEND_DELAY value to 0, this did not solve the problem, what else can it be connected with?
|
|
|
|