ArcEmu: [Applied][addition]spell Difficulty Support - ArcEmu

Jump to content

Toggle shoutbox Lastest Announcements

dfighter  : (07 December 2014 - 12:06 PM) Arcemu is in hibernation mode, please read http://arcemu.org/fo...showtopic=26903
dfighter  : (01 January 2013 - 05:56 PM) Arcemu wishes you all a happy new year!
Hasbro  : (12 September 2012 - 10:01 AM) Please excuse our outage from the web! Our web host had a major malfunction!
dfighter  : (01 September 2012 - 04:05 PM) Since the spam bots just don't want to stop, I've enabled admin verification when registering.
dfighter  : (23 January 2012 - 09:56 PM) Please note that from now on you will need to confirm your email on the wiki in order to edit it!
Hasbro  : (31 December 2011 - 12:50 PM) Happy New Years all!
Navid  : (26 December 2011 - 04:09 AM) Merry Christmas !!!!!! Happy holidays all :)
WAmadeus  : (24 December 2011 - 03:54 PM) Merry Christmas to all!
dfighter  : (24 December 2011 - 11:05 AM) The Arcemu team wishes y'all a Merry Christmukkah!
Hasbro  : (05 October 2011 - 12:53 PM) Looking for web designers for upcoming web related project. If you're interested in designing user interfaces contact me
dfighter  : (02 September 2011 - 03:47 PM) So who here wants vehicles in Arcemu? :P http://arcemu.org/fo...showtopic=25440
Hasbro  : (14 August 2011 - 03:25 PM) Join us on irc, grab an irc client and connect to irc.freenode.net join channel #arcemu /server irc.freenode.net:6667 /join #arcemu
jackpoz  : (03 August 2011 - 05:33 AM) to all Lua Engine (old one) users: please check http://arcemu.org/fo...showtopic=25274
Hasbro  : (20 May 2011 - 05:27 PM) Looking for people experienced with CMake configuration and setup! Contact me asap
Hasbro  : (15 May 2011 - 05:03 PM) ArcEmu is recruiting C++ programmers, contact Hasbro if interested.
paroxysm  : (03 May 2011 - 06:26 PM) Updated luabridge gossip example to describe the whole gossip creation process rather than just how to create menu. Gossip tutorial
paroxysm  : (23 April 2011 - 11:35 AM) Lua writers can refer to the Luabridge Tutorials section in the Wiki to learn how to write gossip code correctly.
Hasbro  : (20 April 2011 - 05:22 PM) Thank you for your continuous contribution of bug reports, we are working on them.
Hasbro  : (17 April 2011 - 03:20 AM) Please consider donating to support our bills. Donations can be sent using PayPal to donations@arcemu.org - Thank you for your support.
paroxysm  : (10 April 2011 - 12:43 AM) Refer to the Luabridge Tutorials section in the Wiki to learn the new syntax of luabridge.
Resize Shouts Area

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

[Applied][addition]spell Difficulty Support

#1 User is offline   sanctum32 

  • Occasional Poster
  • PipPip
  • Group: Members
  • Posts: 118
  • Joined: 28-November 10
  • Gender:Male

Posted 18 May 2011 - 07:06 AM

created on arcemu r4203

it implements feature, to load difficulty spells from spelldifficulty.dbc using original spell entry.
main author is NoFantasy, i only rewrote it in arcemu format.

http://pastebin.com/CJ4WWnQT - v1
report all issues if will founded here, thanks

http://pastebin.com/WYpzJu3R - v2 with cleanup and corrections.
http://pastebin.com/yhKUKePC - v3 fully removed instance* pinstance = NULL and some other corrections.

This post has been edited by sanctum32: 21 May 2011 - 08:49 AM

Posted Image
Posted Image
Sorry for my bad english
0

#2 User is offline   WAmadeus 

  • Cunning Code Composer
  • PipPipPip
  • Group: Developers
  • Posts: 287
  • Joined: 23-July 09
  • Gender:Male
  • Location:Brazil

Posted 18 May 2011 - 09:36 PM

+#define MAP_DIFFICULTY 4
+
+struct SpellDifficultyEntry
+{
+	uint32 ID;
+	uint32 SpellId[MAP_DIFFICULTY];
+};
+


This define is named better as MAX_MAP_DIFFICULTY

+	Arcemu::Util::ARCEMU_ASSERT( info==dbcSpell.LookupEntry(info->Id) && "`info` must be pointer to dbcSpell element" );


This assert will slow down the server

+	Instance* pInstance = NULL;
+	if (info->SpellDifficultyID && Caster->GetTypeId() != TYPEID_PLAYER && Caster->IsInWorld() && IS_PERSISTENT_INSTANCE(pInstance))
+	{
+    	if (SpellEntry *spellEntry = GetSpellEntryByDifficulty(info->SpellDifficultyID, pInstance->m_difficulty))
+        	m_spellInfo = spellEntry;
+    	else
+        	m_spellInfo = info;
+	}
+	else
+    	m_spellInfo = info;


You instantiate pInstance with NULL, don't fill it with anything, and use it in IS_PERSISTENT_INSTANCE and pInstance->m_difficulty

+SpellEntry* GetSpellEntryByDifficulty(uint32 id, uint32 difficulty)
+{
+	SpellDifficultyEntry* spellDiff = dbcSpellDifficultyEntry.LookupEntry(id);
+	Instance* pInstance = NULL;
+
+	if (!spellDiff)
+    	return NULL;
+
+	difficulty = pInstance->m_difficulty;
+	if (!spellDiff->SpellId[difficulty])
+    	return NULL;
+
+	SpellEntry* spellDifficulty = dbcSpell.LookupEntry(spellDiff->SpellId[difficulty]);
+	return spellDifficulty;
+}


Here again you de-reference a null pointer at pInstance. And what's the point of parameter "difficulty"? You are using it as a local variable.
1

#3 User is offline   sanctum32 

  • Occasional Poster
  • PipPip
  • Group: Members
  • Posts: 118
  • Joined: 28-November 10
  • Gender:Male

Posted 18 May 2011 - 10:31 PM

MAX_MAP_DIFFICULTY - ok ;)
thx for comments, correcting...
Posted Image
Posted Image
Sorry for my bad english
0

#4 User is offline   WAmadeus 

  • Cunning Code Composer
  • PipPipPip
  • Group: Developers
  • Posts: 287
  • Joined: 23-July 09
  • Gender:Male
  • Location:Brazil

Posted 19 May 2011 - 07:58 AM

+	Instance *pInstance = NULL;
+	if( Caster->GetMapMgr() && Caster->IsCreature() && !Caster->IsPet() && Caster->IsInWorld())
+		pInstance = Caster->GetMapMgr()->pInstance;
+
+	if (info->SpellDifficultyID && Caster->GetTypeId() != TYPEID_PLAYER && Caster->IsInWorld() && IS_PERSISTENT_INSTANCE(pInstance))
+	{
+		if (SpellEntry *spellEntry = GetSpellEntryByDifficulty(info->SpellDifficultyID, pInstance->m_difficulty))
+			m_spellInfo = spellEntry;
+		else
+			m_spellInfo = info;
+	}
+	else
+		m_spellInfo = info;


You are still de-referencing NULL
0

#5 User is offline   sanctum32 

  • Occasional Poster
  • PipPip
  • Group: Members
  • Posts: 118
  • Joined: 28-November 10
  • Gender:Male

Posted 21 May 2011 - 08:50 AM

ok, i think, now it is completed. Thanks Wamadeus for pointing.
in v3 removed all NULL de-referencing.
Posted Image
Posted Image
Sorry for my bad english
0

#6 User is offline   jackpoz 

  • ArcEmu Lemon Priest
  • PipPipPipPipPipPipPipPip
  • Group: Developers
  • Posts: 2,153
  • Joined: 19-June 08
  • Gender:Male
  • Location:Italy
  • Server OS:Windows

Posted 29 July 2011 - 04:10 PM

line 93
+ if(info->SpellDifficultyID && Caster->GetTypeId()!=TYPEID_PLAYER && Caster->IsInWorld() && Caster->GetMapMgr() && Caster->GetMapMgr()->pInstance!=NULL)

you call check if Caster->IsInWorld() is true and then if Caster->GetMapMgr() is not NULL, but
bool IsInWorld() { return m_mapMgr != NULL; }

MapMgr* GetMapMgr() const { return m_mapMgr; }

so the 2 checks are equivalent in that "if" and 1 is enough.

I also wonder if this "get the spell base on instance" check should be moved from Spell ctor somewhere else, because as you wrote in your code, this shouldn't affect players. If it will mostly affect scripted Creatures (like the ones in ArcScripts), then we could add this check in CreatureAIScript. Another way could be to put it in AIInterface, like AIInterface::CastSpell() or AIInterface::addSpellToList() (in the second case the check will be done only once instead of every time the Spell is casted). With some more informations about when and how Spells have different difficulties I'm sure we'll find a proper place for this feature :( (this is just my personal opinion, any other idea is most welcome :) )
Posted Image We develop dreams. Your dreams ;)
Posted ImagePosted Image
0

#7 User is offline   sanctum32 

  • Occasional Poster
  • PipPip
  • Group: Members
  • Posts: 118
  • Joined: 28-November 10
  • Gender:Male

Posted 31 July 2011 - 05:36 PM

ah, it is true, forgot to review IsInWorld function, thanks, patch works, tested few times, but anyway, IsHeroic or similar check can't be removed from scripts fully, because some of AI can be diffirent in heroic mode.

i will update this when i'll get a time.
Posted Image
Posted Image
Sorry for my bad english
0

#8 User is offline   sanctum32 

  • Occasional Poster
  • PipPip
  • Group: Members
  • Posts: 118
  • Joined: 28-November 10
  • Gender:Male

Posted 15 January 2012 - 06:52 AM

thanks jackpoz, anyway i'm not sure about gameobjects (spell caster type)
in aprox 1 hour i'll open pull request with updated, cleaned up and corected this patch version.
Posted Image
Posted Image
Sorry for my bad english
0

#9 User is offline   dfighter 

  • Titles are overrated
  • PipPipPipPipPipPipPipPipPipPip
  • Group: Administrator
  • Posts: 5,189
  • Joined: 14-June 08
  • IRC:dfighter
  • Gender:Male
  • Server OS:Linux

Posted 25 January 2012 - 01:20 PM

- Applied.
- Moved to applied patches.
"The demand for free goods is infinite."
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users