فهرست منبع

Cap reflected damage to max HP of the one reflecting - Fixes bugreport:7375
Minor fix to Reflect Damage timer going over time limit - Fixes bugreport:7511
Fix npc_idle_timer error when SECURE_NPC_TIMEOUT is not enabled (lighta) - Fixes bugreport:7623
Fix freezing issues after being forcefully closed out of an NPC (lighta) - Fixes bugreport:7615
Follow up to r17300 - Fix /guildinvite issue (lighta) bugreport:7612 (Now available for 20120410)
Some fixing up of Crescent Blow

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

akinari1087 12 سال پیش
والد
کامیت
ad11dd689a
7فایلهای تغییر یافته به همراه20 افزوده شده و 16 حذف شده
  1. 1 1
      db/packet_db.txt
  2. 1 0
      src/common/mmo.h
  3. 7 4
      src/map/battle.c
  4. 1 1
      src/map/clif.c
  5. 2 2
      src/map/guild.c
  6. 7 7
      src/map/pc.c
  7. 1 1
      src/map/status.c

+ 1 - 1
db/packet_db.txt

@@ -1758,6 +1758,7 @@ packet_ver: 30
 0x08D7,28,battlegroundreg,2:4 //Added to prevent disconnections
 0x08D7,28,battlegroundreg,2:4 //Added to prevent disconnections
 0x08CF,10 //Amulet spirits
 0x08CF,10 //Amulet spirits
 0x0977,14 //Monster HP Bar
 0x0977,14 //Monster HP Bar
+0x0916,26,guildinvite2,2
 
 
 //2012-04-18aRagexeRE [Special Thanks to Judas!]
 //2012-04-18aRagexeRE [Special Thanks to Judas!]
 packet_ver:31
 packet_ver:31
@@ -1777,7 +1778,6 @@ packet_ver:31
 0x0368,6,solvecharname,2
 0x0368,6,solvecharname,2
 0x08E5,41,bookingregreq,2:4     //Added to prevent disconnections
 0x08E5,41,bookingregreq,2:4     //Added to prevent disconnections
 0x08d2,10
 0x08d2,10
-0x0916,26,guildinvite2,2
 
 
 //2012-06-18
 //2012-06-18
 packet_ver: 32
 packet_ver: 32

+ 1 - 0
src/common/mmo.h

@@ -48,6 +48,7 @@
 
 
 #ifndef PACKETVER
 #ifndef PACKETVER
 	#define PACKETVER 20120410
 	#define PACKETVER 20120410
+	//#define PACKETVER 20130320
 	//#define PACKETVER 20111116
 	//#define PACKETVER 20111116
 #endif
 #endif
 
 

+ 7 - 4
src/map/battle.c

@@ -4607,6 +4607,7 @@ struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct bl
 int battle_calc_return_damage(struct block_list* bl, struct block_list *src, int *dmg, int flag, uint16 skill_id){
 int battle_calc_return_damage(struct block_list* bl, struct block_list *src, int *dmg, int flag, uint16 skill_id){
 	struct map_session_data* sd;
 	struct map_session_data* sd;
 	int rdamage = 0, damage = *dmg;
 	int rdamage = 0, damage = *dmg;
+	int max_damage = status_get_max_hp(bl);
 	struct status_change* sc;
 	struct status_change* sc;
 
 
 	sd = BL_CAST(BL_PC, bl);
 	sd = BL_CAST(BL_PC, bl);
@@ -4614,16 +4615,18 @@ int battle_calc_return_damage(struct block_list* bl, struct block_list *src, int
 
 
 	if( sc && sc->data[SC_REFLECTDAMAGE] ) {
 	if( sc && sc->data[SC_REFLECTDAMAGE] ) {
 		if( rnd()%100 <= sc->data[SC_REFLECTDAMAGE]->val1*10 + 30 ){
 		if( rnd()%100 <= sc->data[SC_REFLECTDAMAGE]->val1*10 + 30 ){
-			int max_damage = (int64)status_get_max_hp(bl) * status_get_lv(bl) / 100;
+			max_damage *= status_get_lv(bl) / 100;
 			rdamage = (int64)(*dmg) * sc->data[SC_REFLECTDAMAGE]->val2 / 100;
 			rdamage = (int64)(*dmg) * sc->data[SC_REFLECTDAMAGE]->val2 / 100;
 			if( --(sc->data[SC_REFLECTDAMAGE]->val3) < 1)
 			if( --(sc->data[SC_REFLECTDAMAGE]->val3) < 1)
 				status_change_end(bl,SC_REFLECTDAMAGE,INVALID_TIMER);
 				status_change_end(bl,SC_REFLECTDAMAGE,INVALID_TIMER);
-			if( rdamage > max_damage ) rdamage = max_damage;
 		}
 		}
-	}else if( sc && sc->data[SC_CRESCENTELBOW] && !is_boss(src) && rnd()%100 < sc->data[SC_CRESCENTELBOW]->val2 ){
+	}else if( sc && sc->data[SC_CRESCENTELBOW] && !is_boss(src) && rnd()%100 < sc->data[SC_CRESCENTELBOW]->val2 ){ //TODO: This is a counter-attack skill, put it by Reject Sword
 		//ATK [{(Target HP / 100) x Skill Level} x Caster Base Level / 125] % + [Received damage x {1 + (Skill Level x 0.2)}]
 		//ATK [{(Target HP / 100) x Skill Level} x Caster Base Level / 125] % + [Received damage x {1 + (Skill Level x 0.2)}]
+		struct status_data *status = status_get_status_data(bl);
+		struct status_data *tstatus = status_get_status_data(src);
 		int ratio = (int64)(status_get_hp(src) / 100) * sc->data[SC_CRESCENTELBOW]->val1 * status_get_lv(bl) / 125;
 		int ratio = (int64)(status_get_hp(src) / 100) * sc->data[SC_CRESCENTELBOW]->val1 * status_get_lv(bl) / 125;
 		if (ratio > 5000) ratio = 5000; // Maximum of 5000% ATK
 		if (ratio > 5000) ratio = 5000; // Maximum of 5000% ATK
+		rdamage = battle_calc_base_damage(status,&status->rhw,sc,tstatus->size,sd,0);
 		rdamage = (int64)rdamage * ratio / 100 + (*dmg) * (10 + sc->data[SC_CRESCENTELBOW]->val1 * 20 / 10) / 10;
 		rdamage = (int64)rdamage * ratio / 100 + (*dmg) * (10 + sc->data[SC_CRESCENTELBOW]->val1 * 20 / 10) / 10;
 		skill_blown(bl, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, sc->data[SC_CRESCENTELBOW]->val1), unit_getdir(src), 0);
 		skill_blown(bl, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, sc->data[SC_CRESCENTELBOW]->val1), unit_getdir(src), 0);
 		clif_skill_damage(bl, src, gettick(), status_get_amotion(src), 0, rdamage,
 		clif_skill_damage(bl, src, gettick(), status_get_amotion(src), 0, rdamage,
@@ -4666,7 +4669,7 @@ int battle_calc_return_damage(struct block_list* bl, struct block_list *src, int
 	if( sc && sc->data[SC_KYOMU] ) // Nullify reflecting ability
 	if( sc && sc->data[SC_KYOMU] ) // Nullify reflecting ability
 		rdamage = 0;
 		rdamage = 0;
 
 
-	return rdamage;
+	return min(rdamage,max_damage);
 }
 }
 
 
 void battle_drain(TBL_PC *sd, struct block_list *tbl, int rdamage, int ldamage, int race, int boss)
 void battle_drain(TBL_PC *sd, struct block_list *tbl, int rdamage, int ldamage, int race, int boss)

+ 1 - 1
src/map/clif.c

@@ -12138,7 +12138,7 @@ void clif_parse_GuildInvite(int fd,struct map_session_data *sd)
 }
 }
 
 
 /// Guild invite request (/guildinvite)
 /// Guild invite request (/guildinvite)
-/// 0916 <char name>.24B
+/// 0916 <char name>.24B (CZ_REQ_JOIN_GUILD2)
 void
 void
 clif_parse_GuildInvite2(int fd, struct map_session_data *sd) {
 clif_parse_GuildInvite2(int fd, struct map_session_data *sd) {
 	struct map_session_data *t_sd = map_nick2sd((char *)RFIFOP(fd, 2));
 	struct map_session_data *t_sd = map_nick2sd((char *)RFIFOP(fd, 2));

+ 2 - 2
src/map/guild.c

@@ -613,7 +613,7 @@ int guild_invite(struct map_session_data *sd, struct map_session_data *tsd) {
 		return 0; //Invite permission.
 		return 0; //Invite permission.
 
 
 	if(!battle_config.invite_request_check) {
 	if(!battle_config.invite_request_check) {
-        if (tsd->party_invite > 0 || tsd->trade_partner || tsd->adopt_invite) { //checking if there no other invitation pending
+	if (tsd->party_invite > 0 || tsd->trade_partner || tsd->adopt_invite) { //checking if there no other invitation pending
 			clif_guild_inviteack(sd,0);
 			clif_guild_inviteack(sd,0);
 			return 0;
 			return 0;
 		}
 		}
@@ -632,7 +632,7 @@ int guild_invite(struct map_session_data *sd, struct map_session_data *tsd) {
 		return 0;
 		return 0;
 	}
 	}
 
 
-    //search an empty spot in guild
+	//search an empty spot in guild
 	ARR_FIND( 0, g->max_member, i, g->member[i].account_id == 0 );
 	ARR_FIND( 0, g->max_member, i, g->member[i].account_id == 0 );
 	if(i==g->max_member){
 	if(i==g->max_member){
 		clif_guild_inviteack(sd,3);
 		clif_guild_inviteack(sd,3);

+ 7 - 7
src/map/pc.c

@@ -6579,19 +6579,19 @@ void pc_close_npc(struct map_session_data *sd,int flag) {
 			sd->state.using_fake_npc = 0;
 			sd->state.using_fake_npc = 0;
 		}
 		}
 		if (sd->st) {
 		if (sd->st) {
-			sd->st->state = (flag==1)?CLOSE:END;
+			sd->st->state = ((flag==1 && sd->st->mes_active)?CLOSE:END);
 			sd->st->mes_active = 0;
 			sd->st->mes_active = 0;
 		}
 		}
 		sd->state.menu_or_input = 0;
 		sd->state.menu_or_input = 0;
 		sd->npc_menu = 0;
 		sd->npc_menu = 0;
+#ifdef SECURE_NPCTIMEOUT
 		sd->npc_idle_timer = INVALID_TIMER;
 		sd->npc_idle_timer = INVALID_TIMER;
+#endif
 		clif_scriptclose(sd,sd->npc_id);
 		clif_scriptclose(sd,sd->npc_id);
-		if(flag==2 && sd->st) {
-			if( sd->st && sd->st->state != RUN ) {// free attached scripts that are waiting
-				script_free_state(sd->st);
-				sd->st = NULL;
-				sd->npc_id = 0;
-			}
+		if(sd->st && sd->st->state == END ) {// free attached scripts that are waiting
+			script_free_state(sd->st);
+			sd->st = NULL;
+			sd->npc_id = 0;
 		}
 		}
 	}
 	}
 }
 }

+ 1 - 1
src/map/status.c

@@ -10644,7 +10644,7 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
 		break;
 		break;
 
 
 	case SC_REFLECTDAMAGE:
 	case SC_REFLECTDAMAGE:
-		if( --(sce->val4) >= 0 ) {
+		if( --(sce->val4) > 0 ) {
 			if( !status_charge(bl,0,10) )
 			if( !status_charge(bl,0,10) )
  				break;
  				break;
 			sc_timer_next(1000 + tick, status_change_timer, bl->id, data);
 			sc_timer_next(1000 + tick, status_change_timer, bl->id, data);