Переглянути джерело

- Cleaned up the last NJ update code.
- Added @ command `charspeed`
- Fixed @jailfor using MAP_PRONTERA as jail instead of MAP_JAIL
- Removed case for GS_SPREADATTACK on damage packets to see if the skill displays correctly now.
- Corrected Deluge/Volcano/V. Gale overlaps so that the placing tiles are removed, NOT the ones who were already placed.
- Made SC_SPEEDUP0 and SC_SPEEDUP1 use different icon IDs, to fix icon-confusion when both are enabled at a time.
- Mob rude-attacked count is not reset now on picking a new char (gotta investigate this further)


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@8096 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex 19 роки тому
батько
коміт
34eea8ae57
9 змінених файлів з 84 додано та 27 видалено
  1. 11 0
      Changelog-Trunk.txt
  2. 1 1
      db/skill_db.txt
  3. 51 2
      src/map/atcommand.c
  4. 1 0
      src/map/atcommand.h
  5. 3 3
      src/map/battle.c
  6. 1 1
      src/map/mob.c
  7. 10 15
      src/map/skill.c
  8. 4 3
      src/map/status.c
  9. 2 2
      src/map/status.h

+ 11 - 0
Changelog-Trunk.txt

@@ -3,6 +3,17 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 2006/08/03
+	* Cleaned up the last NJ update code. [Skotlex]
+	* Added @ command `charspeed` [Skotlex]
+	* Fixed @jailfor using MAP_PRONTERA as jail instead of MAP_JAIL [Skotlex]
+	* Removed case for GS_SPREADATTACK on damage packets to see if the skill
+	  displays correctly now. [Skotlex]
+	* Corrected Deluge/Volcano/V. Gale overlaps so that the placing tiles are
+	  removed, NOT the ones who were already placed. [Skotlex]
+	* Made SC_SPEEDUP0 and SC_SPEEDUP1 use different icon IDs, to fix
+	  icon-confusion when both are enabled at a time. [Skotlex]
+	* Mob rude-attacked count is not reset now on picking a new char (gotta
+	  investigate this further) [Skotlex]
 	* Changed atoi to strtoul for guild-experience's field [Toms]
 	* Fixed a bug in int_storage.c, temp array doesn't have the good size [Toms]
 2006/08/02

+ 1 - 1
db/skill_db.txt

@@ -552,7 +552,7 @@
 528,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0	//NJ_KASUMIKIRI#NJ_KASUMIKIRI#
 529,7:9:11:13:15,6,2,0,1,0,5,1,no,0,0,0,none,0	//NJ_SHADOWJUMP#NJ_SHADOWJUMP#
 530,-1,6,1,-1,0,0,5,1,no,0,0,0,weapon,0	//NJ_KIRIKAGE#NJ_KIRIKAGE#
-531,0,6,4,0,1,0,5,1,no,0,0,0,none,0	//NJ_UTSUSEMI#NJ_UTSUSEMI#
+531,0,6,4,0,1,0,5,1,no,0,0,0,none,7	//NJ_UTSUSEMI#NJ_UTSUSEMI#
 532,0,6,4,0,1,0,10,1,no,0,0,0,none,0	//NJ_BUNSINJYUTSU#NJ_BUNSINJYUTSU#
 533,0,0,0,0,0,0,10,0,no,0,0,0,none,0	//NJ_NINPOU#NJ_NINPOU#
 534,9,8,1,3,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0	//NJ_KOUENKA#NJ_KOUENKA#

+ 51 - 2
src/map/atcommand.c

@@ -63,6 +63,7 @@ ACMD_FUNC(happyhappyjoyjoy); // [Valaris]
 ACMD_FUNC(save);
 ACMD_FUNC(load);
 ACMD_FUNC(speed);
+ACMD_FUNC(charspeed);
 ACMD_FUNC(storage);
 ACMD_FUNC(guildstorage);
 ACMD_FUNC(option);
@@ -338,6 +339,7 @@ static AtCommandInfo atcommand_info[] = {
 	{ AtCommand_Load,				"@return",			40, atcommand_load },
 	{ AtCommand_Load,				"@load",			40, atcommand_load },
 	{ AtCommand_Speed,			"@speed",			40, atcommand_speed },
+	{ AtCommand_CharSpeed,		"@charspeed",		40, atcommand_charspeed },
 	{ AtCommand_Storage,			"@storage",			 1, atcommand_storage },
 	{ AtCommand_GuildStorage,		"@gstorage",		50, atcommand_guildstorage },
 	{ AtCommand_Option,			"@option",			40, atcommand_option },
@@ -2136,6 +2138,53 @@ int atcommand_speed(
 	return 0;
 }
 
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_charspeed(
+	const int fd, struct map_session_data* sd,
+	const char* command, const char* message)
+{
+	struct map_session_data *pl_sd;
+	int speed;
+
+	nullpo_retr(-1, sd);
+
+	memset(atcmd_output, '\0', sizeof(atcmd_output));
+	memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
+
+	if (!message || !*message || sscanf(message, "%d %23[^\n]", speed, atcmd_player_name) < 2) {
+		sprintf(atcmd_output, "Please, enter a speed and a player name (usage: @charspeed <speed <%d-%d>> <char name>).", MIN_WALK_SPEED, MAX_WALK_SPEED);
+		clif_displaymessage(fd, atcmd_output);
+		return -1;
+	}
+
+	if ((pl_sd = map_nick2sd(atcmd_player_name)) == NULL) {
+		clif_displaymessage(fd, msg_table[3]); // Character not found.
+		return -1;
+	}
+
+	if (pc_isGM(sd) < pc_isGM(pl_sd))
+  	{	//GM level check
+		clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
+		return -1;
+	}
+
+	if (speed >= MIN_WALK_SPEED && speed <= MAX_WALK_SPEED) {
+		pl_sd->base_status.speed = speed;
+		status_calc_bl(&pl_sd->bl, SCB_SPEED);
+		clif_displaymessage(fd, msg_table[8]); // Speed changed.
+		if(pl_sd->fd)
+			clif_displaymessage(pl_sd->fd, msg_table[8]); // Speed changed.
+	} else {
+		sprintf(atcmd_output, "Please, enter a valid speed value (usage: @speed <%d-%d>).", MIN_WALK_SPEED, MAX_WALK_SPEED);
+		clif_displaymessage(fd, atcmd_output);
+		return -1;
+	}
+	return 0;
+}
+
 /*==========================================
  *
  *------------------------------------------
@@ -6607,11 +6656,11 @@ int atcommand_jailfor(
 	switch(rand()%2)
 	{
 		case 1: //Jail #1
-			m_index = mapindex_name2id(MAP_PRONTERA);
+			m_index = mapindex_name2id(MAP_JAIL);
 			x = 49; y = 75;
 			break;
 		default: //Default Jail
-			m_index = mapindex_name2id(MAP_PRONTERA);
+			m_index = mapindex_name2id(MAP_JAIL);
 			x = 24; y = 75;
 			break;
 	}

+ 1 - 0
src/map/atcommand.h

@@ -26,6 +26,7 @@ enum AtCommandType {
 	AtCommand_Save,
 	AtCommand_Load,
 	AtCommand_Speed,
+	AtCommand_CharSpeed,
 	AtCommand_Storage,
 	AtCommand_GuildStorage,
 	AtCommand_Option,

+ 3 - 3
src/map/battle.c

@@ -325,13 +325,13 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
 		if(sc->data[SC_UTSUSEMI].timer != -1 && !skill_num)
 		{
 			clif_skill_nodamage(bl,bl,NJ_UTSUSEMI,1,1);
-			skill_blown (src, bl, sc->data[SC_UTSUSEMI].val3|(map_calc_dir(bl,src->x,src->y)<<20));
+			skill_blown (src, bl, sc->data[SC_UTSUSEMI].val3);
 			if (--sc->data[SC_UTSUSEMI].val2 <= 0)
 				status_change_end(bl, SC_UTSUSEMI, -1);
 			return 0;
 		}
 
-		if(sc->data[SC_BUNSINJYUTSU].timer != -1 && (flag&BF_WEAPON || flag&BF_MISC) )
+		if(sc->data[SC_BUNSINJYUTSU].timer != -1 && (flag&(BF_WEAPON|BF_MISC)) )
 		{
 			clif_skill_nodamage(bl,bl,NJ_BUNSINJYUTSU,1,1);
 			if (--sc->data[SC_BUNSINJYUTSU].val2 <= 0)
@@ -340,7 +340,7 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
 		}
 
 		//Now damage increasing effects
-		if(sc->data[SC_AETERNA].timer!=-1 && skill_num != PA_PRESSURE && skill_num != PF_SOULBURN && skill_num != NJ_ZENYNAGE){
+		if(sc->data[SC_AETERNA].timer!=-1 && skill_num != PA_PRESSURE && skill_num != PF_SOULBURN){
 			damage<<=1;
 			status_change_end( bl,SC_AETERNA,-1 );
 		}

+ 1 - 1
src/map/mob.c

@@ -1139,7 +1139,7 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
 					//or if the previous target is not attacking the mob. [Skotlex]
 					md->target_id = md->attacked_id; // set target
 					md->state.aggressive = 0; //Retaliating.
-					md->attacked_count = 0;
+					//md->attacked_count = 0; //Should we reset rude attack count?
 					md->min_chase = dist+md->db->range3;
 					if(md->min_chase>MAX_MINCHASE)
 						md->min_chase=MAX_MINCHASE;

+ 10 - 15
src/map/skill.c

@@ -770,7 +770,7 @@ int skill_get_range2 (struct block_list *bl, int id, int lv)
 	case SN_SHARPSHOOTING:
 	case HT_POWER:
 		if (bl->type == BL_PC)
-			range += pc_checkskill((struct map_session_data *)bl, AC_VULTURE);
+			range += pc_checkskill((TBL_PC*)bl, AC_VULTURE);
 		else
 			range += 10; //Assume level 10?
 		break;
@@ -782,13 +782,13 @@ int skill_get_range2 (struct block_list *bl, int id, int lv)
 	case GS_SPREADATTACK:
 	case GS_GROUNDDRIFT:
 		if (bl->type == BL_PC)
-			range += pc_checkskill((struct map_session_data *)bl, GS_SNAKEEYE);
+			range += pc_checkskill((TBL_PC*)bl, GS_SNAKEEYE);
 		else
 			range += 10; //Assume level 10?
 		break;
 	case NJ_KIRIKAGE:
 		if (bl->type == BL_PC)
-			range = skill_get_range(NJ_SHADOWJUMP,pc_checkskill((struct map_session_data *)bl,NJ_SHADOWJUMP));
+			range = skill_get_range(NJ_SHADOWJUMP,pc_checkskill((TBL_PC*)bl,NJ_SHADOWJUMP));
 		break;
 	}
 
@@ -1999,7 +1999,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
 	case SM_MAGNUM:
 	case AS_SPLASHER:
 	case ASC_METEORASSAULT:
-	case GS_SPREADATTACK:
+//	case GS_SPREADATTACK: <- as it is, it shows no animation at all.
 		dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, -1, 5);
 		break;
 	case KN_BRANDISHSPEAR:
@@ -3207,9 +3207,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 		status_change_end(src, SC_HIDING, -1);
 		skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
 		if (unit_movepos(src, bl->x, bl->y, 0, 0))
-		{
+		{	//FIXME: Why are you sending a packet to LIE about where the character is?
+			//If you want to place yourself adjacent to the target, do the proper coding..?
 			int dir = unit_getdir(src);
-
 			clif_slide(src,src->x - dirx[dir],src->y - diry[dir]);
 		}
 		break;
@@ -3783,15 +3783,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 			sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));
 		break;
 	case NJ_BUNSINJYUTSU:
-		{
-			struct status_change *sc;
-			sc = status_get_sc(bl);
-			clif_skill_nodamage(src,bl,skillid,skilllv,
+		clif_skill_nodamage(src,bl,skillid,skilllv,
 			sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));
-
-			if (sc && sc->data[SC_NEN].timer != -1)
-				status_change_end(bl,SC_NEN,-1);
-		}
+		if (tsc && tsc->data[SC_NEN].timer != -1)
+			status_change_end(bl,SC_NEN,-1);
 		break;
 	case CG_MOONLIT:
 		clif_skill_nodamage(src,bl,skillid,skilllv,1);
@@ -9339,7 +9334,7 @@ int skill_landprotector (struct block_list *bl, va_list ap)
 				case SA_VOLCANO:
 				case SA_DELUGE:
 				case SA_VIOLENTGALE:
-					skill_delunit(unit);
+					(*alive) = 0;
 					return 1;
 			}
 			break;

+ 4 - 3
src/map/status.c

@@ -403,8 +403,8 @@ void initChangeTables(void) {
 	StatusIconChangeTable[SC_ASPDPOTION1] = SI_ASPDPOTION;
 	StatusIconChangeTable[SC_ASPDPOTION2] = SI_ASPDPOTION;
 	StatusIconChangeTable[SC_ASPDPOTION3] = SI_ASPDPOTION;
-	StatusIconChangeTable[SC_SPEEDUP0] = SI_SPEEDPOTION;
-	StatusIconChangeTable[SC_SPEEDUP1] = SI_SPEEDPOTION;
+	StatusIconChangeTable[SC_SPEEDUP0] = SI_SPEEDPOTION1;
+	StatusIconChangeTable[SC_SPEEDUP1] = SI_SPEEDPOTION2;
 	StatusIconChangeTable[SC_MIRACLE] = SI_SPIRIT;
 	
 	//Other SC which are not necessarily associated to skills.
@@ -5406,10 +5406,11 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 			break;
 		case SC_UTSUSEMI:
 			val2=(val1+1)/2; // number of hits blocked
-			val3=7; // move you back 7 cells
+			val3=skill_get_blewcount(NJ_UTSUSEMI, val1); //knockback value.
 			break;
 		case SC_BUNSINJYUTSU:
 			val2=(val1+1)/2; // number of hits blocked
+			break;
 		default:
 			if (calc_flag == SCB_NONE && StatusSkillChangeTable[type]==0)
 			{	//Status change with no calc, and no skill associated...? unknown?

+ 2 - 2
src/map/status.h

@@ -308,8 +308,8 @@ enum {
 	//38: Again Aspd Potion
 	//39: Again Aspd Potion
 	//40: Again Aspd Potion
-	SI_SPEEDPOTION		= 41,
-	//42: Again Speed Up
+	SI_SPEEDPOTION1	= 41,
+	SI_SPEEDPOTION2	= 42,
 	SI_STRIPWEAPON		= 50,
 	SI_STRIPSHIELD		= 51,
 	SI_STRIPARMOR		= 52,