157 lines
2.7 KiB
C++
157 lines
2.7 KiB
C++
#include "stdafx.h"
|
|
|
|
void CUser::HandleGenie(Packet & pkt)
|
|
{
|
|
uint8 command = pkt.read<uint8>();
|
|
|
|
switch (command)
|
|
{
|
|
case 0x01:
|
|
GenieNonAttackProgress(pkt);
|
|
break;
|
|
case 0x02:
|
|
GenieAttackProgress(pkt);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CUser::GenieNonAttackProgress(Packet & pkt)
|
|
{
|
|
|
|
enum GenieNonAttackType
|
|
{
|
|
GenieUseSpiringPotion = 1,
|
|
GenieLoadOptions = 0x02,
|
|
GenielSaveOptions = 0x03,
|
|
GenieStartHandle = 0x04,
|
|
GenieStopHandle = 0x05
|
|
};
|
|
|
|
uint8 command = pkt.read<uint8>();
|
|
|
|
switch (command)
|
|
{
|
|
case GenieUseSpiringPotion:
|
|
GenieUseGenieSpirint();
|
|
break;
|
|
case GenieStartHandle:
|
|
GenieStart();
|
|
break;
|
|
case GenielSaveOptions:
|
|
for(int i=0; i<sizeof(m_GenieOptions); i++)
|
|
{
|
|
*(uint8 *)(m_GenieOptions + i ) = pkt.read<uint8>();
|
|
}
|
|
break;
|
|
case GenieLoadOptions:
|
|
{
|
|
Packet result(WIZ_GENIE);
|
|
|
|
result << uint8(0x01) << uint8(2);// << m_GenieOptions;
|
|
|
|
for(int i=0; i<sizeof(m_GenieOptions); i++)
|
|
result << uint8(*(uint8 *)(m_GenieOptions + i));
|
|
|
|
Send(&result);
|
|
}
|
|
break;
|
|
case GenieStopHandle:
|
|
GenieStop();
|
|
break;
|
|
default:
|
|
TRACE("[%s] Genie Non Attack Unknow Handle %d Packet Len [%d]\r\n",GetName().c_str(),command,pkt.size());
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
void CUser::GenieAttackProgress(Packet & pkt)
|
|
{
|
|
enum GenieAttackHandle
|
|
{
|
|
GenieMove = 1,
|
|
GenieSkillSave = 2,
|
|
GenieMainAttack = 3,
|
|
GenieMagic = 4
|
|
};
|
|
|
|
uint8 command = pkt.read<uint8>();
|
|
|
|
if(m_GenieTime == 0)
|
|
GenieStop();
|
|
|
|
switch (command)
|
|
{
|
|
case GenieMove:
|
|
MoveProcess(pkt);
|
|
break;
|
|
case GenieMagic:
|
|
CMagicProcess::MagicPacket(pkt, this);
|
|
break;
|
|
case GenieMainAttack:
|
|
Attack(pkt);
|
|
break;
|
|
default:
|
|
TRACE("[%s] Genie Unknow Attack Handle %d Packet Len[%d]\r\n",GetName().c_str(),command,pkt.size());
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CUser::GenieStart()
|
|
{
|
|
Packet result(WIZ_GENIE);
|
|
|
|
result << uint8(0x01) << uint8(4) << uint16(1) << uint16(m_GenieTime);
|
|
m_bGenieStatus = true;
|
|
UserInOut(INOUT_IN);
|
|
|
|
Send(&result);
|
|
}
|
|
|
|
void CUser::GenieStop()
|
|
{
|
|
Packet result(WIZ_GENIE);
|
|
|
|
result << uint8(0x01) << uint8(5) << uint16(1) << uint16(m_GenieTime);
|
|
m_bGenieStatus = false;
|
|
UserInOut(INOUT_IN);
|
|
|
|
Send(&result);
|
|
}
|
|
|
|
void CUser::UpdateGenieTime(uint16 m_sTime)
|
|
{
|
|
Packet result(WIZ_GENIE);
|
|
|
|
result << uint8(0x01) << uint8(4) << uint16(1) << uint16(m_GenieTime);
|
|
m_bGenieStatus = true;
|
|
|
|
Send(&result);
|
|
}
|
|
|
|
void CUser::GenieUseGenieSpirint()
|
|
{
|
|
Packet result(WIZ_GENIE);
|
|
|
|
// item check and rob
|
|
uint8 CountA,CountB;
|
|
|
|
CountA = GetItemCount(810305000);
|
|
CountB = GetItemCount(810306000);
|
|
|
|
if(CountA < 1 && CountB < 1)
|
|
return;
|
|
else if(CountA > 0 )
|
|
RobItem(810305000);
|
|
else if(CountB > 0)
|
|
RobItem(810306000);
|
|
|
|
|
|
|
|
m_GenieTime = 120;
|
|
|
|
result << uint8(1) << uint8(1) << GetGenieTime();
|
|
|
|
Send(&result);
|
|
|
|
} |