Selaa lähdekoodia

Bug Fixes
* Fixed characters moving to unavailable slots using Character Moving System. Thanks to Napster. (bugreport:8987)
* Implemented MD_RANDOMTARGET. (bugreport:8781) (Hercules 10e6f1a)
* Implemented a new define for renewal status point calculation to separate from default renewal define. Thanks to @cydh. (bugreport:8784)
* Follow up to f511107 to fix a compile warning.
* Forcefully save characters before opening a Vending Shop to prevent invalid data from saving. (bugreport:8955)
* Fixed 2013-12-23 client from disconnecting after executing /limitedsale command. Thanks to Napster. (bugreport:9011)
* Fixed Elemental Shield displaying a warning to the console. (bugreport:9016)
* Elemental Shield requires a Blue Gemstone to cast.
* Adjusted Flash Combo to only consume 65 SP.
* Added missing skill_require_db defines for Episode 14.3 Part 2 skills in the pre-renewal database.

aleos89 11 vuotta sitten
vanhempi
commit
b44e5e11f2

+ 1 - 1
conf/map_athena.conf

@@ -95,7 +95,7 @@ minsave_time: 100
 // Apart from the autosave_time, players will also get saved when involved
 // in the following (add as needed):
 // 1: after every successful trade
-// 2: after every vending transaction
+// 2: after opening vending/every vending transaction
 // 4: after closing storage/guild storage.
 // 8: After hatching/returning to egg a pet.
 // 16: After successfully sending a mail with attachment

+ 1 - 0
db/packet_db.txt

@@ -2275,6 +2275,7 @@ packet_ver: 46
 0x09D8,2,dull,0 //npcmarketclosed
 0x09D6,-1,dull,0 //npcmarketpurchase
 0x09DF,7
+0x09B4,6,dull,0 // Cash Shop - Special Tab
 
 //Add new packets here
 //packet_ver: 47

+ 20 - 0
db/pre-re/skill_require_db.txt

@@ -940,6 +940,26 @@
 3027,0,0,55:60:65:70:75 ,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0				//OB_OBOROGENSOU
 3029,0,0,20:30:40:50:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0					//OB_AKAITSUKI
 
+// EP 14.3 Part 2 3rd Job Skills
+5001,0,0,22:34:46:58:70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0					//GC_DARKCROW
+5002,0,0,100:120:140:160:180,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0			//RA_UNLIMIT
+5003,0,0,60:70:80:90:100,0,0,0,99,0,0,none,0,0,970,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0				//GN_ILLUSIONDOPING
+5004,0,0,30:35:40:45:50:55:60:65:70:75,0,0,0,99,0,0,dragon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RK_DRAGONBREATH_WATER
+5005,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0								//RK_LUXANIMA
+5006,0,0,60:70:80:90:100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0				//NC_MAGMA_ERUPTION
+5007,0,0,200:230:260:290:320,0,0,0,13:14,0,0,none,0,0,6144,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0		//WM_FRIGG_SONG
+5008,0,0,120,0,0,0,99,0,0,elementalspirit,0,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0					//SO_ELEMENTAL_SHIELD
+5009,0,0,65,0,0,0,99,0,0,none,0,5:5:4:4:3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0						//SR_FLASHCOMBO
+5010,0,0,30:26:22:18:14,0,0,0,99,0,0,none,0,0,7940,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0				//SC_ESCAPE
+5011,0,0,30:60:90:120:150,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0				//AB_OFFERTORIUM
+5012,0,0,100:150:200:250:300,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0			//WL_TELEKINESIS_INTENSE
+5013,0,0,200:180:160:140:120,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0			//LG_KINGS_GRACE
+5014,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0								//ALL_FULL_THROTTLE
+5015,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0								//SR_FLASHCOMBO_ATK_STEP1 //All 4 steps are using temp req SP values for now.
+5016,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0								//SR_FLASHCOMBO_ATK_STEP2
+5017,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0								//SR_FLASHCOMBO_ATK_STEP3
+5018,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0								//SR_FLASHCOMBO_ATK_STEP4
+
 // Copied Bard / Dancer Skills
 //3036,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0							//BA_POEMBRAGI2
 //3037,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0							//DC_FORTUNEKISS2

+ 2 - 2
db/re/skill_require_db.txt

@@ -963,8 +963,8 @@
 5005,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0								//RK_LUXANIMA
 5006,0,0,60:70:80:90:100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0				//NC_MAGMA_ERUPTION
 5007,0,0,200:230:260:290:320,0,0,0,13:14,0,0,none,0,0,6144,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0		//WM_FRIGG_SONG
-5008,0,0,120,0,0,0,99,0,0,elementalspirit,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0					//SO_ELEMENTAL_SHIELD
-5009,0,0,75:65:55:45:35,0,0,0,99,0,0,none,0,5:5:4:4:3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0			//SR_FLASHCOMBO
+5008,0,0,120,0,0,0,99,0,0,elementalspirit,0,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0					//SO_ELEMENTAL_SHIELD
+5009,0,0,65,0,0,0,99,0,0,none,0,5:5:4:4:3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0						//SR_FLASHCOMBO
 5010,0,0,30:26:22:18:14,0,0,0,99,0,0,none,0,0,7940,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0				//SC_ESCAPE
 5011,0,0,30:60:90:120:150,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0				//AB_OFFERTORIUM
 5012,0,0,100:150:200:250:300,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0			//WL_TELEKINESIS_INTENSE

+ 1 - 2
doc/mob_db_mode_list.txt

@@ -26,7 +26,7 @@ MD_ANGRY              | 0x000800 |   2048
 MD_CHANGETARGET_MELEE | 0x001000 |   4096
 MD_CHANGETARGET_CHASE | 0x002000 |   8192
 MD_TARGETWEAK         | 0x004000 |  16384
-MD_RANDOMTARGET       | 0x008000 |  32768 (not implemented)
+MD_RANDOMTARGET       | 0x008000 |  32768
 MD_IGNOREMELEE        | 0x010000 |  65536
 MD_IGNOREMAGIC        | 0x020000 |  131072
 MD_IGNORERANGED       | 0x040000 |  262144
@@ -81,7 +81,6 @@ Target Weak: Allows aggressive monsters to only be aggressive against
 	For example, a monster of level 104 will not pick fights with a level 99.
 
 Random Target: Picks a new random target in range on each attack / skill.
-	(not implemented)
 
 Ignore Melee: The mob will take 1 HP damage from physical attacks.
 

+ 3 - 3
src/char/char_clif.c

@@ -57,8 +57,8 @@ int chclif_parse_moveCharSlot( int fd, struct char_session_data* sd){
 		return 1;
 	}
 
-	// We dont even have a character on the chosen slot?
-	if( sd->found_char[from] <= 0 ){
+	// We don't even have a character on the chosen slot?
+	if( sd->found_char[from] <= 0 || to >= sd->char_slots ){
 		chclif_moveCharSlotReply( fd, sd, from, 1 );
 		return 1;
 	}
@@ -78,7 +78,7 @@ int chclif_parse_moveCharSlot( int fd, struct char_session_data* sd){
 				return 1;
 			}
 		}else{
-			// Admin doesnt allow us to
+			// Admin doesn't allow us to
 			chclif_moveCharSlotReply( fd, sd, from, 1 );
 			return 1;
 		}

+ 6 - 0
src/config/renewal.h

@@ -63,6 +63,12 @@
 /// - some skill/item ASPD bonuses won't stack
 #define RENEWAL_ASPD
 
+/// renewal stat calculations
+/// (disable by commenting the line)
+///
+/// leave this line to enable renewal calculation for increasing status/parameter points
+#define RENEWAL_STAT
+
 #endif
 
 #endif // _CONFIG_RENEWAL_H_

+ 17 - 9
src/map/mob.c

@@ -1637,10 +1637,16 @@ static bool mob_ai_sub_hard(struct mob_data *md, unsigned int tick)
 
 		if(tbl->type == BL_PC)
 			mob_log_damage(md, tbl, 0); //Log interaction (counts as 'attacker' for the exp bonus)
-		if( !(md->sc.option&OPTION_HIDE) )
+
+		if( !(mode&MD_RANDOMTARGET) )
 			unit_attack(&md->bl,tbl->id,1);
-		else
-			mobskill_use(md, tick, -1);
+		else { // Attack once and find a new random target
+			int search_size = (view_range < md->status.rhw.range) ? view_range : md->status.rhw.range;
+			unit_attack(&md->bl, tbl->id, 0);
+			tbl = battle_getenemy(&md->bl, DEFAULT_ENEMY_TYPE(md), search_size);
+			md->target_id = tbl->id;
+			md->min_chase = md->db->range3;
+		}
 		return true;
 	}
 
@@ -3122,6 +3128,7 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
 	struct block_list *bl;
 	struct mob_data *fmd = NULL;
 	int i,j,n;
+	short skill_target;
 
 	nullpo_ret(md);
 	nullpo_ret(ms = md->db->skill);
@@ -3221,10 +3228,11 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
 			continue; //Skill requisite failed to be fulfilled.
 
 		//Execute skill
+		skill_target = (md->db->status.mode&MD_RANDOMTARGET) ? MST_RANDOM : ms[i].target;
 		if (skill_get_casttype(ms[i].skill_id) == CAST_GROUND)
 		{	//Ground skill.
 			short x, y;
-			switch (ms[i].target) {
+			switch (skill_target) {
 				case MST_RANDOM: //Pick a random enemy within skill range.
 					bl = battle_getenemy(&md->bl, DEFAULT_ENEMY_TYPE(md),
 						skill_get_range2(&md->bl, ms[i].skill_id, ms[i].skill_lv));
@@ -3254,10 +3262,10 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
 			x = bl->x;
 		  	y = bl->y;
 			// Look for an area to cast the spell around...
-			if (ms[i].target >= MST_AROUND1 || ms[i].target >= MST_AROUND5) {
-				j = ms[i].target >= MST_AROUND1?
-					(ms[i].target-MST_AROUND1) +1:
-					(ms[i].target-MST_AROUND5) +1;
+			if (skill_target >= MST_AROUND1 || skill_target >= MST_AROUND5) {
+				j = skill_target >= MST_AROUND1?
+					(skill_target-MST_AROUND1) +1:
+					(skill_target-MST_AROUND5) +1;
 				map_search_freecell(&md->bl, md->bl.m, &x, &y, j, j, 3);
 			}
 			md->skill_idx = i;
@@ -3270,7 +3278,7 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
 			}
 		} else {
 			//Targetted skill
-			switch (ms[i].target) {
+			switch (skill_target) {
 				case MST_RANDOM: //Pick a random enemy within skill range.
 					bl = battle_getenemy(&md->bl, DEFAULT_ENEMY_TYPE(md),
 						skill_get_range2(&md->bl, ms[i].skill_id, ms[i].skill_lv));

+ 2 - 2
src/map/pc.c

@@ -6384,7 +6384,7 @@ int pc_need_status_point(struct map_session_data* sd, int type, int val)
 		swap(low, high);
 
 	for ( ; low < high; low++ )
-#ifdef RENEWAL // renewal status point cost formula
+#ifdef RENEWAL_STAT // renewal status point cost formula
 		sp += (low < 100) ? (2 + (low - 1) / 10) : (16 + 4 * ((low - 100) / 5));
 #else
 		sp += ( 1 + (low + 9) / 10 );
@@ -6408,7 +6408,7 @@ int pc_maxparameterincrease(struct map_session_data* sd, int type)
 	base = final_val = pc_getstat(sd, type);
 
 	while (final_val <= pc_maxparameter(sd, (enum e_params)(type-SP_STR)) && status_points >= 0) {
-#ifdef RENEWAL // renewal status point cost formula
+#ifdef RENEWAL_STAT // renewal status point cost formula
 		status_points -= (final_val < 100) ? (2 + (final_val - 1) / 10) : (16 + 4 * ((final_val - 100) / 5));
 #else
 		status_points -= ( 1 + (final_val + 9) / 10 );

+ 4 - 0
src/map/skill.c

@@ -10114,6 +10114,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		skill_attack(skill_get_type(RL_QD_SHOT),src,src,bl,skill_id,skill_lv,tick,flag|BCT_ENEMY|SD_LEVEL|SD_ANIMATION);
 		break;
 
+	case SO_ELEMENTAL_SHIELD:
+		// Used to avoid displaying the warning below.
+		break;
+
 	default:
 		ShowWarning("skill_castend_nodamage_id: Unknown skill used:%d\n",skill_id);
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,1);

+ 1 - 1
src/map/status.c

@@ -2022,7 +2022,7 @@ int status_check_visibility(struct block_list *src, struct block_list *target)
 					return 0;
 				if (tsc->data[SC_CLOAKINGEXCEED] && !(status->mode&MD_BOSS) && (tsd->special_state.perfect_hiding || (status->mode&MD_DETECTOR)))
 					return 0;
-				if (tsc && tsc->data[SC__FEINTBOMB] && !(status->mode&MD_BOSS|MD_DETECTOR))
+				if (tsc && tsc->data[SC__FEINTBOMB] && !(status->mode&(MD_BOSS|MD_DETECTOR)))
 					return 0;
 			}
 			break;

+ 4 - 1
src/map/vending.c

@@ -271,7 +271,7 @@ void vending_purchasereq(struct map_session_data* sd, int aid, int uid, const ui
 	}
 	vsd->vend_num = cursor;
 
-	//Always save BOTH: buyer and customer
+	//Always save BOTH: customer (buyer) and vender
 	if( save_settings&2 ) {
 		chrif_save(sd,0);
 		chrif_save(vsd,0);
@@ -322,6 +322,9 @@ bool vending_openvending(struct map_session_data* sd, const char* message, const
 		return false;
 	}
 
+	if (save_settings&2) // Avoid invalid data from saving
+		chrif_save(sd, 0);
+
 	// filter out invalid items
 	i = 0;
 	for( j = 0; j < count; j++ ) {