Hi, rAthena Community, i need some help about this script (not tested yet but i guess is working) what i want... is a bit help how to edit the bonuses, i liked whole the script but i wanna change some bonuses because counting em' with a base lv 255 (like the server im using) the bonuses would be get broken.... also i wanna delete some of em and add news as i can understand ...
//===== EinherjarRO Scripts ==================================
//= WeaponMasteries
//===== By: ==================================================
//= Stolao
//===== Current Version: =====================================
//= 1.36
//===== Compatible With: =====================================
//= rAthena SVN
//===== Description: =========================================
//= As you train using a particulat weapon type you gain
//= passive bonuses depending on how much you have trained in
//= that type. There are five types Onslaught, Swiftness,
//= Safeguard, Ranged and Mystical
//===== Comments: ============================================
//= Masteries can go up to level 999 with curve of 2100
//===== Additional Comments: =================================
//= Visit Git For Older Versions
//= 1.25 Added a Small boost to secondary stat based off prime stat
//= 1.26 Added a Check for Item in Hand + Conf
//= 1.27 Fixed mssing ""
//= 1.28 Fixed missing ')'
//= 1.29 Added a missing conf setting
//= 1.2A Fixed missing descriptions
//= 1.2B Increased .expcurve from 2500 -> 5000 due to Jobrate
//= 1.2C Increased .wLvBonus from 1 -> 150 due to Jobrate
//= 1.2D Replace 10 with .FirstLevel for custmoizability
//= 1.2E Increase .FirstLevel from 10 -> 2000 due to Jobrate
//= 1.2F Moved Level 0 Effects to top for consistant reading
//= 1.30 Fixed a bug with @wlvl
//= 1.31 Fixed bug where you would recive bonus from no gear
//= 1.32 Tabulation
//= 1.33 Made sword Onslaught
//= 1.34 Made Any Shield Combo Safeguard
//= 1.35 Made Exp Table a Constant (Dynamic from settings)
//= 1.36 Fixed typo bug in Leveing up
//===== Contact Ifo: =========================================
//= [Stolao]
//= Email: [email protected]
//============================================================
//
// Str - Onslaught: 2HSword,1HAxe,2HAxe,1HMace,2HMace(unused),Knuckle
// Agi - Swiftness: Dagger,Fuuma Shuriken,Katar
// Vit - Safegaurd: Unarmmed,1HSpear,2HSpear,Specialty
// Dex - Ranged: Bow,Instrument,Whip,Revolver,Rifle,Gatling Gun,Shotgun,Grenade Launcher
// Int - Mystical: Rod,Book,2HStaff,Scythe
function script Onslaught_M {
bonus bStr,1+getarg(0,0)/32;
bonus bAtkrate,1 + getarg(0,0) / 7 + ((1 + getarg(0,0) / 7) *readparam(bStr) / 100);
if(getarg(0,0) >= 1) bonus bCritical,1+getarg(0,0)/20;
if(getarg(0,0) >= 2) bonus bAtk,1+getarg(0,0)/4;
if(getarg(0,0) >= 4) bonus bAtk2,1+getarg(0,0)/4;
if(getarg(0,0) >= 8) bonus bPerfectHitAddRate,1+getarg(0,0)/21;
if(getarg(0,0) >= 16) bonus bBaseAtk,getarg(0,0)/4+1;
if(getarg(0,0) >= 32) bonus bCritAtkRate,getarg(0,0)/4+1;
if(getarg(0,0) >= 64) bonus bAspdRate,getarg(0,0)/22 + 1;
if(getarg(0,0) >= 128) bonus bSplashAddRange,1;
return;
}
function script Swiftness_M {
bonus bAgi,1+getarg(0,0)/32;
bonus bAspdRate,1+getarg(0,0)/7+((1+getarg(0,0)/7)*readparam(bAgi)/100);
if(getarg(0,0) >= 1) bonus bSpeedAddRate,1+getarg(0,0)/9;
if(getarg(0,0) >= 2) bonus bFlee,getarg(0,0)/3;
if(getarg(0,0) >= 4) bonus bDoubleAddRate,1+getarg(0,0)/9;
if(getarg(0,0) >= 8) bonus bFlee2,1+getarg(0,0)/33;
if(getarg(0,0) >= 16) bonus bPerfectHitAddRate,1+getarg(0,0)/11;
if(getarg(0,0) >= 32) bonus bCritAtkRate,getarg(0,0)/9-1;
if(getarg(0,0) >= 64) bonus bCritical,1+getarg(0,0)/10;
if(getarg(0,0) >= 128) bonus2 bHPDrainRate,1+getarg(0,0),1+getarg(0,0)/24;
return;
}
function script Safegaurd_M {
bonus bVit,1+getarg(0,0)/32;
bonus bMaxHP,getarg(0,0)*5+5+((getarg(0,0)*5+5)*readparam(bVit)/100);
if(getarg(0,0) >= 1) bonus bHPrecovRate,1+getarg(0,0)/2;
if(getarg(0,0) >= 2) bonus bDef,1+getarg(0,0)/20;
if(getarg(0,0) >= 4) bonus bMdef,1+getarg(0,0)/24;
if(getarg(0,0) >= 8) bonus bMaxHPrate,1+getarg(0,0)/11;
if(getarg(0,0) >= 16) bonus bNearAtkDef,getarg(0,0)/20+1;
if(getarg(0,0) >= 32) bonus bLongAtkDef,getarg(0,0)/21+1;
if(getarg(0,0) >= 64) bonus bMagicAtkDef,getarg(0,0)/22+1;
if(getarg(0,0) >= 128) bonus bCriticalDef,getarg(0,0)/23+1;
return;
}
function script Ranged_M {
bonus bDex,1+getarg(0,0)/32;
bonus bAtkrate,1+getarg(0,0)/7+((1+getarg(0,0)/7)*readparam(bDex)/100);
if(getarg(0,0) >= 1) bonus bBaseAtk,getarg(0,0)/3+2;
if(getarg(0,0) >= 2) bonus bCritical,1+getarg(0,0)/21;
if(getarg(0,0) >= 4) bonus bFlee,1+getarg(0,0)/11;
if(getarg(0,0) >= 8) bonus bAspd,1+getarg(0,0)/11;
if(getarg(0,0) >= 16) bonus bHit,1+getarg(0,0)/5;
if(getarg(0,0) >= 32) bonus bLongAtkRate,getarg(0,0)/9-1;
if(getarg(0,0) >= 64) bonus bCritAtkRate,4+getarg(0,0)/9;
if(getarg(0,0) >= 128) bonus bAtkRange,1+getarg(0,0)/99;
return;
}
function script Mystical_M {
bonus bInt,1+getarg(0,0)/32;
bonus bMatk,1+getarg(0,0)+((1+getarg(0,0))*readparam(bInt)/100);
if(getarg(0,0) >= 1) bonus bSPrecovRate,1+getarg(0,0)/2;
if(getarg(0,0) >= 2) bonus bMaxSP,getarg(0,0)*2+2;
if(getarg(0,0) >= 4) bonus bCastrate,-1-getarg(0,0)/20;
if(getarg(0,0) >= 8) bonus bUseSPrate,-1-getarg(0,0)/21;
if(getarg(0,0) >= 16) bonus bDelayrate,-1-getarg(0,0)/22;
if(getarg(0,0) >= 32) bonus bHealPower,1+getarg(0,0)/2;
if(getarg(0,0) >= 64) bonus bMAtkrate,1+getarg(0,0)/7;
if(getarg(0,0) >= 128) bonus bNoCastCancel,1;
return;
}
prontera,5,5,5 script PCSTATCALC 111,{
end;
OnWeaponInfo:
.@M$ = .@atcmd_parameters$[0];
if((.@M$ == "")){
if(getiteminfo(getequipid(EQI_HAND_R),11) == 2 &&
getiteminfo(getequipid(EQI_HAND_L),2) == 4)
.@i = 0;
else .@i = getiteminfo(getequipid(EQI_HAND_R),11);
switch(.@i){
case 3: case 6: case 7: case 8:
case 9: case 12: case 2: .@M$ = "Onslaught"; Break;
case 1: case 16: case 22: .@M$ = "Swiftness"; Break;
case 4: case 5: default: .@M$ = "Safegaurd"; Break;
case 11: case 13: case 14: case 17:
case 18: case 19: case 20: case 21: .@M$ = "Ranged"; Break;
case 10: case 15: case 23: case 24: .@M$ = "Mystical"; Break;
}
}
if(.@M$ == "Onslaught" || .@M$ == "onslaught" || .@M$ == "OnSlaught") .@i = 1;
if(.@M$ == "Swiftness" || .@M$ == "swiftness") .@i = 2;
if(.@M$ == "Safegaurd" || .@M$ == "SafeGaurd" || .@M$ == "safegaurd") .@i = 3;
if(.@M$ == "Ranged" || .@M$ == "ranged" ) .@i = 4;
if(.@M$ == "Mystical" || .@M$ == "mystical" ) .@i = 5;
.@X = atoi(.@atcmd_parameters$[1]);
if(!.@X) .@X = getd(""+.@M$+"Master");
switch(.@i){
case 1:
dispbottom "Onslaught Lv: "+.@X+" "+OnslaughtExp+" / "+.NeededExp[.@X]+"xp";
dispbottom "Str +"+(1+.@X/32)+"";
dispbottom "Atk +"+(1+.@X/9)+"%";
if(.@X >= 1)dispbottom "Critical Chance +"+(1+.@X/20)+"";
if(.@X >= 2)dispbottom "Atk +"+(1+.@X/9)+"";
if(.@X >= 4)dispbottom "Weapon Atk +"+(1+.@X/11)+"";
if(.@X >= 8)dispbottom "Perfect Hit +"+(1+.@X/21)+"";
if(.@X >= 16)dispbottom "Base Atk +"+(.@X/4+1)+"";
if(.@X >= 32)dispbottom "Crit Damage +"+(.@X/8+3)+"%";
if(.@X >= 64)dispbottom "Aspd +"+.@X/16+"%";
if(.@X >= 128)dispbottom "Splash attack radius +1";
break;
case 2:
dispbottom "Swiftness Lv: "+.@X+" "+SwiftnessExp+" / "+.NeededExp[.@X]+"xp";
dispbottom "Agi +"+(1+.@X/32)+"";
dispbottom "Aspd +"+(1+.@X/9)+"%";
if(.@X >= 1)dispbottom "Moving speed +"+(1+.@X/9)+"%";
if(.@X >= 2)dispbottom "Flee +"+(.@X/2)+"";
if(.@X >= 4)dispbottom "Double Attack Chance +"+(1+.@X/9)+"%";
if(.@X >= 8)dispbottom "Perfect Dodge +"+(1+.@X/33)+"";
if(.@X >= 16)dispbottom "On-target impact chance +"+(1+.@X/11)+"%";
if(.@X >= 32)dispbottom "Crit Damage +"+(.@X/9-1)+"%";
if(.@X >= 64)dispbottom "Critical Chance +"+(1+.@X/10)+"";
if(.@X >= 128)dispbottom ""+(1+SwiftnessMaster)/10+"."+((1+SwiftnessMaster)%10)+"% chance of healing for "+(.@X/24+1)+"% of damage dealt with each normal attack";
break;
case 3:
dispbottom "Safegaurd Lv: "+.@X+" "+SafegaurdExp+" / "+.NeededExp[.@X]+"xp";
dispbottom "Vit +"+(1+.@X/32)+"";
dispbottom "Max HP +"+(.@X*5+5)+"";
if(.@X >= 1)dispbottom "Natural HP recovery ratio +"+(1+.@X/2)+"%";
if(.@X >= 2)dispbottom "Def +"+(1+.@X/20)+"";
if(.@X >= 4)dispbottom "Mdef +"+(1+.@X/24)+"";
if(.@X >= 8)dispbottom "Max HP +"+(1+.@X/9)+"%";
if(.@X >= 16)dispbottom "Adds "+(.@X/20+1)+" damage reduction against Critical Hits";
if(.@X >= 32)dispbottom "Adds "+(.@X/21+1)+" damage reduction against melee physical attacks";
if(.@X >= 64)dispbottom "Adds "+(.@X/22+1)+" damage reduction against ranged physical";
if(.@X >= 128)dispbottom "Adds "+(.@X/23+1)+" damage reduction against magical attacks";
break;
case 4:
dispbottom "Ranged Lv: "+.@X+" "+RangedExp+" / "+.NeededExp[.@X]+"xp";
dispbottom "Dex +"+(1+.@X/32)+"";
dispbottom "Atk +"+(1+.@X/9)+"%";
if(.@X >= 1)dispbottom "Moving speed +"+(1+.@X/20)+"%";
if(.@X >= 2)dispbottom "Critical +"+(1+.@X/21)+"";
if(.@X >= 4)dispbottom "Flee +"+(1+.@X/2)+"";
if(.@X >= 8)dispbottom "Aspd +"+(.@X/11)+"";
if(.@X >= 16)dispbottom "Hit +"+(.@X/9)+"";
if(.@X >= 32)dispbottom "Increases damage of ranged attacks by "+(.@X/11)+"%";
if(.@X >= 64)dispbottom "Crit Damage +"+(4+.@X/9)+"%";
if(.@X >= 128)dispbottom "Atk Range +"+(1+.@X/99)+"";
break;
case 5:
dispbottom "Mystical Lv: "+.@X+" "+MysticalExp+" / "+.NeededExp[.@X]+"xp";
dispbottom "Int +"+(1+.@X/32)+"";
dispbottom "Matk +"+(1+.@X/9)+"%";
if(.@X >= 1)dispbottom "Natural SP recovery ratio +"+(.@X/2+1)+"%";
if(.@X >= 2)dispbottom "Max SP +"+(2+.@X*2)+"";
if(.@X >= 4)dispbottom "Skill casting time "+(-1-.@X/20)+"%";
if(.@X >= 8)dispbottom "SP consumption "+(-1-.@X/21)+"%";
if(.@X >= 16)dispbottom "Decreases skill delay by "+(1+.@X/22)+"%";
if(.@X >= 32)dispbottom "Increase heal amount of all heal skills by "+(1+.@X/2)+"%";
if(.@X >= 64)dispbottom "Weapon magical attack power +"+(.@X+1)+"";
if(.@X >= 128)dispbottom "Prevents casting from being interrupted when hit";
break;
default:
dispbottom "@wi <Type><Level>";
dispbottom "Type: Onslaught, Swiftness, Safegaurd, Ranged, Mystical";
break;
}
end;
OnWeaponLevel:
.@M$ = .@atcmd_parameters$[0];
.@X = atoi(.@atcmd_parameters$[1]);
if((.@M$ != "Onslaught" && .@M$ != "Swiftness" && .@M$ != "Safegaurd" && .@M$ != "Ranged" && .@M$ != "Mystical" && .@M$ != "All")||!.@X){
dispbottom "@wlvl <type><lvl>";
dispbottom "Onslaught, Swiftness, Safegaurd, Ranged, Mystical, All";
end;
}
if(.MaxMastery >= .@X){
if(.@M$ == "All"){
setarray .@X$[0],"Onslaught","Swiftness","Safegaurd","Ranged","Mystical";
.@i = 0;
while(.@i < 5){
setd ""+.@X$[.@i]+"Master",.@X;
setd ""+.@X$[.@i]+"Exp",0;
dispbottom ""+.@X$[.@i]+" Mastery has advanced to Lv "+.@X+"!";
.@i++;
}
} else {
setd ""+.@M$+"Master",.@X;
setd ""+.@M$+"Exp",0;
dispbottom ""+.@M$+" Mastery has advanced to Lv "+.@X+"!";
}
} else dispbottom "Sorry. Your "+.@M$+" Mastery has reached its limit!";
end;
OnPCStatCalcEvent:
if(.Weapon){
if(getequipid(EQI_HAND_R) > 500 || (getequipid(EQI_HAND_R) < 500 && .RightFist)){
if(getiteminfo(getequipid(EQI_HAND_R),11) == 2 &&
getiteminfo(getequipid(EQI_HAND_L),2) == 4)
.@i = 0;
else .@i = getiteminfo(getequipid(EQI_HAND_R),11);
switch(.@i){
case 3: case 6: case 7: case 8:
case 9: case 12: case 2: Onslaught_M(OnslaughtMaster); Break;
case 1: case 16: case 22: Swiftness_M(SwiftnessMaster); Break;
case 4: case 5: default: Safegaurd_M(SafegaurdMaster); Break;
case 11: case 13: case 14: case 17:
case 18: case 19: case 20: case 21: Ranged_M(RangedMaster); Break;
case 10: case 15: case 23: case 24: Mystical_M(MysticalMaster); Break;
}
}
if((getequipid(EQI_HAND_L) > 500 && getiteminfo(getequipid(EQI_HAND_R),5) != 34 && .Left) || (getequipid(EQI_HAND_L) < 500 && .LeftFist)){
if(getiteminfo(getequipid(EQI_HAND_L),2) == 4)
.@i = 0;
else .@i = getiteminfo(getequipid(EQI_HAND_L),11);
switch(.@i){
case 3: case 6: case 7: case 8:
case 9: case 12: case 2: Onslaught_M(OnslaughtMaster / 2); Break;
case 1: case 16: case 22: Swiftness_M(SwiftnessMaster / 2); Break;
case 4: case 5: default: Safegaurd_M(SafegaurdMaster / 2); Break;
case 11: case 13: case 14: case 17:
case 18: case 19: case 20: case 21: Ranged_M(RangedMaster / 2); Break;
case 10: case 15: case 23: case 24: Mystical_M(MysticalMaster / 2); Break;
}
}
}
end;
OnNPCKillEvent:
if(.Weapon){
.@M$ = "";
if(getequipid(EQI_HAND_R) > 500 || (getequipid(EQI_HAND_R) < 500 && .RightFist)){
if(getiteminfo(getequipid(EQI_HAND_R),11) == 2 &&
getiteminfo(getequipid(EQI_HAND_L),2) == 4)
.@i = 0;
else .@i = getiteminfo(getequipid(EQI_HAND_R),11);
switch(.@i){
case 3: case 6: case 7: case 8:
case 9: case 12: case 2: .@M$ = "Onslaught"; Break;
case 1: case 16: case 22: .@M$ = "Swiftness"; Break;
case 4: case 5: default: .@M$ = "Safegaurd"; Break;
case 11: case 13: case 14: case 17:
case 18: case 19: case 20: case 21: .@M$ = "Ranged"; Break;
case 10: case 15: case 23: case 24: .@M$ = "Mystical"; Break;
}
.@exp = strmobinfo(3,killedrid);
.@wLv = getiteminfo(getequipid(EQI_HAND_R),13);
.@master = getd(""+ .@M$ + "Master");
if(.MaxMastery > .@master){
Setd ""+.@M$+"Exp",getd(""+.@M$+"Exp") + .@exp * (.Rates * (getstatus(SC_JEXPBOOST,3)?3:2) / 2) + .@wLv * .@wLv * .wLvBonus;
if(getd(""+.@M$+"Exp") > .NeededExp[.@master]){
setd ""+.@M$+"Master",.@master + 1;
announce ""+.@M$+" Mastery has advanced to Lv "+(.@master + 1)+"!",bc_blue|bc_self;
Setd ""+.@M$+"Exp",0;
}
}
}
if((getequipid(EQI_HAND_L) > 500 && getiteminfo(getequipid(EQI_HAND_R),5) != 34 && .Left) || (getequipid(EQI_HAND_L) < 500 && .LeftFist)){
.@M$ = "";
if(getiteminfo(getequipid(EQI_HAND_L),2) == 4)
.@i = 0;
else .@i = getiteminfo(getequipid(EQI_HAND_L),11);
switch(.@i){
case 3: case 6: case 7: case 8:
case 9: case 12: case 2: .@M$ = "Onslaught"; Break;
case 1: case 16: case 22: .@M$ = "Swiftness"; Break;
case 4: case 5: default: .@M$ = "Safegaurd"; Break;
case 11: case 13: case 14: case 17:
case 18: case 19: case 20: case 21: .@M$ = "Ranged"; Break;
case 10: case 15: case 23: case 24: .@M$ = "Mystical"; Break;
}
.@wLv = getiteminfo(getequipid(EQI_HAND_L),13);
.@master = getd(""+ .@M$ + "Master");
if(.MaxMastery > .@master){
Setd ""+.@M$+"Exp",getd(""+.@M$+"Exp") + .@exp * (.Rates * (getstatus(SC_JEXPBOOST,3)?3:2) / 4) + .@wLv * .@wLv * .wLvBonus;
if(getd(""+.@M$+"Exp") > .NeededExp[.@master]){
setd ""+.@M$+"Master",.@master + 1;
announce ""+.@M$+" Mastery has advanced to Lv "+(.@master + 1)+"!",bc_blue|bc_self;
Setd ""+.@M$+"Exp",0;
}
}
}
}
end;
OnInit:
bindatcmd("wi" ,"PCSTATCALC::OnWeaponInfo",0,99);
bindatcmd("weaponinfo" ,"PCSTATCALC::OnWeaponInfo",0,99);
bindatcmd("wlvlup" ,"PCSTATCALC::OnWeaponLevel",60,99);
bindatcmd("wlvl" ,"PCSTATCALC::OnWeaponLevel",60,99);
.Weapon = 1; // Toggle Exp Groth On/Off
// 1 = On
// 0 = Off
.Left = 1; // Toggle Left Handed Mastery, left hand recives ~1/2 exp and stats
// 1 = On
// 0 = Off
.RightFist = 0; // Toggle Right fist recive Safegaurd Mastery effect
// 1 = On
// 0 = Off
.LeftFist = 0; // Toggle Left fist recive Safegaurd Mastery effect
// 1 = On
// 0 = Off
.FirstLevel = 20000; // Exp cost to get from level 0 -> 1
.expcurve = 20000; // Exp curve for weapon mastery
// Lv * Lv * .expcurve + .FirstLevel + Lv
// Default 5000
.MaxMastery = 99; // Sets the max Weapon Mastery Level
// Default 128
.wLvBonus = 150; // Amount of extra Weapon Exp from higher level weapons,
// Bonus exp = WLv * WLv * .wLvBonus
// Default 150
// Exp Formula
for(.@i = 0; .@i < .MaxMastery; .@i++)
.NeededExp[.@i] = (.@i * .@i * .expcurve) + (.@i * 100) + .FirstLevel;
// Dont Touch
.Rates = getbattleflag("job_exp_rate");
}
but if i want something like....
|0 | Str |3+BaseStr/15 | 15 |
or something like...
|0 |Str |15-BaseStr/25| 13 |
thats what i want... someone can explain me how do that ¿? i know that is just knowing basic scripts but.... what i learn i just learn it watching even i didnt study something like "programmer" or something like that well... thx! if someone help ^^
PD: Nice script Stolao <3
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Edit: also i wanted something for example... "Base Level x (random between 2~5) / (random 23~43)" ... well thx again ^^
Question
ItsFree
Hi, rAthena Community, i need some help about this script (not tested yet but i guess is working) what i want... is a bit help how to edit the bonuses, i liked whole the script but i wanna change some bonuses because counting em' with a base lv 255 (like the server im using) the bonuses would be get broken.... also i wanna delete some of em and add news as i can understand ...
https://github.com/Stolao/Npc_Release/blob/master/Weapon_Mastery/WeaponMastery.txt
this is for lv 0 =
bonus bAtkrate,1 + getarg(0,0) / 7 + ((1 + getarg(0,0) / 7) *readparam(bStr) / 100);
this for lv 1
if(getarg(0,0) >= 1) bonus bCritical,1+getarg(0,0)/20;
this for lv 2
if(getarg(0,0) >= 2) bonus bAtk,1+getarg(0,0)/4;
then 4... 8...16...etc ok i guess that i can understand also can understand the basic scripts "bonus bAtk..." but im kinda slow about the.... "1+getarg(0,0)/4" as i read here...
Edited by ItsFreehttps://github.com/Stolao/Npc_Release/blob/master/Weapon_Mastery/WeaponMastery_Details.txt
here explain me all bonuses but what i want... is how edit, for example...
the first is....
| Level | New Bonus | Bonus Rate | Max Bonus |
| 0 | Str | 1+Lv/32 | 4 |
but if i want something like....
|0 | Str |3+BaseStr/15 | 15 |
or something like...
|0 |Str |15-BaseStr/25| 13 |
thats what i want... someone can explain me how do that ¿? i know that is just knowing basic scripts but.... what i learn i just learn it watching even i didnt study something like "programmer" or something like that well... thx! if someone help ^^
PD: Nice script Stolao <3
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Edit: also i wanted something for example... "Base Level x (random between 2~5) / (random 23~43)" ... well thx again ^^
Link to comment
Share on other sites
2 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.