Feanordev
Members-
Posts
66 -
Joined
-
Last visited
Never -
Donations
0.00 GBP
Content Type
Profiles
Bug Tracker
Wiki
Release Notes
Forums
Downloads
Blogs
Events
Everything posted by Feanordev
-
Distance calculation for melee-attacks and Following
Feanordev replied to Schmoozerd's topic in OldGeneral discussion
Well Im using this change for almost year already, havent really noticed too-big melee range actually, the dist < attack_dist check is needed becouse sometime becouse of box-calculation distance was almost close-to 0 -
Melee attack distance should be calculated considering enemy attack-box (Look @ Thaddius for example, player should be able to hit him from ~15 yards - this code makes it possible) Without this patch many of PvE fights are not possible. diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 3f09b8e..82ae7ae 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -1250,11 +1250,13 @@ void Player::Update( uint32 p_time ) // default combat reach 10 // TODO add weapon,skill check - float pldistance = ATTACK_DISTANCE; + float dist = pVictim->GetTypeId() == TYPEID_PLAYER ? ATTACK_DISTANCE : (GetFloatValue(UNIT_FIELD_COMBATREACH) + pVictim->GetFloatValue(UNIT_FIELD_COMBATREACH)); + // Check for creatures that somehow have lower combat-reach than minimal attack distance + if (dist < ATTACK_DISTANCE) dist = ATTACK_DISTANCE; if (isAttackReady(BASE_ATTACK)) { - if(!IsWithinDistInMap(pVictim, pldistance)) + if(!IsWithinDistInMap(pVictim, dist)) { setAttackTimer(BASE_ATTACK,100); if(m_swingErrorMsg != 1) // send single time (client auto repeat) @@ -1291,7 +1293,7 @@ void Player::Update( uint32 p_time ) if ( haveOffhandWeapon() && isAttackReady(OFF_ATTACK)) { - if(!IsWithinDistInMap(pVictim, pldistance)) + if(!IsWithinDistInMap(pVictim, dist)) { setAttackTimer(OFF_ATTACK,100); }
-
Distance calculation for melee-attacks and Following
Feanordev replied to Schmoozerd's topic in OldGeneral discussion
I have patch for it, lemme look on my branch... Not sure if you meant it. This makes players melee attacks based on enemy attack-box (makes for example being possible to hit Thaddius from large distance so Negative / Positive charges arent hitting players on both sides. diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 3f09b8e..82ae7ae 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -1250,11 +1250,13 @@ void Player::Update( uint32 p_time ) // default combat reach 10 // TODO add weapon,skill check - float pldistance = ATTACK_DISTANCE; + float dist = pVictim->GetTypeId() == TYPEID_PLAYER ? ATTACK_DISTANCE : (GetFloatValue(UNIT_FIELD_COMBATREACH) + pVictim->GetFloatValue(UNIT_FIELD_COMBATREACH)); + // Check for creatures that somehow have lower combat-reach than minimal attack distance + if (dist < ATTACK_DISTANCE) dist = ATTACK_DISTANCE; if (isAttackReady(BASE_ATTACK)) { - if(!IsWithinDistInMap(pVictim, pldistance)) + if(!IsWithinDistInMap(pVictim, dist)) { setAttackTimer(BASE_ATTACK,100); if(m_swingErrorMsg != 1) // send single time (client auto repeat) @@ -1291,7 +1293,7 @@ void Player::Update( uint32 p_time ) if ( haveOffhandWeapon() && isAttackReady(OFF_ATTACK)) { - if(!IsWithinDistInMap(pVictim, pldistance)) + if(!IsWithinDistInMap(pVictim, dist)) { setAttackTimer(OFF_ATTACK,100); } -
Path distance doesn't matter for charges. Look on youtube for some charge-fun videos for example in HFC:Ramparts you can charge thru whole instance from the beggining to end Stun is added when you reach target.
-
[11037][Patch] Lifeblood gain bonus based on max health
Feanordev replied to Feanordev's topic in ... acceptedOld
This is per tick addition - WoWWiki says 1.5 or 1.6 - I got from friend that says its more 1.6% 1.6 is 0.016 multiplier however m_amount is for per/tick so we need to divide it by tick-count which is 5 0.016 / 5 is 0.0032 as in above. I know the tick value should'nt be hardcoded but uhm... Im too lazy (?) or I just think that raw-value for such situations is better ? not sure. However it was tested ingame and it gives proper values to whole effect. -
[invalid] Players positions on Map/minimap updating
Feanordev replied to michalpolko's topic in OldBug reports
I use it for a bit thx for Zergtmn and RSA (not sure why its not on mangos yet acutally) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 467f082..18d0764 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -6079,41 +6079,15 @@ bool Player::SetPosition(float x, float y, float z, float orientation, bool tele if(!Unit::SetPosition(x, y, z, orientation, teleport)) return false; - Map *m = GetMap(); - - const float old_x = GetPositionX(); - const float old_y = GetPositionY(); - const float old_z = GetPositionZ(); - const float old_r = GetOrientation(); - - if( teleport || old_x != x || old_y != y || old_z != z || old_r != orientation ) - { - if (teleport || old_x != x || old_y != y || old_z != z) - RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOVE | AURA_INTERRUPT_FLAG_TURNING); - else - RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TURNING); - - RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); - - // move and update visible state if need - m->PlayerRelocation(this, x, y, z, orientation); - - // reread after Map::Relocation - m = GetMap(); - x = GetPositionX(); - y = GetPositionY(); - z = GetPositionZ(); - - // group update - if (GetGroup() && (old_x != x || old_y != y)) - SetGroupUpdateFlag(GROUP_UPDATE_FLAG_POSITION); + // group update + if (GetGroup()) + SetGroupUpdateFlag(GROUP_UPDATE_FLAG_POSITION); - if (GetTrader() && !IsWithinDistInMap(GetTrader(), INTERACTION_DISTANCE)) - GetSession()->SendCancelTrade(); // will close both side trade windows - } + if (GetTrader() && !IsWithinDistInMap(GetTrader(), INTERACTION_DISTANCE)) + GetSession()->SendCancelTrade(); // will close both side trade windows // code block for underwater state update - UpdateUnderwaterState(m, x, y, z); + UpdateUnderwaterState(GetMap(), x, y, z); CheckAreaExploreAndOutdoor(); -
You can short it just to: if(effect_idx == EFFECT_INDEX_2) damage = unitTarget->GetMaxHealth() * 0.3;
-
So I found 2 crashdumps with different spell actually. http://pastebin.com/pL84de67 and http://pastebin.com/atCEk7R2 Both end up with 0 spellId in RemoveAuraHolderFromStack. Dunno whether _spellAuraHolders.equal_range(spell_id); can freez with 0 spellId or not..?
-
I wonder how spellId=0 can be passed to Dispel code (there is like no way unless some on-fly corruption Edit: and yes... I've had the same crashdumps
-
Edit: Updated patch - I had slightly wrong formula - is fine now. What in topic-name based on 3.2.0 change. diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 9d30e83..b520ea3 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -5540,6 +5540,13 @@ void Aura::HandlePeriodicHeal(bool apply, bool /*Real*/) m_modifier.m_amount += ap > holy ? ap : holy; } + // Lifeblood + if (GetSpellProto()->SpellIconID == 3088 && GetSpellProto()->SpellVisual[0] == 8145) + { + int32 healthBonus = int32 (0.0032f * caster->GetMaxHealth()); + m_modifier.m_amount += healthBonus; + } + //Lifebloom special stacking if(GetSpellProto()->SpellFamilyName == SPELLFAMILY_DRUID && (GetSpellProto()->SpellFamilyFlags & UI64LIT(0x1000000000)) && GetStackAmount() > 1) m_modifier.m_amount += (GetStackAmount() == 2) ? m_modifier.m_amount : (m_modifier.m_amount / 2);
-
You can only check if there arent multiple players connected from same IP. This is unsafe though for players that share same IP over few PCs (home-network and such)
-
Not sure if It was made already but couldn't find on forum so... (Used same way to set reaction as normal-hit handling does) diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 0a15b32..8a1e69e 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1137,6 +1137,20 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target) DoSpellHitOnUnit(m_caster, mask); } + if(missInfo == SPELL_MISS_MISS || missInfo == SPELL_MISS_RESIST) + { + Unit* realCaster = GetAffectiveCaster(); + if(realCaster && realCaster != unit) + { + if (!unit->isInCombat() && unit->GetTypeId() != TYPEID_PLAYER && ((Creature*)unit)->AI()) + ((Creature*)unit)->AI()->AttackedBy(realCaster); + + unit->AddThreat(realCaster); + unit->SetInCombatWith(realCaster); + realCaster->SetInCombatWith(unit); + } + } + // All calculated do it! // Do healing and triggers if (m_healing)
-
So spells with unit-type and destination flag (Blizzard, Rain of Fire etc) should not be los-limited - you can see use of it on arenas for example where you cast it "around" pillars to prevent mana-restoring and such. diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index c061019..5241fd6 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -7061,7 +7061,7 @@ bool Spell::CheckTarget( Unit* target, SpellEffectIndex eff ) // Get GO cast coordinates if original caster -> GO if (target != m_caster) if (WorldObject *caster = GetCastingObject()) - if (!target->IsWithinLOSInMap(caster)) + if (!target->IsWithinLOSInMap(caster) && m_targets.m_targetMask != 66/*unit + dest*/ && m_spellInfo->EffectImplicitTargetB[eff] != TARGET_ALL_ENEMY_IN_AREA_INSTANT) return false; break; } Yes - the != 66 is ugly, should be mask-based (& or |) but I forgot how to use it ^^
-
If you give no arguments for setmovetype command it will crash: diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index dd14161..c80fed8 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -1966,6 +1966,9 @@ bool ChatHandler::HandleNpcSetMoveTypeCommand(char* args) MovementGeneratorType move_type; char* type_str = ExtractLiteralArg(&args); + if (!type_str) + return false; + if (strncmp(type_str, "stay", strlen(type_str)) == 0) move_type = IDLE_MOTION_TYPE; else if (strncmp(type_str, "random", strlen(type_str)) == 0)
-
Yes Ambal they are gone - I have had 1 day uptimes before - Now its almost 3 days and still online. No ACE-related crashes since applying that after Derex's commit nice to see it becouse it was really annoying and seemed pretty random.
-
True - happens mostly on execute, some ppl said it depends on facing the target, if its above some and below maximum possible then its nothing shown.
Contact Us
To contact us
click here
You can also email us at [email protected]
Privacy Policy | Terms & Conditions
You can also email us at [email protected]
Privacy Policy | Terms & Conditions
Copyright © getMaNGOS. All rights Reserved.
This website is in no way associated with or endorsed by Blizzard Entertainment®
This website is in no way associated with or endorsed by Blizzard Entertainment®