Bug Fixes

* Removed unused guild aura leftovers and fixed some other issues with setting the guild aura. (bugreport:8892)
* Fixed Fire Expansion Acid to be a magic type attack. Thanks to exneval.
* Cleaned up some remaining issues with Issen. (bugreport:8905)
* 16th Night (Izayoi) should remove fixed cast time from all skills.
* Circle of Nature is now part of Group B songs.
* Updated Reading Spell Book spell memorization to official.
* Updated homunculus skill cooldowns.
* Added missing Holy element bonus for Hesperus Lit.
* Fixed Coluseo Heal and Praefatio not giving a party bonus. (bugreport:8904)
* Fixed the status icon for ALL_RIDING not being displayed at login.
* Adjusted the notice display order when players login. (Hercules df1952d)
* Self skills can now be used while storage is open. (Hercules 6f6a6b3)
* Cleaned up SC_NOCHAT/Manner system. (Hercules 94ef1ee)
This commit is contained in:
aleos89 2014-04-16 11:06:09 -04:00
parent 06986d6540
commit 1d1a58cdcb
19 changed files with 224 additions and 168 deletions

View File

@ -51,3 +51,9 @@ require_glory_guild: no
// If you want to change this value, clear the guild alliance table.
// Default is 3
max_guild_alliance: 3
// When to re-display the guild notice
// Upon teleporting (regardless of changing maps): 2 (official)
// Upon changing maps: 1
// Do not re-display: 0 (disabled)
guild_notice_changemap: 2

View File

@ -1777,23 +1777,23 @@
//-- HLIF_AVOID
8002,0,35000,0,40000:35000:30000:25000:20000,0,0
//-- HLIF_CHANGE
8004,0,600000:900000:1200000,0,60000:180000:300000,0,0
8004,0,0,0,60000:180000:300000,600000:900000:1200000,0
//-- HAMI_CASTLE
8005,0,0,0,0,60000:70000:80000:90000:129000,0
8005,0,0,0,0,1000,0
//-- HAMI_DEFENCE
8006,0,0,0,40000:35000:30000:25000:20000,0,0
8006,0,30000,0,40000:35000:30000:25000:20000,0,0
//-- HAMI_BLOODLUST
8008,0,0,0,60000:180000:300000,300000:600000:900000,0
//-- HFLI_MOON
8009,0,0,1000,0,0,0
8009,0,0,2000,0,0,0
//-- HFLI_FLEET
8010,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000,0
//-- HFLI_SPEED
8011,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000,0
//-- HVAN_CAPRICE
8013,0,1000:1200:1400:1600:1800,0,0,0,0
8013,0,2000:2200:2400:2600:2800,0,0,0,0
//-- HVAN_CHAOTIC
8014,0,1000,1000,0,0,0
8014,0,3000,3000,0,0,0
//-- HVAN_EXPLOSION
8016,0,0,1000,0,0,0
//==========================================

View File

@ -1200,7 +1200,7 @@
2486,9,6,2,0,0,0,5,1,yes,0,0,0,none,0,0x0, GN_FIRE_EXPANSION,Fire Expansion
2487,9,6,2,0,0,0,1,1,no,0,0,0,none,0,0x0, GN_FIRE_EXPANSION_SMOKE_POWDER,Fire Expansion Smoke Powder
2488,9,6,2,0,0,0,1,1,no,0,0,0,none,0,0x0, GN_FIRE_EXPANSION_TEAR_GAS,Fire Expansion Tear Gas
2489,11,8,1,-1,0x28,0,10,1:2:3:4:5:6:7:8:9:10,no,0,0,0,weapon,0,0x0, GN_FIRE_EXPANSION_ACID,Fire Expansion Acid
2489,11,8,1,-1,0x28,0,10,1:2:3:4:5:6:7:8:9:10,no,0,0,0,magic,0,0x0, GN_FIRE_EXPANSION_ACID,Fire Expansion Acid
2490,9,6,2,0,0x3,1,5,1,yes,0,0x80,2:3:4:5:6,none,0,0x0, GN_HELLS_PLANT,Hell's Plant
2491,0,6,1,0,0x90,0,5,1,no,0,0,0,misc,0,0x0, GN_HELLS_PLANT_ATK,Hell's Plant Attack
2492,0,6,4,0,0x3,5:6:6:7:7,5,1,yes,0,0,0,none,0,0x0, GN_MANDRAGORA,Howling of Mandragora

View File

@ -623,7 +623,6 @@
2228,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 //WL_SUMMON_ATK_GROUND
2229,0,0,10:12:14:16:18,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_SUMMONSTONE
2230,0,0,3:20,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_RELEASE
2231,0,0,40,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_READING_SB
//2232,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 //WL_FREEZE_SP (Passive Skill)
//****

View File

@ -1765,23 +1765,23 @@
//-- HLIF_AVOID
8002,0,35000,0,40000:35000:30000:25000:20000,0,0,-1
//-- HLIF_CHANGE
8004,0,600000:900000:1200000,0,60000:120000:180000,0,0,-1
8004,0,0,0,60000:180000:300000,600000:900000:1200000,0,-1
//-- HAMI_CASTLE
8005,0,0,0,0,60000:70000:80000:90000:129000,0,-1
8005,0,0,0,0,1000,0,-1
//-- HAMI_DEFENCE
8006,0,0,0,40000:35000:30000:25000:20000,0,0,-1
8006,0,30000,0,40000:35000:30000:25000:20000,0,0,-1
//-- HAMI_BLOODLUST
8008,0,0,0,60000:180000:300000,300000:600000:900000,0,-1
//-- HFLI_MOON
8009,0,0,1000,0,0,0,-1
8009,0,0,2000,0,0,0,-1
//-- HFLI_FLEET
8010,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000,0,-1
//-- HFLI_SPEED
8011,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000,0,-1
//-- HVAN_CAPRICE
8013,0,1000:1200:1400:1600:1800,0,0,0,0,-1
8013,0,2000:2200:2400:2600:2800,0,0,0,0,-1
//-- HVAN_CHAOTIC
8014,0,1000,1000,0,0,0,-1
8014,0,3000,3000,0,0,0,-1
//-- HVAN_EXPLOSION
8016,0,0,1000,0,0,0,-1
//==========================================

View File

@ -1200,7 +1200,7 @@
2486,9,6,2,0,0,0,5,1,yes,0,0,0,none,0,0x0, GN_FIRE_EXPANSION,Fire Expansion
2487,9,6,2,0,0,0,1,1,no,0,0,0,none,0,0x0, GN_FIRE_EXPANSION_SMOKE_POWDER,Fire Expansion Smoke Powder
2488,9,6,2,0,0,0,1,1,no,0,0,0,none,0,0x0, GN_FIRE_EXPANSION_TEAR_GAS,Fire Expansion Tear Gas
2489,11,8,1,-1,0x28,0,10,1:2:3:4:5:6:7:8:9:10,no,0,0,0,weapon,0,0x0, GN_FIRE_EXPANSION_ACID,Fire Expansion Acid
2489,11,8,1,-1,0x28,0,10,1:2:3:4:5:6:7:8:9:10,no,0,0,0,magic,0,0x0, GN_FIRE_EXPANSION_ACID,Fire Expansion Acid
2490,9,6,2,0,0x3,1,5,1,yes,0,0x80,2:3:4:5:6,none,0,0x0, GN_HELLS_PLANT,Hell's Plant
2491,0,6,1,0,0x90,0,5,1,no,0,0,0,misc,0,0x0, GN_HELLS_PLANT_ATK,Hell's Plant Attack
2492,0,6,4,0,0x3,5:6:6:7:7,5,1,yes,0,0,0,none,0,0x0, GN_MANDRAGORA,Howling of Mandragora

View File

@ -623,7 +623,6 @@
2228,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 //WL_SUMMON_ATK_GROUND
2229,0,0,10:12:14:16:18,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_SUMMONSTONE
2230,0,0,3:20,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_RELEASE
2231,0,0,40,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_READING_SB
//2232,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 //WL_FREEZE_SP
//****

View File

@ -5131,6 +5131,11 @@ Examples:
// This will end the Freezing status for the invoking character.
sc_end SC_FREEZE;
Note: to use SC_NOCHAT you should alter Manner
set Manner, -5; // Will mute a user for 5 minutes
set Manner, 0; // Will unmute a user
set Manner, 5; // Will unmute a user and prevent the next use of 'Manner'
---------------------------------------
*getstatus(<effect type>{,<type>})

View File

@ -341,7 +341,7 @@ struct mmo_charstatus {
unsigned int status_point,skill_point;
int hp,max_hp,sp,max_sp;
unsigned int option;
short manner;
short manner; // Defines how many minutes a char will be muted, each negative point is equivalent to a minute.
unsigned char karma;
short hair,hair_color,clothes_color;
int party_id,guild_id,pet_id,hom_id,mer_id,ele_id;

View File

@ -2310,6 +2310,10 @@ static int battle_get_weapon_element(struct Damage wd, struct block_list *src, s
if (!sd)
element = ELE_NEUTRAL; //forced neutral for monsters
break;
case LG_HESPERUSLIT:
if (sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 4)
element = ELE_HOLY;
break;
case RL_H_MINE:
if (sd && sd->skill_id_old == RL_FLICKER) //Force RL_H_MINE deals fire damage if activated by RL_FLICKER
element = ELE_FIRE;
@ -2608,7 +2612,7 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list
}
#else
case NJ_ISSEN:
wd.damage = (40 * sstatus->str) + (8 / 100 * skill_lv * sstatus->hp);
wd.damage = (40 * sstatus->str) + (8 * skill_lv / 100 * sstatus->hp);
wd.damage2 = 0;
break;
case LK_SPIRALPIERCE:
@ -3457,11 +3461,11 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
skillratio = 120 * skill_lv;
if( sc && sc->data[SC_BANDING] )
skillratio += 200 * sc->data[SC_BANDING]->val2;
RE_LVL_DMOD(100);
if( sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 5 )
skillratio = skillratio * 150 / 100;
if( sc && sc->data[SC_INSPIRATION] )
skillratio += 600;
RE_LVL_DMOD(100);
break;
case SR_DRAGONCOMBO:
skillratio += 40 * skill_lv;
@ -5995,6 +5999,10 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
md.damage = 0;
else if(md.damage && tstatus->mode&MD_PLANT){
switch(skill_id){
case NJ_ISSEN: // Final Strike will MISS on "plant"-type mobs [helvetica]
md.damage = 0;
md.dmg_lv = ATK_FLEE;
break;
case HT_LANDMINE:
case MA_LANDMINE:
case HT_BLASTMINE:
@ -6002,10 +6010,6 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
case RA_CLUSTERBOMB:
#ifdef RENEWAL
break;
case NJ_ISSEN: // Final Strike will MISS on "plant"-type mobs [helvetica]
md.damage = 0;
md.dmg_lv=ATK_FLEE;
break;
#endif
default:
md.damage = 1;
@ -7564,6 +7568,7 @@ static const struct _battle_data {
{ "taekwon_mission_mobname", &battle_config.taekwon_mission_mobname, 0, 0, 2, },
{ "teleport_on_portal", &battle_config.teleport_on_portal, 0, 0, 1, },
{ "cart_revo_knockback", &battle_config.cart_revo_knockback, 1, 0, 1, },
{ "guild_notice_changemap", &battle_config.guild_notice_changemap, 2, 0, 2, },
};
#ifndef STATS_OPT_OUT
/**

View File

@ -538,6 +538,7 @@ extern struct Battle_Config
int taekwon_mission_mobname;
int teleport_on_portal;
int cart_revo_knockback;
int guild_notice_changemap;
} battle_config;
void do_init_battle(void);

View File

@ -7505,7 +7505,7 @@ void clif_guild_belonginfo(struct map_session_data *sd, struct guild *g)
WFIFOL(fd,2)=g->guild_id;
WFIFOL(fd,6)=g->emblem_id;
WFIFOL(fd,10)=g->position[ps].mode;
WFIFOB(fd,14)=(bool)(sd->state.gmaster_flag==g);
WFIFOB(fd,14)=(bool)(sd->state.gmaster_flag==1);
WFIFOL(fd,15)=0; // InterSID (unknown purpose)
memcpy(WFIFOP(fd,19),g->name,NAME_LENGTH);
WFIFOSET(fd,packet_len(0x16c));
@ -9472,6 +9472,7 @@ void clif_parse_WantToConnection(int fd, struct map_session_data* sd)
void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
{
int i;
bool guild_notice = false;
if(sd->bl.prev != NULL)
return;
@ -9624,6 +9625,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
if(sd->state.connect_new) {
int lv;
guild_notice = true;
sd->state.connect_new = 0;
clif_skillinfoblock(sd);
clif_hotkeys_send(sd);
@ -9640,6 +9642,8 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
clif_status_load(&sd->bl, SI_RIDING, 1);
else if (sd->sc.option&OPTION_WUGRIDER)
clif_status_load(&sd->bl, SI_WUGRIDER, 1);
else if (sd->sc.data[SC_ALL_RIDING])
clif_status_load(&sd->bl, SI_ALL_RIDING, 1);
if(sd->status.manner < 0)
sc_start(&sd->bl,&sd->bl,SC_NOCHAT,100,0,0);
@ -9700,6 +9704,10 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
//clif_vip_display_info(sd,ZC_PERSONAL_INFOMATION_CHN);
}
#endif
if (sd->guild && battle_config.guild_notice_changemap == 1)
clif_guild_notice(sd, sd->guild); // Displays after VIP
if( (battle_config.bg_flee_penalty != 100 || battle_config.gvg_flee_penalty != 100) &&
(map_flag_gvg(sd->state.pmap) || map_flag_gvg(sd->bl.m) || map[sd->state.pmap].flag.battleground || map[sd->bl.m].flag.battleground) )
status_calc_bl(&sd->bl, SCB_FLEE); //Refresh flee penalty
@ -9742,10 +9750,11 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
sd->state.changemap = false;
// Instances do not need their own channels
if( Channel_Config.map_enable && Channel_Config.map_autojoin && !map[sd->bl.m].flag.chmautojoin && !map[sd->bl.m].instance_id ) {
if( Channel_Config.map_enable && Channel_Config.map_autojoin && !map[sd->bl.m].flag.chmautojoin && !map[sd->bl.m].instance_id )
channel_mjoin(sd); //join new map
}
}
} else if (sd->guild && (battle_config.guild_notice_changemap == 2 || guild_notice))
clif_guild_notice(sd, sd->guild); // Displays at end
mail_clear(sd);
@ -9753,10 +9762,10 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
/* Guild Aura Init */
if( sd->state.gmaster_flag ) {
guild_guildaura_refresh(sd,GD_LEADERSHIP,guild_checkskill(sd->state.gmaster_flag,GD_LEADERSHIP));
guild_guildaura_refresh(sd,GD_GLORYWOUNDS,guild_checkskill(sd->state.gmaster_flag,GD_GLORYWOUNDS));
guild_guildaura_refresh(sd,GD_SOULCOLD,guild_checkskill(sd->state.gmaster_flag,GD_SOULCOLD));
guild_guildaura_refresh(sd,GD_HAWKEYES,guild_checkskill(sd->state.gmaster_flag,GD_HAWKEYES));
guild_guildaura_refresh(sd,GD_LEADERSHIP,guild_checkskill(sd->guild,GD_LEADERSHIP));
guild_guildaura_refresh(sd,GD_GLORYWOUNDS,guild_checkskill(sd->guild,GD_GLORYWOUNDS));
guild_guildaura_refresh(sd,GD_SOULCOLD,guild_checkskill(sd->guild,GD_SOULCOLD));
guild_guildaura_refresh(sd,GD_HAWKEYES,guild_checkskill(sd->guild,GD_HAWKEYES));
}
if( sd->state.vending ) { /* show we have a vending */
@ -11275,8 +11284,15 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
#endif
}
if( (pc_cant_act2(sd) || sd->chatID) && skill_id != RK_REFRESH && !(skill_id == SR_GENTLETOUCH_CURE && (sd->sc.opt1 == OPT1_STONE || sd->sc.opt1 == OPT1_FREEZE || sd->sc.opt1 == OPT1_STUN)) )
if( (pc_cant_act2(sd) || sd->chatID) && skill_id != RK_REFRESH && !(skill_id == SR_GENTLETOUCH_CURE &&
(sd->sc.opt1 == OPT1_STONE || sd->sc.opt1 == OPT1_FREEZE || sd->sc.opt1 == OPT1_STUN)) &&
sd->state.storage_flag && !(tmp&INF_SELF_SKILL) ) //SELF skills can be used with the storage open, issue: 8027
return;
//Some self skills need to close the storage to work properly
if( skill_id == AL_TELEPORT && sd->state.storage_flag )
storage_storageclose(sd);
if( pc_issit(sd) )
return;
@ -11324,7 +11340,7 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
if( skill_id >= GD_SKILLBASE ) {
if( sd->state.gmaster_flag )
skill_lv = guild_checkskill(sd->state.gmaster_flag, skill_id);
skill_lv = guild_checkskill(sd->guild, skill_id);
else
skill_lv = 0;
} else {

View File

@ -481,7 +481,7 @@ int guild_recv_info(struct guild *sg) {
//Also set the guild master flag.
sd->guild = g;
sd->state.gmaster_flag = g;
sd->state.gmaster_flag = 1;
clif_charnameupdate(sd); // [LuzZza]
clif_guild_masterormember(sd);
}
@ -664,7 +664,7 @@ void guild_member_joined(struct map_session_data *sd) {
return;
}
if (strcmp(sd->status.name,g->master) == 0) { // set the Guild Master flag
sd->state.gmaster_flag = g;
sd->state.gmaster_flag = 1;
// prevent Guild Skills from being used directly after relog
if( battle_config.guild_skill_relog_delay )
guild_block_skill(sd, battle_config.guild_skill_relog_delay);
@ -830,7 +830,11 @@ int guild_member_withdraw(int guild_id, int account_id, int char_id, int flag, c
sd->guild_emblem_id = 0;
clif_charnameupdate(sd); //Update display name [Skotlex]
//TODO: send emblem update to self and people around
status_change_end(&sd->bl,SC_LEADERSHIP,INVALID_TIMER);
status_change_end(&sd->bl,SC_GLORYWOUNDS,INVALID_TIMER);
status_change_end(&sd->bl,SC_SOULCOLD,INVALID_TIMER);
status_change_end(&sd->bl,SC_HAWKEYES,INVALID_TIMER);
//@TODO: Send emblem update to self and people around
}
return 0;
}
@ -894,7 +898,6 @@ int guild_send_memberinfoshort(struct map_session_data *sd,int online) { // clea
if(sd->state.connect_new) { //Note that this works because it is invoked in parse_LoadEndAck before connect_new is cleared.
clif_guild_belonginfo(sd,g);
clif_guild_notice(sd,g);
sd->guild_emblem_id = g->emblem_id;
}
return 0;
@ -1290,9 +1293,8 @@ void guild_guildaura_refresh(struct map_session_data *sd, uint16 skill_id, uint1
status_change_end(&sd->bl,type,INVALID_TIMER);
}
group = skill_unitsetting(&sd->bl,skill_id,skill_lv,sd->bl.x,sd->bl.y,0);
if( group ) {
if( group )
sc_start4(NULL,&sd->bl,type,100,(battle_config.guild_aura&16)?0:skill_lv,0,0,group->group_id,600000);//duration doesn't matter these status never end with val4
}
return;
}
@ -1658,8 +1660,13 @@ int guild_broken(int guild_id,int flag) {
storage_guild_storage_quit(sd,1);
sd->status.guild_id=0;
sd->guild = NULL;
sd->state.gmaster_flag = 0;
clif_guild_broken(g->member[i].sd,0);
clif_charnameupdate(sd); // [LuzZza]
status_change_end(&sd->bl,SC_LEADERSHIP,INVALID_TIMER);
status_change_end(&sd->bl,SC_GLORYWOUNDS,INVALID_TIMER);
status_change_end(&sd->bl,SC_SOULCOLD,INVALID_TIMER);
status_change_end(&sd->bl,SC_HAWKEYES,INVALID_TIMER);
}
}
@ -1726,7 +1733,7 @@ int guild_gm_changed(int guild_id, int account_id, int char_id) {
if (g->member[0].sd && g->member[0].sd->fd) {
clif_displaymessage(g->member[0].sd->fd, msg_txt(g->member[pos].sd,679)); //"You have become the Guild Master!"
g->member[0].sd->state.gmaster_flag = g;
g->member[0].sd->state.gmaster_flag = 1;
//Block his skills to prevent abuse.
if (battle_config.guild_skill_relog_delay)
guild_block_skill(g->member[0].sd, battle_config.guild_skill_relog_delay);
@ -1748,6 +1755,7 @@ int guild_gm_changed(int guild_id, int account_id, int char_id) {
*---------------------------------------------------*/
int guild_break(struct map_session_data *sd,char *name) {
struct guild *g;
struct unit_data *ud;
int i;
#ifdef BOUND_ITEMS
int j;
@ -1773,6 +1781,28 @@ int guild_break(struct map_session_data *sd,char *name) {
return 0;
}
/* Regardless of char server allowing it, we clear the guild master's auras */
if((ud = unit_bl2ud(&sd->bl))) {
int count = 0;
struct skill_unit_group *group[4];
for(i = 0; i < MAX_SKILLUNITGROUP && ud->skillunit[i]; i++) {
switch(ud->skillunit[i]->skill_id) {
case GD_LEADERSHIP:
case GD_GLORYWOUNDS:
case GD_SOULCOLD:
case GD_HAWKEYES:
if(count == 4)
ShowWarning("guild_break: '%s' got more than 4 guild aura instances! (%d)\n",sd->status.name,ud->skillunit[i]->skill_id);
else
group[count++] = ud->skillunit[i];
break;
}
}
for(i = 0; i < count; i++)
skill_delunitgroup(group[i]);
}
#ifdef BOUND_ITEMS
//Guild bound item check - Removes the bound flag
j = pc_bound_chk(sd,2,idxlist);

View File

@ -7274,10 +7274,10 @@ void pc_revive(struct map_session_data *sd,unsigned int hp, unsigned int sp) {
pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
if( sd->state.gmaster_flag ) {
guild_guildaura_refresh(sd,GD_LEADERSHIP,guild_checkskill(sd->state.gmaster_flag,GD_LEADERSHIP));
guild_guildaura_refresh(sd,GD_GLORYWOUNDS,guild_checkskill(sd->state.gmaster_flag,GD_GLORYWOUNDS));
guild_guildaura_refresh(sd,GD_SOULCOLD,guild_checkskill(sd->state.gmaster_flag,GD_SOULCOLD));
guild_guildaura_refresh(sd,GD_HAWKEYES,guild_checkskill(sd->state.gmaster_flag,GD_HAWKEYES));
guild_guildaura_refresh(sd,GD_LEADERSHIP,guild_checkskill(sd->guild,GD_LEADERSHIP));
guild_guildaura_refresh(sd,GD_GLORYWOUNDS,guild_checkskill(sd->guild,GD_GLORYWOUNDS));
guild_guildaura_refresh(sd,GD_SOULCOLD,guild_checkskill(sd->guild,GD_SOULCOLD));
guild_guildaura_refresh(sd,GD_HAWKEYES,guild_checkskill(sd->guild,GD_HAWKEYES));
}
}
// script
@ -7554,7 +7554,13 @@ bool pc_setparam(struct map_session_data *sd,int type,int val)
break;
case SP_MANNER:
sd->status.manner = val;
break;
if( val < 0 )
sc_start(NULL, &sd->bl, SC_NOCHAT, 100, 0, 0);
else {
status_change_end(&sd->bl, SC_NOCHAT, INVALID_TIMER);
clif_manner_message(sd, 5);
}
return true; // status_change_start/status_change_end already sends packets warning the client
case SP_FAME:
sd->status.fame = val;
break;

View File

@ -203,7 +203,7 @@ struct map_session_data {
unsigned short autoloottype;
unsigned int autolooting : 1; //performance-saver, autolooting state for @alootid
unsigned short autobonus; //flag to indicate if an autobonus is activated. [Inkfish]
struct guild *gmaster_flag;
unsigned int gmaster_flag : 1;
unsigned int prevend : 1;//used to flag wheather you've spent 40sp to open the vending or not.
unsigned int warping : 1;//states whether you're in the middle of a warp processing
unsigned int permanent_speed : 1; // When 1, speed cannot be changed through status_calc_pc().

View File

@ -1613,7 +1613,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
case SC_REFRESH: case SC_STONEHARDSKIN: case SC_VITALITYACTIVATION:
case SC_FIGHTINGSPIRIT: case SC_ABUNDANCE: case SC__SHADOWFORM:
case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD:
case SC_HAWKEYES: case SC_GUILDAURA: case SC_PUSH_CART:
case SC_HAWKEYES: case SC_PUSH_CART:
case SC_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE:
case SC_GT_REVITALIZE: case SC_REFLECTDAMAGE: case SC_INSPIRATION:
case SC_EXEEDBREAK: case SC_FORCEOFVANGUARD: case SC_BANDING:
@ -3370,24 +3370,6 @@ static int skill_check_unit_range2 (struct block_list *bl, int x, int y, uint16
map_foreachinarea(npc_isnear_sub,bl->m,x - range,y - range,x + range,y + range,type,skill_id);
}
int skill_guildaura_sub (struct map_session_data* sd, int id, int strvit, int agidex)
{
if(id == sd->bl.id && battle_config.guild_aura&16)
return 0; // Do not affect guild leader
if (sd->sc.data[SC_GUILDAURA]) {
struct status_change_entry *sce = sd->sc.data[SC_GUILDAURA];
if( sce->val3 != strvit || sce->val4 != agidex ) {
sce->val3 = strvit;
sce->val4 = agidex;
status_calc_bl(&sd->bl, status_sc2scb_flag(SC_GUILDAURA));
}
return 0;
}
sc_start4(&sd->bl,&sd->bl, SC_GUILDAURA,100, 1, id, strvit, agidex, 1000);
return 1;
}
/*==========================================
* Checks that you have the requirements for casting a skill for homunculus/mercenary.
* Flag:
@ -4185,49 +4167,48 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
#ifndef RENEWAL
case NJ_ISSEN:
status_change_end(src, SC_NEN, INVALID_TIMER);
status_change_end(src, SC_HIDING, INVALID_TIMER);
#endif
// fall through
case MO_EXTREMITYFIST:
{
short x, y, i = 2; // Move 2 cells for Issen(from target)
struct block_list *mbl = bl;
short dir = 0;
struct block_list *mbl = bl; // For NJ_ISSEN
short x, y, i = 2; // Move 2 cells (From target)
short dir = map_calc_dir(src,bl->x,bl->y);
if (skill_id == MO_EXTREMITYFIST) {
mbl = src; // For MO_EXTREMITYFIST
i = 3; // Move 3 cells (From caster)
}
if (dir > 0 && dir < 4)
x = -i;
else if (dir > 4)
x = i;
else
x = 0;
if (dir > 2 && dir < 6)
y = -i;
else if (dir == 7 || dir < 2)
y = i;
else
y = 0;
// Ashura Strike still has slide effect in GVG
if ((mbl == src || (!map_flag_gvg2(src->m) && !map[src->m].flag.battleground)) &&
unit_movepos(src, mbl->x + x, mbl->y + y, 1, 1)) {
clif_slide(src, mbl->x + x, mbl->y + y);
clif_fixpos(src);
clif_spiritball(src);
}
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
if( skill_id == MO_EXTREMITYFIST )
{
mbl = src;
i = 3; // for Asura(from caster)
if (skill_id == MO_EXTREMITYFIST) {
status_set_sp(src, 0, 0);
status_change_end(src, SC_EXPLOSIONSPIRITS, INVALID_TIMER);
status_change_end(src, SC_BLADESTOP, INVALID_TIMER);
#ifdef RENEWAL
sc_start(src,src,SC_EXTREMITYFIST2,100,skill_lv,skill_get_time(skill_id,skill_lv));
#endif
}else
status_set_hp(src,
#ifdef RENEWAL
max(status_get_max_hp(src)/100, 1)
#else
1
#endif
, 0);
dir = map_calc_dir(src,bl->x,bl->y);
if( dir > 0 && dir < 4) x = -i;
else if( dir > 4 ) x = i;
else x = 0;
if( dir > 2 && dir < 6 ) y = -i;
else if( dir == 7 || dir < 2 ) y = i;
else y = 0;
if( (mbl == src || (!map_flag_gvg(src->m) && !map[src->m].flag.battleground) ) && // only NJ_ISSEN don't have slide effect in GVG
unit_movepos(src, mbl->x+x, mbl->y+y, 1, 1) ) {
clif_slide(src, src->x, src->y);
//uncomment this if you want to remove MO_EXTREMITYFIST glitchy walking effect. [malufett]
//clif_fixpos(src);
} else {
status_set_hp(src, 1, 0);
status_change_end(src, SC_NEN, INVALID_TIMER);
status_change_end(src, SC_HIDING, INVALID_TIMER);
}
}
break;
@ -4621,32 +4602,34 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
skill_attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag);
break;
#ifdef RENEWAL
case NJ_ISSEN: // teleport for Issen
{
short x, y, i = 2; // Move 2 cells for Issen(from target)
struct block_list *mbl = bl;
short dir = 0;
case NJ_ISSEN: {
short x, y;
short dir = map_calc_dir(src, bl->x, bl->y);
// Move 2 cells (From target)
if (dir > 0 && dir < 4)
x = -2;
else if (dir > 4)
x = 2;
else
x = 0;
if (dir > 2 && dir < 6)
y = -2;
else if (dir == 7 || dir < 2)
y = 2;
else
y = 0;
// Doesn't have slide effect in GVG
if (!map_flag_gvg2(src->m) && !map[src->m].flag.battleground &&
unit_movepos(src, bl->x + x, bl->y + y, 1, 1)) {
clif_slide(src, bl->x + x, bl->y + y);
clif_fixpos(src);
clif_spiritball(src);
}
skill_attack(BF_MISC, src, src, bl, skill_id, skill_lv, tick, flag);
status_set_hp(src, max(status_get_max_hp(src) / 100, 1), 0);
status_change_end(src, SC_NEN, INVALID_TIMER);
status_change_end(src, SC_HIDING, INVALID_TIMER);
skill_attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag);
status_set_hp(src,max(status_get_max_hp(src)/100, 1),0);
dir = map_calc_dir(src,bl->x,bl->y);
if( dir > 0 && dir < 4) x = -i;
else if( dir > 4 ) x = i;
else x = 0;
if( dir > 2 && dir < 6 ) y = -i;
else if( dir == 7 || dir < 2 ) y = i;
else y = 0;
if( (mbl == src || (!map_flag_gvg(src->m) && !map[src->m].flag.battleground) ) && // only NJ_ISSEN don't have slide effect in GVG
unit_movepos(src, mbl->x+x, mbl->y+y, 1, 1) ) {
clif_slide(src, src->x, src->y);
//uncomment this if you want to remove MO_EXTREMITYFIST glitchy walking effect. [malufett]
//clif_fixpos(src);
}
}
break;
#endif
@ -4871,7 +4854,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
{
int i;
// Priority is to release SpellBook
if( sc && sc->data[SC_READING_SB] )
if( sc && sc->data[SC_FREEZE_SP] )
{ // SpellBook
uint16 skill_id, skill_lv, point, s = 0;
int spell[SC_MAXSPELLBOOK-SC_SPELLBOOK1 + 1];
@ -4892,10 +4875,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
}else //something went wrong :(
break;
if( sc->data[SC_READING_SB]->val2 > point )
sc->data[SC_READING_SB]->val2 -= point;
if( sc->data[SC_FREEZE_SP]->val2 > point )
sc->data[SC_FREEZE_SP]->val2 -= point;
else // Last spell to be released
status_change_end(src, SC_READING_SB, INVALID_TIMER);
status_change_end(src, SC_FREEZE_SP, INVALID_TIMER);
if( bl->type != BL_SKILL ) /* skill types will crash the client */
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
@ -7194,7 +7177,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case SC_REFRESH: case SC_STONEHARDSKIN: case SC_VITALITYACTIVATION:
case SC_FIGHTINGSPIRIT: case SC_ABUNDANCE: case SC__SHADOWFORM:
case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD:
case SC_HAWKEYES: case SC_GUILDAURA: case SC_PUSH_CART:
case SC_HAWKEYES: case SC_PUSH_CART:
case SC_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE:
case SC_GT_REVITALIZE: case SC_REFLECTDAMAGE: case SC_INSPIRATION:
case SC_EXEEDBREAK: case SC_FORCEOFVANGUARD: case SC_BANDING:
@ -8060,7 +8043,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
uint8 j = 0, calls = 0, called = 0;
struct guild *g;
// i don't know if it actually summons in a circle, but oh well. ;P
g = sd?sd->state.gmaster_flag:guild_search(status_get_guild_id(src));
g = sd?sd->guild:guild_search(status_get_guild_id(src));
if (!g)
break;
@ -8547,7 +8530,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case AB_PRAEFATIO:
if( sd == NULL || sd->status.party_id == 0 || flag&1 )
clif_skill_nodamage(bl, bl, skill_id, skill_lv, sc_start4(src,bl, type, 100, skill_lv, 0, 0, 1, skill_get_time(skill_id, skill_lv)));
clif_skill_nodamage(bl, bl, skill_id, skill_lv, sc_start4(src, bl, type, 100, skill_lv, 0, 0, ( sd->status.party_id ? party_foreachsamemap(party_sub_count, sd, 0) : 1 ), skill_get_time(skill_id, skill_lv)));
else if( sd )
party_foreachsamemap(skill_area_sub, sd, skill_get_splash(skill_id, skill_lv), src, skill_id, skill_lv, tick, flag|BCT_PARTY|1, skill_castend_nodamage_id);
break;
@ -8555,8 +8538,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case AB_CHEAL:
if( sd == NULL || sd->status.party_id == 0 || flag&1 ) {
if( sd && tstatus && !battle_check_undead(tstatus->race, tstatus->def_ele) && !tsc->data[SC_BERSERK] ) {
int partycount = ( sd->status.party_id ? party_foreachsamemap(party_sub_count, sd, 0) : 0 );
i = skill_calc_heal(src, bl, AL_HEAL, pc_checkskill(sd, AL_HEAL), true);
if( partycount > 1 )
i += (i / 100) * (partycount * 10) / 4;
if( (dstsd && pc_ismadogear(dstsd)) || status_isimmune(bl))
i = 0; // Should heal by 0 or won't do anything?? in iRO it breaks the healing to members.. [malufett]
@ -8684,7 +8671,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case SC_NEUTRALBARRIER_MASTER: case SC_NEUTRALBARRIER:
case SC_STEALTHFIELD_MASTER: case SC_STEALTHFIELD:
case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD:
case SC_HAWKEYES: case SC_GUILDAURA: case SC_PUSH_CART:
case SC_HAWKEYES: case SC_PUSH_CART:
case SC_PARTYFLEE: case SC_GT_REVITALIZE:
case SC_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE:
case SC_ANGEL_PROTECT: case SC_MONSTER_TRANSFORM:
@ -8872,7 +8859,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
}
break;
case WL_READING_SB:
case WL_FREEZE_SP:
if( sd ) {
struct status_change *sc = status_get_sc(bl);
@ -8880,7 +8867,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
if( sc && !sc->data[i] )
break;
if( i == SC_MAXSPELLBOOK ) {
clif_skill_fail(sd, WL_READING_SB, USESKILL_FAIL_SPELLBOOK_READING, 0);
clif_skill_fail(sd, WL_FREEZE_SP, USESKILL_FAIL_SPELLBOOK_READING, 0);
break;
}
@ -14200,7 +14187,9 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
return false; // Just fails, no msg here.
break;
case LG_HESPERUSLIT:
if( !sc || !sc->data[SC_BANDING] ) {
if( sc && sc->data[SC_INSPIRATION] )
return true;
if( sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 < 3 ) {
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
return false;
}
@ -15265,14 +15254,14 @@ int skill_vfcastfix (struct block_list *bl, double time, uint16 skill_id, uint16
// Fixed cast non percentage bonuses
if( sc->data[SC_MANDRAGORA] )
fixed += sc->data[SC_MANDRAGORA]->val1 * 1000 / 2;
if (sc->data[SC_IZAYOI] && (skill_id >= NJ_TOBIDOUGU && skill_id <= NJ_ISSEN))
fixed = 0;
if( sc->data[SC_GUST_OPTION] || sc->data[SC_BLAST_OPTION] || sc->data[SC_WILD_STORM_OPTION] )
fixed -= 1000;
if (sc->data[SC_DANCEWITHWUG])
fixed -= fixed * sc->data[SC_DANCEWITHWUG]->val4 / 100;
if( sc->data[SC_HEAT_BARREL] )
fixcast_r = max(fixcast_r, sc->data[SC_HEAT_BARREL]->val2);
if (sc->data[SC_IZAYOI])
fixed = 0;
}
if( sd && !(skill_get_castnodex(skill_id, skill_lv)&4) ){
@ -18221,7 +18210,7 @@ int skill_spellbook (struct map_session_data *sd, int nameid) {
for(i=SC_SPELLBOOK1; i <= SC_MAXSPELLBOOK; i++) if( sc && !sc->data[i] ) break;
if( i > SC_MAXSPELLBOOK ) {
clif_skill_fail(sd, WL_READING_SB, USESKILL_FAIL_SPELLBOOK_READING, 0);
clif_skill_fail(sd, WL_FREEZE_SP, USESKILL_FAIL_SPELLBOOK_READING, 0);
return 0;
}
@ -18229,31 +18218,34 @@ int skill_spellbook (struct map_session_data *sd, int nameid) {
if( i == MAX_SKILL_SPELLBOOK_DB ) return 0;
if( !pc_checkskill(sd, (skill_id = skill_spellbook_db[i].skill_id)) ) { // User don't know the skill
sc_start(&sd->bl,&sd->bl, SC_SLEEP, 100, 1, skill_get_time(WL_READING_SB, pc_checkskill(sd,WL_READING_SB)));
clif_skill_fail(sd, WL_READING_SB, USESKILL_FAIL_SPELLBOOK_DIFFICULT_SLEEP, 0);
sc_start(&sd->bl,&sd->bl, SC_SLEEP, 100, 1, skill_get_time(WL_FREEZE_SP, pc_checkskill(sd,WL_FREEZE_SP)));
clif_skill_fail(sd, WL_FREEZE_SP, USESKILL_FAIL_SPELLBOOK_DIFFICULT_SLEEP, 0);
return 0;
}
max_preserve = 4 * pc_checkskill(sd, WL_FREEZE_SP) + status_get_int(&sd->bl) / 10 + sd->status.base_level / 10;
point = skill_spellbook_db[i].point;
if( sc && sc->data[SC_READING_SB] ) {
if( (sc->data[SC_READING_SB]->val2 + point) > max_preserve ) {
clif_skill_fail(sd, WL_READING_SB, USESKILL_FAIL_SPELLBOOK_PRESERVATION_POINT, 0);
if( sc && sc->data[SC_FREEZE_SP] ) {
if( (sc->data[SC_FREEZE_SP]->val2 + point) > max_preserve ) {
clif_skill_fail(sd, WL_FREEZE_SP, USESKILL_FAIL_SPELLBOOK_PRESERVATION_POINT, 0);
return 0;
}
for(i = SC_MAXSPELLBOOK; i >= SC_SPELLBOOK1; i--){ // This is how official saves spellbook. [malufett]
if( !sc->data[i] ){
sc->data[SC_READING_SB]->val2 += point; // increase points
sc->data[SC_FREEZE_SP]->val2 += point; // increase points
sc_start4(&sd->bl,&sd->bl, (sc_type)i, 100, skill_id, pc_checkskill(sd,skill_id), point, 0, INVALID_TIMER);
break;
}
}
} else {
sc_start2(&sd->bl,&sd->bl, SC_READING_SB, 100, 0, point, INVALID_TIMER);
sc_start2(&sd->bl,&sd->bl, SC_FREEZE_SP, 100, 0, point, INVALID_TIMER);
sc_start4(&sd->bl,&sd->bl, SC_MAXSPELLBOOK, 100, skill_id, pc_checkskill(sd,skill_id), point, 0, INVALID_TIMER);
}
// Reading Spell Book SP cost same as the sealed spell.
status_zap(&sd->bl, 0, skill_get_sp(skill_id, pc_checkskill(sd, skill_id)));
return 1;
}

View File

@ -399,9 +399,6 @@ int skill_unit_move_unit_group( struct skill_unit_group *group, int16 m,int16 dx
struct skill_unit_group *skill_check_dancing( struct block_list *src );
// Guild skills [celest]
int skill_guildaura_sub (struct map_session_data* sd, int id, int strvit, int agidex);
// Chant canceled
int skill_castcancel(struct block_list *bl,int type);

View File

@ -873,6 +873,7 @@ void initChangeTables(void)
StatusIconChangeTable[SC_SPELLBOOK5] = SI_SPELLBOOK5;
StatusIconChangeTable[SC_SPELLBOOK6] = SI_SPELLBOOK6;
StatusIconChangeTable[SC_MAXSPELLBOOK] = SI_SPELLBOOK7;
StatusIconChangeTable[SC_FREEZE_SP] = SI_FREEZE_SP;
StatusIconChangeTable[SC_NEUTRALBARRIER_MASTER] = SI_NEUTRALBARRIER_MASTER;
StatusIconChangeTable[SC_STEALTHFIELD_MASTER] = SI_STEALTHFIELD_MASTER;
@ -898,7 +899,6 @@ void initChangeTables(void)
StatusIconChangeTable[SC_CURSEDCIRCLE_ATKER] = SI_CURSEDCIRCLE_ATKER;
StatusIconChangeTable[SC_TEARGAS_SOB] = SI_BLANK;
StatusIconChangeTable[SC_STOMACHACHE] = SI_STOMACHACHE;
StatusIconChangeTable[SC_MYSTERIOUS_POWDER] = SI_MYSTERIOUS_POWDER;
StatusIconChangeTable[SC_MELON_BOMB] = SI_MELON_BOMB;
@ -8051,13 +8051,15 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
case SC_LERADSDEW:
case SC_MELODYOFSINK:
case SC_BEYONDOFWARCRY:
case SC_UNLIMITEDHUMMINGVOICE: // Group B
case SC_UNLIMITEDHUMMINGVOICE:
case SC_SIRCLEOFNATURE: // Group B
if (type != SC_VOICEOFSIREN) status_change_end(bl, SC_VOICEOFSIREN, INVALID_TIMER);
if (type != SC_DEEPSLEEP) status_change_end(bl, SC_DEEPSLEEP, INVALID_TIMER);
if (type != SC_LERADSDEW) status_change_end(bl, SC_LERADSDEW, INVALID_TIMER);
if (type != SC_MELODYOFSINK) status_change_end(bl, SC_MELODYOFSINK, INVALID_TIMER);
if (type != SC_BEYONDOFWARCRY) status_change_end(bl, SC_BEYONDOFWARCRY, INVALID_TIMER);
if (type != SC_UNLIMITEDHUMMINGVOICE) status_change_end(bl, SC_UNLIMITEDHUMMINGVOICE, INVALID_TIMER);
if (type != SC_SIRCLEOFNATURE) status_change_end(bl, SC_SIRCLEOFNATURE, INVALID_TIMER);
if (type != SC_GLOOMYDAY) {
status_change_end(bl, SC_GLOOMYDAY, INVALID_TIMER);
status_change_end(bl, SC_GLOOMYDAY_SK, INVALID_TIMER);
@ -8290,16 +8292,12 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val2 = val1*20; // SP gained
break;
case SC_KYRIE:
if( sd )
val1 = min(val1,pc_checkskill(sd,PR_KYRIE)); // Use skill level to determine barrier health.
val2 = (int64)status->max_hp * (val1 * 2 + 10) / 100; // %Max HP to absorb
// val4 holds current amount of party members when casting Praefatio
// as Praefatio's barrier has more health and blocks more hits than Kyrie Elesion.
if( val4 < 1 ) // == PR_KYRIE
if( val4 ) { // Formulas for Praefatio
val2 = (status->max_hp * (val1 * 2 + 10) / 100) + val4 * 2; //%Max HP to absorb
val3 = 6 + val1; //Hits
} else { // Formulas for Kyrie Eleison
val2 = status->max_hp * (val1 * 2 + 10) / 100;
val3 = (val1 / 2 + 5);
else { // == AB_PRAEFATIO
val2 += val4 * 2; // Increase barrier strength per party member.
val3 = 6 + val1;
}
break;
case SC_MAGICPOWER:
@ -8456,7 +8454,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
unit_stop_attack(bl);
break;
case SC_NOCHAT:
// !FIXME: is this correct? a hardcoded interval of 60sec? what about configuration ?_?
// A hardcoded interval of 60 seconds is expected, as the time that SC_NOCHAT uses is defined by
// mmocharstatus.manner, each negative point results in 1 minute with this status activated.
// This is done this way because the message that the client displays is hardcoded, and only
// shows how many minutes are remaining. [Panikon]
tick = 60000;
val1 = battle_config.manner_system; // Mute filters.
if (sd) {
@ -9153,9 +9154,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val2 = 6 * val1; // AGI and DEX Reduction
val3 = 10 * val1; // Movement Speed Reduction
break;
case SC_READING_SB:
// val2 = sp reduction per second
tick_time = 5000; // [GodLesZ] tick time
case SC_FREEZE_SP:
// val2 = sp drain per 10 seconds
tick_time = 10000; // [GodLesZ] tick time
break;
case SC_SPHERE_1:
case SC_SPHERE_2:
@ -11589,7 +11590,7 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
}
break;
case SC_READING_SB:
case SC_FREEZE_SP:
if( !status_charge(bl, 0, sce->val2) ) {
int i;
for(i = SC_SPELLBOOK1; i <= SC_MAXSPELLBOOK; i++) // Also remove stored spell as well.
@ -12054,7 +12055,6 @@ void status_change_clear_buffs (struct block_list* bl, int type)
case SC_GLORYWOUNDS:
case SC_SOULCOLD:
case SC_HAWKEYES:
case SC_GUILDAURA:
case SC_SAFETYWALL:
case SC_PNEUMA:
case SC_NOCHAT:

View File

@ -392,7 +392,7 @@ typedef enum sc_type {
SC_SPHERE_4,//340
SC_SPHERE_5,
SC_READING_SB,
SC_FREEZINGSPELL,
SC_FREEZE_SP,
/**
* Ranger
**/