Moved remaining refine NPC to the database (#3145)

* Fixes #2510.
* Added Holink and Wagjak values to their own entries in the refine database.
* Added several anti-hack checks to refine NPC.
Thanks to the suggestion from @mazvi and @Atemo!
This commit is contained in:
Aleos 2018-05-27 16:07:39 -04:00 committed by GitHub
parent 394fb8acff
commit a12c79f782
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 157 additions and 46 deletions

View File

@ -38,6 +38,12 @@ Armor:
- Type: REFINE_COST_OVER10_HD
Price: 100000
Material: 6225
- Type: REFINE_COST_HOLINK
Price: 15000
Material: 7619
- Type: REFINE_COST_WAGJAK
Price: 20000
Material: 985
Rates:
- Level: 1
Bonus: 100
@ -163,6 +169,12 @@ WeaponLv1:
- Type: REFINE_COST_OVER10_HD
Price: 100000
Material: 6226
- Type: REFINE_COST_HOLINK
Price: 500
Material: 7620
- Type: REFINE_COST_WAGJAK
Price: 1000
Material: 1010
Rates:
- Level: 8
NormalChance: 60
@ -254,6 +266,12 @@ WeaponLv2:
- Type: REFINE_COST_OVER10_HD
Price: 100000
Material: 6226
- Type: REFINE_COST_HOLINK
Price: 2000
Material: 7620
- Type: REFINE_COST_WAGJAK
Price: 2000
Material: 1011
Rates:
- Level: 7
NormalChance: 60
@ -350,6 +368,12 @@ WeaponLv3:
- Type: REFINE_COST_OVER10_HD
Price: 100000
Material: 6226
- Type: REFINE_COST_HOLINK
Price: 20000
Material: 7620
- Type: REFINE_COST_WAGJAK
Price: 10000
Material: 984
Rates:
- Level: 6
NormalChance: 60
@ -451,6 +475,12 @@ WeaponLv4:
- Type: REFINE_COST_OVER10_HD
Price: 100000
Material: 6226
- Type: REFINE_COST_HOLINK
Price: 50000
Material: 7620
- Type: REFINE_COST_WAGJAK
Price: 20000
Material: 984
Rates:
- Level: 5
NormalChance: 60

View File

@ -2768,6 +2768,8 @@ REFINE_COST_OVER10 - For refining over +10
REFINE_COST_HD - For refining with HD ores
REFINE_COST_ENRICHED - For refining with enriched ores
REFINE_COST_OVER10_HD - For refining over +10 with HD ores
REFINE_COST_HOLINK - For refining at Holink in Malangdo
REFINE_COST_WAGJAK - For refining at Refining Machine Wagjak in the Novice Academy
This function will return required cost for refining based on <information> argument.

View File

@ -55,12 +55,14 @@ payon,157,146,6 script Suhnbi#cash 85,{
close;
}
.@refineitemid = getequipid(.@part); // save id of the item
.@refinerycnt = getequiprefinerycnt(.@part); //save refinery count
.@price = getequiprefinecost(.@part, REFINE_COST_ENRICHED, REFINE_ZENY_COST);
.@material = getequiprefinecost(.@part, REFINE_COST_ENRICHED, REFINE_MATERIAL_ID);
// Make sure you have the neccessary items and Zeny to refine your items
// Make sure you have the necessary items and Zeny to refine your items
// Determines chance of failure and verifies that you want to continue.
callsub S_RefineValidate,getequipweaponlv(.@part),.@material,.@price,.@part;
callsub S_RefineValidate,getequipweaponlv(.@part),.@material,.@price,.@part,.@refineitemid,.@refinerycnt;
mes "[Suhnbi]";
mes "Clang! Clang! Clang!";
@ -89,7 +91,8 @@ payon,157,146,6 script Suhnbi#cash 85,{
S_RefineValidate:
.@weapon_lvl = getarg(0);
.@item_req = getarg(1);
set .@price, getarg(2);
.@price = getarg(2);
.@part = getarg(3);
// If the VIP system is enabled, the prices for non-VIP players are considerably higher.
if (VIP_SCRIPT && !vip_status(VIP_STATUS_ACTIVE)) {
@ -109,7 +112,7 @@ S_RefineValidate:
mes "Would you like to continue?";
next;
if(select("Yes:No") == 1) {
if (getequippercentrefinery(getarg(3)) < 100) {
if (getequippercentrefinery(.@part) < 100) {
if (.@weapon_lvl) {
mes "[Suhnbi]";
mes "Wow!!";
@ -152,6 +155,18 @@ S_RefineValidate:
if (countitem(.@item_req) > 0 && Zeny > .@price) {
delitem .@item_req,1;
set Zeny, Zeny - .@price;
// anti-hack
if (callfunc("F_IsEquipIDHack", .@part, getarg(4)) ||
callfunc("F_IsEquipRefineHack", .@part, getarg(5))) {
mes "[Holink]";
emotion ET_FRET;
mes "Wait a second...";
mes "Do you think I'm stupid?!";
mes "You switched the item while I wasn't looking! Get out of here!";
close;
}
return;
}
mes "[Suhnbi]";

View File

@ -12921,7 +12921,7 @@ izlude_d,153,126,1 duplicate(Refinery Owner Han#iz) Refinery Owner Han#iz_d 4_M_
if (isbegin_quest(5153) == 1) {
if (getequipweaponlv(.@part) == 1) {
mes "[Refining Machine Wagjak]";
mes "Type : 1 level weapon";
mes "Type : Level 1 weapon";
mes "Charge : Phracon, 1000 zeny";
mes "Service usage coupon sensed. No charge to be requested. Will you refine?";
next;
@ -12969,33 +12969,17 @@ izlude_d,153,126,1 duplicate(Refinery Owner Han#iz) Refinery Owner Han#iz_d 4_M_
}
}
}
switch(getequipweaponlv(.@part)) {
case 0:
.@refineitemid = getequipid(.@part); // save id of the item
.@refinerycnt = getequiprefinerycnt(.@part); //save refinery count
.@price = getequiprefinecost(.@part, REFINE_COST_WAGJAK, REFINE_ZENY_COST);
.@material = getequiprefinecost(.@part, REFINE_COST_WAGJAK, REFINE_MATERIAL_ID);
if ((getequipweaponlv(.@part) >= 1) && (getequipweaponlv(.@part) <= 4))
.@type$ = "Level " + getequipweaponlv(.@part) + " weapon";
else
.@type$ = "Armor";
.@material = 985;// Elunium
.@price = 20000;
break;
case 1:
.@type$ = "Level 1 weapon";
.@material = 1010;// Phracon
.@price = 1000;
break;
case 2:
.@type$ = "Level 2 weapon";
.@material = 1011;// Emveretarcon
.@price = 2000;
break;
case 3:
.@type$ = "Level 3 weapon";
.@material = 984;// Oridecon
.@price = 10000;
break;
case 4:
.@type$ = "Level 4 weapon";
.@material = 984;// Oridecon
.@price = 20000;
break;
}
mes "[Refining Machine Wagjak]";
mes "Type : "+ .@type$ +"";
mes "Charge : "+ getitemname(.@material) +", "+ .@price +" zeny";
@ -13025,6 +13009,17 @@ izlude_d,153,126,1 duplicate(Refinery Owner Han#iz) Refinery Owner Han#iz_d 4_M_
if (countitem(.@material) > 0 && Zeny >= .@price) {
delitem .@material, 1;
Zeny -= .@price;
// anti-hack
if (callfunc("F_IsEquipIDHack", .@part, .@refineitemid) ||
callfunc("F_IsEquipRefineHack", .@part, .@refinerycnt)) {
mes "[Refining Machine Wagjak]";
emotion ET_FRET;
mes "Wait a second...";
mes "Do you think I'm stupid?!";
mes "You switched the item while I wasn't looking! Get out of here!";
close;
}
} else {
mes "[Refining Machine Wagjak]";
mes "^FF0000- error number 8282 -^000000";

View File

@ -70,33 +70,31 @@ malangdo,221,174,6 script Holink#mal_cash 559,{
close;
}
mes "[Holink]";
// TODO: Price is different to Suhnbi of Payon. Intended? [Secret]
.@material = getequiprefinecost(.@part, REFINE_COST_ENRICHED, REFINE_MATERIAL_ID);
.@refineitemid = getequipid(.@part); // save id of the item
.@refinerycnt = getequiprefinerycnt(.@part); //save refinery count
.@price = getequiprefinecost(.@part, REFINE_COST_HOLINK, REFINE_ZENY_COST);
.@material = getequiprefinecost(.@part, REFINE_COST_HOLINK, REFINE_MATERIAL_ID);
switch(getequipweaponlv(.@part)) {
default:
case 0: // Armor
set .@price,15000;
set .@type$,"armor";
.@type$ = "armor";
mes "You have chosen an armor, meow~";
break;
case 1: // Level 1 Weapon
set .@price,500;
set .@type$,"weapon";
.@type$ = "weapon";
mes "A level 1 weapon...?";
break;
case 2: // Level 2 Weapon
set .@price,2000;
set .@type$,"weapon";
.@type$ = "weapon";
mes "Meow, a level 2 weapon...?";
break;
case 3: // Level 3 Weapon
set .@price,20000;
set .@type$,"weapon";
.@type$ = "weapon";
mes "Meow Meow~~ A level 3 weapon~~";
break;
case 4: // Level 4 Weapon
set .@price,50000;
set .@type$,"weapon";
.@type$ = "weapon";
mes "Me-Meow!... A level 4 weapon...!";
mes "I've only seen it twice while";
mes "learning from Aragam... Me-Meow!!";
@ -108,7 +106,7 @@ malangdo,221,174,6 script Holink#mal_cash 559,{
if(select("Yes!!:No!!") == 2) {
mes "[Holink]";
mes "Kyack!!";
mes "You don't belive in refine master Holink, meow?~";
mes "You don't believe in refine master Holink, meow?~";
close;
}
if (getequippercentrefinery(.@part, true) < 100) {
@ -148,6 +146,18 @@ malangdo,221,174,6 script Holink#mal_cash 559,{
}
delitem .@material,1;
set Zeny, Zeny-.@price;
// anti-hack
if (callfunc("F_IsEquipIDHack", .@part, .@refineitemid) ||
callfunc("F_IsEquipRefineHack", .@part, .@refinerycnt)) {
mes "[Holink]";
emotion ET_FRET;
mes "Wait a second...";
mes "Do you think I'm stupid?!";
mes "You switched the item while I wasn't looking! Get out of here!";
close;
}
if (getequippercentrefinery(.@part, true) > rand(100)) {
successrefitem .@part;
mes "[Holink]";

View File

@ -74,6 +74,8 @@
close;
}
.@refineitemid = getequipid(.@part); // save id of the item
.@refinerycnt = getequiprefinerycnt(.@part); //save refinery count
.@price = getequiprefinecost(.@part, REFINE_COST_HD, REFINE_ZENY_COST);
.@material = getequiprefinecost(.@part, REFINE_COST_HD, REFINE_MATERIAL_ID);
@ -105,6 +107,18 @@
}
delitem .@material,1;
set Zeny, Zeny-.@price;
// anti-hack
if (callfunc("F_IsEquipIDHack", .@part, .@refineitemid) ||
callfunc("F_IsEquipRefineHack", .@part, .@refinerycnt)) {
mes "[Blacksmith Mighty Hammer]";
emotion ET_FRET;
mes "Wait a second...";
mes "Do you think I'm stupid?!";
mes "You switched the item while I wasn't looking! Get out of here!";
close;
}
mes "[Blacksmith Mighty Hammer]";
mes "Tac! Tac! Tac!";
if (getequippercentrefinery(.@part, true) > rand(100)) {
@ -200,6 +214,8 @@ lhz_in02,280,19,3 duplicate(MightyHammer) Mighty Hammer#lhz 826
mes "This weapon is perfect, no need to refine it anymore~";
close;
}
.@refineitemid = getequipid(.@part); // save id of the item
.@refinerycnt = getequiprefinerycnt(.@part); //save refinery count
.@price = getequiprefinecost(.@part, REFINE_COST_OVER10_HD, REFINE_ZENY_COST);
.@material = getequiprefinecost(.@part, REFINE_COST_OVER10_HD, REFINE_MATERIAL_ID);
switch(getequipweaponlv(.@part)) {
@ -253,6 +269,18 @@ lhz_in02,280,19,3 duplicate(MightyHammer) Mighty Hammer#lhz 826
}
delitem .@material,1;
set Zeny, Zeny-.@price;
// anti-hack
if (callfunc("F_IsEquipIDHack", .@part, .@refineitemid) ||
callfunc("F_IsEquipRefineHack", .@part, .@refinerycnt)) {
mes "[Basta]";
emotion ET_FRET;
mes "Wait a second...";
mes "Do you think I'm stupid?!";
mes "You switched the item while I wasn't looking! Get out of here!";
close;
}
mes "Pow! Pow! Pow! Pow!";
if (getequippercentrefinery(.@part, true) > rand(100)) {
successrefitem .@part;

View File

@ -439,6 +439,8 @@ malangdo,224,172,6 script Clink#mal_normal 544,{
close;
}
.@refineitemid = getequipid(.@part); // save id of the item
.@refinerycnt = getequiprefinerycnt(.@part); //save refinery count
.@price = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_ZENY_COST);
.@material = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_MATERIAL_ID);
@ -502,6 +504,18 @@ malangdo,224,172,6 script Clink#mal_normal 544,{
}
delitem .@material,1;
Zeny = Zeny-.@price;
// anti-hack
if (callfunc("F_IsEquipIDHack", .@part, .@refineitemid) ||
callfunc("F_IsEquipRefineHack", .@part, .@refinerycnt)) {
mes "[Clink]";
emotion ET_FRET;
mes "Wait a second...";
mes "Do you think I'm stupid?!";
mes "You switched the item while I wasn't looking! Get out of here!";
close;
}
if (getequippercentrefinery(.@part) <= rand(100)) {
failedrefitem .@part;
mes "[Clink]";

View File

@ -76,6 +76,8 @@ prontera,184,177,6 script Refine Master 851,{
mes "This item is impossible to refine.";
close;
}
.@refineitemid = getequipid(.@part); // save id of the item
.@refinerycnt = getequiprefinerycnt(.@part); //save refinery count
switch(getequipweaponlv(.@part)) {
default:
case 0:
@ -143,9 +145,20 @@ prontera,184,177,6 script Refine Master 851,{
mes "I have my own special way to refine...";
mes ".......ka boom!";
specialeffect EF_SUI_EXPLOSION;
if (countitem(.@ticket_id))
if (countitem(.@ticket_id)) {
delitem .@ticket_id,1;
else {
// anti-hack
if (callfunc("F_IsEquipIDHack", .@part, .@refineitemid) ||
callfunc("F_IsEquipRefineHack", .@part, .@refinerycnt)) {
mes "[Refine Master]";
emotion ET_FRET;
mes "Wait a second...";
mes "Do you think I'm stupid?!";
mes "You switched the item while I wasn't looking! Get out of here!";
close;
}
} else {
next;
mes "Error!";
mes "Please report this.";

View File

@ -4960,6 +4960,8 @@
export_constant(REFINE_COST_HD);
export_constant(REFINE_COST_ENRICHED);
export_constant(REFINE_COST_OVER10_HD);
export_constant(REFINE_COST_HOLINK);
export_constant(REFINE_COST_WAGJAK);
export_constant(REFINE_COST_MAX);
/* refine information types */

View File

@ -44,6 +44,8 @@ enum refine_cost_type {
REFINE_COST_HD,
REFINE_COST_ENRICHED,
REFINE_COST_OVER10_HD,
REFINE_COST_HOLINK,
REFINE_COST_WAGJAK,
REFINE_COST_MAX
};