forked from metin2/server
281 lines
6.1 KiB
C++
281 lines
6.1 KiB
C++
#include "stdafx.h"
|
|
#include "config.h"
|
|
#include "questmanager.h"
|
|
#include "sectree_manager.h"
|
|
#include "char.h"
|
|
#include "affect.h"
|
|
#include "db.h"
|
|
|
|
namespace quest
|
|
{
|
|
//
|
|
// "affect" Lua functions
|
|
//
|
|
int affect_add(lua_State * L)
|
|
{
|
|
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3))
|
|
{
|
|
sys_err("invalid argument");
|
|
return 0;
|
|
}
|
|
|
|
CQuestManager & q = CQuestManager::instance();
|
|
|
|
BYTE applyOn = (BYTE) lua_tonumber(L, 1);
|
|
|
|
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
|
|
|
if (applyOn >= MAX_APPLY_NUM || applyOn < 1)
|
|
{
|
|
sys_err("apply is out of range : %d", applyOn);
|
|
return 0;
|
|
}
|
|
|
|
if (ch->FindAffect(AFFECT_QUEST_START_IDX, applyOn)) // 퀘스트로 인해 같은 곳에 효과가 걸려있으면 스킵
|
|
return 0;
|
|
|
|
long value = (long) lua_tonumber(L, 2);
|
|
long duration = (long) lua_tonumber(L, 3);
|
|
|
|
ch->AddAffect(AFFECT_QUEST_START_IDX, aApplyInfo[applyOn].bPointType, value, 0, duration, 0, false);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int affect_remove(lua_State * L)
|
|
{
|
|
CQuestManager & q = CQuestManager::instance();
|
|
int iType;
|
|
|
|
if (lua_isnumber(L, 1))
|
|
{
|
|
iType = (int) lua_tonumber(L, 1);
|
|
|
|
if (iType == 0)
|
|
iType = q.GetCurrentPC()->GetCurrentQuestIndex() + AFFECT_QUEST_START_IDX;
|
|
}
|
|
else
|
|
iType = q.GetCurrentPC()->GetCurrentQuestIndex() + AFFECT_QUEST_START_IDX;
|
|
|
|
q.GetCurrentCharacterPtr()->RemoveAffect(iType);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int affect_remove_bad(lua_State * L) // 나쁜 효과를 없앰
|
|
{
|
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|
ch->RemoveBadAffect();
|
|
return 0;
|
|
}
|
|
|
|
int affect_remove_good(lua_State * L) // 좋은 효과를 없앰
|
|
{
|
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|
ch->RemoveGoodAffect();
|
|
return 0;
|
|
}
|
|
|
|
int affect_add_hair(lua_State * L)
|
|
{
|
|
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3))
|
|
{
|
|
sys_err("invalid argument");
|
|
return 0;
|
|
}
|
|
|
|
CQuestManager & q = CQuestManager::instance();
|
|
|
|
BYTE applyOn = (BYTE) lua_tonumber(L, 1);
|
|
|
|
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
|
|
|
if (applyOn >= MAX_APPLY_NUM || applyOn < 1)
|
|
{
|
|
sys_err("apply is out of range : %d", applyOn);
|
|
return 0;
|
|
}
|
|
|
|
long value = (long) lua_tonumber(L, 2);
|
|
long duration = (long) lua_tonumber(L, 3);
|
|
|
|
ch->AddAffect(AFFECT_HAIR, aApplyInfo[applyOn].bPointType, value, 0, duration, 0, false);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int affect_remove_hair(lua_State * L) // 헤어 효과를 없앤다.
|
|
{
|
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|
|
|
CAffect* pkAff = ch->FindAffect( AFFECT_HAIR );
|
|
|
|
if ( pkAff != NULL )
|
|
{
|
|
lua_pushnumber(L, pkAff->lDuration);
|
|
ch->RemoveAffect( pkAff );
|
|
}
|
|
else
|
|
{
|
|
lua_pushnumber(L, 0);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
// 현재 캐릭터가 AFFECT_TYPE affect를 갖고있으면 bApplyOn 값을 반환하고 없으면 nil을 반환하는 함수.
|
|
// usage : applyOn = affect.get_apply(AFFECT_TYPE)
|
|
int affect_get_apply_on(lua_State * L)
|
|
{
|
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|
|
|
if (!lua_isnumber(L, 1))
|
|
{
|
|
sys_err("invalid argument");
|
|
return 0;
|
|
}
|
|
|
|
DWORD affectType = lua_tonumber(L, 1);
|
|
|
|
CAffect* pkAff = ch->FindAffect(affectType);
|
|
|
|
if ( pkAff != NULL )
|
|
lua_pushnumber(L, pkAff->bApplyOn);
|
|
else
|
|
lua_pushnil(L);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
int affect_add_collect(lua_State * L)
|
|
{
|
|
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3))
|
|
{
|
|
sys_err("invalid argument");
|
|
return 0;
|
|
}
|
|
|
|
CQuestManager & q = CQuestManager::instance();
|
|
|
|
BYTE applyOn = (BYTE) lua_tonumber(L, 1);
|
|
|
|
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
|
|
|
if (applyOn >= MAX_APPLY_NUM || applyOn < 1)
|
|
{
|
|
sys_err("apply is out of range : %d", applyOn);
|
|
return 0;
|
|
}
|
|
|
|
long value = (long) lua_tonumber(L, 2);
|
|
long duration = (long) lua_tonumber(L, 3);
|
|
|
|
ch->AddAffect(AFFECT_COLLECT, aApplyInfo[applyOn].bPointType, value, 0, duration, 0, false);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int affect_add_collect_point(lua_State * L)
|
|
{
|
|
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3))
|
|
{
|
|
sys_err("invalid argument");
|
|
return 0;
|
|
}
|
|
|
|
CQuestManager & q = CQuestManager::instance();
|
|
|
|
BYTE point_type = (BYTE) lua_tonumber(L, 1);
|
|
|
|
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
|
|
|
if (point_type >= POINT_MAX_NUM || point_type < 1)
|
|
{
|
|
sys_err("point is out of range : %d", point_type);
|
|
return 0;
|
|
}
|
|
|
|
long value = (long) lua_tonumber(L, 2);
|
|
long duration = (long) lua_tonumber(L, 3);
|
|
|
|
ch->AddAffect(AFFECT_COLLECT, point_type, value, 0, duration, 0, false);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int affect_remove_collect(lua_State* L)
|
|
{
|
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|
|
|
if ( ch != NULL )
|
|
{
|
|
BYTE bApply = (BYTE)lua_tonumber(L, 1);
|
|
|
|
if ( bApply >= MAX_APPLY_NUM ) return 0;
|
|
|
|
bApply = aApplyInfo[bApply].bPointType;
|
|
long value = (long)lua_tonumber(L, 2);
|
|
|
|
const std::list<CAffect*>& rList = ch->GetAffectContainer();
|
|
const CAffect* pAffect = NULL;
|
|
|
|
for ( std::list<CAffect*>::const_iterator iter = rList.begin(); iter != rList.end(); ++iter )
|
|
{
|
|
pAffect = *iter;
|
|
|
|
if ( pAffect->dwType == AFFECT_COLLECT )
|
|
{
|
|
if ( pAffect->bApplyOn == bApply && pAffect->lApplyValue == value )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
pAffect = NULL;
|
|
}
|
|
|
|
if ( pAffect != NULL )
|
|
{
|
|
ch->RemoveAffect( const_cast<CAffect*>(pAffect) );
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int affect_remove_all_collect( lua_State* L )
|
|
{
|
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|
|
|
if ( ch != NULL )
|
|
{
|
|
ch->RemoveAffect(AFFECT_COLLECT);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void RegisterAffectFunctionTable()
|
|
{
|
|
luaL_reg affect_functions[] =
|
|
{
|
|
{ "add", affect_add },
|
|
{ "remove", affect_remove },
|
|
{ "remove_bad", affect_remove_bad },
|
|
{ "remove_good", affect_remove_good },
|
|
{ "add_hair", affect_add_hair },
|
|
{ "remove_hair", affect_remove_hair },
|
|
{ "add_collect", affect_add_collect },
|
|
{ "add_collect_point", affect_add_collect_point },
|
|
{ "remove_collect", affect_remove_collect },
|
|
{ "remove_all_collect", affect_remove_all_collect },
|
|
{ "get_apply_on", affect_get_apply_on },
|
|
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
CQuestManager::instance().AddLuaFunctionTable("affect", affect_functions);
|
|
}
|
|
};
|