forked from metin2/server
147 lines
3.2 KiB
C++
147 lines
3.2 KiB
C++
|
|
#include "stdafx.h"
|
|
#include "questmanager.h"
|
|
#include "char.h"
|
|
#include "char_manager.h"
|
|
#include "arena.h"
|
|
|
|
extern bool LC_IsCanada();
|
|
|
|
namespace quest
|
|
{
|
|
int arena_start_duel(lua_State * L)
|
|
{
|
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|
LPCHARACTER ch2 = CHARACTER_MANAGER::instance().FindPC(lua_tostring(L,1));
|
|
int nSetPoint = (int)lua_tonumber(L, 2);
|
|
|
|
if ( ch == NULL || ch2 == NULL )
|
|
{
|
|
lua_pushnumber(L, 0);
|
|
return 1;
|
|
}
|
|
|
|
if ( ch->IsHorseRiding() == true )
|
|
{
|
|
ch->StopRiding();
|
|
ch->HorseSummon(false);
|
|
}
|
|
|
|
if ( ch2->IsHorseRiding() == true )
|
|
{
|
|
ch2->StopRiding();
|
|
ch2->HorseSummon(false);
|
|
}
|
|
|
|
if ( CArenaManager::instance().IsMember(ch->GetMapIndex(), ch->GetPlayerID()) != MEMBER_NO ||
|
|
CArenaManager::instance().IsMember(ch2->GetMapIndex(), ch2->GetPlayerID()) != MEMBER_NO )
|
|
{
|
|
lua_pushnumber(L, 2);
|
|
return 1;
|
|
}
|
|
if (LC_IsCanada() == true)
|
|
{
|
|
if ( CArenaManager::instance().StartDuel(ch, ch2, nSetPoint, 10) == false )
|
|
{
|
|
lua_pushnumber(L, 3);
|
|
return 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( CArenaManager::instance().StartDuel(ch, ch2, nSetPoint) == false )
|
|
{
|
|
lua_pushnumber(L, 3);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
lua_pushnumber(L, 1);
|
|
|
|
return 1;
|
|
}
|
|
|
|
int arena_add_map(lua_State* L)
|
|
{
|
|
int mapIdx = (int)lua_tonumber(L, 1);
|
|
int startposAX = (int)lua_tonumber(L, 2);
|
|
int startposAY = (int)lua_tonumber(L, 3);
|
|
int startposBX = (int)lua_tonumber(L, 4);
|
|
int startposBY = (int)lua_tonumber(L, 5);
|
|
|
|
if ( CArenaManager::instance().AddArena(mapIdx, startposAX, startposAY, startposBX, startposBY) == false )
|
|
{
|
|
sys_log(0, "Failed to load arena map info(map:%d AX:%d AY:%d BX:%d BY:%d", mapIdx, startposAX, startposAY, startposBX, startposBY);
|
|
}
|
|
else
|
|
{
|
|
sys_log(0, "Add Arena Map:%d startA(%d,%d) startB(%d,%d)", mapIdx, startposAX, startposAY, startposBX, startposBY);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
int arena_get_duel_list(lua_State* L)
|
|
{
|
|
CArenaManager::instance().GetDuelList(L);
|
|
|
|
return 1;
|
|
}
|
|
|
|
int arena_add_observer(lua_State* L)
|
|
{
|
|
int mapIdx = (int)lua_tonumber(L, 1);
|
|
int ObPointX = (int)lua_tonumber(L, 2);
|
|
int ObPointY = (int)lua_tonumber(L, 3);
|
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|
|
|
CArenaManager::instance().AddObserver(ch, mapIdx, ObPointX, ObPointY);
|
|
|
|
return 1;
|
|
}
|
|
|
|
int arena_is_in_arena(lua_State* L)
|
|
{
|
|
DWORD pid = (DWORD)lua_tonumber(L, 1);
|
|
|
|
LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(pid);
|
|
|
|
if ( ch == NULL )
|
|
{
|
|
lua_pushnumber(L, 1);
|
|
}
|
|
else
|
|
{
|
|
if ( ch->GetArena() == NULL || ch->GetArenaObserverMode() == true )
|
|
{
|
|
if ( CArenaManager::instance().IsMember(ch->GetMapIndex(), ch->GetPlayerID()) == MEMBER_DUELIST )
|
|
lua_pushnumber(L, 1);
|
|
else
|
|
lua_pushnumber(L, 0);
|
|
}
|
|
else
|
|
{
|
|
lua_pushnumber(L, 0);
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
void RegisterArenaFunctionTable()
|
|
{
|
|
luaL_reg arena_functions[] =
|
|
{
|
|
{"start_duel", arena_start_duel },
|
|
{"add_map", arena_add_map },
|
|
{"get_duel_list", arena_get_duel_list },
|
|
{"add_observer", arena_add_observer },
|
|
{"is_in_arena", arena_is_in_arena },
|
|
|
|
{NULL, NULL}
|
|
};
|
|
|
|
CQuestManager::instance().AddLuaFunctionTable("arena", arena_functions);
|
|
}
|
|
}
|
|
|