forked from metin2/server
206 lines
4.8 KiB
C++
206 lines
4.8 KiB
C++
#include "stdafx.h"
|
|
#include "questlua.h"
|
|
#include "questmanager.h"
|
|
#include "desc_client.h"
|
|
#include "char.h"
|
|
#include "item_manager.h"
|
|
#include "item.h"
|
|
#include "cmd.h"
|
|
#include "packet.h"
|
|
|
|
#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 ACMD(do_in_game_mall);
|
|
|
|
namespace quest
|
|
{
|
|
int game_set_event_flag(lua_State* L)
|
|
{
|
|
CQuestManager & q = CQuestManager::instance();
|
|
|
|
if (lua_isstring(L,1) && lua_isnumber(L, 2))
|
|
q.RequestSetEventFlag(lua_tostring(L,1), (int)lua_tonumber(L,2));
|
|
|
|
return 0;
|
|
}
|
|
|
|
int game_get_event_flag(lua_State* L)
|
|
{
|
|
CQuestManager& q = CQuestManager::instance();
|
|
|
|
if (lua_isstring(L,1))
|
|
lua_pushnumber(L, q.GetEventFlag(lua_tostring(L,1)));
|
|
else
|
|
lua_pushnumber(L, 0);
|
|
|
|
return 1;
|
|
}
|
|
|
|
int game_request_make_guild(lua_State* L)
|
|
{
|
|
CQuestManager& q = CQuestManager::instance();
|
|
LPDESC d = q.GetCurrentCharacterPtr()->GetDesc();
|
|
if (d)
|
|
{
|
|
BYTE header = HEADER_GC_REQUEST_MAKE_GUILD;
|
|
d->Packet(&header, 1);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int game_get_safebox_level(lua_State* L)
|
|
{
|
|
CQuestManager& q = CQuestManager::instance();
|
|
lua_pushnumber(L, q.GetCurrentCharacterPtr()->GetSafeboxSize()/SAFEBOX_PAGE_SIZE);
|
|
return 1;
|
|
}
|
|
|
|
int game_set_safebox_level(lua_State* L)
|
|
{
|
|
CQuestManager& q = CQuestManager::instance();
|
|
|
|
//q.GetCurrentCharacterPtr()->ChangeSafeboxSize(3*(int)lua_tonumber(L,-1));
|
|
TSafeboxChangeSizePacket p;
|
|
p.dwID = q.GetCurrentCharacterPtr()->GetDesc()->GetAccountTable().id;
|
|
p.bSize = (int)lua_tonumber(L,-1);
|
|
db_clientdesc->DBPacket(HEADER_GD_SAFEBOX_CHANGE_SIZE, q.GetCurrentCharacterPtr()->GetDesc()->GetHandle(), &p, sizeof(p));
|
|
|
|
q.GetCurrentCharacterPtr()->SetSafeboxSize(SAFEBOX_PAGE_SIZE * (int)lua_tonumber(L,-1));
|
|
return 0;
|
|
}
|
|
|
|
int game_open_safebox(lua_State* /*L*/)
|
|
{
|
|
CQuestManager& q = CQuestManager::instance();
|
|
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
|
ch->SetSafeboxOpenPosition();
|
|
ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowMeSafeboxPassword");
|
|
return 0;
|
|
}
|
|
|
|
int game_open_mall(lua_State* /*L*/)
|
|
{
|
|
CQuestManager& q = CQuestManager::instance();
|
|
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
|
ch->SetSafeboxOpenPosition();
|
|
ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowMeMallPassword");
|
|
return 0;
|
|
}
|
|
|
|
int game_drop_item(lua_State* L)
|
|
{
|
|
//
|
|
// Syntax: game.drop_item(50050, 1)
|
|
//
|
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|
|
|
DWORD item_vnum = (DWORD) lua_tonumber(L, 1);
|
|
int count = (int) lua_tonumber(L, 2);
|
|
int x = ch->GetX();
|
|
int y = ch->GetY();
|
|
|
|
LPITEM item = ITEM_MANAGER::instance().CreateItem(item_vnum, count);
|
|
|
|
if (!item)
|
|
{
|
|
sys_err("cannot create item vnum %d count %d", item_vnum, count);
|
|
return 0;
|
|
}
|
|
|
|
PIXEL_POSITION pos;
|
|
pos.x = x + Random::get(-200, 200);
|
|
pos.y = y + Random::get(-200, 200);
|
|
|
|
item->AddToGround(ch->GetMapIndex(), pos);
|
|
item->StartDestroyEvent();
|
|
|
|
return 0;
|
|
}
|
|
|
|
int game_drop_item_with_ownership(lua_State* L)
|
|
{
|
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|
|
|
LPITEM item = NULL;
|
|
switch (lua_gettop(L))
|
|
{
|
|
case 1:
|
|
item = ITEM_MANAGER::instance().CreateItem((DWORD) lua_tonumber(L, 1));
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
item = ITEM_MANAGER::instance().CreateItem((DWORD) lua_tonumber(L, 1), (int) lua_tonumber(L, 2));
|
|
break;
|
|
default:
|
|
return 0;
|
|
}
|
|
|
|
if ( item == NULL )
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if (lua_isnumber(L, 3))
|
|
{
|
|
int sec = (int) lua_tonumber(L, 3);
|
|
if (sec <= 0)
|
|
{
|
|
item->SetOwnership( ch );
|
|
}
|
|
else
|
|
{
|
|
item->SetOwnership( ch, sec );
|
|
}
|
|
}
|
|
else
|
|
item->SetOwnership( ch );
|
|
|
|
PIXEL_POSITION pos;
|
|
pos.x = ch->GetX() + Random::get(-200, 200);
|
|
pos.y = ch->GetY() + Random::get(-200, 200);
|
|
|
|
item->AddToGround(ch->GetMapIndex(), pos);
|
|
item->StartDestroyEvent();
|
|
|
|
return 0;
|
|
}
|
|
|
|
int game_web_mall(lua_State* L)
|
|
{
|
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|
|
|
if ( ch != NULL )
|
|
{
|
|
do_in_game_mall(ch, const_cast<char*>(""), 0, 0);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void RegisterGameFunctionTable()
|
|
{
|
|
luaL_reg game_functions[] =
|
|
{
|
|
{ "get_safebox_level", game_get_safebox_level },
|
|
{ "request_make_guild", game_request_make_guild },
|
|
{ "set_safebox_level", game_set_safebox_level },
|
|
{ "open_safebox", game_open_safebox },
|
|
{ "open_mall", game_open_mall },
|
|
{ "get_event_flag", game_get_event_flag },
|
|
{ "set_event_flag", game_set_event_flag },
|
|
{ "drop_item", game_drop_item },
|
|
{ "drop_item_with_ownership", game_drop_item_with_ownership },
|
|
{ "open_web_mall", game_web_mall },
|
|
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
CQuestManager::instance().AddLuaFunctionTable("game", game_functions);
|
|
}
|
|
}
|
|
|