2013-05-09 10:44:08 -04:00
/* EQEMu: Everquest Server Emulator
Copyright ( C ) 2001 - 2004 EQEMu Development Team ( http : //eqemu.org)
2013-02-16 16:14:39 -08:00
2013-05-09 10:44:08 -04:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; version 2 of the License .
2013-02-16 16:14:39 -08:00
2013-05-09 10:44:08 -04:00
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY except by those people which sell it , which
2013-02-16 16:14:39 -08:00
are required to give you total support for your newly bought product ;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
2013-05-09 10:44:08 -04:00
A PARTICULAR PURPOSE . See the GNU General Public License for more details .
2013-02-16 16:14:39 -08:00
2013-05-09 10:44:08 -04:00
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
2013-02-16 16:14:39 -08:00
*/
# include "../common/debug.h"
# include <iostream>
using namespace std ;
# include <string.h>
# include <stdlib.h>
# include <stdio.h>
# include <signal.h>
# include <time.h>
# ifdef _CRTDBG_MAP_ALLOC
# undef new
# endif
# include <fstream>
# ifdef _CRTDBG_MAP_ALLOC
# define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
# endif
using namespace std ;
# ifdef WIN32
# include <conio.h>
# define snprintf _snprintf
# define vsnprintf _vsnprintf
# define strncasecmp _strnicmp
2013-05-09 10:44:08 -04:00
# define strcasecmp _stricmp
2013-02-16 16:14:39 -08:00
# endif
bool spells_loaded = false ;
volatile bool RunLoops = true ;
extern volatile bool ZoneLoaded ;
# ifdef SHAREMEM
2013-05-09 10:44:08 -04:00
# include "../common/EMuShareMem.h"
extern LoadEMuShareMemDLL EMuShareMemDLL ;
# ifndef WIN32
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/sem.h>
# include <sys/shm.h>
2013-02-16 16:14:39 -08:00
# ifndef FREEBSD
2013-05-09 10:44:08 -04:00
union semun {
int val ;
struct semid_ds * buf ;
ushort * array ;
struct seminfo * __buf ;
void * __pad ;
} ;
2013-02-16 16:14:39 -08:00
# endif
2013-05-09 10:44:08 -04:00
# endif
2013-02-16 16:14:39 -08:00
# endif
# include "../common/queue.h"
# include "../common/timer.h"
2014-08-21 19:33:02 -07:00
# include "../common/eq_stream.h"
2013-02-16 16:14:39 -08:00
# include "../common/eq_packet_structs.h"
2014-08-21 19:36:50 -07:00
# include "../common/mutex.h"
2013-02-16 16:14:39 -08:00
# include "../common/version.h"
# include "../common/files.h"
2014-08-21 19:33:02 -07:00
# include "../common/eqemu_error.h"
2013-02-16 16:14:39 -08:00
# include "../common/packet_dump_file.h"
# include "masterentity.h"
# include "worldserver.h"
# include "net.h"
# include "spdat.h"
# include "zone.h"
# include "command.h"
# include "parser.h"
# include "embparser.h"
# ifndef NEW_LoadSPDat
void LoadSPDat ( SPDat_Spell_Struct * * SpellsPointer ) {
//FILE *fp;
//cout << "Beginning Spells memset." << endl;
int u ;
//for (u = 0; u < SPDAT_RECORDS; u++)
//{ //cout << u << ' ';
memset ( ( char * ) & spells , 0 , sizeof ( SPDat_Spell_Struct ) * SPDAT_RECORDS ) ;
//}
//cout << "Memset finished\n";
char temp = ' ' ;
int tempid = 0 ;
char token [ 64 ] = " " ;
int a = 0 ;
char sep = ' ^ ' ;
LogFile - > write ( EQEMuLog : : Normal , " If this is the last message you see, you forgot to move spells_en.txt from your EQ dir to this dir. " ) ;
# ifdef FREEBSD
# error ifstreams seem to break BSD...
# endif
ifstream in ; in . open ( SPELLS_FILE ) ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
if ( ! in . is_open ( ) ) {
LogFile - > write ( EQEMuLog : : Error , " File '%s' not found in same directory as zone.exe, spell loading FAILED! " , SPELLS_FILE ) ;
return ;
}
//while(!in.eof())
//{in >> temp;}
//for(int x =0; x< spellsen_size; x++)
// memset((char*) &spells[x],0,sizeof(SPDat_Spell_Struct));
while ( tempid < = SPDAT_RECORDS - 1 )
{
//if(tempid>3490)
//{
// cout << "BLEH";
// getch();
//}
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
//in.getline(&temp, 624);
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ; //cout << temp<< ' ';
in . get ( temp ) ;
}
tempid = atoi ( token ) ;
if ( tempid > = SPDAT_RECORDS )
break ;
//cout << "TempID: " << tempid << endl;
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
strncpy ( spells [ tempid ] . name , token , a ) ;
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
//cout << spells[tempid].name << '^';
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
strncpy ( spells [ tempid ] . player_1 , token , a ) ;
//cout << spells[tempid].player_1 << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
strncpy ( spells [ tempid ] . teleport_zone , token , a ) ;
//cout << spells[tempid].teleport_zone << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
strncpy ( spells [ tempid ] . you_cast , token , a ) ;
//cout << spells[tempid].you_cast << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
strncpy ( spells [ tempid ] . other_casts , token , a ) ;
//cout << spells[tempid].other_casts << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
2013-05-06 13:07:41 -04:00
token [ u ] = ( char ) 0 ;
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
strncpy ( spells [ tempid ] . cast_on_you , token , a ) ;
//cout << spells[tempid].cast_on_you << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
strncpy ( spells [ tempid ] . cast_on_other , token , a ) ;
//cout << spells[tempid].cast_on_other << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
strncpy ( spells [ tempid ] . spell_fades , token , a ) ;
//cout << spells[tempid].spell_fades << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
in . get ( temp ) ;
}
spells [ tempid ] . range = atof ( token ) ;
//cout << spells[tempid].range << '^';
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . aoerange = atof ( token ) ;
//cout << spells[tempid].aoerange << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . pushback = atof ( token ) ;
//cout << spells[tempid].pushback << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . pushup = atof ( token ) ;
//cout << spells[tempid].pushup << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
in . get ( temp ) ;
2013-02-16 16:14:39 -08:00
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . cast_time = atoi ( token ) ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
//cout << spells[tempid].cast_time << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . recovery_time = atoi ( token ) ;
//cout << spells[tempid].recovery_time << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . recast_time = atoi ( token ) ;
//cout << spells[tempid].recast_time << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . buffdurationformula = atoi ( token ) ;
//cout << spells[tempid].buffdurationformula << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . buffduration = atoi ( token ) ;
//cout << spells[tempid].buffduration << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . ImpactDuration = atoi ( token ) ;
//cout << spells[tempid].ImpactDuration<< '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . mana = atoi ( token ) ;
//cout << spells[tempid].mana << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
int y ;
for ( y = 0 ; y < 12 ; y + + )
{
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . base [ y ] = atoi ( token ) ;
//cout << spells[tempid].base[y] << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
}
for ( y = 0 ; y < 12 ; y + + )
{
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . max [ y ] = atoi ( token ) ;
//cout << spells[tempid].max[y] << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
}
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
2013-05-06 13:07:41 -04:00
spells [ tempid ] . icon = atoi ( token ) ;
2013-02-16 16:14:39 -08:00
//cout << spells[tempid].icon << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
2013-05-06 13:07:41 -04:00
spells [ tempid ] . memicon = atoi ( token ) ;
2013-02-16 16:14:39 -08:00
//cout << spells[tempid].memicon << '^';
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
for ( y = 0 ; y < 4 ; y + + )
{
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . components [ y ] = atoi ( token ) ;
//cout << spells[tempid].components[y] << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
}
for ( y = 0 ; y < 4 ; y + + )
{
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . component_counts [ y ] = atoi ( token ) ; //atoi(token);
//cout << spells[tempid].component_counts[y] << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
}
2013-02-16 16:14:39 -08:00
for ( y = 0 ; y < 4 ; y + + )
{
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . NoexpendReagent [ y ] = atoi ( token ) ; //NoExpend Reagent
//cout << spells[tempid].NoexpendReagent[y] << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
}
for ( y = 0 ; y < 12 ; y + + )
{
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . formula [ y ] = atoi ( token ) ;
//cout << spells[tempid].formula[y] << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
}
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . LightType = atoi ( token ) ;
//cout << spells[tempid].LightType << '^';
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . goodEffect = atoi ( token ) ;
//cout << spells[tempid].goodEffect << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . Activated = atoi ( token ) ;
//cout << spells[tempid].Activated << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . resisttype = atoi ( token ) ;
//cout << spells[tempid].resisttype << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
for ( y = 0 ; y < 12 ; y + + )
{
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . effectid [ y ] = atoi ( token ) ;
//cout << spells[tempid].effectid[y] << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
}
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . targettype = atoi ( token ) ;
//cout << spells[tempid].targettype << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . basediff = atoi ( token ) ;
//cout << spells[tempid].basediff<< '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . skill = atoi ( token ) ;
//cout << spells[tempid].skill << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . zonetype = atoi ( token ) ;
//cout << spells[tempid].zonetype << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . EnvironmentType = atoi ( token ) ;
//cout << spells[tempid].EnvironmentType << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . TimeOfDay = atoi ( token ) ;
//cout << spells[tempid].TimeOfDay << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
for ( y = 0 ; y < 15 ; y + + )
{
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . classes [ y ] = atoi ( token ) ;
//cout << spells[tempid].classes[y] << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
} //cout << "end class";
2013-05-09 10:44:08 -04:00
/*for(y=0; y< 3;y++)
{
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . unknown1 [ y ] = atoi ( token ) ;
cout < < spells [ tempid ] . unknown1 [ y ] < < ' ^ ' ;
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
}
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . unknown2 = atoi ( token ) ;
cout < < spells [ tempid ] . unknown2 < < ' ^ ' ;
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
*/
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . CastingAnim = atoi ( token ) ;
//cout << spells[tempid].CastingAnim << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . TargetAnim = atoi ( token ) ;
//cout << spells[tempid].TargetAnim << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . TravelType = atoi ( token ) ;
//cout << spells[tempid].TravelType << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . SpellAffectIndex = atoi ( token ) ;
//cout << spells[tempid].SpellAffectIndex << '^';
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
for ( y = 0 ; y < 23 ; y + + )
2013-05-09 10:44:08 -04:00
{
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
2013-05-09 10:44:08 -04:00
}
2013-02-16 16:14:39 -08:00
spells [ tempid ] . Spacing2 [ y ] = atoi ( token ) ;
//cout << spells[tempid].base[y] << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
2013-05-09 10:44:08 -04:00
token [ u ] = ( char ) 0 ;
2013-02-16 16:14:39 -08:00
}
2013-05-06 13:07:41 -04:00
2013-05-09 10:44:08 -04:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
2013-02-16 16:14:39 -08:00
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . ResistDiff = atoi ( token ) ;
//cout << spells[tempid].ResistDiff << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
2013-05-09 10:44:08 -04:00
token [ u ] = ( char ) 0 ;
2013-05-06 13:07:41 -04:00
2013-05-09 10:44:08 -04:00
in . get ( temp ) ;
2013-02-16 16:14:39 -08:00
for ( y = 0 ; y < 2 ; y + + )
{
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . Spacing3 [ y ] = atoi ( token ) ;
//cout << spells[tempid].base[y] << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
token [ u ] = ( char ) 0 ;
}
2013-05-09 10:44:08 -04:00
in . get ( temp ) ;
while ( chrcmpI ( & temp , & sep ) )
2013-02-16 16:14:39 -08:00
{
strncat ( token , & temp , 1 ) ;
a + + ;
in . get ( temp ) ;
}
spells [ tempid ] . RecourseLink = atoi ( token ) ;
//cout << spells[tempid].RecourseLink << '^';
a = 0 ;
for ( u = 0 ; u < 64 ; u + + )
2013-05-09 10:44:08 -04:00
token [ u ] = ( char ) 0 ;
2013-02-16 16:14:39 -08:00
2013-05-09 10:44:08 -04:00
while ( temp ! = ' \n ' )
2013-02-16 16:14:39 -08:00
in . get ( temp ) ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
//cout << endl;
if ( tempid = = SPDAT_RECORDS - 1 ) break ;
2013-05-06 13:07:41 -04:00
}
2013-02-16 16:14:39 -08:00
//for(u=0;u< SPDAT_RECORDS;u++)
// cout << u << ' ' << spells[u].name << '^';
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
spells_loaded = true ;
cout < < " Spells loaded. \n " ;
in . close ( ) ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
}
# endif
/*void EntityList::SendAATimer(uint32 charid,UseAA_Struct* uaa){
Client * client2 = this - > GetClientByCharID ( charid ) ;
if ( ! client2 ) {
LogFile - > write ( EQEMuLog : : Error , " Error in SendAATimer: Couldnt find character! " ) ;
return ;
}
client2 - > SendAATimer ( uaa ) ;
}
void ZoneDatabase : : UpdateAndDeleteAATimers ( uint32 charid ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
2013-05-09 10:44:08 -04:00
char * query = 0 ;
2013-02-16 16:14:39 -08:00
char * query2 = 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
if ( ! RunQuery ( query , MakeAnyLenString ( & query , " delete from aa_timers where charid=%i and UNIX_TIMESTAMP(now())>=end " , charid ) , errbuf ) ) {
LogFile - > write ( EQEMuLog : : Error , " UpdateAATimers query '%s' %s " , query , errbuf ) ;
}
if ( ! RunQuery ( query2 , MakeAnyLenString ( & query2 , " update aa_timers set end=end-(UNIX_TIMESTAMP(now())-begin),begin=UNIX_TIMESTAMP(now()) where charid=%i " , charid ) , errbuf ) ) {
LogFile - > write ( EQEMuLog : : Error , " UpdateAATimers query '%s' %s " , query2 , errbuf ) ;
}
safe_delete_array ( query ) ;
safe_delete_array ( query2 ) ;
}
void ZoneDatabase : : UpdateTimersClientConnected ( uint32 charid ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
2013-05-09 10:44:08 -04:00
char * query = 0 ;
2013-02-16 16:14:39 -08:00
if ( ! RunQuery ( query , MakeAnyLenString ( & query , " update aa_timers set end=(UNIX_TIMESTAMP(now())+(end-begin)),begin=UNIX_TIMESTAMP(now()) where charid=%i " , charid ) , errbuf ) ) {
LogFile - > write ( EQEMuLog : : Error , " UpdateAATimers query '%s' %s " , query , errbuf ) ;
}
safe_delete_array ( query ) ;
}
void ZoneDatabase : : GetAATimers ( uint32 charid ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
2013-05-09 10:44:08 -04:00
char * query = 0 ;
MYSQL_RES * result ;
2013-02-16 16:14:39 -08:00
MYSQL_ROW row ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT ability,begin,end from aa_timers WHERE charid=%i " , charid ) , errbuf , & result ) ) {
while ( ( row = mysql_fetch_row ( result ) ) ) {
UseAA_Struct * uaa = new UseAA_Struct ( ) ;
uaa - > ability = atoi ( row [ 0 ] ) ;
uaa - > begin = atoi ( row [ 1 ] ) ;
uaa - > end = atoi ( row [ 2 ] ) ;
entity_list . SendAATimer ( charid , uaa ) ;
safe_delete ( uaa ) ;
}
mysql_free_result ( result ) ;
}
else {
LogFile - > write ( EQEMuLog : : Error , " Database::GetAATimers query '%s' %s " , query , errbuf ) ;
2013-05-06 13:07:41 -04:00
}
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
}
uint32 ZoneDatabase : : GetTimerRemaining ( uint32 charid , uint32 ability ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
2013-05-09 10:44:08 -04:00
char * query = 0 ;
MYSQL_RES * result ;
2013-02-16 16:14:39 -08:00
MYSQL_ROW row ;
uint32 remain = 0 ;
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT end-begin from aa_timers WHERE charid=%i and ability=%i " , charid , ability ) , errbuf , & result ) ) {
if ( ( row = mysql_fetch_row ( result ) ) ) {
remain = atoi ( row [ 0 ] ) ;
}
mysql_free_result ( result ) ;
}
else {
LogFile - > write ( EQEMuLog : : Error , " Database::GetTimerRemaining query '%s' %s " , query , errbuf ) ;
2013-05-06 13:07:41 -04:00
}
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
return remain ;
}
void ZoneDatabase : : UpdateAATimers ( uint32 charid , uint32 endtime , uint32 begintime , uint32 ability ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
2013-05-09 10:44:08 -04:00
char * query = 0 ;
2013-02-16 16:14:39 -08:00
if ( begintime = = 0 ) {
if ( ! RunQuery ( query , MakeAnyLenString ( & query , " replace into aa_timers (charid,end,begin,ability) values(%i,UNIX_TIMESTAMP(now())+%i,UNIX_TIMESTAMP(now()),%i) " , charid , endtime , ability ) , errbuf ) ) {
LogFile - > write ( EQEMuLog : : Error , " UpdateAATimers query '%s' %s " , query , errbuf ) ;
}
}
else {
if ( ! RunQuery ( query , MakeAnyLenString ( & query , " replace into aa_timers (charid,end,begin,ability) values(%i,%i,%i,%i) " , charid , endtime , begintime , ability ) , errbuf ) ) {
LogFile - > write ( EQEMuLog : : Error , " UpdateAATimers query '%s' %s " , query , errbuf ) ;
}
}
safe_delete_array ( query ) ;
} */
/*
uint16 Client : : GetCombinedAC_TEST ( ) {
int ac1 ;
ac1 = GetRawItemAC ( ) ;
if ( m_pp . class_ ! = WIZARD & & m_pp . class_ ! = MAGICIAN & & m_pp . class_ ! = NECROMANCER & & m_pp . class_ ! = ENCHANTER ) {
ac1 = ac1 * 4 / 3 ;
}
ac1 + = GetSkill ( DEFENSE ) / 3 ;
if ( GetAGI ( ) > 70 ) {
ac1 + = GetAGI ( ) / 20 ;
}
int ac2 ;
ac2 = GetRawItemAC ( ) ;
if ( m_pp . class_ ! = WIZARD & & m_pp . class_ ! = MAGICIAN & & m_pp . class_ ! = NECROMANCER & & m_pp . class_ ! = ENCHANTER ) {
ac2 = ac2 * 4 / 3 ;
}
ac2 + = GetSkill ( DEFENSE ) * 400 / 255 ;
int combined_ac = ( ac1 + ac2 ) * 1000 / 847 ;
return combined_ac ;
float combined_ac = ( ( float ) ac1 + ( float ) ac2 ) * 1000.0f / 847.0f ;
return ( uint16 ) combined_ac ; //*10.0f)-10;
}
*/
/*bool Client::GetIncreaseSpellDurationItem(uint16 &spell_id, char *itemname)
{
for ( int i = 0 ; i < 22 ; i + + ) {
const ItemInst * inst = m_inv [ i ] ;
if ( ! inst | | ! inst - > IsType ( ItemTypeCommon ) )
continue ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
const Item_Struct * item = inst - > GetItem ( ) ;
if ( item - > FocusId & & ( item - > FocusId ! = 0xFFFF ) ) {
if ( IsIncreaseDurationSpell ( item - > FocusId ) ) {
spell_id = item - > FocusId ;
if ( itemname )
strcpy ( itemname , item - > Name ) ;
return true ;
}
}
}
return false ;
}
bool Client : : GetReduceManaCostItem ( uint16 & spell_id , char * itemname )
{
for ( int i = 0 ; i < 22 ; i + + ) {
const ItemInst * inst = m_inv [ i ] ;
if ( ! inst | | ! inst - > IsType ( ItemTypeCommon ) )
continue ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
const Item_Struct * item = inst - > GetItem ( ) ;
if ( item - > FocusId & & ( item - > FocusId ! = 0xFFFF ) ) {
if ( IsReduceManaSpell ( item - > FocusId ) ) {
spell_id = item - > FocusId ;
if ( itemname )
strcpy ( itemname , item - > Name ) ;
return true ;
}
}
}
return false ;
}
bool Client : : GetReduceCastTimeItem ( uint16 & spell_id , char * itemname )
{
for ( int i = 0 ; i < 22 ; i + + ) {
const ItemInst * inst = m_inv [ i ] ;
if ( ! inst | | ! inst - > IsType ( ItemTypeCommon ) )
continue ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
const Item_Struct * item = inst - > GetItem ( ) ;
if ( item - > FocusId & & ( item - > FocusId ! = 0xFFFF ) ) {
if ( IsReduceCastTimeSpell ( item - > FocusId ) ) {
spell_id = item - > FocusId ;
if ( itemname )
strcpy ( itemname , item - > Name ) ;
return true ;
}
}
}
return false ;
}
bool Client : : GetExtendedRangeItem ( uint16 & spell_id , char * itemname )
{
for ( int i = 0 ; i < 22 ; i + + ) {
const ItemInst * inst = m_inv [ i ] ;
if ( ! inst | | ! inst - > IsType ( ItemTypeCommon ) )
continue ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
const Item_Struct * item = inst - > GetItem ( ) ;
if ( item - > FocusId & & ( item - > FocusId ! = 0xFFFF ) ) {
if ( IsExtRangeSpell ( item - > FocusId ) ) {
spell_id = item - > FocusId ;
if ( itemname )
strcpy ( itemname , item - > Name ) ;
return true ;
}
}
}
return false ;
}
bool Client : : GetImprovedHealingItem ( uint16 & spell_id , char * itemname )
{
for ( int i = 0 ; i < 22 ; i + + ) {
const ItemInst * inst = m_inv [ i ] ;
if ( ! inst | | ! inst - > IsType ( ItemTypeCommon ) )
continue ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
const Item_Struct * item = inst - > GetItem ( ) ;
if ( item - > FocusId & & ( item - > FocusId ! = 0xFFFF ) ) {
if ( IsImprovedHealingSpell ( item - > FocusId ) ) {
spell_id = item - > FocusId ;
if ( itemname )
strcpy ( itemname , item - > Name ) ;
return true ;
}
}
}
return false ;
}
bool Client : : GetImprovedDamageItem ( uint16 & spell_id , char * itemname )
{
for ( int i = 0 ; i < 22 ; i + + ) {
const ItemInst * inst = m_inv [ i ] ;
if ( ! inst | | ! inst - > IsType ( ItemTypeCommon ) )
continue ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
const Item_Struct * item = inst - > GetItem ( ) ;
if ( item - > FocusId & & ( item - > FocusId ! = 0xFFFF ) ) {
if ( IsImprovedDamageSpell ( item - > FocusId ) ) {
spell_id = item - > FocusId ;
if ( itemname )
strcpy ( itemname , item - > Name ) ;
return true ;
}
}
}
return false ;
}
int32 Client : : GenericFocus ( uint16 spell_id , uint16 modspellid )
{
int modifier = 100 , i ;
const SPDat_Spell_Struct & spell = spells [ spell_id ] ;
const SPDat_Spell_Struct & modspell = spells [ modspellid ] ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
for ( i = 0 ; i < EFFECT_COUNT ; i + + )
{
if ( IsBlankSpellEffect ( modspellid , i ) )
continue ;
switch ( spells [ modspellid ] . effectid [ i ] )
{
case SE_LimitMaxLevel :
2016-02-11 13:07:42 -08:00
if ( spell . classes [ ( GetClass ( ) % 17 ) - 1 ] > modspell . base [ i ] )
2013-02-16 16:14:39 -08:00
return 100 ;
break ;
case SE_LimitMinLevel :
2016-02-11 13:07:42 -08:00
if ( spell . classes [ ( GetClass ( ) % 17 ) - 1 ] < modspell . base [ i ] )
2013-02-16 16:14:39 -08:00
return 100 ;
break ;
case SE_IncreaseRange :
modifier + = modspell . base [ i ] ;
break ;
case SE_IncreaseSpellHaste :
modifier - = modspell . base [ i ] ;
break ;
case SE_IncreaseSpellDuration :
modifier + = modspell . base [ i ] ;
break ;
case SE_LimitSpell :
// negative sign means exclude
// positive sign means include
if ( modspell . base [ i ] < 0 )
{
if ( modspell . base [ i ] * ( - 1 ) = = spell_id )
return 100 ;
}
else
{
if ( spells [ modspellid ] . base [ i ] ! = spell_id )
return 100 ;
}
break ;
case SE_LimitEffect :
switch ( spells [ modspellid ] . base [ i ] )
{
case - 147 :
if ( IsPercentalHealSpell ( spell_id ) )
return 100 ;
break ;
case - 101 :
if ( IsCHDurationSpell ( spell_id ) )
return 100 ;
break ;
case - 40 :
if ( IsInvulnerabilitySpell ( spell_id ) )
return 100 ;
break ;
case - 32 :
if ( IsSummonItemSpell ( spell_id ) )
return 100 ;
break ;
case 0 :
if ( ! IsEffectHitpointsSpell ( spell_id ) )
return 100 ;
break ;
case 33 :
if ( ! IsSummonPetSpell ( spell_id ) )
return 100 ;
break ;
case 36 :
if ( ! IsPoisonCounterSpell ( spell_id ) )
return 100 ;
break ;
case 71 :
if ( ! IsSummonSkeletonSpell ( spell_id ) )
return 100 ;
break ;
default :
2013-05-09 10:44:08 -04:00
LogFile - > write ( EQEMuLog : : Normal , " GenericFocus: unknown limit effect %d " , spells [ modspellid ] . base [ i ] ) ;
2013-02-16 16:14:39 -08:00
}
break ;
case SE_LimitCastTime :
if ( modspell . base [ i ] > ( int16 ) spell . cast_time )
return 100 ;
break ;
case SE_LimitSpellType :
switch ( spells [ modspellid ] . base [ i ] )
{
case 0 :
if ( ! IsDetrimentalSpell ( spell_id ) )
return 100 ;
break ;
case 1 :
if ( ! IsBeneficialSpell ( spell_id ) )
return 100 ;
break ;
default :
2013-05-09 10:44:08 -04:00
LogFile - > write ( EQEMuLog : : Normal , " GenericFocus: unknown limit spelltype %d " , spells [ modspellid ] . base [ i ] ) ;
2013-02-16 16:14:39 -08:00
}
break ;
case SE_LimitMinDur :
if ( modspell . base [ i ] > CalcBuffDuration_formula ( GetLevel ( ) , spell . buffdurationformula , spell . buffduration ) )
return 100 ;
break ;
case SE_ImprovedDamage :
case SE_ImprovedHeal :
modifier + = modspell . base [ i ] ;
break ;
case SE_ReduceManaCost :
modifier - = modspell . base [ i ] ;
break ;
default :
2013-05-09 10:44:08 -04:00
LogFile - > write ( EQEMuLog : : Normal , " GenericFocus: unknown effectid %d " , modspell . effectid [ i ] ) ;
2013-02-16 16:14:39 -08:00
}
}
return modifier ;
}
*/
/*void Client::Discipline(ClientDiscipline_Struct* disc_in, Mob* tar) {
Message ( 0 , " Disc packet id=%d, %x,%x,%x " , disc_in - > disc_id , disc_in - > unknown3 [ 0 ] , disc_in - > unknown3 [ 1 ] , disc_in - > unknown3 [ 2 ] ) ;
if ( ! p_timers . Expired ( & database , pTimerDisciplineReuse ) ) {
char val1 [ 20 ] = { 0 } ;
char val2 [ 20 ] = { 0 } ;
uint32 remain = p_timers . GetRemainingTime ( pTimerDisciplineReuse ) ;
Message_StringID ( 0 , DISCIPLINE_CANUSEIN , ConvertArray ( ( remain ) / 60 , val1 ) , ConvertArray ( remain % 60 , val2 ) ) ;
//Message(0,"You can use a new discipline in %i minutes %i seconds.", (disc_timer.GetRemainingTime()/1000)/60, disc_timer.GetRemainingTime()/1000%60);
return ;
}
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
//reuse times are a little messes up, they should scale down somehow
//as you gain in levels, but im not sure how, so its just a lvl 60 bonus right now
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
//should change this to check classes better.
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
//both in seconds, converted at the end.
uint32 duration = 0 ;
uint32 reuse = 0 ;
2013-05-06 13:07:41 -04:00
2013-05-09 10:44:08 -04:00
switch ( disc_in - > disc_id ) {
2013-02-16 16:14:39 -08:00
// Shared?
case discResistant : { // Resistant
// 1 minute duration
// 1 hour reuse
2013-05-06 13:07:41 -04:00
// +3 to +10 to resists
2013-02-16 16:14:39 -08:00
if ( GetLevel ( ) < = 29 )
return ;
duration = 60 ;
reuse = 60 * 60 ;
entity_list . MessageClose ( this , false , 100 , 0 , " %s has become more resistant! " , GetName ( ) ) ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discFearless : { // Fearless
// 11 second duration
// 1 hour reuse
// 100% fear immunity
if ( GetLevel ( ) < = 39 )
return ;
duration = 11 ;
reuse = 60 * 60 ;
entity_list . MessageClose_StringID ( this , false , 100 , 0 , DISCIPLINE_FEARLESS , GetName ( ) ) ;
//entity_list.MessageClose(this, false, 100, 0, "%s becomes fearless!", GetName());
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discWhirlwind : { // Counterattack/Whirlwind/Furious
// warrior level 56
// rogue/monk level 53
// 9 second duration
// 1 hour reuse
2013-05-09 10:44:08 -04:00
if ( ( GetClass ( ) = = WARRIOR & & GetLevel ( ) < = 56 )
2013-02-16 16:14:39 -08:00
| | ( GetLevel ( ) < = 53 )
) return ;
duration = 9 ;
reuse = 60 * 60 ;
entity_list . MessageClose ( this , false , 100 , 0 , " %s \' s face becomes twisted with fury! " , GetName ( ) ) ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discFellstrike : { // Duelist/Innerflame/Fellstrike
// monk level 56
// rogue level 59
// warrior level 58
// 12 second duration
// 30 minute reuse
// min 4*base hand/weapon damage
2013-05-09 10:44:08 -04:00
if ( ( GetClass ( ) = = MONK & & GetLevel ( ) < = 55 )
2013-02-16 16:14:39 -08:00
| | ( GetClass ( ) = = WARRIOR & & GetLevel ( ) < = 58 )
| | ( GetClass ( ) = = ROGUE & & GetLevel ( ) < = 59 )
) return ;
duration = 12 ;
reuse = 60 * 30 ;
entity_list . MessageClose ( this , false , 100 , 0 , " %s \' s muscles bulge with force of will! " , GetName ( ) ) ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discBlindingSpeed : { // Blindingspeed/Hundredfist
// rogue level 58
// monk level 57
// 15 second duration
// 30 minute reuse
2013-05-09 10:44:08 -04:00
if ( ( GetClass ( ) = = MONK & & GetLevel ( ) < = 58 )
2013-02-16 16:14:39 -08:00
| | ( GetClass ( ) = = ROGUE & & GetLevel ( ) < = 57 )
) return ;
//disc_timer.Start(1000*60*30);
//disc_elapse.Start(1000*15);
duration = 15 ;
reuse = 60 * 30 ;
Message ( 0 , " This discipline not implemented.. " ) ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discDeadeye : { // Deadeye/Charge
// warrior level 53
// rogue level 54
// 14 second duration
// 30 minute reuse
2013-05-09 10:44:08 -04:00
if ( ( GetClass ( ) = = WARRIOR & & GetLevel ( ) < = 53 )
2013-02-16 16:14:39 -08:00
| | ( GetClass ( ) = = ROGUE & & GetLevel ( ) < = 54 )
) return ;
duration = 14 ;
reuse = 60 * 30 ;
entity_list . MessageClose ( this , false , 100 , 0 , " %s feels unstopable! " , GetName ( ) ) ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
// Warrior
case discEvasive : { // Evasive
// level 52
// 3 minute duration
// 15 minute reuse
// +35% avoidance
// -15% out
duration = 3 * 60 ;
reuse = 15 * 60 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discMightystrike : { // Mightystrike
// level 54
// 10 second duration
// 1 hour reuse
// Auto crit
duration = 10 ;
reuse = 60 * 60 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discDefensive : { // Defensive
// level 55
// 3 minute duration
// 15 minute reuse, 10 after 60
// +35% mitigation
// -15% out
duration = 3 * 60 ;
if ( level > 59 )
reuse = 10 * 60 ;
else
reuse = 15 * 60 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discPrecise : { // Precise
// level 57
// 3 minute duration
// 30 minute reuse
// -15% avoidance
// +35% out
duration = 3 * 60 ;
reuse = 30 * 60 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discAggressive : { // Aggressive
// level 60
// 3 minute duration
// 27 minute reuse
// -15% mitigation
// +35% out
duration = 3 * 60 ;
reuse = 27 * 60 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
// Monk
case discStonestance : { // Stonestance
// level 51
duration = 12 ;
if ( level > 59 )
reuse = 3 * 60 ;
else
reuse = 12 * 60 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discThunderkick : { // Thunderkick
// level 52
if ( level > 59 )
reuse = 1 * 60 ;
else
reuse = 7 * 60 ;
duration = 5 * 60 ; //hack for now, checked in combat and expired once used.
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discVoidance : { // Voidance
// level 54
if ( level > 59 )
reuse = 54 * 60 ;
else
reuse = 60 * 60 ;
duration = 8 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discSilentfist : { // Silentfist
// level 59
// 6-7 minute reuse
// Dragon punch damage bonus
// Chance to stun
if ( level > 59 )
reuse = 6 * 60 ;
else
reuse = 7 * 60 ;
duration = 5 * 60 ; //hack for now, checked in combat and expired once used.
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discAshenhand : { // Ashenhand
// level 60
// 72 minute reuse
// Eagle Strike damage bonus
// Chance to slay
reuse = 72 * 60 ;
duration = 5 * 60 ; //hack for now, checked in combat and expired once used.
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
// Rogue
case discNimble : { // Nimble
// level 55
// 12 second duration
// 30 minute reuse
// Auto dodge
if ( level > 59 )
reuse = 25 * 60 ;
else
reuse = 30 * 60 ;
duration = 12 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discKinesthetics : { // Kinesthetics
// level 57
// 18 second duration
// 30,27 minute reuse
// Auto dualwield
// Auto double attack
if ( level > 59 )
reuse = 27 * 60 ;
else
reuse = 30 * 60 ;
duration = 18 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
// Paladin
case discHolyforge : { // Holyforge
// level 55
// 2 minute duration
// 72 minute reuse
// Crit/Crip undead
// +15% to crit chance
if ( level > 59 )
reuse = 65 * 60 ;
else
reuse = 72 * 60 ;
duration = 5 * 60 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discSanctification : { // Sanctification
// level 60
// 10 second duration
// 72 minute reuse
// Spell immunity
reuse = 72 * 60 ;
duration = 15 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
// Ranger
case discTrueshot : { // Trueshot
// level 55
// 2 minute duration
// 72 minute reuse
// Max to two times max bow damage
// +15% to hit
if ( level > 59 )
reuse = 67 * 60 ;
else
reuse = 72 * 60 ;
duration = 2 * 60 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discWeaponshield : { // Weaponshield
// level 60
// 15 second duration
// 72 minute reuse
// auto parry
reuse = 72 * 60 ;
duration = 20 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
// Bard
case discDeftdance : { // Deftdance
// level 55
// 10 second duration
// 72 minute reuse
// auto dodge
// auto dualwield
if ( level > 59 )
reuse = 67 * 60 ;
else
reuse = 72 * 60 ;
duration = 10 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discPuretone : { // Puretone
// level 60
// 2 minute duration
// 72 minute reuse
// Auto instrument
reuse = 72 * 60 ;
duration = 4 * 60 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
// Shadow knight
case discUnholyAura : { // Unholy
// level 55
// 72 minute reuse
// +25% to harmtouch
// -300 to resist
if ( level > 59 )
reuse = 67 * 60 ;
else
reuse = 72 * 60 ;
duration = 5 * 60 ; //hack for now, checked in combat and expired once used.
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
case discLeechCurse : { // Leech curse
// level 60
// 15 second duration
// 72 minute reuse
// Heal self for each point of melee damage done
reuse = 72 * 60 ;
duration = 15 ;
2013-05-09 10:44:08 -04:00
break ;
2013-02-16 16:14:39 -08:00
}
// Default
case 0 : { // Timer request
break ;
}
2013-05-06 13:07:41 -04:00
default :
2013-05-09 10:44:08 -04:00
LogFile - > write ( EQEMuLog : : Error , " Unknown Discipline requested by client: %s class: %i Disciline:%i " , GetName ( ) , class_ , disc_in - > disc_id ) ;
return ;
}
2013-05-06 13:07:41 -04:00
2013-05-09 10:44:08 -04:00
if ( reuse ! = 0 ) {
2013-02-16 16:14:39 -08:00
p_timers . Start ( pTimerDisciplineReuse , reuse ) ;
//nonpersistent timer for the 'discipline ready' message
disc_timer . Start ( 1000 * reuse ) ;
}
if ( duration ! = 0 )
disc_elapse . Start ( 1000 * duration ) ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
disc_inuse = disc_in - > disc_id ;
} */
#if 0 // solar: this is old code
/*void EntityList::AESpell(Mob* caster, Mob* center, float dist, uint16 spell_id, bool group)
{
LinkedListIterator < Mob * > iterator ( mob_list ) ;
iterator . Reset ( ) ;
while ( iterator . MoreElements ( ) ) {
Mob * mob = iterator . GetData ( ) ;
if ( group ) {
2013-05-09 10:44:08 -04:00
// Client casting group spell with out target group buffs enabled
// Skip non group members
if ( caster - > IsClient ( )
& & ! caster - > CastToClient ( ) - > TGB ( )
& & GetGroupByMob ( mob ) ! = 0
& & ! GetGroupByMob ( mob ) - > IsGroupMember ( caster )
) {
LogFile - > write ( EQEMuLog : : Debug , " Group spell skipping %s " , mob - > GetName ( ) ) ;
iterator . Advance ( ) ;
continue ;
}
// Client casting group spell with target group buffs enabled
else if ( caster - > IsClient ( )
& & caster - > CastToClient ( ) - > TGB ( )
& & GetGroupByMob ( mob ) ! = 0
& & GetGroupByMob ( mob ) - > IsGroupMember ( caster )
) {
LogFile - > write ( EQEMuLog : : Debug , " Group spell TGB on %s's Group " , mob - > GetName ( ) ) ;
GetGroupByMob ( mob ) - > CastGroupSpell ( caster , spell_id ) ;
iterator . Advance ( ) ;
continue ;
}
else if ( caster - > IsClient ( )
& & caster - > CastToClient ( ) - > TGB ( )
& & GetGroupByMob ( mob ) = = 0
& & mob = = center
) {
LogFile - > write ( EQEMuLog : : Debug , " Group spell TGB on %s " , mob - > GetName ( ) ) ;
caster - > SpellOnTarget ( spell_id , mob ) ;
return ;
}
2013-02-16 16:14:39 -08:00
}
if (
mob - > DistNoZ ( * center ) < = dist
& & ! ( mob - > IsClient ( ) & & mob - > CastToClient ( ) - > GMHideMe ( ) )
& & ! mob - > IsCorpse ( )
) {
//cout << "AE Spell Hit: t=" << iterator.GetData()->GetName() << ", d=" << iterator.GetData()->CastToMob()->DistNoRoot(center) << ", x=" << iterator.GetData()->CastToMob()->GetX() << ", y=" << iterator.GetData()->CastToMob()->GetY() << endl;
if ( caster = = mob ) {
// Caster gets the first hit, already handled in spells.cpp
}
# ifdef IPC
else if ( caster - > IsNPC ( ) & & ! caster - > CastToNPC ( ) - > IsInteractive ( ) ) {
# else
else if ( caster - > IsNPC ( ) ) {
2013-05-09 10:44:08 -04:00
# endif
// Npc
2013-02-16 16:14:39 -08:00
if ( caster - > IsAttackAllowed ( mob ) & & spells [ spell_id ] . targettype ! = ST_AEBard ) {
caster - > SpellOnTarget ( spell_id , mob ) ;
}
else if ( mob - > IsAIControlled ( ) & & spells [ spell_id ] . targettype = = ST_AEBard ) {
caster - > SpellOnTarget ( spell_id , mob ) ;
}
else {
}
}
# ifdef IPC
2013-05-09 10:44:08 -04:00
else if ( caster - > IsNPC ( ) & & caster - > CastToNPC ( ) - > IsInteractive ( ) ) {
// Interactive npc
2013-02-16 16:14:39 -08:00
if ( caster - > IsAttackAllowed ( mob ) & & spells [ spell_id ] . targettype ! = ST_AEBard & & spells [ spell_id ] . targettype ! = ST_GroupTeleport ) {
caster - > SpellOnTarget ( spell_id , mob ) ;
}
else if ( ! mob - > IsAIControlled ( ) & & ( spells [ spell_id ] . targettype = = ST_AEBard | | group ) & & mob - > CastToClient ( ) - > GetPVP ( ) = = caster - > CastToClient ( ) - > GetPVP ( ) ) {
2013-05-09 10:44:08 -04:00
if ( group & & GetGroupByMob ( mob ) ! = GetGroupByMob ( caster ) ) {
iterator . Advance ( ) ;
continue ;
}
2013-02-16 16:14:39 -08:00
caster - > SpellOnTarget ( spell_id , mob ) ;
}
else {
}
}
# endif
2013-05-09 10:44:08 -04:00
else if ( caster - > IsClient ( ) & & ! ( caster - > CastToClient ( ) - > IsBecomeNPC ( ) ) ) {
2013-02-16 16:14:39 -08:00
// Client
if ( caster - > IsAttackAllowed ( mob ) & & spells [ spell_id ] . targettype ! = ST_AEBard ) {
caster - > SpellOnTarget ( spell_id , mob ) ;
}
else if ( spells [ spell_id ] . targettype = = ST_GroupTeleport & & mob - > IsClient ( ) & & mob - > isgrouped & & caster - > isgrouped & & entity_list . GetGroupByMob ( caster ) )
{
Group * caster_group = entity_list . GetGroupByMob ( caster ) ;
2013-05-09 10:44:08 -04:00
if ( caster_group ! = 0 & & caster_group - > IsGroupMember ( mob ) )
caster - > SpellOnTarget ( spell_id , mob ) ;
2013-02-16 16:14:39 -08:00
}
else if ( mob - > IsClient ( ) & & ( spells [ spell_id ] . targettype = = ST_AEBard | | group ) & & mob - > CastToClient ( ) - > GetPVP ( ) = = caster - > CastToClient ( ) - > GetPVP ( ) ) {
if ( group & & GetGroupByMob ( mob ) ! = GetGroupByMob ( caster ) ) {
2013-05-09 10:44:08 -04:00
iterator . Advance ( ) ;
continue ;
}
2013-02-16 16:14:39 -08:00
else if ( mob - > IsClient ( ) & & spells [ spell_id ] . targettype = = ST_AEBard & & mob - > CastToClient ( ) - > GetPVP ( ) = = caster - > CastToClient ( ) - > GetPVP ( ) )
caster - > SpellOnTarget ( spell_id , mob ) ;
# ifdef IPC
2013-05-09 10:44:08 -04:00
else if ( mob - > IsNPC ( ) & & mob - > CastToNPC ( ) - > IsInteractive ( ) ) {
if ( group & & GetGroupByMob ( mob ) ! = GetGroupByMob ( caster ) )
continue ;
caster - > SpellOnTarget ( spell_id , mob ) ;
2013-02-16 16:14:39 -08:00
}
2013-05-09 10:44:08 -04:00
# endif
2013-02-16 16:14:39 -08:00
}
}
else if ( caster - > IsClient ( ) ) {
// Client BecomeNPC
caster - > SpellOnTarget ( spell_id , mob ) ;
}
}
iterator . Advance ( ) ;
2013-05-06 13:07:41 -04:00
}
2013-02-16 16:14:39 -08:00
} */
# endif // solar: old code
/*#if 0
// Queries the loottable: adds item & coin to the npc
void ZoneDatabase : : AddLootTableToNPC ( uint32 loottable_id , ItemList * itemlist , uint32 * copper , uint32 * silver , uint32 * gold , uint32 * plat ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
2013-05-09 10:44:08 -04:00
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
2013-02-16 16:14:39 -08:00
* copper = 0 ;
* silver = 0 ;
* gold = 0 ;
* plat = 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT id, mincash, maxcash, avgcoin FROM loottable WHERE id=%i " , loottable_id ) , errbuf , & result ) ) {
safe_delete_array ( query ) ;
if ( mysql_num_rows ( result ) = = 1 ) {
row = mysql_fetch_row ( result ) ;
uint32 mincash = atoi ( row [ 1 ] ) ;
uint32 maxcash = atoi ( row [ 2 ] ) ;
if ( mincash > maxcash ) {
cerr < < " Error in loottable # " < < row [ 0 ] < < " : mincash > maxcash " < < endl ;
}
else if ( maxcash ! = 0 ) {
uint32 cash = 0 ;
if ( mincash = = maxcash )
cash = mincash ;
else
cash = ( rand ( ) % ( maxcash - mincash ) ) + mincash ;
if ( cash ! = 0 ) {
uint32 coinavg = atoi ( row [ 3 ] ) ;
if ( coinavg ! = 0 ) {
uint32 mincoin = ( uint32 ) ( coinavg * 0.75 + 1 ) ;
uint32 maxcoin = ( uint32 ) ( coinavg * 1.25 + 1 ) ;
* copper = ( rand ( ) % ( maxcoin - mincoin ) ) + mincoin - 1 ;
* silver = ( rand ( ) % ( maxcoin - mincoin ) ) + mincoin - 1 ;
* gold = ( rand ( ) % ( maxcoin - mincoin ) ) + mincoin - 1 ;
cash - = * copper ;
cash - = * silver * 10 ;
cash - = * gold * 10 ;
}
* plat = cash / 1000 ;
cash - = * plat * 1000 ;
uint32 gold2 = cash / 100 ;
cash - = gold2 * 100 ;
uint32 silver2 = cash / 10 ;
cash - = silver2 * 10 ;
* gold + = gold2 ;
* silver + = silver2 ;
* copper + = cash ;
}
}
}
else {
mysql_free_result ( result ) ;
return ;
}
mysql_free_result ( result ) ;
}
else
{
cerr < < " Error in AddLootTableToNPC get coin query ' " < < query < < " ' " < < errbuf < < endl ;
safe_delete_array ( query ) ;
return ;
}
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT loottable_id, lootdrop_id, multiplier, probability FROM loottable_entries WHERE loottable_id=%i " , loottable_id ) , errbuf , & result ) ) {
safe_delete_array ( query ) ;
while ( ( row = mysql_fetch_row ( result ) ) ) {
int multiplier = atoi ( row [ 2 ] ) ;
for ( int i = 1 ; i < = multiplier ; i + + ) {
if ( ( ( rand ( ) % 1 ) * 100 ) < atoi ( row [ 3 ] ) ) {
AddLootDropToNPC ( atoi ( row [ 1 ] ) , itemlist ) ;
}
}
}
mysql_free_result ( result ) ;
}
else {
cerr < < " Error in AddLootTableToNPC get items query ' " < < query < < " ' " < < errbuf < < endl ;
safe_delete_array ( query ) ;
return ;
}
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
return ;
}
// Called by AddLootTableToNPC
// maxdrops = size of the array npcd
void ZoneDatabase : : AddLootDropToNPC ( uint32 lootdrop_id , ItemList * itemlist ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
2013-05-09 10:44:08 -04:00
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
2013-05-06 13:07:41 -04:00
2013-05-09 10:44:08 -04:00
// This is Wiz's updated Pool Looting functionality. Eventually, the database format should be moved over to use this
// or implemented to support both methods. (A unique identifier in lootable_entries indicates to roll for a pool item
2013-02-16 16:14:39 -08:00
// in another table.
# ifdef POOLLOOTING
uint32 chancepool = 0 ;
uint32 items [ 50 ] ;
uint32 itemchance [ 50 ] ;
uint16 itemcharges [ 50 ] ;
uint8 i = 0 ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
for ( int m = 0 ; m < 50 ; m + + )
{
items [ m ] = 0 ;
itemchance [ m ] = 0 ;
itemcharges [ m ] = 0 ;
}
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT lootdrop_id, item_id, item_charges, equip_item, chance FROM lootdrop_entries WHERE lootdrop_id=%i order by chance desc " , lootdrop_id ) , errbuf , & result ) )
{
safe_delete_array ( query ) ;
while ( row = mysql_fetch_row ( result ) )
{
items [ i ] = atoi ( row [ 1 ] ) ;
itemchance [ i ] = atoi ( row [ 4 ] ) + chancepool ;
itemcharges [ i ] = atoi ( row [ 2 ] ) ;
chancepool + = atoi ( row [ 4 ] ) ;
i + + ;
}
uint32 res ;
i = 0 ;
2013-05-06 13:07:41 -04:00
2013-05-09 10:44:08 -04:00
if ( chancepool ! = 0 ) //avoid divide by zero if some mobs have 0 for chancepool
{
res = rand ( ) % chancepool ;
}
else
{
res = 0 ;
}
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
while ( items [ i ] ! = 0 )
{
if ( res < = itemchance [ i ] )
break ;
else
i + + ;
}
const Item_Struct * dbitem = database . GetItem ( items [ i ] ) ;
if ( dbitem = = 0 )
{
LogFile - > write ( EQEMuLog : : Error , " AddLootDropToNPC: dbitem=0, item#=%i, lootdrop_id=%i " , items [ i ] , lootdrop_id ) ;
}
else
{
//cout << "Adding item to Mob" << endl;
ServerLootItem_Struct * item = new ServerLootItem_Struct ;
item - > item_id = dbitem - > ItemNumber ;
item - > charges = itemcharges [ i ] ;
item - > equipSlot = 0 ;
( * itemlist ) . Append ( item ) ;
}
mysql_free_result ( result ) ;
}
# else
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT lootdrop_id, item_id, item_charges, equip_item, chance FROM lootdrop_entries WHERE lootdrop_id=%i order by chance desc " , lootdrop_id ) , errbuf , & result ) )
{
safe_delete_array ( query ) ;
while ( ( row = mysql_fetch_row ( result ) ) )
{
2013-05-09 10:44:08 -04:00
uint8 LootDropMod = 1 ; // place holder till I put it in a database variable to make it configurable.
2013-02-16 16:14:39 -08:00
if ( ( rand ( ) % 100 ) < ( ( atoi ( row [ 4 ] ) * LootDropMod ) ) )
{
uint32 itemid = atoi ( row [ 1 ] ) ;
const Item_Struct * dbitem = database . GetItem ( itemid ) ;
if ( dbitem = = 0 )
{
LogFile - > write ( EQEMuLog : : Error , " AddLootDropToNPC: dbitem=0, item#=%i, lootdrop_id=%i " , itemid , lootdrop_id ) ;
}
else
{
printf ( " Adding item: %i " , item - > ItemNumber ) ;
ServerLootItem_Struct * item = new ServerLootItem_Struct ;
item - > item_id = dbitem - > item_id ;
item - > charges = atoi ( row [ 2 ] ) ;
item - > equipSlot = 0 ;
( * itemlist ) . Append ( item ) ;
}
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
//mysql_free_result(result);
//return;
}
}
mysql_free_result ( result ) ;
}
# endif
else
{
LogFile - > write ( EQEMuLog : : Error , " Error in AddLootDropToNPC query '%s' %s " , query , errbuf ) ;
safe_delete_array ( query ) ;
return ;
}
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
return ;
}
# endif* /