Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
This commit is contained in:
commit
339ddf5e83
4 files changed
+73
-47
No files matched your search
@@ -704,29 +704,8 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
{
|
||||
if (e.GetScriptType() == SMART_SCRIPT_TYPE_CREATURE)
|
||||
{
|
||||
uint32 entry = 0;
|
||||
if (e.entryOrGuid >= 0)
|
||||
entry = e.entryOrGuid;
|
||||
else
|
||||
{
|
||||
if (CreatureData const* creatureData = sObjectMgr->GetCreatureData(uint32(abs(e.entryOrGuid))))
|
||||
entry = creatureData->id;
|
||||
}
|
||||
|
||||
CreatureTextMap::const_iterator sList = sCreatureTextMgr->GetTextMap().find(entry);
|
||||
if (sList == sCreatureTextMgr->GetTextMap().end())
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u could not find Text for Creature %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), entry);
|
||||
if (!IsTextValid(e, e.action.talk.textGroupID))
|
||||
return false;
|
||||
}
|
||||
|
||||
CreatureTextHolder const& textHolder = sList->second;
|
||||
CreatureTextHolder::const_iterator itr = textHolder.find(e.action.talk.textGroupID);
|
||||
if (itr == textHolder.end())
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u could not find TextGroup %u for Creature %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.talk.textGroupID, entry);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1207,13 +1186,15 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
return true;
|
||||
}
|
||||
|
||||
/*bool SmartAIMgr::IsTextValid(SmartScriptHolder const& e, uint32 id) // unused
|
||||
bool SmartAIMgr::IsTextValid(SmartScriptHolder const& e, uint32 id) // unused
|
||||
{
|
||||
bool error = false;
|
||||
uint32 entry = 0;
|
||||
|
||||
if (e.entryOrGuid >= 0)
|
||||
entry = uint32(e.entryOrGuid);
|
||||
else {
|
||||
else
|
||||
{
|
||||
entry = uint32(abs(e.entryOrGuid));
|
||||
CreatureData const* data = sObjectMgr->GetCreatureData(entry);
|
||||
if (!data)
|
||||
@@ -1224,15 +1205,18 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
else
|
||||
entry = data->id;
|
||||
}
|
||||
|
||||
if (!entry || !sCreatureTextMgr->TextExist(entry, uint8(id)))
|
||||
error = true;
|
||||
|
||||
if (error)
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u using non-existent Text id %d, skipped.", e.entryOrGuid, e.GetScriptType(), e.source_type, e.GetActionType(), id);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}*/
|
||||
}
|
||||
|
||||
void SmartAIMgr::LoadHelperStores()
|
||||
{
|
||||
|
||||
@@ -1614,7 +1614,7 @@ class SmartAIMgr
|
||||
return true;
|
||||
}
|
||||
|
||||
//bool IsTextValid(SmartScriptHolder const& e, uint32 id);
|
||||
bool IsTextValid(SmartScriptHolder const& e, uint32 id);
|
||||
|
||||
// Helpers
|
||||
void LoadHelperStores();
|
||||
|
||||
@@ -165,6 +165,7 @@ class boss_prince_taldaram : public CreatureScript
|
||||
{
|
||||
Talk(SAY_VANISH);
|
||||
DoCast(me, SPELL_VANISH);
|
||||
me->SetInCombatState(true); // Prevents the boss from resetting
|
||||
events.DelayEvents(500);
|
||||
events.ScheduleEvent(EVENT_JUST_VANISHED, 500);
|
||||
if (Unit* embraceTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
|
||||
@@ -88,6 +88,7 @@ bool StartDB();
|
||||
void StopDB();
|
||||
void WorldUpdateLoop();
|
||||
void ClearOnlineAccounts();
|
||||
void ShutdownCLIThread(std::thread* cliThread);
|
||||
void ShutdownThreadPool(std::vector<std::thread>& threadPool);
|
||||
variables_map GetConsoleArguments(int argc, char** argv, std::string& cfg_file, std::string& cfg_service);
|
||||
|
||||
@@ -277,27 +278,7 @@ extern int main(int argc, char** argv)
|
||||
|
||||
TC_LOG_INFO("server.worldserver", "Halting process...");
|
||||
|
||||
if (cliThread != nullptr)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (!CancelSynchronousIo(cliThread->native_handle()))
|
||||
{
|
||||
DWORD errorCode = GetLastError();
|
||||
LPSTR errorBuffer;
|
||||
|
||||
DWORD formatReturnCode = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
nullptr, errorCode, 0, (LPTSTR)&errorBuffer, 0, nullptr);
|
||||
if (!formatReturnCode)
|
||||
errorBuffer = "Unknown error";
|
||||
|
||||
TC_LOG_ERROR("server.worldserver", "Error cancelling I/O of CliThread, error code %u, detail: %s",
|
||||
errorCode, errorBuffer);
|
||||
LocalFree(errorBuffer);
|
||||
}
|
||||
#endif
|
||||
cliThread->join();
|
||||
delete cliThread;
|
||||
}
|
||||
ShutdownCLIThread(cliThread);
|
||||
|
||||
OpenSSLCrypto::threadsCleanup();
|
||||
|
||||
@@ -308,6 +289,66 @@ extern int main(int argc, char** argv)
|
||||
return World::GetExitCode();
|
||||
}
|
||||
|
||||
void ShutdownCLIThread(std::thread* cliThread)
|
||||
{
|
||||
if (cliThread != nullptr)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
// First try to cancel any I/O in the CLI thread
|
||||
if (!CancelSynchronousIo(cliThread->native_handle()))
|
||||
{
|
||||
// if CancelSynchronousIo() fails, print the error and try with old way
|
||||
DWORD errorCode = GetLastError();
|
||||
LPSTR errorBuffer;
|
||||
|
||||
DWORD formatReturnCode = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
nullptr, errorCode, 0, (LPTSTR)&errorBuffer, 0, nullptr);
|
||||
if (!formatReturnCode)
|
||||
errorBuffer = "Unknown error";
|
||||
|
||||
TC_LOG_DEBUG("server.worldserver", "Error cancelling I/O of CliThread, error code %u, detail: %s",
|
||||
errorCode, errorBuffer);
|
||||
LocalFree(errorBuffer);
|
||||
|
||||
// send keyboard input to safely unblock the CLI thread
|
||||
INPUT_RECORD b[4];
|
||||
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
|
||||
b[0].EventType = KEY_EVENT;
|
||||
b[0].Event.KeyEvent.bKeyDown = TRUE;
|
||||
b[0].Event.KeyEvent.uChar.AsciiChar = 'X';
|
||||
b[0].Event.KeyEvent.wVirtualKeyCode = 'X';
|
||||
b[0].Event.KeyEvent.wRepeatCount = 1;
|
||||
|
||||
b[1].EventType = KEY_EVENT;
|
||||
b[1].Event.KeyEvent.bKeyDown = FALSE;
|
||||
b[1].Event.KeyEvent.uChar.AsciiChar = 'X';
|
||||
b[1].Event.KeyEvent.wVirtualKeyCode = 'X';
|
||||
b[1].Event.KeyEvent.wRepeatCount = 1;
|
||||
|
||||
b[2].EventType = KEY_EVENT;
|
||||
b[2].Event.KeyEvent.bKeyDown = TRUE;
|
||||
b[2].Event.KeyEvent.dwControlKeyState = 0;
|
||||
b[2].Event.KeyEvent.uChar.AsciiChar = '\r';
|
||||
b[2].Event.KeyEvent.wVirtualKeyCode = VK_RETURN;
|
||||
b[2].Event.KeyEvent.wRepeatCount = 1;
|
||||
b[2].Event.KeyEvent.wVirtualScanCode = 0x1c;
|
||||
|
||||
b[3].EventType = KEY_EVENT;
|
||||
b[3].Event.KeyEvent.bKeyDown = FALSE;
|
||||
b[3].Event.KeyEvent.dwControlKeyState = 0;
|
||||
b[3].Event.KeyEvent.uChar.AsciiChar = '\r';
|
||||
b[3].Event.KeyEvent.wVirtualKeyCode = VK_RETURN;
|
||||
b[3].Event.KeyEvent.wVirtualScanCode = 0x1c;
|
||||
b[3].Event.KeyEvent.wRepeatCount = 1;
|
||||
DWORD numb;
|
||||
WriteConsoleInput(hStdIn, b, 4, &numb);
|
||||
}
|
||||
#endif
|
||||
cliThread->join();
|
||||
delete cliThread;
|
||||
}
|
||||
}
|
||||
|
||||
void ShutdownThreadPool(std::vector<std::thread>& threadPool)
|
||||
{
|
||||
sScriptMgr->OnNetworkStop();
|
||||
|
||||
Reference in new issue
Block a user