1
0
forked from metin2/server
server/game/src/questlua_affect.cpp
2022-03-05 12:44:06 +02:00

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