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. // If you want to change this value, clear the guild alliance table.
// Default is 3 // Default is 3
max_guild_alliance: 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 //-- HLIF_AVOID
8002,0,35000,0,40000:35000:30000:25000:20000,0,0 8002,0,35000,0,40000:35000:30000:25000:20000,0,0
//-- HLIF_CHANGE //-- 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 //-- HAMI_CASTLE
8005,0,0,0,0,60000:70000:80000:90000:129000,0 8005,0,0,0,0,1000,0
//-- HAMI_DEFENCE //-- 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 //-- HAMI_BLOODLUST
8008,0,0,0,60000:180000:300000,300000:600000:900000,0 8008,0,0,0,60000:180000:300000,300000:600000:900000,0
//-- HFLI_MOON //-- HFLI_MOON
8009,0,0,1000,0,0,0 8009,0,0,2000,0,0,0
//-- HFLI_FLEET //-- HFLI_FLEET
8010,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000,0 8010,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000,0
//-- HFLI_SPEED //-- HFLI_SPEED
8011,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000,0 8011,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000,0
//-- HVAN_CAPRICE //-- 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 //-- HVAN_CHAOTIC
8014,0,1000,1000,0,0,0 8014,0,3000,3000,0,0,0
//-- HVAN_EXPLOSION //-- HVAN_EXPLOSION
8016,0,0,1000,0,0,0 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 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 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 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 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 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 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 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 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 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) //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 //-- HLIF_AVOID
8002,0,35000,0,40000:35000:30000:25000:20000,0,0,-1 8002,0,35000,0,40000:35000:30000:25000:20000,0,0,-1
//-- HLIF_CHANGE //-- 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 //-- HAMI_CASTLE
8005,0,0,0,0,60000:70000:80000:90000:129000,0,-1 8005,0,0,0,0,1000,0,-1
//-- HAMI_DEFENCE //-- 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 //-- HAMI_BLOODLUST
8008,0,0,0,60000:180000:300000,300000:600000:900000,0,-1 8008,0,0,0,60000:180000:300000,300000:600000:900000,0,-1
//-- HFLI_MOON //-- HFLI_MOON
8009,0,0,1000,0,0,0,-1 8009,0,0,2000,0,0,0,-1
//-- HFLI_FLEET //-- HFLI_FLEET
8010,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000,0,-1 8010,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000,0,-1
//-- HFLI_SPEED //-- HFLI_SPEED
8011,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000,0,-1 8011,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000,0,-1
//-- HVAN_CAPRICE //-- 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 //-- HVAN_CHAOTIC
8014,0,1000,1000,0,0,0,-1 8014,0,3000,3000,0,0,0,-1
//-- HVAN_EXPLOSION //-- HVAN_EXPLOSION
8016,0,0,1000,0,0,0,-1 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 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 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 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 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 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 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 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 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 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 //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. // This will end the Freezing status for the invoking character.
sc_end SC_FREEZE; 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>}) *getstatus(<effect type>{,<type>})

View File

@ -341,7 +341,7 @@ struct mmo_charstatus {
unsigned int status_point,skill_point; unsigned int status_point,skill_point;
int hp,max_hp,sp,max_sp; int hp,max_hp,sp,max_sp;
unsigned int option; 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; unsigned char karma;
short hair,hair_color,clothes_color; short hair,hair_color,clothes_color;
int party_id,guild_id,pet_id,hom_id,mer_id,ele_id; 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) if (!sd)
element = ELE_NEUTRAL; //forced neutral for monsters element = ELE_NEUTRAL; //forced neutral for monsters
break; break;
case LG_HESPERUSLIT:
if (sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 4)
element = ELE_HOLY;
break;
case RL_H_MINE: case RL_H_MINE:
if (sd && sd->skill_id_old == RL_FLICKER) //Force RL_H_MINE deals fire damage if activated by RL_FLICKER if (sd && sd->skill_id_old == RL_FLICKER) //Force RL_H_MINE deals fire damage if activated by RL_FLICKER
element = ELE_FIRE; element = ELE_FIRE;
@ -2608,7 +2612,7 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list
} }
#else #else
case NJ_ISSEN: 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; wd.damage2 = 0;
break; break;
case LK_SPIRALPIERCE: 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; skillratio = 120 * skill_lv;
if( sc && sc->data[SC_BANDING] ) if( sc && sc->data[SC_BANDING] )
skillratio += 200 * sc->data[SC_BANDING]->val2; skillratio += 200 * sc->data[SC_BANDING]->val2;
RE_LVL_DMOD(100);
if( sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 5 ) if( sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 5 )
skillratio = skillratio * 150 / 100; skillratio = skillratio * 150 / 100;
if( sc && sc->data[SC_INSPIRATION] ) if( sc && sc->data[SC_INSPIRATION] )
skillratio += 600; skillratio += 600;
RE_LVL_DMOD(100);
break; break;
case SR_DRAGONCOMBO: case SR_DRAGONCOMBO:
skillratio += 40 * skill_lv; skillratio += 40 * skill_lv;
@ -5995,6 +5999,10 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
md.damage = 0; md.damage = 0;
else if(md.damage && tstatus->mode&MD_PLANT){ else if(md.damage && tstatus->mode&MD_PLANT){
switch(skill_id){ 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 HT_LANDMINE:
case MA_LANDMINE: case MA_LANDMINE:
case HT_BLASTMINE: case HT_BLASTMINE:
@ -6002,10 +6010,6 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
case RA_CLUSTERBOMB: case RA_CLUSTERBOMB:
#ifdef RENEWAL #ifdef RENEWAL
break; break;
case NJ_ISSEN: // Final Strike will MISS on "plant"-type mobs [helvetica]
md.damage = 0;
md.dmg_lv=ATK_FLEE;
break;
#endif #endif
default: default:
md.damage = 1; md.damage = 1;
@ -7564,6 +7568,7 @@ static const struct _battle_data {
{ "taekwon_mission_mobname", &battle_config.taekwon_mission_mobname, 0, 0, 2, }, { "taekwon_mission_mobname", &battle_config.taekwon_mission_mobname, 0, 0, 2, },
{ "teleport_on_portal", &battle_config.teleport_on_portal, 0, 0, 1, }, { "teleport_on_portal", &battle_config.teleport_on_portal, 0, 0, 1, },
{ "cart_revo_knockback", &battle_config.cart_revo_knockback, 1, 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 #ifndef STATS_OPT_OUT
/** /**

View File

@ -538,6 +538,7 @@ extern struct Battle_Config
int taekwon_mission_mobname; int taekwon_mission_mobname;
int teleport_on_portal; int teleport_on_portal;
int cart_revo_knockback; int cart_revo_knockback;
int guild_notice_changemap;
} battle_config; } battle_config;
void do_init_battle(void); 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,2)=g->guild_id;
WFIFOL(fd,6)=g->emblem_id; WFIFOL(fd,6)=g->emblem_id;
WFIFOL(fd,10)=g->position[ps].mode; 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) WFIFOL(fd,15)=0; // InterSID (unknown purpose)
memcpy(WFIFOP(fd,19),g->name,NAME_LENGTH); memcpy(WFIFOP(fd,19),g->name,NAME_LENGTH);
WFIFOSET(fd,packet_len(0x16c)); 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) void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
{ {
int i; int i;
bool guild_notice = false;
if(sd->bl.prev != NULL) if(sd->bl.prev != NULL)
return; return;
@ -9624,6 +9625,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
if(sd->state.connect_new) { if(sd->state.connect_new) {
int lv; int lv;
guild_notice = true;
sd->state.connect_new = 0; sd->state.connect_new = 0;
clif_skillinfoblock(sd); clif_skillinfoblock(sd);
clif_hotkeys_send(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); clif_status_load(&sd->bl, SI_RIDING, 1);
else if (sd->sc.option&OPTION_WUGRIDER) else if (sd->sc.option&OPTION_WUGRIDER)
clif_status_load(&sd->bl, SI_WUGRIDER, 1); 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) if(sd->status.manner < 0)
sc_start(&sd->bl,&sd->bl,SC_NOCHAT,100,0,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); //clif_vip_display_info(sd,ZC_PERSONAL_INFOMATION_CHN);
} }
#endif #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) && 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) ) (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 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; sd->state.changemap = false;
// Instances do not need their own channels // 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 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); mail_clear(sd);
@ -9753,10 +9762,10 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
/* Guild Aura Init */ /* Guild Aura Init */
if( sd->state.gmaster_flag ) { if( sd->state.gmaster_flag ) {
guild_guildaura_refresh(sd,GD_LEADERSHIP,guild_checkskill(sd->state.gmaster_flag,GD_LEADERSHIP)); guild_guildaura_refresh(sd,GD_LEADERSHIP,guild_checkskill(sd->guild,GD_LEADERSHIP));
guild_guildaura_refresh(sd,GD_GLORYWOUNDS,guild_checkskill(sd->state.gmaster_flag,GD_GLORYWOUNDS)); guild_guildaura_refresh(sd,GD_GLORYWOUNDS,guild_checkskill(sd->guild,GD_GLORYWOUNDS));
guild_guildaura_refresh(sd,GD_SOULCOLD,guild_checkskill(sd->state.gmaster_flag,GD_SOULCOLD)); guild_guildaura_refresh(sd,GD_SOULCOLD,guild_checkskill(sd->guild,GD_SOULCOLD));
guild_guildaura_refresh(sd,GD_HAWKEYES,guild_checkskill(sd->state.gmaster_flag,GD_HAWKEYES)); guild_guildaura_refresh(sd,GD_HAWKEYES,guild_checkskill(sd->guild,GD_HAWKEYES));
} }
if( sd->state.vending ) { /* show we have a vending */ 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 #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; 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) ) if( pc_issit(sd) )
return; return;
@ -11324,7 +11340,7 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
if( skill_id >= GD_SKILLBASE ) { if( skill_id >= GD_SKILLBASE ) {
if( sd->state.gmaster_flag ) if( sd->state.gmaster_flag )
skill_lv = guild_checkskill(sd->state.gmaster_flag, skill_id); skill_lv = guild_checkskill(sd->guild, skill_id);
else else
skill_lv = 0; skill_lv = 0;
} else { } else {

View File

@ -481,7 +481,7 @@ int guild_recv_info(struct guild *sg) {
//Also set the guild master flag. //Also set the guild master flag.
sd->guild = g; sd->guild = g;
sd->state.gmaster_flag = g; sd->state.gmaster_flag = 1;
clif_charnameupdate(sd); // [LuzZza] clif_charnameupdate(sd); // [LuzZza]
clif_guild_masterormember(sd); clif_guild_masterormember(sd);
} }
@ -664,7 +664,7 @@ void guild_member_joined(struct map_session_data *sd) {
return; return;
} }
if (strcmp(sd->status.name,g->master) == 0) { // set the Guild Master flag 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 // prevent Guild Skills from being used directly after relog
if( battle_config.guild_skill_relog_delay ) if( battle_config.guild_skill_relog_delay )
guild_block_skill(sd, 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; sd->guild_emblem_id = 0;
clif_charnameupdate(sd); //Update display name [Skotlex] 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; 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. 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_belonginfo(sd,g);
clif_guild_notice(sd,g);
sd->guild_emblem_id = g->emblem_id; sd->guild_emblem_id = g->emblem_id;
} }
return 0; 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); status_change_end(&sd->bl,type,INVALID_TIMER);
} }
group = skill_unitsetting(&sd->bl,skill_id,skill_lv,sd->bl.x,sd->bl.y,0); 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 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; return;
} }
@ -1658,8 +1660,13 @@ int guild_broken(int guild_id,int flag) {
storage_guild_storage_quit(sd,1); storage_guild_storage_quit(sd,1);
sd->status.guild_id=0; sd->status.guild_id=0;
sd->guild = NULL; sd->guild = NULL;
sd->state.gmaster_flag = 0;
clif_guild_broken(g->member[i].sd,0); clif_guild_broken(g->member[i].sd,0);
clif_charnameupdate(sd); // [LuzZza] 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) { 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!" 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. //Block his skills to prevent abuse.
if (battle_config.guild_skill_relog_delay) if (battle_config.guild_skill_relog_delay)
guild_block_skill(g->member[0].sd, 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) { int guild_break(struct map_session_data *sd,char *name) {
struct guild *g; struct guild *g;
struct unit_data *ud;
int i; int i;
#ifdef BOUND_ITEMS #ifdef BOUND_ITEMS
int j; int j;
@ -1773,6 +1781,28 @@ int guild_break(struct map_session_data *sd,char *name) {
return 0; 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 #ifdef BOUND_ITEMS
//Guild bound item check - Removes the bound flag //Guild bound item check - Removes the bound flag
j = pc_bound_chk(sd,2,idxlist); 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); pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
if( sd->state.gmaster_flag ) { if( sd->state.gmaster_flag ) {
guild_guildaura_refresh(sd,GD_LEADERSHIP,guild_checkskill(sd->state.gmaster_flag,GD_LEADERSHIP)); guild_guildaura_refresh(sd,GD_LEADERSHIP,guild_checkskill(sd->guild,GD_LEADERSHIP));
guild_guildaura_refresh(sd,GD_GLORYWOUNDS,guild_checkskill(sd->state.gmaster_flag,GD_GLORYWOUNDS)); guild_guildaura_refresh(sd,GD_GLORYWOUNDS,guild_checkskill(sd->guild,GD_GLORYWOUNDS));
guild_guildaura_refresh(sd,GD_SOULCOLD,guild_checkskill(sd->state.gmaster_flag,GD_SOULCOLD)); guild_guildaura_refresh(sd,GD_SOULCOLD,guild_checkskill(sd->guild,GD_SOULCOLD));
guild_guildaura_refresh(sd,GD_HAWKEYES,guild_checkskill(sd->state.gmaster_flag,GD_HAWKEYES)); guild_guildaura_refresh(sd,GD_HAWKEYES,guild_checkskill(sd->guild,GD_HAWKEYES));
} }
} }
// script // script
@ -7554,7 +7554,13 @@ bool pc_setparam(struct map_session_data *sd,int type,int val)
break; break;
case SP_MANNER: case SP_MANNER:
sd->status.manner = val; 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: case SP_FAME:
sd->status.fame = val; sd->status.fame = val;
break; break;

View File

@ -203,7 +203,7 @@ struct map_session_data {
unsigned short autoloottype; unsigned short autoloottype;
unsigned int autolooting : 1; //performance-saver, autolooting state for @alootid unsigned int autolooting : 1; //performance-saver, autolooting state for @alootid
unsigned short autobonus; //flag to indicate if an autobonus is activated. [Inkfish] 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 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 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(). 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_REFRESH: case SC_STONEHARDSKIN: case SC_VITALITYACTIVATION:
case SC_FIGHTINGSPIRIT: case SC_ABUNDANCE: case SC__SHADOWFORM: case SC_FIGHTINGSPIRIT: case SC_ABUNDANCE: case SC__SHADOWFORM:
case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD: 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_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE:
case SC_GT_REVITALIZE: case SC_REFLECTDAMAGE: case SC_INSPIRATION: case SC_GT_REVITALIZE: case SC_REFLECTDAMAGE: case SC_INSPIRATION:
case SC_EXEEDBREAK: case SC_FORCEOFVANGUARD: case SC_BANDING: 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); 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. * Checks that you have the requirements for casting a skill for homunculus/mercenary.
* Flag: * Flag:
@ -4185,49 +4167,48 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
#ifndef RENEWAL #ifndef RENEWAL
case NJ_ISSEN: case NJ_ISSEN:
status_change_end(src, SC_NEN, INVALID_TIMER);
status_change_end(src, SC_HIDING, INVALID_TIMER);
#endif #endif
// fall through
case MO_EXTREMITYFIST: case MO_EXTREMITYFIST:
{ {
short x, y, i = 2; // Move 2 cells for Issen(from target) struct block_list *mbl = bl; // For NJ_ISSEN
struct block_list *mbl = bl; short x, y, i = 2; // Move 2 cells (From target)
short dir = 0; 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); skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
if (skill_id == MO_EXTREMITYFIST) {
if( skill_id == MO_EXTREMITYFIST )
{
mbl = src;
i = 3; // for Asura(from caster)
status_set_sp(src, 0, 0); status_set_sp(src, 0, 0);
status_change_end(src, SC_EXPLOSIONSPIRITS, INVALID_TIMER); status_change_end(src, SC_EXPLOSIONSPIRITS, INVALID_TIMER);
status_change_end(src, SC_BLADESTOP, INVALID_TIMER); status_change_end(src, SC_BLADESTOP, INVALID_TIMER);
#ifdef RENEWAL #ifdef RENEWAL
sc_start(src,src,SC_EXTREMITYFIST2,100,skill_lv,skill_get_time(skill_id,skill_lv)); sc_start(src,src,SC_EXTREMITYFIST2,100,skill_lv,skill_get_time(skill_id,skill_lv));
#endif #endif
}else } else {
status_set_hp(src, status_set_hp(src, 1, 0);
#ifdef RENEWAL status_change_end(src, SC_NEN, INVALID_TIMER);
max(status_get_max_hp(src)/100, 1) status_change_end(src, SC_HIDING, INVALID_TIMER);
#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);
} }
} }
break; 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); skill_attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag);
break; break;
#ifdef RENEWAL #ifdef RENEWAL
case NJ_ISSEN: // teleport for Issen case NJ_ISSEN: {
{ short x, y;
short x, y, i = 2; // Move 2 cells for Issen(from target) short dir = map_calc_dir(src, bl->x, bl->y);
struct block_list *mbl = bl;
short dir = 0;
// 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_NEN, INVALID_TIMER);
status_change_end(src, SC_HIDING, 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; break;
#endif #endif
@ -4871,7 +4854,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
{ {
int i; int i;
// Priority is to release SpellBook // Priority is to release SpellBook
if( sc && sc->data[SC_READING_SB] ) if( sc && sc->data[SC_FREEZE_SP] )
{ // SpellBook { // SpellBook
uint16 skill_id, skill_lv, point, s = 0; uint16 skill_id, skill_lv, point, s = 0;
int spell[SC_MAXSPELLBOOK-SC_SPELLBOOK1 + 1]; 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 :( }else //something went wrong :(
break; break;
if( sc->data[SC_READING_SB]->val2 > point ) if( sc->data[SC_FREEZE_SP]->val2 > point )
sc->data[SC_READING_SB]->val2 -= point; sc->data[SC_FREEZE_SP]->val2 -= point;
else // Last spell to be released 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 */ if( bl->type != BL_SKILL ) /* skill types will crash the client */
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); 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_REFRESH: case SC_STONEHARDSKIN: case SC_VITALITYACTIVATION:
case SC_FIGHTINGSPIRIT: case SC_ABUNDANCE: case SC__SHADOWFORM: case SC_FIGHTINGSPIRIT: case SC_ABUNDANCE: case SC__SHADOWFORM:
case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD: 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_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE:
case SC_GT_REVITALIZE: case SC_REFLECTDAMAGE: case SC_INSPIRATION: case SC_GT_REVITALIZE: case SC_REFLECTDAMAGE: case SC_INSPIRATION:
case SC_EXEEDBREAK: case SC_FORCEOFVANGUARD: case SC_BANDING: 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; uint8 j = 0, calls = 0, called = 0;
struct guild *g; struct guild *g;
// i don't know if it actually summons in a circle, but oh well. ;P // 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) if (!g)
break; break;
@ -8547,7 +8530,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case AB_PRAEFATIO: case AB_PRAEFATIO:
if( sd == NULL || sd->status.party_id == 0 || flag&1 ) 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 ) 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); 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; break;
@ -8555,8 +8538,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case AB_CHEAL: case AB_CHEAL:
if( sd == NULL || sd->status.party_id == 0 || flag&1 ) { 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] ) { 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); 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)) 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] 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_NEUTRALBARRIER_MASTER: case SC_NEUTRALBARRIER:
case SC_STEALTHFIELD_MASTER: case SC_STEALTHFIELD: case SC_STEALTHFIELD_MASTER: case SC_STEALTHFIELD:
case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD: 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_PARTYFLEE: case SC_GT_REVITALIZE:
case SC_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE: case SC_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE:
case SC_ANGEL_PROTECT: case SC_MONSTER_TRANSFORM: 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; break;
case WL_READING_SB: case WL_FREEZE_SP:
if( sd ) { if( sd ) {
struct status_change *sc = status_get_sc(bl); 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] ) if( sc && !sc->data[i] )
break; break;
if( i == SC_MAXSPELLBOOK ) { 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; 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. return false; // Just fails, no msg here.
break; break;
case LG_HESPERUSLIT: 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); clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
return false; return false;
} }
@ -15265,14 +15254,14 @@ int skill_vfcastfix (struct block_list *bl, double time, uint16 skill_id, uint16
// Fixed cast non percentage bonuses // Fixed cast non percentage bonuses
if( sc->data[SC_MANDRAGORA] ) if( sc->data[SC_MANDRAGORA] )
fixed += sc->data[SC_MANDRAGORA]->val1 * 1000 / 2; 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] ) if( sc->data[SC_GUST_OPTION] || sc->data[SC_BLAST_OPTION] || sc->data[SC_WILD_STORM_OPTION] )
fixed -= 1000; fixed -= 1000;
if (sc->data[SC_DANCEWITHWUG]) if (sc->data[SC_DANCEWITHWUG])
fixed -= fixed * sc->data[SC_DANCEWITHWUG]->val4 / 100; fixed -= fixed * sc->data[SC_DANCEWITHWUG]->val4 / 100;
if( sc->data[SC_HEAT_BARREL] ) if( sc->data[SC_HEAT_BARREL] )
fixcast_r = max(fixcast_r, sc->data[SC_HEAT_BARREL]->val2); 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) ){ 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; for(i=SC_SPELLBOOK1; i <= SC_MAXSPELLBOOK; i++) if( sc && !sc->data[i] ) break;
if( i > SC_MAXSPELLBOOK ) { 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; 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( 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 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))); 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_READING_SB, USESKILL_FAIL_SPELLBOOK_DIFFICULT_SLEEP, 0); clif_skill_fail(sd, WL_FREEZE_SP, USESKILL_FAIL_SPELLBOOK_DIFFICULT_SLEEP, 0);
return 0; return 0;
} }
max_preserve = 4 * pc_checkskill(sd, WL_FREEZE_SP) + status_get_int(&sd->bl) / 10 + sd->status.base_level / 10; 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; point = skill_spellbook_db[i].point;
if( sc && sc->data[SC_READING_SB] ) { if( sc && sc->data[SC_FREEZE_SP] ) {
if( (sc->data[SC_READING_SB]->val2 + point) > max_preserve ) { if( (sc->data[SC_FREEZE_SP]->val2 + point) > max_preserve ) {
clif_skill_fail(sd, WL_READING_SB, USESKILL_FAIL_SPELLBOOK_PRESERVATION_POINT, 0); clif_skill_fail(sd, WL_FREEZE_SP, USESKILL_FAIL_SPELLBOOK_PRESERVATION_POINT, 0);
return 0; return 0;
} }
for(i = SC_MAXSPELLBOOK; i >= SC_SPELLBOOK1; i--){ // This is how official saves spellbook. [malufett] for(i = SC_MAXSPELLBOOK; i >= SC_SPELLBOOK1; i--){ // This is how official saves spellbook. [malufett]
if( !sc->data[i] ){ 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); sc_start4(&sd->bl,&sd->bl, (sc_type)i, 100, skill_id, pc_checkskill(sd,skill_id), point, 0, INVALID_TIMER);
break; break;
} }
} }
} else { } 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); 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; 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 ); 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 // Chant canceled
int skill_castcancel(struct block_list *bl,int type); 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_SPELLBOOK5] = SI_SPELLBOOK5;
StatusIconChangeTable[SC_SPELLBOOK6] = SI_SPELLBOOK6; StatusIconChangeTable[SC_SPELLBOOK6] = SI_SPELLBOOK6;
StatusIconChangeTable[SC_MAXSPELLBOOK] = SI_SPELLBOOK7; StatusIconChangeTable[SC_MAXSPELLBOOK] = SI_SPELLBOOK7;
StatusIconChangeTable[SC_FREEZE_SP] = SI_FREEZE_SP;
StatusIconChangeTable[SC_NEUTRALBARRIER_MASTER] = SI_NEUTRALBARRIER_MASTER; StatusIconChangeTable[SC_NEUTRALBARRIER_MASTER] = SI_NEUTRALBARRIER_MASTER;
StatusIconChangeTable[SC_STEALTHFIELD_MASTER] = SI_STEALTHFIELD_MASTER; StatusIconChangeTable[SC_STEALTHFIELD_MASTER] = SI_STEALTHFIELD_MASTER;
@ -898,7 +899,6 @@ void initChangeTables(void)
StatusIconChangeTable[SC_CURSEDCIRCLE_ATKER] = SI_CURSEDCIRCLE_ATKER; StatusIconChangeTable[SC_CURSEDCIRCLE_ATKER] = SI_CURSEDCIRCLE_ATKER;
StatusIconChangeTable[SC_TEARGAS_SOB] = SI_BLANK;
StatusIconChangeTable[SC_STOMACHACHE] = SI_STOMACHACHE; StatusIconChangeTable[SC_STOMACHACHE] = SI_STOMACHACHE;
StatusIconChangeTable[SC_MYSTERIOUS_POWDER] = SI_MYSTERIOUS_POWDER; StatusIconChangeTable[SC_MYSTERIOUS_POWDER] = SI_MYSTERIOUS_POWDER;
StatusIconChangeTable[SC_MELON_BOMB] = SI_MELON_BOMB; 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_LERADSDEW:
case SC_MELODYOFSINK: case SC_MELODYOFSINK:
case SC_BEYONDOFWARCRY: 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_VOICEOFSIREN) status_change_end(bl, SC_VOICEOFSIREN, INVALID_TIMER);
if (type != SC_DEEPSLEEP) status_change_end(bl, SC_DEEPSLEEP, 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_LERADSDEW) status_change_end(bl, SC_LERADSDEW, INVALID_TIMER);
if (type != SC_MELODYOFSINK) status_change_end(bl, SC_MELODYOFSINK, 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_BEYONDOFWARCRY) status_change_end(bl, SC_BEYONDOFWARCRY, INVALID_TIMER);
if (type != SC_UNLIMITEDHUMMINGVOICE) status_change_end(bl, SC_UNLIMITEDHUMMINGVOICE, 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) { if (type != SC_GLOOMYDAY) {
status_change_end(bl, SC_GLOOMYDAY, INVALID_TIMER); status_change_end(bl, SC_GLOOMYDAY, INVALID_TIMER);
status_change_end(bl, SC_GLOOMYDAY_SK, 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 val2 = val1*20; // SP gained
break; break;
case SC_KYRIE: case SC_KYRIE:
if( sd ) if( val4 ) { // Formulas for Praefatio
val1 = min(val1,pc_checkskill(sd,PR_KYRIE)); // Use skill level to determine barrier health. val2 = (status->max_hp * (val1 * 2 + 10) / 100) + val4 * 2; //%Max HP to absorb
val2 = (int64)status->max_hp * (val1 * 2 + 10) / 100; // %Max HP to absorb val3 = 6 + val1; //Hits
// val4 holds current amount of party members when casting Praefatio } else { // Formulas for Kyrie Eleison
// as Praefatio's barrier has more health and blocks more hits than Kyrie Elesion. val2 = status->max_hp * (val1 * 2 + 10) / 100;
if( val4 < 1 ) // == PR_KYRIE
val3 = (val1 / 2 + 5); val3 = (val1 / 2 + 5);
else { // == AB_PRAEFATIO
val2 += val4 * 2; // Increase barrier strength per party member.
val3 = 6 + val1;
} }
break; break;
case SC_MAGICPOWER: 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); unit_stop_attack(bl);
break; break;
case SC_NOCHAT: 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; tick = 60000;
val1 = battle_config.manner_system; // Mute filters. val1 = battle_config.manner_system; // Mute filters.
if (sd) { 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 val2 = 6 * val1; // AGI and DEX Reduction
val3 = 10 * val1; // Movement Speed Reduction val3 = 10 * val1; // Movement Speed Reduction
break; break;
case SC_READING_SB: case SC_FREEZE_SP:
// val2 = sp reduction per second // val2 = sp drain per 10 seconds
tick_time = 5000; // [GodLesZ] tick time tick_time = 10000; // [GodLesZ] tick time
break; break;
case SC_SPHERE_1: case SC_SPHERE_1:
case SC_SPHERE_2: case SC_SPHERE_2:
@ -11589,7 +11590,7 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
} }
break; break;
case SC_READING_SB: case SC_FREEZE_SP:
if( !status_charge(bl, 0, sce->val2) ) { if( !status_charge(bl, 0, sce->val2) ) {
int i; int i;
for(i = SC_SPELLBOOK1; i <= SC_MAXSPELLBOOK; i++) // Also remove stored spell as well. 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_GLORYWOUNDS:
case SC_SOULCOLD: case SC_SOULCOLD:
case SC_HAWKEYES: case SC_HAWKEYES:
case SC_GUILDAURA:
case SC_SAFETYWALL: case SC_SAFETYWALL:
case SC_PNEUMA: case SC_PNEUMA:
case SC_NOCHAT: case SC_NOCHAT:

View File

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