mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-27 06:47:45 +00:00
Fixed zone updates being extremly slow, fixed crash with wrong item reward field, fixed wrong casttime for eventAction
This commit is contained in:
parent
7a23d24336
commit
ab30d8b344
7 changed files with 45 additions and 34 deletions
|
@ -28,7 +28,7 @@ Core::Action::EventAction::EventAction( Entity::ActorPtr pActor, uint32_t eventI
|
|||
m_handleActionType = HandleActionType::Event;
|
||||
m_eventId = eventId;
|
||||
m_id = action;
|
||||
m_castTime = g_exdDataGen.getEventAction( action )->castTime; // TODO: Add security checks.
|
||||
m_castTime = g_exdDataGen.getEventAction( action )->castTime * 100; // TODO: Add security checks.
|
||||
m_onActionFinishClb = finishRef;
|
||||
m_onActionInterruptClb = interruptRef;
|
||||
m_pSource = pActor;
|
||||
|
|
|
@ -1043,7 +1043,7 @@ bool Core::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t optional
|
|||
for( uint32_t i = 0; i < questInfo->itemReward0.size(); i++ )
|
||||
{
|
||||
// TODO: add the correct amount of items instead of 1
|
||||
addItem( -1, questInfo->itemReward0.at( i ), questInfo->itemReward1.at( i ) );
|
||||
addItem( -1, questInfo->itemReward0.at( i ), questInfo->itemCountReward0.at( i ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -282,7 +282,7 @@ void Core::ServerZone::mainLoop()
|
|||
auto it = this->m_sessionMapById.begin();
|
||||
for( ; it != this->m_sessionMapById.end(); )
|
||||
{
|
||||
uint32_t diff = currTime - it->second->getLastDataTime();
|
||||
int64_t diff = currTime - it->second->getLastDataTime();
|
||||
|
||||
auto pPlayer = it->second->getPlayer();
|
||||
|
||||
|
|
|
@ -126,6 +126,7 @@ bool Core::TerritoryMgr::createDefaultTerritories()
|
|||
instanceMap[guid] = pZone;
|
||||
m_instanceIdToZonePtrMap[guid] = pZone;
|
||||
m_territoryInstanceMap[territoryId] = instanceMap;
|
||||
m_zoneSet.insert( { pZone } );
|
||||
|
||||
}
|
||||
|
||||
|
@ -180,6 +181,7 @@ Core::ZonePtr Core::TerritoryMgr::createInstanceContent( uint32_t instanceConten
|
|||
|
||||
m_instanceContentToInstanceMap[instanceContentId][pZone->getGuId()] = pZone;
|
||||
m_instanceIdToZonePtrMap[pZone->getGuId()] = pZone;
|
||||
m_instanceZoneSet.insert( { pZone } );
|
||||
|
||||
return pZone;
|
||||
}
|
||||
|
@ -192,6 +194,9 @@ bool Core::TerritoryMgr::removeTerritoryInstance( uint32_t instanceId )
|
|||
|
||||
m_instanceIdToZonePtrMap.erase( pZone->getGuId() );
|
||||
|
||||
if( m_instanceZoneSet.count( pZone ) )
|
||||
m_instanceZoneSet.erase( pZone );
|
||||
|
||||
if( isInstanceContentTerritory( pZone->getTerritoryId() ) )
|
||||
{
|
||||
auto instance = boost::dynamic_pointer_cast< InstanceContent >( pZone );
|
||||
|
@ -268,16 +273,14 @@ Core::ZonePtr Core::TerritoryMgr::getZoneByTerriId( uint32_t territoryId ) const
|
|||
|
||||
void Core::TerritoryMgr::updateTerritoryInstances( uint32_t currentTime )
|
||||
{
|
||||
for( auto zoneMap : m_territoryInstanceMap )
|
||||
for( auto& zone : m_zoneSet )
|
||||
{
|
||||
for( auto zone : zoneMap.second )
|
||||
zone.second->runZoneLogic( currentTime );
|
||||
zone->runZoneLogic( currentTime );
|
||||
}
|
||||
|
||||
for( auto zoneMap : m_instanceContentToInstanceMap )
|
||||
for( auto& zone : m_instanceZoneSet )
|
||||
{
|
||||
for( auto zone: zoneMap.second )
|
||||
zone.second->runZoneLogic( currentTime );
|
||||
zone->runZoneLogic( currentTime );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include <common/Exd/ExdData.h>
|
||||
#include "Forwards.h"
|
||||
#include <set>
|
||||
|
||||
namespace Core
|
||||
{
|
||||
|
@ -139,6 +140,12 @@ namespace Core
|
|||
/*! internal counter for instanceIds */
|
||||
uint32_t m_lastInstanceId;
|
||||
|
||||
/*! set of ZonePtrs for quick iteration*/
|
||||
std::set< ZonePtr > m_zoneSet;
|
||||
|
||||
/*! set of ZonePtrs for quick iteration*/
|
||||
std::set< ZonePtr > m_instanceZoneSet;
|
||||
|
||||
public:
|
||||
/*! returns a list of instanceContent InstanceIds currently active */
|
||||
InstanceIdList getInstanceContentIdList( uint16_t instanceContentId ) const;
|
||||
|
|
|
@ -62,8 +62,27 @@ Zone::Zone( uint16_t territoryId, uint32_t guId, const std::string& internalName
|
|||
m_placeName = placeName;
|
||||
m_lastMobUpdate = 0;
|
||||
|
||||
m_currentWeather = getNextWeather();
|
||||
m_weatherOverride = 0;
|
||||
m_territoryTypeInfo = g_exdDataGen.getTerritoryType( territoryId );
|
||||
|
||||
uint8_t weatherRateId = m_territoryTypeInfo->weatherRate > g_exdDataGen.getWeatherRateIdList().size() ?
|
||||
uint8_t{ 0 } : m_territoryTypeInfo->weatherRate;
|
||||
|
||||
uint8_t sumPc = 0;
|
||||
auto weatherRateFields = g_exdDataGen.m_WeatherRateDat.get_row( weatherRateId );
|
||||
for( size_t i = 0; i < 16; )
|
||||
{
|
||||
int32_t weatherId = boost::get< int32_t >( weatherRateFields[i] );
|
||||
|
||||
if( weatherId == 0 )
|
||||
break;
|
||||
|
||||
sumPc += boost::get< uint8_t >( weatherRateFields[i + 1] );
|
||||
m_weatherRateMap[sumPc] = weatherId;
|
||||
i += 2;
|
||||
}
|
||||
|
||||
m_currentWeather = getNextWeather();
|
||||
}
|
||||
|
||||
Zone::~Zone()
|
||||
|
@ -207,8 +226,6 @@ void Zone::loadCellCache()
|
|||
|
||||
uint8_t Zone::getNextWeather()
|
||||
{
|
||||
auto zoneInfo = g_exdDataGen.getTerritoryType( getTerritoryId() );
|
||||
|
||||
uint32_t unixTime = static_cast< uint32_t >( Util::getTimeSeconds() );
|
||||
// Get Eorzea hour for weather start
|
||||
uint32_t bell = unixTime / 175;
|
||||
|
@ -225,28 +242,7 @@ uint8_t Zone::getNextWeather()
|
|||
|
||||
auto rate = static_cast< uint8_t >( step2 % 0x64 );
|
||||
|
||||
uint8_t weatherRateNum = zoneInfo->weatherRate > g_exdDataGen.getWeatherRateIdList().size() ? 0 : zoneInfo->weatherRate;
|
||||
|
||||
auto weatherRate = g_exdDataGen.getWeatherRate( weatherRateNum );
|
||||
auto weatherRateFields = g_exdDataGen.m_WeatherRateDat.get_row( weatherRateNum );
|
||||
|
||||
std::map< uint8_t, int32_t> weatherRateMap;
|
||||
|
||||
uint8_t sumPc = 0;
|
||||
for( size_t i = 0; i < 16; )
|
||||
{
|
||||
int32_t weatherId = boost::get< int32_t >( weatherRateFields[i] );
|
||||
|
||||
if( weatherId == 0 )
|
||||
break;
|
||||
|
||||
sumPc += boost::get< uint8_t >( weatherRateFields[i + 1] );
|
||||
weatherRateMap[sumPc] = weatherId;
|
||||
|
||||
i += 2;
|
||||
}
|
||||
|
||||
for( auto entry : weatherRateMap )
|
||||
for( auto entry : m_weatherRateMap )
|
||||
{
|
||||
uint8_t sRate = entry.first;
|
||||
auto weatherId = static_cast< uint8_t >( entry.second );
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <common/Exd/ExdDataGenerated.h>
|
||||
namespace Core {
|
||||
|
||||
class Session;
|
||||
|
@ -50,6 +51,10 @@ protected:
|
|||
|
||||
uint64_t m_lastMobUpdate;
|
||||
|
||||
boost::shared_ptr< Data::TerritoryType > m_territoryTypeInfo;
|
||||
|
||||
std::map< uint8_t, int32_t> m_weatherRateMap;
|
||||
|
||||
public:
|
||||
Zone();
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue