Go Back   EQEmulator Home > EQEmulator Forums > Archives > Archive::Development > Archive::Development

Archive::Development Archive area for Development's posts that were moved here after an inactivity period of 90 days.

Reply
 
Thread Tools Display Modes
  #1  
Old 08-20-2004, 03:09 PM
Branks
Sarnak
 
Join Date: May 2004
Posts: 58
Default

thanks for the compliments, nice to know someone considers this usefull, anyway heres the progress at the moment, i just completely fixed swarm pets working 100% correctly except the fine details of models/max hit etc, currently i have them labeled as pets, despawning correctly and everything else is done so they no longer can KS players, and work just as they do on live with the exception of gaining a second target when the original target dies, (ok so 99% correct) i'll work on this. i'll put the code on here as soon as i remove all my comments and testing stuff statments.

however it wont be complete because i cant seem to find information anywhere at all on the correct damage and models of the pets, nor information on what exactly the wards cast, so ill just put in a minor list of what i know

mage swarm pets are size 3 earth elementals with a max hit of around 50

wizards = call of xuzl pets, hit 50ish

shaman pets = spirit wolves hit 50ish

mage servant of ro = fire elemental that casts some spell? normal size

PoP pet weapon procs= invis man with the class epic with the exception of the SK weapon which the model is a skeleton, these have a max hit of 90ish

call of wu monk pet proc...whats this one wield, is the epic visable? or does it even wield the epic?

call of time...hearing its somehting that looks like the spear from solusek ro and has a max hit 415?

tricksters calling and stone animation im guessing are NPC spells however if anyone knows details on these please let me know also since their temporary pets also and it would be nice to see them working correctly

swarm of decay...im guessing rooted skeletons with bows?

wards....invis man that casts some unknown spells

should i maybe post these questions in another forum? ive got a lil usefull info from leaving the server up the last 2 days but mainly people just seem to manaburn each other in the arena 2 dozen times and log out.

im also pretty close to the timer check thing to not allow reuse untill the timer has expired but currently its not 100% and causing skills to only be used once per zone

also another problem ive found is that the spell ids change with each patch and when the server and client list dont match this causes issues and while the spell ids are in the code itself its kinda useless, i cant think of anything to correct the mismatch of client/server however the IDs need to be removed from the code so i was wanting to put in another column in alt_vars with the spell ids for each skill along side their cost and max level this way as the server is updated people could use an sql file to make AAs work with the new spells lists, however currently im not too sure how to do this. but plan to work on it, however if anyone else has done this or wants to feel free, id appreciate it

anyway thats all for now ill work on getting the swarm code cleaned up a bit and working more like normal pets and post is a lil later
Reply With Quote
  #2  
Old 08-20-2004, 03:50 PM
Ace
Sarnak
 
Join Date: Aug 2004
Posts: 32
Default

If it's helpful any, my bard pet weapon (Coral Hilted Shortsword) proc'd a pet which hit for 94 maximum. It may have been 96, but I am unsure. I am completely positive that it hit for at least 94. The pet also kicks and bashes, but I cannot remember those damage numbers offhand.

If you need any info with the pet weapon, give me a shout and I can test it in game.

I would assume the other pet weapons follow this damage pattern as well.
Reply With Quote
  #3  
Old 08-20-2004, 06:46 PM
Branks
Sarnak
 
Join Date: May 2004
Posts: 58
Default

thats what i was looking for, thanks!
Reply With Quote
  #4  
Old 08-20-2004, 11:13 PM
Ace
Sarnak
 
Join Date: Aug 2004
Posts: 32
Default

Again, if you need anymore info, shoot me a PM and I can get it for you.
Reply With Quote
  #5  
Old 08-22-2004, 01:46 AM
monalin crusader
Hill Giant
 
Join Date: May 2004
Posts: 238
Default

Quote:
prevents spell 2821 from being cast, so does anyone know how i could make 2821 an allowable spell for HT since im pretty sure it is correct, but i may be wrong since ive never played an SK myself.
try this it kinda defeats teh purpose of having this line in here for those spells but it just allows the spell id u want to get through to work. And yes the HT spell does get more powerful as u get 40+ It also gets alot harder to resist and does a heck of a lot more dmg. My sk at 65 on the emulator only does 700 for an HT at 65 and thats wrong hehe.

Code:
					  if((spell_to_cast != castspell->spell_id) && (spell_to_cast != 2821) 
					  { 
						 InterruptSpell(castspell->spell_id); //CHEATER!!! 
						 break; 
					  }
Also i've been looking into the pets recently and they're casting warders because there is no data in the DB for it to cast the spell. When it looks in the DB for the correct pet it cant find it and casts a default pet spell. I'm not sure where thats located in the code or even if its in the db. I can look around a little and see if that helps.
Reply With Quote
  #6  
Old 08-22-2004, 02:58 AM
Branks
Sarnak
 
Join Date: May 2004
Posts: 58
Default

the pet code is in zone\spells.cpp and it has defaults for anything thats not already listed in "pets" in the DB, i think you may be mistaken as to what i was speaking of, of wards, i meant the wards that are summoned for the AA skills such as ward of destructions and others, clerics and shaman get ones that casts an AE heal for a duration of time and wizards get one that does damage and maybe a few other classes ive forgoten at the moment.

ive also been told of a bug with some pets spawning level 200+ which i'll look into sometime since ive become quite familiar with the whole pet making process due to the swarm pets, also as an update to those, sorry no code yet but i found a new bug with them, currently if you have a pet and use them your real pet despawns with them, im working on correcting this atm but not making much progress. my newest plan is to try and find a way to add an extra spot or use an unknown as a swarm pet ID in the player profile to solve the problem of pets questioning whom their owner is and then despawning, although im not all too sure if thats even possible, regardless currently its not quite right and its a lot of code which ive already completely redone 3 times nows and still having problems so id rather not waste another full page on this thread for something that i may redo tommorow, if anyone wants to play with their current state you can log into my server ive had up a few days now and i guess ill keep up awhile longer as its been rather usefull for gathering information on many of the AA skills, or PM me and ill send you the current codes ive got.

also, has anyone fixed this items vanishing bug when you zone? im hearing its a common bug but i havent had much luck correcting it yet. anyway thats all for now.
Reply With Quote
  #7  
Old 08-22-2004, 05:11 AM
sotonin
Demi-God
 
Join Date: May 2004
Posts: 1,177
Default

rangerdown posted a fix for the pets spawning uber. for 1 pet the summoned mistwalker. perhaps the same logic could be used to fix the others. i beleive its in the bug forums somewhere
Reply With Quote
  #8  
Old 08-22-2004, 05:44 AM
monalin crusader
Hill Giant
 
Join Date: May 2004
Posts: 238
Default

Quote:
i think you may be mistaken as to what i was speaking of, of wards
Hehe Yes i was i dunno what i was thinking doh. =P[/code]
Reply With Quote
  #9  
Old 08-23-2004, 03:02 PM
Branks
Sarnak
 
Join Date: May 2004
Posts: 58
Default

here a solution to the overpowered pets bug/problem, i havent seen rangerdown's post so sorry if its the same thing, anyway this will simply making any pet thats unknown to the code/database, a lev 10 gnome with a max hit of 10 and display a message in zone.exe stating the character id of the caster and the spell id used with the unknown pet so that you can go through and update them. im not exactly sure how the exsisting code for default pets was supposed to work however it seems it was getting the raw information from the spell being cast and trying to create a pet from that, maybe the way pet spells are made have been changed? dont know, anyway it was multiplying things it shouldnt have in an attempt to make a pet from the spell data and well wasnt working correctly, thus we had lev 200+ pets.


in zone\spells.cpp around line 6472 if youve been useing any of the other code ive been posting.

otherwise do a search for "spell property testing functions" and scroll up a few lines till you find the default case for for MakePet and replace the exsisting code between "default:" and "break;"
with

Code:
	default:
		CastToClient()->Message(0,"Unknown Pet Type! Tell your GM to Update! for now enjoy your gimp!");
		int chid=CastToClient()->CharacterID();
		int spel=casting_spell_id;
		cout<<"Unknown pet type being created by Character ID "<<chid<<" in Spell ID "<<spel<<endl;
		strcpy(npc_type->name, "Gimpy");
		npc_type->size = 2;
		npc_type->level = 10;
		npc_type->race = 12;
		npc_type->gender = 0;
		npc_type->texture = 1;
		npc_type->min_dmg = 1;
		npc_type->max_dmg = 10;
		npc_type->max_hp = 200;
		break;
excluding the "default:" and "break" of course.

edit- I'll learn to type someday.
Reply With Quote
  #10  
Old 08-23-2004, 03:12 PM
sotonin
Demi-God
 
Join Date: May 2004
Posts: 1,177
Default

why gnome? make it a puppy or a rat. =D
Reply With Quote
  #11  
Old 08-23-2004, 07:09 PM
Branks
Sarnak
 
Join Date: May 2004
Posts: 58
Default

puppy > gnome. just cant touch the gimpness that is gnomes, anyway uh heres a few other AAs, and im redoing manaburn and lifeburn so their pvpable will update that in a moment. swarm pets still buggy so no code yet but ive almost got enough information from people that their all the correct models now. no luck on the wards yet...

redid SK weapon proc buffs to make them work correctly.
soul abrasion.
healing adept.
advanced healing adept.
healing gift.
advanced healing gift.
casting fury.
fury mastery.
fury of magic mastery.
theft of life.
removed the FD effect of lifeburn server side which was causing issues.
added a message to heals for caster and target.


zone\spells.cpp search for " nukes, heals; also "

and replace the exsisting case: SE_CurrentHP with

Code:
			case SE_CurrentHP:	// nukes, heals; also regen/dot if a buff
			{
#ifdef SPELL_EFFECT_SPAM
				snprintf(effect_desc, _EDLEN, "Current Hitpoints: %+i", effect_value);
#endif

				// SE_CurrentHP is calculated at first tick if its a dot/buff
				if (buffslot >= 0)
					break;

				// for offensive spells check if we have a spell rune on
				sint32 dmg = effect_value;
				if(dmg < 0)
				{
					// take partial damage into account
					dmg = (int) (dmg * partial / 100);
					if (caster && caster->IsClient())
					{
						dmg = caster->GetActSpellValue(spell_id, dmg);
						
						//Dook- Soul Abrasion, 3 levs, increase self buff procs damage 40% each
						if(caster->CastToClient()->GetAA(89))
						{
							if((spell_id==2718) ||
								(spell_id==2712) ||
								(spell_id==1471) ||
								(spell_id==3228) ||
								(spell_id==4910) ||
								(spell_id==4908))
							{
								uint8 lev=0;
								lev=caster->CastToClient()->GetAA(89);
								if(lev==1){dmg=dmg*1.67;}
								else if(lev==2){dmg=dmg*2.34;}
								else if(lev==3){dmg=dmg*3.01;}
							}
						}

						//spell crits
						int chance = 0;
						float ratio =1.0;

						//normal spell crit for wizards
						if(caster_level >= 11 && caster->GetClass() == WIZARD)
						{
							chance+= 7;
							ratio +=.15;
						}

						//spell casting fury, fury mastery, and fury of magic mastery. Dook-
						uint8 scf = 0;
						uint8 scfm = 0;
						uint8 cfom = 0;
						uint8 fomm = 0;
						uint8 cfomm = 0;
						scf = caster->CastToClient()->GetAA(23);
						scfm = caster->CastToClient()->GetAA(114);
						cfom = caster->CastToClient()->GetAA(215);	//cleric
						fomm = caster->CastToClient()->GetAA(216);
						cfomm = caster->CastToClient()->GetAA(260);	//cleric only?
						if(scf == 1) {chance+=2; ratio += .333;}
						if(scf == 2) {chance+=5; ratio += .666;}
						if(scf == 3) {chance+=7; ratio += 1.0;}
						if(scfm == 1){chance+=3;}
						if(scfm == 2){chance+=5;}
						if(scfm == 3){chance+=7;}
						if(fomm == 1){chance+=2;}
						if(fomm == 2){chance+=4;}
						if(fomm == 3){chance+=6;}
						if(cfom == 1){chance+=2;}
						if(cfom == 2){chance+=4;}
						if(cfom == 3){chance+=6;}
						if(cfomm == 1){chance+=2;}
						if(cfomm == 2){chance+=4;}
						if(cfomm == 3){chance+=6;}
				
						int r=MakeRandomInt(0,100);
						if((r <= chance)&&(spell.targettype!=6))
						{
							dmg = (int)(dmg * ratio);
							entity_list.MessageClose(this, false, 75, 0, "%s delivers a critical blast! (%d)", caster->GetCleanName(), ((dmg)*(-1)));
							caster->Message(0,"You deliver a critical blast! (%d)", ((dmg)*(-1)));
						}
					}

					sint32 origdmg = dmg;
					dmg = ReduceMagicalDamage(dmg, GetMagicRune());
					if (origdmg != dmg && caster)
					{
						caster->Message(15,
							"The Spellshield absorbed %d of %d points of damage",
							abs(origdmg - dmg), abs(origdmg));
					}

					if (dmg == 0)	// rune absorbed it all
						break;
				}
				else if(dmg > 0)
				{
					if (caster && caster->IsClient())
					{
						dmg = caster->GetActSpellValue(spell_id, dmg);
						int dur=spell.buffduration;
						
						//Dook- Healing Adept and Advance Heal Adept
						uint8 ha = 0;
						ha = caster->CastToClient()->GetAA(18);
						if((dur==0)&&(spell_id!=13)&&(ha>=1))
						{
							uint8 aha = 0;
							aha = caster->CastToClient()->GetAA(146);
							if(ha==1 && aha==0){dmg=dmg*1.02;}
							else if(ha==2 && aha==0){dmg=dmg*1.05;}
							else if(ha==3 && aha==0){dmg=dmg*1.10;}
							else if(ha==3 && aha==1){dmg=dmg*1.13;}
							else if(ha==3 && aha==2){dmg=dmg*1.16;}
							else if(ha==3 && aha==3){dmg=dmg*1.19;}
						}

						//heal crits
						int chance = 0;
						float ratio =1.0;

						//Remove next 5 lines if you dont want innate cleric crit heals
						if(caster->GetLevel() >= 11 && caster->GetClass() == CLERIC)
						{
							chance+= 5;
							ratio +=.15;
						}

						//healing gift, advance HG, Dook-
						uint8 hg=0;
						uint8 ahg=0;
						hg=(caster->CastToClient()->GetAA(19));
						ahg=(caster->CastToClient()->GetAA(147));
						if(hg == 1){chance+=3; ratio += .333;}
						if(hg == 2){chance+=6; ratio += .666;}
						if(hg == 3){chance+=10; ratio += 1.0;}
						if(ahg == 1){chance+=2;}
						if(ahg == 2){chance+=2;}
						if(ahg == 3){chance+=2;}
				
						if(MakeRandomInt(0,100) <= chance)
						{
							dmg = (int)(dmg * ratio);
							entity_list.MessageClose(this, false, 75, 0, "%s performs an exception heal! (%d)", caster->GetName(), dmg);
							caster->Message(0,"You perform and exceptional heal! (%d)", dmg);
						}
					}
					if(((this->GetHP())+dmg) >= (this->CalcMaxHP()))
					{
						dmg=((this->CalcMaxHP())-(this->GetHP()));
					}
					if(this->IsClient())
					{
						this->Message(1,"%s has healed you for %d point of damage.", caster->GetCleanName(), dmg);
					}
					if(caster->IsClient())
					{
						caster->Message(1, "You have healed %s for %d points of damage.", this->GetCleanName(), dmg);
					}
				}
				this->ChangeHP(caster, dmg, spell_id, buffslot);
#ifdef SPELL_EFFECT_SPAM
				snprintf(effect_desc, _EDLEN, "Current Hitpoints: %+i  actual: %+i", effect_value, dmg);
#endif
				break;
			}

do a search for "SE_WeaponProc:" and replace exsist case with this

Code:
			case SE_WeaponProc:
			{
#ifdef SPELL_EFFECT_SPAM
				snprintf(effect_desc, _EDLEN, "Weapon Proc: %s (id %d)", spells[effect_value].name, effect_value);
#endif


				if(spell_id==2574)//scream of death
				{
					AddProcToWeapon(2718);
					break;
				}
				if(spell_id==2576)//mental corruption
				{
					AddProcToWeapon(2712);
					break;
				}
				if(spell_id==1459)//shroud of death
				{
					AddProcToWeapon(1471);
					break;
				}
				if(spell_id==1376)//shroud of undeath
				{
					AddProcToWeapon(1471);
					break;
				}
				if(spell_id==1459)//shroud of death
				{
					AddProcToWeapon(1471);
					break;
				}
				if(spell_id==3227)//shroud of chaos
				{
					AddProcToWeapon(3228);
					break;
				}
				if(spell_id==4903)//black shroud
				{					//procs 4910
					AddProcToWeapon(4910); //then 4911 to client
					break;
				}
				if(spell_id==4902)//mental horror
				{					//procs 4908
					AddProcToWeapon(4908);	//then 4909 to the client
					break;
				}
				else
					AddProcToWeapon(spell.base[i]);
				break;
			}
now on to zone\attack.cpp do a search for "if spell is lifetap" and make sure your at the second one around like 1600 something since there seems to be the exact same code in 2 spots for some reason i dont know. replace exsisting to

Code:
	// if spell is lifetap add hp to the caster
	if (other && IsLifetapSpell( spell_id ))
	{
		int32 healedhp=damage;

		//Dook-Theft of Life
		if((other->CastToClient()->GetAA(214)) >= 1)
		{
			int chance = 101;
			float ratio = 0;
			int tol=0;
			tol=other->CastToClient()->GetAAStruct()->pop_ability.named.theft_of_life;
			if(tol==1){chance=97; ratio=1.333;}
			if(tol==2){chance=94; ratio=1.666;}
			if(tol==3){chance=90;  ratio=2.000;}
			if((MakeRandomInt(0,100)) >= chance)
			{
				healedhp=damage*ratio;
				entity_list.MessageClose(other,false,75,0,"%s performs an exceptional heal! (%d)",other->GetName(),healedhp);
				other->Message(0,"You perform an exceptional heal! (%d)",healedhp);
			}
			else
			{
				healedhp=damage;
			}
		}

		// check if healing would be greater than max hp
		// use temp var to store actual healing value
		if ( other && other->GetHP() + healedhp > other->GetMaxHP()) //healedhp was damage
		{
			healedhp = other->GetMaxHP() - other->GetHP();
			other->SetHP(other->GetMaxHP());
		}
		else
		{
		//	healedhp = damage;	//testing
			if(other != 0)
    			other->SetHP(other->GetHP() + healedhp);	//was damage
		}


		// if client was casting the spell there need to be some messages
		if (other->IsClient())
		{
			other->CastToClient()->Message(4,"You have been healed for %d points of damage.", healedhp);
		}
			
		// emote goes with every one ... even npcs
then back into zone\spells.cpp do a search for "SE_FeignDeath"
after the #endif add

Code:
				if(spell_id==2488)	//Dook- Lifeburn fix
					break;
couple more in a few.
Reply With Quote
  #12  
Old 08-24-2004, 12:36 AM
Cisyouc
Demi-God
 
Join Date: Jun 2004
Location: Heaven.
Posts: 1,260
Default

Quote:
Originally Posted by Branks
puppy > gnome
Die!! Gnome > ALL!
__________________
namespace retval { template <class T> class ReturnValueGen { private: T x; public: ReturnValueGen() { x = 0; }; T& Generator() { return x; }; }; } int main() { retval::ReturnValueGen<int> retvalue; return retvalue.Generator(); }
C++ is wonderful.
Reply With Quote
  #13  
Old 08-24-2004, 01:04 AM
sotonin
Demi-God
 
Join Date: May 2004
Posts: 1,177
Default

is this stuff being added into the CVS ? please say that it is =p
Reply With Quote
  #14  
Old 08-24-2004, 06:01 AM
Branks
Sarnak
 
Join Date: May 2004
Posts: 58
Default

would be pointless till i get the timers working correctly, for anything other than none legit servers. currently i can put in a check for them each time you zone but they dont refresh so you can only use a skill once per zone. plus all of these need a little finishing touches because i dont know the exact values of some skills and have just gone by "feel" and guesstimates from players.

also ive been looking at the way LoH and HT work and they seem to do the same thing in that they dont update untill you zone. id really like to hear from some of the devs about this since im still extremly newbish with all this and would like to know if ive made any common mistakes and also if it would be a bad thing to have 20 or so timers running for each client in order to make AAs refresh correctly, i had to add a new timers for swarm pets and noticed no performance loss however that was only one timer, would it be an issue to have several running? also is there anywhere i can find a list of the message types in order to properly do messages so that they filter correctly and crits etc dont show up when you use the options to turn them off? anyway in a bit of a rush ill be back in a few hours.
Reply With Quote
  #15  
Old 08-24-2004, 08:44 AM
sotonin
Demi-God
 
Join Date: May 2004
Posts: 1,177
Default

last i heard scorp got timers working correctly... ?? maybe im wrong.
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

   

All times are GMT -4. The time now is 08:07 PM.


 

Everquest is a registered trademark of Daybreak Game Company LLC.
EQEmulator is not associated or affiliated in any way with Daybreak Game Company LLC.
Except where otherwise noted, this site is licensed under a Creative Commons License.
       
Powered by vBulletin®, Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Template by Bluepearl Design and vBulletin Templates - Ver3.3