Sorry, I'm not familiar enough with client mods, so I don't really know how to do it. I just say that you modified the client to show cast range and thought you could configure it to show ground effects as well.
It's honestly hard to tell from here, why it doesn't work. I could try again on my rAthena if I can reproduce it somehow, but last time I tried, spaming was possible and I also know rAthena based servers where it works.
You probably will need to debug it on your machine directly using Visual Studio.
Actually, in the current implementation it doesn't even use timerskill anymore, but I'm not sure if you have that. Let me guide you through the code so you can understand and debug it.
In the current implementation, the placing of the meteor storm cells starts here (skill.c):
case WZ_METEOR:
case SU_CN_METEOR: {
int area = skill_get_splash(skill_id, skill_lv);
short tmpx = 0, tmpy = 0;
if (sd && skill_id == SU_CN_METEOR) {
short item_idx = pc_search_inventory(sd, ITEMID_CATNIP_FRUIT);
if (item_idx >= 0) {
pc_delitem(sd, item_idx, 1, 0, 1, LOG_TYPE_CONSUME);
flag |= 1;
}
}
for (i = 1; i <= skill_get_time(skill_id, skill_lv)/skill_get_unit_interval(skill_id); i++) {
// Creates a random Cell in the Splash Area
tmpx = x - area + rnd()%(area * 2 + 1);
tmpy = y - area + rnd()%(area * 2 + 1);
skill_unitsetting(src, skill_id, skill_lv, tmpx, tmpy, flag+i*skill_get_unit_interval(skill_id));
}
}
break;
The number of meteor should be "time" define in skill_cast_db.txt (which you quoted early, so at level 9 which you are casting the video it should be 6000) divided by the interval you defined in skill_unit_db which should be 1000. So 6000/1000 = 6 meteor cells placed.
Each cell will get a different timer as the Meteors will start at different times (but those don't even count as timerskills, so it doesn't add to the limit).
case WZ_METEOR:
case SU_CN_METEOR:
limit = flag - (flag&1);
val1 = (flag&1);
flag = 0; // Flag should not influence anything else for these skills
break;
^ Here we make sure that the values of the cell are set correctly.
default:
if (group->val2 == 1 && (group->skill_id == WZ_METEOR || group->skill_id == SU_CN_METEOR)) {
// Deal damage before expiration
break;
}
skill_delunit(unit);
break;
^ This code ensure that Meteor Storm cells don't get removed before dealing damage.
default:
if (group->skill_id == WZ_METEOR || group->skill_id == SU_CN_METEOR) {
if (group->val2 == 0 && (DIFF_TICK(tick, group->tick) >= group->limit - group->interval || DIFF_TICK(tick, group->tick) >= unit->limit - group->interval)) {
// Unit will expire the next interval, start dropping Meteor
struct block_list* src;
if ((src = map_id2bl(group->src_id)) != NULL) {
clif_skill_poseffect(src, group->skill_id, group->skill_lv, bl->x, bl->y, tick);
group->val2 = 1;
}
}
// No damage until expiration
return 0;
}
break;
^ This code handles the display of the falling meteor which is 1 second before the cell expires.
else if (group->skill_id == WZ_METEOR || group->skill_id == SU_CN_METEOR) {
skill_delunit(unit);
return 0;
}
^ And here we finally delete it after they dealt damage.
So, that's how it works in the current rAthena implementation.
It doesn't show any error in the map server, right? Something like unit limit reached?