From 6320bb6a468c892f36ef4dd136e2d27ab81311ba Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 23 Jul 2018 15:58:39 +0200 Subject: [PATCH 1/6] Revert "fix warnings" and fix warning properly --- src/server/game/Chat/Channels/Channel.cpp | 2 +- src/server/game/Chat/Chat.cpp | 4 ++-- src/server/game/DataStores/DBCStructure.h | 2 +- src/server/game/Entities/Player/Player.cpp | 4 ++-- src/server/game/Handlers/MiscHandler.cpp | 2 +- src/server/scripts/Commands/cs_go.cpp | 2 +- src/server/scripts/Commands/cs_group.cpp | 2 +- src/server/scripts/Commands/cs_list.cpp | 2 +- src/server/scripts/Commands/cs_lookup.cpp | 2 +- src/server/scripts/Commands/cs_message.cpp | 2 +- src/server/scripts/Commands/cs_misc.cpp | 8 ++++---- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index 5db2214f3f4..d15a9383932 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -122,7 +122,7 @@ void Channel::GetChannelName(std::string& channelName, uint32 channelId, LocaleC if (channelEntry->flags & CHANNEL_DBC_FLAG_CITY_ONLY) channelName = Trinity::StringFormat(channelEntry->pattern, sObjectMgr->GetTrinityString(LANG_CHANNEL_CITY, locale)); else - channelName = Trinity::StringFormat(channelEntry->pattern, ASSERT_NOTNULL(zoneEntry)->area_name->Str[locale]); + channelName = Trinity::StringFormat(channelEntry->pattern, ASSERT_NOTNULL(zoneEntry)->area_name); } else channelName = channelEntry->pattern; diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index ec54382207d..4e7b8f51743 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -325,9 +325,9 @@ bool ChatHandler::ExecuteCommandInTable(std::vector const& table, c std::string zoneName = "Unknown"; if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId)) { - areaName = area->area_name->Str[m_session->GetSessionDbcLocale()]; + areaName = area->area_name; if (AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->zone)) - zoneName = zone->area_name->Str[m_session->GetSessionDbcLocale()]; + zoneName = zone->area_name; } sLog->outCommand(m_session->GetAccountId(), "Command: %s [Player: %s (%s) (Account: %u) X: %f Y: %f Z: %f Map: %u (%s) Area: %u (%s) Zone: %s Selected: %s (%s)]", diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 2be1d6a9024..362c583bb81 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -627,7 +627,7 @@ struct AreaTableEntry //uint32 unk8; // 8, //uint32 unk9; // 9, int32 area_level; // 10 - LocalizedString* area_name; // 11 + char* area_name; // 11 uint32 team; // 12 uint32 LiquidTypeOverride[4]; // 13-16 liquid override by type float MaxDepth; // 17, diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 162efefa633..c12b354bb31 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -27311,9 +27311,9 @@ std::string Player::GetMapAreaAndZoneString() const if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId)) { int locale = GetSession()->GetSessionDbcLocale(); - areaName = area->area_name->Str[locale]; + areaName = area->area_name[locale]; if (AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->zone)) - zoneName = zone->area_name->Str[locale]; + zoneName = zone->area_name[locale]; } std::ostringstream str; diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 6a8130619e6..7e1f96b1f8f 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -310,7 +310,7 @@ void WorldSession::HandleWhoOpcode(WorldPacket& recvData) std::string aname; if (AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(playerZoneId)) - aname = areaEntry->area_name->Str[GetSessionDbcLocale()]; + aname = areaEntry->area_name[GetSessionDbcLocale()]; bool s_show = true; for (uint32 i = 0; i < strCount; ++i) diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp index 89a65aafe08..cae3e1a5fac 100644 --- a/src/server/scripts/Commands/cs_go.cpp +++ b/src/server/scripts/Commands/cs_go.cpp @@ -431,7 +431,7 @@ public: if (map->Instanceable()) { - handler->PSendSysMessage(LANG_INVALID_ZONE_MAP, areaEntry->ID, areaEntry->area_name->Str[handler->GetSessionDbcLocale()], map->GetId(), map->GetMapName()); + handler->PSendSysMessage(LANG_INVALID_ZONE_MAP, areaEntry->ID, areaEntry->area_name, map->GetId(), map->GetMapName()); handler->SetSentErrorMessage(true); return false; } diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp index fcf0eb0ec71..2db18526685 100644 --- a/src/server/scripts/Commands/cs_group.cpp +++ b/src/server/scripts/Commands/cs_group.cpp @@ -432,7 +432,7 @@ public: { AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->zone); if (zone) - zoneName = zone->area_name->Str[localeConstant]; + zoneName = zone->area_name[localeConstant]; } } else diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp index a916cb4f722..40a5ef4d1b9 100644 --- a/src/server/scripts/Commands/cs_list.cpp +++ b/src/server/scripts/Commands/cs_list.cpp @@ -681,7 +681,7 @@ public: static char const* GetZoneName(uint32 zoneId, LocaleConstant locale) { AreaTableEntry const* zoneEntry = sAreaTableStore.LookupEntry(zoneId); - return zoneEntry ? zoneEntry->area_name->Str[locale] : ""; + return zoneEntry ? zoneEntry->area_name : ""; } static bool HandleListRespawnsCommand(ChatHandler* handler, char const* args) { diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index 2e069d09aa1..8383c6c574e 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -104,7 +104,7 @@ public: // Search in AreaTable.dbc for (AreaTableEntry const* areaEntry : sAreaTableStore) { - std::string name = areaEntry->area_name->Str[handler->GetSessionDbcLocale()]; + std::string name = areaEntry->area_name; if (name.empty()) continue; diff --git a/src/server/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp index 0471e8fbf9c..428ac9b3749 100644 --- a/src/server/scripts/Commands/cs_message.cpp +++ b/src/server/scripts/Commands/cs_message.cpp @@ -88,7 +88,7 @@ public: AreaTableEntry const* zoneEntry = nullptr; for (AreaTableEntry const* entry : sAreaTableStore) { - if (strstr(entry->area_name->Str[handler->GetSessionDbcLocale()], channelStr)) + if (strstr(entry->area_name, channelStr)) { zoneEntry = entry; break; diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 2bea799f9d8..cc19fefed66 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -277,8 +277,8 @@ public: handler->PSendSysMessage(LANG_MAP_POSITION, mapId, (mapEntry ? mapEntry->name : unknown), - zoneId, (zoneEntry ? zoneEntry->area_name->Str[handler->GetSessionDbcLocale()] : unknown), - areaId, (areaEntry ? areaEntry->area_name->Str[handler->GetSessionDbcLocale()] : unknown), + zoneId, (zoneEntry ? zoneEntry->area_name : unknown), + areaId, (areaEntry ? areaEntry->area_name : unknown), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation()); if (Transport* transport = object->GetTransport()) handler->PSendSysMessage(LANG_TRANSPORT_POSITION, @@ -1836,11 +1836,11 @@ public: AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId); if (area) { - areaName = area->area_name->Str[handler->GetSessionDbcLocale()];; + areaName = area->area_name; AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->zone); if (zone) - zoneName = zone->area_name->Str[handler->GetSessionDbcLocale()]; + zoneName = zone->area_name; } if (target) From 5d60d1980a5945d9ddd0a91e2f72b6fedef79e43 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Mon, 23 Jul 2018 16:16:37 +0200 Subject: [PATCH 2/6] warning fix --- src/server/scripts/Commands/cs_list.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp index 40a5ef4d1b9..76ac9c7c8e1 100644 --- a/src/server/scripts/Commands/cs_list.cpp +++ b/src/server/scripts/Commands/cs_list.cpp @@ -678,7 +678,7 @@ public: return true; } - static char const* GetZoneName(uint32 zoneId, LocaleConstant locale) + static char const* GetZoneName(uint32 zoneId, LocaleConstant /*locale*/) { AreaTableEntry const* zoneEntry = sAreaTableStore.LookupEntry(zoneId); return zoneEntry ? zoneEntry->area_name : ""; From 5b3b93fd9d5a64d2ad60e13dc68a3585b79b94e3 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 23 Jul 2018 16:17:12 +0200 Subject: [PATCH 3/6] Core/ObjectMgr: corrected log message types for loading spawn data --- src/server/game/Globals/ObjectMgr.cpp | 36 +++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index de82482aea3..2584e4b554f 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2405,20 +2405,20 @@ void ObjectMgr::LoadSpawnGroupTemplates() if (flags & ~SPAWNGROUP_FLAGS_ALL) { flags &= SPAWNGROUP_FLAGS_ALL; - TC_LOG_ERROR("server.loading", "Invalid spawn group flag %u on group ID %u (%s), reduced to valid flag %u.", flags, groupId, group.name.c_str(), uint32(group.flags)); + TC_LOG_ERROR("sql.sql", "Invalid spawn group flag %u on group ID %u (%s), reduced to valid flag %u.", flags, groupId, group.name.c_str(), uint32(group.flags)); } if (flags & SPAWNGROUP_FLAG_SYSTEM && flags & SPAWNGROUP_FLAG_MANUAL_SPAWN) { flags &= ~SPAWNGROUP_FLAG_MANUAL_SPAWN; - TC_LOG_ERROR("server.loading", "System spawn group %u (%s) has invalid manual spawn flag. Ignored.", groupId, group.name.c_str()); + TC_LOG_ERROR("sql.sql", "System spawn group %u (%s) has invalid manual spawn flag. Ignored.", groupId, group.name.c_str()); } group.flags = SpawnGroupFlags(flags); } while (result->NextRow()); } - + if (_spawnGroupDataStore.find(0) == _spawnGroupDataStore.end()) { - TC_LOG_ERROR("server.loading", "Default spawn group (index 0) is missing from DB! Manually inserted."); + TC_LOG_ERROR("sql.sql", "Default spawn group (index 0) is missing from DB! Manually inserted."); SpawnGroupTemplateData& data = _spawnGroupDataStore[0]; data.groupId = 0; data.name = "Default Group"; @@ -2427,7 +2427,7 @@ void ObjectMgr::LoadSpawnGroupTemplates() } if (_spawnGroupDataStore.find(1) == _spawnGroupDataStore.end()) { - TC_LOG_ERROR("server.loading", "Default legacy spawn group (index 1) is missing from DB! Manually inserted."); + TC_LOG_ERROR("sql.sql", "Default legacy spawn group (index 1) is missing from DB! Manually inserted."); SpawnGroupTemplateData&data = _spawnGroupDataStore[1]; data.groupId = 1; data.name = "Legacy Group"; @@ -2438,7 +2438,7 @@ void ObjectMgr::LoadSpawnGroupTemplates() if (result) TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " spawn group templates in %u ms", _spawnGroupDataStore.size(), GetMSTimeDiffToNow(oldMSTime)); else - TC_LOG_ERROR("server.loading", ">> Loaded 0 spawn group templates. DB table `spawn_group_template` is empty."); + TC_LOG_INFO("server.loading", ">> Loaded 0 spawn group templates. DB table `spawn_group_template` is empty."); return; } @@ -2452,7 +2452,7 @@ void ObjectMgr::LoadSpawnGroups() if (!result) { - TC_LOG_ERROR("server.loading", ">> Loaded 0 spawn group members. DB table `spawn_group` is empty."); + TC_LOG_INFO("server.loading", ">> Loaded 0 spawn group members. DB table `spawn_group` is empty."); return; } @@ -2466,7 +2466,7 @@ void ObjectMgr::LoadSpawnGroups() uint32 type = fields[1].GetUInt8(); if (type >= SPAWN_TYPE_MAX) { - TC_LOG_ERROR("server.loading", "Spawn data with invalid type %u listed for spawn group %u. Skipped.", type, groupId); + TC_LOG_ERROR("sql.sql", "Spawn data with invalid type %u listed for spawn group %u. Skipped.", type, groupId); continue; } spawnType = SpawnObjectType(type); @@ -2476,18 +2476,18 @@ void ObjectMgr::LoadSpawnGroups() SpawnData const* data = GetSpawnData(spawnType, spawnId); if (!data) { - TC_LOG_ERROR("server.loading", "Spawn data with ID (%u,%u) not found, but is listed as a member of spawn group %u!", uint32(spawnType), spawnId, groupId); + TC_LOG_ERROR("sql.sql", "Spawn data with ID (%u,%u) not found, but is listed as a member of spawn group %u!", uint32(spawnType), spawnId, groupId); continue; } else if (data->spawnGroupData->groupId) { - TC_LOG_ERROR("server.loading", "Spawn with ID (%u,%u) is listed as a member of spawn group %u, but is already a member of spawn group %u. Skipping.", uint32(spawnType), spawnId, groupId, data->spawnGroupData->groupId); + TC_LOG_ERROR("sql.sql", "Spawn with ID (%u,%u) is listed as a member of spawn group %u, but is already a member of spawn group %u. Skipping.", uint32(spawnType), spawnId, groupId, data->spawnGroupData->groupId); continue; } auto it = _spawnGroupDataStore.find(groupId); if (it == _spawnGroupDataStore.end()) { - TC_LOG_ERROR("server.loading", "Spawn group %u assigned to spawn ID (%u,%u), but group is found!", groupId, uint32(spawnType), spawnId); + TC_LOG_ERROR("sql.sql", "Spawn group %u assigned to spawn ID (%u,%u), but group is found!", groupId, uint32(spawnType), spawnId); continue; } else @@ -2497,7 +2497,7 @@ void ObjectMgr::LoadSpawnGroups() groupTemplate.mapId = data->spawnPoint.GetMapId(); else if (groupTemplate.mapId != data->spawnPoint.GetMapId() && !(groupTemplate.flags & SPAWNGROUP_FLAG_SYSTEM)) { - TC_LOG_ERROR("server.loading", "Spawn group %u has map ID %u, but spawn (%u,%u) has map id %u - spawn NOT added to group!", groupId, groupTemplate.mapId, uint32(spawnType), spawnId, data->spawnPoint.GetMapId()); + TC_LOG_ERROR("sql.sql", "Spawn group %u has map ID %u, but spawn (%u,%u) has map id %u - spawn NOT added to group!", groupId, groupTemplate.mapId, uint32(spawnType), spawnId, data->spawnPoint.GetMapId()); continue; } const_cast(data)->spawnGroupData = &groupTemplate; @@ -2519,7 +2519,7 @@ void ObjectMgr::LoadInstanceSpawnGroups() if (!result) { - TC_LOG_ERROR("server.loading", ">> Loaded 0 instance spawn groups. DB table `instance_spawn_groups` is empty."); + TC_LOG_INFO("server.loading", ">> Loaded 0 instance spawn groups. DB table `instance_spawn_groups` is empty."); return; } @@ -2531,7 +2531,7 @@ void ObjectMgr::LoadInstanceSpawnGroups() auto it = _spawnGroupDataStore.find(spawnGroupId); if (it == _spawnGroupDataStore.end() || (it->second.flags & SPAWNGROUP_FLAG_SYSTEM)) { - TC_LOG_ERROR("server.loading", "Invalid spawn group %u specified for instance %u. Skipped.", spawnGroupId, fields[0].GetUInt16()); + TC_LOG_ERROR("sql.sql", "Invalid spawn group %u specified for instance %u. Skipped.", spawnGroupId, fields[0].GetUInt16()); continue; } @@ -2541,13 +2541,13 @@ void ObjectMgr::LoadInstanceSpawnGroups() InstanceSpawnGroupInfo& info = vector.back(); info.SpawnGroupId = spawnGroupId; info.BossStateId = fields[1].GetUInt8(); - + uint8 const ALL_STATES = (1 << TO_BE_DECIDED) - 1; uint8 const states = fields[2].GetUInt8(); if (states & ~ALL_STATES) { info.BossStates = states & ALL_STATES; - TC_LOG_ERROR("server.loading", "Instance spawn group (%u,%u) had invalid boss state mask %u - truncated to %u.", instanceMapId, spawnGroupId, states, info.BossStates); + TC_LOG_ERROR("sql.sql", "Instance spawn group (%u,%u) had invalid boss state mask %u - truncated to %u.", instanceMapId, spawnGroupId, states, info.BossStates); } else info.BossStates = states; @@ -2556,11 +2556,11 @@ void ObjectMgr::LoadInstanceSpawnGroups() if (flags & ~InstanceSpawnGroupInfo::FLAG_ALL) { info.Flags = flags & InstanceSpawnGroupInfo::FLAG_ALL; - TC_LOG_ERROR("server.loading", "Instance spawn group (%u,%u) had invalid flags %u - truncated to %u.", instanceMapId, spawnGroupId, flags, info.Flags); + TC_LOG_ERROR("sql.sql", "Instance spawn group (%u,%u) had invalid flags %u - truncated to %u.", instanceMapId, spawnGroupId, flags, info.Flags); } else info.Flags = flags; - + ++n; } while (result->NextRow()); From c58246d98178e8b0d26515758dc743fe2b8ff59f Mon Sep 17 00:00:00 2001 From: Treeston Date: Tue, 24 Jul 2018 10:42:41 +0200 Subject: [PATCH 4/6] Core/Maps: Continue updating creatures that own auras applied to players. Closes #22110. --- src/server/game/Maps/Map.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 9698cd2527a..599e3e1fced 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -839,6 +839,18 @@ void Map::Update(uint32 t_diff) for (Creature* c : updateList) VisitNearbyCellsOf(c, grid_object_update, world_object_update); } + + { // Update any creatures that own auras the player has applications of + std::unordered_set toVisit; + for (std::pair pair : player->GetAppliedAuras()) + { + if (Unit* caster = pair.second->GetBase()->GetCaster()) + if (caster->GetTypeId() != TYPEID_PLAYER) + toVisit.insert(caster); + } + for (Unit* unit : toVisit) + VisitNearbyCellsOf(unit, grid_object_update, world_object_update); + } } // non-player active objects, increasing iterator in the loop in case of object removal From fb6acb341515aa3177196bc698fcd38849266248 Mon Sep 17 00:00:00 2001 From: Treeston Date: Tue, 24 Jul 2018 10:46:14 +0200 Subject: [PATCH 5/6] visibility range check, fac4700 follow-up --- src/server/game/Maps/Map.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 599e3e1fced..7a1869a10fb 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -45,6 +45,8 @@ #include "Vehicle.h" #include "VMapFactory.h" #include "World.h" +#include +#include u_map_magic MapMagic = { {'M','A','P','S'} }; u_map_magic MapVersionMagic = { {'v','1','.','6'} }; @@ -845,7 +847,7 @@ void Map::Update(uint32 t_diff) for (std::pair pair : player->GetAppliedAuras()) { if (Unit* caster = pair.second->GetBase()->GetCaster()) - if (caster->GetTypeId() != TYPEID_PLAYER) + if (caster->GetTypeId() != TYPEID_PLAYER && !caster->IsWithinDistInMap(player, GetVisibilityRange(), false)) toVisit.insert(caster); } for (Unit* unit : toVisit) From 4ca277b3453181a6d696cf7d99360ff262fe7d0b Mon Sep 17 00:00:00 2001 From: Killyana Date: Wed, 25 Jul 2018 21:39:17 +0200 Subject: [PATCH 6/6] DB/Creature: Stormwind City Patroller --- sql/updates/world/4.3.4/2018_07_25_00_world.sql | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 sql/updates/world/4.3.4/2018_07_25_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_07_25_00_world.sql b/sql/updates/world/4.3.4/2018_07_25_00_world.sql new file mode 100644 index 00000000000..4235662b260 --- /dev/null +++ b/sql/updates/world/4.3.4/2018_07_25_00_world.sql @@ -0,0 +1,12 @@ +DELETE FROM `creature_equip_template` WHERE `CreatureID`= 1976 AND `ID`= 2; +INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `ItemID2`, `ItemID3`) VALUES +(1976, 2, 1902, 0, 0); -- Stormwind City Patroller + +UPDATE `creature_addon` SET `bytes2`=256 WHERE `guid`=313937; +UPDATE `waypoint_data` SET `action`=9 WHERE `id`=3139370 AND `point`=9; +DELETE FROM `waypoint_scripts` WHERE `id`=9; +INSERT INTO `waypoint_scripts` (`id`, `delay`, `command`, `datalong`, `datalong2`, `dataint`, `x`, `y`, `z`, `o`, `guid`) VALUES +(9, 7, 31, 2, 0, 0, 0, 0, 0, 0, 950), +(9, 9, 1, 234, 0, 0, 0, 0, 0, 0, 951), +(9, 14, 1, 0, 0, 0, 0, 0, 0, 0, 952), +(9, 16, 31, 1, 0, 0, 0, 0, 0, 0, 953);