root/trunk/src/trinitycore/WorldRunnable.cpp @ 39

Revision 6, 3.1 kB (checked in by yumileroy, 17 years ago)

[svn] * Added ACE for Linux and Windows (Thanks Derex for Linux part and partial Windows part)
* Updated to 6721 and 676
* Fixed TrinityScript? logo
* Version updated to 0.2.6721.676

Original author: Neo2003
Date: 2008-10-04 06:17:19-05:00

Line 
1/*
2 * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 */
18
19/** \file
20    \ingroup mangosd
21*/
22
23#include "WorldSocketMgr.h"
24#include "Common.h"
25#include "World.h"
26#include "WorldRunnable.h"
27#include "Timer.h"
28#include "ObjectAccessor.h"
29#include "MapManager.h"
30
31#include "Database/DatabaseEnv.h"
32
33#ifdef WIN32
34#define WORLD_SLEEP_CONST 50
35#else
36#define WORLD_SLEEP_CONST 100                               //Is this still needed?? [On linux some time ago not working 50ms]
37#endif
38
39/// Heartbeat for the World
40void WorldRunnable::run()
41{
42    ///- Init new SQL thread for the world database
43    WorldDatabase.ThreadStart();                                // let thread do safe mySQL requests (one connection call enough)
44    sWorld.InitResultQueue();
45
46    uint32 realCurrTime = 0;
47    uint32 realPrevTime = getMSTime();
48
49    uint32 prevSleepTime = 0;                               // used for balanced full tick time length near WORLD_SLEEP_CONST
50
51    ///- While we have not World::m_stopEvent, update the world
52    while (!World::m_stopEvent)
53    {
54        ++World::m_worldLoopCounter;
55        realCurrTime = getMSTime();
56
57        uint32 diff = getMSTimeDiff(realPrevTime,realCurrTime);
58
59        sWorld.Update( diff );
60        realPrevTime = realCurrTime;
61
62        // diff (D0) include time of previous sleep (d0) + tick time (t0)
63        // we want that next d1 + t1 == WORLD_SLEEP_CONST
64        // we can't know next t1 and then can use (t0 + d1) == WORLD_SLEEP_CONST requirement
65        // d1 = WORLD_SLEEP_CONST - t0 = WORLD_SLEEP_CONST - (D0 - d0) = WORLD_SLEEP_CONST + d0 - D0
66        if (diff <= WORLD_SLEEP_CONST+prevSleepTime)
67        {
68            prevSleepTime = WORLD_SLEEP_CONST+prevSleepTime-diff;
69            ZThread::Thread::sleep(prevSleepTime);
70        }
71        else
72            prevSleepTime = 0;
73    }
74
75    sWorld.KickAllQueued();                                 // kick all queued players (and prevent its login at kick in game players)
76    sWorld.KickAll();                                       // save and kick all players
77    sWorld.UpdateSessions( 1 );                             // real players unload required UpdateSessions call
78   
79    sWorldSocketMgr->StopNetwork();
80
81    MapManager::Instance().UnloadAll();                     // unload all grids (including locked in memory)
82
83    ///- End the database thread
84    WorldDatabase.ThreadEnd();                                  // free mySQL thread resources
85}
Note: See TracBrowser for help on using the browser.