Tipologie server: -
*Resursă folosită: -
*ServerFiles utilizat: -
*Syserr: -
Poză/Video:
*Detalii suplimentare: Cum spune și titlul, deja am căutat rezolvări pe forum, questul îl am deja, am verificat și type de la târnăcop (24), am verificat și la zăcăminte, am comparat chiar și fișierele mining.cpp și mining.h cu un server clean. Dar fără niciun folos, aștept alte variante. Mulțumesc!
Liniile de la târnăcop din item_proto:
29101 °î±ŞŔĚ+0 ITEM_PICK 0 2 NONE ITEM_SLOW_QUERY WEAR_WEAPON NONE 80000 80000 29102 0 0 LEVEL 30 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 1 6000 100 29101 0 0 0 0 29102 °î±ŞŔĚ+1 ITEM_PICK 0 2 NONE ITEM_SLOW_QUERY WEAR_WEAPON NONE 85000 85000 29103 0 0 LEVEL 30 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 10 1 12000 39 29102 10 0 0 0 29103 °î±ŞŔĚ+2 ITEM_PICK 0 2 NONE ITEM_SLOW_QUERY WEAR_WEAPON NONE 90000 90000 29104 0 0 LEVEL 30 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 20 1 24000 39 29103 10 0 0 0 29104 °î±ŞŔĚ+3 ITEM_PICK 0 2 NONE ITEM_SLOW_QUERY WEAR_WEAPON NONE 95000 95000 29105 0 0 LEVEL 30 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 30 1 48000 39 29104 10 0 0 0 29105 °î±ŞŔĚ+4 ITEM_PICK 0 2 NONE ITEM_SLOW_QUERY WEAR_WEAPON NONE 100000 100000 29106 0 0 LEVEL 30 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 40 1 96000 39 29105 10 0 0 0 29106 °î±ŞŔĚ+5 ITEM_PICK 0 2 NONE NONE WEAR_WEAPON NONE 105000 105000 29107 0 0 LEVEL 30 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 50 1 192000 39 29106 10 0 0 0 29107 °î±ŞŔĚ+6 ITEM_PICK 0 2 NONE NONE WEAR_WEAPON NONE 110000 110000 29108 0 0 LEVEL 30 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 60 1 384000 39 29107 10 0 0 0 29108 °î±ŞŔĚ+7 ITEM_PICK 0 2 NONE NONE WEAR_WEAPON NONE 115000 115000 29109 0 0 LEVEL 30 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 70 1 768000 39 29108 10 0 0 0 29109 °î±ŞŔĚ+8 ITEM_PICK 0 2 NONE NONE WEAR_WEAPON NONE 120000 120000 29110 0 0 LEVEL 30 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 80 1 1536000 39 29109 10 0 0 0 29110 °î±ŞŔĚ+9 ITEM_PICK 0 2 NONE NONE WEAR_WEAPON NONE 125000 125000 29110 0 0 LEVEL 30 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 90 0 0 0 0 0 0 0 0Liniile de la fiecare zăcământ din mob_proto:
20047 ??????? KING NPC MELEE 1 NOMOVE 0 STUN,SLOW,CURSE,TERROR 0 2 0 0 0 0 0 0 120 3 1 0 0 10 4 100 100 0 2000 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20048 ???? KING NPC MELEE 1 NOMOVE 0 STUN,SLOW,CURSE,TERROR 0 2 0 0 0 0 0 0 120 3 1 0 0 10 4 100 100 0 2000 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20049 ????? KING NPC MELEE 1 NOMOVE 0 STUN,SLOW,CURSE,TERROR 0 2 0 0 0 0 0 0 120 3 1 0 0 10 4 100 100 0 2000 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20050 ???? KING NPC MELEE 1 NOMOVE 0 STUN,SLOW,CURSE,TERROR 0 2 0 0 0 0 0 0 120 3 1 0 0 10 4 100 100 0 2000 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20051 ?? KING NPC MELEE 1 NOMOVE 0 STUN,SLOW,CURSE,TERROR 0 2 0 0 0 0 0 0 120 3 1 0 0 10 4 100 100 0 2000 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20052 ?? KING NPC MELEE 1 NOMOVE 0 STUN,SLOW,CURSE,TERROR 0 2 0 0 0 0 0 0 120 3 1 0 0 10 4 100 100 0 2000 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20053 ??? KING NPC MELEE 1 NOMOVE 0 STUN,SLOW,CURSE,TERROR 0 2 0 0 0 0 0 0 120 3 1 0 0 10 4 100 100 0 2000 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20054 ???? KING NPC MELEE 1 NOMOVE 0 STUN,SLOW,CURSE,TERROR 0 2 0 0 0 0 0 0 120 3 1 0 0 10 4 100 100 0 2000 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20055 ????? KING NPC MELEE 1 NOMOVE 0 STUN,SLOW,CURSE,TERROR 0 2 0 0 0 0 0 0 120 3 1 0 0 10 4 100 100 0 2000 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20056 ??? KING NPC MELEE 1 NOMOVE 0 STUN,SLOW,CURSE,TERROR 0 2 0 0 0 0 0 0 120 3 1 0 0 10 4 100 100 0 2000 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20057 ???? KING NPC MELEE 1 NOMOVE 0 STUN,SLOW,CURSE,TERROR 0 2 0 0 0 0 0 0 120 3 1 0 0 10 4 100 100 0 2000 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20058 ????? KING NPC MELEE 1 NOMOVE 0 STUN,SLOW,CURSE,TERROR 0 2 0 0 0 0 0 0 120 3 1 0 0 10 4 100 100 0 2000 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20059 ???? KING NPC MELEE 1 NOMOVE 0 STUN,SLOW,CURSE,TERROR 0 2 0 0 0 0 0 0 120 3 1 0 0 10 4 100 100 0 2000 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0Quest minerit:
quest minerit begin
state start begin
when 20015.take with item.vnum >= 29101 and item.vnum < 29200 and item.get_socket(0) != item.get_value(2) begin
say("Nu ai suficiente puncte pentru")
say("a îmbunătăţi târnăcopul.")
end
when 20015.take with item.vnum >= 29101 and item.vnum < 29110 and item.get_socket(0) == item.get_value(2) begin
say("Doreşti să îmbunătăţeşti târnăcopul?")
say("Permite-mi să arunc o privire!")
say(string.format("Încerc să-l fac %d.",item.get_level()+1))
if item.get_value(3) == 100 then
say("Doreşti să îmbunătăţeşti târnăcopul?")
else
say("Nu este uşor să îmbunătăţeşti acest târnăcop...")
say("Ai ".. 100 - item . get_value(3).."% posibilitatea")
say("de a reuĹźii.")
say("Eşti sigur ca încă vrei să continui?")
end
local s = select("Da","Nu")
if s == 1 then
local f = __refine_pick(item.get_cell())
if f == 2 then
say("A eşuat.[ENTER]Îmbunătăţirea tânăcopului nu a fost cu succes.")
elseif f == 1 then
say("Târnăcopul a fost îmbunătăţit cu succes.")
else
say("Îmi pare rău, a eşuat.")
end
else
say("Mult noroc.")
end
end
when 20047.click or
20048.click or
20049.click or
20050.click or
20051.click or
20052.click or
20053.click or
20054.click or
20055.click or
20056.click or
20057.click or
20058.click or
20059.click begin
if pc.is_mount() != true then
pc.mining()
end
end
end
end
mining.cpp:
#include "stdafx.h"
#include "mining.h"
#include "char.h"
#include "char_manager.h"
#include "item_manager.h"
#include "item.h"
#include "config.h"
#include "db.h"
#include "log.h"
#include "skill.h"
#define ENABLE_PICKAXE_RENEWAL
namespace mining
{
enum
{
MAX_ORE = 19,
MAX_FRACTION_COUNT = 9,
ORE_COUNT_FOR_REFINE = 100,
};
struct SInfo
{
DWORD dwLoadVnum;
DWORD dwRawOreVnum;
DWORD dwRefineVnum;
};
SInfo info[MAX_ORE] =
{
{ 20047, 50601, 50621 },
{ 20048, 50602, 50622 },
{ 20049, 50603, 50623 },
{ 20050, 50604, 50624 },
{ 20051, 50605, 50625 },
{ 20052, 50606, 50626 },
{ 20053, 50607, 50627 },
{ 20054, 50608, 50628 },
{ 20055, 50609, 50629 },
{ 20056, 50610, 50630 },
{ 20057, 50611, 50631 },
{ 20058, 50612, 50632 },
{ 20059, 50613, 50633 },
{ 30301, 50614, 50634 },
{ 30302, 50615, 50635 },
{ 30303, 50616, 50636 },
{ 30304, 50617, 50637 },
{ 30305, 50618, 50638 },
{ 30306, 50619, 50639 },
};
int fraction_info[MAX_FRACTION_COUNT][3] =
{
{ 20, 1, 10 },
{ 30, 11, 20 },
{ 20, 21, 30 },
{ 15, 31, 40 },
{ 5, 41, 50 },
{ 4, 51, 60 },
{ 3, 61, 70 },
{ 2, 71, 80 },
{ 1, 81, 90 },
};
int PickGradeAddPct[10] =
{
3, 5, 8, 11, 15, 20, 26, 32, 40, 50
};
int SkillLevelAddPct[SKILL_MAX_LEVEL + 1] =
{
0,
1, 1, 1, 1, // 1 - 4
2, 2, 2, 2, // 5 - 8
3, 3, 3, 3, // 9 - 12
4, 4, 4, 4, // 13 - 16
5, 5, 5, 5, // 17 - 20
6, 6, 6, 6, // 21 - 24
7, 7, 7, 7, // 25 - 28
8, 8, 8, 8, // 29 - 32
9, 9, 9, 9, // 33 - 36
10, 10, 10, // 37 - 39
11, // 40
};
DWORD GetRawOreFromLoad(DWORD dwLoadVnum)
{
for (int i = 0; i < MAX_ORE; ++i)
{
if (info.dwLoadVnum == dwLoadVnum)
return info.dwRawOreVnum;
}
return 0;
}
DWORD GetRefineFromRawOre(DWORD dwRawOreVnum)
{
for (int i = 0; i < MAX_ORE; ++i)
{
if (info.dwRawOreVnum == dwRawOreVnum)
return info.dwRefineVnum;
}
return 0;
}
int GetFractionCount()
{
int r = number(1, 100);
for (int i = 0; i < MAX_FRACTION_COUNT; ++i)
{
if (r <= fraction_info[0])
return number(fraction_info[1], fraction_info[2]);
else
r -= fraction_info[0];
}
return 0;
}
void OreDrop(LPCHARACTER ch, DWORD dwLoadVnum)
{
DWORD dwRawOreVnum = GetRawOreFromLoad(dwLoadVnum);
int iFractionCount = GetFractionCount();
if (iFractionCount == 0)
{
sys_err("Wrong ore fraction count");
return;
}
LPITEM item = ITEM_MANAGER::instance().CreateItem(dwRawOreVnum, GetFractionCount());
if (!item)
{
sys_err("cannot create item vnum %d", dwRawOreVnum);
return;
}
PIXEL_POSITION pos;
pos.x = ch->GetX() + number(-200, 200);
pos.y = ch->GetY() + number(-200, 200);
item->AddToGround(ch->GetMapIndex(), pos);
item->StartDestroyEvent();
item->SetOwnership(ch, 15);
DBManager::instance().SendMoneyLog(MONEY_LOG_DROP, item->GetVnum(), item->GetCount());
}
int GetOrePct(LPCHARACTER ch)
{
int defaultPct = 20;
int iSkillLevel = ch->GetSkillLevel(SKILL_MINING);
LPITEM pick = ch->GetWear(WEAR_WEAPON);
if (!pick || pick->GetType() != ITEM_PICK)
return 0;
return defaultPct + SkillLevelAddPct[MINMAX(0, iSkillLevel, 40)] + PickGradeAddPct[MINMAX(0, pick->GetRefineLevel(), 9)];
}
EVENTINFO(mining_event_info)
{
DWORD pid;
DWORD vid_load;
mining_event_info()
: pid( 0 )
, vid_load( 0 )
{
}
};
// REFINE_PICK
bool Pick_Check(CItem& item)
{
if (item.GetType() != ITEM_PICK)
return false;
return true;
}
int Pick_GetMaxExp(CItem& pick)
{
return pick.GetValue(2);
}
int Pick_GetCurExp(CItem& pick)
{
return pick.GetSocket(0);
}
void Pick_IncCurExp(CItem& pick)
{
int -cenzurat- = Pick_GetCurExp(pick);
pick.SetSocket(0, -cenzurat- + 1);
}
#ifdef ENABLE_PICKAXE_RENEWAL
void Pick_SetPenaltyExp(CItem& pick)
{
int -cenzurat- = Pick_GetCurExp(pick);
pick.SetSocket(0, (-cenzurat- > 0) ? (-cenzurat- - (-cenzurat- * 10 / 100)) : 0);
}
#endif
void Pick_MaxCurExp(CItem& pick)
{
int max = Pick_GetMaxExp(pick);
pick.SetSocket(0, max);
}
bool Pick_Refinable(CItem& item)
{
if (Pick_GetCurExp(item) < Pick_GetMaxExp(item))
return false;
return true;
}
bool Pick_IsPracticeSuccess(CItem& pick)
{
return (number(1,pick.GetValue(1))==1);
}
bool Pick_IsRefineSuccess(CItem& pick)
{
return (number(1,100) <= pick.GetValue(3));
}
int RealRefinePick(LPCHARACTER ch, LPITEM item)
{
if (!ch || !item)
return 2;
LogManager& rkLogMgr = LogManager::instance();
ITEM_MANAGER& rkItemMgr = ITEM_MANAGER::instance();
if (!Pick_Check(*item))
{
sys_err("REFINE_PICK_HACK pid(%u) item(%s:%d) type(%d)", ch->GetPlayerID(), item->GetName(), item->GetID(), item->GetType());
rkLogMgr.RefineLog(ch->GetPlayerID(), item->GetName(), item->GetID(), -1, 1, "PICK_HACK");
return 2;
}
CItem& rkOldPick = *item;
if (!Pick_Refinable(rkOldPick))
return 2;
int iAdv = rkOldPick.GetValue(0) / 10;
if (rkOldPick.IsEquipped() == true)
return 2;
if (Pick_IsRefineSuccess(rkOldPick))
{
rkLogMgr.RefineLog(ch->GetPlayerID(), rkOldPick.GetName(), rkOldPick.GetID(), iAdv, 1, "PICK");
LPITEM pkNewPick = ITEM_MANAGER::instance().CreateItem(rkOldPick.GetRefinedVnum(), 1);
if (pkNewPick)
{
BYTE bCell = rkOldPick.GetCell();
rkItemMgr.RemoveItem(item, "REMOVE (REFINE PICK)");
pkNewPick->AddToCharacter(ch, TItemPos(INVENTORY, bCell));
LogManager::instance().ItemLog(ch, pkNewPick, "REFINE PICK SUCCESS", pkNewPick->GetName());
return 1;
}
return 2;
}
else
{
rkLogMgr.RefineLog(ch->GetPlayerID(), rkOldPick.GetName(), rkOldPick.GetID(), iAdv, 0, "PICK");
#ifdef ENABLE_PICKAXE_RENEWAL
{
// if (test_server) ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Pickax> PRE %u"), Pick_GetCurExp(*item));
Pick_SetPenaltyExp(*item);
// if (test_server) ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Pickax> POST %u"), Pick_GetCurExp(*item));
// ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Pickax> The upgrade has failed, and the pickax has lost 10%% of its mastery points."));
rkLogMgr.ItemLog(ch, item, "REFINE PICK FAIL", item->GetName());
return 0;
}
#else
LPITEM pkNewPick = ITEM_MANAGER::instance().CreateItem(rkOldPick.GetValue(4), 1);
if (pkNewPick)
{
BYTE bCell = rkOldPick.GetCell();
rkItemMgr.RemoveItem(item, "REMOVE (REFINE PICK)");
pkNewPick->AddToCharacter(ch, TItemPos(INVENTORY, bCell));
rkLogMgr.ItemLog(ch, pkNewPick, "REFINE PICK FAIL", pkNewPick->GetName());
return 0;
}
#endif
return 2;
}
}
void CHEAT_MAX_PICK(LPCHARACTER ch, LPITEM item)
{
if (!item)
return;
if (!Pick_Check(*item))
return;
CItem& pick = *item;
Pick_MaxCurExp(pick);
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Pickaxe training has reached maximum (%d)."), Pick_GetCurExp(pick));
}
void PracticePick(LPCHARACTER ch, LPITEM item)
{
if (!item)
return;
if (!Pick_Check(*item))
return;
CItem& pick = *item;
if (pick.GetRefinedVnum()<=0)
return;
if (Pick_IsPracticeSuccess(pick))
{
if (Pick_Refinable(pick))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The pickaxe has reached its maximum training level."));
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You can upgrade to the next level pickaxe through the woodcutter."));
}
else
{
Pick_IncCurExp(pick);
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Pickaxe proficiency increased! (%d/%d)"),
Pick_GetCurExp(pick), Pick_GetMaxExp(pick));
if (Pick_Refinable(pick))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The pickaxe has reached its maximum training level."));
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You can upgrade to the next level pickaxe through the woodcutter."));
}
}
}
}
// END_OF_REFINE_PICK
EVENTFUNC(mining_event)
{
mining_event_info* info = dynamic_cast<mining_event_info*>( event->info );
if ( info == NULL )
{
sys_err( "mining_event_info> <Factor> Null pointer" );
return 0;
}
LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(info->pid);
LPCHARACTER load = CHARACTER_MANAGER::instance().Find(info->vid_load);
if (!ch)
return 0;
ch->mining_take();
LPITEM pick = ch->GetWear(WEAR_WEAPON);
#ifdef ENABLE_MULTI_FARM_BLOCK
if (!ch->GetMultiStatus())
return 0;
#endif
// REFINE_PICK
if (!pick || !Pick_Check(*pick))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You can't mine it because you don't have a pickaxe."));
return 0;
}
// END_OF_REFINE_PICK
if (!load)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Can't dig anymore."));
return 0;
}
int iPct = GetOrePct(ch);
if (number(1, 100) <= iPct)
{
OreDrop(ch, load->GetRaceNum());
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Mining was successful."));
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Mining failed."));
}
PracticePick(ch, pick);
return 0;
}
LPEVENT CreateMiningEvent(LPCHARACTER ch, LPCHARACTER load, int count)
{
mining_event_info* info = AllocEventInfo<mining_event_info>();
info->pid = ch->GetPlayerID();
info->vid_load = load->GetVID();
return event_create(mining_event, info, PASSES_PER_SEC(2 * count));
}
bool OreRefine(LPCHARACTER ch, LPCHARACTER npc, LPITEM item, int cost, int pct, LPITEM metinstone_item)
{
if (!ch || !npc)
return false;
if (item->GetOwner() != ch)
{
sys_err("wrong owner");
return false;
}
if (item->GetCount() < ORE_COUNT_FOR_REFINE)
{
sys_err("not enough count");
return false;
}
DWORD dwRefinedVnum = GetRefineFromRawOre(item->GetVnum());
if (dwRefinedVnum == 0)
return false;
ch->SetRefineNPC(npc);
item->SetCount(item->GetCount() - ORE_COUNT_FOR_REFINE);
int iCost = ch->ComputeRefineFee(cost, 1);
#ifdef ENABLE_REMOVE_LIMIT_GOLD
if (ch->GetGold() < (unsigned long long)iCost)
return false;
#else
if (ch->GetGold() < iCost)
return false;
#endif
ch->PayRefineFee(iCost);
if (metinstone_item)
ITEM_MANAGER::instance().RemoveItem(metinstone_item, "REMOVE (MELT)");
if (number(1, 100) <= pct)
{
ch->AutoGiveItem(dwRefinedVnum, 1);
return true;
}
return false;
}
bool IsVeinOfOre (DWORD vnum)
{
for (int i = 0; i < MAX_ORE; i++)
{
if (info.dwLoadVnum == vnum)
return true;
}
return false;
}
}
mining.h:
#ifndef __MINING_H
#define __MINING_H
namespace mining
{
LPEVENT CreateMiningEvent(LPCHARACTER ch, LPCHARACTER load, int count);
DWORD GetRawOreFromLoad(DWORD dwLoadVnum);
bool OreRefine(LPCHARACTER ch, LPCHARACTER npc, LPITEM item, int cost, int pct, LPITEM metinstone_item);
int GetFractionCount();
// REFINE_PICK
int RealRefinePick(LPCHARACTER ch, LPITEM item);
void CHEAT_MAX_PICK(LPCHARACTER ch, LPITEM item);
// END_OF_REFINE_PICK
bool IsVeinOfOre (DWORD vnum);
}
#endif

-> 


