初步修复
This commit is contained in:
parent
8fc4357cc6
commit
e4714f3f0e
46705 changed files with 12004901 additions and 0 deletions
227
Server/ServerCommon/DnScriptManager.cpp
Normal file
227
Server/ServerCommon/DnScriptManager.cpp
Normal file
|
|
@ -0,0 +1,227 @@
|
|||
#include "stdafx.h"
|
||||
#include "DnScriptManager.h"
|
||||
#include "StringSet.h"
|
||||
#include "DnLuaAPIDefine.h"
|
||||
#include "DNQuest.h"
|
||||
#include "DNQuestManager.h"
|
||||
#include "DebugSet.h"
|
||||
|
||||
DnScriptManager* g_pNpcQuestScriptManager = NULL;
|
||||
|
||||
DnScriptManager::DnScriptManager()
|
||||
{
|
||||
RegistLuaAPI();
|
||||
}
|
||||
|
||||
DnScriptManager::~DnScriptManager()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool DnScriptManager::LoadScript(const char* szLuaFile, bool bIsCheckServer, int nLuaIndex, bool bQuestScript )
|
||||
{
|
||||
lua_State* pLua = OpenStateByIndex(nLuaIndex);
|
||||
if (!pLua) {
|
||||
g_Log.Log(LogType::_FILELOG, L"DnScriptManager::LoadScript(...) Failed !!! - !pLua (%S)\n", szLuaFile);
|
||||
DN_RETURN(false);
|
||||
}
|
||||
|
||||
CFileStream Stream( CEtResourceMng::GetInstance().GetFullName(szLuaFile).c_str() , CFileStream::OPEN_READ );
|
||||
|
||||
if ( Stream.IsValid() == false )
|
||||
{
|
||||
OutputDebug("Cannot open file : %s\n" , szLuaFile);
|
||||
g_Log.Log( LogType::_FILELOG, "Cannot open file : %s\n" , szLuaFile );
|
||||
DN_RETURN(false);
|
||||
}
|
||||
|
||||
int nLen = Stream.Size();
|
||||
if (0 >= nLen) {
|
||||
g_Log.Log(LogType::_FILELOG, L"DnScriptManager::LoadScript(...) Failed !!! - 0 >= nLen (1) (%d) (%S)\n", nLen, szLuaFile);
|
||||
DN_RETURN(false);
|
||||
}
|
||||
|
||||
char* pBuffer = new(std::nothrow) char[nLen+1];
|
||||
if (!pBuffer) {
|
||||
g_Log.Log(LogType::_FILELOG, L"DnScriptManager::LoadScript(...) Failed !!! - !pBuffer (%S)\n", szLuaFile);
|
||||
DN_RETURN(false);
|
||||
}
|
||||
|
||||
ZeroMemory(pBuffer, nLen+1);
|
||||
|
||||
class __Temp
|
||||
{
|
||||
public:
|
||||
__Temp(char* p) { m_p = p;}
|
||||
~__Temp() { delete[] m_p; }
|
||||
char* m_p;
|
||||
};
|
||||
__Temp ScopeDelete(pBuffer);
|
||||
|
||||
int nReadSize = Stream.Read(pBuffer, nLen);
|
||||
|
||||
if( nReadSize != nLen ) {
|
||||
g_Log.Log(LogType::_FILELOG, L"DnScriptManager::LoadScript(...) Failed !!! nLen (%d) != nReadSize (%d) (%S)\n", nLen, nReadSize, szLuaFile);
|
||||
DN_RETURN(false);
|
||||
}
|
||||
|
||||
std::string strErrMsg;
|
||||
|
||||
if (bIsCheckServer) {
|
||||
CStringSet pScriptRangeStx;
|
||||
CStringSet pScriptRangeEtx;
|
||||
#if defined(_VILLAGESERVER)
|
||||
pScriptRangeStx = _T("<VillageServer>");
|
||||
pScriptRangeEtx = _T("</VillageServer>");
|
||||
#elif defined(_GAMESERVER)
|
||||
pScriptRangeStx = _T("<GameServer>");
|
||||
pScriptRangeEtx = _T("</GameServer>");
|
||||
#endif // _VILLAGESERVER
|
||||
DN_ASSERT(0 < pScriptRangeStx.GetLength(), "Invalid!");
|
||||
DN_ASSERT(0 < pScriptRangeEtx.GetLength(), "Invalid!");
|
||||
|
||||
CStringSet LuaChunk = CA2T(pBuffer);
|
||||
|
||||
int nP1 = LuaChunk.Find(pScriptRangeStx.Get(), 0);
|
||||
if (0 > nP1) {
|
||||
g_Log.Log(LogType::_FILELOG, L"DnScriptManager::LoadScript(...) Failed !!! - LuaChunk.Find(pScriptRangeStx.Get(), 0) (%S)\n", szLuaFile);
|
||||
DN_RETURN(false);
|
||||
}
|
||||
|
||||
int nP2 = LuaChunk.Find(pScriptRangeEtx.Get(), 0);
|
||||
if (0 > nP2) {
|
||||
g_Log.Log(LogType::_FILELOG, L"DnScriptManager::LoadScript(...) Failed !!! - LuaChunk.Find(pScriptRangeEtx.Get(), 0) (%S)\n", szLuaFile);
|
||||
DN_RETURN(false);
|
||||
}
|
||||
|
||||
CStringSet LuaChunkSub = LuaChunk.Mid(nP1 + pScriptRangeStx.GetLength(), nP2 - nP1 - pScriptRangeStx.GetLength());
|
||||
if (0 >= LuaChunkSub.GetLength()) {
|
||||
g_Log.Log(LogType::_FILELOG, L"DnScriptManager::LoadScript(...) Failed !!! - LuaChunk.Mid(nP1 + pScriptRangeStx.GetLength(), nP2 - nP1 - pScriptRangeStx.GetLength()) (%S)\n", szLuaFile);
|
||||
DN_RETURN(false);
|
||||
}
|
||||
|
||||
if (!CheckLuaAPI(LuaChunkSub))
|
||||
{
|
||||
g_Log.Log(LogType::_FILELOG, L"DnScriptManager::LoadScript(...) Failed !!! - CheckLuaAPI (%S)\n", szLuaFile);
|
||||
#if !defined(_FINAL_BUILD)//rlkt_test
|
||||
DN_RETURN(false);
|
||||
#endif
|
||||
}
|
||||
|
||||
if(bQuestScript)
|
||||
CheckRemoteComplete(szLuaFile, LuaChunkSub);
|
||||
|
||||
if (lua_tinker::dobuffer(pLua, CT2A(LuaChunkSub.Get()), LuaChunkSub.GetLength(), &strErrMsg) != 0) {
|
||||
OutputDebug("Cannot open file : %s (%s)\n" , szLuaFile, strErrMsg.c_str());
|
||||
g_Log.Log( LogType::_FILELOG, "Cannot open file : %s (%s)\n" , szLuaFile, strErrMsg.c_str());
|
||||
DN_RETURN(false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (lua_tinker::dobuffer(pLua, pBuffer, nLen, &strErrMsg) != 0) {
|
||||
OutputDebug("Cannot open file : %s (%s)\n" , szLuaFile, strErrMsg.c_str());
|
||||
g_Log.Log( LogType::_FILELOG, "Cannot open file : %s (%s)\n" , szLuaFile, strErrMsg.c_str());
|
||||
DN_RETURN(false);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void DnScriptManager::RegistLuaAPI()
|
||||
{
|
||||
for( int i=0;; i++ )
|
||||
{
|
||||
if( g_szLuaAPIList[i] == NULL )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
m_mLuaAPI.insert(make_pair(g_szLuaAPIList[i], i));
|
||||
}
|
||||
}
|
||||
|
||||
bool DnScriptManager::IsValidLuaAPI(LPCSTR pApiName)
|
||||
{
|
||||
if (pApiName == NULL)
|
||||
return false;
|
||||
|
||||
std::map<std::string, int>::iterator iter = m_mLuaAPI.find(pApiName);
|
||||
if (iter != m_mLuaAPI.end())
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool DnScriptManager::CheckLuaAPI(CStringSet& LuaChunkSub)
|
||||
{
|
||||
CStringSet pScriptAPIStx = _T("api_");
|
||||
CStringSet pScriptAPIEtx = _T("(");
|
||||
CStringSet LuaChunkApi;
|
||||
|
||||
int nCurrentPos = 0;
|
||||
int nStartPos = 0;
|
||||
int nEndPos = 0;
|
||||
int nAPILength = 0;
|
||||
|
||||
while (true)
|
||||
{
|
||||
nStartPos = LuaChunkSub.Find(pScriptAPIStx.Get(), nCurrentPos);
|
||||
nCurrentPos = nStartPos;
|
||||
|
||||
if (nStartPos == -1)
|
||||
break;
|
||||
|
||||
nEndPos = LuaChunkSub.Find(pScriptAPIEtx.Get(), nCurrentPos);
|
||||
nCurrentPos = nEndPos;
|
||||
|
||||
nAPILength = nEndPos - nStartPos;
|
||||
if (nAPILength < 0)
|
||||
return false;
|
||||
|
||||
LuaChunkApi.Reset();
|
||||
LuaChunkApi = LuaChunkSub.Mid (nStartPos, nAPILength);
|
||||
|
||||
LuaChunkApi.Trim(); // °ø¹éÁ¦°Å
|
||||
|
||||
LPCSTR pApiName = LuaChunkApi.GetA();
|
||||
if (!IsValidLuaAPI (pApiName))
|
||||
{
|
||||
|
||||
CDebugSet::ToFile("Invalid LuaAPI : %s\n" , pApiName);
|
||||
g_Log.Log( LogType::_FILELOG, "Invalid LuaAPI : %s\n" , pApiName);
|
||||
free((VOID*)pApiName);
|
||||
return false;
|
||||
}
|
||||
free((VOID*)pApiName);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void DnScriptManager::CheckRemoteComplete(const char* szLuaFile, CStringSet& LuaChunkSub)
|
||||
{
|
||||
CStringSet pScriptAPI = _T("_CanRemoteCompleteStep");
|
||||
int nPos = LuaChunkSub.Find(pScriptAPI.Get(), 0);
|
||||
if(0 < nPos)
|
||||
return;
|
||||
|
||||
std::vector<std::string> paths;
|
||||
TokenizeA(szLuaFile, paths, "\\");
|
||||
|
||||
if(paths.size() < 1)
|
||||
return;
|
||||
|
||||
std::vector<std::string> tokens;
|
||||
TokenizeA(paths[paths.size() - 1], tokens, "_");
|
||||
|
||||
if(tokens.size() < 2)
|
||||
return;
|
||||
|
||||
int nQuestIndex = atoi(tokens[1].c_str());
|
||||
CDNQuest * pQuest = g_pQuestManager->GetQuest( nQuestIndex );
|
||||
if(!pQuest)
|
||||
return;
|
||||
|
||||
pQuest->GetQuestInfo().bCheckRemoteComplete = false;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue