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.
This commit is contained in:
parent
efdca3e25d
commit
b44e5e11f2
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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_
|
||||
|
@ -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));
|
||||
|
@ -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 );
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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++ ) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user