forked from metin2/server
3015 lines
72 KiB
C++
3015 lines
72 KiB
C++
|
||
#include "stdafx.h"
|
||
|
||
#include "config.h"
|
||
#include "questmanager.h"
|
||
#include "sectree_manager.h"
|
||
#include "char.h"
|
||
#include "char_manager.h"
|
||
#include "affect.h"
|
||
#include "item.h"
|
||
#include "item_manager.h"
|
||
#include "guild_manager.h"
|
||
#include "war_map.h"
|
||
#include "start_position.h"
|
||
#include "marriage.h"
|
||
#include "mining.h"
|
||
#include "p2p.h"
|
||
#include "polymorph.h"
|
||
#include "desc_client.h"
|
||
#include "messenger_manager.h"
|
||
#include "log.h"
|
||
#include "utils.h"
|
||
#include "unique_item.h"
|
||
#include "mob_manager.h"
|
||
|
||
#include <cctype>
|
||
#undef sys_err
|
||
#ifndef __WIN32__
|
||
#define sys_err(fmt, args...) quest::CQuestManager::instance().QuestError(__FUNCTION__, __LINE__, fmt, ##args)
|
||
#else
|
||
#define sys_err(fmt, ...) quest::CQuestManager::instance().QuestError(__FUNCTION__, __LINE__, fmt, __VA_ARGS__)
|
||
#endif
|
||
|
||
extern int g_nPortalLimitTime;
|
||
extern LPCLIENT_DESC db_clientdesc;
|
||
const int ITEM_BROKEN_METIN_VNUM = 28960;
|
||
|
||
namespace quest
|
||
{
|
||
//
|
||
// "pc" Lua functions
|
||
//
|
||
int pc_has_master_skill(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
bool bHasMasterSkill = false;
|
||
for (int i=0; i< SKILL_MAX_NUM; i++)
|
||
if (ch->GetSkillMasterType(i) >= SKILL_MASTER && ch->GetSkillLevel(i) >= 21)
|
||
{
|
||
bHasMasterSkill = true;
|
||
break;
|
||
}
|
||
|
||
lua_pushboolean(L, bHasMasterSkill);
|
||
return 1;
|
||
}
|
||
|
||
int pc_remove_skill_book_no_delay(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
ch->RemoveAffect(AFFECT_SKILL_NO_BOOK_DELAY);
|
||
return 0;
|
||
}
|
||
|
||
int pc_is_skill_book_no_delay(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
lua_pushboolean(L, ch->FindAffect(AFFECT_SKILL_NO_BOOK_DELAY) ? true : false);
|
||
return 1;
|
||
}
|
||
|
||
int pc_learn_grand_master_skill(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
sys_err("wrong skill index");
|
||
return 0;
|
||
}
|
||
|
||
lua_pushboolean(L, ch->LearnGrandMasterSkill((int)lua_tonumber(L, 1)));
|
||
return 1;
|
||
}
|
||
|
||
int pc_set_warp_location(lua_State * L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
sys_err("wrong map index");
|
||
return 0;
|
||
}
|
||
|
||
if (!lua_isnumber(L, 2) || !lua_isnumber(L, 3))
|
||
{
|
||
sys_err("wrong coodinate");
|
||
return 0;
|
||
}
|
||
|
||
ch->SetWarpLocation((int)lua_tonumber(L,1), (int)lua_tonumber(L,2), (int)lua_tonumber(L,3));
|
||
return 0;
|
||
}
|
||
|
||
int pc_set_warp_location_local(lua_State * L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
sys_err("wrong map index");
|
||
return 0;
|
||
}
|
||
|
||
if (!lua_isnumber(L, 2) || !lua_isnumber(L, 3))
|
||
{
|
||
sys_err("wrong coodinate");
|
||
return 0;
|
||
}
|
||
|
||
int lMapIndex = (int) lua_tonumber(L, 1);
|
||
const TMapRegion * region = SECTREE_MANAGER::instance().GetMapRegion(lMapIndex);
|
||
|
||
if (!region)
|
||
{
|
||
sys_err("invalid map index %d", lMapIndex);
|
||
return 0;
|
||
}
|
||
|
||
int x = (int) lua_tonumber(L, 2);
|
||
int y = (int) lua_tonumber(L, 3);
|
||
|
||
if (x > region->ex - region->sx)
|
||
{
|
||
sys_err("x coordinate overflow max: %d input: %d", region->ex - region->sx, x);
|
||
return 0;
|
||
}
|
||
|
||
if (y > region->ey - region->sy)
|
||
{
|
||
sys_err("y coordinate overflow max: %d input: %d", region->ey - region->sy, y);
|
||
return 0;
|
||
}
|
||
|
||
ch->SetWarpLocation(lMapIndex, x, y);
|
||
return 0;
|
||
}
|
||
|
||
int pc_get_start_location(lua_State * L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
lua_pushnumber(L, g_start_map[ch->GetEmpire()]);
|
||
lua_pushnumber(L, g_start_position[ch->GetEmpire()][0] / 100);
|
||
lua_pushnumber(L, g_start_position[ch->GetEmpire()][1] / 100);
|
||
return 3;
|
||
}
|
||
|
||
int pc_warp(lua_State * L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2))
|
||
{
|
||
lua_pushboolean(L, false);
|
||
return 1;
|
||
}
|
||
|
||
int map_index = 0;
|
||
|
||
if (lua_isnumber(L, 3))
|
||
map_index = (int) lua_tonumber(L,3);
|
||
|
||
//PREVENT_HACK
|
||
if ( ch->IsHack() )
|
||
{
|
||
lua_pushboolean(L, false);
|
||
return 1;
|
||
}
|
||
//END_PREVENT_HACK
|
||
|
||
if ( test_server )
|
||
ch->ChatPacket( CHAT_TYPE_INFO, "pc_warp %d %d %d",(int)lua_tonumber(L,1),
|
||
(int)lua_tonumber(L,2),map_index );
|
||
ch->WarpSet((int)lua_tonumber(L, 1), (int)lua_tonumber(L, 2), map_index);
|
||
|
||
lua_pushboolean(L, true);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_warp_local(lua_State * L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
sys_err("no map index argument");
|
||
return 0;
|
||
}
|
||
|
||
if (!lua_isnumber(L, 2) || !lua_isnumber(L, 3))
|
||
{
|
||
sys_err("no coodinate argument");
|
||
return 0;
|
||
}
|
||
|
||
int lMapIndex = (int) lua_tonumber(L, 1);
|
||
const TMapRegion * region = SECTREE_MANAGER::instance().GetMapRegion(lMapIndex);
|
||
|
||
if (!region)
|
||
{
|
||
sys_err("invalid map index %d", lMapIndex);
|
||
return 0;
|
||
}
|
||
|
||
int x = (int) lua_tonumber(L, 2);
|
||
int y = (int) lua_tonumber(L, 3);
|
||
|
||
if (x > region->ex - region->sx)
|
||
{
|
||
sys_err("x coordinate overflow max: %d input: %d", region->ex - region->sx, x);
|
||
return 0;
|
||
}
|
||
|
||
if (y > region->ey - region->sy)
|
||
{
|
||
sys_err("y coordinate overflow max: %d input: %d", region->ey - region->sy, y);
|
||
return 0;
|
||
}
|
||
|
||
/*
|
||
int iPulse = thecore_pulse();
|
||
if ( pkChr->GetExchange() || pkChr->GetMyShop() || pkChr->GetShopOwner() || pkChr->IsOpenSafebox() )
|
||
{
|
||
pkChr->ChatPacket( CHAT_TYPE_INFO, LC_TEXT("<22>ŷ<EFBFBD>â,â<><C3A2> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5>Ҽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>" ));
|
||
|
||
return;
|
||
}
|
||
//PREVENT_PORTAL_AFTER_EXCHANGE
|
||
//<2F><>ȯ <20><> <20>ð<EFBFBD>üũ
|
||
if ( iPulse - pkChr->GetExchangeTime() < PASSES_PER_SEC(60) )
|
||
{
|
||
pkChr->ChatPacket( CHAT_TYPE_INFO, LC_TEXT("<22>ŷ<EFBFBD> <20><> 1<><31> <20>̳<EFBFBD><CCB3><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>." ) );
|
||
return;
|
||
}
|
||
//END_PREVENT_PORTAL_AFTER_EXCHANGE
|
||
//PREVENT_ITEM_COPY
|
||
{
|
||
if ( iPulse - pkChr->GetMyShopTime() < PASSES_PER_SEC(60) )
|
||
{
|
||
pkChr->ChatPacket( CHAT_TYPE_INFO, LC_TEXT("<22>ŷ<EFBFBD> <20><> 1<><31> <20>̳<EFBFBD><CCB3><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>." ) );
|
||
return;
|
||
}
|
||
|
||
}
|
||
//END_PREVENT_ITEM_COPY
|
||
*/
|
||
|
||
CQuestManager::instance().GetCurrentCharacterPtr()->WarpSet(region->sx + x, region->sy + y);
|
||
return 0;
|
||
}
|
||
|
||
int pc_warp_exit(lua_State * L)
|
||
{
|
||
CQuestManager::instance().GetCurrentCharacterPtr()->ExitToSavedLocation();
|
||
return 0;
|
||
}
|
||
|
||
int pc_in_dungeon(lua_State * L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushboolean(L, ch->GetDungeon()?1:0);
|
||
return 1;
|
||
}
|
||
|
||
int pc_hasguild(lua_State * L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushboolean(L, ch->GetGuild() ? 1 : 0);
|
||
return 1;
|
||
}
|
||
|
||
int pc_getguild(lua_State * L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushnumber(L, ch->GetGuild() ? ch->GetGuild()->GetID() : 0);
|
||
return 1;
|
||
}
|
||
|
||
int pc_isguildmaster(lua_State * L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
CGuild * g = ch->GetGuild();
|
||
|
||
if (g)
|
||
lua_pushboolean(L, (ch->GetPlayerID() == g->GetMasterPID()));
|
||
else
|
||
lua_pushboolean(L, 0);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_destroy_guild(lua_State * L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
CGuild * g = ch->GetGuild();
|
||
|
||
if (g)
|
||
g->RequestDisband(ch->GetPlayerID());
|
||
|
||
return 0;
|
||
}
|
||
|
||
int pc_remove_from_guild(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
CGuild * g = ch->GetGuild();
|
||
|
||
if (g)
|
||
g->RequestRemoveMember(ch->GetPlayerID());
|
||
|
||
return 0;
|
||
}
|
||
|
||
int pc_give_gold(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
sys_err("QUEST : wrong argument");
|
||
return 0;
|
||
}
|
||
|
||
int iAmount = (int) lua_tonumber(L, 1);
|
||
|
||
if (iAmount <= 0)
|
||
{
|
||
sys_err("QUEST : gold amount less then zero");
|
||
return 0;
|
||
}
|
||
|
||
DBManager::instance().SendMoneyLog(MONEY_LOG_QUEST, ch->GetPlayerID(), iAmount);
|
||
ch->PointChange(POINT_GOLD, iAmount, true);
|
||
return 0;
|
||
}
|
||
|
||
int pc_warp_to_guild_war_observer_position(lua_State* L)
|
||
{
|
||
luaL_checknumber(L, 1);
|
||
luaL_checknumber(L, 2);
|
||
|
||
DWORD gid1 = (DWORD)lua_tonumber(L, 1);
|
||
DWORD gid2 = (DWORD)lua_tonumber(L, 2);
|
||
|
||
CGuild* g1 = CGuildManager::instance().FindGuild(gid1);
|
||
CGuild* g2 = CGuildManager::instance().FindGuild(gid2);
|
||
|
||
if (!g1 || !g2)
|
||
{
|
||
luaL_error(L, "no such guild with id %d %d", gid1, gid2);
|
||
}
|
||
|
||
PIXEL_POSITION pos;
|
||
|
||
DWORD dwMapIndex = g1->GetGuildWarMapIndex(gid2);
|
||
|
||
if (!CWarMapManager::instance().GetStartPosition(dwMapIndex, 2, pos))
|
||
{
|
||
luaL_error(L, "not under warp guild war between guild %d %d", gid1, gid2);
|
||
return 0;
|
||
}
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
//PREVENT_HACK
|
||
if ( ch->IsHack() )
|
||
return 0;
|
||
//END_PREVENT_HACK
|
||
|
||
ch->SetQuestFlag("war.is_war_member", 0);
|
||
ch->SaveExitLocation();
|
||
ch->WarpSet(pos.x, pos.y, dwMapIndex);
|
||
return 0;
|
||
}
|
||
|
||
int pc_give_item_from_special_item_group(lua_State* L)
|
||
{
|
||
luaL_checknumber(L, 1);
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
DWORD dwGroupVnum = (DWORD) lua_tonumber(L,1);
|
||
|
||
std::vector <DWORD> dwVnums;
|
||
std::vector <DWORD> dwCounts;
|
||
std::vector <LPITEM> item_gets;
|
||
int count = 0;
|
||
|
||
ch->GiveItemFromSpecialItemGroup(dwGroupVnum, dwVnums, dwCounts, item_gets, count);
|
||
|
||
for (int i = 0; i < count; i++)
|
||
{
|
||
if (!item_gets[i])
|
||
{
|
||
if (dwVnums[i] == 1)
|
||
{
|
||
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD> %d <20><><EFBFBD><EFBFBD> ȹ<><C8B9><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>."), dwCounts[i]);
|
||
}
|
||
else if (dwVnums[i] == 2)
|
||
{
|
||
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ź<EFBFBD><C5BA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ɴϴ<C9B4>."));
|
||
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%d<><64> <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> ȹ<><C8B9><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>."), dwCounts[i]);
|
||
}
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int pc_enough_inventory(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
DWORD item_vnum = (DWORD)lua_tonumber(L, 1);
|
||
TItemTable * pTable = ITEM_MANAGER::instance().GetTable(item_vnum);
|
||
if (!pTable)
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
bool bEnoughInventoryForItem = ch->GetEmptyInventory(pTable->bSize) != -1;
|
||
lua_pushboolean(L, bEnoughInventoryForItem);
|
||
return 1;
|
||
}
|
||
|
||
int pc_give_item(lua_State* L)
|
||
{
|
||
PC* pPC = CQuestManager::instance().GetCurrentPC();
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (!lua_isstring(L, 1) || !(lua_isstring(L, 2)||lua_isnumber(L, 2)))
|
||
{
|
||
sys_err("QUEST : wrong argument");
|
||
return 0;
|
||
}
|
||
|
||
DWORD dwVnum;
|
||
|
||
if (lua_isnumber(L,2)) // <20><>ȣ<EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20>ش<EFBFBD>.
|
||
dwVnum = (int) lua_tonumber(L, 2);
|
||
else if (!ITEM_MANAGER::instance().GetVnum(lua_tostring(L, 2), dwVnum))
|
||
{
|
||
sys_err("QUEST Make item call error : wrong item name : %s", lua_tostring(L,1));
|
||
return 0;
|
||
}
|
||
|
||
int icount = 1;
|
||
|
||
if (lua_isnumber(L, 3) && lua_tonumber(L, 3) > 0)
|
||
{
|
||
icount = (int)rint(lua_tonumber(L, 3));
|
||
|
||
if (icount <= 0)
|
||
{
|
||
sys_err("QUEST Make item call error : wrong item count : %g", lua_tonumber(L, 2));
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
pPC->GiveItem(lua_tostring(L, 1), dwVnum, icount);
|
||
|
||
LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), dwVnum, icount);
|
||
return 0;
|
||
}
|
||
|
||
int pc_give_or_drop_item(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (!lua_isstring(L, 1) && !lua_isnumber(L, 1))
|
||
{
|
||
sys_err("QUEST Make item call error : wrong argument");
|
||
lua_pushnumber (L, 0);
|
||
return 1;
|
||
}
|
||
|
||
DWORD dwVnum;
|
||
|
||
if (lua_isnumber(L, 1)) // <20><>ȣ<EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20>ش<EFBFBD>.
|
||
{
|
||
dwVnum = (int) lua_tonumber(L, 1);
|
||
}
|
||
else if (!ITEM_MANAGER::instance().GetVnum(lua_tostring(L, 1), dwVnum))
|
||
{
|
||
sys_err("QUEST Make item call error : wrong item name : %s", lua_tostring(L,1));
|
||
lua_pushnumber (L, 0);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int icount = 1;
|
||
if (lua_isnumber(L,2) && lua_tonumber(L,2)>0)
|
||
{
|
||
icount = (int)rint(lua_tonumber(L,2));
|
||
if (icount<=0)
|
||
{
|
||
sys_err("QUEST Make item call error : wrong item count : %g", lua_tonumber(L,2));
|
||
lua_pushnumber (L, 0);
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
sys_log(0, "QUEST [REWARD] item %s to %s", lua_tostring(L, 1), ch->GetName());
|
||
|
||
PC* pPC = CQuestManager::instance().GetCurrentPC();
|
||
|
||
LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), dwVnum, icount);
|
||
|
||
LPITEM item = ch->AutoGiveItem(dwVnum, icount);
|
||
|
||
if ( dwVnum >= 80003 && dwVnum <= 80007 )
|
||
{
|
||
LogManager::instance().GoldBarLog(ch->GetPlayerID(), item->GetID(), QUEST, "quest: give_item2");
|
||
}
|
||
|
||
if (NULL != item)
|
||
lua_pushnumber (L, item->GetID());
|
||
else
|
||
lua_pushnumber (L, 0);
|
||
return 1;
|
||
}
|
||
|
||
int pc_give_or_drop_item_and_select(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (!lua_isstring(L, 1) && !lua_isnumber(L, 1))
|
||
{
|
||
sys_err("QUEST Make item call error : wrong argument");
|
||
return 0;
|
||
}
|
||
|
||
DWORD dwVnum;
|
||
|
||
if (lua_isnumber(L, 1)) // <20><>ȣ<EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20>ش<EFBFBD>.
|
||
{
|
||
dwVnum = (int) lua_tonumber(L, 1);
|
||
}
|
||
else if (!ITEM_MANAGER::instance().GetVnum(lua_tostring(L, 1), dwVnum))
|
||
{
|
||
sys_err("QUEST Make item call error : wrong item name : %s", lua_tostring(L,1));
|
||
return 0;
|
||
}
|
||
|
||
int icount = 1;
|
||
if (lua_isnumber(L,2) && lua_tonumber(L,2)>0)
|
||
{
|
||
icount = (int)rint(lua_tonumber(L,2));
|
||
if (icount<=0)
|
||
{
|
||
sys_err("QUEST Make item call error : wrong item count : %g", lua_tonumber(L,2));
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
sys_log(0, "QUEST [REWARD] item %s to %s", lua_tostring(L, 1), ch->GetName());
|
||
|
||
PC* pPC = CQuestManager::instance().GetCurrentPC();
|
||
|
||
LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), dwVnum, icount);
|
||
|
||
LPITEM item = ch->AutoGiveItem(dwVnum, icount);
|
||
|
||
if (NULL != item)
|
||
CQuestManager::Instance().SetCurrentItem(item);
|
||
|
||
if ( dwVnum >= 80003 && dwVnum <= 80007 )
|
||
{
|
||
LogManager::instance().GoldBarLog(ch->GetPlayerID(), item->GetID(), QUEST, "quest: give_item2");
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
int pc_get_current_map_index(lua_State* L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetMapIndex());
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_x(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushnumber(L, ch->GetX()/100);
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_y(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushnumber(L, ch->GetY()/100);
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_local_x(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap(ch->GetMapIndex());
|
||
|
||
if (pMap)
|
||
lua_pushnumber(L, (ch->GetX() - pMap->m_setting.iBaseX) / 100);
|
||
else
|
||
lua_pushnumber(L, ch->GetX() / 100);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_local_y(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap(ch->GetMapIndex());
|
||
|
||
if (pMap)
|
||
lua_pushnumber(L, (ch->GetY() - pMap->m_setting.iBaseY) / 100);
|
||
else
|
||
lua_pushnumber(L, ch->GetY() / 100);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_count_item(lua_State* L)
|
||
{
|
||
if (lua_isnumber(L, -1))
|
||
lua_pushnumber(L,CQuestManager::instance().GetCurrentCharacterPtr()->CountSpecifyItem((DWORD)lua_tonumber(L, -1)));
|
||
else if (lua_isstring(L, -1))
|
||
{
|
||
DWORD item_vnum;
|
||
|
||
if (!ITEM_MANAGER::instance().GetVnum(lua_tostring(L,1), item_vnum))
|
||
{
|
||
sys_err("QUEST count_item call error : wrong item name : %s", lua_tostring(L,1));
|
||
lua_pushnumber(L, 0);
|
||
}
|
||
else
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->CountSpecifyItem(item_vnum));
|
||
}
|
||
}
|
||
else
|
||
lua_pushnumber(L, 0);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_remove_item(lua_State* L)
|
||
{
|
||
if (lua_gettop(L) == 1)
|
||
{
|
||
DWORD item_vnum;
|
||
|
||
if (lua_isnumber(L,1))
|
||
{
|
||
item_vnum = (DWORD)lua_tonumber(L, 1);
|
||
}
|
||
else if (lua_isstring(L,1))
|
||
{
|
||
if (!ITEM_MANAGER::instance().GetVnum(lua_tostring(L,1), item_vnum))
|
||
{
|
||
sys_err("QUEST remove_item call error : wrong item name : %s", lua_tostring(L,1));
|
||
return 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
sys_err("QUEST remove_item wrong argument");
|
||
return 0;
|
||
}
|
||
|
||
sys_log(0,"QUEST remove a item vnum %d of %s[%d]", item_vnum, CQuestManager::instance().GetCurrentCharacterPtr()->GetName(), CQuestManager::instance().GetCurrentCharacterPtr()->GetPlayerID());
|
||
CQuestManager::instance().GetCurrentCharacterPtr()->RemoveSpecifyItem(item_vnum);
|
||
}
|
||
else if (lua_gettop(L) == 2)
|
||
{
|
||
DWORD item_vnum;
|
||
|
||
if (lua_isnumber(L, 1))
|
||
{
|
||
item_vnum = (DWORD)lua_tonumber(L, 1);
|
||
}
|
||
else if (lua_isstring(L, 1))
|
||
{
|
||
if (!ITEM_MANAGER::instance().GetVnum(lua_tostring(L,1), item_vnum))
|
||
{
|
||
sys_err("QUEST remove_item call error : wrong item name : %s", lua_tostring(L,1));
|
||
return 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
sys_err("QUEST remove_item wrong argument");
|
||
return 0;
|
||
}
|
||
|
||
DWORD item_count = (DWORD) lua_tonumber(L, 2);
|
||
sys_log(0, "QUEST remove items(vnum %d) count %d of %s[%d]",
|
||
item_vnum,
|
||
item_count,
|
||
CQuestManager::instance().GetCurrentCharacterPtr()->GetName(),
|
||
CQuestManager::instance().GetCurrentCharacterPtr()->GetPlayerID());
|
||
|
||
CQuestManager::instance().GetCurrentCharacterPtr()->RemoveSpecifyItem(item_vnum, item_count);
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int pc_get_leadership(lua_State * L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetLeadershipSkillLevel());
|
||
return 1;
|
||
}
|
||
|
||
int pc_reset_point(lua_State * L)
|
||
{
|
||
CQuestManager::instance().GetCurrentCharacterPtr()->ResetPoint(CQuestManager::instance().GetCurrentCharacterPtr()->GetLevel());
|
||
return 0;
|
||
}
|
||
|
||
int pc_get_playtime(lua_State* L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetRealPoint(POINT_PLAYTIME));
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_vid(lua_State* L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetVID());
|
||
return 1;
|
||
}
|
||
int pc_get_name(lua_State* L)
|
||
{
|
||
lua_pushstring(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetName());
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_next_exp(lua_State* L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetNextExp());
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_exp(lua_State* L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetExp());
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_race(lua_State* L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetRaceNum());
|
||
return 1;
|
||
}
|
||
|
||
int pc_change_sex(lua_State* L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->ChangeSex());
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_job(lua_State* L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetJob());
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_max_sp(lua_State* L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetMaxSP());
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_sp(lua_State * L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetSP());
|
||
return 1;
|
||
}
|
||
|
||
int pc_change_sp(lua_State * L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
sys_err("invalid argument");
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
int val = (int) lua_tonumber(L, 1);
|
||
|
||
if (val == 0)
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (val > 0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20><><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
ch->PointChange(POINT_SP, val);
|
||
else if (val < 0)
|
||
{
|
||
if (ch->GetSP() < -val)
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
ch->PointChange(POINT_SP, val);
|
||
}
|
||
|
||
lua_pushboolean(L, 1);
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_max_hp(lua_State * L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetMaxHP());
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_hp(lua_State * L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetHP());
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_level(lua_State * L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetLevel());
|
||
return 1;
|
||
}
|
||
|
||
int pc_set_level(lua_State * L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
sys_err("invalid argument");
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
int newLevel = lua_tonumber(L, 1);
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
|
||
sys_log(0,"QUEST [LEVEL] %s jumpint to level %d", ch->GetName(), (int)rint(lua_tonumber(L,1)));
|
||
|
||
PC* pPC = CQuestManager::instance().GetCurrentPC();
|
||
LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), newLevel, 0);
|
||
|
||
//<2F><><EFBFBD><EFBFBD>Ʈ : <20><>ų, <20><><EFBFBD>꽺ų, <20><><EFBFBD><EFBFBD>
|
||
ch->PointChange(POINT_SKILL, newLevel - ch->GetLevel());
|
||
ch->PointChange(POINT_SUB_SKILL, newLevel < 10 ? 0 : newLevel - MAX(ch->GetLevel(), 9));
|
||
ch->PointChange(POINT_STAT, ((MINMAX(1, newLevel, 90) - ch->GetLevel()) * 3) + ch->GetPoint(POINT_LEVEL_STEP));
|
||
//<2F><><EFBFBD><EFBFBD>
|
||
ch->PointChange(POINT_LEVEL, newLevel - ch->GetLevel());
|
||
//HP, SP
|
||
ch->SetRandomHP((newLevel - 1) * number(JobInitialPoints[ch->GetJob()].hp_per_lv_begin, JobInitialPoints[ch->GetJob()].hp_per_lv_end));
|
||
ch->SetRandomSP((newLevel - 1) * number(JobInitialPoints[ch->GetJob()].sp_per_lv_begin, JobInitialPoints[ch->GetJob()].sp_per_lv_end));
|
||
|
||
|
||
// ȸ<><C8B8>
|
||
ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
|
||
ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
|
||
|
||
ch->ComputePoints();
|
||
ch->PointsPacket();
|
||
ch->SkillLevelPacket();
|
||
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
int pc_get_weapon(lua_State * L)
|
||
{
|
||
LPITEM item = CQuestManager::instance().GetCurrentCharacterPtr()->GetWear(WEAR_WEAPON);
|
||
|
||
if (!item)
|
||
lua_pushnumber(L, 0);
|
||
else
|
||
lua_pushnumber(L, item->GetVnum());
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_armor(lua_State * L)
|
||
{
|
||
LPITEM item = CQuestManager::instance().GetCurrentCharacterPtr()->GetWear(WEAR_BODY);
|
||
|
||
if (!item)
|
||
lua_pushnumber(L, 0);
|
||
else
|
||
lua_pushnumber(L, item->GetVnum());
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_wear(lua_State * L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
sys_err("QUEST wrong set flag");
|
||
return 0;
|
||
}
|
||
|
||
BYTE bCell = (BYTE)lua_tonumber(L, 1);
|
||
|
||
LPITEM item = CQuestManager::instance().GetCurrentCharacterPtr()->GetWear(bCell);
|
||
|
||
|
||
if (!item)
|
||
lua_pushnil(L);
|
||
else
|
||
lua_pushnumber(L, item->GetVnum());
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_money(lua_State * L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetGold());
|
||
return 1;
|
||
}
|
||
|
||
// 20050725.myevan.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȥ<><C8A5> <20><><EFBFBD>ý<EFBFBD> <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20>ι<EFBFBD> <20>Ҹ<EFBFBD><D2B8>Ǵ<EFBFBD> <20><><EFBFBD>װ<EFBFBD> <20><EFBFBD><DFBB><EFBFBD>
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϰ<EFBFBD> <20>Ѵ<EFBFBD>.
|
||
int pc_get_real_alignment(lua_State* L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetRealAlignment()/10);
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_alignment(lua_State* L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetAlignment()/10);
|
||
return 1;
|
||
}
|
||
|
||
int pc_change_alignment(lua_State * L)
|
||
{
|
||
int alignment = (int)(lua_tonumber(L, 1)*10);
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
ch->UpdateAlignment(alignment);
|
||
return 0;
|
||
}
|
||
|
||
int pc_change_money(lua_State * L)
|
||
{
|
||
int gold = (int)lua_tonumber(L, -1);
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (gold + ch->GetGold() < 0)
|
||
sys_err("QUEST wrong ChangeGold %d (now %d)", gold, ch->GetGold());
|
||
else
|
||
{
|
||
DBManager::instance().SendMoneyLog(MONEY_LOG_QUEST, ch->GetPlayerID(), gold);
|
||
ch->PointChange(POINT_GOLD, gold, true);
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
int pc_set_another_quest_flag(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L, 1) || !lua_isstring(L, 2) || !lua_isnumber(L, 3))
|
||
{
|
||
sys_err("QUEST wrong set flag");
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
const char * sz = lua_tostring(L, 1);
|
||
const char * sz2 = lua_tostring(L, 2);
|
||
CQuestManager & q = CQuestManager::Instance();
|
||
PC * pPC = q.GetCurrentPC();
|
||
pPC->SetFlag(string(sz)+"."+sz2, int(rint(lua_tonumber(L,3))));
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
int pc_get_another_quest_flag(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1) || !lua_isstring(L,2))
|
||
{
|
||
sys_err("QUEST wrong get flag");
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
const char* sz = lua_tostring(L,1);
|
||
const char* sz2 = lua_tostring(L,2);
|
||
CQuestManager& q = CQuestManager::Instance();
|
||
PC* pPC = q.GetCurrentPC();
|
||
if (!pPC)
|
||
{
|
||
return 0;
|
||
}
|
||
lua_pushnumber(L,pPC->GetFlag(string(sz)+"."+sz2));
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
int pc_get_flag(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,-1))
|
||
{
|
||
sys_err("QUEST wrong get flag");
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
const char* sz = lua_tostring(L,-1);
|
||
CQuestManager& q = CQuestManager::Instance();
|
||
PC* pPC = q.GetCurrentPC();
|
||
lua_pushnumber(L,pPC->GetFlag(sz));
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
int pc_get_quest_flag(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,-1))
|
||
{
|
||
sys_err("QUEST wrong get flag");
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
const char* sz = lua_tostring(L,-1);
|
||
CQuestManager& q = CQuestManager::Instance();
|
||
PC* pPC = q.GetCurrentPC();
|
||
lua_pushnumber(L,pPC->GetFlag(pPC->GetCurrentQuestName() + "."+sz));
|
||
if ( test_server )
|
||
sys_log( 0 ,"GetQF ( %s . %s )", pPC->GetCurrentQuestName().c_str(), sz );
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
int pc_set_flag(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1) || !lua_isnumber(L,2))
|
||
{
|
||
sys_err("QUEST wrong set flag");
|
||
}
|
||
else
|
||
{
|
||
const char* sz = lua_tostring(L,1);
|
||
CQuestManager& q = CQuestManager::Instance();
|
||
PC* pPC = q.GetCurrentPC();
|
||
pPC->SetFlag(sz, int(rint(lua_tonumber(L,2))));
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int pc_set_quest_flag(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1) || !lua_isnumber(L,2))
|
||
{
|
||
sys_err("QUEST wrong set flag");
|
||
}
|
||
else
|
||
{
|
||
const char* sz = lua_tostring(L,1);
|
||
CQuestManager& q = CQuestManager::Instance();
|
||
PC* pPC = q.GetCurrentPC();
|
||
pPC->SetFlag(pPC->GetCurrentQuestName()+"."+sz, int(rint(lua_tonumber(L,2))));
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int pc_del_quest_flag(lua_State *L)
|
||
{
|
||
if (!lua_isstring(L, 1))
|
||
{
|
||
sys_err("argument error");
|
||
return 0;
|
||
}
|
||
|
||
const char * sz = lua_tostring(L, 1);
|
||
PC * pPC = CQuestManager::instance().GetCurrentPC();
|
||
pPC->DeleteFlag(pPC->GetCurrentQuestName()+"."+sz);
|
||
return 0;
|
||
}
|
||
|
||
int pc_give_exp2(lua_State* L)
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
||
if (!lua_isnumber(L,1))
|
||
return 0;
|
||
|
||
sys_log(0,"QUEST [REWARD] %s give exp2 %d", ch->GetName(), (int)rint(lua_tonumber(L,1)));
|
||
|
||
DWORD exp = (DWORD)rint(lua_tonumber(L,1));
|
||
|
||
PC* pPC = CQuestManager::instance().GetCurrentPC();
|
||
LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), exp, 0);
|
||
ch->PointChange(POINT_EXP, exp);
|
||
return 0;
|
||
}
|
||
|
||
int pc_give_exp(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1) || !lua_isnumber(L,2))
|
||
return 0;
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
||
|
||
sys_log(0,"QUEST [REWARD] %s give exp %s %d", ch->GetName(), lua_tostring(L,1), (int)rint(lua_tonumber(L,2)));
|
||
|
||
DWORD exp = (DWORD)rint(lua_tonumber(L,2));
|
||
|
||
PC* pPC = CQuestManager::instance().GetCurrentPC();
|
||
|
||
LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), exp, 0);
|
||
|
||
pPC->GiveExp(lua_tostring(L,1), exp);
|
||
return 0;
|
||
}
|
||
|
||
int pc_give_exp_perc(lua_State* L)
|
||
{
|
||
CQuestManager & q = CQuestManager::instance();
|
||
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
||
|
||
if (!ch || !lua_isstring(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3))
|
||
return 0;
|
||
|
||
int lev = (int)rint(lua_tonumber(L,2));
|
||
double proc = (lua_tonumber(L,3));
|
||
|
||
sys_log(0, "QUEST [REWARD] %s give exp %s lev %d percent %g%%", ch->GetName(), lua_tostring(L, 1), lev, proc);
|
||
|
||
DWORD exp = (DWORD)((exp_table[MINMAX(0, lev, PLAYER_EXP_TABLE_MAX)] * proc) / 100);
|
||
PC * pPC = CQuestManager::instance().GetCurrentPC();
|
||
|
||
LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), exp, 0);
|
||
|
||
pPC->GiveExp(lua_tostring(L, 1), exp);
|
||
return 0;
|
||
}
|
||
|
||
int pc_get_empire(lua_State* L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetEmpire());
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_part(lua_State* L)
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
||
if (!lua_isnumber(L,1))
|
||
{
|
||
lua_pushnumber(L, 0);
|
||
return 1;
|
||
}
|
||
int part_idx = (int)lua_tonumber(L, 1);
|
||
lua_pushnumber(L, ch->GetPart(part_idx));
|
||
return 1;
|
||
}
|
||
|
||
int pc_set_part(lua_State* L)
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
||
if (!lua_isnumber(L,1) || !lua_isnumber(L,2))
|
||
{
|
||
return 0;
|
||
}
|
||
int part_idx = (int)lua_tonumber(L, 1);
|
||
int part_value = (int)lua_tonumber(L, 2);
|
||
ch->SetPart(part_idx, part_value);
|
||
ch->UpdatePacket();
|
||
return 0;
|
||
}
|
||
|
||
int pc_get_skillgroup(lua_State* L)
|
||
{
|
||
lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetSkillGroup());
|
||
return 1;
|
||
}
|
||
|
||
int pc_set_skillgroup(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
sys_err("QUEST wrong skillgroup number");
|
||
else
|
||
{
|
||
CQuestManager & q = CQuestManager::Instance();
|
||
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
||
|
||
ch->SetSkillGroup((BYTE) rint(lua_tonumber(L, 1)));
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int pc_is_polymorphed(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushboolean(L, ch->IsPolymorphed());
|
||
return 1;
|
||
}
|
||
|
||
int pc_remove_polymorph(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
ch->RemoveAffect(AFFECT_POLYMORPH);
|
||
ch->SetPolymorph(0);
|
||
return 0;
|
||
}
|
||
|
||
int pc_polymorph(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
DWORD dwVnum = (DWORD) lua_tonumber(L, 1);
|
||
int iDuration = (int) lua_tonumber(L, 2);
|
||
ch->AddAffect(AFFECT_POLYMORPH, POINT_POLYMORPH, dwVnum, AFF_POLYMORPH, iDuration, 0, true);
|
||
return 0;
|
||
}
|
||
|
||
int pc_is_mount(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushboolean(L, ch->GetMountVnum());
|
||
return 1;
|
||
}
|
||
|
||
int pc_mount(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
return 0;
|
||
|
||
int length = 60;
|
||
|
||
if (lua_isnumber(L, 2))
|
||
length = (int)lua_tonumber(L, 2);
|
||
|
||
DWORD mount_vnum = (DWORD)lua_tonumber(L, 1);
|
||
|
||
if (length < 0)
|
||
length = 60;
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
ch->RemoveAffect(AFFECT_MOUNT);
|
||
ch->RemoveAffect(AFFECT_MOUNT_BONUS);
|
||
|
||
// <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٴϴ<D9B4> <20><><EFBFBD>¶<EFBFBD><C2B6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
if (ch->GetHorse())
|
||
ch->HorseSummon(false);
|
||
|
||
if (mount_vnum)
|
||
{
|
||
ch->AddAffect(AFFECT_MOUNT, POINT_MOUNT, mount_vnum, AFF_NONE, length, 0, true);
|
||
switch (mount_vnum)
|
||
{
|
||
case 20201:
|
||
case 20202:
|
||
case 20203:
|
||
case 20204:
|
||
case 20213:
|
||
case 20216:
|
||
ch->AddAffect(AFFECT_MOUNT, POINT_MOV_SPEED, 30, AFF_NONE, length, 0, true, true);
|
||
break;
|
||
|
||
case 20205:
|
||
case 20206:
|
||
case 20207:
|
||
case 20208:
|
||
case 20214:
|
||
case 20217:
|
||
ch->AddAffect(AFFECT_MOUNT, POINT_MOV_SPEED, 40, AFF_NONE, length, 0, true, true);
|
||
break;
|
||
|
||
case 20209:
|
||
case 20210:
|
||
case 20211:
|
||
case 20212:
|
||
case 20215:
|
||
case 20218:
|
||
ch->AddAffect(AFFECT_MOUNT, POINT_MOV_SPEED, 50, AFF_NONE, length, 0, true, true);
|
||
break;
|
||
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
int pc_mount_bonus(lua_State* L)
|
||
{
|
||
BYTE applyOn = static_cast<BYTE>(lua_tonumber(L, 1));
|
||
int value = static_cast<int>(lua_tonumber(L, 2));
|
||
int duration = static_cast<int>(lua_tonumber(L, 3));
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if( NULL != ch )
|
||
{
|
||
ch->RemoveAffect(AFFECT_MOUNT_BONUS);
|
||
ch->AddAffect(AFFECT_MOUNT_BONUS, aApplyInfo[applyOn].bPointType, value, AFF_NONE, duration, 0, false);
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
int pc_unmount(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
ch->RemoveAffect(AFFECT_MOUNT);
|
||
ch->RemoveAffect(AFFECT_MOUNT_BONUS);
|
||
if (ch->IsHorseRiding())
|
||
ch->StopRiding();
|
||
return 0;
|
||
}
|
||
|
||
int pc_get_horse_level(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushnumber(L, ch->GetHorseLevel());
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_horse_hp(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
if (ch->GetHorseLevel())
|
||
lua_pushnumber(L, ch->GetHorseHealth());
|
||
else
|
||
lua_pushnumber(L, 0);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_horse_stamina(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
if (ch->GetHorseLevel())
|
||
lua_pushnumber(L, ch->GetHorseStamina());
|
||
else
|
||
lua_pushnumber(L, 0);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_is_horse_alive(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushboolean(L, ch->GetHorseLevel() > 0 && ch->GetHorseHealth()>0);
|
||
return 1;
|
||
}
|
||
|
||
int pc_revive_horse(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
ch->ReviveHorse();
|
||
return 0;
|
||
}
|
||
|
||
int pc_have_map_scroll(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L, 1))
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
const char * szMapName = lua_tostring(L, 1);
|
||
const TMapRegion * region = SECTREE_MANAGER::instance().FindRegionByPartialName(szMapName);
|
||
|
||
if (!region)
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
bool bFind = false;
|
||
for (int iCell = 0; iCell < INVENTORY_MAX_NUM; iCell++)
|
||
{
|
||
LPITEM item = ch->GetInventoryItem(iCell);
|
||
if (!item)
|
||
continue;
|
||
|
||
if (item->GetType() == ITEM_USE &&
|
||
item->GetSubType() == USE_TALISMAN &&
|
||
(item->GetValue(0) == 1 || item->GetValue(0) == 2))
|
||
{
|
||
int x = item->GetSocket(0);
|
||
int y = item->GetSocket(1);
|
||
//if ((x-item_x)*(x-item_x)+(y-item_y)*(y-item_y)<r*r)
|
||
if (region->sx <=x && region->sy <= y && x <= region->ex && y <= region->ey)
|
||
{
|
||
bFind = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
lua_pushboolean(L, bFind);
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_war_map(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushnumber(L, ch->GetWarMap() ? ch->GetWarMap()->GetMapIndex() : 0);
|
||
return 1;
|
||
}
|
||
|
||
int pc_have_pos_scroll(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (!lua_isnumber(L,1) || !lua_isnumber(L,2))
|
||
{
|
||
sys_err("invalid x y position");
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
if (!lua_isnumber(L,2))
|
||
{
|
||
sys_err("invalid radius");
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
int x = (int)lua_tonumber(L, 1);
|
||
int y = (int)lua_tonumber(L, 2);
|
||
float r = (float)lua_tonumber(L, 3);
|
||
|
||
bool bFind = false;
|
||
for (int iCell = 0; iCell < INVENTORY_MAX_NUM; iCell++)
|
||
{
|
||
LPITEM item = ch->GetInventoryItem(iCell);
|
||
if (!item)
|
||
continue;
|
||
|
||
if (item->GetType() == ITEM_USE &&
|
||
item->GetSubType() == USE_TALISMAN &&
|
||
(item->GetValue(0) == 1 || item->GetValue(0) == 2))
|
||
{
|
||
int item_x = item->GetSocket(0);
|
||
int item_y = item->GetSocket(1);
|
||
if ((x-item_x)*(x-item_x)+(y-item_y)*(y-item_y)<r*r)
|
||
{
|
||
bFind = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
lua_pushboolean(L, bFind);
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_equip_refine_level(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
int cell = (int) lua_tonumber(L, 1);
|
||
if (cell < 0 || cell >= WEAR_MAX_NUM)
|
||
{
|
||
sys_err("invalid wear position %d", cell);
|
||
lua_pushnumber(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
LPITEM item = ch->GetWear(cell);
|
||
if (!item)
|
||
{
|
||
lua_pushnumber(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
lua_pushnumber(L, item->GetRefineLevel());
|
||
return 1;
|
||
}
|
||
|
||
int pc_refine_equip(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2))
|
||
{
|
||
sys_err("invalid argument");
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
int cell = (int) lua_tonumber(L, 1);
|
||
int level_limit = (int) lua_tonumber(L, 2);
|
||
int pct = lua_isnumber(L, 3) ? (int)lua_tonumber(L, 3) : 100;
|
||
|
||
LPITEM item = ch->GetWear(cell);
|
||
if (!item)
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
if (item->GetRefinedVnum() == 0)
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
if (item->GetRefineLevel()>level_limit)
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
if (pct == 100 || number(1, 100) <= pct)
|
||
{
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
lua_pushboolean(L, 1);
|
||
|
||
LPITEM pkNewItem = ITEM_MANAGER::instance().CreateItem(item->GetRefinedVnum(), 1, 0, false);
|
||
|
||
if (pkNewItem)
|
||
{
|
||
for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
|
||
if (!item->GetSocket(i))
|
||
break;
|
||
else
|
||
pkNewItem->SetSocket(i, 1);
|
||
|
||
int set = 0;
|
||
for (int i=0; i<ITEM_SOCKET_MAX_NUM; i++)
|
||
{
|
||
int socket = item->GetSocket(i);
|
||
if (socket > 2 && socket != 28960)
|
||
{
|
||
pkNewItem->SetSocket(set++, socket);
|
||
}
|
||
}
|
||
|
||
item->CopyAttributeTo(pkNewItem);
|
||
|
||
ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE SUCCESS)");
|
||
|
||
// some tuits need here -_- pkNewItem->AddToCharacter(this, bCell);
|
||
pkNewItem->EquipTo(ch, cell);
|
||
|
||
ITEM_MANAGER::instance().FlushDelayedSave(pkNewItem);
|
||
|
||
LogManager::instance().ItemLog(ch, pkNewItem, "REFINE SUCCESS (QUEST)", pkNewItem->GetName());
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
lua_pushboolean(L, 0);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_skill_level(lua_State * L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
sys_err("invalid argument");
|
||
lua_pushnumber(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
DWORD dwVnum = (DWORD) lua_tonumber(L, 1);
|
||
lua_pushnumber(L, ch->GetSkillLevel(dwVnum));
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_give_lotto(lua_State* L)
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
||
|
||
sys_log(0, "TRY GIVE LOTTO TO pid %u", ch->GetPlayerID());
|
||
|
||
DWORD * pdw = M2_NEW DWORD[3];
|
||
|
||
pdw[0] = 50001;
|
||
pdw[1] = 1;
|
||
pdw[2] = q.GetEventFlag("lotto_round");
|
||
|
||
// <20><>÷<EFBFBD><C3B7><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>
|
||
DBManager::instance().ReturnQuery(QID_LOTTO, ch->GetPlayerID(), pdw,
|
||
"INSERT INTO lotto_list VALUES(0, 'server%s', %u, NOW())",
|
||
get_table_postfix(), ch->GetPlayerID());
|
||
|
||
return 0;
|
||
}
|
||
|
||
int pc_aggregate_monster(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
ch->AggregateMonster();
|
||
return 0;
|
||
}
|
||
|
||
int pc_forget_my_attacker(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
ch->ForgetMyAttacker();
|
||
return 0;
|
||
}
|
||
|
||
int pc_attract_ranger(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
ch->AttractRanger();
|
||
return 0;
|
||
}
|
||
|
||
int pc_select_pid(lua_State* L)
|
||
{
|
||
DWORD pid = (DWORD) lua_tonumber(L, 1);
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
LPCHARACTER new_ch = CHARACTER_MANAGER::instance().FindByPID(pid);
|
||
|
||
if (new_ch)
|
||
{
|
||
CQuestManager::instance().GetPC(new_ch->GetPlayerID());
|
||
|
||
lua_pushnumber(L, ch->GetPlayerID());
|
||
}
|
||
else
|
||
{
|
||
lua_pushnumber(L, 0);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_select_vid(lua_State* L)
|
||
{
|
||
DWORD vid = (DWORD) lua_tonumber(L, 1);
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
LPCHARACTER new_ch = CHARACTER_MANAGER::instance().Find(vid);
|
||
|
||
if (new_ch)
|
||
{
|
||
CQuestManager::instance().GetPC(new_ch->GetPlayerID());
|
||
|
||
lua_pushnumber(L, (DWORD)ch->GetVID());
|
||
}
|
||
else
|
||
{
|
||
lua_pushnumber(L, 0);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_sex(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushnumber(L, GET_SEX(ch)); /* 0==MALE, 1==FEMALE */
|
||
return 1;
|
||
}
|
||
|
||
int pc_is_engaged(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushboolean(L, marriage::CManager::instance().IsEngaged(ch->GetPlayerID()));
|
||
return 1;
|
||
}
|
||
|
||
int pc_is_married(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushboolean(L, marriage::CManager::instance().IsMarried(ch->GetPlayerID()));
|
||
return 1;
|
||
}
|
||
|
||
int pc_is_engaged_or_married(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushboolean(L, marriage::CManager::instance().IsEngagedOrMarried(ch->GetPlayerID()));
|
||
return 1;
|
||
}
|
||
|
||
int pc_is_gm(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushboolean(L, ch->GetGMLevel() >= GM_HIGH_WIZARD);
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_gm_level(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushnumber(L, ch->GetGMLevel());
|
||
return 1;
|
||
}
|
||
|
||
int pc_mining(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
LPCHARACTER npc = CQuestManager::instance().GetCurrentNPCCharacterPtr();
|
||
ch->mining(npc);
|
||
return 0;
|
||
}
|
||
|
||
int pc_diamond_refine(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
int cost = (int) lua_tonumber(L, 1);
|
||
int pct = (int)lua_tonumber(L, 2);
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
LPCHARACTER npc = CQuestManager::instance().GetCurrentNPCCharacterPtr();
|
||
LPITEM item = CQuestManager::instance().GetCurrentItem();
|
||
|
||
if (item)
|
||
lua_pushboolean(L, mining::OreRefine(ch, npc, item, cost, pct, NULL));
|
||
else
|
||
lua_pushboolean(L, 0);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_ore_refine(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
int cost = (int) lua_tonumber(L, 1);
|
||
int pct = (int)lua_tonumber(L, 2);
|
||
int metinstone_cell = (int)lua_tonumber(L, 3);
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
LPCHARACTER npc = CQuestManager::instance().GetCurrentNPCCharacterPtr();
|
||
LPITEM item = CQuestManager::instance().GetCurrentItem();
|
||
|
||
LPITEM metinstone_item = ch->GetInventoryItem(metinstone_cell);
|
||
|
||
if (item && metinstone_item)
|
||
lua_pushboolean(L, mining::OreRefine(ch, npc, item, cost, pct, metinstone_item));
|
||
else
|
||
lua_pushboolean(L, 0);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_clear_skill(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
if ( ch == NULL ) return 0;
|
||
|
||
ch->ClearSkill();
|
||
|
||
return 0;
|
||
}
|
||
|
||
int pc_clear_sub_skill(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
if ( ch == NULL ) return 0;
|
||
|
||
ch->ClearSubSkill();
|
||
|
||
return 0;
|
||
}
|
||
|
||
int pc_set_skill_point(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
int newPoint = (int) lua_tonumber(L, 1);
|
||
|
||
ch->SetRealPoint(POINT_SKILL, newPoint);
|
||
ch->SetPoint(POINT_SKILL, ch->GetRealPoint(POINT_SKILL));
|
||
ch->PointChange(POINT_SKILL, 0);
|
||
ch->ComputePoints();
|
||
ch->PointsPacket();
|
||
|
||
return 0;
|
||
}
|
||
|
||
// RESET_ONE_SKILL
|
||
int pc_clear_one_skill(lua_State* L)
|
||
{
|
||
int vnum = (int)lua_tonumber(L, 1);
|
||
sys_log(0, "%d skill clear", vnum);
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
if ( ch == NULL )
|
||
{
|
||
sys_log(0, "skill clear fail");
|
||
lua_pushnumber(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
sys_log(0, "%d skill clear", vnum);
|
||
|
||
ch->ResetOneSkill(vnum);
|
||
|
||
return 0;
|
||
}
|
||
// END_RESET_ONE_SKILL
|
||
|
||
int pc_is_clear_skill_group(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
lua_pushboolean(L, ch->GetQuestFlag("skill_group_clear.clear") == 1);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_save_exit_location(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
ch->SaveExitLocation();
|
||
|
||
return 0;
|
||
}
|
||
|
||
//<2F>ڷ<EFBFBD><DAB7><EFBFBD>Ʈ
|
||
int pc_teleport ( lua_State * L )
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
int x=0,y=0;
|
||
if ( lua_isnumber(L, 1) )
|
||
{
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
const int TOWN_NUM = 10;
|
||
struct warp_by_town_name
|
||
{
|
||
const char* name;
|
||
DWORD x;
|
||
DWORD y;
|
||
} ws[TOWN_NUM] =
|
||
{
|
||
{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", 4743, 9548},
|
||
{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", 3235, 9086},
|
||
{"<EFBFBD>ھ<EFBFBD><EFBFBD><EFBFBD>", 3531, 8829},
|
||
{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", 638, 1664},
|
||
{"<EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>", 1745, 1909},
|
||
{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", 1455, 2400},
|
||
{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", 9599, 2692},
|
||
{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", 8036, 2984},
|
||
{"<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>", 8639, 2460},
|
||
{"<EFBFBD><EFBFBD><EFBFBD>ѻ<EFBFBD>", 4350, 2143},
|
||
};
|
||
int idx = (int)lua_tonumber(L, 1);
|
||
|
||
x = ws[idx].x;
|
||
y = ws[idx].y;
|
||
goto teleport_area;
|
||
}
|
||
|
||
else
|
||
{
|
||
const char * arg1 = lua_tostring(L, 1);
|
||
|
||
LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
|
||
|
||
if (!tch)
|
||
{
|
||
const CCI* pkCCI = P2P_MANAGER::instance().Find(arg1);
|
||
|
||
if (pkCCI)
|
||
{
|
||
if (pkCCI->bChannel != g_bChannel)
|
||
{
|
||
ch->ChatPacket(CHAT_TYPE_INFO, "Target is in %d channel (my channel %d)", pkCCI->bChannel, g_bChannel);
|
||
}
|
||
else
|
||
{
|
||
|
||
PIXEL_POSITION pos;
|
||
|
||
if (!SECTREE_MANAGER::instance().GetCenterPositionOfMap(pkCCI->lMapIndex, pos))
|
||
{
|
||
ch->ChatPacket(CHAT_TYPE_INFO, "Cannot find map (index %d)", pkCCI->lMapIndex);
|
||
}
|
||
else
|
||
{
|
||
ch->ChatPacket(CHAT_TYPE_INFO, "You warp to ( %d, %d )", pos.x, pos.y);
|
||
ch->WarpSet(pos.x, pos.y);
|
||
lua_pushnumber(L, 1 );
|
||
}
|
||
}
|
||
}
|
||
else if (NULL == CHARACTER_MANAGER::instance().FindPC(arg1))
|
||
{
|
||
ch->ChatPacket(CHAT_TYPE_INFO, "There is no one by that name");
|
||
}
|
||
|
||
lua_pushnumber(L, 0 );
|
||
|
||
return 1;
|
||
}
|
||
else
|
||
{
|
||
x = tch->GetX() / 100;
|
||
y = tch->GetY() / 100;
|
||
}
|
||
}
|
||
|
||
teleport_area:
|
||
|
||
x *= 100;
|
||
y *= 100;
|
||
|
||
ch->ChatPacket(CHAT_TYPE_INFO, "You warp to ( %d, %d )", x, y);
|
||
ch->WarpSet(x,y);
|
||
ch->Stop();
|
||
lua_pushnumber(L, 1 );
|
||
return 1;
|
||
}
|
||
|
||
int pc_set_skill_level(lua_State* L)
|
||
{
|
||
DWORD dwVnum = (DWORD)lua_tonumber(L, 1);
|
||
BYTE byLev = (BYTE)lua_tonumber(L, 2);
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
ch->SetSkillLevel(dwVnum, byLev);
|
||
|
||
ch->SkillLevelPacket();
|
||
|
||
return 0;
|
||
}
|
||
|
||
int pc_give_polymorph_book(lua_State* L)
|
||
{
|
||
if ( lua_isnumber(L, 1) != true && lua_isnumber(L, 2) != true && lua_isnumber(L, 3) != true && lua_isnumber(L, 4) != true )
|
||
{
|
||
sys_err("Wrong Quest Function Arguments: pc_give_polymorph_book");
|
||
return 0;
|
||
}
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
CPolymorphUtils::instance().GiveBook(ch, (DWORD)lua_tonumber(L, 1), (DWORD)lua_tonumber(L, 2), (BYTE)lua_tonumber(L, 3), (BYTE)lua_tonumber(L, 4));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int pc_upgrade_polymorph_book(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
LPITEM pItem = CQuestManager::instance().GetCurrentItem();
|
||
|
||
bool ret = CPolymorphUtils::instance().BookUpgrade(ch, pItem);
|
||
|
||
lua_pushboolean(L, ret);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_premium_remain_sec(lua_State* L)
|
||
{
|
||
int remain_seconds = 0;
|
||
int premium_type = 0;
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
sys_err("wrong premium index (is not number)");
|
||
return 0;
|
||
}
|
||
|
||
premium_type = (int)lua_tonumber(L,1);
|
||
switch (premium_type)
|
||
{
|
||
case PREMIUM_EXP:
|
||
case PREMIUM_ITEM:
|
||
case PREMIUM_SAFEBOX:
|
||
case PREMIUM_AUTOLOOT:
|
||
case PREMIUM_FISH_MIND:
|
||
case PREMIUM_MARRIAGE_FAST:
|
||
case PREMIUM_GOLD:
|
||
break;
|
||
|
||
default:
|
||
sys_err("wrong premium index %d", premium_type);
|
||
return 0;
|
||
}
|
||
|
||
remain_seconds = ch->GetPremiumRemainSeconds(premium_type);
|
||
|
||
lua_pushnumber(L, remain_seconds);
|
||
return 1;
|
||
}
|
||
|
||
int pc_send_block_mode(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
ch->SetBlockModeForce((BYTE)lua_tonumber(L, 1));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int pc_change_empire(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
lua_pushnumber(L, ch->ChangeEmpire((unsigned char)lua_tonumber(L, 1)));
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_change_empire_count(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
lua_pushnumber(L, ch->GetChangeEmpireCount());
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_set_change_empire_count(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
ch->SetChangeEmpireCount();
|
||
|
||
return 0;
|
||
}
|
||
|
||
int pc_change_name(lua_State* L)
|
||
{
|
||
// <20><><EFBFBD>ϰ<EFBFBD>
|
||
// 0: <20><><EFBFBD≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>αƿ<D7BE><C6BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// 1: <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD> <20>ʾ<EFBFBD><CABE><EFBFBD>
|
||
// 2: check_name <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// 3: <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// 4: <20><><EFBFBD><EFBFBD>
|
||
// 5: <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
if ( LC_IsEurope() )
|
||
{
|
||
lua_pushnumber(L, 5);
|
||
return 1;
|
||
}
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if ( ch->GetNewName().size() != 0 )
|
||
{
|
||
lua_pushnumber(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
if ( lua_isstring(L, 1) != true )
|
||
{
|
||
lua_pushnumber(L, 1);
|
||
return 1;
|
||
}
|
||
|
||
const char * szName = lua_tostring(L, 1);
|
||
|
||
if ( check_name(szName) == false )
|
||
{
|
||
lua_pushnumber(L, 2);
|
||
return 1;
|
||
}
|
||
|
||
char szQuery[1024];
|
||
snprintf(szQuery, sizeof(szQuery), "SELECT COUNT(*) FROM player%s WHERE name='%s'", get_table_postfix(), szName);
|
||
std::unique_ptr<SQLMsg> pmsg(DBManager::instance().DirectQuery(szQuery));
|
||
|
||
if ( pmsg->Get()->uiNumRows > 0 )
|
||
{
|
||
MYSQL_ROW row = mysql_fetch_row(pmsg->Get()->pSQLResult);
|
||
|
||
int count = 0;
|
||
str_to_number(count, row[0]);
|
||
|
||
// <20>̹<EFBFBD> <20>ش<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
if ( count != 0 )
|
||
{
|
||
lua_pushnumber(L, 3);
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
DWORD pid = ch->GetPlayerID();
|
||
db_clientdesc->DBPacketHeader(HEADER_GD_FLUSH_CACHE, 0, sizeof(DWORD));
|
||
db_clientdesc->Packet(&pid, sizeof(DWORD));
|
||
|
||
/* delete messenger list */
|
||
MessengerManager::instance().RemoveAllList(ch->GetName());
|
||
|
||
/* change_name_log */
|
||
LogManager::instance().ChangeNameLog(pid, ch->GetName(), szName, ch->GetDesc()->GetHostName());
|
||
|
||
snprintf(szQuery, sizeof(szQuery), "UPDATE player%s SET name='%s' WHERE id=%u", get_table_postfix(), szName, pid);
|
||
SQLMsg * msg = DBManager::instance().DirectQuery(szQuery);
|
||
M2_DELETE(msg);
|
||
|
||
ch->SetNewName(szName);
|
||
lua_pushnumber(L, 4);
|
||
return 1;
|
||
}
|
||
|
||
int pc_is_dead(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if ( ch != NULL )
|
||
{
|
||
lua_pushboolean(L, ch->IsDead());
|
||
return 1;
|
||
}
|
||
|
||
lua_pushboolean(L, true);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_reset_status( lua_State* L )
|
||
{
|
||
if ( lua_isnumber(L, 1) == true )
|
||
{
|
||
int idx = (int)lua_tonumber(L, 1);
|
||
|
||
if ( idx >= 0 && idx < 4 )
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
int point = POINT_NONE;
|
||
char buf[128];
|
||
|
||
switch ( idx )
|
||
{
|
||
case 0 : point = POINT_HT; break;
|
||
case 1 : point = POINT_IQ; break;
|
||
case 2 : point = POINT_ST; break;
|
||
case 3 : point = POINT_DX; break;
|
||
default : lua_pushboolean(L, false); return 1;
|
||
}
|
||
|
||
int old_val = ch->GetRealPoint(point);
|
||
int old_stat = ch->GetRealPoint(POINT_STAT);
|
||
|
||
ch->SetRealPoint(point, 1);
|
||
ch->SetPoint(point, ch->GetRealPoint(point));
|
||
|
||
ch->PointChange(POINT_STAT, old_val-1);
|
||
|
||
if ( point == POINT_HT )
|
||
{
|
||
BYTE job = ch->GetJob();
|
||
ch->SetRandomHP((ch->GetLevel()-1) * number(JobInitialPoints[job].hp_per_lv_begin, JobInitialPoints[job].hp_per_lv_end));
|
||
}
|
||
else if ( point == POINT_IQ )
|
||
{
|
||
BYTE job = ch->GetJob();
|
||
ch->SetRandomSP((ch->GetLevel()-1) * number(JobInitialPoints[job].sp_per_lv_begin, JobInitialPoints[job].sp_per_lv_end));
|
||
}
|
||
|
||
ch->ComputePoints();
|
||
ch->PointsPacket();
|
||
|
||
if ( point == POINT_HT )
|
||
{
|
||
ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
|
||
}
|
||
else if ( point == POINT_IQ )
|
||
{
|
||
ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
|
||
}
|
||
|
||
switch ( idx )
|
||
{
|
||
case 0 :
|
||
snprintf(buf, sizeof(buf), "reset ht(%d)->1 stat_point(%d)->(%d)", old_val, old_stat, ch->GetRealPoint(POINT_STAT));
|
||
break;
|
||
case 1 :
|
||
snprintf(buf, sizeof(buf), "reset iq(%d)->1 stat_point(%d)->(%d)", old_val, old_stat, ch->GetRealPoint(POINT_STAT));
|
||
break;
|
||
case 2 :
|
||
snprintf(buf, sizeof(buf), "reset st(%d)->1 stat_point(%d)->(%d)", old_val, old_stat, ch->GetRealPoint(POINT_STAT));
|
||
break;
|
||
case 3 :
|
||
snprintf(buf, sizeof(buf), "reset dx(%d)->1 stat_point(%d)->(%d)", old_val, old_stat, ch->GetRealPoint(POINT_STAT));
|
||
break;
|
||
}
|
||
|
||
LogManager::instance().CharLog(ch, 0, "RESET_ONE_STATUS", buf);
|
||
|
||
lua_pushboolean(L, true);
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
lua_pushboolean(L, false);
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_ht( lua_State* L )
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushnumber(L, ch->GetRealPoint(POINT_HT));
|
||
return 1;
|
||
}
|
||
|
||
int pc_set_ht( lua_State* L )
|
||
{
|
||
if ( lua_isnumber(L, 1) == false )
|
||
return 1;
|
||
|
||
int newPoint = (int)lua_tonumber(L, 1);
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
int usedPoint = newPoint - ch->GetRealPoint(POINT_HT);
|
||
ch->SetRealPoint(POINT_HT, newPoint);
|
||
ch->PointChange(POINT_HT, 0);
|
||
ch->PointChange(POINT_STAT, -usedPoint);
|
||
ch->ComputePoints();
|
||
ch->PointsPacket();
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_iq( lua_State* L )
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushnumber(L, ch->GetRealPoint(POINT_IQ));
|
||
return 1;
|
||
}
|
||
|
||
int pc_set_iq( lua_State* L )
|
||
{
|
||
if ( lua_isnumber(L, 1) == false )
|
||
return 1;
|
||
|
||
int newPoint = (int)lua_tonumber(L, 1);
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
int usedPoint = newPoint - ch->GetRealPoint(POINT_IQ);
|
||
ch->SetRealPoint(POINT_IQ, newPoint);
|
||
ch->PointChange(POINT_IQ, 0);
|
||
ch->PointChange(POINT_STAT, -usedPoint);
|
||
ch->ComputePoints();
|
||
ch->PointsPacket();
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_st( lua_State* L )
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushnumber(L, ch->GetRealPoint(POINT_ST));
|
||
return 1;
|
||
}
|
||
|
||
int pc_set_st( lua_State* L )
|
||
{
|
||
if ( lua_isnumber(L, 1) == false )
|
||
return 1;
|
||
|
||
int newPoint = (int)lua_tonumber(L, 1);
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
int usedPoint = newPoint - ch->GetRealPoint(POINT_ST);
|
||
ch->SetRealPoint(POINT_ST, newPoint);
|
||
ch->PointChange(POINT_ST, 0);
|
||
ch->PointChange(POINT_STAT, -usedPoint);
|
||
ch->ComputePoints();
|
||
ch->PointsPacket();
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_dx( lua_State* L )
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
lua_pushnumber(L, ch->GetRealPoint(POINT_DX));
|
||
return 1;
|
||
}
|
||
|
||
int pc_set_dx( lua_State* L )
|
||
{
|
||
if ( lua_isnumber(L, 1) == false )
|
||
return 1;
|
||
|
||
int newPoint = (int)lua_tonumber(L, 1);
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
int usedPoint = newPoint - ch->GetRealPoint(POINT_DX);
|
||
ch->SetRealPoint(POINT_DX, newPoint);
|
||
ch->PointChange(POINT_DX, 0);
|
||
ch->PointChange(POINT_STAT, -usedPoint);
|
||
ch->ComputePoints();
|
||
ch->PointsPacket();
|
||
return 1;
|
||
}
|
||
|
||
int pc_is_near_vid( lua_State* L )
|
||
{
|
||
if ( lua_isnumber(L, 1) != true || lua_isnumber(L, 2) != true )
|
||
{
|
||
lua_pushboolean(L, false);
|
||
}
|
||
else
|
||
{
|
||
LPCHARACTER pMe = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
LPCHARACTER pOther = CHARACTER_MANAGER::instance().Find( (DWORD)lua_tonumber(L, 1) );
|
||
|
||
if ( pMe != NULL && pOther != NULL )
|
||
{
|
||
lua_pushboolean(L, (DISTANCE_APPROX(pMe->GetX() - pOther->GetX(), pMe->GetY() - pOther->GetY()) < (int)lua_tonumber(L, 2)*100));
|
||
}
|
||
else
|
||
{
|
||
lua_pushboolean(L, false);
|
||
}
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_socket_items( lua_State* L )
|
||
{
|
||
LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
lua_newtable( L );
|
||
|
||
if ( pChar == NULL ) return 1;
|
||
|
||
int idx = 1;
|
||
|
||
// <20><>ȥ<EFBFBD><C8A5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>.
|
||
// <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> Ż<><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><> <20>ϴ<EFBFBD>.
|
||
for ( int i=0; i < INVENTORY_MAX_NUM + WEAR_MAX_NUM; i++ )
|
||
{
|
||
LPITEM pItem = pChar->GetInventoryItem(i);
|
||
|
||
if ( pItem != NULL )
|
||
{
|
||
if ( pItem->IsEquipped() == false )
|
||
{
|
||
int j = 0;
|
||
for (; j < ITEM_SOCKET_MAX_NUM; j++ )
|
||
{
|
||
int socket = pItem->GetSocket(j);
|
||
|
||
if ( socket > 2 && socket != ITEM_BROKEN_METIN_VNUM )
|
||
{
|
||
TItemTable* pItemInfo = ITEM_MANAGER::instance().GetTable( socket );
|
||
if ( pItemInfo != NULL )
|
||
{
|
||
if ( pItemInfo->bType == ITEM_METIN ) break;
|
||
}
|
||
}
|
||
}
|
||
|
||
if ( j >= ITEM_SOCKET_MAX_NUM ) continue;
|
||
|
||
lua_newtable( L );
|
||
|
||
{
|
||
lua_pushstring( L, pItem->GetName() );
|
||
lua_rawseti( L, -2, 1 );
|
||
|
||
lua_pushnumber( L, i );
|
||
lua_rawseti( L, -2, 2 );
|
||
}
|
||
|
||
lua_rawseti( L, -2, idx++ );
|
||
}
|
||
}
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_empty_inventory_count( lua_State* L )
|
||
{
|
||
LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if ( pChar != NULL )
|
||
{
|
||
lua_pushnumber(L, pChar->CountEmptyInventory());
|
||
}
|
||
else
|
||
{
|
||
lua_pushnumber(L, 0);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_logoff_interval( lua_State* L )
|
||
{
|
||
LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if ( pChar != NULL )
|
||
{
|
||
lua_pushnumber(L, pChar->GetLogOffInterval());
|
||
}
|
||
else
|
||
{
|
||
lua_pushnumber(L, 0);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_player_id( lua_State* L )
|
||
{
|
||
LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if ( pChar != NULL )
|
||
{
|
||
lua_pushnumber( L, pChar->GetPlayerID() );
|
||
}
|
||
else
|
||
{
|
||
lua_pushnumber( L, 0 );
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_account_id( lua_State* L )
|
||
{
|
||
LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if ( pChar != NULL )
|
||
{
|
||
if ( pChar->GetDesc() != NULL )
|
||
{
|
||
lua_pushnumber( L, pChar->GetDesc()->GetAccountTable().id );
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
lua_pushnumber( L, 0 );
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_account( lua_State* L )
|
||
{
|
||
LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if( NULL != pChar )
|
||
{
|
||
if( NULL != pChar->GetDesc() )
|
||
{
|
||
lua_pushstring( L, pChar->GetDesc()->GetAccountTable().login );
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
lua_pushstring( L, "" );
|
||
return 1;
|
||
}
|
||
|
||
int pc_is_riding(lua_State* L)
|
||
{
|
||
LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if( NULL != pChar )
|
||
{
|
||
bool is_riding = pChar->IsRiding();
|
||
|
||
lua_pushboolean(L, is_riding);
|
||
|
||
return 1;
|
||
}
|
||
|
||
lua_pushboolean(L, false);
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_special_ride_vnum(lua_State* L)
|
||
{
|
||
LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (NULL != pChar)
|
||
{
|
||
LPITEM Unique1 = pChar->GetWear(WEAR_UNIQUE1);
|
||
LPITEM Unique2 = pChar->GetWear(WEAR_UNIQUE2);
|
||
|
||
if (NULL != Unique1)
|
||
{
|
||
if (UNIQUE_GROUP_SPECIAL_RIDE == Unique1->GetSpecialGroup())
|
||
{
|
||
lua_pushnumber(L, Unique1->GetVnum());
|
||
lua_pushnumber(L, Unique1->GetSocket(2));
|
||
return 2;
|
||
}
|
||
}
|
||
|
||
if (NULL != Unique2)
|
||
{
|
||
if (UNIQUE_GROUP_SPECIAL_RIDE == Unique2->GetSpecialGroup())
|
||
{
|
||
lua_pushnumber(L, Unique2->GetVnum());
|
||
lua_pushnumber(L, Unique2->GetSocket(2));
|
||
return 2;
|
||
}
|
||
}
|
||
}
|
||
|
||
lua_pushnumber(L, 0);
|
||
lua_pushnumber(L, 0);
|
||
|
||
return 2;
|
||
}
|
||
|
||
int pc_can_warp(lua_State* L)
|
||
{
|
||
LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (NULL != pChar)
|
||
{
|
||
lua_pushboolean(L, pChar->CanWarp());
|
||
}
|
||
else
|
||
{
|
||
lua_pushboolean(L, false);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_dec_skill_point(lua_State* L)
|
||
{
|
||
LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (NULL != pChar)
|
||
{
|
||
pChar->PointChange(POINT_SKILL, -1);
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
int pc_get_skill_point(lua_State* L)
|
||
{
|
||
LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (NULL != pChar)
|
||
{
|
||
lua_pushnumber(L, pChar->GetPoint(POINT_SKILL));
|
||
}
|
||
else
|
||
{
|
||
lua_pushnumber(L, 0);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_channel_id(lua_State* L)
|
||
{
|
||
lua_pushnumber(L, g_bChannel);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_give_poly_marble(lua_State* L)
|
||
{
|
||
const int dwVnum = lua_tonumber(L, 1);
|
||
|
||
const CMob* MobInfo = CMobManager::instance().Get(dwVnum);
|
||
|
||
if (NULL == MobInfo)
|
||
{
|
||
lua_pushboolean(L, false);
|
||
return 1;
|
||
}
|
||
|
||
if (0 == MobInfo->m_table.dwPolymorphItemVnum)
|
||
{
|
||
lua_pushboolean(L, false);
|
||
return 1;
|
||
}
|
||
|
||
LPITEM item = ITEM_MANAGER::instance().CreateItem( MobInfo->m_table.dwPolymorphItemVnum );
|
||
|
||
if (NULL == item)
|
||
{
|
||
lua_pushboolean(L, false);
|
||
return 1;
|
||
}
|
||
|
||
item->SetSocket(0, dwVnum);
|
||
|
||
const LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
int iEmptyCell = ch->GetEmptyInventory(item->GetSize());
|
||
|
||
if (-1 == iEmptyCell)
|
||
{
|
||
M2_DESTROY_ITEM(item);
|
||
lua_pushboolean(L, false);
|
||
return 1;
|
||
}
|
||
|
||
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyCell));
|
||
|
||
const PC* pPC = CQuestManager::instance().GetCurrentPC();
|
||
|
||
LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), MobInfo->m_table.dwPolymorphItemVnum, dwVnum);
|
||
|
||
lua_pushboolean(L, true);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_sig_items (lua_State* L)
|
||
{
|
||
DWORD group_vnum = (DWORD)lua_tonumber (L, 1);
|
||
const LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
int count = 0;
|
||
for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
|
||
{
|
||
if (ch->GetInventoryItem(i) != NULL && ch->GetInventoryItem(i)->GetSIGVnum() == group_vnum)
|
||
{
|
||
lua_pushnumber(L, ch->GetInventoryItem(i)->GetID());
|
||
count++;
|
||
}
|
||
}
|
||
|
||
return count;
|
||
}
|
||
|
||
int pc_charge_cash(lua_State * L)
|
||
{
|
||
TRequestChargeCash packet;
|
||
|
||
int amount = lua_isnumber(L, 1) ? (int)lua_tonumber(L, 1) : 0;
|
||
std::string strChargeType = lua_isstring(L, 2) ? lua_tostring(L, 2) : "";
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (NULL == ch || NULL == ch->GetDesc() || 1 > amount || 50000 < amount)
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
packet.dwAID = ch->GetDesc()->GetAccountTable().id;
|
||
packet.dwAmount = (DWORD)amount;
|
||
packet.eChargeType = ERequestCharge_Cash;
|
||
|
||
if (0 < strChargeType.length())
|
||
std::transform(strChargeType.begin(), strChargeType.end(), strChargeType.begin(), (int(*)(int))std::tolower);
|
||
|
||
if ("mileage" == strChargeType)
|
||
packet.eChargeType = ERequestCharge_Mileage;
|
||
|
||
db_clientdesc->DBPacketHeader(HEADER_GD_REQUEST_CHARGE_CASH, 0, sizeof(TRequestChargeCash));
|
||
db_clientdesc->Packet(&packet, sizeof(packet));
|
||
|
||
lua_pushboolean(L, 1);
|
||
return 1;
|
||
}
|
||
|
||
int pc_give_award(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isstring(L, 3) )
|
||
{
|
||
sys_err("QUEST give award call error : wrong argument");
|
||
lua_pushnumber (L, 0);
|
||
return 1;
|
||
}
|
||
|
||
DWORD dwVnum = (int) lua_tonumber(L, 1);
|
||
|
||
int icount = (int) lua_tonumber(L, 2);
|
||
|
||
sys_log(0, "QUEST [award] item %d to login %s", dwVnum, ch->GetDesc()->GetAccountTable().login);
|
||
|
||
DBManager::instance().Query("INSERT INTO item_award (login, vnum, count, given_time, why, mall)select '%s', %d, %d, now(), '%s', 1 from DUAL where not exists (select login, why from item_award where login = '%s' and why = '%s') ;",
|
||
ch->GetDesc()->GetAccountTable().login,
|
||
dwVnum,
|
||
icount,
|
||
lua_tostring(L,3),
|
||
ch->GetDesc()->GetAccountTable().login,
|
||
lua_tostring(L,3));
|
||
|
||
lua_pushnumber (L, 0);
|
||
return 1;
|
||
}
|
||
int pc_give_award_socket(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isstring(L, 3) || !lua_isstring(L, 4) || !lua_isstring(L, 5) || !lua_isstring(L, 6) )
|
||
{
|
||
sys_err("QUEST give award call error : wrong argument");
|
||
lua_pushnumber (L, 0);
|
||
return 1;
|
||
}
|
||
|
||
DWORD dwVnum = (int) lua_tonumber(L, 1);
|
||
|
||
int icount = (int) lua_tonumber(L, 2);
|
||
|
||
sys_log(0, "QUEST [award] item %d to login %s", dwVnum, ch->GetDesc()->GetAccountTable().login);
|
||
|
||
DBManager::instance().Query("INSERT INTO item_award (login, vnum, count, given_time, why, mall, socket0, socket1, socket2)select '%s', %d, %d, now(), '%s', 1, %s, %s, %s from DUAL where not exists (select login, why from item_award where login = '%s' and why = '%s') ;",
|
||
ch->GetDesc()->GetAccountTable().login,
|
||
dwVnum,
|
||
icount,
|
||
lua_tostring(L,3),
|
||
lua_tostring(L,4),
|
||
lua_tostring(L,5),
|
||
lua_tostring(L,6),
|
||
ch->GetDesc()->GetAccountTable().login,
|
||
lua_tostring(L,3));
|
||
|
||
lua_pushnumber (L, 0);
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_informer_type(lua_State* L) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
{
|
||
LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if( pChar != NULL )
|
||
{
|
||
//sys_err("quest cmd test %s", pChar->GetItemAward_cmd() );
|
||
lua_pushstring(L, pChar->GetItemAward_cmd() );
|
||
}
|
||
else
|
||
lua_pushstring(L, "" );
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_informer_item(lua_State* L)
|
||
{
|
||
LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if( pChar != NULL )
|
||
{
|
||
lua_pushnumber(L, pChar->GetItemAward_vnum() );
|
||
}
|
||
else
|
||
lua_pushnumber(L,0);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int pc_get_killee_drop_pct(lua_State* L)
|
||
{
|
||
LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
LPCHARACTER pKillee = pChar->GetQuestNPC();
|
||
|
||
int iDeltaPercent, iRandRange;
|
||
if (NULL == pKillee || !ITEM_MANAGER::instance().GetDropPct(pKillee, pChar, iDeltaPercent, iRandRange))
|
||
{
|
||
sys_err("killee is null");
|
||
lua_pushnumber(L, -1);
|
||
lua_pushnumber(L, -1);
|
||
|
||
return 2;
|
||
}
|
||
|
||
lua_pushnumber(L, iDeltaPercent);
|
||
lua_pushnumber(L, iRandRange);
|
||
|
||
return 2;
|
||
}
|
||
|
||
void RegisterPCFunctionTable()
|
||
{
|
||
luaL_reg pc_functions[] =
|
||
{
|
||
{ "get_wear", pc_get_wear },
|
||
{ "get_player_id", pc_get_player_id },
|
||
{ "get_account_id", pc_get_account_id },
|
||
{ "get_account", pc_get_account },
|
||
{ "get_level", pc_get_level },
|
||
{ "set_level", pc_set_level },
|
||
{ "get_next_exp", pc_get_next_exp },
|
||
{ "get_exp", pc_get_exp },
|
||
{ "get_job", pc_get_job },
|
||
{ "get_race", pc_get_race },
|
||
{ "change_sex", pc_change_sex },
|
||
{ "gethp", pc_get_hp },
|
||
{ "get_hp", pc_get_hp },
|
||
{ "getmaxhp", pc_get_max_hp },
|
||
{ "get_max_hp", pc_get_max_hp },
|
||
{ "getsp", pc_get_sp },
|
||
{ "get_sp", pc_get_sp },
|
||
{ "getmaxsp", pc_get_max_sp },
|
||
{ "get_max_sp", pc_get_max_sp },
|
||
{ "change_sp", pc_change_sp },
|
||
{ "getmoney", pc_get_money },
|
||
{ "get_money", pc_get_money },
|
||
{ "get_real_alignment", pc_get_real_alignment },
|
||
{ "get_alignment", pc_get_alignment },
|
||
{ "getweapon", pc_get_weapon },
|
||
{ "get_weapon", pc_get_weapon },
|
||
{ "getarmor", pc_get_armor },
|
||
{ "get_armor", pc_get_armor },
|
||
{ "getgold", pc_get_money },
|
||
{ "get_gold", pc_get_money },
|
||
{ "changegold", pc_change_money },
|
||
{ "changemoney", pc_change_money },
|
||
{ "changealignment", pc_change_alignment },
|
||
{ "change_gold", pc_change_money },
|
||
{ "change_money", pc_change_money },
|
||
{ "change_alignment", pc_change_alignment },
|
||
{ "getname", pc_get_name },
|
||
{ "get_name", pc_get_name },
|
||
{ "get_vid", pc_get_vid },
|
||
{ "getplaytime", pc_get_playtime },
|
||
{ "get_playtime", pc_get_playtime },
|
||
{ "getleadership", pc_get_leadership },
|
||
{ "get_leadership", pc_get_leadership },
|
||
{ "getqf", pc_get_quest_flag },
|
||
{ "setqf", pc_set_quest_flag },
|
||
{ "delqf", pc_del_quest_flag },
|
||
{ "getf", pc_get_another_quest_flag},
|
||
{ "setf", pc_set_another_quest_flag},
|
||
{ "get_x", pc_get_x },
|
||
{ "get_y", pc_get_y },
|
||
{ "getx", pc_get_x },
|
||
{ "gety", pc_get_y },
|
||
{ "get_local_x", pc_get_local_x },
|
||
{ "get_local_y", pc_get_local_y },
|
||
{ "getcurrentmapindex", pc_get_current_map_index},
|
||
{ "get_map_index", pc_get_current_map_index},
|
||
{ "give_exp", pc_give_exp },
|
||
{ "give_exp_perc", pc_give_exp_perc },
|
||
{ "give_exp2", pc_give_exp2 },
|
||
{ "give_item", pc_give_item },
|
||
{ "give_item2", pc_give_or_drop_item },
|
||
{ "give_item2_select", pc_give_or_drop_item_and_select },
|
||
{ "give_gold", pc_give_gold },
|
||
{ "count_item", pc_count_item },
|
||
{ "remove_item", pc_remove_item },
|
||
{ "countitem", pc_count_item },
|
||
{ "removeitem", pc_remove_item },
|
||
{ "reset_point", pc_reset_point },
|
||
{ "has_guild", pc_hasguild },
|
||
{ "hasguild", pc_hasguild },
|
||
{ "get_guild", pc_getguild },
|
||
{ "getguild", pc_getguild },
|
||
{ "isguildmaster", pc_isguildmaster },
|
||
{ "is_guild_master", pc_isguildmaster },
|
||
{ "destroy_guild", pc_destroy_guild },
|
||
{ "remove_from_guild", pc_remove_from_guild },
|
||
{ "in_dungeon", pc_in_dungeon },
|
||
{ "getempire", pc_get_empire },
|
||
{ "get_empire", pc_get_empire },
|
||
{ "get_skill_group", pc_get_skillgroup },
|
||
{ "set_skill_group", pc_set_skillgroup },
|
||
{ "warp", pc_warp },
|
||
{ "warp_local", pc_warp_local },
|
||
{ "warp_exit", pc_warp_exit },
|
||
{ "set_warp_location", pc_set_warp_location },
|
||
{ "set_warp_location_local",pc_set_warp_location_local },
|
||
{ "get_start_location", pc_get_start_location },
|
||
{ "has_master_skill", pc_has_master_skill },
|
||
{ "set_part", pc_set_part },
|
||
{ "get_part", pc_get_part },
|
||
{ "is_polymorphed", pc_is_polymorphed },
|
||
{ "remove_polymorph", pc_remove_polymorph },
|
||
{ "is_mount", pc_is_mount },
|
||
{ "polymorph", pc_polymorph },
|
||
{ "mount", pc_mount },
|
||
{ "mount_bonus", pc_mount_bonus },
|
||
{ "unmount", pc_unmount },
|
||
{ "warp_to_guild_war_observer_position", pc_warp_to_guild_war_observer_position },
|
||
{ "give_item_from_special_item_group", pc_give_item_from_special_item_group },
|
||
{ "learn_grand_master_skill", pc_learn_grand_master_skill },
|
||
{ "is_skill_book_no_delay", pc_is_skill_book_no_delay},
|
||
{ "remove_skill_book_no_delay", pc_remove_skill_book_no_delay},
|
||
|
||
{ "enough_inventory", pc_enough_inventory },
|
||
{ "get_horse_level", pc_get_horse_level }, // TO BE DELETED XXX
|
||
{ "is_horse_alive", pc_is_horse_alive }, // TO BE DELETED XXX
|
||
{ "revive_horse", pc_revive_horse }, // TO BE DELETED XXX
|
||
{ "have_pos_scroll", pc_have_pos_scroll },
|
||
{ "have_map_scroll", pc_have_map_scroll },
|
||
{ "get_war_map", pc_get_war_map },
|
||
{ "get_equip_refine_level", pc_get_equip_refine_level },
|
||
{ "refine_equip", pc_refine_equip },
|
||
{ "get_skill_level", pc_get_skill_level },
|
||
{ "give_lotto", pc_give_lotto },
|
||
{ "aggregate_monster", pc_aggregate_monster },
|
||
{ "forget_my_attacker", pc_forget_my_attacker },
|
||
{ "pc_attract_ranger", pc_attract_ranger },
|
||
{ "select", pc_select_vid },
|
||
{ "get_sex", pc_get_sex },
|
||
{ "is_married", pc_is_married },
|
||
{ "is_engaged", pc_is_engaged },
|
||
{ "is_engaged_or_married", pc_is_engaged_or_married},
|
||
{ "is_gm", pc_is_gm },
|
||
{ "get_gm_level", pc_get_gm_level },
|
||
{ "mining", pc_mining },
|
||
{ "ore_refine", pc_ore_refine },
|
||
{ "diamond_refine", pc_diamond_refine },
|
||
|
||
// RESET_ONE_SKILL
|
||
{ "clear_one_skill", pc_clear_one_skill },
|
||
// END_RESET_ONE_SKILL
|
||
|
||
{ "clear_skill", pc_clear_skill },
|
||
{ "clear_sub_skill", pc_clear_sub_skill },
|
||
{ "set_skill_point", pc_set_skill_point },
|
||
|
||
{ "is_clear_skill_group", pc_is_clear_skill_group },
|
||
|
||
{ "save_exit_location", pc_save_exit_location },
|
||
{ "teleport", pc_teleport },
|
||
|
||
{ "set_skill_level", pc_set_skill_level },
|
||
|
||
{ "give_polymorph_book", pc_give_polymorph_book },
|
||
{ "upgrade_polymorph_book", pc_upgrade_polymorph_book },
|
||
{ "get_premium_remain_sec", pc_get_premium_remain_sec },
|
||
|
||
{ "send_block_mode", pc_send_block_mode },
|
||
|
||
{ "change_empire", pc_change_empire },
|
||
{ "get_change_empire_count", pc_get_change_empire_count },
|
||
{ "set_change_empire_count", pc_set_change_empire_count },
|
||
|
||
{ "change_name", pc_change_name },
|
||
|
||
{ "is_dead", pc_is_dead },
|
||
|
||
{ "reset_status", pc_reset_status },
|
||
{ "get_ht", pc_get_ht },
|
||
{ "set_ht", pc_set_ht },
|
||
{ "get_iq", pc_get_iq },
|
||
{ "set_iq", pc_set_iq },
|
||
{ "get_st", pc_get_st },
|
||
{ "set_st", pc_set_st },
|
||
{ "get_dx", pc_get_dx },
|
||
{ "set_dx", pc_set_dx },
|
||
|
||
{ "is_near_vid", pc_is_near_vid },
|
||
|
||
{ "get_socket_items", pc_get_socket_items },
|
||
{ "get_empty_inventory_count", pc_get_empty_inventory_count },
|
||
|
||
{ "get_logoff_interval", pc_get_logoff_interval },
|
||
|
||
{ "is_riding", pc_is_riding },
|
||
{ "get_special_ride_vnum", pc_get_special_ride_vnum },
|
||
|
||
{ "can_warp", pc_can_warp },
|
||
|
||
{ "dec_skill_point", pc_dec_skill_point },
|
||
{ "get_skill_point", pc_get_skill_point },
|
||
|
||
{ "get_channel_id", pc_get_channel_id },
|
||
|
||
{ "give_poly_marble", pc_give_poly_marble },
|
||
{ "get_sig_items", pc_get_sig_items },
|
||
|
||
{ "charge_cash", pc_charge_cash },
|
||
|
||
{ "get_informer_type", pc_get_informer_type }, //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
{ "get_informer_item", pc_get_informer_item },
|
||
|
||
{ "give_award", pc_give_award }, //<2F>Ϻ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
{ "give_award_socket", pc_give_award_socket }, //<2F><> <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>.
|
||
|
||
{ "get_killee_drop_pct", pc_get_killee_drop_pct }, /* mob_vnum.kill <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> killee<65><65> pc<70><63><EFBFBD><EFBFBD> level <20><><EFBFBD><EFBFBD>, pc<70><63> <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>.
|
||
* return <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>, <20>и<EFBFBD>).
|
||
* (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ѵ<EFBFBD>, CreateDropItem<65><6D> GetDropPct<63><74> iDeltaPercent, iRandRange<67><65> return<72>Ѵٰ<D1B4> <20><><EFBFBD><EFBFBD> <20><>.)
|
||
* (<28><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ф<EFBFBD>)
|
||
* <20><><EFBFBD>ǻ<EFBFBD><C7BB><EFBFBD> : kill event<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>!
|
||
*/
|
||
|
||
{ NULL, NULL }
|
||
};
|
||
|
||
CQuestManager::instance().AddLuaFunctionTable("pc", pc_functions);
|
||
}
|
||
};
|