170 lines
3.3 KiB
C++
170 lines
3.3 KiB
C++
#include "stdafx.h"
|
|
#include "config.h"
|
|
#include "questmanager.h"
|
|
#include "sectree_manager.h"
|
|
#include "char.h"
|
|
#include "guild.h"
|
|
#include "db.h"
|
|
#include "building.h"
|
|
|
|
namespace quest
|
|
{
|
|
//
|
|
// "building" Lua functions
|
|
//
|
|
int building_get_land_id(lua_State * L)
|
|
{
|
|
using namespace building;
|
|
|
|
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3))
|
|
{
|
|
sys_err("invalid argument");
|
|
lua_pushnumber(L, 0);
|
|
return 1;
|
|
}
|
|
|
|
CLand * pkLand = CManager::instance().FindLand((int) lua_tonumber(L, 1), (int) lua_tonumber(L, 2), (int) lua_tonumber(L, 3));
|
|
lua_pushnumber(L, pkLand ? pkLand->GetID() : 0);
|
|
return 1;
|
|
}
|
|
|
|
int building_get_land_info(lua_State * L)
|
|
{
|
|
int price = 1000000000;
|
|
int owner = 1000000000;
|
|
int level_limit = 1000000000;
|
|
|
|
if (lua_isnumber(L, 1))
|
|
{
|
|
using namespace building;
|
|
|
|
CLand * pkLand = CManager::instance().FindLand((DWORD) lua_tonumber(L, 1));
|
|
|
|
if (pkLand)
|
|
{
|
|
const TLand & t = pkLand->GetData();
|
|
|
|
price = t.dwPrice;
|
|
owner = t.dwGuildID;
|
|
level_limit = t.bGuildLevelLimit;
|
|
}
|
|
}
|
|
else
|
|
sys_err("invalid argument");
|
|
|
|
lua_pushnumber(L, price);
|
|
lua_pushnumber(L, owner);
|
|
lua_pushnumber(L, level_limit);
|
|
return 3;
|
|
}
|
|
|
|
int building_set_land_owner(lua_State * L)
|
|
{
|
|
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2))
|
|
{
|
|
sys_err("invalid argument");
|
|
return 0;
|
|
}
|
|
|
|
using namespace building;
|
|
|
|
CLand * pkLand = CManager::instance().FindLand((DWORD) lua_tonumber(L, 1));
|
|
|
|
if (pkLand)
|
|
{
|
|
if (pkLand->GetData().dwGuildID == 0)
|
|
pkLand->SetOwner((DWORD) lua_tonumber(L, 2));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int building_has_land(lua_State * L)
|
|
{
|
|
using namespace building;
|
|
|
|
if (!lua_isnumber(L, 1))
|
|
{
|
|
sys_err("invalid argument");
|
|
lua_pushboolean(L, true);
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
if (CManager::instance().FindLandByGuild((DWORD) lua_tonumber(L, 1)))
|
|
lua_pushboolean(L, true);
|
|
else
|
|
lua_pushboolean(L, false);
|
|
*/
|
|
|
|
std::unique_ptr<SQLMsg> pmsg(DBManager::instance().DirectQuery("SELECT COUNT(*) FROM land%s WHERE guild_id = %d", get_table_postfix(), (DWORD)lua_tonumber(L,1)));
|
|
|
|
if ( pmsg->Get()->uiNumRows > 0 )
|
|
{
|
|
MYSQL_ROW row = mysql_fetch_row(pmsg->Get()->pSQLResult);
|
|
|
|
int count = 0;
|
|
str_to_number(count, row[0]);
|
|
|
|
if (count == 0)
|
|
{
|
|
lua_pushboolean(L, false);
|
|
}
|
|
else
|
|
{
|
|
lua_pushboolean(L, true);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
lua_pushboolean(L, true);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
int building_reconstruct(lua_State* L)
|
|
{
|
|
using namespace building;
|
|
|
|
DWORD dwNewBuilding = (DWORD)lua_tonumber(L, 1);
|
|
|
|
CQuestManager& q = CQuestManager::instance();
|
|
|
|
LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
|
|
if (!npc)
|
|
return 0;
|
|
|
|
CGuild* pGuild = npc->GetGuild();
|
|
if (!pGuild)
|
|
return 0;
|
|
|
|
CLand* pLand = CManager::instance().FindLandByGuild(pGuild->GetID());
|
|
if (!pLand)
|
|
return 0;
|
|
|
|
LPOBJECT pObject = pLand->FindObjectByNPC(npc);
|
|
if (!pObject)
|
|
return 0;
|
|
|
|
pObject->Reconstruct(dwNewBuilding);
|
|
|
|
return 0;
|
|
}
|
|
|
|
void RegisterBuildingFunctionTable()
|
|
{
|
|
luaL_reg functions[] =
|
|
{
|
|
{ "get_land_id", building_get_land_id },
|
|
{ "get_land_info", building_get_land_info },
|
|
{ "set_land_owner", building_set_land_owner },
|
|
{ "has_land", building_has_land },
|
|
{ "reconstruct", building_reconstruct },
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
CQuestManager::instance().AddLuaFunctionTable("building", functions);
|
|
}
|
|
};
|