server/game/src/questlua_guild.cpp

470 lines
10 KiB
C++
Raw Blame History

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