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

426 lines
9.7 KiB
C++
Raw Normal View History

2022-03-05 12:44:06 +02:00
#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);
}
}