summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt2
-rw-r--r--db/item_db.txt4
-rw-r--r--db/mob_skill_db.txt28
-rw-r--r--db/skill_db.txt4
-rw-r--r--src/map/battle.c3
-rw-r--r--src/map/skill.c21
-rw-r--r--src/map/status.c2
7 files changed, 41 insertions, 23 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 19c3760c8..fe0e94c80 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -3,6 +3,8 @@ Date Added
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
+09/10/26
+ * Implemented NPC_VAMPIREGIFT and NPC_WIDESOULDRAIN. [Inkfish]
09/10/25
* Rev. 14101 The status SC_INVINCIBLE now reduces all damage to 1. [L0ne_W0lf]
- Official behavior, and allows players to cancel NPC_ALLHEAL casts.
diff --git a/db/item_db.txt b/db/item_db.txt
index 7570d9823..470acc6fd 100644
--- a/db/item_db.txt
+++ b/db/item_db.txt
@@ -536,7 +536,7 @@
1183,BF_Two_Handed_Sword1,Brave Assaulter's Katzbalger,4,,,0,200,,1,0,0x00004082,7,2,34,3,80,1,3,{ bonus bStr,2; bonus2 bAddRace,RC_DemiHuman,55; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; },{},{}
1184,BF_Two_Handed_Sword2,Valorous Assaulter's Katzbalger,4,,,0,200,,1,0,0x00004082,7,2,34,3,80,1,3,{ bonus bCritical,20; bonus2 bAddRace,RC_DemiHuman,55; bonus bCritAtkRate,20; bonus bUnbreakableWeapon,0; },{},{}
1185,Violet_Fear,Violet Fear,4,,,2200,275,,1,2,0x00004082,2,2,34,4,80,1,3,{ bonus3 bAutoSpell,"WZ_METEOR",3,30; bonus3 bAutoSpell,"WZ_FROSTNOVA",5,50; autobonus "{ bonus bIgnoreDefRace,RC_NonBoss; }",50,5000; },{},{}
-1186,Death_Guidance,Death Guidance,4,20,,2000,200,,1,2,0x00004082,2,2,34,4,70,1,3,{ bonus bStr,5; bonus bAgi,2; bonus bFlee2,20; bonus3 bAutoSpell,"NPC_HELLPOWER",1,10; bonus3 bAutoSpell,"NPC_HELLPOWER",1,10; },{},{}
+1186,Death_Guidance,Death Guidance,4,20,,2000,200,,1,2,0x00004082,2,2,34,4,70,1,3,{ bonus bStr,5; bonus bAgi,2; bonus bFlee2,20; bonus3 bAutoSpell,"NPC_HELLPOWER",1,10; bonus4 bAutoSpell,"NPC_HELLPOWER",1,10,1; if( getrefine() > 8 ) bonus3 bAutoSpell,"NPC_VAMPIRE_GIFT",2,20; else bonus3 bAutoSpell,"NPC_VAMPIRE_GIFT",1,20; },{},{}
1187,Krieger_Twohand_Sword1,Glorious Claymore,4,0,,0,220,,1,0,0x00004082,7,2,34,4,80,1,3,{ bonus2 bAddRace,RC_DemiHuman,70; bonus2 bIgnoreDefRate,RC_DemiHuman,25; bonus bUnbreakableWeapon,0; if(getrefine() > 5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-3)*(getrefine()-3); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine() > 8) { bonus3 bAutoSpell,"LK_CONCENTRATION",getskilllv("LK_CONCENTRATION")>1?getskilllv("LK_CONCENTRATION"):1,30; bonus3 bAutoSpell,"LK_AURABLADE",getskilllv("LK_AURABLADE")>1?getskilllv("LK_AURABLADE"):1,30; } },{},{}
//1188,Veteran_Sword
//1189,Krasnaya
@@ -872,7 +872,7 @@
1634,BF_Staff3,Strong Recovery Wand,4,0,,0,70,,1,0,0x00818314,7,2,2,3,80,1,10,{ bonus bMatkRate,15; bonus bHealPower,14; bonus2 bSPRegenRate,5,10000; bonus bUnbreakableWeapon,0; },{},{}
1635,BF_Staff4,Speedy Recovery Wand,4,0,,0,70,,1,0,0x00818314,7,2,2,3,80,1,10,{ bonus bInt,3; bonus bDex,2; bonus bMatkRate,15; bonus bDelayRate,-15; bonus2 bSPRegenRate,5,10000; bonus bUnbreakableWeapon,0; },{},{}
1636,Thorn_Staff,Thorn Staff of Darkness,4,20,,700,60,,1,0,0x00018314,2,2,34,4,75,1,10,{ bonus bInt,3; bonus bDex,3; bonus bMatkRate,20; bonus bIgnoreMdefRate,getrefine(); bonus bDelayRate,-(getrefine()*3/2); },{},{}
-1637,Eraser,Eraser,4,20,,500,80,,1,0,0x00018314,2,2,2,4,70,1,10,{ bonus bMatkRate,20; bonus bInt,3; bonus bDex,2; bonus bSPrecovRate,8; },{},{}
+1637,Eraser,Eraser,4,20,,500,80,,1,0,0x00018314,2,2,2,4,70,1,10,{ bonus bMatkRate,20; bonus bInt,3; bonus bDex,2; bonus bSPrecovRate,8; if( getrefine() > 9 ) bonus5 bAutoSpell,"NPC_WIDESOULDRAIN",3,5,BF_MAGIC,0; else bonus5 bAutoSpell,"NPC_WIDESOULDRAIN",1,5,BF_MAGIC,0; },{},{}
1638,Healing_Staff_C,Recovery Staff,4,20,,400,10,,1,0,0x00008110,7,2,2,3,55,1,10,{ bonus bAtkEle,Ele_Holy; bonus bMatkRate,15; bonus bHealPower,(getrefine()*3/2); },{},{}
1639,N_Rod,Novice_Rod,4,1,,0,15,,1,0,0x00818315,7,2,2,1,1,0,10,{ bonus bMatkRate,16; },{},{}
1640,Krieger_Onehand_Staff1,Glorious Arc Wand,4,0,,0,70,,1,0,0x00018314,7,2,2,4,80,1,10,{ bonus2 bMagicAddRace,RC_DemiHuman,15; bonus2 bIgnoreMdefRate,RC_DemiHuman,25; bonus bUnbreakableWeapon,0; if(getrefine() > 5) bonus2 bIgnoreMdefRate,RC_DemiHuman,5; if(getrefine() > 8) { bonus bMatkRate,5; bonus bCastrate,-5; bonus bDelayRate,-5; } },{},{}
diff --git a/db/mob_skill_db.txt b/db/mob_skill_db.txt
index fdfc77d8f..5f106ee01 100644
--- a/db/mob_skill_db.txt
+++ b/db/mob_skill_db.txt
@@ -4501,7 +4501,7 @@
1867,Banshee@NPC_CRITICALWOUND,attack,673,2,500,0,5000,yes,target,always,0,,,,,,
1867,Banshee@NPC_DARKSTRIKE,chase,340,9,2000,0,5000,yes,target,always,0,,,,,,
1867,Banshee@NPC_DARKSTRIKE,attack,340,9,2000,0,5000,yes,target,always,0,,,,,,
-//1867,Banshee@NPC_VAMPIRE_GIFT,attack,679,1,500,0,5000,yes,self,always,0,,,,,,
+1867,Banshee@NPC_VAMPIRE_GIFT,attack,679,1,500,0,5000,yes,self,always,0,,,,,,
1867,Banshee@NPC_DARKNESSATTACK,attack,190,3,1000,0,5000,yes,target,always,0,,,,,,21
1867,Banshee@NPC_EVILLAND,attack,670,1,500,0,5000,yes,target,always,0,,,,,,
1867,Banshee@NPC_EMOTION,chase,197,1,1000,0,5000,yes,self,always,0,7,0x81,,,,
@@ -4511,7 +4511,7 @@
1868,Banshee@NPC_CRITICALWOUND,attack,673,2,500,0,5000,yes,target,always,0,,,,,,
1868,Banshee@NPC_DARKSTRIKE,chase,340,9,2000,0,5000,yes,target,always,0,,,,,,
1868,Banshee@NPC_DARKSTRIKE,attack,340,9,2000,0,5000,yes,target,always,0,,,,,,
-//1868,Banshee@NPC_VAMPIRE_GIFT,attack,679,1,500,0,5000,yes,self,always,0,,,,,,
+1868,Banshee@NPC_VAMPIRE_GIFT,attack,679,1,500,0,5000,yes,self,always,0,,,,,,
1868,Banshee@NPC_DARKNESSATTACK,attack,190,3,1000,0,5000,yes,target,always,0,,,,,,21
1868,Banshee@NPC_EMOTION,chase,197,1,1000,0,5000,yes,self,always,0,7,0x81,,,,
1868,Banshee@NPC_EMOTION,idle,197,1,2000,0,5000,yes,self,always,0,NEED_EMO,0x3095,,,,
@@ -4567,7 +4567,7 @@
1871,Falling Bishop@NPC_GRANDDARKNESS,attack,339,10,500,1300,5000,no,self,always,0,,,,,,
1871,Falling Bishop@CR_GRANDCROSS,chase,254,10,500,1000,5000,no,self,always,0,,,,,,
1871,Falling Bishop@CR_GRANDCROSS,attack,254,10,500,1000,5000,no,self,always,0,,,,,,
-//1871,Falling Bishop@NPC_VAMPIRE_GIFT,attack,679,2,500,0,5000,yes,self,always,0,,,,,,
+1871,Falling Bishop@NPC_VAMPIRE_GIFT,attack,679,2,500,0,5000,yes,self,always,0,,,,,,
1871,Falling Bishop@NPC_SLOWCAST,chase,672,5,2000,300,30000,no,self,always,0,,,,,,36
1871,Falling Bishop@NPC_SLOWCAST,attack,672,5,2000,800,30000,no,self,always,0,,,,,,36
1871,Falling Bishop@NPC_EVILLAND,attack,670,10,10000,1000,600000,no,target,myhpltmaxrate,44,,,,,,
@@ -4611,7 +4611,7 @@
1873,Beelzebub@NPC_HELLJUDGEMENT,attack,662,5,10000,700,15000,no,self,always,0,,,,,,
1873,Beelzebub@NPC_HELLJUDGEMENT,chase,662,5,10000,700,15000,no,self,always,0,,,,,,
1873,Beelzebub@NPC_EXPULSION,attack,674,1,100,1000,30000,no,target,always,0,,,,,,
-//1873,Beelzebub@NPC_VAMPIRE_GIFT,attack,679,10,10000,1000,10000,no,self,myhpltmaxrate,70,,,,,,47
+1873,Beelzebub@NPC_VAMPIRE_GIFT,attack,679,10,10000,1000,10000,no,self,myhpltmaxrate,70,,,,,,47
1873,Beelzebub@NPC_AGIUP,attack,350,5,10000,0,30000,yes,self,myhpltmaxrate,60,,,,,,
1873,Beelzebub@NPC_AGIUP,chase,350,5,10000,0,30000,yes,self,myhpltmaxrate,60,,,,,,
1874,Beelzebub@NPC_RUN,attack,354,1,10000,0,0,yes,self,myhpltmaxrate,1,,,,,,26
@@ -4643,8 +4643,8 @@
1874,Beelzebub@NPC_HELLJUDGEMENT,attack,662,2,2000,500,5000,no,self,always,0,,,,,,
1874,Beelzebub@NPC_ACIDBREATH,attack,657,1,2000,1000,5000,no,target,always,0,,,,,,
1874,Beelzebub@NPC_ACIDBREATH,chase,657,1,2000,1000,5000,no,target,always,0,,,,,,
-//1874,Beelzebub@NPC_VAMPIRE_GIFT,attack,679,1,1000,500,5000,no,self,myhpltmaxrate,50,,,,,,47
-//1874,Beelzebub@NPC_WIDESOULDRAIN,attack,680,7,1000,500,5000,no,self,myhpltmaxrate,50,,,,,,42
+1874,Beelzebub@NPC_VAMPIRE_GIFT,attack,679,1,1000,500,5000,no,self,myhpltmaxrate,50,,,,,,47
+1874,Beelzebub@NPC_WIDESOULDRAIN,attack,680,7,1000,500,5000,no,self,myhpltmaxrate,50,,,,,,42
1875,Tristan@NPC_BLOODDRAIN,attack,199,1,2000,0,5000,yes,target,always,0,,,,,,
// Moscovia (12.1)
@@ -4735,10 +4735,10 @@
1916,Satan Morroc@NPC_WIDESTONE,attack,666,5,10000,0,60000,yes,self,myhpltmaxrate,40,,,,,,
1916,Satan Morroc@WZ_METEOR,chase,83,5,10000,800,60000,no,target,myhpltmaxrate,40,,,,,,
1916,Satan Morroc@WZ_METEOR,attack,83,5,10000,800,60000,no,target,myhpltmaxrate,40,,,,,,
-//1916,Satan Morroc@NPC_VAMPIRE_GIFT,chase,679,9,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
-//1916,Satan Morroc@NPC_VAMPIRE_GIFT,attack,679,9,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
-//1916,Satan Morroc@NPC_WIDESOULDRAIN,chase,680,10,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
-//1916,Satan Morroc@NPC_WIDESOULDRAIN,attack,680,10,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
+1916,Satan Morroc@NPC_VAMPIRE_GIFT,chase,679,9,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
+1916,Satan Morroc@NPC_VAMPIRE_GIFT,attack,679,9,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
+1916,Satan Morroc@NPC_WIDESOULDRAIN,chase,680,10,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
+1916,Satan Morroc@NPC_WIDESOULDRAIN,attack,680,10,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
1916,Satan Morroc@NPC_EVILLAND,chase,670,10,10000,1000,50000,no,target,myhpltmaxrate,50,,,,,,
1916,Satan Morroc@NPC_EVILLAND,attack,670,10,10000,1000,50000,no,target,myhpltmaxrate,50,,,,,,
1916,Satan Morroc@NPC_WIDESLEEP,chase,668,5,10000,700,35000,no,self,myhpltmaxrate,60,,,,,,
@@ -4784,10 +4784,10 @@
1917,Wounded Morroc@NPC_WIDESTONE,attack,666,5,10000,0,60000,yes,self,myhpltmaxrate,40,,,,,,
1917,Wounded Morroc@WZ_METEOR,chase,83,5,10000,800,60000,no,target,myhpltmaxrate,40,,,,,,
1917,Wounded Morroc@WZ_METEOR,attack,83,5,10000,800,60000,no,target,myhpltmaxrate,40,,,,,,
-//1917,Wounded Morroc@NPC_VAMPIRE_GIFT,chase,679,9,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
-//1917,Wounded Morroc@NPC_VAMPIRE_GIFT,attack,679,9,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
-//1917,Wounded Morroc@NPC_WIDESOULDRAIN,chase,680,10,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
-//1917,Wounded Morroc@NPC_WIDESOULDRAIN,attack,680,10,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
+1917,Wounded Morroc@NPC_VAMPIRE_GIFT,chase,679,9,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
+1917,Wounded Morroc@NPC_VAMPIRE_GIFT,attack,679,9,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
+1917,Wounded Morroc@NPC_WIDESOULDRAIN,chase,680,10,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
+1917,Wounded Morroc@NPC_WIDESOULDRAIN,attack,680,10,10000,1000,50000,no,self,myhpltmaxrate,50,,,,,,
1917,Wounded Morroc@NPC_EVILLAND,chase,670,10,10000,1000,50000,no,target,myhpltmaxrate,50,,,,,,
1917,Wounded Morroc@NPC_EVILLAND,attack,670,10,10000,1000,50000,no,target,myhpltmaxrate,50,,,,,,
1917,Wounded Morroc@NPC_WIDESLEEP,chase,668,5,10000,700,35000,no,self,myhpltmaxrate,60,,,,,,
diff --git a/db/skill_db.txt b/db/skill_db.txt
index cc334e7f5..1ac05b8b5 100644
--- a/db/skill_db.txt
+++ b/db/skill_db.txt
@@ -614,8 +614,8 @@
676,0,6,4,0,0x1,0,5,1,no,0,0x2,0,magic,0, NPC_ANTIMAGIC,Anti Magic
677,0,6,4,0,0x3,2:5:8:11:14,5,1,no,0,0x2,0,none,0, NPC_WIDECURSE,Wide Curse
678,0,6,4,0,0x3,2:5:8:11:14,5,1,no,0,0x2,0,none,0, NPC_WIDESTUN,Wide Stun
-679,0,0,4,0,0x1,0,10,1,no,0,0x2,0,none,0, NPC_VAMPIRE_GIFT,Vampire Gift
-680,0,0,4,0,0x1,0,10,1,no,0,0x2,0,none,0, NPC_WIDESOULDRAIN,Wide Soul Drain
+679,0,6,4,0,0x2,5:7:9:11:13:13:13:13:13:13,10,1,no,0,0x2,0,weapon,0, NPC_VAMPIRE_GIFT,Vampire Gift
+680,0,6,4,0,0x3,5:7:9:11:13:13:13:13:13:13,10,1,no,0,0x2,0,none,0, NPC_WIDESOULDRAIN,Wide Soul Drain
// Cash Shop Skill
681,0,0,0,0,0,0,10,0,no,0,0x1,0,none,0, ALL_INCCARRY,Increase Weight Limit R
diff --git a/src/map/battle.c b/src/map/battle.c
index a1105420a..e1ee7afa9 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -1674,6 +1674,9 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
case HFLI_SBR44: //[orn]
skillratio += 100 *(skill_lv-1);
break;
+ case NPC_VAMPIRE_GIFT:
+ skillratio += ((skill_lv-1)%5+1)*100;
+ break;
}
ATK_RATE(skillratio);
diff --git a/src/map/skill.c b/src/map/skill.c
index ba897b7c2..a36168191 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -2786,18 +2786,24 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
case NPC_EARTHQUAKE:
case NPC_PULSESTRIKE:
case NPC_HELLJUDGEMENT:
+ case NPC_VAMPIRE_GIFT:
if( flag&1 )
{ //Recursive invocation
// skill_area_temp[0] holds number of targets in area
// skill_area_temp[1] holds the id of the original target
// skill_area_temp[2] counts how many targets have already been processed
- int sflag = skill_area_temp[0] & 0xFFF;
+ int sflag = skill_area_temp[0] & 0xFFF, heal;
if( flag&SD_LEVEL )
sflag |= SD_LEVEL; // -1 will be used in packets instead of the skill level
if( skill_area_temp[1] != bl->id && !(skill_get_inf2(skillid)&INF2_NPC_SKILL) )
sflag |= SD_ANIMATION; // original target gets no animation (as well as all NPC skills)
- skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, sflag);
+ heal = skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, sflag);
+ if( skillid == NPC_VAMPIRE_GIFT && heal > 0 )
+ {
+ clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1);
+ status_heal(src,heal,0,0);
+ }
}
else
{
@@ -3155,7 +3161,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
if(status_isdead(src))
return 1;
- if(src!=bl && status_isdead(bl) && skillid != ALL_RESURRECTION && skillid != PR_REDEMPTIO)
+ if( src != bl && status_isdead(bl) && skillid != ALL_RESURRECTION && skillid != PR_REDEMPTIO && skillid != NPC_WIDESOULDRAIN )
return 1;
tstatus = status_get_status_data(bl);
@@ -3961,6 +3967,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
case GS_SPREADATTACK:
case NPC_EARTHQUAKE:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ case NPC_VAMPIRE_GIFT:
case NPC_HELLJUDGEMENT:
case NPC_PULSESTRIKE:
skill_castend_damage_id(src, src, skillid, skilllv, tick, flag);
@@ -5663,8 +5670,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
case NPC_WIDESTUN:
case NPC_SLOWCAST:
case NPC_WIDEHELLDIGNITY:
+ case NPC_WIDESOULDRAIN:
if (flag&1)
- sc_start(bl,type,100,skilllv,skill_get_time2(skillid,skilllv));
+ {
+ if( skillid == NPC_WIDESOULDRAIN )
+ status_percent_damage(src,bl,0,((skilllv-1)%5+1)*20,false);
+ else
+ sc_start(bl,type,100,skilllv,skill_get_time2(skillid,skilllv));
+ }
else {
skill_area_temp[2] = 0; //For SD_PREAMBLE
clif_skill_nodamage(src,bl,skillid,skilllv,1);
diff --git a/src/map/status.c b/src/map/status.c
index 84c396a9a..36bacf47d 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -654,7 +654,7 @@ int status_damage(struct block_list *src,struct block_list *target,int hp, int s
status = status_get_status_data(target);
- if (status == &dummy_status || !status->hp)
+ if( status == &dummy_status || (!status->hp && hp) )
return 0; //Invalid targets: no damage or dead
// Let through. battle.c/skill.c have the whole logic of when it's possible or