Compare commits
9 Commits
cleanup/pa
...
master
Author | SHA1 | Date | |
---|---|---|---|
![]() |
d6d850ba6e | ||
![]() |
63baa62f70 | ||
![]() |
8bd89b7fc0 | ||
![]() |
8c9e447fd5 | ||
![]() |
fa145ac838 | ||
![]() |
7880596b03 | ||
![]() |
f3f8e63448 | ||
![]() |
29671fa5cd | ||
![]() |
077f714e05 |
@ -83053,7 +83053,7 @@ Body:
|
|||||||
Hunter: true
|
Hunter: true
|
||||||
Rogue: true
|
Rogue: true
|
||||||
Locations:
|
Locations:
|
||||||
Right_Hand: true
|
Both_Hand: true
|
||||||
WeaponLevel: 4
|
WeaponLevel: 4
|
||||||
EquipLevelMin: 70
|
EquipLevelMin: 70
|
||||||
Refineable: true
|
Refineable: true
|
||||||
@ -202634,6 +202634,17 @@ Body:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
- Id: 480470
|
||||||
|
AegisName: C_Summer_Beach
|
||||||
|
Name: Costume Summer Beach # !todo check english name
|
||||||
|
Type: Armor
|
||||||
|
Locations:
|
||||||
|
Costume_Garment: true
|
||||||
|
ArmorLevel: 1
|
||||||
|
Script: |
|
||||||
|
hateffect HAT_EF_VACATION,true;
|
||||||
|
UnEquipScript: |
|
||||||
|
hateffect HAT_EF_VACATION,false;
|
||||||
- Id: 490004
|
- Id: 490004
|
||||||
AegisName: Atker_Ring
|
AegisName: Atker_Ring
|
||||||
Name: Attacker Booster Ring
|
Name: Attacker Booster Ring
|
||||||
|
@ -80408,6 +80408,28 @@ Body:
|
|||||||
Name: Footprint Effect
|
Name: Footprint Effect
|
||||||
Type: Card
|
Type: Card
|
||||||
SubType: Enchant
|
SubType: Enchant
|
||||||
|
Script: |
|
||||||
|
hateffect FOOTPRINT_EF_BASE,true;
|
||||||
|
UnEquipScript: |
|
||||||
|
hateffect FOOTPRINT_EF_BASE,false;
|
||||||
|
- Id: 313067
|
||||||
|
AegisName: aegis_313067
|
||||||
|
Name: Purple Star Footprint
|
||||||
|
Type: Card
|
||||||
|
SubType: Enchant
|
||||||
|
Script: |
|
||||||
|
hateffect FOOTPRINT_EF_PURPLESTAR,true;
|
||||||
|
UnEquipScript: |
|
||||||
|
hateffect FOOTPRINT_EF_PURPLESTAR,false;
|
||||||
|
- Id: 313068
|
||||||
|
AegisName: aegis_313068
|
||||||
|
Name: Yellow Star Footprint
|
||||||
|
Type: Card
|
||||||
|
SubType: Enchant
|
||||||
|
Script: |
|
||||||
|
hateffect FOOTPRINT_EF_YELLOWSTAR,true;
|
||||||
|
UnEquipScript: |
|
||||||
|
hateffect FOOTPRINT_EF_YELLOWSTAR,false;
|
||||||
- Id: 313070
|
- Id: 313070
|
||||||
AegisName: Ep21_4_Def
|
AegisName: Ep21_4_Def
|
||||||
Name: Forest Magic Orb (Physical Defense)
|
Name: Forest Magic Orb (Physical Defense)
|
||||||
@ -81896,6 +81918,15 @@ Body:
|
|||||||
Script: |
|
Script: |
|
||||||
bonus bLongAtkRate,getskilllv("SH_HOWLING_OF_CHUL_HO");
|
bonus bLongAtkRate,getskilllv("SH_HOWLING_OF_CHUL_HO");
|
||||||
bonus bBaseAtk,4*getskilllv("SH_HOWLING_OF_CHUL_HO");
|
bonus bBaseAtk,4*getskilllv("SH_HOWLING_OF_CHUL_HO");
|
||||||
|
- Id: 313345
|
||||||
|
AegisName: aegis_313345
|
||||||
|
Name: Puppy Footprint
|
||||||
|
Type: Card
|
||||||
|
SubType: Enchant
|
||||||
|
Script: |
|
||||||
|
hateffect FOOTPRINT_EF_DOGFOOT,true;
|
||||||
|
UnEquipScript: |
|
||||||
|
hateffect FOOTPRINT_EF_DOGFOOT,false;
|
||||||
- Id: 1000000
|
- Id: 1000000
|
||||||
AegisName: IDTest_event
|
AegisName: IDTest_event
|
||||||
Name: IDTest event
|
Name: IDTest event
|
||||||
@ -89440,6 +89471,11 @@ Body:
|
|||||||
Name: Footprint Effect (Garment)
|
Name: Footprint Effect (Garment)
|
||||||
Type: Etc
|
Type: Etc
|
||||||
Weight: 100
|
Weight: 100
|
||||||
|
- Id: 1001617
|
||||||
|
AegisName: PurpleStar_Foot_Robe
|
||||||
|
Name: Purple Star Footprint (Garment)
|
||||||
|
Type: Etc
|
||||||
|
Weight: 100
|
||||||
- Id: 1001618
|
- Id: 1001618
|
||||||
AegisName: aegis_1001618
|
AegisName: aegis_1001618
|
||||||
Name: Wigner Premium Exchange Ticket
|
Name: Wigner Premium Exchange Ticket
|
||||||
@ -89709,6 +89745,11 @@ Body:
|
|||||||
Weight: 10
|
Weight: 10
|
||||||
Flags:
|
Flags:
|
||||||
BuyingStore: true
|
BuyingStore: true
|
||||||
|
- Id: 1001650
|
||||||
|
AegisName: YellowStar_Foot_Robe
|
||||||
|
Name: Yellow Star Footprint (Garment)
|
||||||
|
Type: Etc
|
||||||
|
Weight: 100
|
||||||
- Id: 1001653
|
- Id: 1001653
|
||||||
AegisName: Ep21_Armor_E_Stone1
|
AegisName: Ep21_Armor_E_Stone1
|
||||||
Name: Turquoise Magic Stone
|
Name: Turquoise Magic Stone
|
||||||
@ -90322,6 +90363,11 @@ Body:
|
|||||||
NoGuildStorage: true
|
NoGuildStorage: true
|
||||||
NoMail: true
|
NoMail: true
|
||||||
NoAuction: true
|
NoAuction: true
|
||||||
|
- Id: 1001772
|
||||||
|
AegisName: aegis_1001772
|
||||||
|
Name: Puppy Footprint (Garment)
|
||||||
|
Type: Etc
|
||||||
|
Weight: 100
|
||||||
- Id: 1200000
|
- Id: 1200000
|
||||||
AegisName: IDTest_arrow
|
AegisName: IDTest_arrow
|
||||||
Name: IDTest arrow
|
Name: IDTest arrow
|
||||||
|
@ -78855,6 +78855,11 @@ Body:
|
|||||||
NoAuction: true
|
NoAuction: true
|
||||||
Script: |
|
Script: |
|
||||||
getgroupitem(IG_STOVE_CHANNELING_BOX_4);
|
getgroupitem(IG_STOVE_CHANNELING_BOX_4);
|
||||||
|
- Id: 103263
|
||||||
|
AegisName: Summer_Select_Box4
|
||||||
|
Name: Star Footprint Selection Box (Summer Beach)
|
||||||
|
Type: Usable
|
||||||
|
Weight: 10
|
||||||
- Id: 200000
|
- Id: 200000
|
||||||
AegisName: IDTest_Cash
|
AegisName: IDTest_Cash
|
||||||
Name: IDTest Cash
|
Name: IDTest Cash
|
||||||
|
@ -980,3 +980,13 @@ Body:
|
|||||||
- Group: 1
|
- Group: 1
|
||||||
Items:
|
Items:
|
||||||
- Item: C_Chaos_Emerald
|
- Item: C_Chaos_Emerald
|
||||||
|
- Item: Summer_Select_Box4
|
||||||
|
Groups:
|
||||||
|
- Group: 0
|
||||||
|
Items:
|
||||||
|
- Item: PurpleStar_Foot_Robe
|
||||||
|
- Item: C_Summer_Beach
|
||||||
|
- Group: 1
|
||||||
|
Items:
|
||||||
|
- Item: YellowStar_Foot_Robe
|
||||||
|
- Item: C_Summer_Beach
|
||||||
|
1581
db/re/job_stats.yml
1581
db/re/job_stats.yml
File diff suppressed because it is too large
Load Diff
@ -7535,7 +7535,7 @@ Body:
|
|||||||
TargetTrap: true
|
TargetTrap: true
|
||||||
Range: 9
|
Range: 9
|
||||||
Hit: Multi_Hit
|
Hit: Multi_Hit
|
||||||
HitCount: 5
|
HitCount: -5
|
||||||
Element: Weapon
|
Element: Weapon
|
||||||
CopyFlags:
|
CopyFlags:
|
||||||
Skill:
|
Skill:
|
||||||
|
@ -309,8 +309,10 @@ int chclif_parse_pincode_setnew( int fd, struct char_session_data* sd ){
|
|||||||
if( charserv_config.pincode_config.pincode_enabled==0 || RFIFOL(fd,2) != sd->account_id ) {
|
if( charserv_config.pincode_config.pincode_enabled==0 || RFIFOL(fd,2) != sd->account_id ) {
|
||||||
set_eof(fd);
|
set_eof(fd);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
} else if (strnlen(sd->pincode, PINCODE_LENGTH) > 0) {
|
||||||
else {
|
set_eof(fd);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
char newpin[PINCODE_LENGTH+1];
|
char newpin[PINCODE_LENGTH+1];
|
||||||
memset(newpin,0,PINCODE_LENGTH+1);
|
memset(newpin,0,PINCODE_LENGTH+1);
|
||||||
strncpy( newpin, RFIFOCP(fd,6), PINCODE_LENGTH );
|
strncpy( newpin, RFIFOCP(fd,6), PINCODE_LENGTH );
|
||||||
|
@ -3237,7 +3237,7 @@ ACMD_FUNC(petfriendly) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pet_set_intimate(pd, friendly);
|
pet_set_intimate(pd, friendly);
|
||||||
clif_send_petstatus( *sd, *pd );
|
clif_send_petstatus(sd);
|
||||||
clif_displaymessage(fd, msg_txt(sd,182)); // Pet intimacy changed.
|
clif_displaymessage(fd, msg_txt(sd,182)); // Pet intimacy changed.
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -3271,7 +3271,7 @@ ACMD_FUNC(pethungry)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pd->pet.hungry = hungry;
|
pd->pet.hungry = hungry;
|
||||||
clif_send_petstatus( *sd, *pd );
|
clif_send_petstatus(sd);
|
||||||
clif_displaymessage(fd, msg_txt(sd,185)); // Pet hunger changed.
|
clif_displaymessage(fd, msg_txt(sd,185)); // Pet hunger changed.
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -3296,7 +3296,7 @@ ACMD_FUNC(petrename)
|
|||||||
|
|
||||||
pd->pet.rename_flag = 0;
|
pd->pet.rename_flag = 0;
|
||||||
intif_save_petdata(sd->status.account_id, &pd->pet);
|
intif_save_petdata(sd->status.account_id, &pd->pet);
|
||||||
clif_send_petstatus( *sd, *pd );
|
clif_send_petstatus(sd);
|
||||||
clif_displaymessage(fd, msg_txt(sd,187)); // You can now rename your pet.
|
clif_displaymessage(fd, msg_txt(sd,187)); // You can now rename your pet.
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -3792,7 +3792,7 @@ ACMD_FUNC(lostskill)
|
|||||||
|
|
||||||
sd->status.skill[sk_idx].lv = 0;
|
sd->status.skill[sk_idx].lv = 0;
|
||||||
sd->status.skill[sk_idx].flag = SKILL_FLAG_PERMANENT;
|
sd->status.skill[sk_idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
clif_deleteskill(sd,skill_id);
|
clif_deleteskill(*sd,skill_id);
|
||||||
clif_displaymessage(fd, msg_txt(sd,71)); // You have forgotten the skill.
|
clif_displaymessage(fd, msg_txt(sd,71)); // You have forgotten the skill.
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -6313,13 +6313,13 @@ ACMD_FUNC(displayskill)
|
|||||||
status_data* status = status_get_status_data(sd->bl);
|
status_data* status = status_get_status_data(sd->bl);
|
||||||
tick = gettick();
|
tick = gettick();
|
||||||
if (type == 0 || type == 1)
|
if (type == 0 || type == 1)
|
||||||
clif_skill_damage( sd->bl, sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
if (type == 0 || type == 2)
|
if (type == 0 || type == 2)
|
||||||
clif_skill_damage( sd->bl, sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SPLASH );
|
clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SPLASH);
|
||||||
if (type == 0 || type == 3)
|
if (type == 0 || type == 3)
|
||||||
clif_skill_nodamage(&sd->bl, sd->bl, skill_id, skill_lv);
|
clif_skill_nodamage(&sd->bl, sd->bl, skill_id, skill_lv);
|
||||||
if (type == 0 || type == 4)
|
if (type == 0 || type == 4)
|
||||||
clif_skill_poseffect( sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick );
|
clif_skill_poseffect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7449,7 +7449,7 @@ ACMD_FUNC(summon)
|
|||||||
clif_specialeffect(&md->bl,EF_ENTRY2,AREA);
|
clif_specialeffect(&md->bl,EF_ENTRY2,AREA);
|
||||||
mob_spawn(md);
|
mob_spawn(md);
|
||||||
sc_start4(nullptr,&md->bl, SC_MODECHANGE, 100, 1, 0, MD_AGGRESSIVE, 0, 60000);
|
sc_start4(nullptr,&md->bl, SC_MODECHANGE, 100, 1, 0, MD_AGGRESSIVE, 0, 60000);
|
||||||
clif_skill_poseffect( sd->bl, AM_CALLHOMUN, 1, md->bl.x, md->bl.y, tick );
|
clif_skill_poseffect(&sd->bl,AM_CALLHOMUN,1,md->bl.x,md->bl.y,tick);
|
||||||
clif_displaymessage(fd, msg_txt(sd,39)); // All monster summoned!
|
clif_displaymessage(fd, msg_txt(sd,39)); // All monster summoned!
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -3693,6 +3693,12 @@ static int battle_get_spiritball_damage(struct Damage& wd, struct block_list& sr
|
|||||||
// These skills used as many spheres as they do hits
|
// These skills used as many spheres as they do hits
|
||||||
damage = (wd.div_ + sd->spiritball) * 3;
|
damage = (wd.div_ + sd->spiritball) * 3;
|
||||||
break;
|
break;
|
||||||
|
#ifdef RENEWAL
|
||||||
|
case MO_FINGEROFFENSIVE:
|
||||||
|
// These skills store the spheres used in spiritball_old
|
||||||
|
damage = (sd->spiritball_old + sd->spiritball) * 3;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
case MO_EXTREMITYFIST:
|
case MO_EXTREMITYFIST:
|
||||||
// These skills store the number of spheres the player had before cast
|
// These skills store the number of spheres the player had before cast
|
||||||
damage = sd->spiritball_old * 3;
|
damage = sd->spiritball_old * 3;
|
||||||
@ -6803,9 +6809,9 @@ static void battle_calc_attack_plant(struct Damage* wd, struct block_list *src,s
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Triple Attack has a special property that it does not split damage on plant mode
|
// Triple Attack and Finger Offensive have a special property, they do not split damage on plant mode
|
||||||
// In pre-renewal, it requires the monster to have exactly 100 def
|
// In pre-renewal, it requires the monster to have exactly 100 def
|
||||||
if (skill_id == MO_TRIPLEATTACK && wd->div_ < 0
|
if ((skill_id == MO_TRIPLEATTACK || skill_id == MO_FINGEROFFENSIVE) && wd->div_ < 0
|
||||||
#ifndef RENEWAL
|
#ifndef RENEWAL
|
||||||
&& tstatus->def == 100
|
&& tstatus->def == 100
|
||||||
#endif
|
#endif
|
||||||
@ -7006,8 +7012,8 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
|
|||||||
rdamage = battle_calc_base_damage(target,tstatus,&tstatus->rhw,tsc,sstatus->size,0);
|
rdamage = battle_calc_base_damage(target,tstatus,&tstatus->rhw,tsc,sstatus->size,0);
|
||||||
rdamage = (int64)rdamage * ratio / 100 + wd->damage * (10 + tsc->getSCE(SC_CRESCENTELBOW)->val1 * 20 / 10) / 10;
|
rdamage = (int64)rdamage * ratio / 100 + wd->damage * (10 + tsc->getSCE(SC_CRESCENTELBOW)->val1 * 20 / 10) / 10;
|
||||||
skill_blown(target, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1), unit_getdir(src), BLOWN_NONE);
|
skill_blown(target, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1), unit_getdir(src), BLOWN_NONE);
|
||||||
clif_skill_damage( *target, *src, gettick(), status_get_amotion(src), 0, rdamage,
|
clif_skill_damage(target, src, gettick(), status_get_amotion(src), 0, rdamage,
|
||||||
1, SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1, DMG_SINGLE ); // This is how official does
|
1, SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1, DMG_SINGLE); // This is how official does
|
||||||
clif_damage(*src, *target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false);
|
clif_damage(*src, *target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false);
|
||||||
battle_fix_damage(target, src, rdamage, 0, SR_CRESCENTELBOW);
|
battle_fix_damage(target, src, rdamage, 0, SR_CRESCENTELBOW);
|
||||||
status_damage(src, target, rdamage/10, 0, 0, 1, 0);
|
status_damage(src, target, rdamage/10, 0, 0, 1, 0);
|
||||||
@ -9507,7 +9513,7 @@ int64 battle_calc_return_damage(struct block_list* tbl, struct block_list *src,
|
|||||||
int64 rd1 = i64min(damage, status_get_max_hp(tbl)) * tsc->getSCE(SC_DEATHBOUND)->val2 / 100; // Amplify damage.
|
int64 rd1 = i64min(damage, status_get_max_hp(tbl)) * tsc->getSCE(SC_DEATHBOUND)->val2 / 100; // Amplify damage.
|
||||||
|
|
||||||
*dmg = rd1 * 30 / 100; // Received damage = 30% of amplified damage.
|
*dmg = rd1 * 30 / 100; // Received damage = 30% of amplified damage.
|
||||||
clif_skill_damage( *src, *tbl, gettick(), status_get_amotion(src), 0, -30000, 1, RK_DEATHBOUND, tsc->getSCE(SC_DEATHBOUND)->val1, DMG_SINGLE );
|
clif_skill_damage(src, tbl, gettick(), status_get_amotion(src), 0, -30000, 1, RK_DEATHBOUND, tsc->getSCE(SC_DEATHBOUND)->val1, DMG_SINGLE);
|
||||||
skill_blown(tbl, src, skill_get_blewcount(RK_DEATHBOUND, tsc->getSCE(SC_DEATHBOUND)->val1), unit_getdir(src), BLOWN_NONE);
|
skill_blown(tbl, src, skill_get_blewcount(RK_DEATHBOUND, tsc->getSCE(SC_DEATHBOUND)->val1), unit_getdir(src), BLOWN_NONE);
|
||||||
status_change_end(tbl, SC_DEATHBOUND);
|
status_change_end(tbl, SC_DEATHBOUND);
|
||||||
rdamage += rd1 * 70 / 100; // Target receives 70% of the amplified damage. [Rytech]
|
rdamage += rd1 * 70 / 100; // Target receives 70% of the amplified damage. [Rytech]
|
||||||
@ -9901,7 +9907,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
|||||||
if(sc_start4(src,src, SC_BLADESTOP, 100, sd?pc_checkskill(sd, MO_BLADESTOP):5, 0, 0, target->id, duration))
|
if(sc_start4(src,src, SC_BLADESTOP, 100, sd?pc_checkskill(sd, MO_BLADESTOP):5, 0, 0, target->id, duration))
|
||||||
{ //Target locked.
|
{ //Target locked.
|
||||||
clif_damage(*src, *target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
|
clif_damage(*src, *target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
|
||||||
clif_bladestop( *target, src->id, true );
|
clif_bladestop(target, src->id, 1);
|
||||||
sc_start4(src,target, SC_BLADESTOP, 100, skill_lv, 0, 0, src->id, duration);
|
sc_start4(src,target, SC_BLADESTOP, 100, skill_lv, 0, 0, src->id, duration);
|
||||||
return ATK_BLOCK;
|
return ATK_BLOCK;
|
||||||
}
|
}
|
||||||
@ -10106,7 +10112,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
|||||||
s_elemental_data *ed = ((TBL_PC*)target)->ed;
|
s_elemental_data *ed = ((TBL_PC*)target)->ed;
|
||||||
|
|
||||||
if (ed) {
|
if (ed) {
|
||||||
clif_skill_damage( ed->bl, *target, tick, status_get_amotion(src), 0, -30000, 1, EL_CIRCLE_OF_FIRE, tsc->getSCE(SC_CIRCLE_OF_FIRE_OPTION)->val1, DMG_SINGLE );
|
clif_skill_damage(&ed->bl, target, tick, status_get_amotion(src), 0, -30000, 1, EL_CIRCLE_OF_FIRE, tsc->getSCE(SC_CIRCLE_OF_FIRE_OPTION)->val1, DMG_SINGLE);
|
||||||
skill_attack(BF_WEAPON,&ed->bl,&ed->bl,src,EL_CIRCLE_OF_FIRE,tsc->getSCE(SC_CIRCLE_OF_FIRE_OPTION)->val1,tick,wd.flag);
|
skill_attack(BF_WEAPON,&ed->bl,&ed->bl,src,EL_CIRCLE_OF_FIRE,tsc->getSCE(SC_CIRCLE_OF_FIRE_OPTION)->val1,tick,wd.flag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1065,7 +1065,7 @@ int chrif_deadopt(uint32 father_id, uint32 mother_id, uint32 child_id) {
|
|||||||
sd->status.skill[idx].id = 0;
|
sd->status.skill[idx].id = 0;
|
||||||
sd->status.skill[idx].lv = 0;
|
sd->status.skill[idx].lv = 0;
|
||||||
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
clif_deleteskill(sd,WE_CALLBABY);
|
clif_deleteskill(*sd,WE_CALLBABY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( mother_id && ( sd = map_charid2sd(mother_id) ) != nullptr && sd->status.child == child_id ) {
|
if( mother_id && ( sd = map_charid2sd(mother_id) ) != nullptr && sd->status.child == child_id ) {
|
||||||
@ -1073,7 +1073,7 @@ int chrif_deadopt(uint32 father_id, uint32 mother_id, uint32 child_id) {
|
|||||||
sd->status.skill[idx].id = 0;
|
sd->status.skill[idx].id = 0;
|
||||||
sd->status.skill[idx].lv = 0;
|
sd->status.skill[idx].lv = 0;
|
||||||
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
clif_deleteskill(sd,WE_CALLBABY);
|
clif_deleteskill(*sd,WE_CALLBABY);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
505
src/map/clif.cpp
505
src/map/clif.cpp
@ -1741,10 +1741,8 @@ int clif_spawn( struct block_list *bl, bool walking ){
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BL_PET:
|
case BL_PET:
|
||||||
if (vd->head_bottom) { // needed to display pet equip properly
|
if (vd->head_bottom)
|
||||||
pet_data* pd = BL_CAST( BL_PET, bl );
|
clif_pet_equip_area((TBL_PET*)bl); // needed to display pet equip properly
|
||||||
clif_pet_equip_area( *pd );
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -2038,10 +2036,8 @@ void clif_move( struct unit_data& ud )
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BL_PET:
|
case BL_PET:
|
||||||
if (vd->head_bottom) { // needed to display pet equip properly
|
if (vd->head_bottom) // needed to display pet equip properly
|
||||||
pet_data* pd = reinterpret_cast<pet_data*>( bl );
|
clif_pet_equip_area(BL_CAST(BL_PET, bl));
|
||||||
clif_pet_equip_area( *pd );
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5053,10 +5049,8 @@ void clif_getareachar_unit( map_session_data* sd,struct block_list *bl ){
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BL_PET:
|
case BL_PET:
|
||||||
if (vd->head_bottom) { // needed to display pet equip properly
|
if (vd->head_bottom)
|
||||||
pet_data* pd = BL_CAST( BL_PET, bl );
|
clif_pet_equip(sd, (TBL_PET*)bl); // needed to display pet equip properly
|
||||||
clif_pet_equip( sd, *pd );
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5092,13 +5086,8 @@ static int clif_calc_walkdelay(struct block_list *bl,int delay, char type, int64
|
|||||||
/*========================================== [Playtester]
|
/*========================================== [Playtester]
|
||||||
* Returns hallucination damage the client displays
|
* Returns hallucination damage the client displays
|
||||||
*------------------------------------------*/
|
*------------------------------------------*/
|
||||||
static int64 clif_hallucination_damage( block_list& bl, int64 damage ){
|
static int clif_hallucination_damage()
|
||||||
status_change *sc;
|
{
|
||||||
|
|
||||||
if (!((sc = status_get_sc(&bl)) && sc->count && sc->getSCE(SC_HALLUCINATION) && damage)) {
|
|
||||||
return damage;
|
|
||||||
}
|
|
||||||
|
|
||||||
int digit = rnd() % 5 + 1;
|
int digit = rnd() % 5 + 1;
|
||||||
switch (digit)
|
switch (digit)
|
||||||
{
|
{
|
||||||
@ -5142,9 +5131,15 @@ int clif_damage(block_list& src, block_list& dst, t_tick tick, int sdelay, int d
|
|||||||
if (type != DMG_MULTI_HIT_CRITICAL)
|
if (type != DMG_MULTI_HIT_CRITICAL)
|
||||||
type = clif_calc_delay(type,div,damage+damage2,ddelay);
|
type = clif_calc_delay(type,div,damage+damage2,ddelay);
|
||||||
|
|
||||||
damage = static_cast<int32>(clif_hallucination_damage( dst, damage ));
|
status_change *sc = status_get_sc(&dst);
|
||||||
if (damage2)
|
|
||||||
damage2 = static_cast<int32>(clif_hallucination_damage( dst, damage2 ));
|
if(sc && sc->count) {
|
||||||
|
if(sc->getSCE(SC_HALLUCINATION)) {
|
||||||
|
damage = clif_hallucination_damage();
|
||||||
|
if(damage2)
|
||||||
|
damage2 = clif_hallucination_damage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Calculate what sdelay to send to the client so it applies damage at the same time as the server
|
// Calculate what sdelay to send to the client so it applies damage at the same time as the server
|
||||||
if (battle_config.synchronize_damage && src.type == BL_MOB) {
|
if (battle_config.synchronize_damage && src.type == BL_MOB) {
|
||||||
@ -5703,28 +5698,26 @@ void clif_addskill(map_session_data *sd, int skill_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Deletes a skill from the skill tree (ZC_SKILLINFO_DELETE).
|
/// Deletes a skill from the skill tree.
|
||||||
/// 0441 <skill id>.W
|
/// 0441 <skill id>.W (ZC_SKILLINFO_DELETE)
|
||||||
void clif_deleteskill(map_session_data *sd, int skill_id, bool skip_infoblock)
|
void clif_deleteskill(map_session_data& sd, uint16 skill_id, bool skip_infoblock){
|
||||||
{
|
#if PACKETVER >= 20081126
|
||||||
#if PACKETVER >= 20081217
|
|
||||||
nullpo_retv(sd);
|
|
||||||
|
|
||||||
int fd = sd->fd;
|
|
||||||
uint16 idx = skill_get_index(skill_id);
|
uint16 idx = skill_get_index(skill_id);
|
||||||
|
|
||||||
if (!session_isActive(fd) || !idx)
|
if (idx == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
WFIFOHEAD(fd,packet_len(0x441));
|
PACKET_ZC_SKILLINFO_DELETE p{};
|
||||||
WFIFOW(fd,0) = 0x441;
|
|
||||||
WFIFOW(fd,2) = skill_id;
|
p.packetType = HEADER_ZC_SKILLINFO_DELETE;
|
||||||
WFIFOSET(fd,packet_len(0x441));
|
p.skillID = skill_id;
|
||||||
|
|
||||||
|
clif_send(&p,sizeof(p),&sd.bl,SELF);
|
||||||
#endif
|
#endif
|
||||||
#if PACKETVER_MAIN_NUM >= 20190807 || PACKETVER_RE_NUM >= 20190807 || PACKETVER_ZERO_NUM >= 20190918
|
#if PACKETVER_MAIN_NUM >= 20190807 || PACKETVER_RE_NUM >= 20190807 || PACKETVER_ZERO_NUM >= 20190918
|
||||||
if (!skip_infoblock)
|
if (!skip_infoblock)
|
||||||
#endif
|
#endif
|
||||||
clif_skillinfoblock(sd);
|
clif_skillinfoblock(&sd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Updates a skill in the skill tree (ZC_SKILLINFO_UPDATE).
|
/// Updates a skill in the skill tree (ZC_SKILLINFO_UPDATE).
|
||||||
@ -5928,61 +5921,96 @@ void clif_skill_cooldown( map_session_data &sd, uint16 skill_id, t_tick tick ){
|
|||||||
/// Skill attack effect and damage.
|
/// Skill attack effect and damage.
|
||||||
/// 0114 <skill id>.W <src id>.L <dst id>.L <tick>.L <src delay>.L <dst delay>.L <damage>.W <level>.W <div>.W <type>.B (ZC_NOTIFY_SKILL)
|
/// 0114 <skill id>.W <src id>.L <dst id>.L <tick>.L <src delay>.L <dst delay>.L <damage>.W <level>.W <div>.W <type>.B (ZC_NOTIFY_SKILL)
|
||||||
/// 01de <skill id>.W <src id>.L <dst id>.L <tick>.L <src delay>.L <dst delay>.L <damage>.L <level>.W <div>.W <type>.B (ZC_NOTIFY_SKILL2)
|
/// 01de <skill id>.W <src id>.L <dst id>.L <tick>.L <src delay>.L <dst delay>.L <damage>.L <level>.W <div>.W <type>.B (ZC_NOTIFY_SKILL2)
|
||||||
int clif_skill_damage( block_list& src, block_list& dst, t_tick tick, int32 sdelay, int32 ddelay, int64 sdamage, int32 div, uint16 skill_id, uint16 skill_lv, e_damage_type type ){
|
int clif_skill_damage(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int64 sdamage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type)
|
||||||
type = clif_calc_delay( type, div, sdamage, ddelay );
|
{
|
||||||
sdamage = clif_hallucination_damage( dst, sdamage );
|
unsigned char buf[64];
|
||||||
|
status_change *sc;
|
||||||
|
int damage = (int)cap_value(sdamage,INT_MIN,INT_MAX);
|
||||||
|
|
||||||
PACKET_ZC_NOTIFY_SKILL packet{};
|
nullpo_ret(src);
|
||||||
|
nullpo_ret(dst);
|
||||||
|
|
||||||
packet.PacketType = HEADER_ZC_NOTIFY_SKILL;
|
type = clif_calc_delay(type,div,damage,ddelay);
|
||||||
packet.SKID = skill_id;
|
|
||||||
packet.AID = src.id;
|
|
||||||
packet.targetID = dst.id;
|
|
||||||
packet.startTime = client_tick( tick );
|
|
||||||
packet.attackMT = sdelay;
|
|
||||||
packet.attackedMT = ddelay;
|
|
||||||
|
|
||||||
auto damage = std::min( static_cast<decltype(packet.damage)>( sdamage ), std::numeric_limits<decltype(packet.damage)>::max() );
|
if( ( sc = status_get_sc(dst) ) && sc->count ) {
|
||||||
|
if(sc->getSCE(SC_HALLUCINATION) && damage)
|
||||||
if (battle_config.hide_woe_damage && map_flag_gvg(src.m)) {
|
damage = clif_hallucination_damage();
|
||||||
packet.damage = static_cast<decltype(packet.damage)>(damage ? div : 0);
|
|
||||||
} else {
|
|
||||||
packet.damage = damage;
|
|
||||||
}
|
}
|
||||||
packet.level = skill_lv;
|
|
||||||
packet.count = static_cast<decltype(packet.count)>(div);
|
|
||||||
|
|
||||||
|
#if PACKETVER < 3
|
||||||
|
WBUFW(buf,0)=0x114;
|
||||||
|
WBUFW(buf,2)=skill_id;
|
||||||
|
WBUFL(buf,4)=src->id;
|
||||||
|
WBUFL(buf,8)=dst->id;
|
||||||
|
WBUFL(buf,12)=client_tick(tick);
|
||||||
|
WBUFL(buf,16)=sdelay;
|
||||||
|
WBUFL(buf,20)=ddelay;
|
||||||
|
if (battle_config.hide_woe_damage && map_flag_gvg(src->m)) {
|
||||||
|
WBUFW(buf,24)=damage?div:0;
|
||||||
|
} else {
|
||||||
|
WBUFW(buf,24)=damage;
|
||||||
|
}
|
||||||
|
WBUFW(buf,26)=skill_lv;
|
||||||
|
WBUFW(buf,28)=div;
|
||||||
|
WBUFB(buf,30)=type;
|
||||||
|
if (disguised(dst)) {
|
||||||
|
clif_send(buf,packet_len(0x114),dst,AREA_WOS);
|
||||||
|
WBUFL(buf,8)=disguised_bl_id(dst->id);
|
||||||
|
clif_send(buf,packet_len(0x114),dst,SELF);
|
||||||
|
} else
|
||||||
|
clif_send(buf,packet_len(0x114),dst,AREA);
|
||||||
|
|
||||||
|
if(disguised(src)) {
|
||||||
|
WBUFL(buf,4)=disguised_bl_id(src->id);
|
||||||
|
if (disguised(dst))
|
||||||
|
WBUFL(buf,8)=dst->id;
|
||||||
|
if(damage > 0)
|
||||||
|
WBUFW(buf,24)=-1;
|
||||||
|
clif_send(buf,packet_len(0x114),src,SELF);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
WBUFW(buf,0)=0x1de;
|
||||||
|
WBUFW(buf,2)=skill_id;
|
||||||
|
WBUFL(buf,4)=src->id;
|
||||||
|
WBUFL(buf,8)=dst->id;
|
||||||
|
WBUFL(buf,12)=client_tick(tick);
|
||||||
|
WBUFL(buf,16)=sdelay;
|
||||||
|
WBUFL(buf,20)=ddelay;
|
||||||
|
if (battle_config.hide_woe_damage && map_flag_gvg(src->m)) {
|
||||||
|
WBUFL(buf,24)=damage?div:0;
|
||||||
|
} else {
|
||||||
|
WBUFL(buf,24)=damage;
|
||||||
|
}
|
||||||
|
WBUFW(buf,28)=skill_lv;
|
||||||
|
WBUFW(buf,30)=div;
|
||||||
// For some reason, late 2013 and newer clients have
|
// For some reason, late 2013 and newer clients have
|
||||||
// a issue that causes players and monsters to endure
|
// a issue that causes players and monsters to endure
|
||||||
// type 6 (ACTION_SKILL) skills. So we have to do a small
|
// type 6 (ACTION_SKILL) skills. So we have to do a small
|
||||||
// hack to set all type 6 to be sent as type 8 ACTION_ATTACK_MULTIPLE
|
// hack to set all type 6 to be sent as type 8 ACTION_ATTACK_MULTIPLE
|
||||||
#if PACKETVER < 20131223
|
#if PACKETVER < 20131223
|
||||||
packet.action = static_cast<decltype(packet.action)>(type);
|
WBUFB(buf,32)=type;
|
||||||
#else
|
#else
|
||||||
packet.action = static_cast<decltype(packet.action)>(( type == DMG_SINGLE ) ? DMG_MULTI_HIT : type);
|
WBUFB(buf,32)=( type == DMG_SINGLE ) ? DMG_MULTI_HIT : type;
|
||||||
|
#endif
|
||||||
|
if (disguised(dst)) {
|
||||||
|
clif_send(buf,packet_len(0x1de),dst,AREA_WOS);
|
||||||
|
WBUFL(buf,8)=disguised_bl_id(dst->id);
|
||||||
|
clif_send(buf,packet_len(0x1de),dst,SELF);
|
||||||
|
} else
|
||||||
|
clif_send(buf,packet_len(0x1de),dst,AREA);
|
||||||
|
|
||||||
|
if(disguised(src)) {
|
||||||
|
WBUFL(buf,4)=disguised_bl_id(src->id);
|
||||||
|
if (disguised(dst))
|
||||||
|
WBUFL(buf,8)=dst->id;
|
||||||
|
if(damage > 0)
|
||||||
|
WBUFL(buf,24)=-1;
|
||||||
|
clif_send(buf,packet_len(0x1de),src,SELF);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (disguised(&dst)) {
|
|
||||||
clif_send( &packet, sizeof( packet ), &dst, AREA_WOS );
|
|
||||||
packet.targetID = disguised_bl_id( dst.id );
|
|
||||||
clif_send( &packet, sizeof( packet ), &dst, SELF );
|
|
||||||
} else {
|
|
||||||
clif_send( &packet, sizeof( packet ), &dst, AREA );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (disguised(&src)) {
|
|
||||||
packet.AID = disguised_bl_id( src.id );
|
|
||||||
if (disguised(&dst)) {
|
|
||||||
packet.targetID = dst.id;
|
|
||||||
}
|
|
||||||
if (damage > 0) {
|
|
||||||
packet.damage = -1;
|
|
||||||
}
|
|
||||||
clif_send( &packet, sizeof( packet ), &src, SELF );
|
|
||||||
}
|
|
||||||
|
|
||||||
//Because the damage delay must be synced with the client, here is where the can-walk tick must be updated. [Skotlex]
|
//Because the damage delay must be synced with the client, here is where the can-walk tick must be updated. [Skotlex]
|
||||||
return clif_calc_walkdelay( &dst, ddelay, type, damage, div );
|
return clif_calc_walkdelay(dst,ddelay,type,damage,div);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -5992,14 +6020,19 @@ int clif_skill_damage( block_list& src, block_list& dst, t_tick tick, int32 sdel
|
|||||||
int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int damage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type)
|
int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int damage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type)
|
||||||
{
|
{
|
||||||
unsigned char buf[64];
|
unsigned char buf[64];
|
||||||
|
status_change *sc;
|
||||||
|
|
||||||
nullpo_ret(src);
|
nullpo_ret(src);
|
||||||
nullpo_ret(dst);
|
nullpo_ret(dst);
|
||||||
|
|
||||||
type = (type>DMG_NORMAL)?type:skill_get_hit(skill_id);
|
type = (type>DMG_NORMAL)?type:skill_get_hit(skill_id);
|
||||||
type = clif_calc_delay(type,div,damage,ddelay);
|
type = clif_calc_delay(type,div,damage,ddelay);
|
||||||
|
sc = status_get_sc(dst);
|
||||||
|
|
||||||
damage = clif_hallucination_damage( *dst, damage );
|
if(sc && sc->count) {
|
||||||
|
if(sc->getSCE(SC_HALLUCINATION) && damage)
|
||||||
|
damage = clif_hallucination_damage();
|
||||||
|
}
|
||||||
|
|
||||||
WBUFW(buf,0)=0x115;
|
WBUFW(buf,0)=0x115;
|
||||||
WBUFW(buf,2)=skill_id;
|
WBUFW(buf,2)=skill_id;
|
||||||
@ -6075,27 +6108,28 @@ bool clif_skill_nodamage( block_list* src, block_list& dst, uint16 skill_id, int
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Non-damaging ground skill effect.
|
|
||||||
/// 0117 <skill id>.W <src id>.L <level>.W <x>.W <y>.W <tick>.L (ZC_NOTIFY_GROUNDSKILL)
|
|
||||||
void clif_skill_poseffect( block_list& bl, uint16 skill_id, uint16 skill_lv, int32 x, int32 y, t_tick tick ){
|
|
||||||
PACKET_ZC_NOTIFY_GROUNDSKILL packet{};
|
|
||||||
|
|
||||||
packet.PacketType = HEADER_ZC_NOTIFY_GROUNDSKILL;
|
/// Non-damaging ground skill effect (ZC_NOTIFY_GROUNDSKILL).
|
||||||
packet.SKID = skill_id;
|
/// 0117 <skill id>.W <src id>.L <level>.W <x>.W <y>.W <tick>.L
|
||||||
packet.AID = bl.id;
|
void clif_skill_poseffect(struct block_list *src,uint16 skill_id,int val,int x,int y,t_tick tick)
|
||||||
packet.level = skill_lv;
|
{
|
||||||
packet.xPos = static_cast<decltype(packet.xPos)>( x );
|
unsigned char buf[32];
|
||||||
packet.yPos = static_cast<decltype(packet.yPos)>( y );
|
|
||||||
packet.startTime = client_tick( tick );
|
|
||||||
|
|
||||||
if (disguised(&bl)) {
|
nullpo_retv(src);
|
||||||
clif_send( &packet, sizeof( packet ), &bl, AREA_WOS );
|
|
||||||
|
|
||||||
packet.AID = disguised_bl_id( bl.id );
|
WBUFW(buf,0)=0x117;
|
||||||
clif_send( &packet, sizeof( packet ), &bl, SELF );
|
WBUFW(buf,2)=skill_id;
|
||||||
} else {
|
WBUFL(buf,4)=src->id;
|
||||||
clif_send( &packet, sizeof( packet ), &bl, AREA );
|
WBUFW(buf,8)=val;
|
||||||
}
|
WBUFW(buf,10)=x;
|
||||||
|
WBUFW(buf,12)=y;
|
||||||
|
WBUFL(buf,14)=client_tick(tick);
|
||||||
|
if(disguised(src)) {
|
||||||
|
clif_send(buf,packet_len(0x117),src,AREA_WOS);
|
||||||
|
WBUFL(buf,4)=disguised_bl_id(src->id);
|
||||||
|
clif_send(buf,packet_len(0x117),src,SELF);
|
||||||
|
} else
|
||||||
|
clif_send(buf,packet_len(0x117),src,AREA);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Presents a list of available warp destinations.
|
/// Presents a list of available warp destinations.
|
||||||
@ -6205,33 +6239,38 @@ void clif_skill_teleportmessage( map_session_data& sd, e_notify_mapinfo_result r
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Displays Sense (WZ_ESTIMATION) information window.
|
/// Displays Sense (WZ_ESTIMATION) information window (ZC_MONSTER_INFO).
|
||||||
/// 018c <class>.W <level>.W <size>.W <hp>.L <def>.W <race>.W <mdef>.W <element>.W
|
/// 018c <class>.W <level>.W <size>.W <hp>.L <def>.W <race>.W <mdef>.W <element>.W
|
||||||
/// <water%>.B <earth%>.B <fire%>.B <wind%>.B <poison%>.B <holy%>.B <shadow%>.B <ghost%>.B <undead%>.B (ZC_MONSTER_INFO)
|
/// <water%>.B <earth%>.B <fire%>.B <wind%>.B <poison%>.B <holy%>.B <shadow%>.B <ghost%>.B <undead%>.B
|
||||||
void clif_skill_estimation( map_session_data& sd, mob_data& md ){
|
void clif_skill_estimation(map_session_data *sd,struct block_list *dst)
|
||||||
PACKET_ZC_MONSTER_INFO packet{};
|
{
|
||||||
|
unsigned char buf[64];
|
||||||
|
int i, fix;
|
||||||
|
|
||||||
packet.packetType = HEADER_ZC_MONSTER_INFO;
|
nullpo_retv(sd);
|
||||||
packet.class_ = md.vd->class_;
|
nullpo_retv(dst);
|
||||||
packet.level = static_cast<decltype(packet.level)>( md.level );
|
|
||||||
packet.size = md.status.size;
|
|
||||||
packet.hp = md.status.hp;
|
|
||||||
packet.def = static_cast<decltype(packet.def)>( ((battle_config.estimation_type&1) ? md.status.def : 0 ) + ((battle_config.estimation_type&2) ? md.status.def2 : 0 ) );
|
|
||||||
packet.race = md.status.race;
|
|
||||||
packet.mdef = static_cast<decltype(packet.mdef)>( ((battle_config.estimation_type&1) ? md.status.mdef : 0 ) + ((battle_config.estimation_type&2) ? md.status.mdef2 : 0 ) );
|
|
||||||
packet.element = md.status.def_ele;
|
|
||||||
// The following caps negative attributes to 0 since the client displays them as 255-fix. [Skotlex]
|
|
||||||
packet.water = static_cast<decltype(packet.water)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 1, md.status.def_ele), (int16)0 ) );
|
|
||||||
packet.earth = static_cast<decltype(packet.earth)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 2, md.status.def_ele), (int16)0 ) );
|
|
||||||
packet.fire = static_cast<decltype(packet.fire)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 3, md.status.def_ele), (int16)0 ) );
|
|
||||||
packet.wind = static_cast<decltype(packet.wind)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 4, md.status.def_ele), (int16)0 ) );
|
|
||||||
packet.poison = static_cast<decltype(packet.poison)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 5, md.status.def_ele), (int16)0 ) );
|
|
||||||
packet.holy = static_cast<decltype(packet.holy)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 6, md.status.def_ele), (int16)0 ) );
|
|
||||||
packet.shadow = static_cast<decltype(packet.shadow)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 7, md.status.def_ele), (int16)0 ) );
|
|
||||||
packet.ghost = static_cast<decltype(packet.ghost)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 8, md.status.def_ele), (int16)0 ) );
|
|
||||||
packet.undead = static_cast<decltype(packet.undead)>( std::max( elemental_attribute_db.getAttribute(md.status.ele_lv, 9, md.status.def_ele), (int16)0 ) );
|
|
||||||
|
|
||||||
clif_send( &packet, sizeof( packet ), &sd.bl, (sd.status.party_id > 0) ? PARTY_SAMEMAP : SELF );
|
if( dst->type != BL_MOB )
|
||||||
|
return;
|
||||||
|
|
||||||
|
status_data* status = status_get_status_data(*dst);
|
||||||
|
|
||||||
|
WBUFW(buf, 0)=0x18c;
|
||||||
|
WBUFW(buf, 2)=status_get_class(dst);
|
||||||
|
WBUFW(buf, 4)=status_get_lv(dst);
|
||||||
|
WBUFW(buf, 6)=status->size;
|
||||||
|
WBUFL(buf, 8)=status->hp;
|
||||||
|
WBUFW(buf,12)= (battle_config.estimation_type&1?status->def:0)
|
||||||
|
+(battle_config.estimation_type&2?status->def2:0);
|
||||||
|
WBUFW(buf,14)=status->race;
|
||||||
|
WBUFW(buf,16)= (battle_config.estimation_type&1?status->mdef:0)
|
||||||
|
+(battle_config.estimation_type&2?status->mdef2:0);
|
||||||
|
WBUFW(buf,18)= status->def_ele;
|
||||||
|
for(i=0;i<9;i++)
|
||||||
|
// The following caps negative attributes to 0 since the client displays them as 255-fix. [Skotlex]
|
||||||
|
WBUFB(buf,20+i)= (unsigned char)((fix=elemental_attribute_db.getAttribute(status->ele_lv, i+1, status->def_ele))<0?0:fix);
|
||||||
|
|
||||||
|
clif_send(buf,packet_len(0x18c),&sd->bl,sd->status.party_id>0?PARTY_SAMEMAP:SELF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -6946,20 +6985,25 @@ void clif_wis_end( map_session_data& sd, e_ack_whisper result ){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Returns character name requested by char_id.
|
/// Returns character name requested by char_id (ZC_ACK_REQNAME_BYGID).
|
||||||
/// 0194 <char id>.L <name>.24B (ZC_ACK_REQNAME_BYGID)
|
/// 0194 <char id>.L <name>.24B
|
||||||
/// 0af7 <flag>.W <char id>.L <name>.24B (ZC_ACK_REQNAME_BYGID)
|
/// 0af7 <flag>.W <char id>.L <name>.24B
|
||||||
void clif_solved_charname( map_session_data& sd, uint32 charid, const char* name ){
|
void clif_solved_charname(int fd, int charid, const char* name)
|
||||||
PACKET_ZC_ACK_REQNAME_BYGID packet{};
|
{
|
||||||
|
|
||||||
packet.packetType = HEADER_ZC_ACK_REQNAME_BYGID;
|
|
||||||
#if PACKETVER >= 20180221
|
#if PACKETVER >= 20180221
|
||||||
packet.flag = name[0] ? 3 : 2;
|
WFIFOHEAD(fd,packet_len(0xaf7));
|
||||||
|
WFIFOW(fd,0) = 0xaf7;
|
||||||
|
WFIFOW(fd,2) = name[0] ? 3 : 2;
|
||||||
|
WFIFOL(fd,4) = charid;
|
||||||
|
safestrncpy(WFIFOCP(fd, 8), name, NAME_LENGTH);
|
||||||
|
WFIFOSET(fd,packet_len(0x0af7));
|
||||||
|
#else
|
||||||
|
WFIFOHEAD(fd,packet_len(0x194));
|
||||||
|
WFIFOW(fd,0)=0x194;
|
||||||
|
WFIFOL(fd,2)=charid;
|
||||||
|
safestrncpy(WFIFOCP(fd,6), name, NAME_LENGTH);
|
||||||
|
WFIFOSET(fd,packet_len(0x194));
|
||||||
#endif
|
#endif
|
||||||
packet.CID = charid;
|
|
||||||
safestrncpy( packet.name, name, NAME_LENGTH );
|
|
||||||
|
|
||||||
clif_send( &packet, sizeof( packet ), &sd.bl, SELF );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -8093,7 +8137,7 @@ void clif_movetoattack( map_session_data& sd, block_list& bl ){
|
|||||||
void clif_produceeffect(map_session_data* sd,int flag, t_itemid nameid){
|
void clif_produceeffect(map_session_data* sd,int flag, t_itemid nameid){
|
||||||
nullpo_retv( sd );
|
nullpo_retv( sd );
|
||||||
|
|
||||||
clif_solved_charname( *sd, sd->status.char_id, sd->status.name );
|
clif_solved_charname( sd->fd, sd->status.char_id, sd->status.name );
|
||||||
|
|
||||||
PACKET_ZC_ACK_REQMAKINGITEM p = {};
|
PACKET_ZC_ACK_REQMAKINGITEM p = {};
|
||||||
|
|
||||||
@ -8161,8 +8205,8 @@ void clif_sendegg(map_session_data *sd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Sends a specific pet data update.
|
/// Sends a specific pet data update (ZC_CHANGESTATE_PET).
|
||||||
/// 01a4 <type>.B <id>.L <data>.L (ZC_CHANGESTATE_PET)
|
/// 01a4 <type>.B <id>.L <data>.L
|
||||||
/// type:
|
/// type:
|
||||||
/// 0 = pre-init (data = 0)
|
/// 0 = pre-init (data = 0)
|
||||||
/// 1 = intimacy (data = 0~4)
|
/// 1 = intimacy (data = 0~4)
|
||||||
@ -8173,53 +8217,66 @@ void clif_sendegg(map_session_data *sd)
|
|||||||
/// 6 = close egg selection ui and update egg in inventory (PACKETVER >= 20180704)
|
/// 6 = close egg selection ui and update egg in inventory (PACKETVER >= 20180704)
|
||||||
///
|
///
|
||||||
/// If sd is null, the update is sent to nearby objects, otherwise it is sent only to that player.
|
/// If sd is null, the update is sent to nearby objects, otherwise it is sent only to that player.
|
||||||
void clif_send_petdata( map_session_data* sd, pet_data& pd, e_changestate_pet data_type, int32 value ){
|
void clif_send_petdata(map_session_data* sd, struct pet_data* pd, int type, int param)
|
||||||
PACKET_ZC_CHANGESTATE_PET packet{};
|
{
|
||||||
|
uint8 buf[16];
|
||||||
|
nullpo_retv(pd);
|
||||||
|
|
||||||
packet.PacketType = HEADER_ZC_CHANGESTATE_PET;
|
WBUFW(buf,0) = 0x1a4;
|
||||||
packet.type = static_cast<decltype(packet.type)>( data_type );
|
WBUFB(buf,2) = type;
|
||||||
packet.GID = pd.bl.id;
|
WBUFL(buf,3) = pd->bl.id;
|
||||||
packet.data = value;
|
WBUFL(buf,7) = param;
|
||||||
|
if (sd)
|
||||||
if (sd != nullptr)
|
clif_send(buf, packet_len(0x1a4), &sd->bl, SELF);
|
||||||
clif_send( &packet, sizeof( packet ), &sd->bl, SELF );
|
|
||||||
else
|
else
|
||||||
clif_send( &packet, sizeof( packet ), &pd.bl, AREA );
|
clif_send(buf, packet_len(0x1a4), &pd->bl, AREA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Pet's base data.
|
/// Pet's base data (ZC_PROPERTY_PET).
|
||||||
/// 01a2 <name>.24B <renamed>.B <level>.W <hunger>.W <intimacy>.W <accessory id>.W <class>.W (ZC_PROPERTY_PET)
|
/// 01a2 <name>.24B <renamed>.B <level>.W <hunger>.W <intimacy>.W <accessory id>.W <class>.W
|
||||||
void clif_send_petstatus( map_session_data& sd, pet_data& pd ){
|
void clif_send_petstatus(map_session_data *sd)
|
||||||
PACKET_ZC_PROPERTY_PET packet{};
|
{
|
||||||
|
int fd;
|
||||||
|
struct s_pet *pet;
|
||||||
|
|
||||||
packet.PacketType = HEADER_ZC_PROPERTY_PET;
|
nullpo_retv(sd);
|
||||||
safestrncpy( packet.szName, pd.pet.name, NAME_LENGTH );
|
nullpo_retv(sd->pd);
|
||||||
packet.bModified = battle_config.pet_rename ? 0 : pd.pet.rename_flag;
|
|
||||||
packet.nLevel = pd.pet.level;
|
fd=sd->fd;
|
||||||
packet.nFullness = pd.pet.hungry;
|
pet = &sd->pd->pet;
|
||||||
packet.nRelationship = pd.pet.intimate;
|
WFIFOHEAD(fd,packet_len(0x1a2));
|
||||||
packet.ITID = static_cast<decltype(packet.ITID)>( pd.pet.equip );
|
WFIFOW(fd,0)=0x1a2;
|
||||||
|
safestrncpy(WFIFOCP(fd,2),pet->name,NAME_LENGTH);
|
||||||
|
WFIFOB(fd,26)=battle_config.pet_rename?0:pet->rename_flag;
|
||||||
|
WFIFOW(fd,27)=pet->level;
|
||||||
|
WFIFOW(fd,29)=pet->hungry;
|
||||||
|
WFIFOW(fd,31)=pet->intimate;
|
||||||
|
WFIFOW(fd,33)=pet->equip;
|
||||||
#if PACKETVER >= 20081126
|
#if PACKETVER >= 20081126
|
||||||
packet.job = pd.pet.class_;
|
WFIFOW(fd,35)=pet->class_;
|
||||||
#endif
|
#endif
|
||||||
|
WFIFOSET(fd,packet_len(0x1a2));
|
||||||
clif_send( &packet, sizeof( packet ), &sd.bl, SELF );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Notification about a pet's emotion/talk.
|
/// Notification about a pet's emotion/talk (ZC_PET_ACT).
|
||||||
/// 01aa <id>.L <data>.L (ZC_PET_ACT)
|
/// 01aa <id>.L <data>.L
|
||||||
/// data:
|
/// data:
|
||||||
/// @see CZ_PET_ACT.
|
/// @see CZ_PET_ACT.
|
||||||
void clif_pet_emotion( pet_data& pd, int32 param ){
|
void clif_pet_emotion(struct pet_data *pd,int param)
|
||||||
PACKET_ZC_PET_ACT packet{};
|
{
|
||||||
|
unsigned char buf[16];
|
||||||
|
|
||||||
packet.packetType = HEADER_ZC_PET_ACT;
|
nullpo_retv(pd);
|
||||||
packet.GID = pd.bl.id;
|
|
||||||
packet.data = param;
|
|
||||||
|
|
||||||
clif_send( &packet, sizeof( packet ), &pd.bl, AREA );
|
memset(buf,0,packet_len(0x1aa));
|
||||||
|
|
||||||
|
WBUFW(buf,0)=0x1aa;
|
||||||
|
WBUFL(buf,2)=pd->bl.id;
|
||||||
|
WBUFL(buf,6)=param;
|
||||||
|
|
||||||
|
clif_send(buf,packet_len(0x1aa),&pd->bl,AREA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -8394,46 +8451,52 @@ void clif_spiritball( struct block_list *bl, struct block_list* target, enum sen
|
|||||||
clif_send( &p, sizeof( p ), target == nullptr ? bl : target, send_target );
|
clif_send( &p, sizeof( p ), target == nullptr ? bl : target, send_target );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Notifies clients in area of a character's combo delay (ZC_COMBODELAY).
|
||||||
|
/// 01d2 <account id>.L <delay>.L
|
||||||
|
void clif_combo_delay(struct block_list *bl,t_tick wait)
|
||||||
|
{
|
||||||
|
unsigned char buf[32];
|
||||||
|
|
||||||
/// Notifies clients in area of a character's combo delay.
|
nullpo_retv(bl);
|
||||||
/// 01d2 <account id>.L <delay>.L (ZC_COMBODELAY)
|
|
||||||
void clif_combo_delay( block_list& bl, t_tick wait ){
|
|
||||||
PACKET_ZC_COMBODELAY packet{};
|
|
||||||
|
|
||||||
packet.packetType = HEADER_ZC_COMBODELAY;
|
WBUFW(buf,0)=0x1d2;
|
||||||
packet.AID = bl.id;
|
WBUFL(buf,2)=bl->id;
|
||||||
packet.delay = client_tick( wait );
|
WBUFL(buf,6)=client_tick(wait);
|
||||||
|
clif_send(buf,packet_len(0x1d2),bl,AREA);
|
||||||
clif_send( &packet, sizeof( packet ), &bl, AREA );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Notifies clients in area that a character has blade-stopped another.
|
/// Notifies clients in area that a character has blade-stopped another (ZC_BLADESTOP).
|
||||||
/// 01d1 <src id>.L <dst id>.L <flag>.L (ZC_BLADESTOP)
|
/// 01d1 <src id>.L <dst id>.L <flag>.L
|
||||||
/// flag:
|
/// flag:
|
||||||
/// 0 = inactive
|
/// 0 = inactive
|
||||||
/// 1 = active
|
/// 1 = active
|
||||||
void clif_bladestop( block_list& src, uint32 target_id, bool active ){
|
void clif_bladestop(struct block_list *src, int dst_id, int active)
|
||||||
PACKET_ZC_BLADESTOP packet{};
|
{
|
||||||
|
unsigned char buf[32];
|
||||||
|
|
||||||
packet.packetType = HEADER_ZC_BLADESTOP;
|
nullpo_retv(src);
|
||||||
packet.srcId = src.id;
|
|
||||||
packet.targetId = target_id;
|
|
||||||
packet.flag = active;
|
|
||||||
|
|
||||||
clif_send( &packet, sizeof( packet ), &src, AREA );
|
WBUFW(buf,0)=0x1d1;
|
||||||
|
WBUFL(buf,2)=src->id;
|
||||||
|
WBUFL(buf,6)=dst_id;
|
||||||
|
WBUFL(buf,10)=active;
|
||||||
|
|
||||||
|
clif_send(buf,packet_len(0x1d1),src,AREA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// MVP effect.
|
/// MVP effect (ZC_MVP).
|
||||||
/// 010c <account id>.L (ZC_MVP)
|
/// 010c <account id>.L
|
||||||
void clif_mvp_effect( map_session_data& sd ){
|
void clif_mvp_effect(map_session_data *sd)
|
||||||
PACKET_ZC_MVP packet{};
|
{
|
||||||
|
unsigned char buf[16];
|
||||||
|
|
||||||
packet.packetType = HEADER_ZC_MVP;
|
nullpo_retv(sd);
|
||||||
packet.AID = sd.bl.id;
|
|
||||||
|
|
||||||
clif_send( &packet, sizeof( packet ), &sd.bl, AREA );
|
WBUFW(buf,0)=0x10c;
|
||||||
|
WBUFL(buf,2)=sd->bl.id;
|
||||||
|
clif_send(buf,packet_len(0x10c),&sd->bl,AREA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -8449,36 +8512,41 @@ void clif_mvp_item( map_session_data *sd, t_itemid nameid ){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// MVP EXP reward message.
|
/// MVP EXP reward message (ZC_MVP_GETTING_SPECIAL_EXP).
|
||||||
/// 010b <exp>.L (ZC_MVP_GETTING_SPECIAL_EXP)
|
/// 010b <exp>.L
|
||||||
void clif_mvp_exp( map_session_data& sd, t_exp exp ){
|
void clif_mvp_exp(map_session_data *sd, t_exp exp) {
|
||||||
#if PACKETVER >= 20131223 // Kro remove this packet [Napster]
|
#if PACKETVER >= 20131223 // Kro remove this packet [Napster]
|
||||||
if (battle_config.mvp_exp_reward_message) {
|
if (battle_config.mvp_exp_reward_message) {
|
||||||
char e_msg[CHAT_SIZE_MAX];
|
char e_msg[CHAT_SIZE_MAX];
|
||||||
sprintf(e_msg, msg_txt(&sd, 717), exp);
|
sprintf(e_msg, msg_txt(sd, 717), exp);
|
||||||
clif_messagecolor( &sd.bl, color_table[COLOR_CYAN], e_msg, false, SELF ); // Congratulations! You are the MVP! Your reward EXP Points are %u !!
|
clif_messagecolor(&sd->bl, color_table[COLOR_CYAN], e_msg, false, SELF); // Congratulations! You are the MVP! Your reward EXP Points are %u !!
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
PACKET_ZC_MVP_GETTING_SPECIAL_EXP packet{};
|
int fd;
|
||||||
|
|
||||||
packet.packetType = HEADER_ZC_MVP_GETTING_SPECIAL_EXP;
|
nullpo_retv(sd);
|
||||||
packet.exp = std::min( static_cast<decltype(packet.exp)>( exp ), MAX_EXP );
|
|
||||||
|
|
||||||
clif_send( &packet, sizeof( packet ), &sd.bl, SELF );
|
fd = sd->fd;
|
||||||
|
WFIFOHEAD(fd, packet_len(0x10b));
|
||||||
|
WFIFOW(fd,0) = 0x10b;
|
||||||
|
WFIFOL(fd,2) = (uint32)u64min( exp, MAX_EXP );
|
||||||
|
WFIFOSET(fd, packet_len(0x10b));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Dropped MVP item reward message.
|
/// Dropped MVP item reward message (ZC_THROW_MVPITEM).
|
||||||
/// 010d (ZC_THROW_MVPITEM)
|
/// 010d
|
||||||
///
|
///
|
||||||
/// "You are the MVP, but cannot obtain the reward because you are overweight."
|
/// "You are the MVP, but cannot obtain the reward because
|
||||||
void clif_mvp_noitem( map_session_data& sd ){
|
/// you are overweight."
|
||||||
PACKET_ZC_THROW_MVPITEM packet{};
|
void clif_mvp_noitem(map_session_data* sd)
|
||||||
|
{
|
||||||
|
int fd = sd->fd;
|
||||||
|
|
||||||
packet.packetType = HEADER_ZC_THROW_MVPITEM;
|
WFIFOHEAD(fd,packet_len(0x10d));
|
||||||
|
WFIFOW(fd,0) = 0x10d;
|
||||||
clif_send( &packet, sizeof( packet ), &sd.bl, SELF );
|
WFIFOSET(fd,packet_len(0x10d));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -8803,13 +8871,14 @@ static void clif_guild_positioninfolist(map_session_data& sd){
|
|||||||
|
|
||||||
for(size_t i=0;i<MAX_GUILDPOSITION;i++){
|
for(size_t i=0;i<MAX_GUILDPOSITION;i++){
|
||||||
guild_position& gp = g->guild.position[i];
|
guild_position& gp = g->guild.position[i];
|
||||||
|
PACKET_ZC_POSITION_INFO_sub& position = p->posInfo[i];
|
||||||
|
|
||||||
p->posInfo[i].positionID = i;
|
position.positionID = static_cast<decltype(position.positionID)>( i );
|
||||||
p->posInfo[i].right = gp.mode;
|
position.right = gp.mode;
|
||||||
p->posInfo[i].ranking = i;
|
position.ranking = static_cast<decltype(position.ranking)>( i );
|
||||||
p->posInfo[i].payRate = gp.exp_mode;
|
position.payRate = gp.exp_mode;
|
||||||
|
|
||||||
p->PacketLength += static_cast<decltype(p->PacketLength)>( sizeof( p->posInfo[0] ) );
|
p->PacketLength += static_cast<decltype(p->PacketLength)>( sizeof( position ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
clif_send(p,p->PacketLength,&sd.bl,SELF);
|
clif_send(p,p->PacketLength,&sd.bl,SELF);
|
||||||
@ -10701,8 +10770,8 @@ void clif_parse_LoadEndAck(int fd,map_session_data *sd)
|
|||||||
if(map_addblock(&sd->pd->bl))
|
if(map_addblock(&sd->pd->bl))
|
||||||
return;
|
return;
|
||||||
clif_spawn(&sd->pd->bl);
|
clif_spawn(&sd->pd->bl);
|
||||||
clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_INIT, 0 );
|
clif_send_petdata(sd,sd->pd,0,0);
|
||||||
clif_send_petstatus( *sd, *sd->pd );
|
clif_send_petstatus(sd);
|
||||||
// skill_unit_move(&sd->pd->bl,gettick(),1);
|
// skill_unit_move(&sd->pd->bl,gettick(),1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -10777,7 +10846,7 @@ void clif_parse_LoadEndAck(int fd,map_session_data *sd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(sd->pd && sd->pd->pet.intimate > 900)
|
if(sd->pd && sd->pd->pet.intimate > 900)
|
||||||
clif_pet_emotion( *sd->pd, (sd->pd->pet.class_ - 100)*100 + 50 + pet_hungry_val(sd->pd) );
|
clif_pet_emotion(sd->pd,(sd->pd->pet.class_ - 100)*100 + 50 + pet_hungry_val(sd->pd));
|
||||||
|
|
||||||
if(hom_is_active(sd->hd))
|
if(hom_is_active(sd->hd))
|
||||||
hom_init_timers(sd->hd);
|
hom_init_timers(sd->hd);
|
||||||
@ -14470,7 +14539,7 @@ void clif_parse_SelectEgg(int fd, map_session_data *sd){
|
|||||||
void clif_parse_SendEmotion(int fd, map_session_data *sd)
|
void clif_parse_SendEmotion(int fd, map_session_data *sd)
|
||||||
{
|
{
|
||||||
if(sd->pd)
|
if(sd->pd)
|
||||||
clif_pet_emotion( *sd->pd, RFIFOL(fd,packet_db[RFIFOW(fd,0)].pos[0]) );
|
clif_pet_emotion(sd->pd,RFIFOL(fd,packet_db[RFIFOW(fd,0)].pos[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -815,16 +815,6 @@ enum e_ack_additem_to_cart : uint8 {
|
|||||||
ADDITEM_TO_CART_FAIL_COUNT = 1
|
ADDITEM_TO_CART_FAIL_COUNT = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
enum e_changestate_pet : uint8 {
|
|
||||||
CHANGESTATEPET_INIT = 0,
|
|
||||||
CHANGESTATEPET_INTIMACY = 1,
|
|
||||||
CHANGESTATEPET_HUNGER = 2,
|
|
||||||
CHANGESTATEPET_ACCESSORY = 3,
|
|
||||||
CHANGESTATEPET_PERFORMANCE = 4,
|
|
||||||
CHANGESTATEPET_HAIRSTYLE = 5,
|
|
||||||
CHANGESTATEPET_UPDATE_EGG = 6,
|
|
||||||
};
|
|
||||||
|
|
||||||
int clif_setip(const char* ip);
|
int clif_setip(const char* ip);
|
||||||
void clif_setbindip(const char* ip);
|
void clif_setbindip(const char* ip);
|
||||||
void clif_setport(uint16 port);
|
void clif_setport(uint16 port);
|
||||||
@ -943,17 +933,17 @@ void clif_skillinfoblock(map_session_data *sd);
|
|||||||
void clif_skillup(map_session_data *sd, uint16 skill_id, int lv, int range, int upgradable);
|
void clif_skillup(map_session_data *sd, uint16 skill_id, int lv, int range, int upgradable);
|
||||||
void clif_skillinfo(map_session_data *sd,int skill_id, int inf);
|
void clif_skillinfo(map_session_data *sd,int skill_id, int inf);
|
||||||
void clif_addskill(map_session_data *sd, int skill_id);
|
void clif_addskill(map_session_data *sd, int skill_id);
|
||||||
void clif_deleteskill(map_session_data *sd, int skill_id, bool skip_infoblock = false);
|
void clif_deleteskill(map_session_data& sd, uint16 skill_id, bool skip_infoblock = false);
|
||||||
|
|
||||||
void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, int dst_y, uint16 skill_id, uint16 skill_lv, int property, int casttime);
|
void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, int dst_y, uint16 skill_id, uint16 skill_lv, int property, int casttime);
|
||||||
void clif_skillcastcancel( block_list& bl );
|
void clif_skillcastcancel( block_list& bl );
|
||||||
void clif_skill_fail( map_session_data& sd, uint16 skill_id, enum useskill_fail_cause cause = USESKILL_FAIL_LEVEL, int btype = 0, t_itemid itemId = 0 );
|
void clif_skill_fail( map_session_data& sd, uint16 skill_id, enum useskill_fail_cause cause = USESKILL_FAIL_LEVEL, int btype = 0, t_itemid itemId = 0 );
|
||||||
void clif_skill_cooldown( map_session_data &sd, uint16 skill_id, t_tick tick );
|
void clif_skill_cooldown( map_session_data &sd, uint16 skill_id, t_tick tick );
|
||||||
int clif_skill_damage( block_list& src, block_list& dst, t_tick tick, int32 sdelay, int32 ddelay, int64 sdamage, int32 div, uint16 skill_id, uint16 skill_lv, e_damage_type type );
|
int clif_skill_damage(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int64 sdamage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type);
|
||||||
//int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int damage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type);
|
//int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int damage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type);
|
||||||
bool clif_skill_nodamage( block_list* src, block_list& dst, uint16 skill_id, int32 heal, bool success = true );
|
bool clif_skill_nodamage( block_list* src, block_list& dst, uint16 skill_id, int32 heal, bool success = true );
|
||||||
void clif_skill_poseffect( block_list& bl, uint16 skill_id, uint16 skill_lv, int32 x, int32 y, t_tick tick );
|
void clif_skill_poseffect(struct block_list *src,uint16 skill_id,int val,int x,int y,t_tick tick);
|
||||||
void clif_skill_estimation( map_session_data& sd, mob_data& md );
|
void clif_skill_estimation(map_session_data *sd,struct block_list *dst);
|
||||||
void clif_skill_warppoint( map_session_data& sd, uint16 skill_id, uint16 skill_lv, std::vector<std::string>& maps );
|
void clif_skill_warppoint( map_session_data& sd, uint16 skill_id, uint16 skill_lv, std::vector<std::string>& maps );
|
||||||
void clif_skill_memomessage( map_session_data& sd, e_ack_remember_warppoint_result result );
|
void clif_skill_memomessage( map_session_data& sd, e_ack_remember_warppoint_result result );
|
||||||
void clif_skill_teleportmessage( map_session_data& sd, e_notify_mapinfo_result result );
|
void clif_skill_teleportmessage( map_session_data& sd, e_notify_mapinfo_result result );
|
||||||
@ -974,8 +964,8 @@ void clif_spiritball( struct block_list *bl, struct block_list* target = nullptr
|
|||||||
void clif_soulball( map_session_data *sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
|
void clif_soulball( map_session_data *sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
|
||||||
void clif_servantball( map_session_data& sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
|
void clif_servantball( map_session_data& sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
|
||||||
void clif_abyssball( map_session_data& sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
|
void clif_abyssball( map_session_data& sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
|
||||||
void clif_combo_delay( block_list& bl, t_tick wait );
|
void clif_combo_delay(struct block_list *bl,t_tick wait);
|
||||||
void clif_bladestop( block_list& src, uint32 target_id, bool active );
|
void clif_bladestop(struct block_list *src, int dst_id, int active);
|
||||||
void clif_changemapcell(int fd, int16 m, int x, int y, int type, enum send_target target);
|
void clif_changemapcell(int fd, int16 m, int x, int y, int type, enum send_target target);
|
||||||
|
|
||||||
#define clif_status_load(bl, type, flag) clif_status_change((bl), (type), (flag), 0, 0, 0, 0)
|
#define clif_status_load(bl, type, flag) clif_status_change((bl), (type), (flag), 0, 0, 0, 0)
|
||||||
@ -986,7 +976,7 @@ void clif_efst_status_change_sub(struct block_list *tbl, struct block_list *bl,
|
|||||||
void clif_wis_message(map_session_data* sd, const char* nick, const char* mes, size_t mes_len, int gmlvl);
|
void clif_wis_message(map_session_data* sd, const char* nick, const char* mes, size_t mes_len, int gmlvl);
|
||||||
void clif_wis_end( map_session_data& sd, e_ack_whisper result );
|
void clif_wis_end( map_session_data& sd, e_ack_whisper result );
|
||||||
|
|
||||||
void clif_solved_charname( map_session_data& sd, uint32 charid, const char* name );
|
void clif_solved_charname(int fd, int charid, const char* name);
|
||||||
void clif_name( struct block_list* src, struct block_list *bl, send_target target );
|
void clif_name( struct block_list* src, struct block_list *bl, send_target target );
|
||||||
#define clif_name_self(bl) clif_name( (bl), (bl), SELF )
|
#define clif_name_self(bl) clif_name( (bl), (bl), SELF )
|
||||||
#define clif_name_area(bl) clif_name( (bl), (bl), AREA )
|
#define clif_name_area(bl) clif_name( (bl), (bl), AREA )
|
||||||
@ -1014,10 +1004,10 @@ void clif_hat_effect_single( map_session_data& sd, uint16 effectId, bool enable
|
|||||||
|
|
||||||
void clif_item_skill(map_session_data *sd,uint16 skill_id,uint16 skill_lv);
|
void clif_item_skill(map_session_data *sd,uint16 skill_id,uint16 skill_lv);
|
||||||
|
|
||||||
void clif_mvp_effect( map_session_data& sd );
|
void clif_mvp_effect(map_session_data *sd);
|
||||||
void clif_mvp_item(map_session_data *sd, t_itemid nameid);
|
void clif_mvp_item(map_session_data *sd, t_itemid nameid);
|
||||||
void clif_mvp_exp( map_session_data& sd, t_exp exp );
|
void clif_mvp_exp(map_session_data *sd, t_exp exp);
|
||||||
void clif_mvp_noitem( map_session_data& sd );
|
void clif_mvp_noitem(map_session_data* sd);
|
||||||
void clif_changed_dir(block_list& bl, enum send_target target);
|
void clif_changed_dir(block_list& bl, enum send_target target);
|
||||||
|
|
||||||
// vending
|
// vending
|
||||||
@ -1124,11 +1114,12 @@ void clif_upgrademessage( map_session_data* sd, int result, t_itemid item_id );
|
|||||||
void clif_catch_process( map_session_data& sd );
|
void clif_catch_process( map_session_data& sd );
|
||||||
void clif_pet_roulette( map_session_data& sd, bool success );
|
void clif_pet_roulette( map_session_data& sd, bool success );
|
||||||
void clif_sendegg(map_session_data *sd);
|
void clif_sendegg(map_session_data *sd);
|
||||||
void clif_send_petstatus( map_session_data& sd, pet_data& pd );
|
void clif_send_petstatus(map_session_data *sd);
|
||||||
void clif_send_petdata( map_session_data* sd, pet_data& pd, e_changestate_pet data_type, int32 value );
|
void clif_send_petdata(map_session_data* sd, struct pet_data* pd, int type, int param);
|
||||||
#define clif_pet_equip(sd, pd) clif_send_petdata(sd, pd, CHANGESTATEPET_ACCESSORY, (pd).vd.head_bottom)
|
#define clif_pet_equip(sd, pd) clif_send_petdata(sd, pd, 3, (pd)->vd.head_bottom)
|
||||||
#define clif_pet_equip_area(pd) clif_send_petdata(nullptr, pd, CHANGESTATEPET_ACCESSORY, (pd).vd.head_bottom)
|
#define clif_pet_equip_area(pd) clif_send_petdata(nullptr, pd, 3, (pd)->vd.head_bottom)
|
||||||
void clif_pet_emotion( pet_data& pd, int32 param );
|
#define clif_pet_performance(pd, param) clif_send_petdata(nullptr, pd, 4, param)
|
||||||
|
void clif_pet_emotion(struct pet_data *pd,int param);
|
||||||
void clif_pet_food( map_session_data& sd, int32 foodid, bool success );
|
void clif_pet_food( map_session_data& sd, int32 foodid, bool success );
|
||||||
void clif_pet_autofeed_status(map_session_data* sd, bool force);
|
void clif_pet_autofeed_status(map_session_data* sd, bool force);
|
||||||
|
|
||||||
|
@ -118,6 +118,9 @@
|
|||||||
parseable_packet(0x0108,-1,clif_parse_PartyMessage,2,4);
|
parseable_packet(0x0108,-1,clif_parse_PartyMessage,2,4);
|
||||||
packet(0x0109,-1);
|
packet(0x0109,-1);
|
||||||
packet( HEADER_ZC_MVP_GETTING_ITEM, sizeof( struct PACKET_ZC_MVP_GETTING_ITEM ) );
|
packet( HEADER_ZC_MVP_GETTING_ITEM, sizeof( struct PACKET_ZC_MVP_GETTING_ITEM ) );
|
||||||
|
packet(0x010b,6);
|
||||||
|
packet(0x010c,6);
|
||||||
|
packet(0x010d,2);
|
||||||
packet(0x010e,11);
|
packet(0x010e,11);
|
||||||
packet(0x010f,-1);
|
packet(0x010f,-1);
|
||||||
packet( HEADER_ZC_ACK_TOUSESKILL, sizeof( PACKET_ZC_ACK_TOUSESKILL ) );
|
packet( HEADER_ZC_ACK_TOUSESKILL, sizeof( PACKET_ZC_ACK_TOUSESKILL ) );
|
||||||
@ -127,6 +130,7 @@
|
|||||||
packet(0x0114,31);
|
packet(0x0114,31);
|
||||||
packet(0x0115,35);
|
packet(0x0115,35);
|
||||||
parseable_packet(0x0116,10,clif_parse_UseSkillToPos,2,4,6,8);
|
parseable_packet(0x0116,10,clif_parse_UseSkillToPos,2,4,6,8);
|
||||||
|
packet(0x0117,18);
|
||||||
parseable_packet(0x0118,2,clif_parse_StopAttack,0);
|
parseable_packet(0x0118,2,clif_parse_StopAttack,0);
|
||||||
packet(0x0119,13);
|
packet(0x0119,13);
|
||||||
parseable_packet(0x011b,20,clif_parse_UseSkillMap,2,4);
|
parseable_packet(0x011b,20,clif_parse_UseSkillMap,2,4);
|
||||||
@ -197,12 +201,14 @@
|
|||||||
packet(0x0187,6);
|
packet(0x0187,6);
|
||||||
parseable_packet(0x018a,4,clif_parse_QuitGame,2);
|
parseable_packet(0x018a,4,clif_parse_QuitGame,2);
|
||||||
packet(0x018b,4);
|
packet(0x018b,4);
|
||||||
|
packet(0x018c,29);
|
||||||
parseable_packet( HEADER_CZ_REQMAKINGITEM, sizeof( struct PACKET_CZ_REQMAKINGITEM ), clif_parse_ProduceMix, 0 );
|
parseable_packet( HEADER_CZ_REQMAKINGITEM, sizeof( struct PACKET_CZ_REQMAKINGITEM ), clif_parse_ProduceMix, 0 );
|
||||||
packet( HEADER_ZC_ACK_REQMAKINGITEM, sizeof( PACKET_ZC_ACK_REQMAKINGITEM ) );
|
packet( HEADER_ZC_ACK_REQMAKINGITEM, sizeof( PACKET_ZC_ACK_REQMAKINGITEM ) );
|
||||||
parseable_packet(0x0190,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
|
parseable_packet(0x0190,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
|
||||||
packet( HEADER_ZC_TALKBOX_CHATCONTENTS, sizeof( struct PACKET_ZC_TALKBOX_CHATCONTENTS ) );
|
packet( HEADER_ZC_TALKBOX_CHATCONTENTS, sizeof( struct PACKET_ZC_TALKBOX_CHATCONTENTS ) );
|
||||||
packet(0x0192,24);
|
packet(0x0192,24);
|
||||||
parseable_packet(0x0193,6,clif_parse_SolveCharName,2);
|
parseable_packet(0x0193,6,clif_parse_SolveCharName,2);
|
||||||
|
packet(0x0194,30);
|
||||||
packet( HEADER_ZC_ACK_REQNAMEALL, sizeof( struct PACKET_ZC_ACK_REQNAMEALL ) );
|
packet( HEADER_ZC_ACK_REQNAMEALL, sizeof( struct PACKET_ZC_ACK_REQNAMEALL ) );
|
||||||
packet(0x0196,9);
|
packet(0x0196,9);
|
||||||
parseable_packet(0x0197,4,clif_parse_ResetChar,2);
|
parseable_packet(0x0197,4,clif_parse_ResetChar,2);
|
||||||
@ -213,12 +219,15 @@
|
|||||||
parseable_packet(0x019d,6,clif_parse_GMHide,2);
|
parseable_packet(0x019d,6,clif_parse_GMHide,2);
|
||||||
parseable_packet(0x019f,6,clif_parse_CatchPet,2);
|
parseable_packet(0x019f,6,clif_parse_CatchPet,2);
|
||||||
parseable_packet(0x01a1,3,clif_parse_PetMenu,2);
|
parseable_packet(0x01a1,3,clif_parse_PetMenu,2);
|
||||||
|
packet(0x01a2,35);
|
||||||
packet(0x01a3,5);
|
packet(0x01a3,5);
|
||||||
|
packet(0x01a4,11);
|
||||||
parseable_packet(0x01a5,26,clif_parse_ChangePetName,2);
|
parseable_packet(0x01a5,26,clif_parse_ChangePetName,2);
|
||||||
packet(0x01a6,-1);
|
packet(0x01a6,-1);
|
||||||
parseable_packet(0x01a7,4,clif_parse_SelectEgg,2);
|
parseable_packet(0x01a7,4,clif_parse_SelectEgg,2);
|
||||||
packet(0x01a8,4);
|
packet(0x01a8,4);
|
||||||
parseable_packet(0x01a9,6,clif_parse_SendEmotion,2);
|
parseable_packet(0x01a9,6,clif_parse_SendEmotion,2);
|
||||||
|
packet(0x01aa,10);
|
||||||
packet(0x01ac,6);
|
packet(0x01ac,6);
|
||||||
packet(0x01ad,-1);
|
packet(0x01ad,-1);
|
||||||
parseable_packet( HEADER_CZ_REQ_MAKINGARROW, sizeof( PACKET_CZ_REQ_MAKINGARROW ), clif_parse_SelectArrow, 0 );
|
parseable_packet( HEADER_CZ_REQ_MAKINGARROW, sizeof( PACKET_CZ_REQ_MAKINGARROW ), clif_parse_SelectArrow, 0 );
|
||||||
@ -248,6 +257,8 @@
|
|||||||
parseable_packet(0x01ce,6,clif_parse_AutoSpell,2);
|
parseable_packet(0x01ce,6,clif_parse_AutoSpell,2);
|
||||||
packet(0x01cf,28);
|
packet(0x01cf,28);
|
||||||
packet(0x01d0,8);
|
packet(0x01d0,8);
|
||||||
|
packet(0x01d1,14);
|
||||||
|
packet(0x01d2,10);
|
||||||
parseable_packet(0x01d5,-1,clif_parse_NpcStringInput,2,4,8);
|
parseable_packet(0x01d5,-1,clif_parse_NpcStringInput,2,4,8);
|
||||||
packet(0x01d7,11);
|
packet(0x01d7,11);
|
||||||
packet(0x01d8,54);
|
packet(0x01d8,54);
|
||||||
@ -1197,7 +1208,7 @@
|
|||||||
|
|
||||||
// 2008-11-26aSakexe
|
// 2008-11-26aSakexe
|
||||||
#if PACKETVER >= 20081126
|
#if PACKETVER >= 20081126
|
||||||
packet(0x0441,4);
|
packet(0x01a2,37);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2008-12-10aSakexe
|
// 2008-12-10aSakexe
|
||||||
@ -1274,6 +1285,7 @@
|
|||||||
|
|
||||||
// 2008-12-17aRagexeRE
|
// 2008-12-17aRagexeRE
|
||||||
#if PACKETVER >= 20081217
|
#if PACKETVER >= 20081217
|
||||||
|
packet(0x01a2,37);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2008-12-17bRagexeRE
|
// 2008-12-17bRagexeRE
|
||||||
@ -1986,6 +1998,7 @@
|
|||||||
// 2018-02-21aRagexeRE or 2018-02-21bRagexeRE
|
// 2018-02-21aRagexeRE or 2018-02-21bRagexeRE
|
||||||
#if PACKETVER >= 20180221
|
#if PACKETVER >= 20180221
|
||||||
packet(0x0206,35); // ZC_FRIENDS_STATE
|
packet(0x0206,35); // ZC_FRIENDS_STATE
|
||||||
|
packet(0x0af7,32);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2018-03-07bRagexeRE
|
// 2018-03-07bRagexeRE
|
||||||
|
@ -1979,8 +1979,8 @@ void map_addnickdb(int charid, const char* nick)
|
|||||||
req = p->requests;
|
req = p->requests;
|
||||||
p->requests = req->next;
|
p->requests = req->next;
|
||||||
sd = map_charid2sd(req->charid);
|
sd = map_charid2sd(req->charid);
|
||||||
if( sd != nullptr )
|
if( sd )
|
||||||
clif_solved_charname( *sd, charid, p->nick );
|
clif_solved_charname(sd->fd, charid, p->nick);
|
||||||
aFree(req);
|
aFree(req);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2001,8 +2001,8 @@ void map_delnickdb(int charid, const char* name)
|
|||||||
req = p->requests;
|
req = p->requests;
|
||||||
p->requests = req->next;
|
p->requests = req->next;
|
||||||
sd = map_charid2sd(req->charid);
|
sd = map_charid2sd(req->charid);
|
||||||
if( sd != nullptr )
|
if( sd )
|
||||||
clif_solved_charname( *sd, charid, name );
|
clif_solved_charname(sd->fd, charid, name);
|
||||||
aFree(req);
|
aFree(req);
|
||||||
}
|
}
|
||||||
aFree(p);
|
aFree(p);
|
||||||
@ -2020,16 +2020,16 @@ void map_reqnickdb(map_session_data * sd, int charid)
|
|||||||
nullpo_retv(sd);
|
nullpo_retv(sd);
|
||||||
|
|
||||||
tsd = map_charid2sd(charid);
|
tsd = map_charid2sd(charid);
|
||||||
if( tsd != nullptr )
|
if( tsd )
|
||||||
{
|
{
|
||||||
clif_solved_charname( *sd, charid, tsd->status.name );
|
clif_solved_charname(sd->fd, charid, tsd->status.name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = (struct charid2nick*)idb_ensure(nick_db, charid, create_charid2nick);
|
p = (struct charid2nick*)idb_ensure(nick_db, charid, create_charid2nick);
|
||||||
if( *p->nick )
|
if( *p->nick )
|
||||||
{
|
{
|
||||||
clif_solved_charname( *sd, charid, p->nick );
|
clif_solved_charname(sd->fd, charid, p->nick);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// not in cache, request it
|
// not in cache, request it
|
||||||
|
@ -3052,7 +3052,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
|
|||||||
t_itemid log_mvp_nameid = 0;
|
t_itemid log_mvp_nameid = 0;
|
||||||
t_exp log_mvp_exp = 0;
|
t_exp log_mvp_exp = 0;
|
||||||
|
|
||||||
clif_mvp_effect( *mvp_sd );
|
clif_mvp_effect( mvp_sd );
|
||||||
|
|
||||||
//mapflag: noexp check [Lorky]
|
//mapflag: noexp check [Lorky]
|
||||||
if( md->db->mexp > 0 && !( map_getmapflag( m, MF_NOBASEEXP ) || type&2 ) ){
|
if( md->db->mexp > 0 && !( map_getmapflag( m, MF_NOBASEEXP ) || type&2 ) ){
|
||||||
@ -3074,7 +3074,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
|
|||||||
|
|
||||||
log_mvp_exp = cap_value( log_mvp_exp, 1, MAX_EXP );
|
log_mvp_exp = cap_value( log_mvp_exp, 1, MAX_EXP );
|
||||||
|
|
||||||
clif_mvp_exp( *mvp_sd, log_mvp_exp );
|
clif_mvp_exp( mvp_sd, log_mvp_exp );
|
||||||
pc_gainexp( mvp_sd, &md->bl, log_mvp_exp, 0, 0 );
|
pc_gainexp( mvp_sd, &md->bl, log_mvp_exp, 0, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1528,6 +1528,11 @@ enum e_job_types
|
|||||||
JT_4_EP21_TAN_S,
|
JT_4_EP21_TAN_S,
|
||||||
|
|
||||||
JT_4_M_VACATION_MARAM = 10595,
|
JT_4_M_VACATION_MARAM = 10595,
|
||||||
|
JT_4_CLB_SS_FC,
|
||||||
|
JT_4_CLB_SS_TZ,
|
||||||
|
JT_4_CLB_SS_AJ,
|
||||||
|
JT_4_CLB_SS_LK,
|
||||||
|
JT_4_SMART_ANDRE,
|
||||||
|
|
||||||
JT_ROZ_MQ_XAVIER = 13000,
|
JT_ROZ_MQ_XAVIER = 13000,
|
||||||
JT_ROZ_MQ_MOCLORD,
|
JT_ROZ_MQ_MOCLORD,
|
||||||
@ -1547,7 +1552,7 @@ enum e_job_types
|
|||||||
#define MAX_NPC_CLASS2_START NPC_RANGE3_START
|
#define MAX_NPC_CLASS2_START NPC_RANGE3_START
|
||||||
#define MAX_NPC_CLASS2_END NPC_RANGE3_END
|
#define MAX_NPC_CLASS2_END NPC_RANGE3_END
|
||||||
|
|
||||||
//Checks if a given id is a valid npc id. [Skotlex]
|
//Checks if a given id is a valid npc id.
|
||||||
//Since new npcs are added all the time, the max valid value is the one before the first mob (Scorpion = 1001)
|
//Since new npcs are added all the time, the max valid value is the one before the first mob (Scorpion = 1001)
|
||||||
#define npcdb_checkid(id) ( ( (id) > NPC_RANGE1_START && (id) < NPC_RANGE1_END ) || (id) == JT_HIDDEN_WARP_NPC || ( (id) > NPC_RANGE2_START && (id) < NPC_RANGE2_END ) || (id) == JT_INVISIBLE || ( (id) > NPC_RANGE3_START && (id) < NPC_RANGE3_END ) )
|
#define npcdb_checkid(id) ( ( (id) > NPC_RANGE1_START && (id) < NPC_RANGE1_END ) || (id) == JT_HIDDEN_WARP_NPC || ( (id) > NPC_RANGE2_START && (id) < NPC_RANGE2_END ) || (id) == JT_INVISIBLE || ( (id) > NPC_RANGE3_START && (id) < NPC_RANGE3_END ) )
|
||||||
|
|
||||||
|
@ -1118,6 +1118,12 @@ struct PACKET_ZC_SKILL_DISAPPEAR {
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_SKILL_DISAPPEAR, 0x120);
|
DEFINE_PACKET_HEADER(ZC_SKILL_DISAPPEAR, 0x120);
|
||||||
|
|
||||||
|
struct PACKET_ZC_SKILLINFO_DELETE {
|
||||||
|
uint16 packetType;
|
||||||
|
uint16 skillID;
|
||||||
|
} __attribute__((packed));
|
||||||
|
DEFINE_PACKET_HEADER(ZC_SKILLINFO_DELETE, 0x441);
|
||||||
|
|
||||||
struct PACKET_ZC_SKILL_UPDATE {
|
struct PACKET_ZC_SKILL_UPDATE {
|
||||||
int16 packetType;
|
int16 packetType;
|
||||||
uint32 GID;
|
uint32 GID;
|
||||||
@ -1356,87 +1362,6 @@ struct PACKET_ZC_NOTIFY_ACT{
|
|||||||
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8a);
|
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8a);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct PACKET_ZC_MONSTER_INFO {
|
|
||||||
int16 packetType;
|
|
||||||
uint16 class_;
|
|
||||||
uint16 level;
|
|
||||||
uint16 size;
|
|
||||||
uint32 hp;
|
|
||||||
int16 def;
|
|
||||||
uint16 race;
|
|
||||||
int16 mdef;
|
|
||||||
uint16 element;
|
|
||||||
uint8 water;
|
|
||||||
uint8 earth;
|
|
||||||
uint8 fire;
|
|
||||||
uint8 wind;
|
|
||||||
uint8 poison;
|
|
||||||
uint8 holy;
|
|
||||||
uint8 shadow;
|
|
||||||
uint8 ghost;
|
|
||||||
uint8 undead;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_MONSTER_INFO, 0x18c);
|
|
||||||
|
|
||||||
#if PACKETVER >= 20180221
|
|
||||||
struct PACKET_ZC_ACK_REQNAME_BYGID {
|
|
||||||
int16 packetType;
|
|
||||||
uint16 flag;
|
|
||||||
uint32 CID;
|
|
||||||
char name[NAME_LENGTH];
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_ACK_REQNAME_BYGID, 0xaf7);
|
|
||||||
#else
|
|
||||||
struct PACKET_ZC_ACK_REQNAME_BYGID {
|
|
||||||
int16 packetType;
|
|
||||||
uint32 CID;
|
|
||||||
char name[NAME_LENGTH];
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_ACK_REQNAME_BYGID, 0x194);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct PACKET_ZC_PET_ACT {
|
|
||||||
int16 packetType;
|
|
||||||
uint32 GID;
|
|
||||||
int32 data;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_PET_ACT, 0x1aa);
|
|
||||||
|
|
||||||
struct PACKET_ZC_COMBODELAY {
|
|
||||||
int16 packetType;
|
|
||||||
uint32 AID;
|
|
||||||
uint32 delay;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_COMBODELAY, 0x1d2);
|
|
||||||
|
|
||||||
struct PACKET_ZC_BLADESTOP {
|
|
||||||
int16 packetType;
|
|
||||||
uint32 srcId;
|
|
||||||
uint32 targetId;
|
|
||||||
uint32 flag;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_BLADESTOP, 0x1d1);
|
|
||||||
|
|
||||||
struct PACKET_ZC_MVP {
|
|
||||||
int16 packetType;
|
|
||||||
uint32 AID;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_MVP, 0x10c);
|
|
||||||
|
|
||||||
// Kro remove this packet [Napster]
|
|
||||||
#if PACKETVER < 20131223
|
|
||||||
struct PACKET_ZC_MVP_GETTING_SPECIAL_EXP {
|
|
||||||
int16 packetType;
|
|
||||||
uint32 exp;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_MVP_GETTING_SPECIAL_EXP, 0x10b);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct PACKET_ZC_THROW_MVPITEM {
|
|
||||||
int16 packetType;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_THROW_MVPITEM, 0x10d);
|
|
||||||
|
|
||||||
// NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
|
// NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
|
||||||
#if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
|
#if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
|
||||||
#pragma pack( pop )
|
#pragma pack( pop )
|
||||||
|
@ -4998,15 +4998,17 @@ struct PACKET_ZC_POSITION_ID_NAME_INFO {
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_POSITION_ID_NAME_INFO, 0x0166);
|
DEFINE_PACKET_HEADER(ZC_POSITION_ID_NAME_INFO, 0x0166);
|
||||||
|
|
||||||
struct PACKET_ZC_POSITION_INFO {
|
struct PACKET_ZC_POSITION_INFO_sub {
|
||||||
int16 PacketType;
|
|
||||||
int16 PacketLength;
|
|
||||||
struct {
|
|
||||||
int positionID;
|
int positionID;
|
||||||
int right;
|
int right;
|
||||||
int ranking;
|
int ranking;
|
||||||
int payRate;
|
int payRate;
|
||||||
} posInfo[MAX_GUILDPOSITION];
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct PACKET_ZC_POSITION_INFO {
|
||||||
|
int16 PacketType;
|
||||||
|
int16 PacketLength;
|
||||||
|
struct PACKET_ZC_POSITION_INFO_sub posInfo[];
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_POSITION_INFO, 0x0160);
|
DEFINE_PACKET_HEADER(ZC_POSITION_INFO, 0x0160);
|
||||||
|
|
||||||
|
@ -5345,7 +5345,7 @@ bool pc_skill(map_session_data* sd, uint16 skill_id, int level, enum e_addskill_
|
|||||||
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
if (level == 0) { //Remove skill.
|
if (level == 0) { //Remove skill.
|
||||||
sd->status.skill[idx].id = 0;
|
sd->status.skill[idx].id = 0;
|
||||||
clif_deleteskill(sd,skill_id);
|
clif_deleteskill(*sd,skill_id);
|
||||||
} else
|
} else
|
||||||
clif_addskill(sd,skill_id);
|
clif_addskill(sd,skill_id);
|
||||||
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
|
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
|
||||||
@ -5380,7 +5380,7 @@ bool pc_skill(map_session_data* sd, uint16 skill_id, int level, enum e_addskill_
|
|||||||
sd->status.skill[idx].flag = SKILL_FLAG_PERM_GRANTED;
|
sd->status.skill[idx].flag = SKILL_FLAG_PERM_GRANTED;
|
||||||
if (level == 0) { //Remove skill.
|
if (level == 0) { //Remove skill.
|
||||||
sd->status.skill[idx].id = 0;
|
sd->status.skill[idx].id = 0;
|
||||||
clif_deleteskill(sd,skill_id);
|
clif_deleteskill(*sd,skill_id);
|
||||||
} else
|
} else
|
||||||
clif_addskill(sd,skill_id);
|
clif_addskill(sd,skill_id);
|
||||||
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
|
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
|
||||||
@ -5462,7 +5462,7 @@ bool pc_skill_plagiarism_reset(map_session_data &sd, uint8 type)
|
|||||||
sd.status.skill[idx].id = 0;
|
sd.status.skill[idx].id = 0;
|
||||||
sd.status.skill[idx].lv = 0;
|
sd.status.skill[idx].lv = 0;
|
||||||
sd.status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
sd.status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
clif_deleteskill(&sd, skill_id);
|
clif_deleteskill(sd, skill_id);
|
||||||
|
|
||||||
if (type == 1) {
|
if (type == 1) {
|
||||||
sd.cloneskill_idx = 0;
|
sd.cloneskill_idx = 0;
|
||||||
@ -9713,7 +9713,7 @@ int pc_dead(map_session_data *sd,struct block_list *src)
|
|||||||
struct pet_data *pd = sd->pd;
|
struct pet_data *pd = sd->pd;
|
||||||
if( !mapdata->getMapFlag(MF_NOEXPPENALTY) ) {
|
if( !mapdata->getMapFlag(MF_NOEXPPENALTY) ) {
|
||||||
pet_set_intimate(pd, pd->pet.intimate + pd->get_pet_db()->die);
|
pet_set_intimate(pd, pd->pet.intimate + pd->get_pet_db()->die);
|
||||||
clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_INTIMACY, pd->pet.intimate );
|
clif_send_petdata(sd,sd->pd,1,pd->pet.intimate);
|
||||||
}
|
}
|
||||||
if( sd->pd->target_id ) // Unlock all targets...
|
if( sd->pd->target_id ) // Unlock all targets...
|
||||||
pet_unlocktarget(sd->pd);
|
pet_unlocktarget(sd->pd);
|
||||||
|
@ -865,11 +865,11 @@ static TIMER_FUNC(pet_hungry){
|
|||||||
}
|
}
|
||||||
|
|
||||||
status_calc_pet(pd,SCO_NONE);
|
status_calc_pet(pd,SCO_NONE);
|
||||||
clif_send_petdata( sd, *pd, CHANGESTATEPET_INTIMACY, pd->pet.intimate );
|
clif_send_petdata(sd,pd,1,pd->pet.intimate);
|
||||||
interval = 20000; // While starving, it's every 20 seconds
|
interval = 20000; // While starving, it's every 20 seconds
|
||||||
}
|
}
|
||||||
|
|
||||||
clif_send_petdata( sd, *pd, CHANGESTATEPET_HUNGER, pd->pet.hungry );
|
clif_send_petdata(sd,pd,2,pd->pet.hungry);
|
||||||
|
|
||||||
if( battle_config.feature_pet_autofeed && pd->pet.autofeed && pd->pet.hungry <= battle_config.feature_pet_autofeed_rate ){
|
if( battle_config.feature_pet_autofeed && pd->pet.autofeed && pd->pet.hungry <= battle_config.feature_pet_autofeed_rate ){
|
||||||
pet_food( sd, pd );
|
pet_food( sd, pd );
|
||||||
@ -940,7 +940,7 @@ static int pet_performance(map_session_data *sd, struct pet_data *pd)
|
|||||||
val = 1;
|
val = 1;
|
||||||
|
|
||||||
pet_stop_walking(pd,2000<<8);
|
pet_stop_walking(pd,2000<<8);
|
||||||
clif_send_petdata( nullptr, *pd, CHANGESTATEPET_PERFORMANCE, rnd_value(1, val) );
|
clif_pet_performance(pd, rnd_value(1, val));
|
||||||
pet_lootitem_drop( *pd, nullptr );
|
pet_lootitem_drop( *pd, nullptr );
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -966,7 +966,7 @@ bool pet_return_egg( map_session_data *sd, struct pet_data *pd ){
|
|||||||
pd->pet.incubate = 1;
|
pd->pet.incubate = 1;
|
||||||
#if PACKETVER >= 20180704
|
#if PACKETVER >= 20180704
|
||||||
clif_inventorylist(sd);
|
clif_inventorylist(sd);
|
||||||
clif_send_petdata( sd, *pd, CHANGESTATEPET_UPDATE_EGG, 0 );
|
clif_send_petdata(sd, pd, 6, 0);
|
||||||
#endif
|
#endif
|
||||||
unit_free(&pd->bl,CLR_OUTSIGHT);
|
unit_free(&pd->bl,CLR_OUTSIGHT);
|
||||||
|
|
||||||
@ -1108,13 +1108,13 @@ int pet_birth_process(map_session_data *sd, struct s_pet *pet)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
clif_spawn(&sd->pd->bl);
|
clif_spawn(&sd->pd->bl);
|
||||||
clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_INIT, 0 );
|
clif_send_petdata(sd,sd->pd, 0,0);
|
||||||
clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_HAIRSTYLE, battle_config.pet_hair_style );
|
clif_send_petdata(sd,sd->pd, 5,battle_config.pet_hair_style);
|
||||||
#if PACKETVER >= 20180704
|
#if PACKETVER >= 20180704
|
||||||
clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_UPDATE_EGG, 1 );
|
clif_send_petdata(sd, sd->pd, 6, 1);
|
||||||
#endif
|
#endif
|
||||||
clif_pet_equip_area( *sd->pd );
|
clif_pet_equip_area(sd->pd);
|
||||||
clif_send_petstatus( *sd, *sd->pd );
|
clif_send_petstatus(sd);
|
||||||
clif_pet_autofeed_status(sd,true);
|
clif_pet_autofeed_status(sd,true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1169,10 +1169,10 @@ int pet_recv_petdata(uint32 account_id,struct s_pet *p,int flag)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
clif_spawn(&sd->pd->bl);
|
clif_spawn(&sd->pd->bl);
|
||||||
clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_INIT, 0 );
|
clif_send_petdata(sd,sd->pd,0,0);
|
||||||
clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_HAIRSTYLE, battle_config.pet_hair_style );
|
clif_send_petdata(sd,sd->pd,5,battle_config.pet_hair_style);
|
||||||
clif_pet_equip_area( *sd->pd );
|
clif_pet_equip_area(sd->pd);
|
||||||
clif_send_petstatus( *sd, *sd->pd );
|
clif_send_petstatus(sd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1414,7 +1414,7 @@ int pet_menu(map_session_data *sd,int menunum)
|
|||||||
|
|
||||||
switch(menunum) {
|
switch(menunum) {
|
||||||
case 0:
|
case 0:
|
||||||
clif_send_petstatus( *sd, *sd->pd );
|
clif_send_petstatus(sd);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
pet_food(sd, sd->pd);
|
pet_food(sd, sd->pd);
|
||||||
@ -1477,15 +1477,15 @@ int pet_change_name_ack(map_session_data *sd, char* name, int flag)
|
|||||||
|
|
||||||
if ( !flag || !strlen(name) ) {
|
if ( !flag || !strlen(name) ) {
|
||||||
clif_displaymessage(sd->fd, msg_txt(sd,280)); // You cannot use this name for your pet.
|
clif_displaymessage(sd->fd, msg_txt(sd,280)); // You cannot use this name for your pet.
|
||||||
clif_send_petstatus( *sd, *pd ); //Send status so client knows pet name change got rejected.
|
clif_send_petstatus(sd); //Send status so client knows pet name change got rejected.
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
safestrncpy(pd->pet.name, name, NAME_LENGTH);
|
safestrncpy(pd->pet.name, name, NAME_LENGTH);
|
||||||
clif_name_area(&pd->bl);
|
clif_name_area(&pd->bl);
|
||||||
pd->pet.rename_flag = 1;
|
pd->pet.rename_flag = 1;
|
||||||
clif_pet_equip_area( *pd );
|
clif_pet_equip_area(pd);
|
||||||
clif_send_petstatus( *sd, *pd );
|
clif_send_petstatus(sd);
|
||||||
|
|
||||||
int index = pet_egg_search( sd, pd->pet.pet_id );
|
int index = pet_egg_search( sd, pd->pet.pet_id );
|
||||||
|
|
||||||
@ -1529,7 +1529,7 @@ int pet_equipitem(map_session_data *sd,int index)
|
|||||||
pc_delitem(sd,index,1,0,0,LOG_TYPE_OTHER);
|
pc_delitem(sd,index,1,0,0,LOG_TYPE_OTHER);
|
||||||
pd->pet.equip = nameid;
|
pd->pet.equip = nameid;
|
||||||
status_set_viewdata(&pd->bl, pd->pet.class_); //Updates view_data.
|
status_set_viewdata(&pd->bl, pd->pet.class_); //Updates view_data.
|
||||||
clif_pet_equip_area( *pd );
|
clif_pet_equip_area(pd);
|
||||||
|
|
||||||
if (battle_config.pet_equip_required) { // Skotlex: start support timers if need
|
if (battle_config.pet_equip_required) { // Skotlex: start support timers if need
|
||||||
t_tick tick = gettick();
|
t_tick tick = gettick();
|
||||||
@ -1582,7 +1582,7 @@ static int pet_unequipitem(map_session_data *sd, struct pet_data *pd)
|
|||||||
|
|
||||||
pd->pet.equip = 0;
|
pd->pet.equip = 0;
|
||||||
status_set_viewdata(&pd->bl, pd->pet.class_);
|
status_set_viewdata(&pd->bl, pd->pet.class_);
|
||||||
clif_pet_equip_area(*pd);
|
clif_pet_equip_area(pd);
|
||||||
|
|
||||||
if( battle_config.pet_equip_required ) { // Skotlex: halt support timers if needed
|
if( battle_config.pet_equip_required ) { // Skotlex: halt support timers if needed
|
||||||
if( pd->state.skillbonus ) {
|
if( pd->state.skillbonus ) {
|
||||||
@ -1660,8 +1660,8 @@ int pet_food(map_session_data *sd, struct pet_data *pd)
|
|||||||
|
|
||||||
log_feeding(sd, LOG_FEED_PET, pet_db_ptr->FoodID);
|
log_feeding(sd, LOG_FEED_PET, pet_db_ptr->FoodID);
|
||||||
|
|
||||||
clif_send_petdata( sd, *pd, CHANGESTATEPET_HUNGER, pd->pet.hungry );
|
clif_send_petdata(sd,pd,2,pd->pet.hungry);
|
||||||
clif_send_petdata( sd, *pd, CHANGESTATEPET_INTIMACY, pd->pet.intimate );
|
clif_send_petdata(sd,pd,1,pd->pet.intimate);
|
||||||
clif_pet_food( *sd, pet_db_ptr->FoodID, 1 );
|
clif_pet_food( *sd, pet_db_ptr->FoodID, 1 );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -2324,10 +2324,10 @@ void pet_evolution(map_session_data *sd, int16 pet_id) {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
clif_spawn(&sd->pd->bl);
|
clif_spawn(&sd->pd->bl);
|
||||||
clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_INIT, 0 );
|
clif_send_petdata(sd, sd->pd, 0, 0);
|
||||||
clif_send_petdata( sd, *sd->pd, CHANGESTATEPET_HAIRSTYLE, battle_config.pet_hair_style );
|
clif_send_petdata(sd, sd->pd, 5, battle_config.pet_hair_style);
|
||||||
clif_pet_equip_area( *sd->pd );
|
clif_pet_equip_area(sd->pd);
|
||||||
clif_send_petstatus( *sd, *sd->pd );
|
clif_send_petstatus(sd);
|
||||||
clif_emotion(&sd->bl, ET_BEST);
|
clif_emotion(&sd->bl, ET_BEST);
|
||||||
clif_specialeffect(&sd->pd->bl, EF_HO_UP, AREA);
|
clif_specialeffect(&sd->pd->bl, EF_HO_UP, AREA);
|
||||||
|
|
||||||
|
@ -15340,13 +15340,13 @@ BUILDIN_FUNC(petskillsupport)
|
|||||||
static inline void script_skill_effect( block_list& bl, uint16 skill_id, uint16 skill_lv, int16 x, int16 y ) {
|
static inline void script_skill_effect( block_list& bl, uint16 skill_id, uint16 skill_lv, int16 x, int16 y ) {
|
||||||
switch (skill_get_casttype(skill_id)) {
|
switch (skill_get_casttype(skill_id)) {
|
||||||
case CAST_GROUND:
|
case CAST_GROUND:
|
||||||
clif_skill_poseffect( bl, skill_id, skill_lv, x, y, gettick() );
|
clif_skill_poseffect(&bl, skill_id, skill_lv, x, y, gettick());
|
||||||
break;
|
break;
|
||||||
case CAST_NODAMAGE:
|
case CAST_NODAMAGE:
|
||||||
clif_skill_nodamage(&bl, bl, skill_id, skill_lv);
|
clif_skill_nodamage(&bl, bl, skill_id, skill_lv);
|
||||||
break;
|
break;
|
||||||
case CAST_DAMAGE:
|
case CAST_DAMAGE:
|
||||||
clif_skill_damage( bl, bl, gettick(), status_get_amotion(&bl), status_get_dmotion(&bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id) );
|
clif_skill_damage(&bl, &bl, gettick(), status_get_amotion(&bl), status_get_dmotion(&bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -16488,7 +16488,7 @@ BUILDIN_FUNC(summon)
|
|||||||
check_event(st, event);
|
check_event(st, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
clif_skill_poseffect( sd->bl, AM_CALLHOMUN, 1, sd->bl.x, sd->bl.y, tick );
|
clif_skill_poseffect(&sd->bl,AM_CALLHOMUN,1,sd->bl.x,sd->bl.y,tick);
|
||||||
|
|
||||||
md = mob_once_spawn_sub(&sd->bl, sd->bl.m, sd->bl.x, sd->bl.y, str, _class, event, SZ_SMALL, AI_NONE);
|
md = mob_once_spawn_sub(&sd->bl, sd->bl.m, sd->bl.x, sd->bl.y, str, _class, event, SZ_SMALL, AI_NONE);
|
||||||
if (md) {
|
if (md) {
|
||||||
@ -19386,8 +19386,8 @@ BUILDIN_FUNC(setunitdata)
|
|||||||
case UPET_MAPID: if (mapname) value = map_mapname2mapid(mapname); unit_warp(bl, (short)value, 0, 0, CLR_TELEPORT); break;
|
case UPET_MAPID: if (mapname) value = map_mapname2mapid(mapname); unit_warp(bl, (short)value, 0, 0, CLR_TELEPORT); break;
|
||||||
case UPET_X: if (!unit_walktoxy(bl, (short)value, pd->bl.y, 2)) unit_movepos(bl, (short)value, pd->bl.y, 0, 0); break;
|
case UPET_X: if (!unit_walktoxy(bl, (short)value, pd->bl.y, 2)) unit_movepos(bl, (short)value, pd->bl.y, 0, 0); break;
|
||||||
case UPET_Y: if (!unit_walktoxy(bl, pd->bl.x, (short)value, 2)) unit_movepos(bl, pd->bl.x, (short)value, 0, 0); break;
|
case UPET_Y: if (!unit_walktoxy(bl, pd->bl.x, (short)value, 2)) unit_movepos(bl, pd->bl.x, (short)value, 0, 0); break;
|
||||||
case UPET_HUNGER: pd->pet.hungry = cap_value((short)value, 0, 100); clif_send_petdata( map_id2sd(pd->pet.account_id), *pd, CHANGESTATEPET_HUNGER, pd->pet.hungry ); break;
|
case UPET_HUNGER: pd->pet.hungry = cap_value((short)value, 0, 100); clif_send_petdata(map_id2sd(pd->pet.account_id), pd, 2, pd->pet.hungry); break;
|
||||||
case UPET_INTIMACY: pet_set_intimate(pd, (unsigned int)value); clif_send_petdata( map_id2sd(pd->pet.account_id), *pd, CHANGESTATEPET_INTIMACY, pd->pet.intimate ); break;
|
case UPET_INTIMACY: pet_set_intimate(pd, (unsigned int)value); clif_send_petdata(map_id2sd(pd->pet.account_id), pd, 1, pd->pet.intimate); break;
|
||||||
case UPET_SPEED: pd->status.speed = (unsigned short)value; status_calc_misc(bl, &pd->status, pd->pet.level); break;
|
case UPET_SPEED: pd->status.speed = (unsigned short)value; status_calc_misc(bl, &pd->status, pd->pet.level); break;
|
||||||
case UPET_LOOKDIR: unit_setdir(bl, (uint8)value); break;
|
case UPET_LOOKDIR: unit_setdir(bl, (uint8)value); break;
|
||||||
case UPET_CANMOVETICK: pd->ud.canmove_tick = value > 0 ? (unsigned int)value : 0; break;
|
case UPET_CANMOVETICK: pd->ud.canmove_tick = value > 0 ? (unsigned int)value : 0; break;
|
||||||
@ -19422,7 +19422,7 @@ BUILDIN_FUNC(setunitdata)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Client information update
|
// Client information update
|
||||||
clif_send_petstatus( *pd->master, *pd );
|
clif_send_petstatus( pd->master );
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case BL_MER: {
|
case BL_MER: {
|
||||||
|
@ -2128,7 +2128,21 @@ enum e_hat_effects : int16{
|
|||||||
HAT_EF_C_BABY_GLOOM,
|
HAT_EF_C_BABY_GLOOM,
|
||||||
HAT_EF_WINTERNIGHTBELLS,
|
HAT_EF_WINTERNIGHTBELLS,
|
||||||
HAT_EF_NIGHTSKYOFRUTIE,
|
HAT_EF_NIGHTSKYOFRUTIE,
|
||||||
|
FOOTPRINT_EF_BASE,
|
||||||
|
FOOTPRINT_EF_STR_BASE,
|
||||||
|
FOOTPRINT_EF_PURPLESTAR,
|
||||||
|
FOOTPRINT_EF_YELLOWSTAR,
|
||||||
|
FOOTPRINT_EF_REDSTAR,
|
||||||
HAT_EF_RAINBOW_POISON_MASTER,
|
HAT_EF_RAINBOW_POISON_MASTER,
|
||||||
|
HAT_EF_C_ANCIENT_RUNE,
|
||||||
|
HAT_EF_C_DRAGON_GREEN_AURA,
|
||||||
|
HAT_EF_C_DRAGON_RED_AURA,
|
||||||
|
HAT_EF_C_DRAGON_YELLOW_AURA,
|
||||||
|
HAT_EF_INTERDIMENSIONAL_RIFT,
|
||||||
|
HAT_EF_C_CLB_SS_LL,
|
||||||
|
HAT_EF_VACATION,
|
||||||
|
HAT_EF_C_FH_LOSTWING,
|
||||||
|
FOOTPRINT_EF_DOGFOOT,
|
||||||
HAT_EF_MAX
|
HAT_EF_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -9186,6 +9186,11 @@
|
|||||||
export_constant_npc(JT_4_EP21_HOWELL_S);
|
export_constant_npc(JT_4_EP21_HOWELL_S);
|
||||||
export_constant_npc(JT_4_EP21_TAN_S);
|
export_constant_npc(JT_4_EP21_TAN_S);
|
||||||
export_constant_npc(JT_4_M_VACATION_MARAM);
|
export_constant_npc(JT_4_M_VACATION_MARAM);
|
||||||
|
export_constant_npc(JT_4_CLB_SS_FC);
|
||||||
|
export_constant_npc(JT_4_CLB_SS_TZ);
|
||||||
|
export_constant_npc(JT_4_CLB_SS_AJ);
|
||||||
|
export_constant_npc(JT_4_CLB_SS_LK);
|
||||||
|
export_constant_npc(JT_4_SMART_ANDRE);
|
||||||
export_constant_npc(JT_ROZ_MQ_XAVIER);
|
export_constant_npc(JT_ROZ_MQ_XAVIER);
|
||||||
export_constant_npc(JT_ROZ_MQ_MOCLORD);
|
export_constant_npc(JT_ROZ_MQ_MOCLORD);
|
||||||
export_constant_npc(JT_ROZ_MQ_SKULD);
|
export_constant_npc(JT_ROZ_MQ_SKULD);
|
||||||
@ -10550,7 +10555,21 @@
|
|||||||
export_constant(HAT_EF_C_BABY_GLOOM);
|
export_constant(HAT_EF_C_BABY_GLOOM);
|
||||||
export_constant(HAT_EF_WINTERNIGHTBELLS);
|
export_constant(HAT_EF_WINTERNIGHTBELLS);
|
||||||
export_constant(HAT_EF_NIGHTSKYOFRUTIE);
|
export_constant(HAT_EF_NIGHTSKYOFRUTIE);
|
||||||
|
export_constant(FOOTPRINT_EF_BASE);
|
||||||
|
export_constant(FOOTPRINT_EF_STR_BASE);
|
||||||
|
export_constant(FOOTPRINT_EF_PURPLESTAR);
|
||||||
|
export_constant(FOOTPRINT_EF_YELLOWSTAR);
|
||||||
|
export_constant(FOOTPRINT_EF_REDSTAR);
|
||||||
export_constant(HAT_EF_RAINBOW_POISON_MASTER);
|
export_constant(HAT_EF_RAINBOW_POISON_MASTER);
|
||||||
|
export_constant(HAT_EF_C_ANCIENT_RUNE);
|
||||||
|
export_constant(HAT_EF_C_DRAGON_GREEN_AURA);
|
||||||
|
export_constant(HAT_EF_C_DRAGON_RED_AURA);
|
||||||
|
export_constant(HAT_EF_C_DRAGON_YELLOW_AURA);
|
||||||
|
export_constant(HAT_EF_INTERDIMENSIONAL_RIFT);
|
||||||
|
export_constant(HAT_EF_C_CLB_SS_LL);
|
||||||
|
export_constant(HAT_EF_VACATION);
|
||||||
|
export_constant(HAT_EF_C_FH_LOSTWING);
|
||||||
|
export_constant(FOOTPRINT_EF_DOGFOOT);
|
||||||
|
|
||||||
/* pet catch */
|
/* pet catch */
|
||||||
export_constant(PET_CATCH_UNIVERSAL);
|
export_constant(PET_CATCH_UNIVERSAL);
|
||||||
|
@ -3361,7 +3361,7 @@ void skill_combo(struct block_list* src,struct block_list *dsrc, struct block_li
|
|||||||
if(sd && duration==1) duration = DIFF_TICK(sd->ud.canact_tick, tick); //Auto calc duration
|
if(sd && duration==1) duration = DIFF_TICK(sd->ud.canact_tick, tick); //Auto calc duration
|
||||||
duration = i64max(status_get_amotion(src),duration); //Never less than aMotion
|
duration = i64max(status_get_amotion(src),duration); //Never less than aMotion
|
||||||
sc_start4(src,src,SC_COMBO,100,skill_id,target_id,nodelay,0,duration);
|
sc_start4(src,src,SC_COMBO,100,skill_id,target_id,nodelay,0,duration);
|
||||||
clif_combo_delay( *src, duration );
|
clif_combo_delay(src, duration);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3395,7 +3395,7 @@ static void skill_do_copy(struct block_list* src,struct block_list *bl, uint16 s
|
|||||||
case 1: //Copied by Plagiarism
|
case 1: //Copied by Plagiarism
|
||||||
{
|
{
|
||||||
if (tsd->cloneskill_idx > 0 && tsd->status.skill[tsd->cloneskill_idx].flag == SKILL_FLAG_PLAGIARIZED) {
|
if (tsd->cloneskill_idx > 0 && tsd->status.skill[tsd->cloneskill_idx].flag == SKILL_FLAG_PLAGIARIZED) {
|
||||||
clif_deleteskill(tsd,tsd->status.skill[tsd->cloneskill_idx].id, true);
|
clif_deleteskill(*tsd,tsd->status.skill[tsd->cloneskill_idx].id, true);
|
||||||
tsd->status.skill[tsd->cloneskill_idx].id = 0;
|
tsd->status.skill[tsd->cloneskill_idx].id = 0;
|
||||||
tsd->status.skill[tsd->cloneskill_idx].lv = 0;
|
tsd->status.skill[tsd->cloneskill_idx].lv = 0;
|
||||||
tsd->status.skill[tsd->cloneskill_idx].flag = SKILL_FLAG_PERMANENT;
|
tsd->status.skill[tsd->cloneskill_idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
@ -3415,7 +3415,7 @@ static void skill_do_copy(struct block_list* src,struct block_list *bl, uint16 s
|
|||||||
//Skill level copied depends on Reproduce skill that used
|
//Skill level copied depends on Reproduce skill that used
|
||||||
lv = (tsc) ? tsc->getSCE(SC__REPRODUCE)->val1 : 1;
|
lv = (tsc) ? tsc->getSCE(SC__REPRODUCE)->val1 : 1;
|
||||||
if( tsd->reproduceskill_idx > 0 && tsd->status.skill[tsd->reproduceskill_idx].flag == SKILL_FLAG_PLAGIARIZED ) {
|
if( tsd->reproduceskill_idx > 0 && tsd->status.skill[tsd->reproduceskill_idx].flag == SKILL_FLAG_PLAGIARIZED ) {
|
||||||
clif_deleteskill(tsd,tsd->status.skill[tsd->reproduceskill_idx].id, true);
|
clif_deleteskill(*tsd,tsd->status.skill[tsd->reproduceskill_idx].id, true);
|
||||||
tsd->status.skill[tsd->reproduceskill_idx].id = 0;
|
tsd->status.skill[tsd->reproduceskill_idx].id = 0;
|
||||||
tsd->status.skill[tsd->reproduceskill_idx].lv = 0;
|
tsd->status.skill[tsd->reproduceskill_idx].lv = 0;
|
||||||
tsd->status.skill[tsd->reproduceskill_idx].flag = SKILL_FLAG_PERMANENT;
|
tsd->status.skill[tsd->reproduceskill_idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
@ -3736,7 +3736,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|||||||
nbl = battle_getenemyarea(bl,bl->x,bl->y,2,BL_CHAR,bl->id);
|
nbl = battle_getenemyarea(bl,bl->x,bl->y,2,BL_CHAR,bl->id);
|
||||||
if( nbl ){ // Only one target is chosen.
|
if( nbl ){ // Only one target is chosen.
|
||||||
damage = damage / 2; // Deflect half of the damage to a target nearby
|
damage = damage / 2; // Deflect half of the damage to a target nearby
|
||||||
clif_skill_damage( *bl, *nbl, tick, status_get_amotion(src), 0, battle_fix_damage(bl,nbl,damage,0,0), dmg.div_, OB_OBOROGENSOU_TRANSITION_ATK, -1, DMG_SINGLE );
|
clif_skill_damage(bl, nbl, tick, status_get_amotion(src), 0, battle_fix_damage(bl,nbl,damage,0,0), dmg.div_, OB_OBOROGENSOU_TRANSITION_ATK, -1, DMG_SINGLE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3809,7 +3809,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|||||||
//Display damage.
|
//Display damage.
|
||||||
switch( skill_id ) {
|
switch( skill_id ) {
|
||||||
case PA_GOSPEL: //Should look like Holy Cross [Skotlex]
|
case PA_GOSPEL: //Should look like Holy Cross [Skotlex]
|
||||||
dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, CR_HOLYCROSS, -1, DMG_SPLASH );
|
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, CR_HOLYCROSS, -1, DMG_SPLASH);
|
||||||
break;
|
break;
|
||||||
//Skills that need be passed as a normal attack for the client to display correctly.
|
//Skills that need be passed as a normal attack for the client to display correctly.
|
||||||
case HVAN_EXPLOSION:
|
case HVAN_EXPLOSION:
|
||||||
@ -3827,12 +3827,12 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|||||||
|
|
||||||
case AS_SPLASHER:
|
case AS_SPLASHER:
|
||||||
if( flag&SD_ANIMATION ) // the surrounding targets
|
if( flag&SD_ANIMATION ) // the surrounding targets
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH ); // needs -1 as skill level
|
dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH); // needs -1 as skill level
|
||||||
else // the central target doesn't display an animation
|
else // the central target doesn't display an animation
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_SPLASH ); // needs -2(!) as skill level
|
dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_SPLASH); // needs -2(!) as skill level
|
||||||
break;
|
break;
|
||||||
case SR_EARTHSHAKER:
|
case SR_EARTHSHAKER:
|
||||||
dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, 1, skill_id, -2, DMG_SINGLE );
|
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,skill_id,-2,DMG_SINGLE);
|
||||||
break;
|
break;
|
||||||
case WL_SOULEXPANSION:
|
case WL_SOULEXPANSION:
|
||||||
case WL_COMET:
|
case WL_COMET:
|
||||||
@ -3841,19 +3841,19 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|||||||
#ifndef RENEWAL
|
#ifndef RENEWAL
|
||||||
case NJ_HUUMA:
|
case NJ_HUUMA:
|
||||||
#endif
|
#endif
|
||||||
dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, skill_lv, DMG_MULTI_HIT );
|
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,skill_lv,DMG_MULTI_HIT);
|
||||||
break;
|
break;
|
||||||
case WL_CHAINLIGHTNING_ATK:
|
case WL_CHAINLIGHTNING_ATK:
|
||||||
dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, 1, WL_CHAINLIGHTNING_ATK, -2, DMG_SINGLE );
|
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,WL_CHAINLIGHTNING_ATK,-2,DMG_SINGLE);
|
||||||
break;
|
break;
|
||||||
case WL_TETRAVORTEX_FIRE:
|
case WL_TETRAVORTEX_FIRE:
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, WL_TETRAVORTEX_WIND, -1, DMG_SPLASH );
|
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, WL_TETRAVORTEX_WIND, -1, DMG_SPLASH);
|
||||||
break;
|
break;
|
||||||
case LG_SHIELDPRESS:
|
case LG_SHIELDPRESS:
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, status_get_amotion(src), dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SINGLE );
|
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, status_get_amotion(src), dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SINGLE);
|
||||||
break;
|
break;
|
||||||
case NPC_EARTHQUAKE:
|
case NPC_EARTHQUAKE:
|
||||||
dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_ENDURE );
|
dmg.dmotion = clif_skill_damage(src, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_ENDURE);
|
||||||
break;
|
break;
|
||||||
case NPC_DARKPIERCING:
|
case NPC_DARKPIERCING:
|
||||||
case EL_FIRE_BOMB:
|
case EL_FIRE_BOMB:
|
||||||
@ -3875,19 +3875,19 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|||||||
case KO_BAKURETSU:
|
case KO_BAKURETSU:
|
||||||
case GN_HELLS_PLANT_ATK:
|
case GN_HELLS_PLANT_ATK:
|
||||||
case SU_SV_ROOTTWIST_ATK:
|
case SU_SV_ROOTTWIST_ATK:
|
||||||
dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH );
|
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,DMG_SPLASH);
|
||||||
break;
|
break;
|
||||||
case GN_FIRE_EXPANSION_ACID:
|
case GN_FIRE_EXPANSION_ACID:
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, CR_ACIDDEMONSTRATION, skill_lv, DMG_MULTI_HIT );
|
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, CR_ACIDDEMONSTRATION, skill_lv, DMG_MULTI_HIT);
|
||||||
break;
|
break;
|
||||||
case GN_SLINGITEM_RANGEMELEEATK:
|
case GN_SLINGITEM_RANGEMELEEATK:
|
||||||
dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, GN_SLINGITEM, -2, DMG_SINGLE );
|
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,GN_SLINGITEM,-2,DMG_SINGLE);
|
||||||
break;
|
break;
|
||||||
case EL_STONE_RAIN:
|
case EL_STONE_RAIN:
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, (flag&1) ? DMG_MULTI_HIT : DMG_SPLASH );
|
dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,(flag&1)?DMG_MULTI_HIT:DMG_SPLASH);
|
||||||
break;
|
break;
|
||||||
case WM_SEVERE_RAINSTORM_MELEE:
|
case WM_SEVERE_RAINSTORM_MELEE:
|
||||||
dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, WM_SEVERE_RAINSTORM, -2, DMG_SPLASH );
|
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_SEVERE_RAINSTORM,-2,DMG_SPLASH);
|
||||||
break;
|
break;
|
||||||
case HT_CLAYMORETRAP:
|
case HT_CLAYMORETRAP:
|
||||||
case HT_BLASTMINE:
|
case HT_BLASTMINE:
|
||||||
@ -3896,20 +3896,20 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|||||||
case RA_CLUSTERBOMB:
|
case RA_CLUSTERBOMB:
|
||||||
case RA_FIRINGTRAP:
|
case RA_FIRINGTRAP:
|
||||||
case RA_ICEBOUNDTRAP:
|
case RA_ICEBOUNDTRAP:
|
||||||
dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, (flag&SD_LEVEL) ? -1 : skill_lv, DMG_SPLASH );
|
dmg.dmotion = clif_skill_damage(src, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, (flag&SD_LEVEL) ? -1 : skill_lv, DMG_SPLASH);
|
||||||
if( dsrc != src ) // avoid damage display redundancy
|
if( dsrc != src ) // avoid damage display redundancy
|
||||||
break;
|
break;
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
case HT_LANDMINE:
|
case HT_LANDMINE:
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, dmg_type );
|
dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, dmg_type);
|
||||||
break;
|
break;
|
||||||
case WZ_SIGHTBLASTER:
|
case WZ_SIGHTBLASTER:
|
||||||
//Sightblaster should never call clif_skill_damage twice
|
//Sightblaster should never call clif_skill_damage twice
|
||||||
dmg.dmotion = clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, (flag&SD_LEVEL) ? -1 : skill_lv, DMG_SPLASH );
|
dmg.dmotion = clif_skill_damage(src, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, (flag&SD_LEVEL) ? -1 : skill_lv, DMG_SPLASH);
|
||||||
break;
|
break;
|
||||||
case RL_R_TRIP_PLUSATK:
|
case RL_R_TRIP_PLUSATK:
|
||||||
case RL_S_STORM:
|
case RL_S_STORM:
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, status_get_amotion(src), dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH );
|
dmg.dmotion = clif_skill_damage(dsrc,bl,tick,status_get_amotion(src),dmg.dmotion,damage,dmg.div_,skill_id,-1,DMG_SPLASH);
|
||||||
break;
|
break;
|
||||||
case SU_LUNATICCARROTBEAT:
|
case SU_LUNATICCARROTBEAT:
|
||||||
case SU_LUNATICCARROTBEAT2:
|
case SU_LUNATICCARROTBEAT2:
|
||||||
@ -3922,31 +3922,31 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|||||||
clif_skill_nodamage(dsrc, *bl, skill_id, skill_lv);
|
clif_skill_nodamage(dsrc, *bl, skill_id, skill_lv);
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
case WM_REVERBERATION:
|
case WM_REVERBERATION:
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, dmg_type );
|
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, dmg_type);
|
||||||
break;
|
break;
|
||||||
case SJ_FALLINGSTAR_ATK:
|
case SJ_FALLINGSTAR_ATK:
|
||||||
case SJ_FALLINGSTAR_ATK2:
|
case SJ_FALLINGSTAR_ATK2:
|
||||||
dmg.dmotion = clif_skill_damage( *src, *bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_MULTI_HIT );
|
dmg.dmotion = clif_skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_MULTI_HIT);
|
||||||
break;
|
break;
|
||||||
case SJ_NOVAEXPLOSING:
|
case SJ_NOVAEXPLOSING:
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_SINGLE );
|
dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_SINGLE);
|
||||||
break;
|
break;
|
||||||
case DK_HACKANDSLASHER_ATK:
|
case DK_HACKANDSLASHER_ATK:
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, dmg_type );
|
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, dmg_type);
|
||||||
break;
|
break;
|
||||||
case AG_STORM_CANNON:
|
case AG_STORM_CANNON:
|
||||||
case AG_CRIMSON_ARROW:
|
case AG_CRIMSON_ARROW:
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, skill_lv, DMG_SPLASH );
|
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, skill_lv, DMG_SPLASH);
|
||||||
break;
|
break;
|
||||||
case TR_ROSEBLOSSOM_ATK:
|
case TR_ROSEBLOSSOM_ATK:
|
||||||
case ABC_FROM_THE_ABYSS_ATK:
|
case ABC_FROM_THE_ABYSS_ATK:
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH );
|
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH);
|
||||||
break;
|
break;
|
||||||
case TR_SOUNDBLEND:
|
case TR_SOUNDBLEND:
|
||||||
if (flag&SD_ANIMATION)// For some reason the caster reacts on the splash flag. Best reduce amotion to minimize it for now. [Rytech]
|
if (flag&SD_ANIMATION)// For some reason the caster reacts on the splash flag. Best reduce amotion to minimize it for now. [Rytech]
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, 10, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH );
|
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, 10, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SPLASH);
|
||||||
else
|
else
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, skill_lv, dmg_type );
|
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, skill_lv, dmg_type);
|
||||||
break;
|
break;
|
||||||
case AB_DUPLELIGHT_MELEE:
|
case AB_DUPLELIGHT_MELEE:
|
||||||
case AB_DUPLELIGHT_MAGIC:
|
case AB_DUPLELIGHT_MAGIC:
|
||||||
@ -3958,11 +3958,11 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|||||||
if (src->type == BL_SKILL) {
|
if (src->type == BL_SKILL) {
|
||||||
TBL_SKILL *su = (TBL_SKILL*)src;
|
TBL_SKILL *su = (TBL_SKILL*)src;
|
||||||
if (su->group && skill_get_inf2(su->group->skill_id, INF2_ISTRAP)) { // show damage on trap targets
|
if (su->group && skill_get_inf2(su->group->skill_id, INF2_ISTRAP)) { // show damage on trap targets
|
||||||
clif_skill_damage( *src, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, flag&SD_LEVEL ? -1 : skill_lv, DMG_SPLASH );
|
clif_skill_damage(src, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, flag&SD_LEVEL ? -1 : skill_lv, DMG_SPLASH);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dmg.dmotion = clif_skill_damage( *dsrc, *bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, (flag&SD_LEVEL) ? -1 : skill_lv, dmg_type );
|
dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, flag&SD_LEVEL?-1:skill_lv, dmg_type);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4076,10 +4076,10 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|||||||
|
|
||||||
if (e_bl) {
|
if (e_bl) {
|
||||||
if (!rmdamage) {
|
if (!rmdamage) {
|
||||||
clif_skill_damage( *e_bl, *e_bl, gettick(), 0, 0, damage, dmg.div_, skill_id, -1, skill_get_hit(skill_id) );
|
clif_skill_damage(e_bl, e_bl, gettick(), 0, 0, damage, dmg.div_, skill_id, -1, skill_get_hit(skill_id));
|
||||||
battle_fix_damage(src, e_bl, damage, 0, 0);
|
battle_fix_damage(src, e_bl, damage, 0, 0);
|
||||||
} else {
|
} else {
|
||||||
clif_skill_damage( *bl, *bl, gettick(), 0, 0, damage, dmg.div_, skill_id, -1, skill_get_hit(skill_id) );
|
clif_skill_damage(bl, bl, gettick(), 0, 0, damage, dmg.div_, skill_id, -1, skill_get_hit(skill_id));
|
||||||
battle_fix_damage(bl, bl, damage, 0, 0);
|
battle_fix_damage(bl, bl, damage, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4185,7 +4185,7 @@ int skill_area_sub(struct block_list *bl, va_list ap)
|
|||||||
if(battle_check_target(src,bl,flag) > 0) {
|
if(battle_check_target(src,bl,flag) > 0) {
|
||||||
// several splash skills need this initial dummy packet to display correctly
|
// several splash skills need this initial dummy packet to display correctly
|
||||||
if (flag&SD_PREAMBLE && skill_area_temp[2] == 0)
|
if (flag&SD_PREAMBLE && skill_area_temp[2] == 0)
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
|
|
||||||
if (flag&(SD_SPLASH|SD_PREAMBLE))
|
if (flag&(SD_SPLASH|SD_PREAMBLE))
|
||||||
skill_area_temp[2]++;
|
skill_area_temp[2]++;
|
||||||
@ -4544,7 +4544,7 @@ static TIMER_FUNC(skill_timerskill){
|
|||||||
|
|
||||||
if (skl->skill_id == SR_SKYNETBLOW) {
|
if (skl->skill_id == SR_SKYNETBLOW) {
|
||||||
skill_area_temp[1] = 0;
|
skill_area_temp[1] = 0;
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skl->skill_id, skl->skill_lv, DMG_SINGLE );
|
clif_skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skl->skill_id,skl->skill_lv,DMG_SINGLE);
|
||||||
map_foreachinallrange(skill_area_sub,src,skill_get_splash(skl->skill_id,skl->skill_lv),BL_CHAR|BL_SKILL,src,
|
map_foreachinallrange(skill_area_sub,src,skill_get_splash(skl->skill_id,skl->skill_lv),BL_CHAR|BL_SKILL,src,
|
||||||
skl->skill_id,skl->skill_lv,tick,skl->flag|BCT_ENEMY|SD_SPLASH|1,skill_castend_damage_id);
|
skl->skill_id,skl->skill_lv,tick,skl->flag|BCT_ENEMY|SD_SPLASH|1,skill_castend_damage_id);
|
||||||
break;
|
break;
|
||||||
@ -4804,7 +4804,7 @@ static TIMER_FUNC(skill_timerskill){
|
|||||||
|
|
||||||
int splash = skill_get_splash(skl->skill_id, skl->skill_lv);
|
int splash = skill_get_splash(skl->skill_id, skl->skill_lv);
|
||||||
|
|
||||||
clif_skill_poseffect( *src, skl->skill_id, skl->skill_lv, tmpx, tmpy, tick );
|
clif_skill_poseffect(src, skl->skill_id, skl->skill_lv, tmpx, tmpy, tick);
|
||||||
map_foreachinarea(skill_area_sub, src->m, tmpx - splash, tmpy - splash, tmpx + splash, tmpy + splash, BL_CHAR, src, skl->skill_id, skl->skill_lv, tick, skl->flag | BCT_ENEMY | SD_SPLASH | SKILL_ALTDMG_FLAG | 1, skill_castend_damage_id);
|
map_foreachinarea(skill_area_sub, src->m, tmpx - splash, tmpy - splash, tmpx + splash, tmpy + splash, BL_CHAR, src, skl->skill_id, skl->skill_lv, tick, skl->flag | BCT_ENEMY | SD_SPLASH | SKILL_ALTDMG_FLAG | 1, skill_castend_damage_id);
|
||||||
skill_unitsetting(src, skl->skill_id, skl->skill_lv, tmpx, tmpy, skill_get_unit_interval(skl->skill_id));
|
skill_unitsetting(src, skl->skill_id, skl->skill_lv, tmpx, tmpy, skill_get_unit_interval(skl->skill_id));
|
||||||
}
|
}
|
||||||
@ -5128,7 +5128,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
sc_type sct = skill_get_sc(skill_id);
|
sc_type sct = skill_get_sc(skill_id);
|
||||||
if(sct != SC_NONE)
|
if(sct != SC_NONE)
|
||||||
status_change_end(bl, sct);
|
status_change_end(bl, sct);
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), status_get_dmotion(bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id));
|
clif_skill_damage(src, bl, tick, status_get_amotion(src), status_get_dmotion(bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5814,7 +5814,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
#endif
|
#endif
|
||||||
case LG_MOONSLASHER:
|
case LG_MOONSLASHER:
|
||||||
case MH_XENO_SLASHER:
|
case MH_XENO_SLASHER:
|
||||||
clif_skill_damage( *src, *bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
break;
|
break;
|
||||||
case NPC_REVERBERATION_ATK:
|
case NPC_REVERBERATION_ATK:
|
||||||
case NC_ARMSCANNON:
|
case NC_ARMSCANNON:
|
||||||
@ -6688,7 +6688,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
status_change_end(bl, SC__SHADOWFORM);
|
status_change_end(bl, SC__SHADOWFORM);
|
||||||
sc_start(src,bl, SC_INFRAREDSCAN, 10000, skill_lv, skill_get_time(skill_id, skill_lv));
|
sc_start(src,bl, SC_INFRAREDSCAN, 10000, skill_lv, skill_get_time(skill_id, skill_lv));
|
||||||
} else {
|
} else {
|
||||||
clif_skill_damage( *src, *bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -6697,7 +6697,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
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);
|
||||||
else {
|
else {
|
||||||
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_damage_id);
|
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_damage_id);
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,DMG_SINGLE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -6712,7 +6712,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
skill_area_temp[5] = y;
|
skill_area_temp[5] = y;
|
||||||
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_damage_id);
|
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_damage_id);
|
||||||
skill_addtimerskill(src,tick + 800,src->id,x,y,skill_id,skill_lv,0,flag); // To teleport Self
|
skill_addtimerskill(src,tick + 800,src->id,x,y,skill_id,skill_lv,0,flag); // To teleport Self
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,DMG_SINGLE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -6762,7 +6762,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
status_change_end(bl, SC__SHADOWFORM);
|
status_change_end(bl, SC__SHADOWFORM);
|
||||||
} else {
|
} else {
|
||||||
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -6828,7 +6828,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
else {
|
else {
|
||||||
int i = skill_get_splash(skill_id,skill_lv);
|
int i = skill_get_splash(skill_id,skill_lv);
|
||||||
clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv);
|
clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv);
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
if( rnd()%100 < 30 )
|
if( rnd()%100 < 30 )
|
||||||
map_foreachinrange(skill_area_sub,bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
|
map_foreachinrange(skill_area_sub,bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
|
||||||
else
|
else
|
||||||
@ -6838,7 +6838,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
|
|
||||||
case EL_ROCK_CRUSHER:
|
case EL_ROCK_CRUSHER:
|
||||||
clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv);
|
clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv);
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
if( rnd()%100 < 50 )
|
if( rnd()%100 < 50 )
|
||||||
skill_attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);
|
skill_attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);
|
||||||
else
|
else
|
||||||
@ -6851,7 +6851,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
else {
|
else {
|
||||||
int i = skill_get_splash(skill_id,skill_lv);
|
int i = skill_get_splash(skill_id,skill_lv);
|
||||||
clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv);
|
clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv);
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
if( rnd()%100 < 30 )
|
if( rnd()%100 < 30 )
|
||||||
map_foreachinrange(skill_area_sub,bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
|
map_foreachinrange(skill_area_sub,bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
|
||||||
else
|
else
|
||||||
@ -6864,7 +6864,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
case EL_WIND_SLASH:
|
case EL_WIND_SLASH:
|
||||||
case EL_STONE_HAMMER:
|
case EL_STONE_HAMMER:
|
||||||
clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv);
|
clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv);
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag);
|
skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -6875,7 +6875,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
sc_type type = SC_TIDAL_WEAPON_OPTION, type2 = SC_TIDAL_WEAPON;
|
sc_type type = SC_TIDAL_WEAPON_OPTION, type2 = SC_TIDAL_WEAPON;
|
||||||
|
|
||||||
clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv);
|
clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv);
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
if( (tsc_ele && tsc_ele->getSCE(type2)) || (tsc && tsc->getSCE(type)) ) {
|
if( (tsc_ele && tsc_ele->getSCE(type2)) || (tsc && tsc->getSCE(type)) ) {
|
||||||
status_change_end(battle_get_master(src),type);
|
status_change_end(battle_get_master(src),type);
|
||||||
status_change_end(src,type2);
|
status_change_end(src,type2);
|
||||||
@ -6927,7 +6927,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
type = SC_TINDER_BREAKER2;
|
type = SC_TINDER_BREAKER2;
|
||||||
if( unit_movepos(src, bl->x, bl->y, 1, 1) ){
|
if( unit_movepos(src, bl->x, bl->y, 1, 1) ){
|
||||||
clif_blown(src);
|
clif_blown(src);
|
||||||
clif_skill_poseffect( *src, skill_id, skill_lv, bl->x, bl->y, tick );
|
clif_skill_poseffect(src,skill_id,skill_lv,bl->x,bl->y,tick);
|
||||||
}
|
}
|
||||||
}else if( skill_id == MH_CBC ){
|
}else if( skill_id == MH_CBC ){
|
||||||
type = SC_CBC;
|
type = SC_CBC;
|
||||||
@ -6987,7 +6987,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (skill_id == RL_HAMMER_OF_GOD)
|
if (skill_id == RL_HAMMER_OF_GOD)
|
||||||
clif_skill_poseffect( *src, skill_id, 1, bl->x, bl->y, gettick() );
|
clif_skill_poseffect(src, skill_id, 1, bl->x, bl->y, gettick());
|
||||||
else
|
else
|
||||||
clif_skill_nodamage(src, *bl, skill_id, skill_lv);
|
clif_skill_nodamage(src, *bl, skill_id, skill_lv);
|
||||||
|
|
||||||
@ -7144,9 +7144,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
ShowWarning("skill_castend_damage_id: Unknown skill used:%d\n",skill_id);
|
ShowWarning("skill_castend_damage_id: Unknown skill used:%d\n",skill_id);
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), tstatus->dmotion,
|
clif_skill_damage(src, bl, tick, status_get_amotion(src), tstatus->dmotion,
|
||||||
0, abs(skill_get_num(skill_id, skill_lv)),
|
0, abs(skill_get_num(skill_id, skill_lv)),
|
||||||
skill_id, skill_lv, skill_get_hit(skill_id) );
|
skill_id, skill_lv, skill_get_hit(skill_id));
|
||||||
map_freeblock_unlock();
|
map_freeblock_unlock();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -7806,7 +7806,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
}
|
}
|
||||||
|
|
||||||
clif_skill_nodamage(src, *bl, skill_id, skill_lv);
|
clif_skill_nodamage(src, *bl, skill_id, skill_lv);
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
clif_blown(bl);
|
clif_blown(bl);
|
||||||
|
|
||||||
// If caster is not a boss, switch coordinates with the target
|
// If caster is not a boss, switch coordinates with the target
|
||||||
@ -8036,7 +8036,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
case NPC_ALL_STAT_DOWN:
|
case NPC_ALL_STAT_DOWN:
|
||||||
status_change_start(src, bl, type, 10000, skill_lv, 0, 0, 0, skill_get_time(skill_id, skill_lv), SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF);
|
status_change_start(src, bl, type, 10000, skill_lv, 0, 0, 0, skill_get_time(skill_id, skill_lv), SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF);
|
||||||
clif_skill_nodamage(src, *bl, skill_id, skill_lv);
|
clif_skill_nodamage(src, *bl, skill_id, skill_lv);
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// EDP also give +25% WATK poison pseudo element to user.
|
// EDP also give +25% WATK poison pseudo element to user.
|
||||||
@ -8660,7 +8660,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
i = map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget,
|
i = map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget,
|
||||||
src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
||||||
if( !i && ( skill_id == RK_WINDCUTTER || skill_id == NC_AXETORNADO || skill_id == LG_CANNONSPEAR || skill_id == SR_SKYNETBLOW || skill_id == KO_HAPPOKUNAI ) )
|
if( !i && ( skill_id == RK_WINDCUTTER || skill_id == NC_AXETORNADO || skill_id == LG_CANNONSPEAR || skill_id == SR_SKYNETBLOW || skill_id == KO_HAPPOKUNAI ) )
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -8744,7 +8744,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
#if PACKETVER >= 20180207
|
#if PACKETVER >= 20180207
|
||||||
clif_skill_nodamage(src,*bl,skill_id,skill_lv);
|
clif_skill_nodamage(src,*bl,skill_id,skill_lv);
|
||||||
#else
|
#else
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
#endif
|
#endif
|
||||||
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
||||||
break;
|
break;
|
||||||
@ -9262,8 +9262,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
}
|
}
|
||||||
|
|
||||||
clif_skill_nodamage(src, *bl, skill_id, skill_lv);
|
clif_skill_nodamage(src, *bl, skill_id, skill_lv);
|
||||||
if (dstmd != nullptr)
|
clif_skill_estimation(sd, bl);
|
||||||
clif_skill_estimation( *sd, *dstmd );
|
|
||||||
if( skill_id == MER_ESTIMATION )
|
if( skill_id == MER_ESTIMATION )
|
||||||
sd = nullptr;
|
sd = nullptr;
|
||||||
break;
|
break;
|
||||||
@ -10683,7 +10682,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
case HAMI_CASTLE: //[orn]
|
case HAMI_CASTLE: //[orn]
|
||||||
if (src != bl && rnd_chance(20 * skill_lv, 100)) {
|
if (src != bl && rnd_chance(20 * skill_lv, 100)) {
|
||||||
// Get one of the monsters targeting the player and set the homunculus as its new target
|
// Get one of the monsters targeting the player and set the homunculus as its new target
|
||||||
if (block_list* tbl = battle_getenemy(bl, BL_MOB, AREA_SIZE); tbl != nullptr) {
|
if (block_list* tbl = battle_gettargeted(bl); tbl != nullptr && tbl->type == BL_MOB) {
|
||||||
if (unit_data* ud = unit_bl2ud(tbl); ud != nullptr)
|
if (unit_data* ud = unit_bl2ud(tbl); ud != nullptr)
|
||||||
unit_changetarget_sub(*ud, *src);
|
unit_changetarget_sub(*ud, *src);
|
||||||
}
|
}
|
||||||
@ -10866,7 +10865,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
case LG_EARTHDRIVE: {
|
case LG_EARTHDRIVE: {
|
||||||
int dummy = 1;
|
int dummy = 1;
|
||||||
|
|
||||||
clif_skill_damage( *src, *bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
i = skill_get_splash(skill_id,skill_lv);
|
i = skill_get_splash(skill_id,skill_lv);
|
||||||
map_foreachinallarea(skill_cell_overlap, src->m, src->x-i, src->y-i, src->x+i, src->y+i, BL_SKILL, LG_EARTHDRIVE, &dummy, src);
|
map_foreachinallarea(skill_cell_overlap, src->m, src->x-i, src->y-i, src->x+i, src->y+i, BL_SKILL, LG_EARTHDRIVE, &dummy, src);
|
||||||
map_foreachinrange(skill_area_sub, bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
|
map_foreachinrange(skill_area_sub, bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
|
||||||
@ -10980,7 +10979,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case GC_PHANTOMMENACE:
|
case GC_PHANTOMMENACE:
|
||||||
clif_skill_damage( *src, *bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
clif_skill_nodamage(src,*bl,skill_id,skill_lv);
|
clif_skill_nodamage(src,*bl,skill_id,skill_lv);
|
||||||
map_foreachinrange(skill_area_sub,src,skill_get_splash(skill_id,skill_lv),BL_CHAR,
|
map_foreachinrange(skill_area_sub,src,skill_get_splash(skill_id,skill_lv),BL_CHAR,
|
||||||
src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
|
src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
|
||||||
@ -11322,7 +11321,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case RA_FEARBREEZE:
|
case RA_FEARBREEZE:
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)));
|
clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -11363,7 +11362,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
|
|
||||||
case RA_SENSITIVEKEEN:
|
case RA_SENSITIVEKEEN:
|
||||||
clif_skill_nodamage(src,*bl,skill_id,skill_lv);
|
clif_skill_nodamage(src,*bl,skill_id,skill_lv);
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
map_foreachinrange(skill_area_sub,src,skill_get_splash(skill_id,skill_lv),BL_CHAR|BL_SKILL,src,skill_id,skill_lv,tick,flag|BCT_ENEMY,skill_castend_damage_id);
|
map_foreachinrange(skill_area_sub,src,skill_get_splash(skill_id,skill_lv),BL_CHAR|BL_SKILL,src,skill_id,skill_lv,tick,flag|BCT_ENEMY,skill_castend_damage_id);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -11405,7 +11404,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case NC_ANALYZE:
|
case NC_ANALYZE:
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
sc_start(src,bl,type, 30 + 12 * skill_lv,skill_lv,skill_get_time(skill_id,skill_lv));
|
sc_start(src,bl,type, 30 + 12 * skill_lv,skill_lv,skill_get_time(skill_id,skill_lv));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -11416,7 +11415,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
if (map_flag_vs(src->m)) // Doesn't affect the caster in non-PVP maps [exneval]
|
if (map_flag_vs(src->m)) // Doesn't affect the caster in non-PVP maps [exneval]
|
||||||
sc_start2(src, bl, type, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv));
|
sc_start2(src, bl, type, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv));
|
||||||
map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_nodamage_id);
|
map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_nodamage_id);
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -11536,7 +11535,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case LG_TRAMPLE:
|
case LG_TRAMPLE:
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
if (rnd()%100 < (25 + 25 * skill_lv))
|
if (rnd()%100 < (25 + 25 * skill_lv))
|
||||||
map_foreachinallrange(skill_destroy_trap,bl,skill_get_splash(skill_id,skill_lv),BL_SKILL,tick);
|
map_foreachinallrange(skill_destroy_trap,bl,skill_get_splash(skill_id,skill_lv),BL_SKILL,tick);
|
||||||
status_change_end(bl, SC_SV_ROOTTWIST);
|
status_change_end(bl, SC_SV_ROOTTWIST);
|
||||||
@ -11567,13 +11566,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
if( sc_start2(src,bl, type, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv))) {
|
if( sc_start2(src,bl, type, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv))) {
|
||||||
if( bl->type == BL_MOB )
|
if( bl->type == BL_MOB )
|
||||||
mob_unlocktarget((TBL_MOB*)bl,gettick());
|
mob_unlocktarget((TBL_MOB*)bl,gettick());
|
||||||
clif_bladestop( *src, bl->id, true );
|
clif_bladestop(src, bl->id, 1);
|
||||||
map_freeblock_unlock();
|
map_freeblock_unlock();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
count = map_forcountinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv), (sd)?sd->spiritball_old:15, // Assume 15 spiritballs in non-charactors
|
count = map_forcountinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv), (sd)?sd->spiritball_old:15, // Assume 15 spiritballs in non-charactors
|
||||||
BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id);
|
BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id);
|
||||||
if( sd ) pc_delspiritball(sd, count, 0);
|
if( sd ) pc_delspiritball(sd, count, 0);
|
||||||
@ -11589,13 +11588,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
if( sc_start2(src,bl, type, 50, skill_lv, src->id, skill_get_time(skill_id, skill_lv))) {
|
if( sc_start2(src,bl, type, 50, skill_lv, src->id, skill_get_time(skill_id, skill_lv))) {
|
||||||
if( bl->type == BL_MOB )
|
if( bl->type == BL_MOB )
|
||||||
mob_unlocktarget((TBL_MOB*)bl,gettick());
|
mob_unlocktarget((TBL_MOB*)bl,gettick());
|
||||||
clif_bladestop( *src, bl->id, true );
|
clif_bladestop(src, bl->id, 1);
|
||||||
map_freeblock_unlock();
|
map_freeblock_unlock();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
count = map_forcountinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv), (sd)?sd->spiritball_old:15, // Assume 15 spiritballs in non-charactors
|
count = map_forcountinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv), (sd)?sd->spiritball_old:15, // Assume 15 spiritballs in non-charactors
|
||||||
BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id);
|
BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id);
|
||||||
if( sd ) pc_delspiritball(sd, count, 0);
|
if( sd ) pc_delspiritball(sd, count, 0);
|
||||||
@ -11631,7 +11630,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
status_percent_heal(src, 0, i);
|
status_percent_heal(src, 0, i);
|
||||||
clif_skill_nodamage(src, *bl, skill_id, skill_lv, i != 0);
|
clif_skill_nodamage(src, *bl, skill_id, skill_lv, i != 0);
|
||||||
} else {
|
} else {
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|BCT_SELF|SD_SPLASH|1, skill_castend_nodamage_id);
|
map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|BCT_SELF|SD_SPLASH|1, skill_castend_nodamage_id);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -11919,7 +11918,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
status_change_end(bl, SC_DECREASEAGI);
|
status_change_end(bl, SC_DECREASEAGI);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, 1, DMG_SINGLE );
|
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, 1, DMG_SINGLE);
|
||||||
clif_skill_nodamage(src,*bl,skill_id,skill_lv);
|
clif_skill_nodamage(src,*bl,skill_id,skill_lv);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -12179,7 +12178,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
} else {
|
} else {
|
||||||
clif_skill_nodamage(src,*src,skill_id,skill_lv);
|
clif_skill_nodamage(src,*src,skill_id,skill_lv);
|
||||||
if (!(skill_id >= EM_EL_FLAMETECHNIC && skill_id <= EM_EL_DEADLY_POISON))
|
if (!(skill_id >= EM_EL_FLAMETECHNIC && skill_id <= EM_EL_DEADLY_POISON))
|
||||||
clif_skill_damage( *src, ( skill_id == EL_GUST || skill_id == EL_BLAST || skill_id == EL_WILD_STORM ) ? *src : *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, ( skill_id == EL_GUST || skill_id == EL_BLAST || skill_id == EL_WILD_STORM )?src:bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
if( skill_id == EL_WIND_STEP ) // There aren't teleport, just push the master away.
|
if( skill_id == EL_WIND_STEP ) // There aren't teleport, just push the master away.
|
||||||
skill_blown(src,bl,(rnd()%skill_get_blewcount(skill_id,skill_lv))+1,rnd()%8,BLOWN_NONE);
|
skill_blown(src,bl,(rnd()%skill_get_blewcount(skill_id,skill_lv))+1,rnd()%8,BLOWN_NONE);
|
||||||
sc_start(src,src,type2,100,skill_lv,skill_get_time(skill_id,skill_lv));
|
sc_start(src,src,type2,100,skill_lv,skill_get_time(skill_id,skill_lv));
|
||||||
@ -12192,7 +12191,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
case EL_WATER_BARRIER:
|
case EL_WATER_BARRIER:
|
||||||
case EL_ZEPHYR:
|
case EL_ZEPHYR:
|
||||||
case EL_POWER_OF_GAIA:
|
case EL_POWER_OF_GAIA:
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
skill_unitsetting(src,skill_id,skill_lv,bl->x,bl->y,0);
|
skill_unitsetting(src,skill_id,skill_lv,bl->x,bl->y,0);
|
||||||
break;
|
break;
|
||||||
case EL_WATER_SCREEN: {
|
case EL_WATER_SCREEN: {
|
||||||
@ -12207,7 +12206,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
status_change_end(src,type2);
|
status_change_end(src,type2);
|
||||||
} else {
|
} else {
|
||||||
// This not heals at the end.
|
// This not heals at the end.
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
sc_start(src,src,type2,100,skill_lv,skill_get_time(skill_id,skill_lv));
|
sc_start(src,src,type2,100,skill_lv,skill_get_time(skill_id,skill_lv));
|
||||||
sc_start(src,bl,type,100,src->id,skill_get_time(skill_id,skill_lv));
|
sc_start(src,bl,type,100,src->id,skill_get_time(skill_id,skill_lv));
|
||||||
}
|
}
|
||||||
@ -12312,7 +12311,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
|
|
||||||
clif_skill_nodamage(src,*bl,skill_id,skill_lv,
|
clif_skill_nodamage(src,*bl,skill_id,skill_lv,
|
||||||
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
|
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
|
||||||
clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
break;
|
break;
|
||||||
case KG_KAGEHUMI:
|
case KG_KAGEHUMI:
|
||||||
if( flag&1 ){
|
if( flag&1 ){
|
||||||
@ -12332,7 +12331,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id);
|
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id);
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
clif_skill_nodamage(src, *bl, skill_id, skill_lv);
|
clif_skill_nodamage(src, *bl, skill_id, skill_lv);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -13521,7 +13520,7 @@ TIMER_FUNC(skill_castend_id){
|
|||||||
clif_blown(src);
|
clif_blown(src);
|
||||||
clif_spiritball(src);
|
clif_spiritball(src);
|
||||||
}
|
}
|
||||||
clif_skill_damage( *src, *target, tick, sd->battle_status.amotion, 0, 0, 1, ud->skill_id, ud->skill_lv, DMG_SPLASH );
|
clif_skill_damage(src,target,tick,sd->battle_status.amotion,0,0,1,ud->skill_id,ud->skill_lv,DMG_SPLASH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -13743,7 +13742,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|||||||
if(skill_get_inf(skill_id)&INF_SELF_SKILL)
|
if(skill_get_inf(skill_id)&INF_SELF_SKILL)
|
||||||
clif_skill_nodamage(src,*src,skill_id,skill_lv);
|
clif_skill_nodamage(src,*src,skill_id,skill_lv);
|
||||||
else
|
else
|
||||||
clif_skill_poseffect( *src, skill_id, skill_lv, x, y, tick );
|
clif_skill_poseffect(src,skill_id,skill_lv,x,y,tick);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(skill_id)
|
switch(skill_id)
|
||||||
@ -13963,14 +13962,14 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|||||||
case NPC_CANE_OF_EVIL_EYE:
|
case NPC_CANE_OF_EVIL_EYE:
|
||||||
flag|=1;
|
flag|=1;
|
||||||
if(skill_unitsetting(src,skill_id,skill_lv,x,y,0))
|
if(skill_unitsetting(src,skill_id,skill_lv,x,y,0))
|
||||||
clif_skill_poseffect( *src, skill_id, skill_lv, x, y, tick );
|
clif_skill_poseffect(src,skill_id,skill_lv,x,y,tick);
|
||||||
break;
|
break;
|
||||||
case RG_GRAFFITI: /* Graffiti [Valaris] */
|
case RG_GRAFFITI: /* Graffiti [Valaris] */
|
||||||
skill_unitsetting(src,skill_id,skill_lv,x,y,0);
|
skill_unitsetting(src,skill_id,skill_lv,x,y,0);
|
||||||
flag|=1;
|
flag|=1;
|
||||||
break;
|
break;
|
||||||
case NPC_EARTHQUAKE:
|
case NPC_EARTHQUAKE:
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
skill_unitsetting(src, skill_id, skill_lv, x, y, 0);
|
skill_unitsetting(src, skill_id, skill_lv, x, y, 0);
|
||||||
break;
|
break;
|
||||||
#ifndef RENEWAL
|
#ifndef RENEWAL
|
||||||
@ -14074,7 +14073,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|||||||
#if PACKETVER >= 20111005
|
#if PACKETVER >= 20111005
|
||||||
clif_snap(src, src->x, src->y);
|
clif_snap(src, src->x, src->y);
|
||||||
#else
|
#else
|
||||||
clif_skill_poseffect( *src, skill_id, skill_lv, src->x, src->y, tick );
|
clif_skill_poseffect(src,skill_id,skill_lv,src->x,src->y,tick);
|
||||||
#endif
|
#endif
|
||||||
if (sd)
|
if (sd)
|
||||||
skill_blockpc_start (sd, MO_EXTREMITYFIST, 2000);
|
skill_blockpc_start (sd, MO_EXTREMITYFIST, 2000);
|
||||||
@ -14174,7 +14173,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|||||||
case HW_GANBANTEIN:
|
case HW_GANBANTEIN:
|
||||||
if (rnd()%100 < 80) {
|
if (rnd()%100 < 80) {
|
||||||
int dummy = 1;
|
int dummy = 1;
|
||||||
clif_skill_poseffect( *src, skill_id, skill_lv, x, y, tick );
|
clif_skill_poseffect(src,skill_id,skill_lv,x,y,tick);
|
||||||
i = skill_get_splash(skill_id, skill_lv);
|
i = skill_get_splash(skill_id, skill_lv);
|
||||||
map_foreachinallarea(skill_cell_overlap, src->m, x-i, y-i, x+i, y+i, BL_SKILL, HW_GANBANTEIN, &dummy, src);
|
map_foreachinallarea(skill_cell_overlap, src->m, x-i, y-i, x+i, y+i, BL_SKILL, HW_GANBANTEIN, &dummy, src);
|
||||||
} else {
|
} else {
|
||||||
@ -14199,7 +14198,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|||||||
clif_skill_fail( *sd, skill_id );
|
clif_skill_fail( *sd, skill_id );
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
clif_skill_poseffect( *src, skill_id, skill_lv, x, y, tick );
|
clif_skill_poseffect(src,skill_id,skill_lv,x,y,tick);
|
||||||
if (rnd()%100 < 50) {
|
if (rnd()%100 < 50) {
|
||||||
clif_skill_fail( *sd, skill_id );
|
clif_skill_fail( *sd, skill_id );
|
||||||
} else {
|
} else {
|
||||||
@ -14261,7 +14260,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|||||||
if (sce)
|
if (sce)
|
||||||
status_change_end(src, type); //Was under someone else's Gospel. [Skotlex]
|
status_change_end(src, type); //Was under someone else's Gospel. [Skotlex]
|
||||||
sc_start4(src,src,type,100,skill_lv,0,sg->group_id,BCT_SELF,skill_get_time(skill_id,skill_lv));
|
sc_start4(src,src,type,100,skill_lv,0,sg->group_id,BCT_SELF,skill_get_time(skill_id,skill_lv));
|
||||||
clif_skill_poseffect( *src, skill_id, skill_lv, 0, 0, tick ); // PA_GOSPEL music packet
|
clif_skill_poseffect(src, skill_id, skill_lv, 0, 0, tick); // PA_GOSPEL music packet
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NJ_TATAMIGAESHI:
|
case NJ_TATAMIGAESHI:
|
||||||
@ -14309,7 +14308,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|||||||
clif_skill_fail( *sd, skill_id, USESKILL_FAIL_GC_POISONINGWEAPON );
|
clif_skill_fail( *sd, skill_id, USESKILL_FAIL_GC_POISONINGWEAPON );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,DMG_SINGLE);
|
||||||
skill_unitsetting(src, skill_id, skill_lv, x, y, flag);
|
skill_unitsetting(src, skill_id, skill_lv, x, y, flag);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -14341,7 +14340,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|||||||
case RA_DETONATOR:
|
case RA_DETONATOR:
|
||||||
i = skill_get_splash(skill_id, skill_lv);
|
i = skill_get_splash(skill_id, skill_lv);
|
||||||
map_foreachinallarea(skill_detonator, src->m, x-i, y-i, x+i, y+i, BL_SKILL, src);
|
map_foreachinallarea(skill_detonator, src->m, x-i, y-i, x+i, y+i, BL_SKILL, src);
|
||||||
clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE );
|
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NC_NEUTRALBARRIER:
|
case NC_NEUTRALBARRIER:
|
||||||
@ -16707,9 +16706,9 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case UNT_FIRE_RAIN:
|
case UNT_FIRE_RAIN:
|
||||||
clif_skill_damage( *ss, *bl, tick, status_get_amotion(ss), 0,
|
clif_skill_damage(ss,bl,tick,status_get_amotion(ss),0,
|
||||||
skill_attack(skill_get_type(sg->skill_id),ss,&unit->bl,bl,sg->skill_id,sg->skill_lv,tick,SD_ANIMATION|SD_SPLASH),
|
skill_attack(skill_get_type(sg->skill_id),ss,&unit->bl,bl,sg->skill_id,sg->skill_lv,tick,SD_ANIMATION|SD_SPLASH),
|
||||||
1, sg->skill_id, sg->skill_lv, DMG_SINGLE );
|
1,sg->skill_id,sg->skill_lv,DMG_SINGLE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UNT_MAGMA_ERUPTION:
|
case UNT_MAGMA_ERUPTION:
|
||||||
@ -20466,7 +20465,7 @@ static int skill_trap_splash(struct block_list *bl, va_list ap)
|
|||||||
if (status_change_start(ss, bl, SC_ELECTRICSHOCKER, 10000, sg->skill_lv, sg->group_id, 0, 0, skill_get_time2(sg->skill_id, sg->skill_lv), SCSTART_NORATEDEF)) {
|
if (status_change_start(ss, bl, SC_ELECTRICSHOCKER, 10000, sg->skill_lv, sg->group_id, 0, 0, skill_get_time2(sg->skill_id, sg->skill_lv), SCSTART_NORATEDEF)) {
|
||||||
map_moveblock(bl, unit->bl.x, unit->bl.y, tick);
|
map_moveblock(bl, unit->bl.x, unit->bl.y, tick);
|
||||||
clif_fixpos( *bl );
|
clif_fixpos( *bl );
|
||||||
clif_skill_damage( *src, *bl, tick, 0, 0, -30000, 1, sg->skill_id, sg->skill_lv, DMG_SPLASH );
|
clif_skill_damage(src, bl, tick, 0, 0, -30000, 1, sg->skill_id, sg->skill_lv, DMG_SPLASH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -21490,9 +21489,9 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|||||||
|
|
||||||
if (src != nullptr) {
|
if (src != nullptr) {
|
||||||
if (group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2)
|
if (group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2)
|
||||||
clif_skill_poseffect( *src, group->skill_id, -1, bl->x, bl->y, tick ); // Don't yell a blank skill name.
|
clif_skill_poseffect(src, group->skill_id, -1, bl->x, bl->y, tick); // Don't yell a blank skill name.
|
||||||
else
|
else
|
||||||
clif_skill_poseffect( *src, group->skill_id, group->skill_lv, bl->x, bl->y, tick );
|
clif_skill_poseffect(src, group->skill_id, group->skill_lv, bl->x, bl->y, tick);
|
||||||
group->val2 = 1;
|
group->val2 = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1500,7 +1500,17 @@ enum e_skill {
|
|||||||
NPC_CANE_OF_EVIL_EYE,
|
NPC_CANE_OF_EVIL_EYE,
|
||||||
NPC_CURSE_OF_RED_CUBE,
|
NPC_CURSE_OF_RED_CUBE,
|
||||||
NPC_CURSE_OF_BLUE_CUBE,
|
NPC_CURSE_OF_BLUE_CUBE,
|
||||||
NPC_KILLING_AURA, // 783
|
NPC_KILLING_AURA,
|
||||||
|
ALL_EVENT_20TH_ANNIVERSARY,
|
||||||
|
NPC_TARGET_MARKER,
|
||||||
|
NPC_AIMED_SHOWER,
|
||||||
|
NPC_BLAZING_ERUPTION,
|
||||||
|
NPC_BLOCK_SEAL,
|
||||||
|
NPC_BLOCK_EXPLOSION,
|
||||||
|
NPC_FROST_FIELD,
|
||||||
|
NPC_LIGHTNING_JUDGEMENT,
|
||||||
|
NPC_GROGGY_ON,
|
||||||
|
NPC_RESET_EFST, //793
|
||||||
|
|
||||||
KN_CHARGEATK = 1001,
|
KN_CHARGEATK = 1001,
|
||||||
CR_SHRINK,
|
CR_SHRINK,
|
||||||
@ -2332,6 +2342,10 @@ enum e_skill {
|
|||||||
NW_THE_VIGILANTE_AT_NIGHT_GUN_SHOTGUN,
|
NW_THE_VIGILANTE_AT_NIGHT_GUN_SHOTGUN,
|
||||||
SS_FUUMAKOUCHIKU_BLASTING,
|
SS_FUUMAKOUCHIKU_BLASTING,
|
||||||
|
|
||||||
|
SS_FOUR_CHARM = 5499,
|
||||||
|
NW_WILD_SHOT,
|
||||||
|
NW_MIDNIGHT_FALLEN,
|
||||||
|
|
||||||
DK_DRAGONIC_BREATH = 6001,
|
DK_DRAGONIC_BREATH = 6001,
|
||||||
MT_SPARK_BLASTER,
|
MT_SPARK_BLASTER,
|
||||||
MT_TRIPLE_LASER,
|
MT_TRIPLE_LASER,
|
||||||
@ -2339,6 +2353,21 @@ enum e_skill {
|
|||||||
BO_EXPLOSIVE_POWDER,
|
BO_EXPLOSIVE_POWDER,
|
||||||
BO_MAYHEMIC_THORNS,
|
BO_MAYHEMIC_THORNS,
|
||||||
|
|
||||||
|
IG_RADIANT_SPEAR = 6503,
|
||||||
|
IG_IMPERIAL_CROSS,
|
||||||
|
|
||||||
|
MT_RUSH_STRIKE = 6506,
|
||||||
|
MT_POWERFUL_SWING,
|
||||||
|
MT_ENERGY_CANNONADE,
|
||||||
|
BO_MYSTERY_POWDER,
|
||||||
|
BO_DUST_EXPLOSION,
|
||||||
|
SHC_CROSS_SLASH,
|
||||||
|
ABC_HIT_AND_SLIDING,
|
||||||
|
ABC_CHASING_BREAK,
|
||||||
|
ABC_CHASING_SHOT,
|
||||||
|
|
||||||
|
TR_RHYTHMICAL_WAVE = 6521,
|
||||||
|
|
||||||
HLIF_HEAL = 8001,
|
HLIF_HEAL = 8001,
|
||||||
HLIF_AVOID,
|
HLIF_AVOID,
|
||||||
HLIF_BRAIN,
|
HLIF_BRAIN,
|
||||||
|
@ -3038,7 +3038,7 @@ void status_calc_pet_(struct pet_data *pd, uint8 opt)
|
|||||||
status_calc_misc(&pd->bl, &pd->status, lv);
|
status_calc_misc(&pd->bl, &pd->status, lv);
|
||||||
|
|
||||||
if (!(opt&SCO_FIRST)) // Not done the first time because the pet is not visible yet
|
if (!(opt&SCO_FIRST)) // Not done the first time because the pet is not visible yet
|
||||||
clif_send_petstatus( *sd, *pd );
|
clif_send_petstatus(sd);
|
||||||
}
|
}
|
||||||
} else if (opt&SCO_FIRST) {
|
} else if (opt&SCO_FIRST) {
|
||||||
status_calc_misc(&pd->bl, &pd->status, pd->db->lv);
|
status_calc_misc(&pd->bl, &pd->status, pd->db->lv);
|
||||||
@ -4914,7 +4914,7 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt)
|
|||||||
// Client doesn't delete unavailable skills even if we refresh the skill tree, individually delete them.
|
// Client doesn't delete unavailable skills even if we refresh the skill tree, individually delete them.
|
||||||
for (i = 0; i < MAX_SKILL; i++) {
|
for (i = 0; i < MAX_SKILL; i++) {
|
||||||
if (b_skill[i].id != 0 && sd->status.skill[i].id == 0)
|
if (b_skill[i].id != 0 && sd->status.skill[i].id == 0)
|
||||||
clif_deleteskill(sd, b_skill[i].id, true);
|
clif_deleteskill(*sd, b_skill[i].id, true);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
clif_skillinfoblock(sd);
|
clif_skillinfoblock(sd);
|
||||||
@ -13448,7 +13448,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
|
|||||||
tsc->getSCE(SC_BLADESTOP)->val4 = 0;
|
tsc->getSCE(SC_BLADESTOP)->val4 = 0;
|
||||||
status_change_end(tbl, SC_BLADESTOP);
|
status_change_end(tbl, SC_BLADESTOP);
|
||||||
}
|
}
|
||||||
clif_bladestop( *bl, tid2, false );
|
clif_bladestop(bl, tid2, 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SC_DANCING:
|
case SC_DANCING:
|
||||||
@ -13697,7 +13697,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
|
|||||||
status_change *sc2 = status_get_sc(src);
|
status_change *sc2 = status_get_sc(src);
|
||||||
|
|
||||||
if( sc2 && sc2->getSCE(SC_CURSEDCIRCLE_ATKER) && --(sc2->getSCE(SC_CURSEDCIRCLE_ATKER)->val2) == 0 ) {
|
if( sc2 && sc2->getSCE(SC_CURSEDCIRCLE_ATKER) && --(sc2->getSCE(SC_CURSEDCIRCLE_ATKER)->val2) == 0 ) {
|
||||||
clif_bladestop( *bl, sce->val2, false );
|
clif_bladestop(bl, sce->val2, 0);
|
||||||
status_change_end(src, SC_CURSEDCIRCLE_ATKER);
|
status_change_end(src, SC_CURSEDCIRCLE_ATKER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -15090,7 +15090,7 @@ int status_change_timer_sub(struct block_list* bl, va_list ap)
|
|||||||
break;
|
break;
|
||||||
case SC_CURSEDCIRCLE_TARGET:
|
case SC_CURSEDCIRCLE_TARGET:
|
||||||
if( tsc && tsc->getSCE(SC_CURSEDCIRCLE_TARGET) && tsc->getSCE(SC_CURSEDCIRCLE_TARGET)->val2 == src->id ) {
|
if( tsc && tsc->getSCE(SC_CURSEDCIRCLE_TARGET) && tsc->getSCE(SC_CURSEDCIRCLE_TARGET)->val2 == src->id ) {
|
||||||
clif_bladestop( *bl, tsc->getSCE(SC_CURSEDCIRCLE_TARGET)->val2, false );
|
clif_bladestop(bl, tsc->getSCE(SC_CURSEDCIRCLE_TARGET)->val2, 0);
|
||||||
status_change_end(bl, type);
|
status_change_end(bl, type);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user