l2-unlegits/l2ooghelper/UserBuffs.cpp
2012-02-01 05:25:08 +00:00

227 lines
5.4 KiB
C++

#include "stdafx.h"
#include "UserBuffs.h"
#include "logger.h"
wchar_t *UserBuff::getSkillNameW()
{
if( this->cached_skillName[0] == 0 )
{
char skillname[256];
memset( skillname, 0, sizeof(skillname) );
L2Data_DB_GetSkillNameByID( skillID, skillname );
if( skillname[0] == 0 ) strcpy( skillname, "<unknown>" );
MultiByteToWideChar( CP_ACP, 0, skillname, -1, cached_skillName, 255 );
}
return this->cached_skillName;
}
void UserBuff::getSkillName( wchar_t *out, size_t maxCount )
{
if( this->cached_skillName[0] == 0 )
{
char skillname[256];
memset( skillname, 0, sizeof(skillname) );
L2Data_DB_GetSkillNameByID( skillID, skillname );
if( skillname[0] == 0 ) strcpy( skillname, "<unknown>" );
MultiByteToWideChar( CP_ACP, 0, skillname, -1, cached_skillName, 255 );
}
if( out ) wcsncpy( out, cached_skillName, maxCount );
}
UserBuffs::UserBuffs() { clear(); clearShortBuffs(); }
UserBuffs::~UserBuffs() { clear(); clearShortBuffs(); }
void UserBuffs::clear()
{
buffCount = 0;
int i;
for( i=0; i<USER_MAX_BUFFS; i++ ) buff[i].clear();
lastBuffKnownTick = GetTickCount();
}
void UserBuffs::clearShortBuffs()
{
shortBuffCount = 0;
int i;
for( i=0; i<USER_MAX_SHORT_BUFFS; i++ ) short_buff[i].clear();
lastShortBuffKnownTick = GetTickCount();
}
int UserBuffs::addBuff( UserBuff *addbuff )
{
int add_idx = -1;
int i;
for( i=0; i<USER_MAX_BUFFS; i++ )
{
if( buff[i].skillID == 0 )
{
add_idx = i;
break;
}
}
if( add_idx == -1 ) return add_idx;
buffCount++;
buff[add_idx] = (*addbuff);
//log_error( LOG_USERAI, "Added buff %u [%S] lvl %d (%d sec)\n", addbuff->skillID,
// addbuff->getSkillNameW(), addbuff->skillLvl, addbuff->duration );
return add_idx;
}
int UserBuffs::addShortBuff( UserBuff *addbuff )
{
int add_idx = -1;
int i;
// find existing buff by skillID
for( i=0; i<USER_MAX_SHORT_BUFFS; i++ )
{
if( short_buff[i].skillID == addbuff->skillID )
{
add_idx = i;
break;
}
}
// find free place to add in new slot
if( add_idx == -1 )
{
for( i=0; i<USER_MAX_SHORT_BUFFS; i++ )
{
if( short_buff[i].skillID == 0 )
{
add_idx = i;
break;
}
}
}
if( add_idx == -1 ) return add_idx;
shortBuffCount++;
short_buff[add_idx] = (*addbuff);
//log_error( LOG_USERAI, "Added short buff %u [%S] lvl %d (%d sec)\n", addbuff->skillID,
// addbuff->getSkillNameW(), addbuff->skillLvl, addbuff->duration );
return add_idx;
}
int UserBuffs::getBuffnfoBySkillId( unsigned int skillID, UserBuff *outbuff )
{
int i;
int idx = -1;
for( i=0; i<USER_MAX_BUFFS; i++ )
{
if( buff[i].skillID == skillID )
{
idx = i;
break;
}
}
if( idx == -1 ) // try to find short buff
{
for( i=0; i<USER_MAX_SHORT_BUFFS; i++ )
{
if( short_buff[i].skillID == skillID )
{
idx = i;
break;
}
}
if( idx == -1 ) return -1;
(*outbuff) = short_buff[idx];
return idx;
}
(*outbuff) = buff[idx];
return idx;
}
/**
Server: 85 AbnormalStatusUpdate: len 25
19 00
85
02 00 // nEffects = 2
3E 14 00 00 // skillID 5182 \
01 00 // level 1 > 1
BF 1E 00 00 // duration 7871 /
*/
void UserBuffs::parse_AbnormalStatusUpdate( void *l2_game_packet )
{
if( !l2_game_packet ) return;
this->clear();
L2GamePacket *p = (L2GamePacket *)l2_game_packet;
p->getPacketType();
int nEffects = p->readUShort();
int i;
for( i=0; i<nEffects; i++ )
{
UserBuff b;
b.skillID = p->readUInt();
b.skillLvl = p->readUShort();
b.duration = p->readInt();
addBuff( &b );
}
lastBuffKnownTick = GetTickCount();
}
/** writeC(0xfa);
writeD(_skillId);
writeD(_skillLvl);
writeD(_duration); **/
void UserBuffs::parse_ShortBuffStatusUpdate( void *l2_game_packet )
{
if( !l2_game_packet ) return;
//this->clearShortBuffs();
L2GamePacket *pack = (L2GamePacket *)l2_game_packet;
pack->getPacketType();
unsigned int skillID = pack->readUInt();
int skillLvl = pack->readInt();
int duration = pack->readInt(); // in seconds!
if( skillID > 0 )
{
UserBuff buf;
buf.skillID = skillID;
buf.skillLvl = skillLvl;
buf.duration = duration; // in seconds
addShortBuff( &buf ); // updates existing
//
//char skillName[256] = {0};
//L2Data_DB_GetSkillNameByID( skillID, skillName );
//log_error( LOG_USERAI, "ShortBuffStatusUpdate: %u [%s] lvl %d, duration %d\n",
// skillID, skillName, skillLvl, duration );
}
lastShortBuffKnownTick = GetTickCount();
}
void UserBuffs::process_BuffTick( unsigned int curTick )
{
unsigned int ticksPassed = curTick - lastBuffKnownTick;
unsigned int ticksPassedS = curTick - lastShortBuffKnownTick;
if( (ticksPassed < 1000) || (ticksPassedS < 1000) ) return; // only update buff times once a second
lastBuffKnownTick = curTick;
lastShortBuffKnownTick = curTick;
int i;
for( i=0; i<buffCount; i++ )
{
if( buff[i].skillID != 0 )
{
buff[i].duration--; // minus 1 second for each buff :)
// buff stopped?
if( buff[i].duration <= 0 ) { buff[i].clear(); buffCount--; }
}
}
for( i=0; i<shortBuffCount; i++ )
{
if( short_buff[i].skillID != 0 )
{
short_buff[i].duration--; // minus 1 second for each buff :)
// buff stopped?
if( short_buff[i].duration <= 0 ) { short_buff[i].clear(); shortBuffCount--; }
}
}
}
/*
int buffCount;
UserBuff buff[USER_MAX_BUFFS];
*/