Compare commits
12 Commits
hotfix/iss
...
hotfix/swo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8291fce243 | ||
|
|
873600fd8b | ||
|
|
999daa6e47 | ||
|
|
e83252bc69 | ||
|
|
e00e97c401 | ||
|
|
347e138687 | ||
|
|
81894eeba6 | ||
|
|
9eff7be9cd | ||
|
|
82c37ce32d | ||
|
|
c70bc39751 | ||
|
|
eb4658f940 | ||
|
|
03f07ab8c7 |
@@ -175,19 +175,3 @@ feature.stylist: on
|
||||
// If this is allowed the "nosave" mapflag is still being respected
|
||||
// and may prevent players from warping back into the instance.
|
||||
//feature.instance_allow_reconnect: yes
|
||||
|
||||
// Enable the Gold PC timer? (Note 1)
|
||||
// Default: yes
|
||||
feature.goldpc_active: yes
|
||||
|
||||
// How many seconds does a player have to be online to receive a point?
|
||||
// Default: 3600 (1h)
|
||||
feature.goldpc_time: 3600
|
||||
|
||||
// How many points can a player have at maximum?
|
||||
// Default: 300
|
||||
feature.goldpc_max_points: 300
|
||||
|
||||
// Should being VIP double the points a player gets? (Note 1)
|
||||
// Default: yes
|
||||
feature.goldpc_vip: yes
|
||||
|
||||
@@ -4998,7 +4998,7 @@ Body:
|
||||
TargetType: Attack
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
IgnoreElement: true
|
||||
IgnoreAtkCard: true
|
||||
IgnoreFlee: true
|
||||
Range: 1
|
||||
Hit: Single
|
||||
@@ -5013,26 +5013,47 @@ Body:
|
||||
CastTime: 1000
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 5000
|
||||
Time: 11000
|
||||
- Level: 2
|
||||
Time: 5500
|
||||
Time: 10000
|
||||
- Level: 3
|
||||
Time: 6000
|
||||
Time: 9000
|
||||
- Level: 4
|
||||
Time: 6500
|
||||
Time: 8000
|
||||
- Level: 5
|
||||
Time: 7000
|
||||
- Level: 6
|
||||
Time: 7500
|
||||
Time: 6000
|
||||
- Level: 7
|
||||
Time: 8000
|
||||
Time: 5000
|
||||
- Level: 8
|
||||
Time: 8500
|
||||
Time: 4000
|
||||
- Level: 9
|
||||
Time: 9000
|
||||
Time: 3000
|
||||
- Level: 10
|
||||
Time: 9500
|
||||
Time: 2000
|
||||
Duration2: 60000
|
||||
Cooldown:
|
||||
- Level: 1
|
||||
Time: 7500
|
||||
- Level: 2
|
||||
Time: 8000
|
||||
- Level: 3
|
||||
Time: 8500
|
||||
- Level: 4
|
||||
Time: 9000
|
||||
- Level: 5
|
||||
Time: 9500
|
||||
- Level: 6
|
||||
Time: 10000
|
||||
- Level: 7
|
||||
Time: 10500
|
||||
- Level: 8
|
||||
Time: 11000
|
||||
- Level: 9
|
||||
Time: 11500
|
||||
- Level: 10
|
||||
Time: 12000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@@ -5805,8 +5826,8 @@ Body:
|
||||
- Id: 192
|
||||
Name: NPC_MAGICALATTACK
|
||||
Description: Demon Shock Attack
|
||||
MaxLevel: 10
|
||||
Type: Weapon
|
||||
MaxLevel: 1
|
||||
Type: Magic
|
||||
TargetType: Attack
|
||||
Flags:
|
||||
IsNpc: true
|
||||
@@ -5912,34 +5933,13 @@ Body:
|
||||
Name: NPC_KEEPING
|
||||
Description: Keeping
|
||||
MaxLevel: 1
|
||||
Type: Weapon
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Flags:
|
||||
IsNpc: true
|
||||
HitCount: 1
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 60000
|
||||
- Level: 2
|
||||
Time: 70000
|
||||
- Level: 3
|
||||
Time: 80000
|
||||
- Level: 4
|
||||
Time: 90000
|
||||
- Level: 5
|
||||
Time: 100000
|
||||
- Level: 6
|
||||
Time: 110000
|
||||
- Level: 7
|
||||
Time: 120000
|
||||
- Level: 8
|
||||
Time: 130000
|
||||
- Level: 9
|
||||
Time: 140000
|
||||
- Level: 10
|
||||
Time: 150000
|
||||
Duration1: 30000
|
||||
Status: Keeping
|
||||
- Id: 202
|
||||
Name: NPC_DARKBREATH
|
||||
@@ -5979,60 +5979,19 @@ Body:
|
||||
Flags:
|
||||
IsNpc: true
|
||||
HitCount: 1
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 60000
|
||||
- Level: 2
|
||||
Time: 70000
|
||||
- Level: 3
|
||||
Time: 80000
|
||||
- Level: 4
|
||||
Time: 90000
|
||||
- Level: 5
|
||||
Time: 100000
|
||||
- Level: 6
|
||||
Time: 110000
|
||||
- Level: 7
|
||||
Time: 120000
|
||||
- Level: 8
|
||||
Time: 130000
|
||||
- Level: 9
|
||||
Time: 140000
|
||||
- Level: 10
|
||||
Time: 150000
|
||||
Duration1: 15000
|
||||
Status: Barrier
|
||||
- Id: 205
|
||||
Name: NPC_DEFENDER
|
||||
Description: Defender
|
||||
MaxLevel: 1
|
||||
Type: Weapon
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Flags:
|
||||
IsNpc: true
|
||||
HitCount: 1
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 60000
|
||||
- Level: 2
|
||||
Time: 70000
|
||||
- Level: 3
|
||||
Time: 80000
|
||||
- Level: 4
|
||||
Time: 90000
|
||||
- Level: 5
|
||||
Time: 100000
|
||||
- Level: 6
|
||||
Time: 110000
|
||||
- Level: 7
|
||||
Time: 120000
|
||||
- Level: 8
|
||||
Time: 130000
|
||||
- Level: 9
|
||||
Time: 140000
|
||||
- Level: 10
|
||||
Time: 150000
|
||||
Duration1: 15000
|
||||
Status: Armor
|
||||
- Id: 206
|
||||
Name: NPC_LICK
|
||||
@@ -9398,8 +9357,7 @@ Body:
|
||||
- Id: 349
|
||||
Name: NPC_POWERUP
|
||||
Description: Power Up
|
||||
MaxLevel: 10
|
||||
Type: Weapon
|
||||
MaxLevel: 5
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
@@ -9408,19 +9366,19 @@ Body:
|
||||
Hit: Single
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 10000
|
||||
Time: 5000
|
||||
- Level: 2
|
||||
Time: 15000
|
||||
Time: 10000
|
||||
- Level: 3
|
||||
Time: 20000
|
||||
Time: 15000
|
||||
- Level: 4
|
||||
Time: 25000
|
||||
Time: 20000
|
||||
- Level: 5
|
||||
Time: 30000
|
||||
Status: IncHitRate
|
||||
Time: 25000
|
||||
Status: Powerup
|
||||
- Id: 350
|
||||
Name: NPC_AGIUP
|
||||
Description: Agility UP
|
||||
Description: Agility Up
|
||||
MaxLevel: 10
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
@@ -9432,14 +9390,24 @@ Body:
|
||||
- Level: 1
|
||||
Time: 10000
|
||||
- Level: 2
|
||||
Time: 15000
|
||||
- Level: 3
|
||||
Time: 20000
|
||||
- Level: 4
|
||||
Time: 25000
|
||||
- Level: 5
|
||||
- Level: 3
|
||||
Time: 30000
|
||||
Status: IncFleeRate
|
||||
- Level: 4
|
||||
Time: 40000
|
||||
- Level: 5
|
||||
Time: 50000
|
||||
- Level: 6
|
||||
Time: 60000
|
||||
- Level: 7
|
||||
Time: 70000
|
||||
- Level: 8
|
||||
Time: 80000
|
||||
- Level: 9
|
||||
Time: 90000
|
||||
- Level: 10
|
||||
Time: 100000
|
||||
Status: Agiup
|
||||
- Id: 351
|
||||
Name: NPC_SIEGEMODE
|
||||
Description: Siege Mode
|
||||
@@ -16995,32 +16963,13 @@ Body:
|
||||
Skill:
|
||||
Plagiarism: true
|
||||
Reproduce: true
|
||||
Duration2:
|
||||
- Level: 1
|
||||
Time: 15000
|
||||
- Level: 2
|
||||
Time: 20000
|
||||
- Level: 3
|
||||
Time: 25000
|
||||
- Level: 4
|
||||
Time: 30000
|
||||
- Level: 5
|
||||
Time: 35000
|
||||
- Level: 6
|
||||
Time: 40000
|
||||
- Level: 7
|
||||
Time: 45000
|
||||
- Level: 8
|
||||
Time: 50000
|
||||
- Level: 9
|
||||
Time: 55000
|
||||
- Level: 10
|
||||
Time: 60000
|
||||
Duration2: 60000
|
||||
Requires:
|
||||
SpCost: 15
|
||||
Ammo:
|
||||
Dagger: true
|
||||
AmmoAmount: 1
|
||||
Status: Poison
|
||||
- Id: 1005
|
||||
Name: RG_CLOSECONFINE
|
||||
Description: Close Confine
|
||||
|
||||
@@ -1130,6 +1130,8 @@ Body:
|
||||
Watk_Element: true
|
||||
- Status: Armor
|
||||
DurationLookup: NPC_DEFENDER
|
||||
CalcFlags:
|
||||
Speed: true
|
||||
- Status: Armor_Element_Water
|
||||
Icon: EFST_RESIST_PROPERTY_WATER
|
||||
CalcFlags:
|
||||
@@ -2057,7 +2059,6 @@ Body:
|
||||
NoBanishingBuster: true
|
||||
NoClearance: true
|
||||
- Status: Inchitrate
|
||||
DurationLookup: NPC_POWERUP
|
||||
CalcFlags:
|
||||
Hit: true
|
||||
Flags:
|
||||
@@ -2076,7 +2077,6 @@ Body:
|
||||
NoBanishingBuster: true
|
||||
NoClearance: true
|
||||
- Status: Incfleerate
|
||||
DurationLookup: NPC_AGIUP
|
||||
CalcFlags:
|
||||
Flee: true
|
||||
Flags:
|
||||
@@ -7060,3 +7060,25 @@ Body:
|
||||
NoClearbuff: true
|
||||
- Status: WeaponBreaker
|
||||
DurationLookup: NPC_WEAPONBRAKER
|
||||
- Status: Powerup
|
||||
Icon: EFST_POWERUP
|
||||
DurationLookup: NPC_POWERUP
|
||||
CalcFlags:
|
||||
Hit: true
|
||||
Flags:
|
||||
NoClearbuff: true
|
||||
NoDispell: true
|
||||
NoBanishingBuster: true
|
||||
NoClearance: true
|
||||
- Status: Agiup
|
||||
Icon: EFST_AGIUP
|
||||
DurationLookup: NPC_AGIUP
|
||||
CalcFlags:
|
||||
Speed: true
|
||||
Flee: true
|
||||
Flags:
|
||||
NoClearbuff: true
|
||||
NoBanishingBuster: true
|
||||
NoClearance: true
|
||||
EndOnStart:
|
||||
Decreaseagi: true
|
||||
|
||||
@@ -70737,7 +70737,8 @@ Body:
|
||||
NoMail: true
|
||||
NoAuction: true
|
||||
Script: |
|
||||
/* TODO */
|
||||
sc_start SC_PERIOD_RECEIVEITEM_2ND,604800000,50;
|
||||
sc_start SC_PERIOD_PLUSEXP_2ND,604800000,50;
|
||||
- Id: 100914
|
||||
AegisName: EXP_Drop_Up_1Hours
|
||||
Name: Kafra Buff(1 Hour)
|
||||
@@ -70750,8 +70751,9 @@ Body:
|
||||
NoGuildStorage: true
|
||||
NoMail: true
|
||||
NoAuction: true
|
||||
# Script: |
|
||||
# /* TODO */
|
||||
Script: |
|
||||
sc_start SC_PERIOD_RECEIVEITEM_2ND,86400000,50;
|
||||
sc_start SC_PERIOD_PLUSEXP_2ND,86400000,50;
|
||||
- Id: 100917
|
||||
AegisName: Hero_Weapon_Hammer_4
|
||||
Name: Modified Hero's Weapon Refinement Hammer IV
|
||||
@@ -70859,6 +70861,9 @@ Body:
|
||||
NoGuildStorage: true
|
||||
NoMail: true
|
||||
NoAuction: true
|
||||
Script: |
|
||||
sc_start SC_PERIOD_RECEIVEITEM_2ND,86400000,50;
|
||||
sc_start SC_PERIOD_PLUSEXP_2ND,86400000,50;
|
||||
- Id: 100950
|
||||
AegisName: Evt_RagFes_Box
|
||||
Name: Ragfest Commemorative Box
|
||||
@@ -73313,6 +73318,9 @@ Body:
|
||||
NoGuildStorage: true
|
||||
NoMail: true
|
||||
NoAuction: true
|
||||
Script: |
|
||||
sc_start SC_PERIOD_RECEIVEITEM_2ND,604800000,50;
|
||||
sc_start SC_PERIOD_PLUSEXP_2ND,604800000,50;
|
||||
- Id: 101240
|
||||
AegisName: Season_Evt_Reward_1
|
||||
Name: January Event's Reward Box
|
||||
|
||||
@@ -5243,7 +5243,7 @@ Body:
|
||||
TargetType: Attack
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
IgnoreElement: true
|
||||
IgnoreAtkCard: true
|
||||
IgnoreFlee: true
|
||||
Range: 1
|
||||
Hit: Single
|
||||
@@ -5277,7 +5277,7 @@ Body:
|
||||
Time: 3000
|
||||
- Level: 10
|
||||
Time: 2000
|
||||
Duration2: 20000
|
||||
Duration2: 18000
|
||||
Cooldown:
|
||||
- Level: 1
|
||||
Time: 7500
|
||||
@@ -6076,8 +6076,8 @@ Body:
|
||||
- Id: 192
|
||||
Name: NPC_MAGICALATTACK
|
||||
Description: Demon Shock Attack
|
||||
MaxLevel: 10
|
||||
Type: Weapon
|
||||
MaxLevel: 1
|
||||
Type: Magic
|
||||
TargetType: Attack
|
||||
Flags:
|
||||
IsNpc: true
|
||||
@@ -6183,34 +6183,13 @@ Body:
|
||||
Name: NPC_KEEPING
|
||||
Description: Keeping
|
||||
MaxLevel: 1
|
||||
Type: Weapon
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Flags:
|
||||
IsNpc: true
|
||||
HitCount: 1
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 60000
|
||||
- Level: 2
|
||||
Time: 70000
|
||||
- Level: 3
|
||||
Time: 80000
|
||||
- Level: 4
|
||||
Time: 90000
|
||||
- Level: 5
|
||||
Time: 100000
|
||||
- Level: 6
|
||||
Time: 110000
|
||||
- Level: 7
|
||||
Time: 120000
|
||||
- Level: 8
|
||||
Time: 130000
|
||||
- Level: 9
|
||||
Time: 140000
|
||||
- Level: 10
|
||||
Time: 150000
|
||||
Duration1: 30000
|
||||
Status: Keeping
|
||||
- Id: 202
|
||||
Name: NPC_DARKBREATH
|
||||
@@ -6250,60 +6229,19 @@ Body:
|
||||
Flags:
|
||||
IsNpc: true
|
||||
HitCount: 1
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 60000
|
||||
- Level: 2
|
||||
Time: 70000
|
||||
- Level: 3
|
||||
Time: 80000
|
||||
- Level: 4
|
||||
Time: 90000
|
||||
- Level: 5
|
||||
Time: 100000
|
||||
- Level: 6
|
||||
Time: 110000
|
||||
- Level: 7
|
||||
Time: 120000
|
||||
- Level: 8
|
||||
Time: 130000
|
||||
- Level: 9
|
||||
Time: 140000
|
||||
- Level: 10
|
||||
Time: 150000
|
||||
Duration1: 15000
|
||||
Status: Barrier
|
||||
- Id: 205
|
||||
Name: NPC_DEFENDER
|
||||
Description: Defender
|
||||
MaxLevel: 1
|
||||
Type: Weapon
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Flags:
|
||||
IsNpc: true
|
||||
HitCount: 1
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 60000
|
||||
- Level: 2
|
||||
Time: 70000
|
||||
- Level: 3
|
||||
Time: 80000
|
||||
- Level: 4
|
||||
Time: 90000
|
||||
- Level: 5
|
||||
Time: 100000
|
||||
- Level: 6
|
||||
Time: 110000
|
||||
- Level: 7
|
||||
Time: 120000
|
||||
- Level: 8
|
||||
Time: 130000
|
||||
- Level: 9
|
||||
Time: 140000
|
||||
- Level: 10
|
||||
Time: 150000
|
||||
Duration1: 15000
|
||||
Status: Armor
|
||||
- Id: 206
|
||||
Name: NPC_LICK
|
||||
@@ -9708,8 +9646,7 @@ Body:
|
||||
- Id: 349
|
||||
Name: NPC_POWERUP
|
||||
Description: Power Up
|
||||
MaxLevel: 10
|
||||
Type: Weapon
|
||||
MaxLevel: 5
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
@@ -9718,19 +9655,19 @@ Body:
|
||||
Hit: Single
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 10000
|
||||
Time: 5000
|
||||
- Level: 2
|
||||
Time: 15000
|
||||
Time: 10000
|
||||
- Level: 3
|
||||
Time: 20000
|
||||
Time: 15000
|
||||
- Level: 4
|
||||
Time: 25000
|
||||
Time: 20000
|
||||
- Level: 5
|
||||
Time: 30000
|
||||
Status: IncHitRate
|
||||
Time: 25000
|
||||
Status: Powerup
|
||||
- Id: 350
|
||||
Name: NPC_AGIUP
|
||||
Description: Agility UP
|
||||
Description: Agility Up
|
||||
MaxLevel: 10
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
@@ -9742,14 +9679,24 @@ Body:
|
||||
- Level: 1
|
||||
Time: 10000
|
||||
- Level: 2
|
||||
Time: 15000
|
||||
- Level: 3
|
||||
Time: 20000
|
||||
- Level: 4
|
||||
Time: 25000
|
||||
- Level: 5
|
||||
- Level: 3
|
||||
Time: 30000
|
||||
Status: IncFleeRate
|
||||
- Level: 4
|
||||
Time: 40000
|
||||
- Level: 5
|
||||
Time: 50000
|
||||
- Level: 6
|
||||
Time: 60000
|
||||
- Level: 7
|
||||
Time: 70000
|
||||
- Level: 8
|
||||
Time: 80000
|
||||
- Level: 9
|
||||
Time: 90000
|
||||
- Level: 10
|
||||
Time: 100000
|
||||
Status: Agiup
|
||||
- Id: 351
|
||||
Name: NPC_SIEGEMODE
|
||||
Description: Siege Mode
|
||||
@@ -18560,32 +18507,13 @@ Body:
|
||||
Skill:
|
||||
Plagiarism: true
|
||||
Reproduce: true
|
||||
Duration2:
|
||||
- Level: 1
|
||||
Time: 15000
|
||||
- Level: 2
|
||||
Time: 20000
|
||||
- Level: 3
|
||||
Time: 25000
|
||||
- Level: 4
|
||||
Time: 30000
|
||||
- Level: 5
|
||||
Time: 35000
|
||||
- Level: 6
|
||||
Time: 40000
|
||||
- Level: 7
|
||||
Time: 45000
|
||||
- Level: 8
|
||||
Time: 50000
|
||||
- Level: 9
|
||||
Time: 55000
|
||||
- Level: 10
|
||||
Time: 60000
|
||||
Duration2: 18000
|
||||
Requires:
|
||||
SpCost: 35
|
||||
Ammo:
|
||||
Dagger: true
|
||||
AmmoAmount: 1
|
||||
Status: Poison
|
||||
- Id: 1005
|
||||
Name: RG_CLOSECONFINE
|
||||
Description: Close Confine
|
||||
|
||||
@@ -1148,6 +1148,8 @@ Body:
|
||||
Watk_Element: true
|
||||
- Status: Armor
|
||||
DurationLookup: NPC_DEFENDER
|
||||
CalcFlags:
|
||||
Speed: true
|
||||
- Status: Armor_Element_Water
|
||||
Icon: EFST_RESIST_PROPERTY_WATER
|
||||
CalcFlags:
|
||||
@@ -2170,7 +2172,6 @@ Body:
|
||||
NoBanishingBuster: true
|
||||
NoClearance: true
|
||||
- Status: Inchitrate
|
||||
DurationLookup: NPC_POWERUP
|
||||
CalcFlags:
|
||||
Hit: true
|
||||
Flags:
|
||||
@@ -2189,7 +2190,6 @@ Body:
|
||||
NoBanishingBuster: true
|
||||
NoClearance: true
|
||||
- Status: Incfleerate
|
||||
DurationLookup: NPC_AGIUP
|
||||
CalcFlags:
|
||||
Flee: true
|
||||
Flags:
|
||||
@@ -8895,3 +8895,43 @@ Body:
|
||||
NoBanishingBuster: true
|
||||
NoDispell: true
|
||||
NoClearance: true
|
||||
- Status: Period_Receiveitem_2nd
|
||||
Icon: EFST_PERIOD_RECEIVEITEM_2ND
|
||||
Flags:
|
||||
NoRemoveOnDead: true
|
||||
NoClearbuff: true
|
||||
NoDispell: true
|
||||
NoBanishingBuster: true
|
||||
NoClearance: true
|
||||
SendVal1: true
|
||||
- Status: Period_Plusexp_2nd
|
||||
Icon: EFST_PERIOD_PLUSEXP_2ND
|
||||
Flags:
|
||||
NoRemoveOnDead: true
|
||||
NoClearbuff: true
|
||||
NoDispell: true
|
||||
NoBanishingBuster: true
|
||||
NoClearance: true
|
||||
SendVal1: true
|
||||
- Status: Powerup
|
||||
Icon: EFST_POWERUP
|
||||
DurationLookup: NPC_POWERUP
|
||||
CalcFlags:
|
||||
Hit: true
|
||||
Flags:
|
||||
NoClearbuff: true
|
||||
NoDispell: true
|
||||
NoBanishingBuster: true
|
||||
NoClearance: true
|
||||
- Status: Agiup
|
||||
Icon: EFST_AGIUP
|
||||
DurationLookup: NPC_AGIUP
|
||||
CalcFlags:
|
||||
Speed: true
|
||||
Flee: true
|
||||
Flags:
|
||||
NoClearbuff: true
|
||||
NoBanishingBuster: true
|
||||
NoClearance: true
|
||||
EndOnStart:
|
||||
Decreaseagi: true
|
||||
|
||||
@@ -2832,3 +2832,13 @@ SC_WEAPONBREAKER
|
||||
desc: Bonus given when using NPC_WEAPONBRAKER skill
|
||||
val1: Skill level
|
||||
val2: val1 * 2 weapon break chance
|
||||
|
||||
SC_POWERUP
|
||||
desc: Increases ATKpercent and Hit.
|
||||
val1: + ATKpercent
|
||||
val2: +% Hit
|
||||
|
||||
SC_AGIUP
|
||||
desc: Increase Speed and Flee.
|
||||
val1: +% Walkspeed
|
||||
val2: +% Flee
|
||||
|
||||
@@ -1,279 +0,0 @@
|
||||
//===== rAthena Script =======================================
|
||||
//= Gold PC Bonus NPC
|
||||
//===== Description: =========================================
|
||||
//= NPC that can be spawned via the Gold PC Timer Button.
|
||||
//===== Changelog: ===========================================
|
||||
//= 1.0 Initial release [Lemongrass]
|
||||
//= 1.1 Replay version [eppc0330]
|
||||
//= 1.2 Translation of the replay version [Lemongrass]
|
||||
//= 1.3 Cleanup of NPC logic [Lemongrass]
|
||||
//= 1.4 Added replay version of buff NPC [eppc0330]
|
||||
//============================================================
|
||||
|
||||
prontera,0,0,0 script Goldpoint Manager::GOLDPCCAFE 4_F_02,{
|
||||
// ID:AMOUNT:PRICE
|
||||
setarray .items$[1],
|
||||
"25464:1:2", // World_Tour_Ticket 1
|
||||
"23919:1:10", // K_Secret_Key 1
|
||||
"23919:11:100",// K_Secret_Key 11
|
||||
"23919:33:300";// K_Secret_Key 33
|
||||
|
||||
mes "[Goldpoint Manager]";
|
||||
mes "You currently have ^0000ff"+Goldpc_Points+"^000000 points.";
|
||||
mes "What reward do you want?";
|
||||
next;
|
||||
|
||||
.@menu$ = "View current points";
|
||||
|
||||
for(.@i = 1; .@i < getarraysize(.items$); .@i++) {
|
||||
explode(.@array$, .items$[.@i], ":");
|
||||
.@cost = atoi(.@array$[2]);
|
||||
.@menu$ += ":" + .@cost + " points gift";
|
||||
if( Goldpc_Points < .@cost ){
|
||||
.@menu$ += " ^ff0000(not enough points)^000000";
|
||||
}
|
||||
}
|
||||
|
||||
.@s = select(.@menu$)-1;
|
||||
|
||||
if(.@s == 0) {
|
||||
mes "[Goldpoint Manager]";
|
||||
mes "You currently have ^0000ff"+Goldpc_Points+"^000000 points.";
|
||||
close;
|
||||
}
|
||||
|
||||
explode(.@array$, .items$[.@s], ":");
|
||||
.@itemid = atoi(.@array$[0]);
|
||||
.@amount = atoi(.@array$[1]);
|
||||
.@cost = atoi(.@array$[2]);
|
||||
|
||||
if(Goldpc_Points < .@cost) {
|
||||
mes "[Goldpoint Manager]";
|
||||
mes "You have ^0000ff"+Goldpc_Points+"^000000 points remaining.";
|
||||
mes "You cannot get the prize with this amount of points.";
|
||||
close;
|
||||
}
|
||||
|
||||
mes "[Goldpoint Manager]";
|
||||
mes "You chose the "+.@cost+" points gift. We will reward you immediately.";
|
||||
Goldpc_Points -= .@cost;
|
||||
getitem .@itemid,.@amount;
|
||||
mes "You have ^0000ff"+Goldpc_Points+"^000000 points remaining.";
|
||||
close;
|
||||
}
|
||||
|
||||
prontera,146,93,5 script 프버방시피 4_M_MANAGER,{
|
||||
mes "[프버방시피]";
|
||||
mes "여~ 계속 보게 되는군 친구.";
|
||||
mes "별로 소개도 필요없을 정도로";
|
||||
mes "많이 본 것 같지만 아무튼...";
|
||||
mes "..입아프게 말하는 것도 귀찮고,";
|
||||
mes "이미 익히들 잘 알고 있을거라고";
|
||||
mes "생각하니 간단하게 이야기할게.";
|
||||
next;
|
||||
mes "[프버방시피]";
|
||||
mes "자네가 있는 장소에 따라서,";
|
||||
mes "나는 자네에게 여러가지";
|
||||
mes "서비스를 해 줄 예정이야.";
|
||||
next;
|
||||
mes "[프버방시피]";
|
||||
mes "아무튼 자네가 지금 서비스를";
|
||||
mes "받을 수 있는가 체크를 해";
|
||||
mes "보도록 하겠어. 잠깐만";
|
||||
mes "기다려봐.";
|
||||
next;
|
||||
if(vip_status(VIP_STATUS_ACTIVE)==1||getgroupid()==99)
|
||||
goto VIP; //Custom. In KRo there's two PC cafe grade : gold and silver.
|
||||
else
|
||||
goto Normal;
|
||||
Normal:
|
||||
mes "[프버방시피]";
|
||||
mes "애석하게도 자네는 서비스를";
|
||||
mes "받을 수 있는 곳에 존재하고";
|
||||
mes "있지않군... 정 서비스를 받고";
|
||||
mes "싶다면 다른 장소에서 컨택트";
|
||||
mes "하도록 해.";
|
||||
next;
|
||||
mes "[프버방시피]";
|
||||
mes "거 왜, 많은 사람들이 모여서";
|
||||
mes "각자 다른 세계와 조우하는 그";
|
||||
mes "장소 있잖아? 거기로 가서";
|
||||
mes "이쪽 세계로 들어오란 말야.";
|
||||
next;
|
||||
mes "[프버방시피]";
|
||||
mes "그 때 다시 이야기";
|
||||
mes "하도록 하지. 좋은 하루되게.";
|
||||
close;
|
||||
|
||||
Vip:
|
||||
// ID:갯수:가격:이름:조사
|
||||
setarray .items$[1],
|
||||
"14529:10:2000:을", //탐욕스크롤
|
||||
"12274:1:10000:을", //대환단
|
||||
"12275:1:10000:을", //태청단
|
||||
"12262:10:10000:를"; //마패
|
||||
|
||||
mes "[프버방시피]";
|
||||
mes "오케이. 자네는 서비스를 받을";
|
||||
mes "수 있는 장소...거기서 등급을";
|
||||
mes "나눠보자면 골드 등급인가.";
|
||||
mes "탐욕 스크롤, 대환단, 태청단,";
|
||||
mes "마패를 받을 수 있는데...";
|
||||
next;
|
||||
mes "[프버방시피]";
|
||||
mes "각자 탐욕 스크롤이 2000제니.";
|
||||
mes "대환단이 10000제니";
|
||||
mes "태청단이 10000제니";
|
||||
mes "마패가 10000제니!";
|
||||
mes "자아, 자네는 이중에 뭘 받고";
|
||||
mes "싶어?";
|
||||
next;
|
||||
|
||||
for(.@i = 1; .@i < getarraysize(.items$); .@i++) {
|
||||
explode(.@array$, .items$[.@i], ":");
|
||||
.@menu$ += ":"+getitemname(atoi(.@array$[0]));
|
||||
}
|
||||
.@s = select(.@menu$+":받지 않는다.")-1;
|
||||
if(.@s == getarraysize(.items$)) {
|
||||
mes "[프버방시피]";
|
||||
mes "확고한 인간이로군. 오케이.";
|
||||
mes "뭐 강요할 생각은 없다네.";
|
||||
mes "그럼 좋은 하루되게나.";
|
||||
close;
|
||||
}
|
||||
explode(.@array$, .items$[.@s], ":");
|
||||
.@itemid = atoi(.@array$[0]);
|
||||
.@amount = atoi(.@array$[1]);
|
||||
.@cost = atoi(.@array$[2]);
|
||||
.@name$ = getitemname(atoi(.@array$[0]));
|
||||
.@part$ = (.@array$[3]);
|
||||
if(zeny < .@cost) {
|
||||
mes "[프버방시피]";
|
||||
mes "애석하게도 자넨 "+.@cost+"제니라는";
|
||||
mes "돈도 없구만... 서비스받기는";
|
||||
mes "글렀어. 아무리 서비스라지만";
|
||||
mes "그렇게 정해졌으니 공짜로 해";
|
||||
mes "줄 수는 없다네.";
|
||||
close;
|
||||
}
|
||||
if(countitem(.@itemid) > 0) {
|
||||
mes "[프버방시피]";
|
||||
mes "애석하게도 음... 자네는";
|
||||
mes "이미 "+.@name$+""+.@part$+" 하나";
|
||||
mes "가지고 있구만. 내가 이야기";
|
||||
mes "안했었나? 아..이거 원 요즘";
|
||||
mes "건망증이 늘어서 말이지.";
|
||||
mes "핫핫핫.";
|
||||
next;
|
||||
mes "[프버방시피]";
|
||||
mes "좌우지간, 물건이 많지는 않은";
|
||||
mes "관계로 물건을 소지하고 있는";
|
||||
mes "사람에게는 지급 할 수가 없어.";
|
||||
next;
|
||||
mes "[프버방시피]";
|
||||
mes "다음 기회를 이용해 달라구.";
|
||||
mes "다음에 또 보자구~!";
|
||||
close;
|
||||
}
|
||||
mes "[프버방시피]";
|
||||
mes "오케이. 잘 생각했어. 정말";
|
||||
mes "탁월한 선택이야. 핫핫핫.";
|
||||
mes "잘 쓰도록 하라구~";
|
||||
set Zeny, Zeny - .@cost;
|
||||
getitem .@itemid,.@amount;
|
||||
next;
|
||||
mes "[프버방시피]";
|
||||
mes "그리고... 약속의 서비스다-!";
|
||||
next;
|
||||
mes "[프버방시피]";
|
||||
mes "여기서 골드 등급의 손님을";
|
||||
mes "위한 깜짝 선택! 서비스 4가지";
|
||||
mes "중에 하나를 선택가능!";
|
||||
next;
|
||||
mes "[프버방시피]";
|
||||
mes "첫 번째, ^FF0000STR+8, AGI+6, DEX+4,";
|
||||
mes "^FF0000ATK+32, FLEE+5!";
|
||||
mes "^000000두 번째, ^FF0000INT+8, DEX+6,";
|
||||
mes "^FF0000VIT+4, MATK+40!^000000";
|
||||
next;
|
||||
mes "[프버방시피]";
|
||||
mes "세 번째, ^FF0000DEX+8, AGI+6, LUK+4,";
|
||||
mes "^FF0000ATK+24, MATK+24!";
|
||||
mes "^000000네 번째, ^FF0000올+6 ATK+24, MATK+24!!^000000";
|
||||
next;
|
||||
mes "[프버방시피]";
|
||||
mes "넷 중 뭘 받을래!";
|
||||
next;
|
||||
.@s2 = (select("첫 번째:두 번째:세 번째:네 번째"));
|
||||
|
||||
mes "[프버방시피]";
|
||||
mes "이야아아아아아아압!";
|
||||
if(.@s2 == 1) {
|
||||
sc_start SC_STRFOOD,5400000,8;
|
||||
sc_start SC_AGIFOOD,5400000,6;
|
||||
sc_start SC_DEXFOOD,5400000,4;
|
||||
sc_start SC_ATKPOTION,5400000,32;
|
||||
sc_start SC_FLEEFOOD,5400000,5;
|
||||
} else if(.@s2 == 2) {
|
||||
sc_start SC_INTFOOD,5400000,8;
|
||||
sc_start SC_DEXFOOD,5400000,6;
|
||||
sc_start SC_VITFOOD,5400000,4;
|
||||
sc_start SC_MATKPOTION,5400000,40;
|
||||
} else if(.@s2 == 3) {
|
||||
sc_start SC_DEXFOOD,5400000,8;
|
||||
sc_start SC_AGIFOOD,5400000,6;
|
||||
sc_start SC_LUKFOOD,5400000,4;
|
||||
sc_start SC_ATKPOTION,5400000,24;
|
||||
sc_start SC_MATKPOTION,5400000,24;
|
||||
} else {
|
||||
sc_start SC_STRFOOD,5400000,6;
|
||||
sc_start SC_AGIFOOD,5400000,6;
|
||||
sc_start SC_VITFOOD,5400000,6;
|
||||
sc_start SC_INTFOOD,5400000,6;
|
||||
sc_start SC_DEXFOOD,5400000,6;
|
||||
sc_start SC_LUKFOOD,5400000,6;
|
||||
sc_start SC_ATKPOTION,5400000,24;
|
||||
sc_start SC_MATKPOTION,5400000,24;
|
||||
}
|
||||
next;
|
||||
mes "[프버방시피]";
|
||||
mes "힘을 불어넣어주었어. 어때?";
|
||||
mes "손해봤다는 생각은 죽어도";
|
||||
mes "안들지? 핫핫핫. 글쎄 남는";
|
||||
mes "남는 장사도 이렇게 남는";
|
||||
mes "장사가 있을 수가 없대두.";
|
||||
next;
|
||||
mes "[프버방시피]";
|
||||
mes "자 그럼 다음에 또~";
|
||||
close;
|
||||
}
|
||||
|
||||
alberta,104,60,5 duplicate(프버방시피) 프버방시피#alb 4_M_MANAGER
|
||||
aldebaran,146,116,5 duplicate(프버방시피) 프버방시피#ald 4_M_MANAGER
|
||||
amatsu,102,152,5 duplicate(프버방시피) 프버방시피#ama 4_M_MANAGER
|
||||
ayothaya,212,173,5 duplicate(프버방시피) 프버방시피#ayo 4_M_MANAGER
|
||||
brasilis,200,224,5 duplicate(프버방시피) 프버방시피#bra 4_M_MANAGER
|
||||
comodo,199,149,5 duplicate(프버방시피) 프버방시피#com 4_M_MANAGER
|
||||
dewata,202,188,5 duplicate(프버방시피) 프버방시피#dew 4_M_MANAGER
|
||||
dicastes01,193,191,5 duplicate(프버방시피) 프버방시피#dic 4_M_MANAGER
|
||||
einbroch,235,207,5 duplicate(프버방시피) 프버방시피#ein 4_M_MANAGER
|
||||
geffen,126,64,5 duplicate(프버방시피) 프버방시피#gef 4_M_MANAGER
|
||||
gonryun,156,122,5 duplicate(프버방시피) 프버방시피#gon 4_M_MANAGER
|
||||
hugel,80,152,5 duplicate(프버방시피) 프버방시피#hug 4_M_MANAGER
|
||||
izlude,125,148,5 duplicate(프버방시피) 프버방시피#izl 4_M_MANAGER
|
||||
lighthalzen,167,97,5 duplicate(프버방시피) 프버방시피#lig 4_M_MANAGER
|
||||
louyang,210,107,5 duplicate(프버방시피) 프버방시피#lou 4_M_MANAGER
|
||||
malangdo,178,139,5 duplicate(프버방시피) 프버방시피#mld 4_M_MANAGER
|
||||
malaya,234,218,5 duplicate(프버방시피) 프버방시피#mly 4_M_MANAGER
|
||||
manuk,296,147,5 duplicate(프버방시피) 프버방시피#man 4_M_MANAGER
|
||||
mid_camp,201,237,5 duplicate(프버방시피) 프버방시피#mid 4_M_MANAGER
|
||||
mora,113,112,5 duplicate(프버방시피) 프버방시피#mra 4_M_MANAGER
|
||||
morocc,164,255,5 duplicate(프버방시피) 프버방시피#mro 4_M_MANAGER
|
||||
moscovia,220,191,5 duplicate(프버방시피) 프버방시피#mos 4_M_MANAGER
|
||||
niflheim,206,179,5 duplicate(프버방시피) 프버방시피#nif 4_M_MANAGER
|
||||
payon,184,102,5 duplicate(프버방시피) 프버방시피#pay 4_M_MANAGER
|
||||
rachel,111,143,5 duplicate(프버방시피) 프버방시피#rah 4_M_MANAGER
|
||||
splendide,201,153,5 duplicate(프버방시피) 프버방시피#spl 4_M_MANAGER
|
||||
umbala,93,160,5 duplicate(프버방시피) 프버방시피#umb 4_M_MANAGER
|
||||
veins,210,109,5 duplicate(프버방시피) 프버방시피#vei 4_M_MANAGER
|
||||
yuno,149,187,5 duplicate(프버방시피) 프버방시피#yun 4_M_MANAGER
|
||||
File diff suppressed because it is too large
Load Diff
@@ -178,7 +178,6 @@ npc: npc/other/comodo_gambling.txt
|
||||
npc: npc/other/divorce.txt
|
||||
npc: npc/other/fortune.txt
|
||||
npc: npc/other/gm_npcs.txt
|
||||
npc: npc/other/goldpc.txt
|
||||
npc: npc/other/guildpvp.txt
|
||||
npc: npc/other/gympass.txt
|
||||
npc: npc/other/hugel_bingo.txt
|
||||
|
||||
@@ -1762,7 +1762,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
||||
|
||||
if((sce=tsc->getSCE(SC_ARMOR)) && //NPC_DEFENDER
|
||||
sce->val3&flag && sce->val4&flag)
|
||||
damage -= damage * tsc->getSCE(SC_ARMOR)->val2 / 100;
|
||||
damage /= tsc->getSCE(SC_ARMOR)->val2;
|
||||
|
||||
if( tsc->getSCE(SC_ENERGYCOAT) && (skill_id == GN_HELLS_PLANT_ATK ||
|
||||
#ifdef RENEWAL
|
||||
@@ -2932,10 +2932,9 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
|
||||
if (!first_call)
|
||||
return (wd->type == DMG_CRITICAL || wd->type == DMG_MULTI_HIT_CRITICAL);
|
||||
|
||||
#ifdef RENEWAL
|
||||
if (skill_id == NPC_CRITICALSLASH || skill_id == LG_PINPOINTATTACK) //Always critical skills
|
||||
return true;
|
||||
#endif
|
||||
|
||||
if( skill_id && !skill_get_nk(skill_id,NK_CRITICAL) )
|
||||
return false;
|
||||
|
||||
@@ -3360,35 +3359,37 @@ static bool attack_ignores_def(struct Damage* wd, struct block_list *src, struct
|
||||
/**
|
||||
* This function lists which skills are unaffected by refine bonus, masteries, Star Crumbs and Spirit Spheres
|
||||
* This function is also used to determine if atkpercent applies
|
||||
* @param src: Source of the attack
|
||||
* @param skill_id: Skill being used
|
||||
* @param type 1 - Checking refine bonus; 2 - Checking Star Crumb bonus
|
||||
* @param chk_flag: The bonus that is currently being checked for, see e_bonus_chk_flag
|
||||
* @return true = bonus applies; false = bonus does not apply
|
||||
*/
|
||||
static bool battle_skill_stacks_masteries_vvs(uint16 skill_id, int type)
|
||||
static bool battle_skill_stacks_masteries_vvs(struct block_list &src, uint16 skill_id, e_bonus_chk_flag chk_flag)
|
||||
{
|
||||
switch (skill_id) {
|
||||
// PC skills that are unaffected
|
||||
case PA_SHIELDCHAIN:
|
||||
case CR_SHIELDBOOMERANG:
|
||||
case AM_ACIDTERROR:
|
||||
case MO_INVESTIGATE:
|
||||
case MO_EXTREMITYFIST:
|
||||
case PA_SACRIFICE:
|
||||
case NPC_DRAGONBREATH:
|
||||
case RK_DRAGONBREATH:
|
||||
case RK_DRAGONBREATH_WATER:
|
||||
case NC_SELFDESTRUCTION:
|
||||
case LG_SHIELDPRESS:
|
||||
case LG_EARTHDRIVE:
|
||||
case NPC_DRAGONBREATH:
|
||||
return false;
|
||||
case CR_GRANDCROSS:
|
||||
case NPC_GRANDDARKNESS:
|
||||
// Grand Cross is influenced by refine bonus but not by atkpercent / masteries / Star Crumbs / Spirit Spheres
|
||||
if (type != 1)
|
||||
if (chk_flag != BCHK_REFINE)
|
||||
return false;
|
||||
break;
|
||||
case LK_SPIRALPIERCE:
|
||||
// Spiral Pierce is influenced only by refine bonus and Star Crumbs
|
||||
if (type != 1 && type != 2)
|
||||
// Spiral Pierce is influenced only by refine bonus and Star Crumbs for players
|
||||
if (src.type == BL_PC && chk_flag != BCHK_REFINE && chk_flag != BCHK_STAR)
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
@@ -3732,11 +3733,11 @@ static void battle_calc_element_damage(struct Damage* wd, struct block_list *src
|
||||
status_change* sc = status_get_sc(src);
|
||||
struct status_data* sstatus = status_get_status_data(src);
|
||||
struct status_data* tstatus = status_get_status_data(target);
|
||||
int right_element = battle_get_weapon_element(wd, src, target, skill_id, skill_lv, EQI_HAND_R, true);
|
||||
|
||||
// Elemental attribute fix
|
||||
if(!nk[NK_IGNOREELEMENT] && (wd->damage > 0 || wd->damage2 > 0)) {
|
||||
int left_element = battle_get_weapon_element(wd, src, target, skill_id, skill_lv, EQI_HAND_L, true);
|
||||
int right_element = battle_get_weapon_element(wd, src, target, skill_id, skill_lv, EQI_HAND_R, true);
|
||||
|
||||
switch (skill_id) {
|
||||
case PA_SACRIFICE:
|
||||
@@ -3788,18 +3789,21 @@ static void battle_calc_element_damage(struct Damage* wd, struct block_list *src
|
||||
// These mastery bonuses are non-elemental and should apply even if the attack misses
|
||||
// They are still increased by the EDP/Magnum Break bonus damage (WATK_ELEMENT)
|
||||
// In renewal these bonuses do not apply when the attack misses
|
||||
if (sd && battle_skill_stacks_masteries_vvs(skill_id, 2)) {
|
||||
if (sd && battle_skill_stacks_masteries_vvs(*src, skill_id, BCHK_STAR)) {
|
||||
// Star Crumb bonus damage
|
||||
ATK_ADD2(wd->damage, wd->damage2, sd->right_weapon.star, sd->left_weapon.star);
|
||||
}
|
||||
// Check if general mastery bonuses apply (above check is only for Star Crumb)
|
||||
if (battle_skill_stacks_masteries_vvs(skill_id, 0)) {
|
||||
if (battle_skill_stacks_masteries_vvs(*src, skill_id, BCHK_ALL)) {
|
||||
// Spirit Sphere bonus damage
|
||||
ATK_ADD(wd->damage, wd->damage2, battle_get_spiritball_damage(*wd, *src, skill_id));
|
||||
|
||||
// Skill-specific bonuses
|
||||
if (skill_id == TF_POISON)
|
||||
if (skill_id == TF_POISON) {
|
||||
ATK_ADD(wd->damage, wd->damage2, 15 * skill_lv);
|
||||
// Envenom applies the attribute table to the base damage and then again to the final damage
|
||||
wd->damage = battle_attr_fix(src, target, wd->damage, right_element, tstatus->def_ele, tstatus->ele_lv, 1);
|
||||
}
|
||||
}
|
||||
|
||||
// These bonuses do not apply to skills that ignore element, unit skills and skills that have their own base damage formula
|
||||
@@ -3851,7 +3855,7 @@ static void battle_calc_attack_masteries(struct Damage* wd, struct block_list *s
|
||||
}
|
||||
|
||||
// Check if mastery damage applies to current skill
|
||||
if (sd && battle_skill_stacks_masteries_vvs(skill_id, 0))
|
||||
if (sd && battle_skill_stacks_masteries_vvs(*src, skill_id, BCHK_ALL))
|
||||
{ //Add mastery damage
|
||||
uint16 skill;
|
||||
|
||||
@@ -4436,7 +4440,7 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s
|
||||
*/
|
||||
static unsigned short battle_get_atkpercent(struct block_list& bl, uint16 skill_id, status_change& sc)
|
||||
{
|
||||
if (!battle_skill_stacks_masteries_vvs(skill_id, 0))
|
||||
if (!battle_skill_stacks_masteries_vvs(bl, skill_id, BCHK_ALL))
|
||||
return 100;
|
||||
|
||||
int atkpercent = 100;
|
||||
@@ -4455,6 +4459,8 @@ static unsigned short battle_get_atkpercent(struct block_list& bl, uint16 skill_
|
||||
atkpercent -= 25;
|
||||
if (sc.getSCE(SC_INCATKRATE))
|
||||
atkpercent += sc.getSCE(SC_INCATKRATE)->val1;
|
||||
if (sc.getSCE(SC_POWERUP))
|
||||
atkpercent += sc.getSCE(SC_POWERUP)->val1;
|
||||
if (sc.getSCE(SC_SKE))
|
||||
atkpercent += 300;
|
||||
if (sc.getSCE(SC_BLOODLUST))
|
||||
@@ -6687,7 +6693,7 @@ static void battle_calc_attack_post_defense(struct Damage* wd, struct block_list
|
||||
#ifndef RENEWAL
|
||||
//Refine bonus
|
||||
if (sd) {
|
||||
if (battle_skill_stacks_masteries_vvs(skill_id, 1)) {
|
||||
if (battle_skill_stacks_masteries_vvs(*src, skill_id, BCHK_REFINE)) {
|
||||
ATK_ADD2(wd->damage, wd->damage2, sstatus->rhw.atk2, sstatus->lhw.atk2);
|
||||
}
|
||||
wd->basedamage += sstatus->rhw.atk2;
|
||||
@@ -11389,11 +11395,6 @@ static const struct _battle_data {
|
||||
{ "feature.instance_allow_reconnect", &battle_config.instance_allow_reconnect, 0, 0, 1, },
|
||||
#endif
|
||||
|
||||
{ "feature.goldpc_active", &battle_config.feature_goldpc_active, 1, 0, 1, },
|
||||
{ "feature.goldpc_time", &battle_config.feature_goldpc_time, 3600, 0, 3600, },
|
||||
{ "feature.goldpc_max_points", &battle_config.feature_goldpc_max_points, 300, 0, 300, },
|
||||
{ "feature.goldpc_vip", &battle_config.feature_goldpc_vip, 1, 0, 1, },
|
||||
|
||||
#include <custom/battle_config_init.inc>
|
||||
};
|
||||
|
||||
|
||||
@@ -79,6 +79,13 @@ enum e_battle_check_target : uint32 {
|
||||
BCT_FRIEND = BCT_NOENEMY,
|
||||
};
|
||||
|
||||
/// Check flag for common damage bonuses such as: ATKpercent, Refine, Passive Mastery, Spirit Spheres and Star Crumbs
|
||||
enum e_bonus_chk_flag : uint8 {
|
||||
BCHK_ALL, /// Check if all of the common damage bonuses apply to this skill
|
||||
BCHK_REFINE, /// Check if refine bonus is applied (pre-renewal only currently)
|
||||
BCHK_STAR, /// Check if Star Crumb bonus is applied (pre-renewal only currently)
|
||||
};
|
||||
|
||||
/// Damage structure
|
||||
struct Damage {
|
||||
#ifdef RENEWAL
|
||||
@@ -744,11 +751,6 @@ struct Battle_Config
|
||||
int feature_banking_state_enforce;
|
||||
int instance_allow_reconnect;
|
||||
|
||||
int feature_goldpc_active;
|
||||
int feature_goldpc_time;
|
||||
int feature_goldpc_max_points;
|
||||
int feature_goldpc_vip;
|
||||
|
||||
#include <custom/battle_config_struct.inc>
|
||||
};
|
||||
|
||||
|
||||
@@ -307,32 +307,9 @@ int chrif_save(map_session_data *sd, int flag) {
|
||||
if (sd->premiumStorage.dirty)
|
||||
storage_premiumStorage_save(sd);
|
||||
|
||||
if( flag&CSAVE_QUITTING ){
|
||||
if (flag&CSAVE_QUITTING)
|
||||
sd->state.storage_flag = 0; //Force close it.
|
||||
|
||||
if( sd->goldpc_tid != INVALID_TIMER ){
|
||||
const struct TimerData* td = get_timer( sd->goldpc_tid );
|
||||
|
||||
if( td != nullptr ){
|
||||
// Get the remaining milliseconds until the next reward
|
||||
t_tick remaining = td->tick - gettick();
|
||||
|
||||
// Always round up to full second and a little safety delay
|
||||
remaining += ( remaining % 1000 ) + 2000;
|
||||
|
||||
// Store the seconds that already fully passed
|
||||
pc_setreg2( sd, GOLDPC_SECONDS_VAR, battle_config.feature_goldpc_time - remaining / 1000 );
|
||||
|
||||
// If a player logs out or starts autotrade, stop counting
|
||||
delete_timer( sd->goldpc_tid, pc_goldpc_update );
|
||||
sd->goldpc_tid = INVALID_TIMER;
|
||||
}
|
||||
}else{
|
||||
// Invalid timer anyway
|
||||
sd->goldpc_tid = INVALID_TIMER;
|
||||
}
|
||||
}
|
||||
|
||||
//Saving of registry values.
|
||||
if (sd->vars_dirty)
|
||||
intif_saveregistry(sd);
|
||||
@@ -1598,9 +1575,6 @@ void chrif_parse_ack_vipActive(int fd) {
|
||||
clif_displaymessage(sd->fd,msg_txt(sd,438));
|
||||
}
|
||||
}
|
||||
|
||||
clif_goldpc_info( *sd );
|
||||
|
||||
// Show info if status changed
|
||||
if (((flag&0x4) || changed) && !sd->vip.disableshowrate) {
|
||||
clif_display_pinfo( *sd );
|
||||
|
||||
@@ -11179,9 +11179,6 @@ void clif_parse_LoadEndAck(int fd,map_session_data *sd)
|
||||
channel_mjoin(sd); //join new map
|
||||
|
||||
clif_pk_mode_message(sd);
|
||||
|
||||
// Update the client
|
||||
clif_goldpc_info( *sd );
|
||||
}
|
||||
|
||||
if( sd->guild && ( battle_config.guild_notice_changemap == 2 || guild_notice ) ){
|
||||
@@ -25239,70 +25236,6 @@ void clif_set_npc_window_pos_percent(map_session_data& sd, int x, int y)
|
||||
#endif // PACKETVER_MAIN_NUM >= 20220504
|
||||
}
|
||||
|
||||
void clif_goldpc_info( map_session_data& sd ){
|
||||
#if PACKETVER_MAIN_NUM >= 20140508 || PACKETVER_RE_NUM >= 20140508 || defined(PACKETVER_ZERO)
|
||||
const static int32 client_max_seconds = 3600;
|
||||
|
||||
if( battle_config.feature_goldpc_active ){
|
||||
struct PACKET_ZC_GOLDPCCAFE_POINT p = {};
|
||||
|
||||
p.PacketType = HEADER_ZC_GOLDPCCAFE_POINT;
|
||||
p.isActive = true;
|
||||
if( battle_config.feature_goldpc_vip && pc_isvip( &sd ) ){
|
||||
p.mode = 2;
|
||||
}else{
|
||||
p.mode = 1;
|
||||
}
|
||||
p.point = (int32)pc_readparam( &sd, SP_GOLDPC_POINTS );
|
||||
if( sd.goldpc_tid != INVALID_TIMER ){
|
||||
const struct TimerData* td = get_timer( sd.goldpc_tid );
|
||||
|
||||
if( td != nullptr ){
|
||||
// Get the remaining milliseconds until the next reward
|
||||
t_tick remaining = td->tick - gettick();
|
||||
|
||||
// Always round up to full second
|
||||
remaining += ( remaining % 1000 );
|
||||
|
||||
p.playedTime = (int32)( client_max_seconds - ( remaining / 1000 ) );
|
||||
}else{
|
||||
p.playedTime = 0;
|
||||
}
|
||||
}else{
|
||||
p.playedTime = client_max_seconds;
|
||||
}
|
||||
|
||||
clif_send( &p, sizeof( p ), &sd.bl, SELF );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void clif_parse_dynamic_npc( int fd, map_session_data* sd ){
|
||||
#if PACKETVER_MAIN_NUM >= 20140430 || PACKETVER_RE_NUM >= 20140430 || defined(PACKETVER_ZERO)
|
||||
struct PACKET_CZ_DYNAMICNPC_CREATE_REQUEST* p = (struct PACKET_CZ_DYNAMICNPC_CREATE_REQUEST*)RFIFOP( fd, 0 );
|
||||
|
||||
char npcname[NPC_NAME_LENGTH + 1];
|
||||
|
||||
if( strncasecmp( "GOLDPCCAFE", p->name, sizeof( p->name ) ) == 0 ){
|
||||
safestrncpy( npcname, p->name, sizeof( npcname ) );
|
||||
}else{
|
||||
return;
|
||||
}
|
||||
|
||||
struct npc_data* nd = npc_name2id( npcname );
|
||||
|
||||
if( nd == nullptr ){
|
||||
ShowError( "clif_parse_dynamic_npc: Original NPC \"%s\" was not found.\n", npcname );
|
||||
clif_dynamicnpc_result( *sd, DYNAMICNPC_RESULT_UNKNOWNNPC );
|
||||
return;
|
||||
}
|
||||
|
||||
if( npc_duplicate_npc_for_player( *nd, *sd ) != nullptr ){
|
||||
clif_dynamicnpc_result( *sd, DYNAMICNPC_RESULT_SUCCESS );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* Main client packet processing function
|
||||
*------------------------------------------*/
|
||||
|
||||
@@ -1257,6 +1257,4 @@ void clif_set_npc_window_size(map_session_data& sd, int width, int height);
|
||||
void clif_set_npc_window_pos(map_session_data& sd, int x, int y);
|
||||
void clif_set_npc_window_pos_percent(map_session_data& sd, int x, int y);
|
||||
|
||||
void clif_goldpc_info( map_session_data& sd );
|
||||
|
||||
#endif /* CLIF_HPP */
|
||||
|
||||
@@ -2108,10 +2108,6 @@
|
||||
packet(0x09DA,-1);
|
||||
#endif
|
||||
|
||||
#if PACKETVER_MAIN_NUM >= 20140430 || PACKETVER_RE_NUM >= 20140430 || defined(PACKETVER_ZERO)
|
||||
parseable_packet( HEADER_CZ_DYNAMICNPC_CREATE_REQUEST, sizeof( PACKET_CZ_DYNAMICNPC_CREATE_REQUEST ), clif_parse_dynamic_npc, 0 );
|
||||
#endif
|
||||
|
||||
// 2014-10-08Ragexe
|
||||
#if PACKETVER >= 20141008
|
||||
parseable_packet(0x9FB, -1, clif_parse_pet_evolution, 2, 4); // CZ_PET_EVOLUTION
|
||||
|
||||
@@ -505,7 +505,6 @@ enum _sp {
|
||||
SP_CASHPOINTS, SP_KAFRAPOINTS,
|
||||
SP_PCDIECOUNTER, SP_COOKMASTERY,
|
||||
SP_ACHIEVEMENT_LEVEL,
|
||||
SP_GOLDPC_POINTS,
|
||||
|
||||
// Mercenaries
|
||||
SP_MERCFLEE=165, SP_MERCKILLS=189, SP_MERCFAITH=190,
|
||||
|
||||
@@ -2492,6 +2492,8 @@ int mob_getdroprate(struct block_list *src, std::shared_ptr<s_mob_db> mob, int b
|
||||
|
||||
if (sd->sc.getSCE(SC_ITEMBOOST))
|
||||
drop_rate_bonus += sd->sc.getSCE(SC_ITEMBOOST)->val1;
|
||||
if (sd->sc.getSCE(SC_PERIOD_RECEIVEITEM_2ND))
|
||||
drop_rate_bonus += sd->sc.getSCE(SC_PERIOD_RECEIVEITEM_2ND)->val1;
|
||||
|
||||
int cap;
|
||||
|
||||
|
||||
@@ -2286,38 +2286,6 @@ bool pc_set_hate_mob(map_session_data *sd, int pos, struct block_list *bl)
|
||||
return true;
|
||||
}
|
||||
|
||||
TIMER_FUNC(pc_goldpc_update){
|
||||
map_session_data* sd = map_id2sd( id );
|
||||
|
||||
if( sd == nullptr ){
|
||||
return 0;
|
||||
}
|
||||
|
||||
sd->goldpc_tid = INVALID_TIMER;
|
||||
|
||||
// Check if feature is still active
|
||||
if( !battle_config.feature_goldpc_active ){
|
||||
return 0;
|
||||
}
|
||||
|
||||
// TODO: add mapflag to disable?
|
||||
|
||||
int64 points = pc_readparam( sd, SP_GOLDPC_POINTS );
|
||||
|
||||
if( battle_config.feature_goldpc_vip && pc_isvip( sd ) ){
|
||||
points += 2;
|
||||
}else{
|
||||
points += 1;
|
||||
}
|
||||
|
||||
// Reset the seconds
|
||||
pc_setreg2( sd, GOLDPC_SECONDS_VAR, 0 );
|
||||
// Update the points and trigger a new timer if necessary
|
||||
pc_setparam( sd, SP_GOLDPC_POINTS, points );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* Invoked once after the char/account/account2 registry variables are received. [Skotlex]
|
||||
* We didn't receive item information at this point so DO NOT attempt to do item operations here.
|
||||
@@ -2426,15 +2394,6 @@ void pc_reg_received(map_session_data *sd)
|
||||
clif_instance_info( *sd );
|
||||
#endif
|
||||
|
||||
if( battle_config.feature_goldpc_active && pc_readreg2( sd, GOLDPC_POINT_VAR ) < battle_config.feature_goldpc_max_points && !sd->state.autotrade ){
|
||||
sd->goldpc_tid = add_timer( gettick() + ( battle_config.feature_goldpc_time - pc_readreg2( sd, GOLDPC_SECONDS_VAR ) ) * 1000, pc_goldpc_update, sd->bl.id, (intptr_t)nullptr );
|
||||
#ifndef VIP_ENABLE
|
||||
clif_goldpc_info( *sd );
|
||||
#endif
|
||||
}else{
|
||||
sd->goldpc_tid = INVALID_TIMER;
|
||||
}
|
||||
|
||||
// pet
|
||||
if (sd->status.pet_id > 0)
|
||||
intif_request_petdata(sd->status.account_id, sd->status.char_id, sd->status.pet_id);
|
||||
@@ -8263,6 +8222,9 @@ static void pc_calcexp(map_session_data *sd, t_exp *base_exp, t_exp *job_exp, st
|
||||
bonus += (sd->sc.getSCE(SC_EXPBOOST)->val1 / battle_config.vip_bm_increase);
|
||||
}
|
||||
|
||||
if (sd->sc.getSCE(SC_PERIOD_PLUSEXP_2ND))
|
||||
bonus += sd->sc.getSCE(SC_PERIOD_PLUSEXP_2ND)->val1;
|
||||
|
||||
if (*base_exp) {
|
||||
t_exp exp = (t_exp)(*base_exp + ((double)*base_exp * ((bonus + vip_bonus_base) / 100.)));
|
||||
*base_exp = cap_value(exp, 1, MAX_EXP);
|
||||
@@ -8272,6 +8234,9 @@ static void pc_calcexp(map_session_data *sd, t_exp *base_exp, t_exp *job_exp, st
|
||||
if (sd->sc.getSCE(SC_JEXPBOOST))
|
||||
bonus += sd->sc.getSCE(SC_JEXPBOOST)->val1;
|
||||
|
||||
if (sd->sc.getSCE(SC_PERIOD_PLUSEXP_2ND)) // Increase Jexp as well
|
||||
bonus += sd->sc.getSCE(SC_PERIOD_PLUSEXP_2ND)->val1;
|
||||
|
||||
if (*job_exp) {
|
||||
t_exp exp = (t_exp)(*job_exp + ((double)*job_exp * ((bonus + vip_bonus_job) / 100.)));
|
||||
*job_exp = cap_value(exp, 1, MAX_EXP);
|
||||
@@ -10236,7 +10201,6 @@ int64 pc_readparam(map_session_data* sd,int64 type)
|
||||
#endif
|
||||
case SP_CRIT_DEF_RATE: val = sd->bonus.crit_def_rate; break;
|
||||
case SP_ADD_ITEM_SPHEAL_RATE: val = sd->bonus.itemsphealrate2; break;
|
||||
case SP_GOLDPC_POINTS: val = pc_readreg2( sd, GOLDPC_POINT_VAR ); break;
|
||||
default:
|
||||
ShowError("pc_readparam: Attempt to read unknown parameter '%lld'.\n", type);
|
||||
return -1;
|
||||
@@ -10488,28 +10452,6 @@ bool pc_setparam(map_session_data *sd,int64 type,int64 val_tmp)
|
||||
sd->cook_mastery = val;
|
||||
pc_setglobalreg(sd, add_str(COOKMASTERY_VAR), sd->cook_mastery);
|
||||
return true;
|
||||
case SP_GOLDPC_POINTS:
|
||||
val = cap_value( val, 0, battle_config.feature_goldpc_max_points );
|
||||
|
||||
pc_setreg2( sd, GOLDPC_POINT_VAR, val );
|
||||
|
||||
// If you do not check this, some funny things happen (circle logics, timer mismatches, etc...)
|
||||
if( !sd->state.connect_new ){
|
||||
// Make sure to always delete the timer
|
||||
if( sd->goldpc_tid != INVALID_TIMER ){
|
||||
delete_timer( sd->goldpc_tid, pc_goldpc_update );
|
||||
sd->goldpc_tid = INVALID_TIMER;
|
||||
}
|
||||
|
||||
// If the system is enabled and the player can still earn some points restart the timer
|
||||
if( battle_config.feature_goldpc_active && val < battle_config.feature_goldpc_max_points && !sd->state.autotrade ){
|
||||
sd->goldpc_tid = add_timer( gettick() + ( battle_config.feature_goldpc_time - pc_readreg2( sd, GOLDPC_SECONDS_VAR ) ) * 1000, pc_goldpc_update, sd->bl.id, (intptr_t)nullptr );
|
||||
}
|
||||
|
||||
// Update the client
|
||||
clif_goldpc_info( *sd );
|
||||
}
|
||||
return true;
|
||||
default:
|
||||
ShowError("pc_setparam: Attempted to set unknown parameter '%lld'.\n", type);
|
||||
return false;
|
||||
@@ -15930,7 +15872,6 @@ void do_init_pc(void) {
|
||||
add_timer_func_list(pc_autotrade_timer, "pc_autotrade_timer");
|
||||
add_timer_func_list(pc_on_expire_active, "pc_on_expire_active");
|
||||
add_timer_func_list(pc_macro_detector_timeout, "pc_macro_detector_timeout");
|
||||
add_timer_func_list( pc_goldpc_update, "pc_goldpc_update" );
|
||||
|
||||
add_timer(gettick() + autosave_interval, pc_autosave, 0, 0);
|
||||
|
||||
|
||||
@@ -65,12 +65,6 @@ class MapGuild;
|
||||
#define ATTENDANCE_DATE_VAR "#AttendanceDate"
|
||||
#define ATTENDANCE_COUNT_VAR "#AttendanceCounter"
|
||||
#define ACHIEVEMENTLEVEL "AchievementLevel"
|
||||
#ifndef GOLDPC_POINT_VAR
|
||||
#define GOLDPC_POINT_VAR "Goldpc_Points"
|
||||
#endif
|
||||
#ifndef GOLDPC_SECONDS_VAR
|
||||
#define GOLDPC_SECONDS_VAR "Goldpc_Seconds"
|
||||
#endif
|
||||
|
||||
//Total number of classes (for data storage)
|
||||
#define CLASS_COUNT (JOB_MAX - JOB_NOVICE_HIGH + JOB_MAX_BASIC)
|
||||
@@ -947,8 +941,6 @@ public:
|
||||
s_macro_detect macro_detect;
|
||||
|
||||
std::vector<uint32> party_booking_requests;
|
||||
|
||||
int goldpc_tid;
|
||||
};
|
||||
|
||||
extern struct eri *pc_sc_display_ers; /// Player's SC display table
|
||||
@@ -1760,6 +1752,4 @@ void pc_macro_reporter_process(map_session_data &sd, int32 reporter_account_id =
|
||||
void pc_reputation_generate();
|
||||
#endif
|
||||
|
||||
TIMER_FUNC(pc_goldpc_update);
|
||||
|
||||
#endif /* PC_HPP */
|
||||
|
||||
@@ -613,7 +613,6 @@
|
||||
export_parameter(PCDIECOUNTER_VAR, SP_PCDIECOUNTER);
|
||||
export_parameter(COOKMASTERY_VAR, SP_COOKMASTERY);
|
||||
export_parameter(ACHIEVEMENTLEVEL, SP_ACHIEVEMENT_LEVEL);
|
||||
export_parameter(GOLDPC_POINT_VAR, SP_GOLDPC_POINTS);
|
||||
|
||||
export_constant2("bMaxHP",SP_MAXHP);
|
||||
export_constant2("bMaxSP",SP_MAXSP);
|
||||
@@ -1911,10 +1910,11 @@
|
||||
export_constant(SC_GRENADE_FRAGMENT_6);
|
||||
export_constant(SC_AUTO_FIRING_LAUNCHER);
|
||||
export_constant(SC_HIDDEN_CARD);
|
||||
|
||||
#ifdef RENEWAL
|
||||
export_constant(SC_PERIOD_RECEIVEITEM_2ND);
|
||||
export_constant(SC_PERIOD_PLUSEXP_2ND);
|
||||
export_constant(SC_EXTREMITYFIST2);
|
||||
#endif
|
||||
export_constant(SC_POWERUP);
|
||||
export_constant(SC_AGIUP);
|
||||
|
||||
/* status icons */
|
||||
export_deprecated_constant2("SI_BLANK",-1);
|
||||
|
||||
@@ -1422,15 +1422,13 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
|
||||
break;
|
||||
|
||||
case AS_VENOMKNIFE:
|
||||
if (sd) //Poison chance must be that of Envenom. [Skotlex]
|
||||
skill_lv = pc_checkskill(sd, TF_POISON);
|
||||
[[fallthrough]];
|
||||
case TF_POISON:
|
||||
case AS_SPLASHER:
|
||||
if(!sc_start2(src,bl,SC_POISON,(4*skill_lv+10),skill_lv,src->id,skill_get_time2(skill_id,skill_lv))
|
||||
&& sd && skill_id==TF_POISON
|
||||
)
|
||||
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
||||
sc_start2(src, bl, SC_POISON, 100, skill_lv, src->id, skill_get_time2(skill_id, skill_lv));
|
||||
break;
|
||||
|
||||
case TF_POISON:
|
||||
if (!sc_start2(src, bl, SC_POISON, (4 * skill_lv + 10), skill_lv, src->id, skill_get_time2(skill_id, skill_lv)) && sd)
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
|
||||
break;
|
||||
|
||||
case AS_SONICBLOW:
|
||||
@@ -6200,7 +6198,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
break;
|
||||
|
||||
case NPC_MAGICALATTACK:
|
||||
skill_attack(BF_MAGIC,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);
|
||||
sc_start(src,src,SC_MAGICALATTACK,100,skill_lv,skill_get_time(skill_id,skill_lv));
|
||||
break;
|
||||
|
||||
@@ -9651,6 +9649,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
//Remove bonus_script by Dispell
|
||||
if (dstsd)
|
||||
pc_bonus_script_clear(dstsd,BSF_REM_ON_DISPELL);
|
||||
// Monsters will unlock their target instead
|
||||
else if (dstmd)
|
||||
mob_unlocktarget(dstmd, tick);
|
||||
|
||||
if(!tsc || !tsc->count)
|
||||
break;
|
||||
@@ -9997,15 +9998,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
break;
|
||||
|
||||
case NPC_POWERUP:
|
||||
sc_start(src,bl,SC_INCATKRATE,100,200,skill_get_time(skill_id, skill_lv));
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,
|
||||
sc_start(src,bl,type,100,100,skill_get_time(skill_id, skill_lv)));
|
||||
sc_start2(src,bl,type,100,200,100,skill_get_time(skill_id, skill_lv)));
|
||||
break;
|
||||
|
||||
case NPC_AGIUP:
|
||||
sc_start(src,bl,SC_SPEEDUP1,100,50,skill_get_time(skill_id, skill_lv));
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,
|
||||
sc_start(src,bl,type,100,100,skill_get_time(skill_id, skill_lv)));
|
||||
sc_start2(src,bl,type,100,50,100,skill_get_time(skill_id, skill_lv)));
|
||||
break;
|
||||
|
||||
case NPC_INVISIBLE:
|
||||
@@ -10253,9 +10252,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
}
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,
|
||||
sc_start4(src,bl,type,100,skill_lv,skill_id,src->id,skill_get_time(skill_id,skill_lv),1000));
|
||||
#ifndef RENEWAL
|
||||
if (sd) skill_blockpc_start (sd, skill_id, skill_get_time(skill_id, skill_lv)+3000);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case PF_MINDBREAKER:
|
||||
|
||||
@@ -7403,6 +7403,8 @@ static signed short status_calc_hit(struct block_list *bl, status_change *sc, in
|
||||
hit += sc->getSCE(SC_MTF_HITFLEE)->val1;
|
||||
if(sc->getSCE(SC_INCHITRATE))
|
||||
hit += hit * sc->getSCE(SC_INCHITRATE)->val1/100;
|
||||
if (sc->getSCE(SC_POWERUP))
|
||||
hit += hit * sc->getSCE(SC_POWERUP)->val2 / 100;
|
||||
if(sc->getSCE(SC_BLIND))
|
||||
hit -= hit * 25/100;
|
||||
if(sc->getSCE(SC_HEAT_BARREL))
|
||||
@@ -7519,6 +7521,8 @@ static signed short status_calc_flee(struct block_list *bl, status_change *sc, i
|
||||
// Rate value
|
||||
if(sc->getSCE(SC_INCFLEERATE))
|
||||
flee += flee * sc->getSCE(SC_INCFLEERATE)->val1/100;
|
||||
if (sc->getSCE(SC_AGIUP))
|
||||
flee += flee * sc->getSCE(SC_AGIUP)->val2 / 100;
|
||||
if(sc->getSCE(SC_SPIDERWEB) || sc->getSCE(SC_WIDEWEB))
|
||||
flee -= flee * 50/100;
|
||||
if(sc->getSCE(SC_BERSERK))
|
||||
@@ -8012,8 +8016,10 @@ static unsigned short status_calc_speed(struct block_list *bl, status_change *sc
|
||||
speed_rate = 150;
|
||||
|
||||
// GetMoveHasteValue1()
|
||||
if( sc->getSCE(SC_SPEEDUP1) ) // !FIXME: used both by NPC_AGIUP and Speed Potion script
|
||||
if( sc->getSCE(SC_SPEEDUP1) )
|
||||
val = max( val, sc->getSCE(SC_SPEEDUP1)->val1 );
|
||||
if (sc->getSCE(SC_AGIUP))
|
||||
val = max(val, sc->getSCE(SC_AGIUP)->val1);
|
||||
if( sc->getSCE(SC_INCREASEAGI) )
|
||||
val = max( val, 25 );
|
||||
if( sc->getSCE(SC_WINDWALK) )
|
||||
@@ -8081,6 +8087,8 @@ static unsigned short status_calc_speed(struct block_list *bl, status_change *sc
|
||||
speed = 200;
|
||||
if( sc->getSCE(SC_DEFENDER) )
|
||||
speed = max(speed, 200);
|
||||
if (sc->getSCE(SC_ARMOR))
|
||||
speed = max(speed, 200);
|
||||
if( sc->getSCE(SC_WALKSPEED) && sc->getSCE(SC_WALKSPEED)->val1 > 0 ) // ChangeSpeed
|
||||
speed = speed * 100 / sc->getSCE(SC_WALKSPEED)->val1;
|
||||
|
||||
@@ -11467,7 +11475,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
break;
|
||||
case SC_ARMOR:
|
||||
// NPC_DEFENDER:
|
||||
val2 = 80; // Damage reduction
|
||||
val2 = 8; // Damage will be divided by this value
|
||||
// Attack requirements to be blocked:
|
||||
val3 = BF_LONG; // Range
|
||||
val4 = BF_WEAPON|BF_MISC; // Type
|
||||
@@ -11511,8 +11519,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
case SC_EXPBOOST:
|
||||
case SC_JEXPBOOST:
|
||||
case SC_JP_EVENT04:
|
||||
if (val1 < 0)
|
||||
val1 = 0;
|
||||
case SC_PERIOD_RECEIVEITEM_2ND:
|
||||
case SC_PERIOD_PLUSEXP_2ND:
|
||||
if (val1 < 1)
|
||||
return 0;
|
||||
break;
|
||||
case SC_INCFLEE2:
|
||||
case SC_INCCRI:
|
||||
@@ -12884,13 +12894,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
if ((val1&0xFFFF) == CG_MOONLIT)
|
||||
sc->opt3 |= OPT3_MOONLIT;
|
||||
break;
|
||||
case SC_INCATKRATE:
|
||||
// Simulate Explosion Spirits effect for NPC_POWERUP [Skotlex]
|
||||
if (bl->type != BL_MOB) {
|
||||
disable_opt_flag = true;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// On Aegis, when turning on a status change, first goes the option packet, then the sc packet.
|
||||
|
||||
@@ -1304,10 +1304,13 @@ enum sc_type : int16 {
|
||||
SC_GRENADE_FRAGMENT_6,
|
||||
SC_AUTO_FIRING_LAUNCHER,
|
||||
SC_HIDDEN_CARD,
|
||||
SC_PERIOD_RECEIVEITEM_2ND,
|
||||
SC_PERIOD_PLUSEXP_2ND,
|
||||
|
||||
SC_EXTREMITYFIST2,
|
||||
SC_POWERUP,
|
||||
SC_AGIUP,
|
||||
|
||||
#ifdef RENEWAL
|
||||
SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
|
||||
#endif
|
||||
SC_MAX, //Automatically updated max, used in for's to check we are within bounds.
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user