forked from metin2/server
1499 lines
33 KiB
C++
1499 lines
33 KiB
C++
#include "stdafx.h"
|
||
#include "constants.h"
|
||
#include "questmanager.h"
|
||
#include "questlua.h"
|
||
#include "dungeon.h"
|
||
#include "char.h"
|
||
#include "party.h"
|
||
#include "buffer_manager.h"
|
||
#include "char_manager.h"
|
||
#include "packet.h"
|
||
#include "desc_client.h"
|
||
#include "desc_manager.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
|
||
|
||
template <class Func> Func CDungeon::ForEachMember(Func f)
|
||
{
|
||
itertype(m_set_pkCharacter) it;
|
||
|
||
for (it = m_set_pkCharacter.begin(); it != m_set_pkCharacter.end(); ++it)
|
||
{
|
||
sys_log(0, "Dungeon ForEachMember %s", (*it)->GetName());
|
||
f(*it);
|
||
}
|
||
return f;
|
||
}
|
||
|
||
namespace quest
|
||
{
|
||
//
|
||
// "dungeon" lua functions
|
||
//
|
||
int dungeon_notice(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L, 1))
|
||
return 0;
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->Notice(lua_tostring(L, 1));
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_set_quest_flag(lua_State* L)
|
||
{
|
||
CQuestManager & q = CQuestManager::instance();
|
||
|
||
FSetQuestFlag f;
|
||
|
||
f.flagname = q.GetCurrentPC()->GetCurrentQuestName() + "." + lua_tostring(L, 1);
|
||
f.value = (int) rint(lua_tonumber(L, 2));
|
||
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->ForEachMember(f);
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_set_flag(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1) || !lua_isnumber(L,2))
|
||
{
|
||
sys_err("wrong set flag");
|
||
}
|
||
else
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
{
|
||
const char* sz = lua_tostring(L,1);
|
||
int value = int(lua_tonumber(L, 2));
|
||
pDungeon->SetFlag(sz, value);
|
||
}
|
||
else
|
||
{
|
||
sys_err("no dungeon !!!");
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_get_flag(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1))
|
||
{
|
||
sys_err("wrong get flag");
|
||
}
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
{
|
||
const char* sz = lua_tostring(L,1);
|
||
lua_pushnumber(L, pDungeon->GetFlag(sz));
|
||
}
|
||
else
|
||
{
|
||
sys_err("no dungeon !!!");
|
||
lua_pushnumber(L, 0);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_get_flag_from_map_index(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1) || !lua_isnumber(L,2))
|
||
{
|
||
sys_err("wrong get flag");
|
||
}
|
||
|
||
DWORD dwMapIndex = (DWORD) lua_tonumber(L, 2);
|
||
if (dwMapIndex)
|
||
{
|
||
LPDUNGEON pDungeon = CDungeonManager::instance().FindByMapIndex(dwMapIndex);
|
||
if (pDungeon)
|
||
{
|
||
const char* sz = lua_tostring(L,1);
|
||
lua_pushnumber(L, pDungeon->GetFlag(sz));
|
||
}
|
||
else
|
||
{
|
||
sys_err("no dungeon !!!");
|
||
lua_pushnumber(L, 0);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_get_map_index(lua_State* L)
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
{
|
||
sys_log(0, "Dungeon GetMapIndex %d",pDungeon->GetMapIndex());
|
||
lua_pushnumber(L, pDungeon->GetMapIndex());
|
||
}
|
||
else
|
||
{
|
||
sys_err("no dungeon !!!");
|
||
lua_pushnumber(L, 0);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_regen_file(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1))
|
||
{
|
||
sys_err("wrong filename");
|
||
return 0;
|
||
}
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->SpawnRegen(lua_tostring(L,1));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_set_regen_file(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1))
|
||
{
|
||
sys_err("wrong filename");
|
||
return 0;
|
||
}
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->SpawnRegen(lua_tostring(L,1), false);
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_clear_regen(lua_State* L)
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
if (pDungeon)
|
||
pDungeon->ClearRegen();
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_check_eliminated(lua_State* L)
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
if (pDungeon)
|
||
pDungeon->CheckEliminated();
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_set_exit_all_at_eliminate(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L,1))
|
||
{
|
||
sys_err("wrong time");
|
||
return 0;
|
||
}
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->SetExitAllAtEliminate((int)lua_tonumber(L, 1));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_set_warp_at_eliminate(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
sys_err("wrong time");
|
||
return 0;
|
||
}
|
||
|
||
if (!lua_isnumber(L, 2))
|
||
{
|
||
sys_err("wrong map index");
|
||
return 0;
|
||
}
|
||
|
||
if (!lua_isnumber(L, 3))
|
||
{
|
||
sys_err("wrong X");
|
||
return 0;
|
||
}
|
||
|
||
if (!lua_isnumber(L, 4))
|
||
{
|
||
sys_err("wrong Y");
|
||
return 0;
|
||
}
|
||
|
||
const char * c_pszRegenFile = NULL;
|
||
|
||
if (lua_gettop(L) >= 5)
|
||
c_pszRegenFile = lua_tostring(L,5);
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
{
|
||
pDungeon->SetWarpAtEliminate((int)lua_tonumber(L,1),
|
||
(int)lua_tonumber(L,2),
|
||
(int)lua_tonumber(L,3),
|
||
(int)lua_tonumber(L,4),
|
||
c_pszRegenFile);
|
||
}
|
||
else
|
||
sys_err("cannot find dungeon");
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_new_jump(lua_State* L)
|
||
{
|
||
if (lua_gettop(L) < 3)
|
||
{
|
||
sys_err("not enough argument");
|
||
return 0;
|
||
}
|
||
|
||
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3))
|
||
{
|
||
sys_err("wrong argument");
|
||
return 0;
|
||
}
|
||
|
||
int lMapIndex = (int)lua_tonumber(L,1);
|
||
|
||
LPDUNGEON pDungeon = CDungeonManager::instance().Create(lMapIndex);
|
||
|
||
if (!pDungeon)
|
||
{
|
||
sys_err("cannot create dungeon %d", lMapIndex);
|
||
return 0;
|
||
}
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
//ch->WarpSet(pDungeon->GetMapIndex(), (int) lua_tonumber(L, 2), (int)lua_tonumber(L, 3));
|
||
ch->WarpSet((int) lua_tonumber(L, 2), (int)lua_tonumber(L, 3), pDungeon->GetMapIndex());
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_new_jump_all(lua_State* L)
|
||
{
|
||
if (lua_gettop(L)<3 || !lua_isnumber(L,1) || !lua_isnumber(L, 2) || !lua_isnumber(L,3))
|
||
{
|
||
sys_err("not enough argument");
|
||
return 0;
|
||
}
|
||
|
||
int lMapIndex = (int)lua_tonumber(L,1);
|
||
|
||
LPDUNGEON pDungeon = CDungeonManager::instance().Create(lMapIndex);
|
||
|
||
if (!pDungeon)
|
||
{
|
||
sys_err("cannot create dungeon %d", lMapIndex);
|
||
return 0;
|
||
}
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
pDungeon->JumpAll(ch->GetMapIndex(), (int)lua_tonumber(L, 2), (int)lua_tonumber(L, 3));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_new_jump_party (lua_State* L)
|
||
{
|
||
if (lua_gettop(L)<3 || !lua_isnumber(L,1) || !lua_isnumber(L, 2) || !lua_isnumber(L,3))
|
||
{
|
||
sys_err("not enough argument");
|
||
return 0;
|
||
}
|
||
|
||
int lMapIndex = (int)lua_tonumber(L,1);
|
||
|
||
LPDUNGEON pDungeon = CDungeonManager::instance().Create(lMapIndex);
|
||
|
||
if (!pDungeon)
|
||
{
|
||
sys_err("cannot create dungeon %d", lMapIndex);
|
||
return 0;
|
||
}
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (ch->GetParty() == NULL)
|
||
{
|
||
sys_err ("cannot go to dungeon alone.");
|
||
return 0;
|
||
}
|
||
pDungeon->JumpParty(ch->GetParty(), ch->GetMapIndex(), (int)lua_tonumber(L, 2), (int)lua_tonumber(L, 3));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_jump_all(lua_State* L)
|
||
{
|
||
if (lua_gettop(L)<2 || !lua_isnumber(L, 1) || !lua_isnumber(L,2))
|
||
return 0;
|
||
|
||
LPDUNGEON pDungeon = CQuestManager::instance().GetCurrentDungeon();
|
||
|
||
if (!pDungeon)
|
||
return 0;
|
||
|
||
pDungeon->JumpAll(pDungeon->GetMapIndex(), (int)lua_tonumber(L, 1), (int)lua_tonumber(L, 2));
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_warp_all(lua_State* L)
|
||
{
|
||
if (lua_gettop(L)<2 || !lua_isnumber(L, 1) || !lua_isnumber(L,2))
|
||
return 0;
|
||
|
||
LPDUNGEON pDungeon = CQuestManager::instance().GetCurrentDungeon();
|
||
|
||
if (!pDungeon)
|
||
return 0;
|
||
|
||
pDungeon->WarpAll(pDungeon->GetMapIndex(), (int)lua_tonumber(L, 1), (int)lua_tonumber(L, 2));
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_get_kill_stone_count(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L,1) || !lua_isnumber(L,2))
|
||
{
|
||
lua_pushnumber(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
{
|
||
lua_pushnumber(L, pDungeon->GetKillStoneCount());
|
||
return 1;
|
||
}
|
||
|
||
lua_pushnumber(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_get_kill_mob_count(lua_State * L)
|
||
{
|
||
if (!lua_isnumber(L,1) || !lua_isnumber(L,2))
|
||
{
|
||
lua_pushnumber(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
{
|
||
lua_pushnumber(L, pDungeon->GetKillMobCount());
|
||
return 1;
|
||
}
|
||
|
||
lua_pushnumber(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_is_use_potion(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2))
|
||
{
|
||
lua_pushboolean(L, 1);
|
||
return 1;
|
||
}
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
{
|
||
lua_pushboolean(L, pDungeon->IsUsePotion());
|
||
return 1;
|
||
}
|
||
|
||
lua_pushboolean(L, 1);
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_revived(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L,1) || !lua_isnumber(L,2))
|
||
{
|
||
lua_pushboolean(L, 1);
|
||
return 1;
|
||
}
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
{
|
||
lua_pushboolean(L, pDungeon->IsUseRevive());
|
||
return 1;
|
||
}
|
||
|
||
lua_pushboolean(L, 1);
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_set_dest(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L,1) || !lua_isnumber(L,2))
|
||
return 0;
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
LPPARTY pParty = ch->GetParty();
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon && pParty)
|
||
pDungeon->SendDestPositionToParty(pParty, (int)lua_tonumber(L,1), (int)lua_tonumber(L,2));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_unique_set_maxhp(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1) || !lua_isnumber(L,2))
|
||
return 0;
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->UniqueSetMaxHP(lua_tostring(L,1), (int)lua_tonumber(L,2));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_unique_set_hp(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1) || !lua_isnumber(L,2))
|
||
return 0;
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->UniqueSetHP(lua_tostring(L,1), (int)lua_tonumber(L,2));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_unique_set_def_grade(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1) || !lua_isnumber(L,2))
|
||
return 0;
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->UniqueSetDefGrade(lua_tostring(L,1), (int)lua_tonumber(L,2));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_unique_get_hp_perc(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1))
|
||
{
|
||
lua_pushnumber(L,0);
|
||
return 1;
|
||
}
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
{
|
||
lua_pushnumber(L, pDungeon->GetUniqueHpPerc(lua_tostring(L,1)));
|
||
return 1;
|
||
}
|
||
|
||
lua_pushnumber(L,0);
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_is_unique_dead(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1))
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
{
|
||
lua_pushboolean(L, pDungeon->IsUniqueDead(lua_tostring(L,1))?1:0);
|
||
return 1;
|
||
}
|
||
|
||
lua_pushboolean(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_purge_unique(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1))
|
||
return 0;
|
||
sys_log(0,"QUEST_DUNGEON_PURGE_UNIQUE %s", lua_tostring(L,1));
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->PurgeUnique(lua_tostring(L,1));
|
||
|
||
return 0;
|
||
}
|
||
|
||
struct FPurgeArea
|
||
{
|
||
int x1, y1, x2, y2;
|
||
LPCHARACTER ExceptChar;
|
||
|
||
FPurgeArea(int a, int b, int c, int d, LPCHARACTER p)
|
||
: x1(a), y1(b), x2(c), y2(d),
|
||
ExceptChar(p)
|
||
{}
|
||
|
||
void operator () (LPENTITY ent)
|
||
{
|
||
if (true == ent->IsType(ENTITY_CHARACTER))
|
||
{
|
||
LPCHARACTER pChar = static_cast<LPCHARACTER>(ent);
|
||
|
||
if (pChar == ExceptChar)
|
||
return;
|
||
|
||
if (!pChar->IsPet() && (true == pChar->IsMonster() || true == pChar->IsStone()))
|
||
{
|
||
if (x1 <= pChar->GetX() && pChar->GetX() <= x2 && y1 <= pChar->GetY() && pChar->GetY() <= y2)
|
||
{
|
||
M2_DESTROY_CHARACTER(pChar);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
int dungeon_purge_area(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L,1) || !lua_isnumber(L,2) || !lua_isnumber(L,3) || !lua_isnumber(L,4))
|
||
return 0;
|
||
sys_log(0,"QUEST_DUNGEON_PURGE_AREA");
|
||
|
||
int x1 = lua_tonumber(L, 1);
|
||
int y1 = lua_tonumber(L, 2);
|
||
int x2 = lua_tonumber(L, 3);
|
||
int y2 = lua_tonumber(L, 4);
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
const int mapIndex = pDungeon->GetMapIndex();
|
||
|
||
if (0 == mapIndex)
|
||
{
|
||
sys_err("_purge_area: cannot get a map index with (%u, %u)", x1, y1);
|
||
return 0;
|
||
}
|
||
|
||
LPSECTREE_MAP pSectree = SECTREE_MANAGER::instance().GetMap(mapIndex);
|
||
|
||
if (NULL != pSectree)
|
||
{
|
||
FPurgeArea func(x1, y1, x2, y2, CQuestManager::instance().GetCurrentNPCCharacterPtr());
|
||
|
||
pSectree->for_each(func);
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_kill_unique(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1))
|
||
return 0;
|
||
sys_log(0,"QUEST_DUNGEON_KILL_UNIQUE %s", lua_tostring(L,1));
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->KillUnique(lua_tostring(L,1));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_spawn_stone_door(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1) || !lua_isstring(L,2))
|
||
return 0;
|
||
sys_log(0,"QUEST_DUNGEON_SPAWN_STONE_DOOR %s %s", lua_tostring(L,1), lua_tostring(L,2));
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->SpawnStoneDoor(lua_tostring(L,1), lua_tostring(L,2));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_spawn_wooden_door(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1) || !lua_isstring(L,2))
|
||
return 0;
|
||
sys_log(0,"QUEST_DUNGEON_SPAWN_WOODEN_DOOR %s %s", lua_tostring(L,1), lua_tostring(L,2));
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->SpawnWoodenDoor(lua_tostring(L,1), lua_tostring(L,2));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_spawn_move_group(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L,1) || !lua_isstring(L,2) || !lua_isstring(L,3))
|
||
return 0;
|
||
sys_log(0,"QUEST_DUNGEON_SPAWN_MOVE_GROUP %d %s %s", (int)lua_tonumber(L,1), lua_tostring(L,2), lua_tostring(L,3));
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->SpawnMoveGroup((DWORD)lua_tonumber(L,1), lua_tostring(L,2), lua_tostring(L,3));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_spawn_move_unique(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1) || !lua_isnumber(L,2) || !lua_isstring(L,3) || !lua_isstring(L,4))
|
||
return 0;
|
||
sys_log(0,"QUEST_DUNGEON_SPAWN_MOVE_UNIQUE %s %d %s %s", lua_tostring(L,1), (int)lua_tonumber(L,2), lua_tostring(L,3), lua_tostring(L,4));
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->SpawnMoveUnique(lua_tostring(L,1), (DWORD)lua_tonumber(L,2), lua_tostring(L,3), lua_tostring(L,4));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_spawn_unique(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1) || !lua_isnumber(L,2) || !lua_isstring(L,3))
|
||
return 0;
|
||
sys_log(0,"QUEST_DUNGEON_SPAWN_UNIQUE %s %d %s", lua_tostring(L,1), (int)lua_tonumber(L,2), lua_tostring(L,3));
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->SpawnUnique(lua_tostring(L,1), (DWORD)lua_tonumber(L,2), lua_tostring(L,3));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_spawn(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L,1) || !lua_isstring(L,2))
|
||
return 0;
|
||
sys_log(0,"QUEST_DUNGEON_SPAWN %d %s", (int)lua_tonumber(L,1), lua_tostring(L,2));
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->Spawn((DWORD)lua_tonumber(L,1), lua_tostring(L,2));
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_set_unique(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L, 1) || !lua_isnumber(L, 2))
|
||
return 0;
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
DWORD vid = (DWORD) lua_tonumber(L, 2);
|
||
|
||
if (pDungeon)
|
||
pDungeon->SetUnique(lua_tostring(L, 1), vid);
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_get_unique_vid(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L,1))
|
||
{
|
||
lua_pushnumber(L,0);
|
||
return 1;
|
||
}
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
{
|
||
lua_pushnumber(L, pDungeon->GetUniqueVid(lua_tostring(L,1)));
|
||
return 1;
|
||
}
|
||
|
||
lua_pushnumber(L,0);
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_spawn_mob(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();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
DWORD vid = 0;
|
||
|
||
if (pDungeon)
|
||
{
|
||
DWORD dwVnum = (DWORD) lua_tonumber(L, 1);
|
||
int x = (int) lua_tonumber(L, 2);
|
||
int y = (int) lua_tonumber(L, 3);
|
||
float radius = lua_isnumber(L, 4) ? (float) lua_tonumber(L, 4) : 0;
|
||
DWORD count = (lua_isnumber(L, 5)) ? (DWORD) lua_tonumber(L, 5) : 1;
|
||
|
||
sys_log(0, "dungeon_spawn_mob %u %d %d", dwVnum, x, y);
|
||
|
||
if (count == 0)
|
||
count = 1;
|
||
|
||
while (count --)
|
||
{
|
||
if (radius<1)
|
||
{
|
||
LPCHARACTER ch = pDungeon->SpawnMob(dwVnum, x, y);
|
||
if (ch && !vid)
|
||
vid = ch->GetVID();
|
||
}
|
||
else
|
||
{
|
||
float angle = number(0, 999) * M_PI * 2 / 1000;
|
||
float r = number(0, 999) * radius / 1000;
|
||
|
||
int nx = x + (int)(r * cos(angle));
|
||
int ny = y + (int)(r * sin(angle));
|
||
|
||
LPCHARACTER ch = pDungeon->SpawnMob(dwVnum, nx, ny);
|
||
if (ch && !vid)
|
||
vid = ch->GetVID();
|
||
}
|
||
}
|
||
}
|
||
|
||
lua_pushnumber(L, vid);
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_spawn_mob_dir(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3) || !lua_isnumber(L, 4))
|
||
{
|
||
sys_err("invalid argument");
|
||
return 0;
|
||
}
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
DWORD vid = 0;
|
||
|
||
if (pDungeon)
|
||
{
|
||
DWORD dwVnum = (DWORD) lua_tonumber(L, 1);
|
||
int x = (int) lua_tonumber(L, 2);
|
||
int y = (int) lua_tonumber(L, 3);
|
||
BYTE dir = (int) lua_tonumber(L, 4);
|
||
|
||
LPCHARACTER ch = pDungeon->SpawnMob(dwVnum, x, y, dir);
|
||
if (ch && !vid)
|
||
vid = ch->GetVID();
|
||
}
|
||
lua_pushnumber(L, vid);
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_spawn_mob_ac_dir(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3) || !lua_isnumber(L, 4))
|
||
{
|
||
sys_err("invalid argument");
|
||
return 0;
|
||
}
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
DWORD vid = 0;
|
||
|
||
if (pDungeon)
|
||
{
|
||
DWORD dwVnum = (DWORD) lua_tonumber(L, 1);
|
||
int x = (int) lua_tonumber(L, 2);
|
||
int y = (int) lua_tonumber(L, 3);
|
||
BYTE dir = (int) lua_tonumber(L, 4);
|
||
|
||
LPCHARACTER ch = pDungeon->SpawnMob_ac_dir(dwVnum, x, y, dir);
|
||
if (ch && !vid)
|
||
vid = ch->GetVID();
|
||
}
|
||
lua_pushnumber(L, vid);
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_spawn_goto_mob(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3) || !lua_isnumber(L, 4))
|
||
return 0;
|
||
|
||
int lFromX = (int)lua_tonumber(L, 1);
|
||
int lFromY = (int)lua_tonumber(L, 2);
|
||
int lToX = (int)lua_tonumber(L, 3);
|
||
int lToY = (int)lua_tonumber(L, 4);
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->SpawnGotoMob(lFromX, lFromY, lToX, lToY);
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_spawn_name_mob(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3) || !lua_isstring(L, 4))
|
||
return 0;
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
{
|
||
DWORD dwVnum = (DWORD) lua_tonumber(L, 1);
|
||
int x = (int)lua_tonumber(L, 2);
|
||
int y = (int)lua_tonumber(L, 3);
|
||
pDungeon->SpawnNameMob(dwVnum, x, y, lua_tostring(L, 4));
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_spawn_group(lua_State* L)
|
||
{
|
||
//
|
||
// argument: vnum,x,y,radius,aggressive,count
|
||
//
|
||
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3) || !lua_isnumber(L, 4) || !lua_isnumber(L, 6))
|
||
{
|
||
sys_err("invalid argument");
|
||
return 0;
|
||
}
|
||
|
||
DWORD vid = 0;
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
{
|
||
DWORD group_vnum = (DWORD)lua_tonumber(L, 1);
|
||
int local_x = (int) lua_tonumber(L, 2) * 100;
|
||
int local_y = (int) lua_tonumber(L, 3) * 100;
|
||
float radius = (float) lua_tonumber(L, 4) * 100;
|
||
bool bAggressive = lua_toboolean(L, 5);
|
||
DWORD count = (DWORD) lua_tonumber(L, 6);
|
||
|
||
LPCHARACTER chRet = pDungeon->SpawnGroup(group_vnum, local_x, local_y, radius, bAggressive, count);
|
||
if (chRet)
|
||
vid = chRet->GetVID();
|
||
}
|
||
|
||
lua_pushnumber(L, vid);
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_join(lua_State* L)
|
||
{
|
||
if (lua_gettop(L) < 1 || !lua_isnumber(L, 1))
|
||
return 0;
|
||
|
||
int lMapIndex = (int)lua_tonumber(L, 1);
|
||
LPDUNGEON pDungeon = CDungeonManager::instance().Create(lMapIndex);
|
||
|
||
if (!pDungeon)
|
||
return 0;
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (ch->GetParty() && ch->GetParty()->GetLeaderPID() == ch->GetPlayerID())
|
||
pDungeon->JoinParty(ch->GetParty());
|
||
else if (!ch->GetParty())
|
||
pDungeon->Join(ch);
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_exit(lua_State* L) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
ch->ExitToSavedLocation();
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_exit_all(lua_State* L) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->ExitAll();
|
||
|
||
return 0;
|
||
}
|
||
|
||
struct FSayDungeonByItemGroup
|
||
{
|
||
const CDungeon::ItemGroup* item_group;
|
||
std::string can_enter_ment;
|
||
std::string cant_enter_ment;
|
||
void operator()(LPENTITY ent)
|
||
{
|
||
if (ent->IsType(ENTITY_CHARACTER))
|
||
{
|
||
LPCHARACTER ch = (LPCHARACTER) ent;
|
||
|
||
if (ch->IsPC())
|
||
{
|
||
struct ::packet_script packet_script;
|
||
TEMP_BUFFER buf;
|
||
|
||
for (CDungeon::ItemGroup::const_iterator it = item_group->begin(); it != item_group->end(); it++)
|
||
{
|
||
if(ch->CountSpecifyItem(it->first) >= it->second)
|
||
{
|
||
packet_script.header = HEADER_GC_SCRIPT;
|
||
packet_script.skin = quest::CQuestManager::QUEST_SKIN_NORMAL;
|
||
packet_script.src_size = can_enter_ment.size();
|
||
packet_script.size = packet_script.src_size + sizeof(struct packet_script);
|
||
|
||
buf.write(&packet_script, sizeof(struct packet_script));
|
||
buf.write(&can_enter_ment[0], can_enter_ment.size());
|
||
ch->GetDesc()->Packet(buf.read_peek(), buf.size());
|
||
return;
|
||
}
|
||
}
|
||
|
||
packet_script.header = HEADER_GC_SCRIPT;
|
||
packet_script.skin = quest::CQuestManager::QUEST_SKIN_NORMAL;
|
||
packet_script.src_size = cant_enter_ment.size();
|
||
packet_script.size = packet_script.src_size + sizeof(struct packet_script);
|
||
|
||
buf.write(&packet_script, sizeof(struct packet_script));
|
||
buf.write(&cant_enter_ment[0], cant_enter_ment.size());
|
||
ch->GetDesc()->Packet(buf.read_peek(), buf.size());
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
|
||
int dungeon_say_diff_by_item_group(lua_State* L)
|
||
{
|
||
if (!lua_isstring(L, 1) || !lua_isstring(L, 2) || !lua_isstring(L, 3))
|
||
{
|
||
sys_log(0, "QUEST wrong set flag");
|
||
return 0;
|
||
}
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
CDungeon * pDungeon = q.GetCurrentDungeon();
|
||
|
||
if(!pDungeon)
|
||
{
|
||
sys_err("QUEST : no dungeon");
|
||
return 0;
|
||
}
|
||
|
||
SECTREE_MAP * pMap = SECTREE_MANAGER::instance().GetMap(pDungeon->GetMapIndex());
|
||
|
||
if (!pMap)
|
||
{
|
||
sys_err("cannot find map by index %d", pDungeon->GetMapIndex());
|
||
return 0;
|
||
}
|
||
FSayDungeonByItemGroup f;
|
||
sys_log (0,"diff_by_item");
|
||
|
||
std::string group_name (lua_tostring (L, 1));
|
||
f.item_group = pDungeon->GetItemGroup (group_name);
|
||
|
||
if (f.item_group == NULL)
|
||
{
|
||
sys_err ("invalid item group");
|
||
return 0;
|
||
}
|
||
|
||
f.can_enter_ment = lua_tostring(L, 2);
|
||
f.can_enter_ment+= "[ENTER][ENTER][ENTER][ENTER][DONE]";
|
||
f.cant_enter_ment = lua_tostring(L, 3);
|
||
f.cant_enter_ment+= "[ENTER][ENTER][ENTER][ENTER][DONE]";
|
||
|
||
pMap -> for_each( f );
|
||
|
||
return 0;
|
||
}
|
||
|
||
struct FExitDungeonByItemGroup
|
||
{
|
||
const CDungeon::ItemGroup* item_group;
|
||
|
||
void operator()(LPENTITY ent)
|
||
{
|
||
if (ent->IsType(ENTITY_CHARACTER))
|
||
{
|
||
LPCHARACTER ch = (LPCHARACTER) ent;
|
||
|
||
if (ch->IsPC())
|
||
{
|
||
for (CDungeon::ItemGroup::const_iterator it = item_group->begin(); it != item_group->end(); it++)
|
||
{
|
||
if(ch->CountSpecifyItem(it->first) >= it->second)
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
ch->ExitToSavedLocation();
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
int dungeon_exit_all_by_item_group (lua_State* L) // Ư<><C6AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>쿡 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>»<EFBFBD><C2BB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
{
|
||
if (!lua_isstring(L, 1))
|
||
{
|
||
sys_log(0, "QUEST wrong set flag");
|
||
return 0;
|
||
}
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
CDungeon * pDungeon = q.GetCurrentDungeon();
|
||
|
||
if(!pDungeon)
|
||
{
|
||
sys_err("QUEST : no dungeon");
|
||
return 0;
|
||
}
|
||
|
||
SECTREE_MAP * pMap = SECTREE_MANAGER::instance().GetMap(pDungeon->GetMapIndex());
|
||
|
||
if (!pMap)
|
||
{
|
||
sys_err("cannot find map by index %d", pDungeon->GetMapIndex());
|
||
return 0;
|
||
}
|
||
FExitDungeonByItemGroup f;
|
||
|
||
std::string group_name (lua_tostring (L, 1));
|
||
f.item_group = pDungeon->GetItemGroup (group_name);
|
||
|
||
if (f.item_group == NULL)
|
||
{
|
||
sys_err ("invalid item group");
|
||
return 0;
|
||
}
|
||
|
||
pMap -> for_each( f );
|
||
|
||
return 0;
|
||
}
|
||
|
||
struct FDeleteItemInItemGroup
|
||
{
|
||
const CDungeon::ItemGroup* item_group;
|
||
|
||
void operator()(LPENTITY ent)
|
||
{
|
||
if (ent->IsType(ENTITY_CHARACTER))
|
||
{
|
||
LPCHARACTER ch = (LPCHARACTER) ent;
|
||
|
||
if (ch->IsPC())
|
||
{
|
||
for (CDungeon::ItemGroup::const_iterator it = item_group->begin(); it != item_group->end(); it++)
|
||
{
|
||
if(ch->CountSpecifyItem(it->first) >= it->second)
|
||
{
|
||
ch->RemoveSpecifyItem (it->first, it->second);
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
int dungeon_delete_item_in_item_group_from_all(lua_State* L) // Ư<><C6AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> pc<70><63><EFBFBD>Լ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||
{
|
||
if (!lua_isstring(L, 1))
|
||
{
|
||
sys_log(0, "QUEST wrong set flag");
|
||
return 0;
|
||
}
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
CDungeon * pDungeon = q.GetCurrentDungeon();
|
||
|
||
if(!pDungeon)
|
||
{
|
||
sys_err("QUEST : no dungeon");
|
||
return 0;
|
||
}
|
||
|
||
SECTREE_MAP * pMap = SECTREE_MANAGER::instance().GetMap(pDungeon->GetMapIndex());
|
||
|
||
if (!pMap)
|
||
{
|
||
sys_err("cannot find map by index %d", pDungeon->GetMapIndex());
|
||
return 0;
|
||
}
|
||
FDeleteItemInItemGroup f;
|
||
|
||
std::string group_name (lua_tostring (L, 1));
|
||
f.item_group = pDungeon->GetItemGroup (group_name);
|
||
|
||
if (f.item_group == NULL)
|
||
{
|
||
sys_err ("invalid item group");
|
||
return 0;
|
||
}
|
||
|
||
pMap -> for_each( f );
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
int dungeon_kill_all(lua_State* L)
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->KillAll();
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_purge(lua_State* L)
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->Purge();
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_exit_all_to_start_position(lua_State * L)
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->ExitAllToStartPosition();
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_count_monster(lua_State * L)
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
lua_pushnumber(L, pDungeon->CountMonster());
|
||
else
|
||
{
|
||
sys_err("not in a dungeon");
|
||
lua_pushnumber(L, INT_MAX);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_select(lua_State* L)
|
||
{
|
||
DWORD dwMapIndex = (DWORD) lua_tonumber(L, 1);
|
||
if (dwMapIndex)
|
||
{
|
||
LPDUNGEON pDungeon = CDungeonManager::instance().FindByMapIndex(dwMapIndex);
|
||
if (pDungeon)
|
||
{
|
||
CQuestManager::instance().SelectDungeon(pDungeon);
|
||
lua_pushboolean(L, 1);
|
||
}
|
||
else
|
||
{
|
||
CQuestManager::instance().SelectDungeon(NULL);
|
||
lua_pushboolean(L, 0);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CQuestManager::instance().SelectDungeon(NULL);
|
||
lua_pushboolean(L, 0);
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_find(lua_State* L)
|
||
{
|
||
DWORD dwMapIndex = (DWORD) lua_tonumber(L, 1);
|
||
if (dwMapIndex)
|
||
{
|
||
LPDUNGEON pDungeon = CDungeonManager::instance().FindByMapIndex(dwMapIndex);
|
||
if (pDungeon)
|
||
{
|
||
lua_pushboolean(L, 1);
|
||
}
|
||
else
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
lua_pushboolean(L, 0);
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_all_near_to( lua_State* L)
|
||
{
|
||
LPDUNGEON pDungeon = CQuestManager::instance().GetCurrentDungeon();
|
||
|
||
if (pDungeon != NULL)
|
||
{
|
||
lua_pushboolean(L, pDungeon->IsAllPCNearTo( (int)lua_tonumber(L, 1), (int)lua_tonumber(L, 2), 30));
|
||
}
|
||
else
|
||
{
|
||
lua_pushboolean(L, false);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int dungeon_set_warp_location (lua_State* L)
|
||
{
|
||
LPDUNGEON pDungeon = CQuestManager::instance().GetCurrentDungeon();
|
||
|
||
if (pDungeon == NULL)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
if (lua_gettop(L)<3 || !lua_isnumber(L, 1) || !lua_isnumber(L,2) || !lua_isnumber(L, 3))
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
FSetWarpLocation f ((int)lua_tonumber(L, 1), (int)lua_tonumber(L, 2), (int)lua_tonumber(L, 3));
|
||
pDungeon->ForEachMember (f);
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_set_item_group (lua_State* L)
|
||
{
|
||
if (!lua_isstring (L, 1) || !lua_isnumber (L, 2))
|
||
{
|
||
return 0;
|
||
}
|
||
std::string group_name (lua_tostring (L, 1));
|
||
int size = lua_tonumber (L, 2);
|
||
|
||
CDungeon::ItemGroup item_group;
|
||
|
||
for (int i = 0; i < size; i++)
|
||
{
|
||
if (!lua_isnumber (L, i * 2 + 3) || !lua_isnumber (L, i * 2 + 4))
|
||
{
|
||
return 0;
|
||
}
|
||
item_group.push_back (std::pair <DWORD, int> (lua_tonumber (L, i * 2 + 3), lua_tonumber (L, i * 2 + 4)));
|
||
}
|
||
LPDUNGEON pDungeon = CQuestManager::instance().GetCurrentDungeon();
|
||
|
||
if (pDungeon == NULL)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
pDungeon->CreateItemGroup (group_name, item_group);
|
||
return 0;
|
||
}
|
||
|
||
int dungeon_set_quest_flag2(lua_State* L)
|
||
{
|
||
CQuestManager & q = CQuestManager::instance();
|
||
|
||
FSetQuestFlag f;
|
||
|
||
if (!lua_isstring(L, 1) || !lua_isstring(L, 2) || !lua_isnumber(L, 3))
|
||
{
|
||
sys_err("Invalid Argument");
|
||
}
|
||
|
||
f.flagname = string (lua_tostring(L, 1)) + "." + lua_tostring(L, 2);
|
||
f.value = (int) rint(lua_tonumber(L, 3));
|
||
|
||
LPDUNGEON pDungeon = q.GetCurrentDungeon();
|
||
|
||
if (pDungeon)
|
||
pDungeon->ForEachMember(f);
|
||
|
||
return 0;
|
||
}
|
||
|
||
void RegisterDungeonFunctionTable()
|
||
{
|
||
luaL_reg dungeon_functions[] =
|
||
{
|
||
{ "join", dungeon_join },
|
||
{ "exit", dungeon_exit },
|
||
{ "exit_all", dungeon_exit_all },
|
||
{ "set_item_group", dungeon_set_item_group },
|
||
{ "exit_all_by_item_group", dungeon_exit_all_by_item_group},
|
||
{ "say_diff_by_item_group", dungeon_say_diff_by_item_group},
|
||
{ "delete_item_in_item_group_from_all", dungeon_delete_item_in_item_group_from_all},
|
||
{ "purge", dungeon_purge },
|
||
{ "kill_all", dungeon_kill_all },
|
||
{ "spawn", dungeon_spawn },
|
||
{ "spawn_mob", dungeon_spawn_mob },
|
||
{ "spawn_mob_dir", dungeon_spawn_mob_dir },
|
||
{ "spawn_mob_ac_dir", dungeon_spawn_mob_ac_dir },
|
||
{ "spawn_name_mob", dungeon_spawn_name_mob },
|
||
{ "spawn_goto_mob", dungeon_spawn_goto_mob },
|
||
{ "spawn_group", dungeon_spawn_group },
|
||
{ "spawn_unique", dungeon_spawn_unique },
|
||
{ "spawn_move_unique", dungeon_spawn_move_unique},
|
||
{ "spawn_move_group", dungeon_spawn_move_group},
|
||
{ "spawn_stone_door", dungeon_spawn_stone_door},
|
||
{ "spawn_wooden_door", dungeon_spawn_wooden_door},
|
||
{ "purge_unique", dungeon_purge_unique },
|
||
{ "purge_area", dungeon_purge_area },
|
||
{ "kill_unique", dungeon_kill_unique },
|
||
{ "is_unique_dead", dungeon_is_unique_dead },
|
||
{ "unique_get_hp_perc", dungeon_unique_get_hp_perc},
|
||
{ "unique_set_def_grade", dungeon_unique_set_def_grade},
|
||
{ "unique_set_hp", dungeon_unique_set_hp },
|
||
{ "unique_set_maxhp", dungeon_unique_set_maxhp},
|
||
{ "get_unique_vid", dungeon_get_unique_vid},
|
||
{ "get_kill_stone_count", dungeon_get_kill_stone_count},
|
||
{ "get_kill_mob_count", dungeon_get_kill_mob_count},
|
||
{ "is_use_potion", dungeon_is_use_potion },
|
||
{ "revived", dungeon_revived },
|
||
{ "set_dest", dungeon_set_dest },
|
||
{ "jump_all", dungeon_jump_all },
|
||
{ "warp_all", dungeon_warp_all },
|
||
{ "new_jump_all", dungeon_new_jump_all },
|
||
{ "new_jump_party", dungeon_new_jump_party },
|
||
{ "new_jump", dungeon_new_jump },
|
||
{ "regen_file", dungeon_regen_file },
|
||
{ "set_regen_file", dungeon_set_regen_file },
|
||
{ "clear_regen", dungeon_clear_regen },
|
||
{ "set_exit_all_at_eliminate", dungeon_set_exit_all_at_eliminate},
|
||
{ "set_warp_at_eliminate", dungeon_set_warp_at_eliminate},
|
||
{ "get_map_index", dungeon_get_map_index },
|
||
{ "check_eliminated", dungeon_check_eliminated},
|
||
{ "exit_all_to_start_position", dungeon_exit_all_to_start_position },
|
||
{ "count_monster", dungeon_count_monster },
|
||
{ "setf", dungeon_set_flag },
|
||
{ "getf", dungeon_get_flag },
|
||
{ "getf_from_map_index", dungeon_get_flag_from_map_index },
|
||
{ "set_unique", dungeon_set_unique },
|
||
{ "select", dungeon_select },
|
||
{ "find", dungeon_find },
|
||
{ "notice", dungeon_notice },
|
||
{ "setqf", dungeon_set_quest_flag },
|
||
{ "all_near_to", dungeon_all_near_to },
|
||
{ "set_warp_location", dungeon_set_warp_location },
|
||
{ "setqf2", dungeon_set_quest_flag2 },
|
||
|
||
{ NULL, NULL }
|
||
};
|
||
|
||
CQuestManager::instance().AddLuaFunctionTable("d", dungeon_functions);
|
||
}
|
||
}
|