forked from metin2/server
426 lines
9.7 KiB
C++
426 lines
9.7 KiB
C++
|
#include "stdafx.h"
|
|||
|
#include <sstream>
|
|||
|
|
|||
|
#include "desc.h"
|
|||
|
#include "party.h"
|
|||
|
#include "char.h"
|
|||
|
#include "questlua.h"
|
|||
|
#include "questmanager.h"
|
|||
|
#include "packet.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
|
|||
|
|
|||
|
namespace quest
|
|||
|
{
|
|||
|
using namespace std;
|
|||
|
|
|||
|
//
|
|||
|
// "party" Lua functions
|
|||
|
//
|
|||
|
int party_clear_ready(lua_State* L)
|
|||
|
{
|
|||
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|||
|
|
|||
|
if (ch->GetParty())
|
|||
|
{
|
|||
|
FPartyClearReady f;
|
|||
|
ch->GetParty()->ForEachNearMember(f);
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
int party_get_max_level(lua_State* L)
|
|||
|
{
|
|||
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|||
|
|
|||
|
if (ch->GetParty())
|
|||
|
lua_pushnumber(L,ch->GetParty()->GetMemberMaxLevel());
|
|||
|
else
|
|||
|
lua_pushnumber(L, 1);
|
|||
|
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
struct FRunCinematicSender
|
|||
|
{
|
|||
|
std::string data;
|
|||
|
struct packet_script pack;
|
|||
|
|
|||
|
FRunCinematicSender(const char* str)
|
|||
|
{
|
|||
|
data = "[RUN_CINEMA value;";
|
|||
|
data += str;
|
|||
|
data += "]";
|
|||
|
|
|||
|
pack.header = HEADER_GC_SCRIPT;
|
|||
|
pack.skin = CQuestManager::QUEST_SKIN_CINEMATIC;
|
|||
|
//pack.skin = CQuestManager::QUEST_SKIN_NOWINDOW;
|
|||
|
pack.src_size = data.size();
|
|||
|
pack.size = pack.src_size + sizeof(struct packet_script);
|
|||
|
}
|
|||
|
|
|||
|
void operator()(LPCHARACTER ch)
|
|||
|
{
|
|||
|
sys_log(0, "CINEMASEND_TRY %s", ch->GetName());
|
|||
|
|
|||
|
if (ch->GetDesc())
|
|||
|
{
|
|||
|
sys_log(0, "CINEMASEND %s", ch->GetName());
|
|||
|
ch->GetDesc()->BufferedPacket(&pack, sizeof(struct packet_script));
|
|||
|
ch->GetDesc()->Packet(data.c_str(),data.size());
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
int party_run_cinematic(lua_State* L)
|
|||
|
{
|
|||
|
if (!lua_isstring(L, 1))
|
|||
|
return 0;
|
|||
|
|
|||
|
sys_log(0, "RUN_CINEMA %s", lua_tostring(L, 1));
|
|||
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|||
|
|
|||
|
if (ch->GetParty())
|
|||
|
{
|
|||
|
FRunCinematicSender f(lua_tostring(L, 1));
|
|||
|
|
|||
|
ch->GetParty()->Update();
|
|||
|
ch->GetParty()->ForEachNearMember(f);
|
|||
|
}
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
struct FCinematicSender
|
|||
|
{
|
|||
|
const char* str;
|
|||
|
struct ::packet_script packet_script;
|
|||
|
int len;
|
|||
|
|
|||
|
FCinematicSender(const char* str)
|
|||
|
: str(str)
|
|||
|
{
|
|||
|
len = strlen(str);
|
|||
|
|
|||
|
packet_script.header = HEADER_GC_SCRIPT;
|
|||
|
packet_script.skin = CQuestManager::QUEST_SKIN_CINEMATIC;
|
|||
|
packet_script.src_size = len;
|
|||
|
packet_script.size = packet_script.src_size + sizeof(struct packet_script);
|
|||
|
}
|
|||
|
|
|||
|
void operator()(LPCHARACTER ch)
|
|||
|
{
|
|||
|
sys_log(0, "CINEMASEND_TRY %s", ch->GetName());
|
|||
|
|
|||
|
if (ch->GetDesc())
|
|||
|
{
|
|||
|
sys_log(0, "CINEMASEND %s", ch->GetName());
|
|||
|
ch->GetDesc()->BufferedPacket(&packet_script, sizeof(struct packet_script));
|
|||
|
ch->GetDesc()->Packet(str,len);
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
int party_show_cinematic(lua_State* L)
|
|||
|
{
|
|||
|
if (!lua_isstring(L, 1))
|
|||
|
return 0;
|
|||
|
|
|||
|
sys_log(0, "CINEMA %s", lua_tostring(L, 1));
|
|||
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|||
|
|
|||
|
if (ch->GetParty())
|
|||
|
{
|
|||
|
FCinematicSender f(lua_tostring(L, 1));
|
|||
|
|
|||
|
ch->GetParty()->Update();
|
|||
|
ch->GetParty()->ForEachNearMember(f);
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
int party_get_near_count(lua_State* L)
|
|||
|
{
|
|||
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|||
|
|
|||
|
if (ch->GetParty())
|
|||
|
lua_pushnumber(L, ch->GetParty()->GetNearMemberCount());
|
|||
|
else
|
|||
|
lua_pushnumber(L, 0);
|
|||
|
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
int party_syschat(lua_State* L)
|
|||
|
{
|
|||
|
LPPARTY pParty = CQuestManager::Instance().GetCurrentCharacterPtr()->GetParty();
|
|||
|
|
|||
|
if (pParty)
|
|||
|
{
|
|||
|
ostringstream s;
|
|||
|
combine_lua_string(L, s);
|
|||
|
|
|||
|
FPartyChat f(CHAT_TYPE_INFO, s.str().c_str());
|
|||
|
|
|||
|
pParty->ForEachOnlineMember(f);
|
|||
|
}
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
int party_is_leader(lua_State* L)
|
|||
|
{
|
|||
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|||
|
|
|||
|
if (ch->GetParty() && ch->GetParty()->GetLeaderPID() == ch->GetPlayerID())
|
|||
|
lua_pushboolean(L, 1);
|
|||
|
else
|
|||
|
lua_pushboolean(L, 0);
|
|||
|
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
int party_is_party(lua_State* L)
|
|||
|
{
|
|||
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|||
|
lua_pushboolean(L, ch->GetParty() ? 1 : 0);
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
int party_get_leader_pid(lua_State* L)
|
|||
|
{
|
|||
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|||
|
if (ch->GetParty())
|
|||
|
{
|
|||
|
lua_pushnumber(L, ch->GetParty()->GetLeaderPID());
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
lua_pushnumber(L, -1);
|
|||
|
}
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int party_chat(lua_State* L)
|
|||
|
{
|
|||
|
LPPARTY pParty = CQuestManager::Instance().GetCurrentCharacterPtr()->GetParty();
|
|||
|
|
|||
|
if (pParty)
|
|||
|
{
|
|||
|
ostringstream s;
|
|||
|
combine_lua_string(L, s);
|
|||
|
|
|||
|
FPartyChat f(CHAT_TYPE_TALKING, s.str().c_str());
|
|||
|
|
|||
|
pParty->ForEachOnlineMember(f);
|
|||
|
}
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int party_is_map_member_flag_lt(lua_State* L)
|
|||
|
{
|
|||
|
|
|||
|
if (!lua_isstring(L, 1) || !lua_isnumber(L, 2))
|
|||
|
{
|
|||
|
lua_pushnumber(L, 0);
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
CQuestManager& q = CQuestManager::Instance();
|
|||
|
LPPARTY pParty = q.GetCurrentCharacterPtr()->GetParty();
|
|||
|
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
|||
|
PC* pPC = q.GetCurrentPC();
|
|||
|
|
|||
|
const char* sz = lua_tostring(L,1);
|
|||
|
|
|||
|
if (pParty)
|
|||
|
{
|
|||
|
FPartyCheckFlagLt f;
|
|||
|
f.flagname = pPC->GetCurrentQuestName() + "."+sz;
|
|||
|
f.value = (int) rint(lua_tonumber(L, 2));
|
|||
|
|
|||
|
bool returnBool = pParty->ForEachOnMapMemberBool(f, ch->GetMapIndex());
|
|||
|
lua_pushboolean(L, returnBool);
|
|||
|
}
|
|||
|
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
int party_set_flag(lua_State* L)
|
|||
|
{
|
|||
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|||
|
|
|||
|
if (ch->GetParty() && lua_isstring(L, 1) && lua_isnumber(L, 2))
|
|||
|
ch->GetParty()->SetFlag(lua_tostring(L, 1), (int)lua_tonumber(L, 2));
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
int party_get_flag(lua_State* L)
|
|||
|
{
|
|||
|
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
|||
|
|
|||
|
if (!ch->GetParty() || !lua_isstring(L, 1))
|
|||
|
lua_pushnumber(L, 0);
|
|||
|
else
|
|||
|
lua_pushnumber(L, ch->GetParty()->GetFlag(lua_tostring(L, 1)));
|
|||
|
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
int party_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));
|
|||
|
|
|||
|
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
|||
|
|
|||
|
if (ch->GetParty())
|
|||
|
ch->GetParty()->ForEachOnlineMember(f);
|
|||
|
else
|
|||
|
f(ch);
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
int party_is_in_dungeon (lua_State* L)
|
|||
|
{
|
|||
|
CQuestManager & q = CQuestManager::instance();
|
|||
|
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
|||
|
LPPARTY pParty = ch->GetParty();
|
|||
|
if (pParty != NULL){
|
|||
|
lua_pushboolean (L, pParty->GetDungeon() ? true : false);
|
|||
|
return 1;
|
|||
|
}
|
|||
|
lua_pushboolean (L, false);
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
struct FGiveBuff
|
|||
|
{
|
|||
|
DWORD dwType;
|
|||
|
BYTE bApplyOn;
|
|||
|
long lApplyValue;
|
|||
|
DWORD dwFlag;
|
|||
|
long lDuration;
|
|||
|
long lSPCost;
|
|||
|
bool bOverride;
|
|||
|
bool IsCube;
|
|||
|
|
|||
|
FGiveBuff (DWORD _dwType, BYTE _bApplyOn, long _lApplyValue, DWORD _dwFlag, long _lDuration,
|
|||
|
long _lSPCost, bool _bOverride, bool _IsCube = false)
|
|||
|
: dwType (_dwType), bApplyOn (_bApplyOn), lApplyValue (_lApplyValue), dwFlag(_dwFlag), lDuration(_lDuration),
|
|||
|
lSPCost(_lSPCost), bOverride(_bOverride), IsCube(_IsCube)
|
|||
|
{}
|
|||
|
void operator () (LPCHARACTER ch)
|
|||
|
{
|
|||
|
ch->AddAffect(dwType, bApplyOn, lApplyValue, dwFlag, lDuration, lSPCost, bOverride, IsCube);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>Լ<EFBFBD>.
|
|||
|
// <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20>ִ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>´<DEB4>.
|
|||
|
int party_give_buff (lua_State* L)
|
|||
|
{
|
|||
|
CQuestManager & q = CQuestManager::instance();
|
|||
|
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
|||
|
|
|||
|
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3) || !lua_isnumber(L, 4) ||
|
|||
|
!lua_isnumber(L, 5) || !lua_isnumber(L, 6) || !lua_isboolean(L, 7) || !lua_isboolean(L, 8))
|
|||
|
{
|
|||
|
lua_pushboolean (L, false);
|
|||
|
return 1;
|
|||
|
}
|
|||
|
DWORD dwType = lua_tonumber(L, 1);
|
|||
|
BYTE bApplyOn = lua_tonumber(L, 2);
|
|||
|
long lApplyValue = lua_tonumber(L, 3);
|
|||
|
DWORD dwFlag = lua_tonumber(L, 4);
|
|||
|
long lDuration = lua_tonumber(L, 5);
|
|||
|
long lSPCost = lua_tonumber(L, 6);
|
|||
|
bool bOverride = lua_toboolean(L, 7);
|
|||
|
bool IsCube = lua_toboolean(L, 8);
|
|||
|
|
|||
|
FGiveBuff f (dwType, bApplyOn, lApplyValue, dwFlag, lDuration, lSPCost, bOverride, IsCube);
|
|||
|
if (ch->GetParty())
|
|||
|
ch->GetParty()->ForEachOnMapMember(f, ch->GetMapIndex());
|
|||
|
else
|
|||
|
f(ch);
|
|||
|
|
|||
|
lua_pushboolean (L, true);
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
struct FPartyPIDCollector
|
|||
|
{
|
|||
|
std::vector <DWORD> vecPIDs;
|
|||
|
FPartyPIDCollector()
|
|||
|
{
|
|||
|
}
|
|||
|
void operator () (LPCHARACTER ch)
|
|||
|
{
|
|||
|
vecPIDs.push_back(ch->GetPlayerID());
|
|||
|
}
|
|||
|
};
|
|||
|
int party_get_member_pids(lua_State *L)
|
|||
|
{
|
|||
|
CQuestManager & q = CQuestManager::instance();
|
|||
|
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
|||
|
LPPARTY pParty = ch->GetParty();
|
|||
|
if (NULL == pParty)
|
|||
|
{
|
|||
|
return 0;
|
|||
|
}
|
|||
|
FPartyPIDCollector f;
|
|||
|
pParty->ForEachOnMapMember(f, ch->GetMapIndex());
|
|||
|
|
|||
|
for (std::vector <DWORD>::iterator it = f.vecPIDs.begin(); it != f.vecPIDs.end(); it++)
|
|||
|
{
|
|||
|
lua_pushnumber(L, *it);
|
|||
|
}
|
|||
|
return f.vecPIDs.size();
|
|||
|
}
|
|||
|
|
|||
|
void RegisterPartyFunctionTable()
|
|||
|
{
|
|||
|
luaL_reg party_functions[] =
|
|||
|
{
|
|||
|
{ "is_leader", party_is_leader },
|
|||
|
{ "is_party", party_is_party },
|
|||
|
{ "get_leader_pid", party_get_leader_pid},
|
|||
|
{ "setf", party_set_flag },
|
|||
|
{ "getf", party_get_flag },
|
|||
|
{ "setqf", party_set_quest_flag},
|
|||
|
{ "chat", party_chat },
|
|||
|
{ "syschat", party_syschat },
|
|||
|
{ "get_near_count", party_get_near_count},
|
|||
|
{ "show_cinematic", party_show_cinematic},
|
|||
|
{ "run_cinematic", party_run_cinematic },
|
|||
|
{ "get_max_level", party_get_max_level },
|
|||
|
{ "clear_ready", party_clear_ready },
|
|||
|
{ "is_in_dungeon", party_is_in_dungeon },
|
|||
|
{ "give_buff", party_give_buff },
|
|||
|
{ "is_map_member_flag_lt", party_is_map_member_flag_lt },
|
|||
|
{ "get_member_pids", party_get_member_pids }, // <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pid<69><64> return
|
|||
|
{ NULL, NULL }
|
|||
|
};
|
|||
|
|
|||
|
CQuestManager::instance().AddLuaFunctionTable("party", party_functions);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|