forked from metin2/server
470 lines
10 KiB
C++
470 lines
10 KiB
C++
#include "stdafx.h"
|
||
|
||
#include "questlua.h"
|
||
#include "questmanager.h"
|
||
#include "desc_client.h"
|
||
#include "char.h"
|
||
#include "char_manager.h"
|
||
#include "utils.h"
|
||
#include "guild.h"
|
||
#include "guild_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
|
||
|
||
namespace quest
|
||
{
|
||
//
|
||
// "guild" Lua functions
|
||
//
|
||
int guild_around_ranking_string(lua_State* L)
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
||
if (!ch->GetGuild())
|
||
lua_pushstring(L,"");
|
||
else
|
||
{
|
||
char szBuf[4096+1];
|
||
CGuildManager::instance().GetAroundRankString(ch->GetGuild()->GetID(), szBuf, sizeof(szBuf));
|
||
lua_pushstring(L, szBuf);
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
int guild_high_ranking_string(lua_State* L)
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
||
DWORD dwMyGuild = 0;
|
||
if (ch->GetGuild())
|
||
dwMyGuild = ch->GetGuild()->GetID();
|
||
|
||
char szBuf[4096+1];
|
||
CGuildManager::instance().GetHighRankString(dwMyGuild, szBuf, sizeof(szBuf));
|
||
lua_pushstring(L, szBuf);
|
||
return 1;
|
||
}
|
||
|
||
int guild_get_ladder_point(lua_State* L)
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
||
if (!ch->GetGuild())
|
||
{
|
||
lua_pushnumber(L, -1);
|
||
}
|
||
else
|
||
{
|
||
lua_pushnumber(L, ch->GetGuild()->GetLadderPoint());
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
int guild_get_rank(lua_State* L)
|
||
{
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
||
|
||
if (!ch->GetGuild())
|
||
{
|
||
lua_pushnumber(L, -1);
|
||
}
|
||
else
|
||
{
|
||
lua_pushnumber(L, CGuildManager::instance().GetRank(ch->GetGuild()));
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
int guild_is_war(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
sys_err("invalid argument");
|
||
return 0;
|
||
}
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (ch->GetGuild() && ch->GetGuild()->UnderWar((DWORD) lua_tonumber(L, 1)))
|
||
lua_pushboolean(L, true);
|
||
else
|
||
lua_pushboolean(L, false);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int guild_name(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
sys_err("invalid argument");
|
||
return 0;
|
||
}
|
||
|
||
CGuild * pkGuild = CGuildManager::instance().FindGuild((DWORD) lua_tonumber(L, 1));
|
||
|
||
if (pkGuild)
|
||
lua_pushstring(L, pkGuild->GetName());
|
||
else
|
||
lua_pushstring(L, "");
|
||
|
||
return 1;
|
||
}
|
||
|
||
int guild_level(lua_State* L)
|
||
{
|
||
luaL_checknumber(L, 1);
|
||
|
||
CGuild * pkGuild = CGuildManager::instance().FindGuild((DWORD) lua_tonumber(L, 1));
|
||
|
||
if (pkGuild)
|
||
lua_pushnumber(L, pkGuild->GetLevel());
|
||
else
|
||
lua_pushnumber(L, 0);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int guild_war_enter(lua_State* L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
sys_err("invalid argument");
|
||
return 0;
|
||
}
|
||
|
||
CQuestManager& q = CQuestManager::instance();
|
||
LPCHARACTER ch = q.GetCurrentCharacterPtr();
|
||
|
||
if (ch->GetGuild())
|
||
ch->GetGuild()->GuildWarEntryAccept((DWORD) lua_tonumber(L, 1), ch);
|
||
|
||
return 0;
|
||
}
|
||
|
||
int guild_get_any_war(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if (ch->GetGuild())
|
||
lua_pushnumber(L, ch->GetGuild()->UnderAnyWar());
|
||
else
|
||
lua_pushnumber(L, 0);
|
||
|
||
return 1;
|
||
}
|
||
|
||
int guild_get_name(lua_State * L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
lua_pushstring(L, "");
|
||
return 1;
|
||
}
|
||
|
||
CGuild * pkGuild = CGuildManager::instance().FindGuild((DWORD) lua_tonumber(L, 1));
|
||
|
||
if (pkGuild)
|
||
lua_pushstring(L, pkGuild->GetName());
|
||
else
|
||
lua_pushstring(L, "");
|
||
|
||
return 1;
|
||
}
|
||
|
||
int guild_war_bet(lua_State * L)
|
||
{
|
||
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3))
|
||
{
|
||
sys_err("invalid argument");
|
||
return 0;
|
||
}
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
TPacketGDGuildWarBet p;
|
||
|
||
p.dwWarID = (DWORD) lua_tonumber(L, 1);
|
||
strncpy(p.szLogin, ch->GetDesc()->GetAccountTable().login, sizeof(p.szLogin));
|
||
p.dwGuild = (DWORD) lua_tonumber(L, 2);
|
||
p.dwGold = (DWORD) lua_tonumber(L, 3);
|
||
|
||
sys_log(0, "GUILD_WAR_BET: %s login %s war_id %u guild %u gold %u",
|
||
ch->GetName(), p.szLogin, p.dwWarID, p.dwGuild, p.dwGold);
|
||
|
||
db_clientdesc->DBPacket(HEADER_GD_GUILD_WAR_BET, 0, &p, sizeof(p));
|
||
return 0;
|
||
}
|
||
|
||
int guild_is_bet(lua_State * L)
|
||
{
|
||
if (!lua_isnumber(L, 1))
|
||
{
|
||
sys_err("invalid argument");
|
||
lua_pushboolean(L, true);
|
||
return 1;
|
||
}
|
||
|
||
bool bBet = CGuildManager::instance().IsBet((DWORD) lua_tonumber(L, 1),
|
||
CQuestManager::instance().GetCurrentCharacterPtr()->GetDesc()->GetAccountTable().login);
|
||
|
||
lua_pushboolean(L, bBet);
|
||
return 1;
|
||
}
|
||
|
||
int guild_get_warp_war_list(lua_State* L)
|
||
{
|
||
FBuildLuaGuildWarList f(L);
|
||
CGuildManager::instance().for_each_war(f);
|
||
return 1;
|
||
}
|
||
|
||
int guild_get_reserve_war_table(lua_State * L)
|
||
{
|
||
std::vector<CGuildWarReserveForGame *> & con = CGuildManager::instance().GetReserveWarRef();
|
||
|
||
int i = 0;
|
||
std::vector<CGuildWarReserveForGame *>::iterator it = con.begin();
|
||
|
||
sys_log(0, "con.size(): %d", con.size());
|
||
|
||
// stack : table1
|
||
lua_newtable(L);
|
||
|
||
while (it != con.end())
|
||
{
|
||
TGuildWarReserve * p = &(*(it++))->data;
|
||
|
||
if (p->bType != GUILD_WAR_TYPE_BATTLE)
|
||
continue;
|
||
|
||
lua_newtable(L);
|
||
|
||
sys_log(0, "con.size(): %u %u %u handi %d", p->dwID, p->dwGuildFrom, p->dwGuildTo, p->lHandicap);
|
||
|
||
// stack : table1 table2
|
||
lua_pushnumber(L, p->dwID);
|
||
// stack : table1 table2 dwID
|
||
lua_rawseti(L, -2, 1);
|
||
|
||
// stack : table1 table2
|
||
if (p->lPowerFrom > p->lPowerTo)
|
||
lua_pushnumber(L, p->dwGuildFrom);
|
||
else
|
||
lua_pushnumber(L, p->dwGuildTo);
|
||
// stack : table1 table2 guildfrom
|
||
lua_rawseti(L, -2, 2);
|
||
|
||
// stack : table1 table2
|
||
if (p->lPowerFrom > p->lPowerTo)
|
||
lua_pushnumber(L, p->dwGuildTo);
|
||
else
|
||
lua_pushnumber(L, p->dwGuildFrom);
|
||
// stack : table1 table2 guildto
|
||
lua_rawseti(L, -2, 3);
|
||
|
||
lua_pushnumber(L, p->lHandicap);
|
||
lua_rawseti(L, -2, 4);
|
||
|
||
// stack : table1 table2
|
||
lua_rawseti(L, -2, ++i);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int guild_get_member_count(lua_State* L)
|
||
{
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
if ( ch == NULL )
|
||
{
|
||
lua_pushnumber(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
CGuild* pGuild = ch->GetGuild();
|
||
|
||
if ( pGuild == NULL )
|
||
{
|
||
lua_pushnumber(L, 0);
|
||
return 1;
|
||
}
|
||
|
||
lua_pushnumber(L, pGuild->GetMemberCount());
|
||
|
||
return 1;
|
||
}
|
||
|
||
int guild_change_master(lua_State* L)
|
||
{
|
||
// <20><><EFBFBD>ϰ<EFBFBD>
|
||
// 0 : <20>Է<EFBFBD><D4B7><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>߸<EFBFBD><DFB8>Ǿ<EFBFBD><C7BE><EFBFBD> ( <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20>ƴ<EFBFBD> )
|
||
// 1 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
|
||
// 2 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
// 3 : <20><>û <20><><EFBFBD><EFBFBD>
|
||
// 4 : <20><><EFBFBD>尡 <20><><EFBFBD><EFBFBD>
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
CGuild* pGuild = ch->GetGuild();
|
||
|
||
if ( pGuild != NULL )
|
||
{
|
||
if ( pGuild->GetMasterPID() == ch->GetPlayerID() )
|
||
{
|
||
if ( lua_isstring(L, 1) == false )
|
||
{
|
||
lua_pushnumber(L, 0);
|
||
}
|
||
else
|
||
{
|
||
bool ret = pGuild->ChangeMasterTo(pGuild->GetMemberPID(lua_tostring(L, 1)));
|
||
|
||
lua_pushnumber(L, ret == false ? 2 : 3 );
|
||
}
|
||
}
|
||
else
|
||
{
|
||
lua_pushnumber(L, 1);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
lua_pushnumber(L, 4);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int guild_change_master_with_limit(lua_State* L)
|
||
{
|
||
// <20><><EFBFBD><EFBFBD>
|
||
// arg0 : <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
|
||
// arg1 : <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
// arg2 : resign_limit <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>
|
||
// arg3 : be_other_leader <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>
|
||
// arg4 : be_other_member <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>
|
||
// arg5 : ij<><C4B3><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD> <20>ƴѰ<C6B4>
|
||
//
|
||
// <20><><EFBFBD>ϰ<EFBFBD>
|
||
// 0 : <20>Է<EFBFBD><D4B7><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>߸<EFBFBD><DFB8>Ǿ<EFBFBD><C7BE><EFBFBD> ( <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20>ƴ<EFBFBD> )
|
||
// 1 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
|
||
// 2 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
// 3 : <20><>û <20><><EFBFBD><EFBFBD>
|
||
// 4 : <20><><EFBFBD>尡 <20><><EFBFBD><EFBFBD>
|
||
// 5 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>¶<EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
|
||
// 6 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
// 7 : <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> be_other_leader <20><><EFBFBD>ѿ<EFBFBD> <20>ɸ<EFBFBD>
|
||
|
||
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
|
||
|
||
CGuild* pGuild = ch->GetGuild();
|
||
|
||
if ( pGuild != NULL )
|
||
{
|
||
if ( pGuild->GetMasterPID() == ch->GetPlayerID() )
|
||
{
|
||
if ( lua_isstring(L, 1) == false )
|
||
{
|
||
lua_pushnumber(L, 0);
|
||
}
|
||
else
|
||
{
|
||
LPCHARACTER pNewMaster = CHARACTER_MANAGER::instance().FindPC( lua_tostring(L,1) );
|
||
|
||
if ( pNewMaster != NULL )
|
||
{
|
||
if ( pNewMaster->GetLevel() < lua_tonumber(L, 2) )
|
||
{
|
||
lua_pushnumber(L, 6);
|
||
}
|
||
else
|
||
{
|
||
int nBeOtherLeader = pNewMaster->GetQuestFlag("change_guild_master.be_other_leader");
|
||
CQuestManager::instance().GetPC( ch->GetPlayerID() );
|
||
|
||
if ( lua_toboolean(L, 6) == true ) nBeOtherLeader = 0;
|
||
|
||
if ( nBeOtherLeader > get_global_time() )
|
||
{
|
||
lua_pushnumber(L, 7);
|
||
}
|
||
else
|
||
{
|
||
bool ret = pGuild->ChangeMasterTo(pGuild->GetMemberPID(lua_tostring(L, 1)));
|
||
|
||
if ( ret == false )
|
||
{
|
||
lua_pushnumber(L, 2);
|
||
}
|
||
else
|
||
{
|
||
lua_pushnumber(L, 3);
|
||
|
||
pNewMaster->SetQuestFlag("change_guild_master.be_other_leader", 0);
|
||
pNewMaster->SetQuestFlag("change_guild_master.be_other_member", 0);
|
||
pNewMaster->SetQuestFlag("change_guild_master.resign_limit", (int)lua_tonumber(L, 3));
|
||
|
||
ch->SetQuestFlag("change_guild_master.be_other_leader", (int)lua_tonumber(L, 4));
|
||
ch->SetQuestFlag("change_guild_master.be_other_member", (int)lua_tonumber(L, 5));
|
||
ch->SetQuestFlag("change_guild_master.resign_limit", 0);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
lua_pushnumber(L, 5);
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
lua_pushnumber(L, 1);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
lua_pushnumber(L, 4);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
void RegisterGuildFunctionTable()
|
||
{
|
||
luaL_reg guild_functions[] =
|
||
{
|
||
{ "get_rank", guild_get_rank },
|
||
{ "get_ladder_point", guild_get_ladder_point },
|
||
{ "high_ranking_string", guild_high_ranking_string },
|
||
{ "around_ranking_string", guild_around_ranking_string },
|
||
{ "name", guild_name },
|
||
{ "level", guild_level },
|
||
{ "is_war", guild_is_war },
|
||
{ "war_enter", guild_war_enter },
|
||
{ "get_any_war", guild_get_any_war },
|
||
{ "get_reserve_war_table", guild_get_reserve_war_table },
|
||
{ "get_name", guild_get_name },
|
||
{ "war_bet", guild_war_bet },
|
||
{ "is_bet", guild_is_bet },
|
||
{ "get_warp_war_list", guild_get_warp_war_list },
|
||
{ "get_member_count", guild_get_member_count },
|
||
{ "change_master", guild_change_master },
|
||
{ "change_master_with_limit", guild_change_master_with_limit },
|
||
|
||
{ NULL, NULL }
|
||
};
|
||
|
||
CQuestManager::instance().AddLuaFunctionTable("guild", guild_functions);
|
||
}
|
||
}
|
||
|