Jump to content
  • 0

[Meteor Storm] Behavior Issue


Tydus

Question


  • Group:  Members
  • Topic Count:  10
  • Topics Per Day:  0.00
  • Content Count:  40
  • Reputation:   11
  • Joined:  04/22/12
  • Last Seen:  

Hello everyone again

I had already brought up this issue but seemed like it was not clear so i'm posting it again with some videos i did record and i'll explain again what's the issue.

 

[Issue information] [Pre-renewall]

Meteor storm is supposed to stack when you spam it but somehow, on rAthena emulator, it starts to cancel previously Meteor's when you spam. In short, you can only spam the skill 4 times because when you use it the fifth time, the first skill will be canceled. Also, as the skills get canceled when you spam, it will mostly deal NO damage if you spam very quickly. Check it out on the video.

rAthena Meteor Storm Part 1

rAthena Meteor Storm Part 2

 

Also, to compare and show you guys how should it work, i recorded a video on the HerculesWS emulator. Notice I use the skill right side and then spam it left side and even spamming, the meteor's keep falling until the end of the skill duration. Check it out in the next video:

Hercules emulator Meteor storm behavior

db/pre-re/skill_cast_db.txt

skillcast.jpg.d7a638dd0f61c090d456a93b4e3db31e.jpg

db/pre-re/skill_db.txt

Skilldb.jpg.7f576da60125bfa325d9d8dc571a9502.jpg

 

 

That's all. I've been trying to solve it but no success so i'm here to ask you all for help.

 

[Important] I'm not sure if it's the right section to post that kind of issue so my apologizes if it's not.

 

Thanks in advance

Edited by SandroRios
[Edit 1] Attaching the videos directly on the topic for easily view [Edit 2] Add my db/pre-re/skill_db and skill_cast_db
Link to comment
Share on other sites

9 answers to this question

Recommended Posts

  • 0

  • Group:  Developer
  • Topic Count:  33
  • Topics Per Day:  0.01
  • Content Count:  790
  • Reputation:   225
  • Joined:  01/30/13
  • Last Seen:  

I already replied to you in your previous thread:

The results of your tests would actually indicate that you have an older implementation of Meteor Storm. In skill.h, check your MAX_SKILLTIMERSKILL value. Also maybe post your current Meteor Storm code. Also setting up your client so that it shows UNT_DUMMYSKILL (the cells where the meteors will land) would most likely make the problem visible.

  • Upvote 1
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  10
  • Topics Per Day:  0.00
  • Content Count:  40
  • Reputation:   11
  • Joined:  04/22/12
  • Last Seen:  

3 hours ago, Playtester said:

I already replied to you in your previous thread:

The results of your tests would actually indicate that you have an older implementation of Meteor Storm. In skill.h, check your MAX_SKILLTIMERSKILL value. Also maybe post your current Meteor Storm code. Also setting up your client so that it shows UNT_DUMMYSKILL (the cells where the meteors will land) would most likely make the problem visible.

 

Yeah, according to my MAX_SKILLTIMERSKILL it should work well but it's not; How can i set up my client to shows UNT_DUMMYSKILL? Just tell me exactly what code you just want and i'll show you. I built that rAthena server this year with the latest git version.Is it possible to it to have an older implementation of that skill? D:

sss.jpg.5c3f276ab3cc14d511bba726f8b4da91.jpg

Link to comment
Share on other sites

  • 0

  • Group:  Developer
  • Topic Count:  33
  • Topics Per Day:  0.01
  • Content Count:  790
  • Reputation:   225
  • Joined:  01/30/13
  • Last Seen:  

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?

Edited by Playtester
  • Upvote 2
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  10
  • Topics Per Day:  0.00
  • Content Count:  40
  • Reputation:   11
  • Joined:  04/22/12
  • Last Seen:  

14 hours ago, Playtester said:

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?

So, i did check every single code line you sent me and they are all fine. everything exactly how you sent me and still having this problem. Should i delete my rAthena server and build it again? I really do not understand why it's happening =(

Edited by SandroRios
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  8
  • Topics Per Day:  0.00
  • Content Count:  45
  • Reputation:   1
  • Joined:  10/09/18
  • Last Seen:  

any updates for this topic? cuz i got same problem ..

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  10
  • Topics Per Day:  0.00
  • Content Count:  40
  • Reputation:   11
  • Joined:  04/22/12
  • Last Seen:  

I solved my problem modifying the max ground skills unit at rAthena source. Since each meteor counts as an unit, you need to change the max unit limit for ground skills so it won't cap the meteors when you spam it.

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  28
  • Topics Per Day:  0.01
  • Content Count:  234
  • Reputation:   113
  • Joined:  02/24/15
  • Last Seen:  

23 minutes ago, SandroRios said:

I solved my problem modifying the max ground skills unit at rAthena source. Since each meteor counts as an unit, you need to change the max unit limit for ground skills so it won't cap the meteors when you spam it.

could you share the source modification?

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  10
  • Topics Per Day:  0.00
  • Content Count:  40
  • Reputation:   11
  • Joined:  04/22/12
  • Last Seen:  

On ‎11‎/‎13‎/‎2018 at 5:05 PM, maken06 said:

could you share the source modification?

In src > map > skill.hpp, search for MAX_SKILLUNITGROUP. It's set for 25 in the official release, which allow a player to land 25 skill units on the ground at the same time. If a 26th is casted, the last one landed will disappear. Since rAthena fixed the source issue related to it i guess it's fine. I can't double check if this is enough cause i'm not at home right now reply me later if not.

 

Edited by SandroRios
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  4
  • Topics Per Day:  0.00
  • Content Count:  7
  • Reputation:   1
  • Joined:  01/11/12
  • Last Seen:  

src/map/skill.h

Find

#define MAX_SKILLTIMERSKILL 50

Change the value to

#define MAX_SKILLTIMERSKILL 15

 

Then recompile

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...