1
0
forked from metin2/server
server/game/src/questlua_game.cpp

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);
}
}