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

283 lines
6.4 KiB
C++

#include "stdafx.h"
#include "threeway_war.h"
#include <common/stl.h>
#include "questlua.h"
#include "questmanager.h"
#include "char.h"
#include "dungeon.h"
#include "p2p.h"
#include "locale_service.h"
#include "threeway_war.h"
extern int passes_per_sec;
namespace quest
{
//
// "forked_" lua functions
//
int forked_set_dead_count( lua_State* L )
{
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
CQuestManager& q = CQuestManager::instance();
if (NULL != ch)
{
CThreeWayWar::instance().SetReviveTokenForPlayer( ch->GetPlayerID(), q.GetEventFlag("threeway_war_dead_count") );
}
return 0;
}
int forked_get_dead_count( lua_State* L )
{
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
if (NULL != ch)
{
lua_pushnumber( L, CThreeWayWar::instance().GetReviveTokenForPlayer(ch->GetPlayerID()) );
}
else
{
lua_pushnumber( L, 0 );
}
return 1;
}
int forked_init_kill_count_per_empire( lua_State* L )
{
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
CThreeWayWar::instance().SetKillScore( ch->GetEmpire(), 0 );
return 0;
}
int forked_init( lua_State* L )
{
CThreeWayWar::instance().Initialize();
CThreeWayWar::instance().RandomEventMapSet();
return 0;
}
int forked_sungzi_start_pos( lua_State* L )
{
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
const ForkedSungziMapInfo& info = CThreeWayWar::instance().GetEventSungZiMapInfo();
lua_pushnumber( L, info.m_iForkedSungziStartPosition[ch->GetEmpire()-1][0] );
lua_pushnumber( L, info.m_iForkedSungziStartPosition[ch->GetEmpire()-1][1] );
return 2;
}
int forked_pass_start_pos( lua_State* L )
{
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
const ForkedPassMapInfo& info = CThreeWayWar::instance().GetEventPassMapInfo();
lua_pushnumber( L, info.m_iForkedPassStartPosition[ch->GetEmpire()-1][0] );
lua_pushnumber( L, info.m_iForkedPassStartPosition[ch->GetEmpire()-1][1] );
return 2;
}
int forked_sungzi_mapindex (lua_State *L )
{
lua_pushnumber( L, GetSungziMapIndex() );
if ( test_server )
sys_log ( 0, "forked_sungzi_map_index_by_empire %d", GetSungziMapIndex() );
return 1;
}
int forked_pass_mapindex_by_empire( lua_State *L )
{
lua_pushnumber( L, GetPassMapIndex(lua_tonumber(L,1)) );
return 1;
}
int forked_get_pass_path_my_empire( lua_State *L )
{
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
lua_pushstring( L, GetPassMapPath( ch->GetEmpire() ) );
sys_log (0, "[PASS_PATH] Empire %d Path %s", ch->GetEmpire(), GetPassMapPath( ch->GetEmpire() ) );
return 1;
}
int forked_get_pass_path_by_empire( lua_State *L )
{
int iEmpire = (int)lua_tonumber(L, 1);
lua_pushstring( L, GetPassMapPath(iEmpire) );
sys_log (0, "[PASS_PATH] Empire %d Path %s", iEmpire, GetPassMapPath( iEmpire ) );
return 1;
}
int forked_is_forked_mapindex( lua_State * L )
{
lua_pushboolean( L, CThreeWayWar::instance().IsThreeWayWarMapIndex(lua_tonumber(L,1)) );
return 1;
}
int forked_is_sungzi_mapindex( lua_State * L )
{
lua_pushboolean( L, CThreeWayWar::instance().IsSungZiMapIndex(lua_tonumber(L,1)) );
return 1;
}
struct FWarpInMap
{
int m_iMapIndexTo;
int m_x;
int m_y;
void operator()(LPENTITY ent)
{
if (ent->IsType(ENTITY_CHARACTER))
{
LPCHARACTER ch = (LPCHARACTER) ent;
if (ch->IsPC())
{
ch->WarpSet( m_x+(Random::get(0,5)*100), m_y+(Random::get(0,5)*100), m_iMapIndexTo);
}
}
}
};
EVENTINFO(warp_all_to_map_event_info)
{
int m_iMapIndexFrom;
int m_iMapIndexTo;
int m_x;
int m_y;
warp_all_to_map_event_info()
: m_iMapIndexFrom( 0 )
, m_iMapIndexTo( 0 )
, m_x( 0 )
, m_y( 0 )
{
}
};
EVENTFUNC(warp_all_to_map_event)
{
warp_all_to_map_event_info * info = dynamic_cast<warp_all_to_map_event_info *>(event->info);
if ( info == NULL )
{
sys_err( "warp_all_to_map_event> <Factor> Null pointer" );
return 0;
}
LPSECTREE_MAP pSecMap = SECTREE_MANAGER::instance().GetMap( info->m_iMapIndexFrom );
if ( pSecMap )
{
FWarpInMap f;
f.m_iMapIndexTo = info->m_iMapIndexTo;
f.m_x = info->m_x;
f.m_y = info->m_y;
pSecMap->for_each( f );
}
return 0;
}
int forked_warp_all_in_map( lua_State * L )
{
int iMapIndexFrom = (int)lua_tonumber(L, 1 );
int iMapIndexTo = (int)lua_tonumber(L, 2 );
int ix = (int)lua_tonumber(L, 3 );
int iy = (int)lua_tonumber(L, 4 );
int iTime = (int)lua_tonumber(L, 5 );
warp_all_to_map_event_info* info = AllocEventInfo<warp_all_to_map_event_info>();
info->m_iMapIndexFrom = iMapIndexFrom;
info->m_iMapIndexTo = iMapIndexTo;
info->m_x = ix;
info->m_y = iy;
event_create(warp_all_to_map_event, info, PASSES_PER_SEC(iTime));
return 0;
}
int forked_is_registered_user( lua_State* L )
{
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
if (NULL != ch)
{
lua_pushboolean( L, CThreeWayWar::instance().IsRegisteredUser(ch->GetPlayerID()) );
}
else
{
lua_pushboolean( L, false );
}
return 1;
}
int forked_register_user( lua_State* L )
{
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
if (NULL != ch)
{
CThreeWayWar::instance().RegisterUser( ch->GetPlayerID() );
}
return 0;
}
int forked_purge_all_monsters( lua_State* L )
{
CThreeWayWar::instance().RemoveAllMonstersInThreeWay();
return 0;
}
void RegisterForkedFunctionTable()
{
luaL_reg forked_functions[] =
{
{ "setdeadcount", forked_set_dead_count },
{ "getdeadcount", forked_get_dead_count },
{ "initkillcount", forked_init_kill_count_per_empire },
{ "initforked", forked_init },
{ "get_sungzi_start_pos", forked_sungzi_start_pos },
{ "get_pass_start_pos", forked_pass_start_pos },
{ "getsungzimapindex", forked_sungzi_mapindex },
{ "getpassmapindexbyempire", forked_pass_mapindex_by_empire },
{ "getpasspathbyempire", forked_get_pass_path_by_empire },
{ "isforkedmapindex", forked_is_forked_mapindex },
{ "issungzimapindex", forked_is_sungzi_mapindex },
{ "warp_all_in_map", forked_warp_all_in_map },
{ "is_registered_user", forked_is_registered_user },
{ "register_user", forked_register_user },
{ "purge_all_monsters", forked_purge_all_monsters },
{ NULL, NULL }
};
CQuestManager::instance().AddLuaFunctionTable("forked", forked_functions);
}
}