#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, "" ); 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, "" ); 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; iskillID, // 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; iskillID ) { add_idx = i; break; } } // find free place to add in new slot if( add_idx == -1 ) { for( i=0; iskillID, // 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 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; ireadUInt(); 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