You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
438 lines
13 KiB
438 lines
13 KiB
#include <stdint.h> |
|
#include <sstream> |
|
#include <string> |
|
#include "G:/Code/git.ashita.atom0s.com/Ashita v3/Ashita-src/build/plugins/ADK/Ashita.h" |
|
|
|
#include <iostream> |
|
|
|
namespace Chat |
|
{ |
|
//typedef const char* IAutoTrans; |
|
struct IAutoTrans{ |
|
const char* x; |
|
}; |
|
|
|
enum Mode : short |
|
{ |
|
// Info mostly taken from http://www.ffevo.net/wiki/index.php/ChatIDs |
|
|
|
//---------------------- |
|
// Common "Chat" Modes |
|
//---------------------- |
|
Unknown = 0, // Catch all. Do not use...it sometimes breaks the chat log. |
|
SentSay = 0x1, // Outgoing Say |
|
SentSay2 = 0x2, // Outgoing Say |
|
SentTell = 0x4, // Outgoing Tell |
|
SentParty = 0x5, // Outgoing Party |
|
SentLinkShell = 0x6, // Outgoing Linkshell |
|
SentEmote = 0x7, // Outgoing Emote, untargetted |
|
RecvdSay = 0x9, // Incoming Say |
|
RecvdSay2 = 0xA, // Incoming Say |
|
RcvdTell = 0xC, // Incoming Tell |
|
RcvdParty = 0xD, // Incoming Party (thanks Vanion for the correction!) |
|
RcvdLinkShell = 0xE, // Incoming Linkshell |
|
SentEmoteTo = 0xF, // Outgoing Emote, targeted |
|
Echo = 0xCE, // Echo |
|
|
|
//---------------------- |
|
// Action Modes |
|
//---------------------- |
|
|
|
ActCallHelp = 0x10, // Call for Help! |
|
ActFriendReq = 0x12, // Sent Friend Request |
|
ActCastMagic = 0x13, // |
|
ActHitDamage = 0x14, // |
|
ActMiss = 0x15, // |
|
ActDrained = 0x16, // |
|
ActPTHitAbsorbed = 0x17, // |
|
ActPTRecoverHP = 0x18, // |
|
ActPTHitDamage = 0x19, // |
|
ActPTMiss = 0x1A, // |
|
ActPTDrained = 0x1B, // |
|
ActDamaged = 0x1C, // |
|
ActAvoidDamage = 0x1D, // |
|
ActRecoverHealth = 0x1E, // |
|
ActRecoverHP = 0x1F, // |
|
ActPTDamaged = 0x20, // |
|
ActPTAvoidDamage = 0x21, // |
|
ActPCGainHealth = 0x22, // |
|
ActPTHealedOther = 0x23, // |
|
ActDefeats = 0x24, // |
|
ActPCDeath = 0x25, // |
|
ActDeath = 0x26, // |
|
ActPTDeath = 0x27, // |
|
ActPCDamage = 0x28, // |
|
ActPCMiss = 0x29, // |
|
ActPCRecoverHealth = 0x2A, // |
|
ActPCHealsPC = 0x2B, // |
|
ActPCDefeated = 0x2C, // |
|
|
|
//---------------------- |
|
// Special Action Modes |
|
//---------------------- |
|
|
|
SAct = 0x32, // |
|
SActPT = 0x33, // |
|
SActPC = 0x34, // |
|
SActRecvdBenefit = 0x38, // |
|
SActRecvdDetriment = 0x39, // |
|
SActNoEffect = 0x3B, // |
|
SActPTRecvdBenefit = 0x3C, // |
|
SActPTRecvdDetriment = 0x3D,// |
|
SActPTNoEffect = 0x3F, // Needs confirmation |
|
SActPCRecvdBenefit = 0x40, // |
|
SActPCRecvdDetriment = 0x41,// |
|
SActPCNoEffect = 0x43, // |
|
SActPTResisted = 0x44, // |
|
SActOtherResisted = 0x45, // |
|
|
|
SActSAttUse = 0x65, // |
|
SActOtherBenefit = 0x6F, // |
|
SActOtherDetriment = 0x70, // |
|
SActOtherMissed = 0x72, // |
|
|
|
SActSpellEffect = 0xBB, // |
|
|
|
//---------------------- |
|
// Item Modes |
|
//---------------------- |
|
|
|
ItemRecvdEffect = 0x51, // |
|
ItemPCUsed = 0x55, // |
|
ItemPCUsed2 = 0x5A, // |
|
ItemLearnedSpell = 0x5B, // |
|
|
|
//---------------------- |
|
// Mob Special Action Modes |
|
//---------------------- |
|
|
|
MobActSAttUse = 0x64, // |
|
MobActDetriment = 0x66, // |
|
MobActSAttEvaded = 0x68, // |
|
MobActSAttAoE = 0x69, // |
|
MobActSupport = 0x6A, // |
|
MobActDrain = 0x6B, // |
|
MobActRAttMissed = 0x6D, // |
|
MobActSAttInit = 0x6E, // |
|
|
|
//---------------------- |
|
// System Message Modes |
|
//---------------------- |
|
|
|
Sys1 = 0x79, // Target out of range, AH & synth feedback, Item feedback, trade feedback |
|
Sys2 = 0x7A, // Entity chasing out of range, entity intimidated, raise, paralyzed, cannot see entity, |
|
// casting interrupted, cannot attack, target already claimed, no exp gained |
|
Sys3 = 0x7B, // Sneak/invis wearing, wait longer to perform action, chat not sent/recvd |
|
SysObtainedItem = 0x7F, // |
|
SysSkillGained = 0x81, // |
|
SysExpLvlMerit = 0x83, // |
|
SysInvitedToParty = 0x87, // |
|
SysLogoutCountdown = 0x88, // |
|
SysBazaar = 0x8A, // |
|
SysTimePlayed = 0x8B, // |
|
SysClock = 0x8C, // |
|
SysDynamisWarning = 0x8D, // |
|
SysTaunts = 0x8E, // |
|
SysTutorialMoogle = 0x90, // |
|
SysCaughtFish = 0x92, // |
|
Sys4 = 0x94, // Digging/Fishing/Door/Ballista Feedback, Mission Gil Reward, Accepted Mission, Receive |
|
// Mission Key Item, Gained Conquest Points |
|
SysTimeRestriction = 0x95, // |
|
SysTutorialNPC = 0x98, // |
|
SysCommandError = 0x9D, // Also /help output |
|
SysConquestUpdate = 0xA1, // |
|
|
|
SysNeedKey = 0xBE, // |
|
Sys5 = 0xBF, // Effect wears off, Detriment wears off, no longer stunned, fall to level |
|
SysMOTD = 0xC8, // Also recast times (but not /recast feedback) |
|
SysSearchComment = 0xCC, // |
|
SysLinkshellMOTD = 0xCD, // |
|
SysExamined = 0xD0, // |
|
|
|
//---------------------- |
|
// Alliance Action Modes |
|
//---------------------- |
|
|
|
AllyHealAlly = 0xA2, // |
|
AllyDamage = 0xA3, // |
|
AllyMiss = 0xA4, // |
|
AllyDefeats = 0xA6, // |
|
AllyDefeated = 0xA7, // |
|
AllySAct = 0xA8, // |
|
AllyNoEffect = 0xAA, // |
|
AllyItemUse = 0xAB, // |
|
AllyRecvdDetriment = 0xAE, // |
|
AllyRecvdBenefit = 0xAF, // |
|
|
|
AllyRecvdDetrimentAoE = 0xB6,// |
|
AllyDamaged = 0xB9, // |
|
AllyEvades = 0xBA, // |
|
|
|
//---------------------- |
|
// NPC Action Modes |
|
//---------------------- |
|
|
|
NPCSAct = 0xB1, // |
|
|
|
NPCActDetriment = 0xB5, // |
|
|
|
//---------------------- |
|
// Unknown or Unused Modes |
|
//---------------------- |
|
|
|
SentYell = 0x03, |
|
RecvdYell = 0x11, |
|
//0x3 |
|
//0x8 |
|
//0xB |
|
//0x11 |
|
//0x2D-0x31 |
|
//0x35-0x37 |
|
//0x3A |
|
//0x3E |
|
//0x42 |
|
//0x46-0x50 |
|
//0x52-0x54 |
|
//0x56-0x59 |
|
//0x5C-0x63 |
|
//0x67 |
|
//0x6C |
|
//0x71 |
|
//0x73-0x78 |
|
//0x7C-0x7E |
|
//0x80 |
|
//0x82 |
|
//0x84-0x86 |
|
//0x89 |
|
//0x8F |
|
//0x91 |
|
//0x93 |
|
//0x96 |
|
//0x97 |
|
//0x99-0x9C |
|
//0x9E-0xA0 |
|
//0xA5 |
|
//0xA9 |
|
//0xAC |
|
//0xAD |
|
//0xB0 |
|
//0xB2-0xB4 |
|
//0xB7 |
|
//0xB8 |
|
//0xBC |
|
//0xBD |
|
//0xC0-0xC7 |
|
//0xC9-0xCB |
|
//0xCF |
|
//0xD1-0xFF |
|
}; |
|
|
|
enum Format { |
|
LineBreak,// = 0x07, // Inserts an inline line break (does not flush) |
|
Reset,// = 0x1E01, |
|
Green,// = 0x1E02, |
|
Blue,// = 0x1E03, |
|
Purple,// = 0x1E05, |
|
Aqua,// = 0x1E06, |
|
Peach,// = 0x1E07, |
|
White,// = 0x1E1A, |
|
Gray,// = 0x1E1B, |
|
Lilac,// = 0x1E3A, |
|
BlueWhite,// = 0x1E3C, |
|
InvisibleBlue,// = 0x1E62, // Ridiculously hard to read |
|
Red,// = 0x1E69, |
|
Yellow,// = 0x1E6E, |
|
RoyalBlue,// = 0x1E71, |
|
Invisible,// = 0x1E86, // This one really is invisible as far as I can tell |
|
GreenWhite,// = 0x1E96, |
|
SageGreen,// = 0x1EA0, |
|
AutoTransOpen,// = 0xFFEF27, |
|
AutoTransClose,// = 0xFFEF28, |
|
EnterToContinue,// = 0x7F3101 // Waits one second before making prompt available. Can alter the last byte to change the timing. |
|
}; |
|
|
|
enum Control |
|
{ |
|
flush, //Flush the output to chat log and clears the buffer |
|
clear, //Clears the buffer without writing it out |
|
}; |
|
|
|
class Log{ |
|
private: |
|
Mode mode; |
|
std::ostringstream s; |
|
IAshitaCore* m_Ashita; |
|
|
|
void putAutoTransOpen(); |
|
void putAutoTransClose(); |
|
public: |
|
Log &operator<<(Chat::Mode x) |
|
{ |
|
mode = x; |
|
return *this; |
|
} |
|
|
|
Log &operator<<(Chat::Format x) |
|
{ |
|
switch (x) |
|
{ |
|
case LineBreak: |
|
s.put('\x07'); |
|
break; |
|
case Reset: |
|
s.put('\x1E'); |
|
s.put('\x01'); |
|
break; |
|
case Green: |
|
s.put('\x1E'); |
|
s.put('\x02'); |
|
break; |
|
case Blue: |
|
s.put('\x1E'); |
|
s.put('\x03'); |
|
break; |
|
case Purple: |
|
s.put('\x1E'); |
|
s.put('\x05'); |
|
break; |
|
case Aqua: |
|
s.put('\x1E'); |
|
s.put('\x06'); |
|
break; |
|
case Peach: |
|
s.put('\x1E'); |
|
s.put('\x07'); |
|
break; |
|
case White: |
|
s.put('\x1E'); |
|
s.put('\x1A'); |
|
break; |
|
case Gray: |
|
s.put('\x1E'); |
|
s.put('\x1B'); |
|
break; |
|
case Lilac: |
|
s.put('\x1E'); |
|
s.put('\x3A'); |
|
break; |
|
case BlueWhite: |
|
s.put('\x1E'); |
|
s.put('\x3C'); |
|
break; |
|
case InvisibleBlue: |
|
s.put('\x1E'); |
|
s.put('\x62'); |
|
break; |
|
case Red: |
|
s.put('\x1E'); |
|
s.put('\x69'); |
|
break; |
|
case Yellow: |
|
s.put('\x1E'); |
|
s.put('\x6E'); |
|
break; |
|
case RoyalBlue: |
|
s.put('\x1E'); |
|
s.put('\x71'); |
|
break; |
|
case Invisible: |
|
s.put('\x1E'); |
|
s.put('\x86'); |
|
break; |
|
case GreenWhite: |
|
s.put('\x1E'); |
|
s.put('\x96'); |
|
break; |
|
case SageGreen: |
|
s.put('\x1E'); |
|
s.put('\xA0'); |
|
break; |
|
case AutoTransOpen: |
|
putAutoTransOpen(); |
|
break; |
|
case AutoTransClose: |
|
putAutoTransClose(); |
|
break; |
|
case EnterToContinue: |
|
s.put('\x7F'); |
|
s.put('\x31'); |
|
s.put('\x01'); |
|
break; |
|
} |
|
return *this; |
|
} |
|
|
|
Log &operator<<(ISpell* x) |
|
{ |
|
putAutoTransOpen(); |
|
s << x->Name; |
|
putAutoTransClose(); |
|
return *this; |
|
} |
|
|
|
Log &operator<<(IAbility* x) |
|
{ |
|
putAutoTransOpen(); |
|
s << x->Name; |
|
putAutoTransClose(); |
|
return *this; |
|
} |
|
|
|
Log &operator<<(IItem* x) |
|
{ |
|
putAutoTransOpen(); |
|
s << x->Name; |
|
putAutoTransClose(); |
|
return *this; |
|
} |
|
|
|
Log &operator<<(Chat::IAutoTrans x) |
|
{ |
|
putAutoTransOpen(); |
|
s << x.x; |
|
putAutoTransClose(); |
|
return *this; |
|
} |
|
|
|
Log &operator<<(Chat::Control x) |
|
{ |
|
switch(x) |
|
{ |
|
case Control::flush: |
|
m_Ashita->GetChatManager()->AddChatMessage(mode,s.str().c_str()); |
|
case Control::clear: |
|
s = std::ostringstream(); |
|
break; |
|
} |
|
return *this; |
|
} |
|
|
|
Log &operator<<(const char* &x) |
|
{ |
|
s << x; |
|
return *this; |
|
} |
|
|
|
Log &operator<<(std::string &x) |
|
{ |
|
s << x; |
|
return *this; |
|
} |
|
|
|
Log &operator<<(const char x[]) |
|
{ |
|
s << x; |
|
return *this; |
|
} |
|
|
|
Log(); |
|
~Log(); |
|
|
|
IAutoTrans Region(unsigned char RegionID); |
|
IAutoTrans Zone(unsigned int ZoneID); |
|
IAutoTrans Keyitem(unsigned int ID); |
|
|
|
void SetCore(IAshitaCore* mAshitaCore); |
|
}; |
|
|
|
}; |