From ff229af00a239371c8b2b24dc4153f8a344f32ba Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sat, 19 Dec 2009 20:59:15 +0300 Subject: [PATCH 1/9] [9027] Restore spell bonus apply to dot damage for 17962 damage calculation. In fact reverting wrong part of my one from prev. commits. --- src/game/SpellEffects.cpp | 3 ++- src/shared/revision_nr.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index e61ba6462..dff8f47af 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -475,7 +475,8 @@ void Spell::EffectSchoolDMG(uint32 effect_idx) // found Immolate or Shadowflame if (aura) { - int32 damagetick = aura->GetModifier()->m_amount; + // DoT not have applied spell bonuses in m_amount + int32 damagetick = m_caster->SpellDamageBonus(unitTarget, aura->GetSpellProto(), aura->GetModifier()->m_amount, DOT); damage += damagetick * 4; // Glyph of Conflagrate diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index d5a4c8ce7..5194dfe3c 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9026" + #define REVISION_NR "9027" #endif // __REVISION_NR_H__ From da3f340e147caeec863c781a0ec42c764146853b Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sat, 19 Dec 2009 21:59:05 +0300 Subject: [PATCH 2/9] [9028] Better error output for ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT. --- src/game/AchievementMgr.cpp | 10 +++++++++- src/game/InstanceData.cpp | 8 ++++++++ src/game/InstanceData.h | 5 +---- src/shared/revision_nr.h | 2 +- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index 9fe0c1e9a..5a0d3ede5 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -319,10 +319,18 @@ bool AchievementCriteriaRequirement::Meets(uint32 criteria_id, Player const* sou return false; Map* map = source->GetMap(); if (!map->Instanceable()) - return false; + { + sLog.outErrorDb("Achievement system call ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT (%u) for achievement criteria %u for non-instance map %u", + ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT, criteria_id, map->GetId()); + return false; + } InstanceData* data = ((InstanceMap*)map)->GetInstanceData(); if (!data) + { + sLog.outErrorDb("Achievement system call ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT (%u) for achievement criteria %u for map %u but map not have instance script", + ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT, criteria_id, map->GetId()); return false; + } return data->CheckAchievementCriteriaMeet(criteria_id, source, target, miscvalue1); } return false; diff --git a/src/game/InstanceData.cpp b/src/game/InstanceData.cpp index 394aa5837..7aba1afc6 100644 --- a/src/game/InstanceData.cpp +++ b/src/game/InstanceData.cpp @@ -19,6 +19,7 @@ #include "InstanceData.h" #include "Database/DatabaseEnv.h" #include "Map.h" +#include "Log.h" void InstanceData::SaveToDB() { @@ -27,3 +28,10 @@ void InstanceData::SaveToDB() CharacterDatabase.escape_string(data); CharacterDatabase.PExecute("UPDATE instance SET data = '%s' WHERE id = '%d'", data.c_str(), instance->GetInstanceId()); } + +bool InstanceData::CheckAchievementCriteriaMeet( uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/ /*= NULL*/, uint32 /*miscvalue1*/ /*= 0*/ ) +{ + sLog.outError("Achievement system call InstanceData::CheckAchievementCriteriaMeet but instance script for map %u not have implementation for achievement criteria %u", + instance->GetId(),criteria_id); + return false; +} \ No newline at end of file diff --git a/src/game/InstanceData.h b/src/game/InstanceData.h index b7539fc2f..8e79bba0f 100644 --- a/src/game/InstanceData.h +++ b/src/game/InstanceData.h @@ -73,9 +73,6 @@ class MANGOS_DLL_SPEC InstanceData // Achievement criteria additional requirements check // NOTE: not use this if same can be checked existed requirement types from AchievementCriteriaRequirementType - virtual bool CheckAchievementCriteriaMeet(uint32 /*criteria_id*/, Player const* /*source*/, Unit const* /*target*/ = NULL, uint32 /*miscvalue1*/ = 0) - { - return false; - } + virtual bool CheckAchievementCriteriaMeet(uint32 /*criteria_id*/, Player const* /*source*/, Unit const* /*target*/ = NULL, uint32 /*miscvalue1*/ = 0); }; #endif diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 5194dfe3c..b26265ec8 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9027" + #define REVISION_NR "9028" #endif // __REVISION_NR_H__ From d560c657d870464abe5b6da4f726aae7b1072d87 Mon Sep 17 00:00:00 2001 From: j4r0d Date: Sat, 19 Dec 2009 22:31:46 +0300 Subject: [PATCH 3/9] [9029] Fixed spell 0451 and ranks buff apply. In fact drop now wrong redundent code. Signed-off-by: VladimirMangos --- src/game/SpellEffects.cpp | 8 -------- src/shared/revision_nr.h | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index dff8f47af..27d08cdb9 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -365,16 +365,8 @@ void Spell::EffectSchoolDMG(uint32 effect_idx) } break; } - case SPELLFAMILY_MAGE: - { - // Arcane Blast - if (m_spellInfo->SpellFamilyFlags & UI64LIT(0x20000000)) - { - m_caster->CastSpell(m_caster, 36032, true); - } break; - } case SPELLFAMILY_WARRIOR: { // Bloodthirst diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index b26265ec8..76c1b8d4f 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9028" + #define REVISION_NR "9029" #endif // __REVISION_NR_H__ From f71c4bf3ae1d736067035a53748235e4b30d8fb3 Mon Sep 17 00:00:00 2001 From: Maxxie Date: Sat, 19 Dec 2009 23:26:26 +0300 Subject: [PATCH 4/9] [9030] Fixed: remove spell 30451 and ranks buffs stack at another arcane spells. (cherry-picked from commit 8dbbc7b) Signed-off-by: VladimirMangos --- src/game/SpellEffects.cpp | 4 ++++ src/shared/revision_nr.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 27d08cdb9..d11576e22 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -366,6 +366,10 @@ void Spell::EffectSchoolDMG(uint32 effect_idx) break; } case SPELLFAMILY_MAGE: + // remove Arcane Blast buffs at any non-Arcane Blast arcane damage spell. + // NOTE: it removed at hit instead cast because currently spell done-damage calculated at hit instead cast + if ((m_spellInfo->SchoolMask & SPELL_SCHOOL_MASK_ARCANE) && !(m_spellInfo->SpellFamilyFlags & UI64LIT(0x20000000))) + m_caster->RemoveAurasDueToSpell(36032); // Arcane Blast buff break; case SPELLFAMILY_WARRIOR: { diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 76c1b8d4f..4085c7e08 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9029" + #define REVISION_NR "9030" #endif // __REVISION_NR_H__ From 239dd33e22e973f418b110f4f0a1ef0bb4c4ead4 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sun, 20 Dec 2009 00:25:58 +0300 Subject: [PATCH 5/9] [9031] Fixed: remove talent 44404 buff at spell mod apply triggering. --- src/game/SpellAuras.cpp | 19 ++++++++++--------- src/shared/revision_nr.h | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 3a19b613f..90c00c5fc 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -1381,15 +1381,16 @@ void Aura::HandleAddModifier(bool apply, bool Real) // Add custom charges for some mod aura switch (m_spellProto->Id) { - case 17941: // Shadow Trance - case 22008: // Netherwind Focus - case 31834: // Light's Grace - case 34754: // Clearcasting - case 34936: // Backlash - case 48108: // Hot Streak - case 51124: // Killing Machine - case 54741: // Firestarter - case 57761: // Fireball! + case 17941: // Shadow Trance + case 22008: // Netherwind Focus + case 31834: // Light's Grace + case 34754: // Clearcasting + case 34936: // Backlash + case 44401: // Missile Barrage + case 48108: // Hot Streak + case 51124: // Killing Machine + case 54741: // Firestarter + case 57761: // Fireball! SetAuraCharges(1); break; } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 4085c7e08..2cf41f13b 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9030" + #define REVISION_NR "9031" #endif // __REVISION_NR_H__ From 54caf1129ddb74d21d3b5ea60448119f563f426e Mon Sep 17 00:00:00 2001 From: Splinter Date: Sun, 20 Dec 2009 00:53:51 +0300 Subject: [PATCH 6/9] [9032] Correctky cast rank 2 mana regent triggred effect for 53228 and ranks. Signed-off-by: VladimirMangos --- src/game/Unit.cpp | 12 +++++++++++- src/shared/revision_nr.h | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 7fc7db742..741805772 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -5965,8 +5965,18 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu // This effect only from Rapid Killing (mana regen) if (!(procSpell->SpellFamilyFlags & UI64LIT(0x0100000000000000))) return false; - triggered_spell_id = 56654; + target = this; + + switch(dummySpell->Id) + { + case 53228: // Rank 1 + triggered_spell_id = 56654; + break; + case 53232: // Rank 2 + triggered_spell_id = 58882; + break; + } break; } break; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 2cf41f13b..239c20804 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9031" + #define REVISION_NR "9032" #endif // __REVISION_NR_H__ From 49bfec94e4e47a4557839f01fe9ed15ae83a9389 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sun, 20 Dec 2009 01:13:21 +0300 Subject: [PATCH 7/9] [9033] Fixed percent mana regneration from spell 53228 and ranks buff. --- src/game/SpellAuras.cpp | 8 ++++++++ src/shared/revision_nr.h | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 90c00c5fc..337340650 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -2191,6 +2191,14 @@ void Aura::TriggerSpell() // original caster must be target (beacon) target->CastSpell(target, trigger_spell_id, true, NULL, this, target->GetGUID()); return; + // Rapid Recuperation (triggered energize have baspioints == 0) + case 56654: + case 58882: + { + int32 mana = m_target->GetMaxPower(POWER_MANA) * m_modifier.m_amount / 100; + target->CastCustomSpell(target, trigger_spell_id, &mana, NULL, NULL, true, NULL, this); + return; + } } } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 239c20804..0c9536bb1 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9032" + #define REVISION_NR "9033" #endif // __REVISION_NR_H__ From 27e7190301120f46c06ad95d4cd4fd10e3b2b2f4 Mon Sep 17 00:00:00 2001 From: Splinter Date: Sun, 20 Dec 2009 01:41:51 +0300 Subject: [PATCH 8/9] [9034] Add internal cooldown for item 47215 effect. Signed-off-by: VladimirMangos --- sql/mangos.sql | 5 +++-- sql/updates/9034_01_mangos_spell_proc_event.sql | 5 +++++ sql/updates/Makefile.am | 2 ++ src/shared/revision_nr.h | 2 +- src/shared/revision_sql.h | 2 +- 5 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 sql/updates/9034_01_mangos_spell_proc_event.sql diff --git a/sql/mangos.sql b/sql/mangos.sql index 119f2ad9a..022d78bfb 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -24,7 +24,7 @@ CREATE TABLE `db_version` ( `version` varchar(120) default NULL, `creature_ai_version` varchar(120) default NULL, `cache_id` int(10) default '0', - `required_9025_01_mangos_spell_proc_event` bit(1) default NULL + `required_9034_01_mangos_spell_proc_event` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -18529,7 +18529,8 @@ INSERT INTO `spell_proc_event` VALUES (64976, 0x00000000, 4, 0x00000001, 0x00000000, 0x00000000, 0x00010000, 0x00000000, 0.000000, 0.000000, 0), (65661, 0x00000000, 15, 0x00400011, 0x00020004, 0x00000000, 0x00000010, 0x00000001, 0.000000, 100.000000,0), (64127, 0x00000000, 6, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), -(67353, 0x00000000, 7, 0x00008000, 0x00100500, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0); +(67353, 0x00000000, 7, 0x00008000, 0x00100500, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), +(67667, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45); /*!40000 ALTER TABLE `spell_proc_event` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/9034_01_mangos_spell_proc_event.sql b/sql/updates/9034_01_mangos_spell_proc_event.sql new file mode 100644 index 000000000..d7bfce6ec --- /dev/null +++ b/sql/updates/9034_01_mangos_spell_proc_event.sql @@ -0,0 +1,5 @@ +ALTER TABLE db_version CHANGE COLUMN required_9025_01_mangos_spell_proc_event required_9034_01_mangos_spell_proc_event bit; + +DELETE FROM spell_proc_event WHERE entry = '67667'; +INSERT INTO spell_proc_event VALUES +(67667, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45); diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index 02ea4d4f8..b6679f0bc 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -216,6 +216,7 @@ pkgdata_DATA = \ 9018_01_mangos_spell_bonus_data.sql \ 9019_01_mangos_spell_threat.sql \ 9025_01_mangos_spell_proc_event.sql \ + 9034_01_mangos_spell_proc_event.sql \ README ## Additional files to include when running 'make dist' @@ -412,4 +413,5 @@ EXTRA_DIST = \ 9018_01_mangos_spell_bonus_data.sql \ 9019_01_mangos_spell_threat.sql \ 9025_01_mangos_spell_proc_event.sql \ + 9034_01_mangos_spell_proc_event.sql \ README diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 0c9536bb1..87af3cab4 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9033" + #define REVISION_NR "9034" #endif // __REVISION_NR_H__ diff --git a/src/shared/revision_sql.h b/src/shared/revision_sql.h index 51acf44ec..bf27d67c8 100644 --- a/src/shared/revision_sql.h +++ b/src/shared/revision_sql.h @@ -1,6 +1,6 @@ #ifndef __REVISION_SQL_H__ #define __REVISION_SQL_H__ #define REVISION_DB_CHARACTERS "required_8874_01_characters_character_skills" - #define REVISION_DB_MANGOS "required_9025_01_mangos_spell_proc_event" + #define REVISION_DB_MANGOS "required_9034_01_mangos_spell_proc_event" #define REVISION_DB_REALMD "required_9010_01_realmd_realmlist" #endif // __REVISION_SQL_H__ From 9e18fc574536bd7eff265ca36aa1c300a73bc49e Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sun, 20 Dec 2009 03:26:39 +0300 Subject: [PATCH 9/9] [9035] Attempt make more fast and less hackish spell target checks * Enable server side recheck clear negative to friend or positive to enemy casts that already checks at client side * Use more fast way check in similar cases for non-players, and fall back to old way in unclear (for while at least) Please report if some spell stop propertly casted at friends/enemies. --- src/game/Spell.cpp | 26 ++++++++++++++++++++------ src/game/SpellMgr.cpp | 34 ++++++++++++++++++++++++++++++++++ src/game/SpellMgr.h | 3 +++ src/shared/revision_nr.h | 2 +- 4 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 827152b42..ce6814fc7 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4079,21 +4079,35 @@ SpellCastResult Spell::CheckCast(bool strict) } } - // TODO: this check can be applied and for player to prevent cheating when IsPositiveSpell will return always correct result. - // check target for pet/charmed casts (not self targeted), self targeted cast used for area effects and etc - if(non_caster_target && m_caster->GetTypeId() == TYPEID_UNIT && m_caster->GetCharmerOrOwnerGUID()) + if(non_caster_target) { - // check correctness positive/negative cast target (pet cast real check and cheating check) - if(IsPositiveSpell(m_spellInfo->Id)) + // simple cases + if (IsExplicitPositiveTarget(m_spellInfo->EffectImplicitTargetA[0])) { if(m_caster->IsHostileTo(target)) return SPELL_FAILED_BAD_TARGETS; } - else + else if (IsExplicitNegativeTarget(m_spellInfo->EffectImplicitTargetA[0])) { if(m_caster->IsFriendlyTo(target)) return SPELL_FAILED_BAD_TARGETS; } + // TODO: this check can be applied and for player to prevent cheating when IsPositiveSpell will return always correct result. + // check target for pet/charmed casts (not self targeted), self targeted cast used for area effects and etc + else if (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->GetCharmerOrOwnerGUID()) + { + // check correctness positive/negative cast target (pet cast real check and cheating check) + if(IsPositiveSpell(m_spellInfo->Id)) + { + if(m_caster->IsHostileTo(target)) + return SPELL_FAILED_BAD_TARGETS; + } + else + { + if(m_caster->IsFriendlyTo(target)) + return SPELL_FAILED_BAD_TARGETS; + } + } } if(IsPositiveSpell(m_spellInfo->Id)) diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index bc981527e..2f6621ee7 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -426,6 +426,40 @@ bool IsPositiveTarget(uint32 targetA, uint32 targetB) return true; } +bool IsExplicitPositiveTarget(uint32 targetA) +{ + // positive targets + switch(targetA) + { + case TARGET_SELF: + case TARGET_SINGLE_FRIEND: + case TARGET_SINGLE_PARTY: + case TARGET_CHAIN_HEAL: + case TARGET_SINGLE_FRIEND_2: + case TARGET_AREAEFFECT_PARTY_AND_CLASS: + case TARGET_SELF2: + return true; + default: + break; + } + return false; +} + +bool IsExplicitNegativeTarget(uint32 targetA) +{ + // non-positive targets + switch(targetA) + { + case TARGET_CHAIN_DAMAGE: + case TARGET_CURRENT_ENEMY_COORDINATES: + case TARGET_SINGLE_ENEMY: + return true; + default: + break; + } + return false; +} + bool IsPositiveEffect(uint32 spellId, uint32 effIndex) { SpellEntry const *spellproto = sSpellStore.LookupEntry(spellId); diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h index fbe5621d3..0583f62ba 100644 --- a/src/game/SpellMgr.h +++ b/src/game/SpellMgr.h @@ -220,6 +220,9 @@ bool IsPositiveSpell(uint32 spellId); bool IsPositiveEffect(uint32 spellId, uint32 effIndex); bool IsPositiveTarget(uint32 targetA, uint32 targetB); +bool IsExplicitPositiveTarget(uint32 targetA); +bool IsExplicitNegativeTarget(uint32 targetA); + bool IsSingleTargetSpell(SpellEntry const *spellInfo); bool IsSingleTargetSpells(SpellEntry const *spellInfo1, SpellEntry const *spellInfo2); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 87af3cab4..d85161e46 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9034" + #define REVISION_NR "9035" #endif // __REVISION_NR_H__