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

426 lines
9.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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