this mean you have unsupported skill somewhere.
if you adding new skill by patching server, you must add range for this skill in skill_get_index.
if you adding new skill by plugin, you must override CUSTOM_SKILL_RANGES in environment variables before compile server.
If this error from clean hercules, probably some one cheating and want use non existing skill.

If someone is cheating is there a way to trace whose that person is? Already updated my Hercules git. still got the same error.no you cant know where skill was used/added except stack trace what you show on screenshot.
try search in your plugins and in hercules code for 5423.
this skill usage look like code from client. may be you have this skill id in your client lua files?
if this is some one want exploit some non existing skill, you can simply ignore it.
if (skill_id == 5423)
{
ShowError("Wrong skill 5423 from account_id: %d\n", sd->status.account_id);
}
you can add into function clif_useSkillToIdReal at start code:
if (skill_id == 5423)
{
ShowError("Wrong skill 5423 from account_id: %d\n", sd->status.account_id);
}
if (skill_id == 5423)
{
ShowError("Wrong skill 5423 from account_id: %d\n", sd->status.account_id);
}
Is this correct under clif.c?sorry. which file? Im new to this.
static void clif_useSkillToIdReal(int fd, struct map_session_data *sd, int skill_id, int skill_lv, int target_id) __attribute__((nonnull (2)));
static void clif_useSkillToIdReal(int fd, struct map_session_data *sd, int skill_id, int skill_lv, int target_id)
if (skill_id == 5423)
{
ShowError("Wrong skill 5423 from account_id: %d\n", sd->status.account_id);
}
{
int64 tick = timer->gettick();
if (skill_lv < 1)
skill_lv = 1; //No clue, I have seen the client do this with guild skills :/ [Skotlex]
int tmp = skill->get_inf(skill_id);
if (tmp & INF_GROUND_SKILL || !tmp)
return; //Using a ground/passive skill on a target? WRONG.
if (skill_id >= HM_SKILLBASE && skill_id < HM_SKILLBASE + MAX_HOMUNSKILL) {
clif->pUseSkillToId_homun(sd->hd, sd, tick, skill_id, skill_lv, target_id);
return;
}
if (skill_id >= MC_SKILLBASE && skill_id < MC_SKILLBASE + MAX_MERCSKILL) {
clif->pUseSkillToId_mercenary(sd->md, sd, tick, skill_id, skill_lv, target_id);
return;
}
// Whether skill fails or not is irrelevant, the char ain't idle. [Skotlex]
pc->update_idle_time(sd, BCIDLE_USESKILLTOID);
if (sd->npc_id || sd->state.workinprogress & 1) {


you put code before function start, but need after first
{
{
[Error]: npc_parse_function: Missing left curly '%TAB%{' in file '(DIRECT INPUT)', line '1'. Skipping the rest of the file.
* w1=function
* w2=script
* w3=H_VIPBuff
* w4=-1,{
Hi I got much more specific error. how can i fixed this?i speaked about c code and not scripts. add it to clif.c
wrong:
static void clif_useSkillToIdReal(int fd, struct map_session_data *sd, int skill_id, int skill_lv, int target_id) __attribute__((nonnull (2)));
static void clif_useSkillToIdReal(int fd, struct map_session_data *sd, int skill_id, int skill_lv, int target_id)
if (skill_id == 5423)
{
ShowError("Wrong skill 5423 from account_id: %d\n", sd->status.account_id);
}
{
int64 tick = timer->gettick();
static void clif_useSkillToIdReal(int fd, struct map_session_data *sd, int skill_id, int skill_lv, int target_id) __attribute__((nonnull (2)));
static void clif_useSkillToIdReal(int fd, struct map_session_data *sd, int skill_id, int skill_lv, int target_id)
if (skill_id == 5423)
{
ShowError("Wrong skill 5423 from account_id: %d\n", sd->status.account_id);
}
{
int64 tick = timer->gettick();
correct:
static void clif_useSkillToIdReal(int fd, struct map_session_data *sd, int skill_id, int skill_lv, int target_id) __attribute__((nonnull (2)));
static void clif_useSkillToIdReal(int fd, struct map_session_data *sd, int skill_id, int skill_lv, int target_id)
{
if (skill_id == 5423)
{
ShowError("Wrong skill 5423 from account_id: %d\n", sd->status.account_id);
}
int64 tick = timer->gettick();
static void clif_useSkillToIdReal(int fd, struct map_session_data *sd, int skill_id, int skill_lv, int target_id) __attribute__((nonnull (2)));
static void clif_useSkillToIdReal(int fd, struct map_session_data *sd, int skill_id, int skill_lv, int target_id)
{
if (skill_id == 5423)
{
ShowError("Wrong skill 5423 from account_id: %d\n", sd->status.account_id);
}
int64 tick = timer->gettick();
and i add skill id what you show in first screenshot.



/sob I have Gepard. I don't know but per functor its not from gepard. Wonder if this can be fixed. So irritating to see. /soblook like same errors but other skill id
client send wrong skills.
if this is on your production server as i said before it can be some one who cheating.
if on your local server, then some thing wrong with your client.
also if you using any client modifications like game guard or external tools, this can be from this things too.
well gepard not prevent cheaters. it create some issues for botters only. Real protection can be only server side.
from log this is packets with wrong skill id. you can ignore them or add some code for disconnect players with wrong skill sent.
remove code what you add before, and place this code:
if (skill->get_index(skill_id) == 0) {
sockt->eof(fd);
ShowWarning("Wrong skill detected %d. Player disconnected\n", skill_id);
return;
}
if (skill->get_index(skill_id) == 0) {
sockt->eof(fd);
ShowWarning("Wrong skill detected %d. Player disconnected\n", skill_id);
return;
}
This code should disconnect anyone who using skill what was not added to skill_db.

Yes, will try again next update. I don't know why. I just copy paste your snippet. Will get back to you. thanks!well gepard not prevent cheaters. it create some issues for botters only. Real protection can be only server side.
from log this is packets with wrong skill id. you can ignore them or add some code for disconnect players with wrong skill sent.
remove code what you add before, and place this code:
if (skill->get_index(skill_id) == 0) {
sockt->eof(fd);
ShowWarning("Wrong skill detected %d. Player disconnected\n", skill_id);
return;
}
This code should disconnect anyone who using skill what was not added to skill_db.
We use essential cookies to make this site work, and optional cookies to enhance your experience.