merge upstream

This commit is contained in:
Arthur Ice 2014-12-21 13:45:26 -08:00
commit f409d39f1a
193 changed files with 4491 additions and 9483 deletions

View File

@ -1,5 +1,49 @@
EQEMu Changelog (Started on Sept 24, 2003 15:50)
-------------------------------------------------------
== 12/21/2014 ==
Trevius: (RoF2) Fixed Extended Targets Window by correcting opcodes.
== 12/20/2014 ==
Akkadius: Updated #cvs to display RoF2 Client Stream count
== 12/19/2014 ==
Trevius: (RoF2) Fixed Leadership AA Purchasing and Recipe Search by correcting opcodes.
Trevius: Fixed Armor Tinting (players and NPCs) that was broken during a previous update.
Trevius: (RoF2) Fixed Rest Timer, Show Helm Option, Auto-Consent Options, and identified Krono in the PP.
Trevius: Fixed Selling for Alternate Currency Merchants for RoF and RoF2.
== 12/18/2014 ==
Trevius: Finished lining up the RoF2 Player Profile Struct. Zone times are now normal, and everything from the PP is accurate in game now.
Trevius: Fixed zoning after death for RoF2.
== 12/17/2014 ==
demonstar55: Use vectors for route stuff, should be more CPU cache friendly so faster
Secrets: EQStream changes as recommended by a community member in private.
== 12/15/2014 ==
Trevius: (RoF+) Implemented the 6th Augment Slot for Items.
Trevius: Player Corpses now saved attuned settings for Items.
Required SQL: utils/sql/git/required/2014_12_15_multiple_table_updates.sql
== 12/13/2014 ==
demonstar55: Fix guild rank spam on zone (needed to be in OP_PP).
Trevius: (RoF+) Implemented Armor Ornamentation using Hero's Forge Armor Models. To use, create an ornamentation augment and set the herosforgemodel field in the items table.
Trevius: (RoF+) Added command #heromodel (#hm for short) - Usage: #heromodel [hero forge model] [ [slot] ] (example: #heromodel 63)
Be sure to run this or there will be item loss:
Required SQL: utils/sql/git/required/2014_12_13_inventory_table_update.sql
== 12/12/2014 ==
demonstar55: Add special attack 42, Ignore Root Aggro Rules. This allows you to root a mob and have them still use the normal aggro rules (so they will attack the one with most hate, not closest)
== 12/09/2014 ==
Trevius: (RoF+) Implemented Hero's Forge Armor Models for Items. To use, set herosforgemodel field in the item table to a model number such as 63 (for example).
demonstar55: SoF+ swarm pets will no longer be F8able (without a hack!)
== 12/08/2014 ==
Secrets: Added a feature that allows an EQ client to log in directly to World without having to enter the LoginServer, provided the 'password' field is set in WorldServer.
== 12/04/2014 ==
Kayen: Ranged attacks will now more accurately check MAX firing range, fixing the issue where you would
hit ranged attack and nothing would happpen due to incorrect server side range checks.

View File

@ -67,7 +67,6 @@ SET(common_sources
worldconn.cpp
xml_parser.cpp
platform.cpp
patches/client62.cpp
patches/patches.cpp
patches/sod.cpp
patches/sof.cpp
@ -193,11 +192,6 @@ SET(common_headers
worldconn.h
xml_parser.h
zone_numbers.h
patches/client62.h
patches/client62_constants.h
patches/client62_itemfields.h
patches/client62_ops.h
patches/client62_structs.h
patches/patches.h
patches/sod.h
patches/sod_constants.h
@ -251,11 +245,6 @@ SET(common_headers
)
SOURCE_GROUP(Patches FILES
patches/client62.h
patches/client62_itemfields.h
patches/client62_ops.h
patches/client62_constants.h
patches/client62_structs.h
patches/patches.h
patches/sod.h
patches/sod_itemfields.h
@ -291,7 +280,6 @@ SOURCE_GROUP(Patches FILES
patches/underfoot_ops.h
patches/underfoot_constants.h
patches/underfoot_structs.h
patches/client62.cpp
patches/patches.cpp
patches/sod.cpp
patches/sof.cpp

View File

@ -15,13 +15,12 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "debug.h"
#include "base_packet.h"
#include "misc.h"
#include "packet_dump.h"
BasePacket::BasePacket(const unsigned char *buf, uint32 len)
{
this->pBuffer=nullptr;

View File

@ -21,7 +21,6 @@
#include "types.h"
#include <stdio.h>
#include <string.h>
#include <string>
#ifdef WIN32
#include <time.h>

View File

@ -14,7 +14,7 @@
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
*/
*/
#include "../common/debug.h"
#include "../common/classes.h"

View File

@ -16,7 +16,6 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "debug.h"
#include "condition.h"
#ifdef _WINDOWS

View File

@ -15,13 +15,13 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "../common/debug.h"
#include "../common/rulesys.h"
#include <cmath>
#include <ctype.h>
#include <iomanip>
#include <iostream>
#include <limits.h>
#include <map>
#include <mysqld_error.h>
#include <stdio.h>
@ -42,8 +42,8 @@
#include "database.h"
#include "eq_packet_structs.h"
#include "string_util.h"
#include "extprofile.h"
#include "string_util.h"
extern Client client;
@ -2099,6 +2099,7 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
"`aug_3` int(11) unsigned DEFAULT '0', "
"`aug_4` int(11) unsigned DEFAULT '0', "
"`aug_5` int(11) unsigned DEFAULT '0', "
"`aug_6` int(11) unsigned DEFAULT '0', "
"`attuned` smallint(5) NOT NULL DEFAULT '0', "
"PRIMARY KEY(`corpse_id`, `equip_slot`) "
") ENGINE = InnoDB DEFAULT CHARSET = latin1; "
@ -2276,8 +2277,8 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
for (unsigned int i = 0; i < dbpc->itemcount; i++) {
if (first_entry != 1){
scquery = StringFormat("REPLACE INTO `character_corpse_items` \n"
" (corpse_id, equip_slot, item_id, charges, aug_1, aug_2, aug_3, aug_4, aug_5, attuned) \n"
" VALUES (%u, %u, %u, %u, %u, %u, %u, %u, %u, 0) \n",
" (corpse_id, equip_slot, item_id, charges, aug_1, aug_2, aug_3, aug_4, aug_5, aug_6, attuned) \n"
" VALUES (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u) \n",
atoi(row2[0]),
dbpc->items[i].equipSlot,
dbpc->items[i].item_id,
@ -2286,12 +2287,14 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
dbpc->items[i].aug2,
dbpc->items[i].aug3,
dbpc->items[i].aug4,
dbpc->items[i].aug5
dbpc->items[i].aug5,
dbpc->items[i].aug6,
dbpc->items[i].attuned
);
first_entry = 1;
}
else{
scquery = scquery + StringFormat(", (%u, %u, %u, %u, %u, %u, %u, %u, %u, 0) \n",
scquery = scquery + StringFormat(", (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u) \n",
atoi(row2[0]),
dbpc->items[i].equipSlot,
dbpc->items[i].item_id,
@ -2300,7 +2303,9 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
dbpc->items[i].aug2,
dbpc->items[i].aug3,
dbpc->items[i].aug4,
dbpc->items[i].aug5
dbpc->items[i].aug5,
dbpc->items[i].aug6,
dbpc->items[i].attuned
);
}
}
@ -2310,7 +2315,7 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
/* Classic Converter */
scquery = StringFormat("UPDATE `character_corpses` SET \n"
"`is_locked` = %d,\n"
"`exp` = %u,\n"
"`exp` = %u,\n"
"`size` = %f,\n"
"`level` = %u,\n"
"`race` = %u,\n"
@ -2338,7 +2343,7 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
"`wc_6` = %u,\n"
"`wc_7` = %u,\n"
"`wc_8` = %u,\n"
"`wc_9` = %u \n"
"`wc_9` = %u \n"
"WHERE `id` = %u \n",
dbpc_c->locked,
dbpc_c->exp,
@ -2381,8 +2386,8 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
for (unsigned int i = 0; i < dbpc_c->itemcount; i++) {
if (first_entry != 1){
scquery = StringFormat("REPLACE INTO `character_corpse_items` \n"
" (corpse_id, equip_slot, item_id, charges, aug_1, aug_2, aug_3, aug_4, aug_5, attuned) \n"
" VALUES (%u, %u, %u, %u, %u, %u, %u, %u, %u, 0) \n",
" (corpse_id, equip_slot, item_id, charges, aug_1, aug_2, aug_3, aug_4, aug_5, aug_6, attuned) \n"
" VALUES (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u) \n",
atoi(row2[0]),
dbpc_c->items[i].equipSlot,
dbpc_c->items[i].item_id,
@ -2391,12 +2396,14 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
dbpc_c->items[i].aug2,
dbpc_c->items[i].aug3,
dbpc_c->items[i].aug4,
dbpc_c->items[i].aug5
dbpc_c->items[i].aug5,
dbpc_c->items[i].aug6,
dbpc_c->items[i].attuned
);
first_entry = 1;
}
else{
scquery = scquery + StringFormat(", (%u, %u, %u, %u, %u, %u, %u, %u, %u, 0) \n",
scquery = scquery + StringFormat(", (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u) \n",
atoi(row2[0]),
dbpc_c->items[i].equipSlot,
dbpc_c->items[i].item_id,
@ -2405,7 +2412,9 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
dbpc_c->items[i].aug2,
dbpc_c->items[i].aug3,
dbpc_c->items[i].aug4,
dbpc_c->items[i].aug5
dbpc_c->items[i].aug5,
dbpc_c->items[i].aug6,
dbpc_c->items[i].attuned
);
}
}

View File

@ -26,6 +26,8 @@
#include "dbcore.h"
#include "linked_list.h"
#include "eq_packet_structs.h"
#include <cmath>
#include <string>
#include <vector>
#include <map>
@ -33,23 +35,9 @@
//atoi is not uint32 or uint32 safe!!!!
#define atoul(str) strtoul(str, nullptr, 10)
//class Spawn;
class Corpse;
class Spawn2;
class NPC;
class SpawnGroupList;
class Petition;
class Client;
class Merc;
class MySQLRequestResult;
struct Combine_Struct;
//struct Faction;
//struct FactionMods;
//struct FactionValue;
struct ZonePoint;
struct NPCType;
class Inventory;
class ItemInst;
class MySQLRequestResult;
class Client;
struct EventLogDetails_Struct {
uint32 id;
@ -81,11 +69,6 @@ struct VarCache_Struct {
char value[0];
};
struct PlayerProfile_Struct;
struct GuildRankLevel_Struct;
struct GuildRanks_Struct;
struct ExtendedProfile_Struct;
struct GuildMember_Struct;
class PTimerList;
#pragma pack(1)
@ -426,6 +409,8 @@ namespace Convert {
uint32 aug3;
uint32 aug4;
uint32 aug5;
uint32 aug6;
uint8 attuned;
};
}

View File

@ -1,18 +1,16 @@
#include "../common/debug.h"
#ifdef _WINDOWS
#include <winsock2.h>
#endif
#include "../common/misc_functions.h"
#include "dbcore.h"
#include <errmsg.h>
#include <fstream>
#include <iostream>
#include <errmsg.h>
#include <mysqld_error.h>
#include <limits.h>
#include "dbcore.h"
#include <string.h>
#include "../common/misc_functions.h"
#include <cstdlib>
#ifdef _WINDOWS
#define snprintf _snprintf

View File

@ -6,15 +6,12 @@
#include <windows.h>
#endif
#include "../common/mutex.h"
#include "../common/mysql_request_result.h"
#include "../common/types.h"
#include <mysql.h>
#include <string.h>
#include "../common/types.h"
#include "../common/mutex.h"
#include "../common/linked_list.h"
#include "../common/queue.h"
#include "../common/timer.h"
#include "../common/condition.h"
#include "../common/mysql_request_result.h"
class DBcore {
public:

View File

@ -1,7 +1,5 @@
#include <iostream>
#include <string>
#include <cstdarg>
#include <time.h>
#ifdef _WINDOWS
#include <process.h>
@ -12,14 +10,13 @@
#define strcasecmp _stricmp
#else
#include <sys/types.h>
#include <unistd.h>
#endif
#include "debug.h"
#include "string_util.h"
#include "misc_functions.h"
#include "platform.h"
@ -34,34 +31,37 @@ EQEMuLog *LogFile = &realLogFile;
static const char* FileNames[EQEMuLog::MaxLogID] = { "logs/eqemu", "logs/eqemu", "logs/eqemu_error", "logs/eqemu_debug", "logs/eqemu_quest", "logs/eqemu_commands", "logs/crash" };
static const char* LogNames[EQEMuLog::MaxLogID] = { "Status", "Normal", "Error", "Debug", "Quest", "Command", "Crash" };
EQEMuLog::EQEMuLog() {
for (int i=0; i<MaxLogID; i++) {
EQEMuLog::EQEMuLog()
{
for (int i = 0; i < MaxLogID; i++) {
fp[i] = 0;
logCallbackFmt[i] = nullptr;
logCallbackBuf[i] = nullptr;
logCallbackPva[i] = nullptr;
}
pLogStatus[Status] = LOG_LEVEL_STATUS;
pLogStatus[Normal] = LOG_LEVEL_NORMAL;
pLogStatus[Error] = LOG_LEVEL_ERROR;
pLogStatus[Debug] = LOG_LEVEL_DEBUG;
pLogStatus[Quest] = LOG_LEVEL_QUEST;
pLogStatus[Commands] = LOG_LEVEL_COMMANDS;
pLogStatus[Crash] = LOG_LEVEL_CRASH;
pLogStatus[EQEMuLog::LogIDs::Status] = LOG_LEVEL_STATUS;
pLogStatus[EQEMuLog::LogIDs::Normal] = LOG_LEVEL_NORMAL;
pLogStatus[EQEMuLog::LogIDs::Error] = LOG_LEVEL_ERROR;
pLogStatus[EQEMuLog::LogIDs::Debug] = LOG_LEVEL_DEBUG;
pLogStatus[EQEMuLog::LogIDs::Quest] = LOG_LEVEL_QUEST;
pLogStatus[EQEMuLog::LogIDs::Commands] = LOG_LEVEL_COMMANDS;
pLogStatus[EQEMuLog::LogIDs::Crash] = LOG_LEVEL_CRASH;
logFileValid = true;
}
EQEMuLog::~EQEMuLog() {
EQEMuLog::~EQEMuLog()
{
logFileValid = false;
for (int i=0; i<MaxLogID; i++) {
for (int i = 0; i < MaxLogID; i++) {
LockMutex lock(&MLog[i]); //to prevent termination race
if (fp[i])
if (fp[i]) {
fclose(fp[i]);
}
}
}
bool EQEMuLog::open(LogIDs id) {
bool EQEMuLog::open(LogIDs id)
{
if (!logFileValid) {
return false;
}
@ -76,114 +76,44 @@ bool EQEMuLog::open(LogIDs id) {
//cerr<<"Warning: LogFile already open"<<endl;
return true;
}
char exename[200] = "";
const EQEmuExePlatform &platform = GetExecutablePlatform();
if(platform == ExePlatformWorld) {
if (platform == ExePlatformWorld) {
snprintf(exename, sizeof(exename), "_world");
} else if(platform == ExePlatformZone) {
} else if (platform == ExePlatformZone) {
snprintf(exename, sizeof(exename), "_zone");
} else if(platform == ExePlatformLaunch) {
} else if (platform == ExePlatformLaunch) {
snprintf(exename, sizeof(exename), "_launch");
} else if(platform == ExePlatformUCS) {
} else if (platform == ExePlatformUCS) {
snprintf(exename, sizeof(exename), "_ucs");
} else if(platform == ExePlatformQueryServ) {
} else if (platform == ExePlatformQueryServ) {
snprintf(exename, sizeof(exename), "_queryserv");
} else if(platform == ExePlatformSharedMemory) {
} else if (platform == ExePlatformSharedMemory) {
snprintf(exename, sizeof(exename), "_shared_memory");
} else if(platform == ExePlatformClientImport) {
} else if (platform == ExePlatformClientImport) {
snprintf(exename, sizeof(exename), "_import");
} else if(platform == ExePlatformClientExport) {
} else if (platform == ExePlatformClientExport) {
snprintf(exename, sizeof(exename), "_export");
}
char filename[200];
#ifndef NO_PIDLOG
#ifndef NO_PIDLOG
snprintf(filename, sizeof(filename), "%s%s_%04i.log", FileNames[id], exename, getpid());
#else
#else
snprintf(filename, sizeof(filename), "%s%s.log", FileNames[id], exename);
#endif
#endif
fp[id] = fopen(filename, "a");
if (!fp[id]) {
std::cerr << "Failed to open log file: " << filename << std::endl;
pLogStatus[id] |= 4; // set file state to error
return false;
}
fputs("---------------------------------------------\n",fp[id]);
fputs("---------------------------------------------\n", fp[id]);
write(id, "Starting Log: %s", filename);
return true;
}
bool EQEMuLog::write(LogIDs id, const char *fmt, ...) {
if (!logFileValid) {
return false;
}
if (id >= MaxLogID) {
return false;
}
bool dofile = false;
if (pLogStatus[id] & 1) {
dofile = open(id);
}
if (!(dofile || pLogStatus[id] & 2))
return false;
LockMutex lock(&MLog[id]);
if (!logFileValid)
return false; //check again for threading race reasons (to avoid two mutexes)
time_t aclock;
struct tm *newtime;
time( &aclock ); /* Get time in seconds */
newtime = localtime( &aclock ); /* Convert time to struct */
if (dofile)
#ifndef NO_PIDLOG
fprintf(fp[id], "[%02d.%02d. - %02d:%02d:%02d] ", newtime->tm_mon+1, newtime->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec);
#else
fprintf(fp[id], "%04i [%02d.%02d. - %02d:%02d:%02d] ", getpid(), newtime->tm_mon+1, newtime->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec);
#endif
va_list argptr, tmpargptr;
va_start(argptr, fmt);
if (dofile) {
va_copy(tmpargptr, argptr);
vfprintf( fp[id], fmt, tmpargptr );
}
if(logCallbackFmt[id]) {
msgCallbackFmt p = logCallbackFmt[id];
va_copy(tmpargptr, argptr);
p(id, fmt, tmpargptr );
}
if (pLogStatus[id] & 2) {
if (pLogStatus[id] & 8) {
fprintf(stderr, "[%s] ", LogNames[id]);
vfprintf( stderr, fmt, argptr );
}
else {
fprintf(stdout, "[%s] ", LogNames[id]);
vfprintf( stdout, fmt, argptr );
}
}
va_end(argptr);
if (dofile)
fprintf(fp[id], "\n");
if (pLogStatus[id] & 2) {
if (pLogStatus[id] & 8) {
fprintf(stderr, "\n");
fflush(stderr);
} else {
fprintf(stdout, "\n");
fflush(stdout);
}
}
if(dofile)
fflush(fp[id]);
return true;
}
//write with Prefix and a VA_list
bool EQEMuLog::writePVA(LogIDs id, const char *prefix, const char *fmt, va_list argptr) {
bool EQEMuLog::write(LogIDs id, const char *fmt, ...)
{
if (!logFileValid) {
return false;
}
@ -198,56 +128,61 @@ bool EQEMuLog::writePVA(LogIDs id, const char *prefix, const char *fmt, va_list
return false;
}
LockMutex lock(&MLog[id]);
if (!logFileValid)
return false; //check again for threading race reasons (to avoid two mutexes)
if (!logFileValid) {
return false; //check again for threading race reasons (to avoid two mutexes)
}
time_t aclock;
struct tm *newtime;
time( &aclock ); /* Get time in seconds */
newtime = localtime( &aclock ); /* Convert time to struct */
va_list tmpargptr;
if (dofile)
#ifndef NO_PIDLOG
fprintf(fp[id], "[%02d.%02d. - %02d:%02d:%02d] ", newtime->tm_mon + 1, newtime->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec);
#else
fprintf(fp[id], "%04i [%02d.%02d. - %02d:%02d:%02d] ", getpid(), newtime->tm_mon + 1, newtime->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec);
#endif
va_list argptr, tmpargptr;
va_start(argptr, fmt);
if (dofile) {
#ifndef NO_PIDLOG
fprintf(fp[id], "[%02d.%02d. - %02d:%02d:%02d] %s", newtime->tm_mon+1, newtime->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec, prefix);
#else
fprintf(fp[id], "%04i [%02d.%02d. - %02d:%02d:%02d] %s", getpid(), newtime->tm_mon+1, newtime->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec, prefix);
#endif
va_copy(tmpargptr, argptr);
vfprintf( fp[id], fmt, tmpargptr );
}
if(logCallbackPva[id]) {
msgCallbackPva p = logCallbackPva[id];
if (logCallbackFmt[id]) {
msgCallbackFmt p = logCallbackFmt[id];
va_copy(tmpargptr, argptr);
p(id, prefix, fmt, tmpargptr );
p(id, fmt, tmpargptr );
}
if (pLogStatus[id] & 2) {
if (pLogStatus[id] & 8) {
fprintf(stderr, "[%s] %s", LogNames[id], prefix);
fprintf(stderr, "[%s] ", LogNames[id]);
vfprintf( stderr, fmt, argptr );
}
else {
fprintf(stdout, "[%s] %s", LogNames[id], prefix);
} else {
fprintf(stdout, "[%s] ", LogNames[id]);
vfprintf( stdout, fmt, argptr );
}
}
va_end(argptr);
if (dofile)
if (dofile) {
fprintf(fp[id], "\n");
if (pLogStatus[id] & 2) {
if (pLogStatus[id] & 8)
fprintf(stderr, "\n");
else
fprintf(stdout, "\n");
}
if(dofile)
if (pLogStatus[id] & 2) {
if (pLogStatus[id] & 8) {
fprintf(stderr, "\n");
fflush(stderr);
} else {
fprintf(stdout, "\n");
fflush(stdout);
}
}
if (dofile) {
fflush(fp[id]);
}
return true;
}
bool EQEMuLog::writebuf(LogIDs id, const char *buf, uint8 size, uint32 count) {
//write with Prefix and a VA_list
bool EQEMuLog::writePVA(LogIDs id, const char *prefix, const char *fmt, va_list argptr)
{
if (!logFileValid) {
return false;
}
@ -258,30 +193,92 @@ bool EQEMuLog::writebuf(LogIDs id, const char *buf, uint8 size, uint32 count) {
if (pLogStatus[id] & 1) {
dofile = open(id);
}
if (!(dofile || pLogStatus[id] & 2))
if (!(dofile || pLogStatus[id] & 2)) {
return false;
}
LockMutex lock(&MLog[id]);
if (!logFileValid)
return false; //check again for threading race reasons (to avoid two mutexes)
if (!logFileValid) {
return false; //check again for threading race reasons (to avoid two mutexes)
}
time_t aclock;
struct tm *newtime;
time( &aclock ); /* Get time in seconds */
newtime = localtime( &aclock ); /* Convert time to struct */
va_list tmpargptr;
if (dofile) {
#ifndef NO_PIDLOG
fprintf(fp[id], "[%02d.%02d. - %02d:%02d:%02d] %s", newtime->tm_mon + 1, newtime->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec, prefix);
#else
fprintf(fp[id], "%04i [%02d.%02d. - %02d:%02d:%02d] %s", getpid(), newtime->tm_mon + 1, newtime->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec, prefix);
#endif
va_copy(tmpargptr, argptr);
vfprintf( fp[id], fmt, tmpargptr );
}
if (logCallbackPva[id]) {
msgCallbackPva p = logCallbackPva[id];
va_copy(tmpargptr, argptr);
p(id, prefix, fmt, tmpargptr );
}
if (pLogStatus[id] & 2) {
if (pLogStatus[id] & 8) {
fprintf(stderr, "[%s] %s", LogNames[id], prefix);
vfprintf( stderr, fmt, argptr );
} else {
fprintf(stdout, "[%s] %s", LogNames[id], prefix);
vfprintf( stdout, fmt, argptr );
}
}
va_end(argptr);
if (dofile) {
fprintf(fp[id], "\n");
}
if (pLogStatus[id] & 2) {
if (pLogStatus[id] & 8) {
fprintf(stderr, "\n");
} else {
fprintf(stdout, "\n");
}
}
if (dofile) {
fflush(fp[id]);
}
return true;
}
bool EQEMuLog::writebuf(LogIDs id, const char *buf, uint8 size, uint32 count)
{
if (!logFileValid) {
return false;
}
if (id >= MaxLogID) {
return false;
}
bool dofile = false;
if (pLogStatus[id] & 1) {
dofile = open(id);
}
if (!(dofile || pLogStatus[id] & 2)) {
return false;
}
LockMutex lock(&MLog[id]);
if (!logFileValid) {
return false; //check again for threading race reasons (to avoid two mutexes)
}
time_t aclock;
struct tm *newtime;
time( &aclock ); /* Get time in seconds */
newtime = localtime( &aclock ); /* Convert time to struct */
if (dofile)
#ifndef NO_PIDLOG
fprintf(fp[id], "[%02d.%02d. - %02d:%02d:%02d] ", newtime->tm_mon+1, newtime->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec);
#else
fprintf(fp[id], "%04i [%02d.%02d. - %02d:%02d:%02d] ", getpid(), newtime->tm_mon+1, newtime->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec);
#endif
#ifndef NO_PIDLOG
fprintf(fp[id], "[%02d.%02d. - %02d:%02d:%02d] ", newtime->tm_mon + 1, newtime->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec);
#else
fprintf(fp[id], "%04i [%02d.%02d. - %02d:%02d:%02d] ", getpid(), newtime->tm_mon + 1, newtime->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec);
#endif
if (dofile) {
fwrite(buf, size, count, fp[id]);
fprintf(fp[id], "\n");
}
if(logCallbackBuf[id]) {
if (logCallbackBuf[id]) {
msgCallbackBuf p = logCallbackBuf[id];
p(id, buf, size, count);
}
@ -296,12 +293,14 @@ bool EQEMuLog::writebuf(LogIDs id, const char *buf, uint8 size, uint32 count) {
fprintf(stdout, "\n");
}
}
if(dofile)
if (dofile) {
fflush(fp[id]);
}
return true;
}
bool EQEMuLog::writeNTS(LogIDs id, bool dofile, const char *fmt, ...) {
bool EQEMuLog::writeNTS(LogIDs id, bool dofile, const char *fmt, ...)
{
va_list argptr, tmpargptr;
va_start(argptr, fmt);
if (dofile) {
@ -309,132 +308,146 @@ bool EQEMuLog::writeNTS(LogIDs id, bool dofile, const char *fmt, ...) {
vfprintf( fp[id], fmt, tmpargptr );
}
if (pLogStatus[id] & 2) {
if (pLogStatus[id] & 8)
if (pLogStatus[id] & 8) {
vfprintf( stderr, fmt, argptr );
else
} else {
vfprintf( stdout, fmt, argptr );
}
}
va_end(argptr);
return true;
};
bool EQEMuLog::Dump(LogIDs id, uint8* data, uint32 size, uint32 cols, uint32 skip) {
bool EQEMuLog::Dump(LogIDs id, uint8* data, uint32 size, uint32 cols, uint32 skip)
{
if (!logFileValid) {
#if EQDEBUG >= 10
std::cerr << "Error: Dump() from null pointer" << std::endl;
#endif
#if EQDEBUG >= 10
std::cerr << "Error: Dump() from null pointer" << std::endl;
#endif
return false;
}
if (size == 0)
if (size == 0) {
return true;
if (!LogFile)
}
if (!LogFile) {
return false;
if (id >= MaxLogID)
}
if (id >= MaxLogID) {
return false;
}
bool dofile = false;
if (pLogStatus[id] & 1) {
dofile = open(id);
}
if (!(dofile || pLogStatus[id] & 2))
if (!(dofile || pLogStatus[id] & 2)) {
return false;
}
LockMutex lock(&MLog[id]);
if (!logFileValid)
return false; //check again for threading race reasons (to avoid two mutexes)
if (!logFileValid) {
return false; //check again for threading race reasons (to avoid two mutexes)
}
write(id, "Dumping Packet: %i", size);
// Output as HEX
int beginningOfLineOffset = 0;
int beginningOfLineOffset = 0;
uint32 indexInData;
std::string asciiOutput;
for(indexInData=skip; indexInData<size; indexInData++) {
if ((indexInData-skip)%cols==0) {
if (indexInData != skip)
for (indexInData = skip; indexInData < size; indexInData++) {
if ((indexInData - skip) % cols == 0) {
if (indexInData != skip) {
writeNTS(id, dofile, " | %s\n", asciiOutput.c_str());
writeNTS(id, dofile, "%4i: ", indexInData-skip);
}
writeNTS(id, dofile, "%4i: ", indexInData - skip);
asciiOutput.clear();
beginningOfLineOffset = 0;
}
else if ((indexInData-skip)%(cols/2) == 0) {
} else if ((indexInData - skip) % (cols / 2) == 0) {
writeNTS(id, dofile, "- ");
}
writeNTS(id, dofile, "%02X ", (unsigned char)data[indexInData]);
if (data[indexInData] >= 32 && data[indexInData] < 127)
{
if (data[indexInData] >= 32 && data[indexInData] < 127) {
// According to http://msdn.microsoft.com/en-us/library/vstudio/ee404875(v=vs.100).aspx
// Visual Studio 2010 doesn't have std::to_string(int) but it does have the long long
// Visual Studio 2010 doesn't have std::to_string(int) but it does have the long long
// version.
asciiOutput.append(std::to_string((long long)data[indexInData]));
}
else
{
} else {
asciiOutput.append(".");
}
}
uint32 k = ((indexInData-skip)-1)%cols;
if (k < 8)
uint32 k = ((indexInData - skip) - 1) % cols;
if (k < 8) {
writeNTS(id, dofile, " ");
for (uint32 h = k+1; h < cols; h++) {
}
for (uint32 h = k + 1; h < cols; h++) {
writeNTS(id, dofile, " ");
}
writeNTS(id, dofile, " | %s\n", asciiOutput.c_str());
if (dofile)
if (dofile) {
fflush(fp[id]);
}
return true;
}
void EQEMuLog::SetCallback(LogIDs id, msgCallbackFmt proc) {
if (!logFileValid)
void EQEMuLog::SetCallback(LogIDs id, msgCallbackFmt proc)
{
if (!logFileValid) {
return;
}
if (id >= MaxLogID) {
return;
}
logCallbackFmt[id] = proc;
}
void EQEMuLog::SetCallback(LogIDs id, msgCallbackBuf proc) {
if (!logFileValid)
void EQEMuLog::SetCallback(LogIDs id, msgCallbackBuf proc)
{
if (!logFileValid) {
return;
}
if (id >= MaxLogID) {
return;
}
logCallbackBuf[id] = proc;
}
void EQEMuLog::SetCallback(LogIDs id, msgCallbackPva proc) {
if (!logFileValid)
void EQEMuLog::SetCallback(LogIDs id, msgCallbackPva proc)
{
if (!logFileValid) {
return;
}
if (id >= MaxLogID) {
return;
}
logCallbackPva[id] = proc;
}
void EQEMuLog::SetAllCallbacks(msgCallbackFmt proc) {
if (!logFileValid)
void EQEMuLog::SetAllCallbacks(msgCallbackFmt proc)
{
if (!logFileValid) {
return;
}
int r;
for(r = Status; r < MaxLogID; r++) {
for (r = Status; r < MaxLogID; r++) {
SetCallback((LogIDs)r, proc);
}
}
void EQEMuLog::SetAllCallbacks(msgCallbackBuf proc) {
if (!logFileValid)
void EQEMuLog::SetAllCallbacks(msgCallbackBuf proc)
{
if (!logFileValid) {
return;
}
int r;
for(r = Status; r < MaxLogID; r++) {
for (r = Status; r < MaxLogID; r++) {
SetCallback((LogIDs)r, proc);
}
}
void EQEMuLog::SetAllCallbacks(msgCallbackPva proc) {
if (!logFileValid)
void EQEMuLog::SetAllCallbacks(msgCallbackPva proc)
{
if (!logFileValid) {
return;
}
int r;
for(r = Status; r < MaxLogID; r++) {
for (r = Status; r < MaxLogID; r++) {
SetCallback((LogIDs)r, proc);
}
}

View File

@ -27,13 +27,10 @@ tremendously.
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <iomanip>
#include "emu_tcp_connection.h"
#include "emu_tcp_server.h"
#include "../common/servertalk.h"
#include "../common/packet_dump.h"
#ifdef FREEBSD //Timothy Whitman - January 7, 2003
#define MSG_NOSIGNAL 0

View File

@ -26,6 +26,7 @@
struct SPackSendQueue;
class EmuTCPServer;
class ServerPacket;
class EmuTCPConnection : public TCPConnection {
public:

View File

@ -548,7 +548,7 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
},
{ // local[MapBank]
/*Unknown*/ NOT_USED,
/*62*/ Client62::consts::MAP_BANK_SIZE,
/*62*/ NOT_USED,
/*Titanium*/ Titanium::consts::MAP_BANK_SIZE,
/*SoF*/ EmuConstants::MAP_BANK_SIZE,
/*SoD*/ EmuConstants::MAP_BANK_SIZE,
@ -698,7 +698,7 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
},
{ // local[MapCorpse]
/*Unknown*/ NOT_USED,
/*62*/ Client62::consts::MAP_CORPSE_SIZE,
/*62*/ NOT_USED,
/*Titanium*/ Titanium::consts::MAP_CORPSE_SIZE,
/*SoF*/ SoF::consts::MAP_CORPSE_SIZE,
/*SoD*/ SoD::consts::MAP_CORPSE_SIZE,
@ -728,7 +728,7 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
},
{ // local[MapInspect]
/*Unknown*/ NOT_USED,
/*62*/ Client62::consts::MAP_INSPECT_SIZE,
/*62*/ NOT_USED,
/*Titanium*/ Titanium::consts::MAP_INSPECT_SIZE,
/*SoF*/ SoF::consts::MAP_INSPECT_SIZE,
/*SoD*/ SoD::consts::MAP_INSPECT_SIZE,
@ -1006,7 +1006,7 @@ uint64 EQLimits::CursorBitmask(uint32 version) {
bool EQLimits::AllowsEmptyBagInBag(uint32 version) {
static const bool local[_EmuClientCount] = {
/*Unknown*/ false,
/*62*/ Client62::limits::ALLOWS_EMPTY_BAG_IN_BAG,
/*62*/ false,
/*Titanium*/ Titanium::limits::ALLOWS_EMPTY_BAG_IN_BAG,
/*SoF*/ SoF::limits::ALLOWS_EMPTY_BAG_IN_BAG,
/*SoD*/ SoD::limits::ALLOWS_EMPTY_BAG_IN_BAG,
@ -1027,7 +1027,7 @@ bool EQLimits::AllowsEmptyBagInBag(uint32 version) {
bool EQLimits::AllowsClickCastFromBag(uint32 version) {
static const bool local[_EmuClientCount] = {
/*Unknown*/ false,
/*62*/ Client62::limits::ALLOWS_CLICK_CAST_FROM_BAG,
/*62*/ false,
/*Titanium*/ Titanium::limits::ALLOWS_CLICK_CAST_FROM_BAG,
/*SoF*/ SoF::limits::ALLOWS_CLICK_CAST_FROM_BAG,
/*SoD*/ SoD::limits::ALLOWS_CLICK_CAST_FROM_BAG,
@ -1088,7 +1088,7 @@ uint16 EQLimits::ItemContainerSize(uint32 version) {
bool EQLimits::CoinHasWeight(uint32 version) {
static const bool local[_EmuClientCount] = {
/*Unknown*/ true,
/*62*/ Client62::limits::COIN_HAS_WEIGHT,
/*62*/ true,
/*Titanium*/ Titanium::limits::COIN_HAS_WEIGHT,
/*SoF*/ SoF::limits::COIN_HAS_WEIGHT,
/*SoD*/ SoD::limits::COIN_HAS_WEIGHT,

View File

@ -26,7 +26,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "eq_constants.h"
#include "clientversions.h"
#include <string>
#include "../common/patches/client62_constants.h"
#include "../common/patches/titanium_constants.h"
#include "../common/patches/sof_constants.h"
#include "../common/patches/sod_constants.h"
@ -138,8 +137,8 @@ public:
// items
// common and container sizes will not increase until the new 'location' struct is implemented
static const uint16 ITEM_COMMON_SIZE = Underfoot::consts::ITEM_COMMON_SIZE;
static const uint16 ITEM_CONTAINER_SIZE = Underfoot::consts::ITEM_CONTAINER_SIZE;
static const uint16 ITEM_COMMON_SIZE = RoF::consts::ITEM_COMMON_SIZE;
static const uint16 ITEM_CONTAINER_SIZE = Titanium::consts::ITEM_CONTAINER_SIZE;
// player profile
//static const uint32 CLASS_BITMASK = 0; // needs value

View File

@ -15,18 +15,21 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "crc16.h"
#include "debug.h"
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include "eq_packet.h"
#include "misc.h"
#include "op_codes.h"
#include "crc16.h"
#include "platform.h"
#include <iomanip>
#include <iostream>
#include <stdio.h>
#ifndef STATIC_OPCODE
#include "opcodemgr.h"
#endif
#include "packet_dump.h"
#include "packet_functions.h"
#include <cstdlib>

View File

@ -19,8 +19,6 @@
#define _EQPACKET_H
#include "base_packet.h"
#include "eq_stream_type.h"
#include "op_codes.h"
#include "platform.h"
#ifdef STATIC_OPCODE
@ -30,9 +28,6 @@
#include "emu_opcodes.h"
#endif
class EQStream;
class EQStreamPair;
class EQPacket : public BasePacket {
friend class EQStream;
public:

View File

@ -145,6 +145,28 @@ struct Color_Struct
};
};
/*
* Visible equiptment.
* Size: 20 Octets
*/
struct EquipStruct {
/*00*/ uint32 material;
/*04*/ uint32 unknown1;
/*08*/ uint32 elitematerial;
/*12*/ uint32 heroforgemodel;
/*16*/ uint32 material2; // Same as material?
/*20*/
};
struct CharSelectEquip {
uint32 material;
uint32 unknown1;
uint32 elitematerial;
uint32 heroforgemodel;
uint32 material2;
Color_Struct color;
};
/*
** Character Selection Struct
** Length: 1704 Bytes
@ -152,10 +174,11 @@ struct Color_Struct
*/
struct CharacterSelect_Struct {
/*0000*/ uint32 race[10]; // Characters Race
/*0040*/ Color_Struct cs_colors[10][9]; // Characters Equipment Colors
/*0040*/ //Color_Struct cs_colors[10][9]; // Characters Equipment Colors
/*0400*/ uint8 beardcolor[10]; // Characters beard Color
/*0410*/ uint8 hairstyle[10]; // Characters hair style
/*0420*/ uint32 equip[10][9]; // 0=helm, 1=chest, 2=arm, 3=bracer, 4=hand, 5=leg, 6=boot, 7=melee1, 8=melee2 (Might not be)
/*0420*/ //uint32 equip[10][9]; // 0=helm, 1=chest, 2=arm, 3=bracer, 4=hand, 5=leg, 6=boot, 7=melee1, 8=melee2 (Might not be)
/*0000*/ CharSelectEquip equip[10][9];
/*0780*/ uint32 secondary[10]; // Characters secondary IDFile number
/*0820*/ uint32 drakkin_heritage[10]; // added for SoF
/*0860*/ uint32 drakkin_tattoo[10]; // added for SoF
@ -258,21 +281,21 @@ struct Spawn_Struct {
/*0193*/ uint8 guildrank; // 0=normal, 1=officer, 2=leader
/*0194*/ uint8 unknown0194[3];
/*0197*/ union
{
struct
{
/*0197*/ uint32 equip_helmet; // Equipment: Helmet Visual
/*0201*/ uint32 equip_chest; // Equipment: Chest Visual
/*0205*/ uint32 equip_arms; // Equipment: Arms Visual
/*0209*/ uint32 equip_bracers; // Equipment: Bracers Visual
/*0213*/ uint32 equip_hands; // Equipment: Hands Visual
/*0217*/ uint32 equip_legs; // Equipment: Legs Visual
/*0221*/ uint32 equip_feet; // Equipment: Feet Visual
/*0225*/ uint32 equip_primary; // Equipment: Primary Visual
/*0229*/ uint32 equip_secondary; // Equipment: Secondary Visual
} equip;
/*0197*/ uint32 equipment[_MaterialCount]; // Array elements correspond to struct equipment above
};
{
struct
{
/*0000*/ EquipStruct equip_helmet; // Equipment: Helmet visual
/*0000*/ EquipStruct equip_chest; // Equipment: Chest visual
/*0000*/ EquipStruct equip_arms; // Equipment: Arms visual
/*0000*/ EquipStruct equip_bracers; // Equipment: Wrist visual
/*0000*/ EquipStruct equip_hands; // Equipment: Hands visual
/*0000*/ EquipStruct equip_legs; // Equipment: Legs visual
/*0000*/ EquipStruct equip_feet; // Equipment: Boots visual
/*0000*/ EquipStruct equip_primary; // Equipment: Main visual
/*0000*/ EquipStruct equip_secondary; // Equipment: Off visual
} equip;
/*0000*/ EquipStruct equipment[_MaterialCount];
};
/*0233*/ float runspeed; // Speed when running
/*0036*/ uint8 afk; // 0=no, 1=afk
/*0238*/ uint32 guildID; // Current guild
@ -340,6 +363,7 @@ union
uint32 DestructibleUnk7;
uint8 DestructibleUnk8;
uint32 DestructibleUnk9;
bool targetable_with_hotkey;
};
@ -1356,19 +1380,19 @@ struct PlayerPositionUpdateServer_Struct
struct PlayerPositionUpdateClient_Struct
{
/*0000*/ uint16 spawn_id;
/*0022*/ uint16 sequence; //increments one each packet
/*0002*/ uint16 sequence; //increments one each packet
/*0004*/ float y_pos; // y coord
/*0008*/ float delta_z; // Change in z
/*0016*/ float delta_x; // Change in x
/*0012*/ float delta_y; // Change in y
/*0012*/ float delta_x; // Change in x
/*0016*/ float delta_y; // Change in y
/*0020*/ int32 animation:10, // animation
delta_heading:10, // change in heading
padding0020:12; // ***Placeholder (mostly 1)
/*0024*/ float x_pos; // x coord
/*0028*/ float z_pos; // z coord
/*0034*/ uint16 heading:12, // Directional heading
/*0032*/ uint16 heading:12, // Directional heading
padding0004:4; // ***Placeholder
/*0032*/ uint8 unknown0006[2]; // ***Placeholder
/*0034*/ uint8 unknown0006[2]; // ***Placeholder
/*0036*/
};
@ -2895,7 +2919,7 @@ uint8 npccastfilters; // 0) No, 1) Ignore NPC Casts (all), 2) Ignore NPC Casts
*/
struct ItemViewRequest_Struct {
/*000*/ uint32 item_id;
/*004*/ uint32 augments[5];
/*004*/ uint32 augments[6];
/*024*/ uint32 link_hash;
/*028*/ uint32 unknown028;
/*032*/ char unknown032[12]; //probably includes loregroup & evolving info. see Client::MakeItemLink() in zone/inventory.cpp:469
@ -5218,8 +5242,10 @@ struct ServerLootItem_Struct {
uint32 aug_3; // uint32 aug_3;
uint32 aug_4; // uint32 aug_4;
uint32 aug_5; // uint32 aug_5;
uint8 min_level; //
uint8 max_level; //
uint32 aug_6; // uint32 aug_5;
uint8 attuned;
uint8 min_level;
uint8 max_level;
};
//Found in client near a ref to the string:

View File

@ -19,15 +19,12 @@
#include "debug.h"
#include "eq_packet.h"
#include "eq_stream.h"
#include "misc.h"
#include "mutex.h"
#include "op_codes.h"
#include "crc16.h"
#include "platform.h"
#include <string>
#include <iomanip>
#include <iostream>
#include <vector>
#include <algorithm>
@ -50,7 +47,13 @@
uint16 EQStream::MaxWindowSize=2048;
void EQStream::init() {
void EQStream::init(bool resetSession) {
// we only reset these statistics if it is a 'new' connection
if ( resetSession )
{
streamactive = false;
sessionAttempts = 0;
}
active_users = 0;
Session=0;
Key=0;
@ -316,18 +319,22 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
}
#ifndef COLLECTOR
if (GetState()==ESTABLISHED) {
_log(NET__ERROR, _L "Received OP_SessionRequest in ESTABLISHED state (%d)" __L, GetState());
_log(NET__ERROR, _L "Received OP_SessionRequest in ESTABLISHED state (%d) streamactive (%i) attempt (%i)" __L, GetState(),streamactive,sessionAttempts);
/*RemoveData();
init();
State=UNESTABLISHED;*/
_SendDisconnect();
SetState(CLOSED);
break;
// client seems to try a max of 30 times (initial+3 retries) then gives up, giving it a few more attempts just in case
// streamactive means we identified the opcode for the stream, we cannot re-establish this connection
if ( streamactive || ( sessionAttempts > MAX_SESSION_RETRIES ) )
{
_SendDisconnect();
SetState(CLOSED);
break;
}
}
#endif
//std::cout << "Got OP_SessionRequest" << std::endl;
init();
sessionAttempts++;
// we set established below, so statistics will not be reset for session attempts/stream active.
init(GetState()!=ESTABLISHED);
OutboundQueueClear();
SessionRequest *Request=(SessionRequest *)p->pBuffer;
Session=ntohl(Request->Session);

View File

@ -1,22 +1,26 @@
#ifndef _EQSTREAM_H
#define _EQSTREAM_H
#include <string>
#include <vector>
#include <map>
#include <queue>
#include <deque>
#ifndef WIN32
#include <netinet/in.h>
#endif
#include "eq_stream_type.h"
#include "../common/misc.h"
#include "../common/opcodemgr.h"
#include "../common/timer.h"
#include "eq_packet.h"
#include "eq_stream_intf.h"
#include "eq_stream_type.h"
#include "mutex.h"
#include "../common/opcodemgr.h"
#include "../common/misc.h"
#include "../common/condition.h"
#include "../common/timer.h"
class EQApplicationPacket;
class EQProtocolPacket;
#define FLAG_COMPRESSED 0x01
#define FLAG_ENCODED 0x04
@ -45,6 +49,10 @@
#define RETRANSMIT_ACKED_PACKETS true
#endif
#ifndef MAX_SESSION_RETRIES
#define MAX_SESSION_RETRIES 30
#endif
#pragma pack(1)
struct SessionRequest {
uint32 UnknownA;
@ -78,7 +86,6 @@ struct SessionStats {
#pragma pack()
class OpcodeManager;
class EQStreamPair;
class EQRawApplicationPacket;
class EQStream : public EQStreamInterface {
@ -101,6 +108,9 @@ class EQStream : public EQStreamInterface {
uint32 retransmittimer;
uint32 retransmittimeout;
uint16 sessionAttempts;
bool streamactive;
//uint32 buffer_len;
uint32 Session, Key;
@ -194,9 +204,9 @@ class EQStream : public EQStreamInterface {
void _SendDisconnect();
void init();
void init(bool resetSession=true);
public:
EQStream() { init(); remote_ip = 0; remote_port = 0; State=UNESTABLISHED; StreamType=UnknownStream; compressed=true; encoded=false; app_opcode_size=2; bytes_sent=0; bytes_recv=0; create_time=Timer::GetTimeSeconds(); }
EQStream() { init(); remote_ip = 0; remote_port = 0; State=UNESTABLISHED; StreamType=UnknownStream; compressed=true; encoded=false; app_opcode_size=2; bytes_sent=0; bytes_recv=0; create_time=Timer::GetTimeSeconds(); sessionAttempts = 0; streamactive=false; }
EQStream(sockaddr_in addr) { init(); remote_ip=addr.sin_addr.s_addr; remote_port=addr.sin_port; State=UNESTABLISHED; StreamType=UnknownStream; compressed=true; encoded=false; app_opcode_size=2; bytes_sent=0; bytes_recv=0; create_time=Timer::GetTimeSeconds(); }
virtual ~EQStream() { RemoveData(); SetState(CLOSED); }
void SetMaxLen(uint32 length) { MaxLen=length; }
@ -221,6 +231,9 @@ class EQStream : public EQStreamInterface {
void SetLastPacketTime(uint32 t) {LastPacket=t;}
void Write(int eq_fd);
// whether or not the stream has been assigned (we passed our stream match)
void SetActive(bool val) { streamactive = val; }
//
inline bool IsInUse() { bool flag; MInUse.lock(); flag=(active_users>0); MInUse.unlock(); return flag; }
inline void PutInUse() { MInUse.lock(); active_users++; MInUse.unlock(); }

View File

@ -1,5 +1,6 @@
#include "debug.h"
#include "eq_stream_factory.h"
#ifdef _WINDOWS
#include <winsock.h>
#include <process.h>
@ -13,11 +14,11 @@
#include <netdb.h>
#include <pthread.h>
#endif
#include <fcntl.h>
#include <iostream>
#include <fcntl.h>
#include "op_codes.h"
#include "eq_stream.h"
#include "logsys.h"
ThreadReturnType EQStreamFactoryReaderLoop(void *eqfs)
{
@ -291,7 +292,7 @@ Timer DecayTimer(20);
//bullshit checking, to see if this is really happening, GDB seems to think so...
if(stream_itr->second == nullptr) {
fprintf(stderr, "ERROR: nullptr Stream encountered in EQStreamFactory::WriterLoop for: %i", stream_itr->first.first, stream_itr->first.second);
fprintf(stderr, "ERROR: nullptr Stream encountered in EQStreamFactory::WriterLoop for: %i:%i", stream_itr->first.first, stream_itr->first.second);
continue;
}

View File

@ -4,11 +4,13 @@
#include <queue>
#include <map>
#include "../common/eq_stream.h"
#include "../common/condition.h"
#include "../common/timeoutmgr.h"
#include "../common/opcodemgr.h"
#include "../common/timer.h"
class EQStream;
class Timer;
class EQStreamFactory : private Timeoutable {
private:

View File

@ -110,6 +110,9 @@ void EQStreamIdentifier::Process() {
_log(NET__IDENTIFY, "Identified stream %s:%d with signature %s", long2ip(r->stream->GetRemoteIP()).c_str(), ntohs(r->stream->GetRemotePort()), p->name.c_str());
// before we assign the eqstream to an interface, let the stream recognize it is in use and the session should not be reset any further
r->stream->SetActive(true);
//might want to do something less-specific here... some day..
EQStreamInterface *s = new EQStreamProxy(r->stream, p->structs, p->opcodes);
m_identified.push(s);

View File

@ -4,13 +4,13 @@
#include "eq_stream.h"
#include "timer.h"
#include <vector>
#include <string>
#include <queue>
#define STREAM_IDENT_WAIT_MS 10000
class OpcodeManager;
class StructStrategy;
class EQStreamInterface;
class EQStreamIdentifier {
public:

View File

@ -1,4 +1,4 @@
/* EQEMu: Everquest Server Emulator
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
@ -15,62 +15,65 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "../common/debug.h"
#include "eqemu_config.h"
#include "misc_functions.h"
#include <iostream>
#include <sstream>
std::string EQEmuConfig::ConfigFile = "eqemu_config.xml";
EQEmuConfig *EQEmuConfig::_config = nullptr;
void EQEmuConfig::do_world(TiXmlElement *ele) {
void EQEmuConfig::do_world(TiXmlElement *ele)
{
const char *text;
TiXmlElement * sub_ele;;
text= ParseTextBlock(ele,"shortname");
if (text)
ShortName=text;
text = ParseTextBlock(ele,"longname");
if (text)
LongName=text;
text = ParseTextBlock(ele,"address",true);
if (text)
WorldAddress=text;
text = ParseTextBlock(ele,"localaddress",true);
if (text)
LocalAddress=text;
text = ParseTextBlock(ele,"maxclients",true);
if (text)
MaxClients=atoi(text);
text = ParseTextBlock(ele, "shortname");
if (text) {
ShortName = text;
}
text = ParseTextBlock(ele, "longname");
if (text) {
LongName = text;
}
text = ParseTextBlock(ele, "address", true);
if (text) {
WorldAddress = text;
}
text = ParseTextBlock(ele, "localaddress", true);
if (text) {
LocalAddress = text;
}
text = ParseTextBlock(ele, "maxclients", true);
if (text) {
MaxClients = atoi(text);
}
// Get the <key> element
text = ParseTextBlock(ele,"key",true);
if (text)
SharedKey=text;
text = ParseTextBlock(ele, "key", true);
if (text) {
SharedKey = text;
}
// Get the <loginserver> element
sub_ele = ele->FirstChildElement("loginserver");
if (sub_ele) {
text=ParseTextBlock(sub_ele,"host",true);
if (text)
LoginHost=text;
text=ParseTextBlock(sub_ele,"port",true);
if (text)
LoginPort=atoi(text);
text=ParseTextBlock(sub_ele,"account",true);
if (text)
LoginAccount=text;
text=ParseTextBlock(sub_ele,"password",true);
if (text)
LoginPassword=text;
text = ParseTextBlock(sub_ele, "host", true);
if (text) {
LoginHost = text;
}
text = ParseTextBlock(sub_ele, "port", true);
if (text) {
LoginPort = atoi(text);
}
text = ParseTextBlock(sub_ele, "account", true);
if (text) {
LoginAccount = text;
}
text = ParseTextBlock(sub_ele, "password", true);
if (text) {
LoginPassword = text;
}
} else {
char str[32];
do {
@ -78,329 +81,373 @@ void EQEmuConfig::do_world(TiXmlElement *ele) {
sub_ele = ele->FirstChildElement(str);
if (sub_ele) {
LoginConfig* loginconfig = new LoginConfig;
text=ParseTextBlock(sub_ele,"host",true);
if (text)
loginconfig->LoginHost=text;
text=ParseTextBlock(sub_ele,"port",true);
if (text)
loginconfig->LoginPort=atoi(text);
text=ParseTextBlock(sub_ele,"account",true);
if (text)
loginconfig->LoginAccount=text;
text=ParseTextBlock(sub_ele,"password",true);
if (text)
loginconfig->LoginPassword=text;
text = ParseTextBlock(sub_ele, "host", true);
if (text) {
loginconfig->LoginHost = text;
}
text = ParseTextBlock(sub_ele, "port", true);
if (text) {
loginconfig->LoginPort = atoi(text);
}
text = ParseTextBlock(sub_ele, "account", true);
if (text) {
loginconfig->LoginAccount = text;
}
text = ParseTextBlock(sub_ele, "password", true);
if (text) {
loginconfig->LoginPassword = text;
}
loginlist.Insert(loginconfig);
}
} while(sub_ele);
} while (sub_ele);
}
// Check for locked
sub_ele = ele->FirstChildElement("locked");
if (sub_ele != nullptr)
Locked=true;
if (sub_ele != nullptr) {
Locked = true;
}
// Get the <tcp> element
sub_ele = ele->FirstChildElement("tcp");
if(sub_ele != nullptr) {
if (sub_ele != nullptr) {
text = sub_ele->Attribute("ip");
if (text)
WorldIP=text;
if (text) {
WorldIP = text;
}
text = sub_ele->Attribute("port");
if (text)
WorldTCPPort=atoi(text);
if (text) {
WorldTCPPort = atoi(text);
}
text = sub_ele->Attribute("telnet");
if (text && !strcasecmp(text,"enabled"))
TelnetEnabled=true;
if (text && !strcasecmp(text, "enabled")) {
TelnetEnabled = true;
}
}
// Get the <http> element
sub_ele = ele->FirstChildElement("http");
if(sub_ele != nullptr) {
if (sub_ele != nullptr) {
// text = sub_ele->Attribute("ip");
// if (text)
// WorldIP=text;
text = sub_ele->Attribute("mimefile");
if (text)
WorldHTTPMimeFile=text;
if (text) {
WorldHTTPMimeFile = text;
}
text = sub_ele->Attribute("port");
if (text)
WorldHTTPPort=atoi(text);
if (text) {
WorldHTTPPort = atoi(text);
}
text = sub_ele->Attribute("enabled");
if (text && !strcasecmp(text,"true"))
WorldHTTPEnabled=true;
if (text && !strcasecmp(text, "true")) {
WorldHTTPEnabled = true;
}
}
}
void EQEmuConfig::do_chatserver(TiXmlElement *ele) {
void EQEmuConfig::do_chatserver(TiXmlElement *ele)
{
const char *text;
text=ParseTextBlock(ele,"host",true);
if (text)
ChatHost=text;
text=ParseTextBlock(ele,"port",true);
if (text)
ChatPort=atoi(text);
text = ParseTextBlock(ele, "host", true);
if (text) {
ChatHost = text;
}
text = ParseTextBlock(ele, "port", true);
if (text) {
ChatPort = atoi(text);
}
}
void EQEmuConfig::do_mailserver(TiXmlElement *ele) {
void EQEmuConfig::do_mailserver(TiXmlElement *ele)
{
const char *text;
text=ParseTextBlock(ele,"host",true);
if (text)
MailHost=text;
text=ParseTextBlock(ele,"port",true);
if (text)
MailPort=atoi(text);
text = ParseTextBlock(ele, "host", true);
if (text) {
MailHost = text;
}
text = ParseTextBlock(ele, "port", true);
if (text) {
MailPort = atoi(text);
}
}
void EQEmuConfig::do_database(TiXmlElement *ele) {
void EQEmuConfig::do_database(TiXmlElement *ele)
{
const char *text;
text=ParseTextBlock(ele,"host",true);
if (text)
DatabaseHost=text;
text=ParseTextBlock(ele,"port",true);
if (text)
DatabasePort=atoi(text);
text=ParseTextBlock(ele,"username",true);
if (text)
DatabaseUsername=text;
text=ParseTextBlock(ele,"password",true);
if (text)
DatabasePassword=text;
text=ParseTextBlock(ele,"db",true);
if (text)
DatabaseDB=text;
text = ParseTextBlock(ele, "host", true);
if (text) {
DatabaseHost = text;
}
text = ParseTextBlock(ele, "port", true);
if (text) {
DatabasePort = atoi(text);
}
text = ParseTextBlock(ele, "username", true);
if (text) {
DatabaseUsername = text;
}
text = ParseTextBlock(ele, "password", true);
if (text) {
DatabasePassword = text;
}
text = ParseTextBlock(ele, "db", true);
if (text) {
DatabaseDB = text;
}
}
void EQEmuConfig::do_qsdatabase(TiXmlElement *ele) {
void EQEmuConfig::do_qsdatabase(TiXmlElement *ele)
{
const char *text;
text=ParseTextBlock(ele,"host",true);
if (text)
QSDatabaseHost=text;
text=ParseTextBlock(ele,"port",true);
if (text)
QSDatabasePort=atoi(text);
text=ParseTextBlock(ele,"username",true);
if (text)
QSDatabaseUsername=text;
text=ParseTextBlock(ele,"password",true);
if (text)
QSDatabasePassword=text;
text=ParseTextBlock(ele,"db",true);
if (text)
QSDatabaseDB=text;
text = ParseTextBlock(ele, "host", true);
if (text) {
QSDatabaseHost = text;
}
text = ParseTextBlock(ele, "port", true);
if (text) {
QSDatabasePort = atoi(text);
}
text = ParseTextBlock(ele, "username", true);
if (text) {
QSDatabaseUsername = text;
}
text = ParseTextBlock(ele, "password", true);
if (text) {
QSDatabasePassword = text;
}
text = ParseTextBlock(ele, "db", true);
if (text) {
QSDatabaseDB = text;
}
}
void EQEmuConfig::do_zones(TiXmlElement *ele) {
void EQEmuConfig::do_zones(TiXmlElement *ele)
{
const char *text;
TiXmlElement *sub_ele;
// TiXmlNode *node,*sub_node;
text=ParseTextBlock(ele,"defaultstatus",true);
if (text)
DefaultStatus=atoi(text);
text = ParseTextBlock(ele, "defaultstatus", true);
if (text) {
DefaultStatus = atoi(text);
}
// Get the <ports> element
sub_ele = ele->FirstChildElement("ports");
if(sub_ele != nullptr) {
if (sub_ele != nullptr) {
text = sub_ele->Attribute("low");
if (text)
ZonePortLow=atoi(text);;
if (text) {
ZonePortLow = atoi(text);
};
text = sub_ele->Attribute("high");
if (text)
ZonePortHigh=atoi(text);
if (text) {
ZonePortHigh = atoi(text);
}
}
}
void EQEmuConfig::do_files(TiXmlElement *ele) {
void EQEmuConfig::do_files(TiXmlElement *ele)
{
const char *text;
text=ParseTextBlock(ele,"spells",true);
if (text)
SpellsFile=text;
text=ParseTextBlock(ele,"opcodes",true);
if (text)
OpCodesFile=text;
text=ParseTextBlock(ele,"logsettings",true);
if (text)
LogSettingsFile=text;
text=ParseTextBlock(ele,"eqtime",true);
if (text)
EQTimeFile=text;
text = ParseTextBlock(ele, "spells", true);
if (text) {
SpellsFile = text;
}
text = ParseTextBlock(ele, "opcodes", true);
if (text) {
OpCodesFile = text;
}
text = ParseTextBlock(ele, "logsettings", true);
if (text) {
LogSettingsFile = text;
}
text = ParseTextBlock(ele, "eqtime", true);
if (text) {
EQTimeFile = text;
}
}
void EQEmuConfig::do_directories(TiXmlElement *ele) {
void EQEmuConfig::do_directories(TiXmlElement *ele)
{
const char *text;
text=ParseTextBlock(ele,"maps",true);
if (text)
MapDir=text;
text=ParseTextBlock(ele,"quests",true);
if (text)
QuestDir=text;
text=ParseTextBlock(ele,"plugins",true);
if (text)
PluginDir=text;
text = ParseTextBlock(ele, "maps", true);
if (text) {
MapDir = text;
}
text = ParseTextBlock(ele, "quests", true);
if (text) {
QuestDir = text;
}
text = ParseTextBlock(ele, "plugins", true);
if (text) {
PluginDir = text;
}
}
void EQEmuConfig::do_launcher(TiXmlElement *ele) {
void EQEmuConfig::do_launcher(TiXmlElement *ele)
{
const char *text;
TiXmlElement *sub_ele;
text=ParseTextBlock(ele,"logprefix",true);
if (text)
text = ParseTextBlock(ele, "logprefix", true);
if (text) {
LogPrefix = text;
text=ParseTextBlock(ele,"logsuffix",true);
if (text)
}
text = ParseTextBlock(ele, "logsuffix", true);
if (text) {
LogSuffix = text;
}
// Get the <exe> element
text = ParseTextBlock(ele,"exe",true);
if (text)
text = ParseTextBlock(ele, "exe", true);
if (text) {
ZoneExe = text;
}
// Get the <timers> element
sub_ele = ele->FirstChildElement("timers");
if(sub_ele != nullptr) {
if (sub_ele != nullptr) {
text = sub_ele->Attribute("restart");
if (text)
if (text) {
RestartWait = atoi(text);
}
text = sub_ele->Attribute("reterminate");
if (text)
if (text) {
TerminateWait = atoi(text);
}
text = sub_ele->Attribute("initial");
if (text)
if (text) {
InitialBootWait = atoi(text);
}
text = sub_ele->Attribute("interval");
if (text)
if (text) {
ZoneBootInterval = atoi(text);
}
}
}
std::string EQEmuConfig::GetByName(const std::string &var_name) const {
if(var_name == "ShortName")
return(ShortName);
if(var_name == "LongName")
return(LongName);
if(var_name == "WorldAddress")
return(WorldAddress);
if(var_name == "LoginHost")
return(LoginHost);
if(var_name == "LoginAccount")
return(LoginAccount);
if(var_name == "LoginPassword")
return(LoginPassword);
if(var_name == "LoginPort")
return(itoa(LoginPort));
if(var_name == "Locked")
return(Locked?"true":"false");
if(var_name == "WorldTCPPort")
return(itoa(WorldTCPPort));
if(var_name == "WorldIP")
return(WorldIP);
if(var_name == "TelnetEnabled")
return(TelnetEnabled?"true":"false");
if(var_name == "WorldHTTPPort")
return(itoa(WorldHTTPPort));
if(var_name == "WorldHTTPMimeFile")
return(WorldHTTPMimeFile);
if(var_name == "WorldHTTPEnabled")
return(WorldHTTPEnabled?"true":"false");
if(var_name == "ChatHost")
return(ChatHost);
if(var_name == "ChatPort")
return(itoa(ChatPort));
if(var_name == "MailHost")
return(MailHost);
if(var_name == "MailPort")
return(itoa(MailPort));
if(var_name == "DatabaseHost")
return(DatabaseHost);
if(var_name == "DatabaseUsername")
return(DatabaseUsername);
if(var_name == "DatabasePassword")
return(DatabasePassword);
if(var_name == "DatabaseDB")
return(DatabaseDB);
if(var_name == "DatabasePort")
return(itoa(DatabasePort));
if(var_name == "QSDatabaseHost")
return(QSDatabaseHost);
if(var_name == "QSDatabaseUsername")
return(QSDatabaseUsername);
if(var_name == "QSDatabasePassword")
return(QSDatabasePassword);
if(var_name == "QSDatabaseDB")
return(QSDatabaseDB);
if(var_name == "QSDatabasePort")
return(itoa(QSDatabasePort));
if(var_name == "SpellsFile")
return(SpellsFile);
if(var_name == "OpCodesFile")
return(OpCodesFile);
if(var_name == "EQTimeFile")
return(EQTimeFile);
if(var_name == "LogSettingsFile")
return(LogSettingsFile);
if(var_name == "MapDir")
return(MapDir);
if(var_name == "QuestDir")
return(QuestDir);
if(var_name == "PluginDir")
return(PluginDir);
if(var_name == "LogPrefix")
return(LogPrefix);
if(var_name == "LogSuffix")
return(LogSuffix);
if(var_name == "ZoneExe")
return(ZoneExe);
if(var_name == "ZonePortLow")
return(itoa(ZonePortLow));
if(var_name == "ZonePortHigh")
return(itoa(ZonePortHigh));
if(var_name == "DefaultStatus")
return(itoa(DefaultStatus));
std::string EQEmuConfig::GetByName(const std::string &var_name) const
{
if (var_name == "ShortName") {
return (ShortName);
}
if (var_name == "LongName") {
return (LongName);
}
if (var_name == "WorldAddress") {
return (WorldAddress);
}
if (var_name == "LoginHost") {
return (LoginHost);
}
if (var_name == "LoginAccount") {
return (LoginAccount);
}
if (var_name == "LoginPassword") {
return (LoginPassword);
}
if (var_name == "LoginPort") {
return (itoa(LoginPort));
}
if (var_name == "Locked") {
return (Locked ? "true" : "false");
}
if (var_name == "WorldTCPPort") {
return (itoa(WorldTCPPort));
}
if (var_name == "WorldIP") {
return (WorldIP);
}
if (var_name == "TelnetEnabled") {
return (TelnetEnabled ? "true" : "false");
}
if (var_name == "WorldHTTPPort") {
return (itoa(WorldHTTPPort));
}
if (var_name == "WorldHTTPMimeFile") {
return (WorldHTTPMimeFile);
}
if (var_name == "WorldHTTPEnabled") {
return (WorldHTTPEnabled ? "true" : "false");
}
if (var_name == "ChatHost") {
return (ChatHost);
}
if (var_name == "ChatPort") {
return (itoa(ChatPort));
}
if (var_name == "MailHost") {
return (MailHost);
}
if (var_name == "MailPort") {
return (itoa(MailPort));
}
if (var_name == "DatabaseHost") {
return (DatabaseHost);
}
if (var_name == "DatabaseUsername") {
return (DatabaseUsername);
}
if (var_name == "DatabasePassword") {
return (DatabasePassword);
}
if (var_name == "DatabaseDB") {
return (DatabaseDB);
}
if (var_name == "DatabasePort") {
return (itoa(DatabasePort));
}
if (var_name == "QSDatabaseHost") {
return (QSDatabaseHost);
}
if (var_name == "QSDatabaseUsername") {
return (QSDatabaseUsername);
}
if (var_name == "QSDatabasePassword") {
return (QSDatabasePassword);
}
if (var_name == "QSDatabaseDB") {
return (QSDatabaseDB);
}
if (var_name == "QSDatabasePort") {
return (itoa(QSDatabasePort));
}
if (var_name == "SpellsFile") {
return (SpellsFile);
}
if (var_name == "OpCodesFile") {
return (OpCodesFile);
}
if (var_name == "EQTimeFile") {
return (EQTimeFile);
}
if (var_name == "LogSettingsFile") {
return (LogSettingsFile);
}
if (var_name == "MapDir") {
return (MapDir);
}
if (var_name == "QuestDir") {
return (QuestDir);
}
if (var_name == "PluginDir") {
return (PluginDir);
}
if (var_name == "LogPrefix") {
return (LogPrefix);
}
if (var_name == "LogSuffix") {
return (LogSuffix);
}
if (var_name == "ZoneExe") {
return (ZoneExe);
}
if (var_name == "ZonePortLow") {
return (itoa(ZonePortLow));
}
if (var_name == "ZonePortHigh") {
return (itoa(ZonePortHigh));
}
if (var_name == "DefaultStatus") {
return (itoa(DefaultStatus));
}
// if(var_name == "DynamicCount")
// return(itoa(DynamicCount));
return("");
return ("");
}
void EQEmuConfig::Dump() const

View File

@ -1,4 +1,4 @@
/* EQEMu: Everquest Server Emulator
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
@ -28,200 +28,192 @@ struct LoginConfig {
uint16 LoginPort;
};
class EQEmuConfig : public XMLParser {
public:
virtual std::string GetByName(const std::string &var_name) const;
class EQEmuConfig : public XMLParser
{
public:
virtual std::string GetByName(const std::string &var_name) const;
// From <world/>
std::string ShortName;
std::string LongName;
std::string WorldAddress;
std::string LocalAddress;
std::string LoginHost;
std::string LoginAccount;
std::string LoginPassword;
uint16 LoginPort;
uint32 LoginCount;
LinkedList<LoginConfig*> loginlist;
bool Locked;
uint16 WorldTCPPort;
std::string WorldIP;
bool TelnetEnabled;
int32 MaxClients;
bool WorldHTTPEnabled;
uint16 WorldHTTPPort;
std::string WorldHTTPMimeFile;
std::string SharedKey;
// From <world/>
std::string ShortName;
std::string LongName;
std::string WorldAddress;
std::string LocalAddress;
std::string LoginHost;
std::string LoginAccount;
std::string LoginPassword;
uint16 LoginPort;
uint32 LoginCount;
LinkedList<LoginConfig*> loginlist;
bool Locked;
uint16 WorldTCPPort;
std::string WorldIP;
bool TelnetEnabled;
int32 MaxClients;
bool WorldHTTPEnabled;
uint16 WorldHTTPPort;
std::string WorldHTTPMimeFile;
std::string SharedKey;
// From <chatserver/>
std::string ChatHost;
uint16 ChatPort;
// From <chatserver/>
std::string ChatHost;
uint16 ChatPort;
// From <mailserver/>
std::string MailHost;
uint16 MailPort;
// From <mailserver/>
std::string MailHost;
uint16 MailPort;
// From <database/>
std::string DatabaseHost;
std::string DatabaseUsername;
std::string DatabasePassword;
std::string DatabaseDB;
uint16 DatabasePort;
// From <database/>
std::string DatabaseHost;
std::string DatabaseUsername;
std::string DatabasePassword;
std::string DatabaseDB;
uint16 DatabasePort;
// From <qsdatabase> // QueryServ
std::string QSDatabaseHost;
std::string QSDatabaseUsername;
std::string QSDatabasePassword;
std::string QSDatabaseDB;
uint16 QSDatabasePort;
// From <qsdatabase> // QueryServ
std::string QSDatabaseHost;
std::string QSDatabaseUsername;
std::string QSDatabasePassword;
std::string QSDatabaseDB;
uint16 QSDatabasePort;
// From <files/>
std::string SpellsFile;
std::string OpCodesFile;
std::string EQTimeFile;
std::string LogSettingsFile;
// From <files/>
std::string SpellsFile;
std::string OpCodesFile;
std::string EQTimeFile;
std::string LogSettingsFile;
// From <directories/>
std::string MapDir;
std::string QuestDir;
std::string PluginDir;
// From <directories/>
std::string MapDir;
std::string QuestDir;
std::string PluginDir;
// From <launcher/>
std::string LogPrefix;
std::string LogSuffix;
std::string ZoneExe;
uint32 RestartWait;
uint32 TerminateWait;
uint32 InitialBootWait;
uint32 ZoneBootInterval;
// From <launcher/>
std::string LogPrefix;
std::string LogSuffix;
std::string ZoneExe;
uint32 RestartWait;
uint32 TerminateWait;
uint32 InitialBootWait;
uint32 ZoneBootInterval;
// From <zones/>
uint16 ZonePortLow;
uint16 ZonePortHigh;
uint8 DefaultStatus;
// From <zones/>
uint16 ZonePortLow;
uint16 ZonePortHigh;
uint8 DefaultStatus;
// uint16 DynamicCount;
// map<string,uint16> StaticZones;
protected:
protected:
static EQEmuConfig *_config;
static EQEmuConfig *_config;
static std::string ConfigFile;
static std::string ConfigFile;
#define ELEMENT(name) \
void do_##name(TiXmlElement *ele);
#include "eqemu_config_elements.h"
#include "eqemu_config_elements.h"
EQEmuConfig() {
// import the needed handler prototypes
EQEmuConfig()
{
// import the needed handler prototypes
#define ELEMENT(name) \
Handlers[#name]=(ElementHandler)&EQEmuConfig::do_##name;
#include "eqemu_config_elements.h"
Handlers[#name]=(ElementHandler)&EQEmuConfig::do_##name;
#include "eqemu_config_elements.h"
// Set sane defaults
// Login server
LoginHost = "eqemulator.net";
LoginPort = 5998;
// World
Locked = false;
WorldTCPPort = 9000;
TelnetEnabled = false;
WorldHTTPEnabled = false;
WorldHTTPPort = 9080;
WorldHTTPMimeFile = "mime.types";
SharedKey = ""; //blank disables authentication
// Mail
ChatHost = "eqchat.eqemulator.net";
ChatPort = 7778;
// Mail
MailHost = "eqmail.eqemulator.net";
MailPort = 7779;
// Mysql
DatabaseHost = "localhost";
DatabasePort = 3306;
DatabaseUsername = "eq";
DatabasePassword = "eq";
DatabaseDB = "eq";
// QueryServ Database
QSDatabaseHost = "localhost";
QSDatabasePort = 3306;
QSDatabaseUsername = "eq";
QSDatabasePassword = "eq";
QSDatabaseDB = "eq";
// Files
SpellsFile = "spells_us.txt";
OpCodesFile = "opcodes.conf";
EQTimeFile = "eqtime.cfg";
LogSettingsFile = "log.ini";
// Dirs
MapDir = "Maps";
QuestDir = "quests";
PluginDir = "plugins";
// Launcher
LogPrefix = "logs/zone-";
LogSuffix = ".log";
RestartWait = 10000; //milliseconds
TerminateWait = 10000; //milliseconds
InitialBootWait = 20000; //milliseconds
ZoneBootInterval = 2000; //milliseconds
#ifdef WIN32
ZoneExe = "zone.exe";
#else
ZoneExe = "./zone";
#endif
// Zones
ZonePortLow = 7000;
ZonePortHigh = 7999;
DefaultStatus = 0;
// For where zones need to connect to.
WorldIP = "127.0.0.1";
// Dynamics to start
//DynamicCount=5;
MaxClients = -1;
LoginCount = 0;
}
virtual ~EQEmuConfig() {}
// Set sane defaults
public:
// Login server
LoginHost="eqemulator.net";
LoginPort=5998;
// Produce a const singleton
static const EQEmuConfig *get()
{
if (_config == nullptr) {
LoadConfig();
}
return (_config);
}
// World
Locked=false;
WorldTCPPort=9000;
TelnetEnabled=false;
WorldHTTPEnabled=false;
WorldHTTPPort=9080;
WorldHTTPMimeFile="mime.types";
SharedKey = ""; //blank disables authentication
// Allow the use to set the conf file to be used.
static void SetConfigFile(std::string file)
{
EQEmuConfig::ConfigFile = file;
}
// Mail
ChatHost="eqchat.eqemulator.net";
ChatPort=7778;
// Load the config
static bool LoadConfig()
{
if (_config != nullptr) {
delete _config;
}
_config = new EQEmuConfig;
return _config->ParseFile(EQEmuConfig::ConfigFile.c_str(), "server");
}
// Mail
MailHost="eqmail.eqemulator.net";
MailPort=7779;
// Mysql
DatabaseHost="localhost";
DatabasePort=3306;
DatabaseUsername="eq";
DatabasePassword="eq";
DatabaseDB="eq";
// QueryServ Database
QSDatabaseHost="localhost";
QSDatabasePort=3306;
QSDatabaseUsername="eq";
QSDatabasePassword="eq";
QSDatabaseDB="eq";
// Files
SpellsFile="spells_us.txt";
OpCodesFile="opcodes.conf";
EQTimeFile="eqtime.cfg";
LogSettingsFile="log.ini";
// Dirs
MapDir="Maps";
QuestDir="quests";
PluginDir="plugins";
// Launcher
LogPrefix = "logs/zone-";
LogSuffix = ".log";
RestartWait = 10000; //milliseconds
TerminateWait = 10000; //milliseconds
InitialBootWait = 20000; //milliseconds
ZoneBootInterval = 2000; //milliseconds
#ifdef WIN32
ZoneExe = "zone.exe";
#else
ZoneExe = "./zone";
#endif
// Zones
ZonePortLow=7000;
ZonePortHigh=7999;
DefaultStatus=0;
// For where zones need to connect to.
WorldIP="127.0.0.1";
// Dynamics to start
//DynamicCount=5;
MaxClients=-1;
LoginCount=0;
}
virtual ~EQEmuConfig() {}
public:
// Produce a const singleton
static const EQEmuConfig *get() {
if (_config == nullptr)
LoadConfig();
return(_config);
}
// Allow the use to set the conf file to be used.
static void SetConfigFile(std::string file) { EQEmuConfig::ConfigFile = file; }
// Load the config
static bool LoadConfig() {
if (_config != nullptr)
delete _config;
_config=new EQEmuConfig;
return _config->ParseFile(EQEmuConfig::ConfigFile.c_str(),"server");
}
void Dump() const;
void Dump() const;
};
#endif

View File

@ -1,4 +1,4 @@
/* EQEMu: Everquest Server Emulator
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
This program is free software; you can redistribute it and/or modify
@ -15,34 +15,35 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "debug.h"
#include "faction.h"
#include "races.h"
const char *FactionValueToString(FACTION_VALUE fv) {
switch(fv) {
case FACTION_ALLY:
return("Ally");
case FACTION_WARMLY:
return("Warmly");
case FACTION_KINDLY:
return("Kindly");
case FACTION_AMIABLE:
return("Amiable");
case FACTION_INDIFFERENT:
return("Indifferent");
case FACTION_APPREHENSIVE:
return("Apprehensive");
case FACTION_DUBIOUS:
return("Dubious");
case FACTION_THREATENLY:
return("Threatenly");
case FACTION_SCOWLS:
return("Scowls, ready to attack.");
default:
break;
const char *FactionValueToString(FACTION_VALUE fv)
{
switch (fv) {
case FACTION_ALLY:
return ("Ally");
case FACTION_WARMLY:
return ("Warmly");
case FACTION_KINDLY:
return ("Kindly");
case FACTION_AMIABLE:
return ("Amiable");
case FACTION_INDIFFERENT:
return ("Indifferent");
case FACTION_APPREHENSIVE:
return ("Apprehensive");
case FACTION_DUBIOUS:
return ("Dubious");
case FACTION_THREATENLY:
return ("Threatenly");
case FACTION_SCOWLS:
return ("Scowls, ready to attack.");
default:
break;
}
return("Unknown Faction Con");
return ("Unknown Faction Con");
}
@ -55,35 +56,56 @@ const char *FactionValueToString(FACTION_VALUE fv) {
FACTION_VALUE CalculateFaction(FactionMods* fm, int32 tmpCharacter_value)
{
int32 character_value = tmpCharacter_value;
if (fm)
if (fm) {
character_value += fm->base + fm->class_mod + fm->race_mod + fm->deity_mod;
if(character_value >= 1101) return FACTION_ALLY;
if(character_value >= 701 && character_value <= 1100) return FACTION_WARMLY;
if(character_value >= 401 && character_value <= 700) return FACTION_KINDLY;
if(character_value >= 101 && character_value <= 400) return FACTION_AMIABLE;
if(character_value >= 0 && character_value <= 100) return FACTION_INDIFFERENT;
if(character_value >= -100 && character_value <= -1) return FACTION_APPREHENSIVE;
if(character_value >= -700 && character_value <= -101) return FACTION_DUBIOUS;
if(character_value >= -999 && character_value <= -701) return FACTION_THREATENLY;
if(character_value <= -1000) return FACTION_SCOWLS;
}
if (character_value >= 1101) {
return FACTION_ALLY;
}
if (character_value >= 701 && character_value <= 1100) {
return FACTION_WARMLY;
}
if (character_value >= 401 && character_value <= 700) {
return FACTION_KINDLY;
}
if (character_value >= 101 && character_value <= 400) {
return FACTION_AMIABLE;
}
if (character_value >= 0 && character_value <= 100) {
return FACTION_INDIFFERENT;
}
if (character_value >= -100 && character_value <= -1) {
return FACTION_APPREHENSIVE;
}
if (character_value >= -700 && character_value <= -101) {
return FACTION_DUBIOUS;
}
if (character_value >= -999 && character_value <= -701) {
return FACTION_THREATENLY;
}
if (character_value <= -1000) {
return FACTION_SCOWLS;
}
return FACTION_INDIFFERENT;
}
// this function should check if some races have more than one race define
bool IsOfEqualRace(int r1, int r2)
{
if (r1 == r2)
if (r1 == r2) {
return true;
}
// TODO: add more values
switch(r1)
{
case DARK_ELF:
if (r2 == 77)
return true;
break;
case BARBARIAN:
if (r2 == 90)
return true;
switch (r1) {
case DARK_ELF:
if (r2 == 77) {
return true;
}
break;
case BARBARIAN:
if (r2 == 90) {
return true;
}
}
return false;
}
@ -91,50 +113,55 @@ bool IsOfEqualRace(int r1, int r2)
// trolls endure ogres, dark elves, ...
bool IsOfIndiffRace(int r1, int r2)
{
if (r1 == r2)
if (r1 == r2) {
return true;
}
// TODO: add more values
switch(r1)
{
case DARK_ELF:
case OGRE:
case TROLL:
if (r2 == OGRE || r2 == TROLL || r2 == DARK_ELF)
switch (r1) {
case DARK_ELF:
case OGRE:
case TROLL:
if (r2 == OGRE || r2 == TROLL || r2 == DARK_ELF) {
return true;
}
break;
case HUMAN:
case BARBARIAN:
case HALF_ELF:
case GNOME:
case HALFLING:
case WOOD_ELF:
if (r2 == HUMAN ||
r2 == BARBARIAN ||
r2 == ERUDITE ||
r2 == HALF_ELF ||
r2 == GNOME ||
r2 == HALFLING ||
r2 == DWARF ||
r2 == HIGH_ELF ||
r2 == WOOD_ELF) {
return true;
}
break;
case ERUDITE:
if (r2 == HUMAN || r2 == HALF_ELF) {
return true;
}
break;
case DWARF:
if (r2 == HALFLING || r2 == GNOME) {
return true;
}
break;
case HIGH_ELF:
if (r2 == WOOD_ELF) {
return true;
}
break;
case VAHSHIR:
return true;
break;
case HUMAN:
case BARBARIAN:
case HALF_ELF:
case GNOME:
case HALFLING:
case WOOD_ELF:
if (r2 == HUMAN ||
r2 == BARBARIAN ||
r2 == ERUDITE ||
r2 == HALF_ELF ||
r2 == GNOME ||
r2 == HALFLING ||
r2 == DWARF ||
r2 == HIGH_ELF ||
r2 == WOOD_ELF)
return true;
break;
case ERUDITE:
if (r2 == HUMAN || r2 == HALF_ELF)
return true;
break;
case DWARF:
if (r2 == HALFLING || r2 == GNOME)
return true;
break;
case HIGH_ELF:
if (r2 == WOOD_ELF)
return true;
break;
case VAHSHIR:
return true;
case IKSAR:
return false;
case IKSAR:
return false;
}
return false;
}

View File

@ -16,7 +16,6 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "debug.h"
#include "guild_base.h"
#include "database.h"
#include "logsys.h"

View File

@ -8,141 +8,148 @@
class Database;
class CharGuildInfo {
public:
//fields from `characer_`
uint32 char_id;
std::string char_name;
uint8 class_;
uint16 level;
uint32 time_last_on;
uint32 zone_id;
class CharGuildInfo
{
public:
//fields from `characer_`
uint32 char_id;
std::string char_name;
uint8 class_;
uint16 level;
uint32 time_last_on;
uint32 zone_id;
//fields from `guild_members`
uint32 guild_id;
uint8 rank;
bool tribute_enable;
uint32 total_tribute;
uint32 last_tribute; //timestamp
bool banker;
bool alt;
std::string public_note;
//fields from `guild_members`
uint32 guild_id;
uint8 rank;
bool tribute_enable;
uint32 total_tribute;
uint32 last_tribute; //timestamp
bool banker;
bool alt;
std::string public_note;
};
//this object holds guild functionality shared between world and zone.
class BaseGuildManager {
public:
BaseGuildManager();
virtual ~BaseGuildManager();
class BaseGuildManager
{
public:
BaseGuildManager();
virtual ~BaseGuildManager();
//this must be called before doing anything else with this object
void SetDatabase(Database *db) { m_db = db; }
//this must be called before doing anything else with this object
void SetDatabase(Database *db)
{
m_db = db;
}
bool LoadGuilds();
bool RefreshGuild(uint32 guild_id);
bool LoadGuilds();
bool RefreshGuild(uint32 guild_id);
//guild edit actions.
uint32 CreateGuild(const char* name, uint32 leader_char_id);
bool DeleteGuild(uint32 guild_id);
bool RenameGuild(uint32 guild_id, const char* name);
bool SetGuildMOTD(uint32 guild_id, const char* motd, const char *setter);
bool SetGuildURL(uint32 GuildID, const char* URL);
bool SetGuildChannel(uint32 GuildID, const char* Channel);
//guild edit actions.
uint32 CreateGuild(const char* name, uint32 leader_char_id);
bool DeleteGuild(uint32 guild_id);
bool RenameGuild(uint32 guild_id, const char* name);
bool SetGuildMOTD(uint32 guild_id, const char* motd, const char *setter);
bool SetGuildURL(uint32 GuildID, const char* URL);
bool SetGuildChannel(uint32 GuildID, const char* Channel);
//character edit actions
bool SetGuildLeader(uint32 guild_id, uint32 leader_char_id);
bool SetGuild(uint32 charid, uint32 guild_id, uint8 rank);
bool SetGuildRank(uint32 charid, uint8 rank);
bool SetBankerFlag(uint32 charid, bool is_banker);
bool ForceRankUpdate(uint32 charid);
bool GetAltFlag(uint32 CharID);
bool SetAltFlag(uint32 charid, bool is_alt);
bool GetBankerFlag(uint32 CharID);
bool SetTributeFlag(uint32 charid, bool enabled);
bool SetPublicNote(uint32 charid, const char *note);
//character edit actions
bool SetGuildLeader(uint32 guild_id, uint32 leader_char_id);
bool SetGuild(uint32 charid, uint32 guild_id, uint8 rank);
bool SetGuildRank(uint32 charid, uint8 rank);
bool SetBankerFlag(uint32 charid, bool is_banker);
bool ForceRankUpdate(uint32 charid);
bool GetAltFlag(uint32 CharID);
bool SetAltFlag(uint32 charid, bool is_alt);
bool GetBankerFlag(uint32 CharID);
bool SetTributeFlag(uint32 charid, bool enabled);
bool SetPublicNote(uint32 charid, const char *note);
//queries
bool GetCharInfo(const char *char_name, CharGuildInfo &into);
bool GetCharInfo(uint32 char_id, CharGuildInfo &into);
bool GetEntireGuild(uint32 guild_id, std::vector<CharGuildInfo *> &members); //caller is responsible for deleting each pointer in the resulting vector.
bool GuildExists(uint32 guild_id) const;
bool GetGuildMOTD(uint32 guild_id, char *motd_buffer, char *setter_buffer) const;
bool GetGuildURL(uint32 GuildID, char *URLBuffer) const;
bool GetGuildChannel(uint32 GuildID, char *ChannelBuffer) const;
const char *GetRankName(uint32 guild_id, uint8 rank) const;
const char *GetGuildName(uint32 guild_id) const;
bool GetGuildNameByID(uint32 guild_id, std::string &into) const;
uint32 GetGuildIDByName(const char *GuildName);
bool IsGuildLeader(uint32 guild_id, uint32 char_id) const;
uint8 GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 char_id) const;
bool CheckGMStatus(uint32 guild_id, uint8 status) const;
bool CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const;
//queries
bool GetCharInfo(const char *char_name, CharGuildInfo &into);
bool GetCharInfo(uint32 char_id, CharGuildInfo &into);
bool GetEntireGuild(uint32 guild_id, std::vector<CharGuildInfo *> &members); //caller is responsible for deleting each pointer in the resulting vector.
bool GuildExists(uint32 guild_id) const;
bool GetGuildMOTD(uint32 guild_id, char *motd_buffer, char *setter_buffer) const;
bool GetGuildURL(uint32 GuildID, char *URLBuffer) const;
bool GetGuildChannel(uint32 GuildID, char *ChannelBuffer) const;
const char *GetRankName(uint32 guild_id, uint8 rank) const;
const char *GetGuildName(uint32 guild_id) const;
bool GetGuildNameByID(uint32 guild_id, std::string &into) const;
uint32 GetGuildIDByName(const char *GuildName);
bool IsGuildLeader(uint32 guild_id, uint32 char_id) const;
uint8 GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 char_id) const;
bool CheckGMStatus(uint32 guild_id, uint8 status) const;
bool CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const;
// uint32 Getguild_id(uint32 eqid);
uint32 FindGuildByLeader(uint32 leader) const;
uint32 FindGuildByLeader(uint32 leader) const;
// void GetGuildMembers(uint32 guild_id,GuildMember_Struct* gms);
uint32 NumberInGuild(uint32 guild_id);
uint32 NumberInGuild(uint32 guild_id);
// bool GetGuildRanks(uint32 guildeqid, GuildRanks_Struct* gr);
// bool EditGuild(uint32 guild_id, uint8 ranknum, GuildRankLevel_Struct* grl);
uint8 *MakeGuildList(const char *head_name, uint32 &length) const; //make a guild list packet, returns ownership of the buffer.
uint8 *MakeGuildList(const char *head_name, uint32 &length) const; //make a guild list packet, returns ownership of the buffer.
static const char *const GuildActionNames[_MaxGuildAction];
uint32 DoesAccountContainAGuildLeader(uint32 AccountID);
static const char *const GuildActionNames[_MaxGuildAction];
uint32 DoesAccountContainAGuildLeader(uint32 AccountID);
protected:
//the methods which must be defined by base classes.
virtual void SendGuildRefresh(uint32 guild_id, bool name, bool motd, bool rank, bool relation) = 0;
virtual void SendCharRefresh(uint32 old_guild_id, uint32 guild_id, uint32 charid) = 0;
virtual void SendRankUpdate(uint32 CharID) = 0;
virtual void SendGuildDelete(uint32 guild_id) = 0;
protected:
//the methods which must be defined by base classes.
virtual void SendGuildRefresh(uint32 guild_id, bool name, bool motd, bool rank, bool relation) = 0;
virtual void SendCharRefresh(uint32 old_guild_id, uint32 guild_id, uint32 charid) = 0;
virtual void SendRankUpdate(uint32 CharID) = 0;
virtual void SendGuildDelete(uint32 guild_id) = 0;
uint32 DBCreateGuild(const char* name, uint32 leader_char_id);
bool DBDeleteGuild(uint32 guild_id);
bool DBRenameGuild(uint32 guild_id, const char* name);
bool DBSetGuildLeader(uint32 guild_id, uint32 leader_char_id);
bool DBSetGuildMOTD(uint32 guild_id, const char* motd, const char *setter);
bool DBSetGuildURL(uint32 GuildID, const char* URL);
bool DBSetGuildChannel(uint32 GuildID, const char* Channel);
bool DBSetGuild(uint32 charid, uint32 guild_id, uint8 rank);
bool DBSetGuildRank(uint32 charid, uint8 rank);
bool DBSetBankerFlag(uint32 charid, bool is_banker);
bool DBSetAltFlag(uint32 charid, bool is_alt);
bool DBSetTributeFlag(uint32 charid, bool enabled);
bool DBSetPublicNote(uint32 charid, const char *note);
bool QueryWithLogging(std::string query, const char *errmsg);
uint32 DBCreateGuild(const char* name, uint32 leader_char_id);
bool DBDeleteGuild(uint32 guild_id);
bool DBRenameGuild(uint32 guild_id, const char* name);
bool DBSetGuildLeader(uint32 guild_id, uint32 leader_char_id);
bool DBSetGuildMOTD(uint32 guild_id, const char* motd, const char *setter);
bool DBSetGuildURL(uint32 GuildID, const char* URL);
bool DBSetGuildChannel(uint32 GuildID, const char* Channel);
bool DBSetGuild(uint32 charid, uint32 guild_id, uint8 rank);
bool DBSetGuildRank(uint32 charid, uint8 rank);
bool DBSetBankerFlag(uint32 charid, bool is_banker);
bool DBSetAltFlag(uint32 charid, bool is_alt);
bool DBSetTributeFlag(uint32 charid, bool enabled);
bool DBSetPublicNote(uint32 charid, const char *note);
bool QueryWithLogging(std::string query, const char *errmsg);
// void DBSetPublicNote(uint32 guild_id,char* charname, char* note);
bool LocalDeleteGuild(uint32 guild_id);
bool LocalDeleteGuild(uint32 guild_id);
class RankInfo {
public:
RankInfo();
std::string name;
bool permissions[_MaxGuildAction];
};
class GuildInfo {
public:
GuildInfo();
std::string name;
std::string motd;
std::string motd_setter;
std::string url;
std::string channel;
class RankInfo
{
public:
RankInfo();
std::string name;
bool permissions[_MaxGuildAction];
};
class GuildInfo
{
public:
GuildInfo();
std::string name;
std::string motd;
std::string motd_setter;
std::string url;
std::string channel;
uint32 leader_char_id;
uint8 minstatus;
//tribute is not in here on purpose, since it is only valid in world!
RankInfo ranks[GUILD_MAX_RANK+1];
};
uint32 leader_char_id;
uint8 minstatus;
//tribute is not in here on purpose, since it is only valid in world!
RankInfo ranks[GUILD_MAX_RANK + 1];
};
std::map<uint32, GuildInfo *> m_guilds; //we own the pointers in this map
void ClearGuilds(); //clears internal structure
std::map<uint32, GuildInfo *> m_guilds; //we own the pointers in this map
void ClearGuilds(); //clears internal structure
Database *m_db; //we do not own this
Database *m_db; //we do not own this
bool _StoreGuildDB(uint32 guild_id);
GuildInfo *_CreateGuild(uint32 guild_id, const char *guild_name, uint32 account_id, uint8 minstatus, const char *guild_motd, const char *motd_setter, const char *Channel, const char *URL);
uint32 _GetFreeGuildID();
bool _StoreGuildDB(uint32 guild_id);
GuildInfo *_CreateGuild(uint32 guild_id, const char *guild_name, uint32 account_id, uint8 minstatus, const char *guild_motd, const char *motd_setter, const char *Channel, const char *URL);
uint32 _GetFreeGuildID();
};

View File

@ -15,6 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "../common/debug.h"
#include "misc_functions.h"
#include "guilds.h"

View File

@ -16,18 +16,16 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "debug.h"
#include "string_util.h"
#include "item.h"
#include "database.h"
#include "misc.h"
#include "races.h"
#include "shareddb.h"
#include "classes.h"
#include "debug.h"
#include "item.h"
#include "races.h"
#include "rulesys.h"
#include "shareddb.h"
#include "string_util.h"
#include <limits.h>
#include <sstream>
#include <iostream>
std::list<ItemInst*> dirty_inst;
@ -1125,10 +1123,12 @@ int16 Inventory::_PutItem(int16 slot_id, ItemInst* inst)
m_trade[slot_id] = inst;
result = slot_id;
}
else {
else
{
// Slot must be within a bag
ItemInst* baginst = GetItem(Inventory::CalcSlotId(slot_id)); // Get parent bag
if (baginst && baginst->IsType(ItemClassContainer)) {
if (baginst && baginst->IsType(ItemClassContainer))
{
baginst->_PutItem(Inventory::CalcBagIdx(slot_id), inst);
result = slot_id;
}
@ -1397,7 +1397,7 @@ ItemInst::ItemInst(const Item_Struct* item, int16 charges) {
m_item = item;
m_charges = charges;
m_price = 0;
m_instnodrop = false;
m_attuned = false;
m_merchantslot = 0;
if(m_item &&m_item->ItemClass == ItemClassCommon)
m_color = m_item->Color;
@ -1414,6 +1414,7 @@ ItemInst::ItemInst(const Item_Struct* item, int16 charges) {
m_scaling = false;
m_ornamenticon = 0;
m_ornamentidfile = 0;
m_ornament_hero_model = 0;
}
ItemInst::ItemInst(SharedDatabase *db, uint32 item_id, int16 charges) {
@ -1422,7 +1423,7 @@ ItemInst::ItemInst(SharedDatabase *db, uint32 item_id, int16 charges) {
m_charges = charges;
m_price = 0;
m_merchantslot = 0;
m_instnodrop=false;
m_attuned=false;
if(m_item && m_item->ItemClass == ItemClassCommon)
m_color = m_item->Color;
else
@ -1438,6 +1439,7 @@ ItemInst::ItemInst(SharedDatabase *db, uint32 item_id, int16 charges) {
m_scaling = false;
m_ornamenticon = 0;
m_ornamentidfile = 0;
m_ornament_hero_model = 0;
}
ItemInst::ItemInst(ItemInstTypes use_type) {
@ -1445,7 +1447,7 @@ ItemInst::ItemInst(ItemInstTypes use_type) {
m_item = nullptr;
m_charges = 0;
m_price = 0;
m_instnodrop = false;
m_attuned = false;
m_merchantslot = 0;
m_color = 0;
@ -1457,6 +1459,7 @@ ItemInst::ItemInst(ItemInstTypes use_type) {
m_scaling = false;
m_ornamenticon = 0;
m_ornamentidfile = 0;
m_ornament_hero_model = 0;
}
// Make a copy of an ItemInst object
@ -1469,7 +1472,7 @@ ItemInst::ItemInst(const ItemInst& copy)
m_color=copy.m_color;
m_merchantslot=copy.m_merchantslot;
m_currentslot=copy.m_currentslot;
m_instnodrop=copy.m_instnodrop;
m_attuned=copy.m_attuned;
m_merchantcount=copy.m_merchantcount;
// Copy container contents
iter_contents it;
@ -1509,6 +1512,7 @@ ItemInst::ItemInst(const ItemInst& copy)
m_scaling = copy.m_scaling;
m_ornamenticon = copy.m_ornamenticon;
m_ornamentidfile = copy.m_ornamentidfile;
m_ornament_hero_model = copy.m_ornament_hero_model;
}
// Clean up container contents
@ -1782,21 +1786,79 @@ ItemInst* ItemInst::GetAugment(uint8 slot) const
return nullptr;
}
ItemInst* ItemInst::GetOrnamentationAug(int ornamentationAugtype) const
ItemInst* ItemInst::GetOrnamentationAug(int32 ornamentationAugtype) const
{
for (int i = AUG_BEGIN; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
if (GetAugment(i) && m_item->AugSlotType[i] == ornamentationAugtype) {
const char *item_IDFile = GetAugment(i)->GetItem()->IDFile;
if (strncmp(item_IDFile, "IT64", strlen(item_IDFile)) == 0 || strncmp(item_IDFile, "IT63", strlen(item_IDFile)) == 0)
continue;
if (ornamentationAugtype > 0)
{
for (int i = AUG_BEGIN; i < EmuConstants::ITEM_COMMON_SIZE; i++)
{
if (GetAugment(i) && m_item->AugSlotType[i] == ornamentationAugtype)
{
const char *item_IDFile = GetAugment(i)->GetItem()->IDFile;
if (
(strncmp(item_IDFile, "IT64", strlen(item_IDFile)) == 0
|| strncmp(item_IDFile, "IT63", strlen(item_IDFile)) == 0)
&& GetAugment(i)->GetItem()->HerosForgeModel == 0
)
{
continue;
}
return this->GetAugment(i);
}
}
}
return nullptr;
}
uint32 ItemInst::GetOrnamentHeroModel(int32 material_slot) const {
uint32 HeroModel = 0;
if (m_ornament_hero_model > 0)
{
HeroModel = m_ornament_hero_model;
if (material_slot >= 0)
{
HeroModel = (m_ornament_hero_model * 100) + material_slot;
}
}
return HeroModel;
}
bool ItemInst::UpdateOrnamentationInfo() {
bool ornamentSet = false;
if (IsType(ItemClassCommon))
{
int32 ornamentationAugtype = RuleI(Character, OrnamentationAugmentType);
if (GetOrnamentationAug(ornamentationAugtype))
{
const Item_Struct* ornamentItem;
ornamentItem = GetOrnamentationAug(ornamentationAugtype)->GetItem();
if (ornamentItem != nullptr)
{
SetOrnamentIcon(ornamentItem->Icon);
SetOrnamentHeroModel(ornamentItem->HerosForgeModel);
if (strlen(ornamentItem->IDFile) > 2)
{
SetOrnamentationIDFile(atoi(&ornamentItem->IDFile[2]));
}
else
{
SetOrnamentationIDFile(0);
}
ornamentSet = true;
}
}
else
{
SetOrnamentIcon(0);
SetOrnamentHeroModel(0);
SetOrnamentationIDFile(0);
}
}
return ornamentSet;
}
bool ItemInst::CanTransform(const Item_Struct *ItemToTry, const Item_Struct *Container, bool AllowAll) {
if (!ItemToTry || !Container) return false;

View File

@ -23,21 +23,16 @@
#ifndef __ITEM_H
#define __ITEM_H
class ItemInst; // Item belonging to a client (contains info on item, dye, augments, charges, etc)
class ItemInstQueue; // Queue of ItemInst objects (i.e., cursor)
class Inventory; // Character inventory
class ItemParse; // Parses item packets
class EvolveInfo; // Stores information about an evolving item family
#include <string>
#include <vector>
#include <map>
#include <list>
#include "../common/eq_packet_structs.h"
#include "../common/eq_constants.h"
#include "../common/item_struct.h"
#include "../common/timer.h"
#include <list>
#include <map>
// Helper typedefs
typedef std::list<ItemInst*>::const_iterator iter_queue;
typedef std::map<int16, ItemInst*>::const_iterator iter_inst;
@ -294,7 +289,7 @@ public:
//
// Augements
//
inline bool IsAugmentable() const { return m_item->AugSlotType[0]!=0 || m_item->AugSlotType[1]!=0 || m_item->AugSlotType[2]!=0 || m_item->AugSlotType[3]!=0 || m_item->AugSlotType[4]!=0; }
inline bool IsAugmentable() const { return m_item->AugSlotType[0] != 0 || m_item->AugSlotType[1] != 0 || m_item->AugSlotType[2] != 0 || m_item->AugSlotType[3] != 0 || m_item->AugSlotType[4] != 0 || m_item->AugSlotType[5] != 0; }
bool AvailableWearSlot(uint32 aug_wear_slots) const;
int8 AvailableAugmentSlot(int32 augtype) const;
bool IsAugmentSlotAvailable(int32 augtype, uint8 slot) const;
@ -329,7 +324,8 @@ public:
void DeleteAugment(uint8 slot);
ItemInst* RemoveAugment(uint8 index);
bool IsAugmented();
ItemInst* GetOrnamentationAug(int ornamentationAugtype) const;
ItemInst* GetOrnamentationAug(int32 ornamentationAugtype) const;
bool UpdateOrnamentationInfo();
static bool CanTransform(const Item_Struct *ItemToTry, const Item_Struct *Container, bool AllowAll = false);
// Has attack/delay?
@ -361,8 +357,8 @@ public:
void SetCurrentSlot(int16 curr_slot) { m_currentslot = curr_slot; }
// Is this item already attuned?
bool IsInstNoDrop() const { return m_instnodrop; }
void SetInstNoDrop(bool flag) { m_instnodrop=flag; }
bool IsAttuned() const { return m_attuned; }
void SetAttuned(bool flag) { m_attuned=flag; }
std::string GetCustomDataString() const;
std::string GetCustomData(std::string identifier);
@ -393,10 +389,12 @@ public:
void SetActivated(bool activated) { m_activated = activated; }
int8 GetEvolveLvl() const { return m_evolveLvl; }
void SetScaling(bool v) { m_scaling = v; }
uint32 GetOrnamentationIcon() const { return m_ornamenticon; }
void SetOrnamentIcon(uint32 ornament_icon) { m_ornamenticon = ornament_icon; }
uint32 GetOrnamentationIDFile() const { return m_ornamentidfile; }
void SetOrnamentationIDFile(uint32 ornament_idfile) { m_ornamentidfile = ornament_idfile; }
uint32 GetOrnamentationIcon() const { return m_ornamenticon; }
void SetOrnamentIcon(uint32 ornament_icon) { m_ornamenticon = ornament_icon; }
uint32 GetOrnamentationIDFile() const { return m_ornamentidfile; }
void SetOrnamentationIDFile(uint32 ornament_idfile) { m_ornamentidfile = ornament_idfile; }
uint32 GetOrnamentHeroModel(int32 material_slot = -1) const;
void SetOrnamentHeroModel(uint32 ornament_hero_model) { m_ornament_hero_model = ornament_hero_model; }
void Initialize(SharedDatabase *db = nullptr);
void ScaleItem();
@ -432,7 +430,7 @@ protected:
uint32 m_color;
uint32 m_merchantslot;
int16 m_currentslot;
bool m_instnodrop;
bool m_attuned;
int32 m_merchantcount; //number avaliable on the merchant, -1=unlimited
int32 m_SerialNumber; // Unique identifier for this instance of an item. Needed for Bazaar.
uint32 m_exp;
@ -443,6 +441,7 @@ protected:
bool m_scaling;
uint32 m_ornamenticon;
uint32 m_ornamentidfile;
uint32 m_ornament_hero_model;
//
// Items inside of this item (augs or contents);

View File

@ -65,6 +65,7 @@ F(UNK054)
F(maxcharges)
F(itemtype)
F(material)
F(herosforgemodel)
F(sellrate)
F(UNK059)
F(casttime)
@ -100,6 +101,8 @@ F(augslot4type)
F(augslot4visible)
F(augslot5type)
F(augslot5visible)
F(augslot6type)
F(augslot6visible)
F(ldontheme)
F(ldonprice)
F(ldonsold)

View File

@ -143,7 +143,7 @@ struct Item_Struct {
uint8 Delay; // Delay * 10
uint8 RecLevel; // Recommended level to use item
uint8 RecSkill; // Recommended skill to use item (refers to primary skill of item)
uint8 ElemDmgType; // Elemental Damage Type (1=magic, 2=fire)
uint8 ElemDmgType; // Elemental Damage Type (1=magic, 2=fire)
uint8 ElemDmgAmt; // Elemental Damage
uint8 Range; // Range of item
uint32 Damage; // Delay between item usage (in 0.1 sec increments)
@ -154,6 +154,7 @@ struct Item_Struct {
int16 MaxCharges; // Maximum charges items can hold: -1 if not a chargeable item
uint8 ItemType; // Item Type/Skill (itemClass* from above)
uint8 Material; // Item material type
uint32 HerosForgeModel;// Hero's Forge Armor Model Type (2-13?)
float SellRate; // Sell rate
//uint32 Unk059;
union {
@ -182,9 +183,9 @@ struct Item_Struct {
int32 FactionAmt4; // Faction Amt 4
char CharmFile[32]; // ?
uint32 AugType;
uint8 AugSlotType[EmuConstants::ITEM_COMMON_SIZE]; // LDoN: Augment Slot 1-5 Type
uint8 AugSlotVisible[EmuConstants::ITEM_COMMON_SIZE]; // LDoN: Augment Slot 1-5 Visible
uint8 AugSlotUnk2[EmuConstants::ITEM_COMMON_SIZE]; // LDoN: Augment Slot 1-5 Unknown
uint8 AugSlotType[EmuConstants::ITEM_COMMON_SIZE]; // RoF: Augment Slot 1-6 Type
uint8 AugSlotVisible[EmuConstants::ITEM_COMMON_SIZE]; // RoF: Augment Slot 1-6 Visible
uint8 AugSlotUnk2[EmuConstants::ITEM_COMMON_SIZE]; // RoF: Augment Slot 1-6 Unknown
uint32 LDoNTheme;
uint32 LDoNPrice;
uint32 LDoNSold;

View File

@ -16,13 +16,14 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "logsys.h"
#include "debug.h"
#include "eq_packet.h"
#include "logsys.h"
#include "misc.h"
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include "misc.h"
#include "eq_packet.h"
#define LOG_CATEGORY(category) #category ,

View File

@ -9,13 +9,14 @@
#include <map>
#include <iostream>
#include <zlib.h>
#ifndef WIN32
#include <sys/time.h>
#endif
#include <time.h>
#include "misc.h"
#include "types.h"
#include <cstdlib>
#include <cstring>
#define ENC(c) (((c) & 0x3f) + ' ')

View File

@ -15,11 +15,13 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "../common/debug.h"
#include "misc_functions.h"
#include <string.h>
#include <time.h>
#include <math.h>
#ifndef WIN32
#include <netinet/in.h>
#include <sys/socket.h>

View File

@ -19,8 +19,6 @@
#define MISCFUNCTIONS_H
#include "types.h"
#include <stdio.h>
#include <ctype.h>
#include <string>
#include <time.h>
@ -92,8 +90,6 @@ int32 filesize(FILE* fp);
uint32 ResolveIP(const char* hostname, char* errbuf = 0);
bool ParseAddress(const char* iAddress, uint32* oIP, uint16* oPort, char* errbuf = 0);
void CoutTimestamp(bool ms = true);
int MakeRandomInt(int low, int high);
double MakeRandomFloat(double low, double high);
float EQ13toFloat(int d);
float NewEQ13toFloat(int d);
float EQ19toFloat(int d);

View File

@ -9,9 +9,6 @@
#include <mysql.h>
#include "types.h"
#include "mysql_request_row.h"
#include <string>
#include <string.h>
#include <limits.h>
class MySQLRequestResult {
private:

View File

@ -6,302 +6,302 @@ std::map<unsigned long, std::string> opcode_map;
std::string get_opcode_name(unsigned long opcode)
{
std::map<unsigned long, std::string>::iterator itr;;
return (itr=opcode_map.find(opcode))!=opcode_map.end() ? itr->second : "OP_Unknown";
std::map<unsigned long, std::string>::iterator itr;;
return (itr = opcode_map.find(opcode)) != opcode_map.end() ? itr->second : "OP_Unknown";
}
void load_opcode_names()
{
opcode_map[0x0176]="LiveOP_Heartbeat";
opcode_map[0x02d7]="LiveOP_ReloadUI";
opcode_map[0x01eb]="LiveOP_IncreaseStats";
opcode_map[0x0134]="LiveOP_ApproveZone";
opcode_map[0x01d5]="LiveOP_Dye";
opcode_map[0x0168]="LiveOP_Stamina";
opcode_map[0x014d]="LiveOP_ControlBoat";
opcode_map[0x003e]="LiveOP_MobUpdate";
opcode_map[0x0027]="LiveOP_ClientUpdate";
opcode_map[0x0024]="LiveOP_ChannelMessage";
opcode_map[0x01d7]="LiveOP_SimpleMessage";
opcode_map[0x01d8]="LiveOP_FormattedMessage";
opcode_map[0x01c6]="LiveOP_TGB";
opcode_map[0x0285]="LiveOP_TestBuff";
opcode_map[0x012d]="LiveOP_Bind_Wound";
opcode_map[0x01ab]="LiveOP_Charm";
opcode_map[0x014c]="LiveOP_Begging";
opcode_map[0x0152]="LiveOP_MoveCoin";
opcode_map[0x0292]="LiveOP_SpawnDoor";
opcode_map[0x009d]="LiveOP_Sneak";
opcode_map[0x0079]="LiveOP_ExpUpdate";
opcode_map[0x027d]="LiveOP_DumpName";
opcode_map[0x01ea]="LiveOP_RespondAA";
opcode_map[0x01c9]="LiveOP_SendAAStats";
opcode_map[0x0366]="LiveOP_SendAATable";
opcode_map[0x01e9]="LiveOP_AAAction";
opcode_map[0x00bb]="LiveOP_BoardBoat";
opcode_map[0x00bc]="LiveOP_LeaveBoat";
opcode_map[0x02b8]="LiveOP_AdventureInfoRequest";
opcode_map[0x02b9]="LiveOP_AdventureInfo";
opcode_map[0x02a6]="LiveOP_AdventureRequest";
opcode_map[0x02a8]="LiveOP_AdventureDetails";
opcode_map[0x02a9]="LiveOP_LDoNButton";
opcode_map[0x02ba]="LiveOP_AdventureData";
opcode_map[0x02c9]="LiveOP_AdventureFinish";
opcode_map[0x02c6]="LiveOP_LeaveAdventure";
opcode_map[0x02ce]="LiveOP_AdventureUpdate";
opcode_map[0x002b]="LiveOP_SendExpZonein";
opcode_map[0x01e4]="LiveOP_ZoneInSendName";
opcode_map[0x01bf]="LiveOP_GuildLeader";
opcode_map[0x009a]="LiveOP_GuildPeace";
opcode_map[0x0132]="LiveOP_GuildRemove";
opcode_map[0x0059]="LiveOP_GuildMemberList";
opcode_map[0x026e]="LiveOP_GuildMemberUpdate";
opcode_map[0x0130]="LiveOP_GuildInvite";
opcode_map[0x01c0]="LiveOP_GuildMOTD";
opcode_map[0x003c]="LiveOP_GuildPublicNote";
opcode_map[0x027e]="LiveOP_GetGuildMOTD";
opcode_map[0x0277]="LiveOP_GuildDemote";
opcode_map[0x0131]="LiveOP_GuildInviteAccept";
opcode_map[0x00a4]="LiveOP_GuildWar";
opcode_map[0x0133]="LiveOP_GuildDelete";
opcode_map[0x0233]="LiveOP_GuildManageRemove";
opcode_map[0x022d]="LiveOP_GuildManageAdd";
opcode_map[0x0039]="LiveOP_GuildManageStatus";
opcode_map[0x01e8]="LiveOP_Trader";
opcode_map[0x01e7]="LiveOP_Bazaar";
opcode_map[0x01c4]="LiveOP_BecomeTrader";
opcode_map[0x01f4]="LiveOP_BazaarInspect";
opcode_map[0x006e]="LiveOP_TraderItemUpdate";
opcode_map[0x017c]="LiveOP_TraderDelItem";
opcode_map[0x01eb]="LiveOP_TraderShop";
opcode_map[0x01ca]="LiveOP_TraderBuy";
opcode_map[0x01ac]="LiveOP_PetCommands";
opcode_map[0x0042]="LiveOP_TradeSkillCombine";
opcode_map[0x02e5]="LiveOP_AugmentItem";
opcode_map[0x0367]="LiveOP_ItemName";
opcode_map[0x02cd]="LiveOP_ShopItem";
opcode_map[0x0065]="LiveOP_ShopPlayerBuy";
opcode_map[0x006a]="LiveOP_ShopPlayerSell";
opcode_map[0x006d]="LiveOP_ShopDelItem";
opcode_map[0x0f6d]="LiveOP_ShopEndConfirm";
opcode_map[0x00f7]="LiveOP_ShopRequest";
opcode_map[0x006c]="LiveOP_ShopEnd";
opcode_map[0x02d1]="LiveOP_AdventureMerchantRequest";
opcode_map[0x02d2]="LiveOP_AdventureMerchantResponse";
opcode_map[0x02d3]="LiveOP_AdventureMerchantPurchase";
opcode_map[0x02e3]="LiveOP_AdventurePointsUpdate";
opcode_map[0x0270]="LiveOP_LFGCommand";
opcode_map[0x01d0]="LiveOP_LFGAppearance";
opcode_map[0x01b5]="LiveOP_MoneyUpdate";
opcode_map[0x0721]="LiveOP_GroupDelete";
opcode_map[0x0272]="LiveOP_GroupAcknowledge";
opcode_map[0x024a]="LiveOP_GroupUpdate";
opcode_map[0x025f]="LiveOP_GroupInvite";
opcode_map[0x00ff]="LiveOP_GroupDisband";
opcode_map[0x00d5]="LiveOP_GroupInvite2";
opcode_map[0x025e]="LiveOP_GroupFollow";
opcode_map[0x00d7]="LiveOP_GroupFollow2";
opcode_map[0x00d6]="LiveOP_GroupCancelInvite";
opcode_map[0x0156]="LiveOP_Split";
opcode_map[0x00d8]="LiveOP_Jump";
opcode_map[0x01d6]="LiveOP_ConsiderCorpse";
opcode_map[0x0064]="LiveOP_SkillUpdate";
opcode_map[0x0178]="LiveOP_GMEndTrainingResponse";
opcode_map[0x013c]="LiveOP_GMEndTraining";
opcode_map[0x0175]="LiveOP_GMTrainSkill";
opcode_map[0x013b]="LiveOP_GMTraining";
opcode_map[0x017b]="LiveOP_ConsumeAmmo";
opcode_map[0x0171]="LiveOP_CombatAbility";
opcode_map[0x009c]="LiveOP_TrackUnknown";
opcode_map[0x0234]="LiveOP_TrackTarget";
opcode_map[0x0286]="LiveOP_Track";
opcode_map[0x0297]="LiveOP_ReadBook";
opcode_map[0x001f]="LiveOP_ItemLinkClick";
opcode_map[0x01f4]="LiveOP_ItemLinkResponse";
opcode_map[0x01d9]="LiveOP_ItemLinkText";
opcode_map[0x0a41]="LiveOP_RezzRequest";
opcode_map[0x00e5]="LiveOP_RezzAnswer";
opcode_map[0x019b]="LiveOP_RezzComplete";
opcode_map[0x0128]="LiveOP_MoveDoor";
opcode_map[0x0127]="LiveOP_ClickDoor";
opcode_map[0x0247]="LiveOP_SendZonepoints";
opcode_map[0x008c]="LiveOP_SetRunMode";
opcode_map[0x0248]="LiveOP_InspectRequest";
opcode_map[0x0249]="LiveOP_InspectAnswer";
opcode_map[0x0187]="LiveOP_SenseTraps";
opcode_map[0x018e]="LiveOP_DisarmTraps";
opcode_map[0x01bc]="LiveOP_Assist";
opcode_map[0x0240]="LiveOP_PickPocket";
opcode_map[0x0119]="LiveOP_LootRequest";
opcode_map[0x011a]="LiveOP_EndLootRequest";
opcode_map[0x011b]="LiveOP_MoneyOnCorpse";
opcode_map[0x0179]="LiveOP_LootComplete";
opcode_map[0x013f]="LiveOP_LootItem";
opcode_map[0x0151]="LiveOP_MoveItem";
opcode_map[0x0056]="LiveOP_WhoAllRequest";
opcode_map[0x0229]="LiveOP_WhoAllResponse";
opcode_map[0x0167]="LiveOP_Consume";
opcode_map[0x0172]="LiveOP_AutoAttack";
opcode_map[0x0186]="LiveOP_AutoAttack2";
opcode_map[0x0173]="LiveOP_TargetMouse";
opcode_map[0x01ba]="LiveOP_TargetCommand";
opcode_map[0x01d8]="LiveOP_TargetReject";
opcode_map[0x009e]="LiveOP_Hide";
opcode_map[0x012e]="LiveOP_Forage";
opcode_map[0x0077]="LiveOP_Fishing";
opcode_map[0x0246]="LiveOP_Bug";
opcode_map[0x00f2]="LiveOP_Emote";
opcode_map[0x0140]="LiveOP_EmoteAnim";
opcode_map[0x015c]="LiveOP_Consider";
opcode_map[0x01cb]="LiveOP_FaceChange";
opcode_map[0x0197]="LiveOP_RandomReq";
opcode_map[0x0087]="LiveOP_RandomReply";
opcode_map[0x01c3]="LiveOP_Camp";
opcode_map[0x0192]="LiveOP_YellForHelp";
opcode_map[0x00ef]="LiveOP_SafePoint";
opcode_map[0x0157]="LiveOP_Buff";
opcode_map[0x00c0]="LiveOP_ColoredText";
opcode_map[0x0440]="LiveOP_MultiLineMsg";
opcode_map[0x021c]="LiveOP_SpecialMesg";
opcode_map[0x0013]="LiveOP_Consent";
opcode_map[0x029d]="LiveOP_ConsentResponse";
opcode_map[0x02d4]="LiveOP_Deny";
opcode_map[0x016c]="LiveOP_Stun";
opcode_map[0x0021]="LiveOP_BeginCast";
opcode_map[0x00be]="LiveOP_CastSpell";
opcode_map[0x01a8]="LiveOP_InterruptCast";
opcode_map[0x0105]="LiveOP_Death";
opcode_map[0x023f]="LiveOP_FeignDeath";
opcode_map[0x012b]="LiveOP_Illusion";
opcode_map[0x0078]="LiveOP_LevelUpdate";
opcode_map[0x0371]="LiveOP_LevelAppearance";
opcode_map[0x00c2]="LiveOP_MemorizeSpell";
opcode_map[0x0244]="LiveOP_HPUpdate";
opcode_map[0x022e]="LiveOP_SendHPTarget";
opcode_map[0x007d]="LiveOP_Mend";
opcode_map[0x0160]="LiveOP_Taunt";
opcode_map[0x0199]="LiveOP_GMDelCorpse";
opcode_map[0x0047]="LiveOP_GMFind";
opcode_map[0x0020]="LiveOP_GMServers";
opcode_map[0x010b]="LiveOP_GMGoto";
opcode_map[0x028c]="LiveOP_GMSummon";
opcode_map[0x010a]="LiveOP_GMKick";
opcode_map[0x0109]="LiveOP_GMKill";
opcode_map[0x0b40]="LiveOP_GMNameChange";
opcode_map[0x00a3]="LiveOP_GMLastName";
opcode_map[0x01b3]="LiveOP_GMToggle";
opcode_map[0x028f]="LiveOP_GMEmoteZone";
opcode_map[0x0074]="LiveOP_GMBecomeNPC";
opcode_map[0x00de]="LiveOP_GMHideMe";
opcode_map[0x0184]="LiveOP_GMZoneRequest";
opcode_map[0x0239]="LiveOP_GMZoneRequest2";
opcode_map[0x0068]="LiveOP_Petition";
opcode_map[0x0085]="LiveOP_PetitionRefresh";
opcode_map[0x01ee]="LiveOP_PDeletePetition";
opcode_map[0x0092]="LiveOP_PetitionBug";
opcode_map[0x0069]="LiveOP_PetitionUpdate";
opcode_map[0x0076]="LiveOP_PetitionCheckout";
opcode_map[0x0056]="LiveOP_PetitionCheckout2";
opcode_map[0x0091]="LiveOP_PetitionDelete";
opcode_map[0x02b4]="LiveOP_PetitionResolve";
opcode_map[0x007e]="LiveOP_PetitionCheckIn";
opcode_map[0x0090]="LiveOP_PetitionUnCheckout";
opcode_map[0x01ec]="LiveOP_PetitionQue";
opcode_map[0x01bb]="LiveOP_SetServerFilter";
opcode_map[0x0218]="LiveOP_NewSpawn";
opcode_map[0x0140]="LiveOP_Animation";
opcode_map[0x0142]="LiveOP_ZoneChange";
opcode_map[0x00f3]="LiveOP_DeleteSpawn";
opcode_map[0x0265]="LiveOP_CrashDump";
opcode_map[0x00e8]="LiveOP_EnvDamage";
opcode_map[0x0101]="LiveOP_Action";
opcode_map[0x00e2]="LiveOP_Damage";
opcode_map[0x00bf]="LiveOP_ManaChange";
opcode_map[0x027c]="LiveOP_ClientError";
opcode_map[0x00fb]="LiveOP_Save";
opcode_map[0x0316]="LiveOP_LocInfo";
opcode_map[0x0188]="LiveOP_Surname";
opcode_map[0x018f]="LiveOP_SwapSpell";
opcode_map[0x01db]="LiveOP_DeleteSpell";
opcode_map[0x029f]="LiveOP_CloseContainer";
opcode_map[0x029f]="LiveOP_ClickObjectAck";
opcode_map[0x00fa]="LiveOP_CreateObject";
opcode_map[0x00f9]="LiveOP_ClickObject";
opcode_map[0x01c1]="LiveOP_ClearObject";
opcode_map[0x0265]="LiveOP_ZoneUnavail";
opcode_map[0x02e0]="LiveOP_ItemPacket";
opcode_map[0x029a]="LiveOP_TradeRequest";
opcode_map[0x0037]="LiveOP_TradeRequestAck";
opcode_map[0x002d]="LiveOP_TradeAcceptClick";
opcode_map[0x0162]="LiveOP_TradeMoneyUpdate";
opcode_map[0x0036]="LiveOP_TradeCoins";
opcode_map[0x002e]="LiveOP_CancelTrade";
opcode_map[0x002f]="LiveOP_FinishTrade";
opcode_map[0x00a1]="LiveOP_SaveOnZoneReq";
opcode_map[0x0185]="LiveOP_Logout";
opcode_map[0x0298]="LiveOP_RequestDuel";
opcode_map[0x0a5d]="LiveOP_DuelResponse";
opcode_map[0x016e]="LiveOP_DuelResponse2";
opcode_map[0x007c]="LiveOP_InstillDoubt";
opcode_map[0x00ac]="LiveOP_SafeFallSuccess";
opcode_map[0x02fb]="LiveOP_DisciplineUpdate";
opcode_map[0x02f2]="LiveOP_TributeUpdate";
opcode_map[0x02f3]="LiveOP_TributeItem";
opcode_map[0x02f4]="LiveOP_TributePointUpdate";
opcode_map[0x02f5]="LiveOP_SendTributes";
opcode_map[0x02f6]="LiveOP_TributeInfo";
opcode_map[0x02f7]="LiveOP_SelectTribute";
opcode_map[0x02f8]="LiveOP_TributeTimer";
opcode_map[0x02f9]="LiveOP_StartTribute";
opcode_map[0x02fa]="LiveOP_TributeNPC";
opcode_map[0x02fe]="LiveOP_TributeMoney";
opcode_map[0x0364]="LiveOP_TributeToggle";
opcode_map[0x0322]="LiveOP_RecipesFavorite";
opcode_map[0x01f9]="LiveOP_RecipesSearch";
opcode_map[0x01fa]="LiveOP_RecipeReply";
opcode_map[0x01fb]="LiveOP_RecipeDetails";
opcode_map[0x01fc]="LiveOP_RecipeAutoCombine";
opcode_map[0x02db]="LiveOP_FindPersonRequest";
opcode_map[0x02dc]="LiveOP_FindPersonReply";
opcode_map[0x01dd]="LiveOP_Shielding";
opcode_map[0x0198]="LiveOP_SetDataRate";
opcode_map[0x023b]="LiveOP_ZoneEntry";
opcode_map[0x006b]="LiveOP_PlayerProfile";
opcode_map[0x0291]="LiveOP_CharInventory";
opcode_map[0x0170]="LiveOP_ZoneSpawns";
opcode_map[0x0026]="LiveOP_TimeOfDay";
opcode_map[0x015b]="LiveOP_Weather";
opcode_map[0x00ec]="LiveOP_ReqNewZone";
opcode_map[0x00eb]="LiveOP_NewZone";
opcode_map[0x00fd]="LiveOP_ReqClientSpawn";
opcode_map[0x012F]="LiveOP_SpawnAppearance";
opcode_map[0x0086]="LiveOP_ClientReady";
opcode_map[0x0086]="LiveOP_ZoneComplete";
opcode_map[0x02db]="LiveOP_LoginComplete";
opcode_map[0x0195]="LiveOP_ApproveWorld";
opcode_map[0x035f]="LiveOP_LogServer";
opcode_map[0x01b2]="LiveOP_MOTD";
opcode_map[0x0251]="LiveOP_SendLoginInfo";
opcode_map[0x00ea]="LiveOP_DeleteCharacter";
opcode_map[0x0102]="LiveOP_SendCharInfo";
opcode_map[0x00e1]="LiveOP_ExpansionInfo";
opcode_map[0x0104]="LiveOP_CharacterCreate";
opcode_map[0x02ab]="LiveOP_RandomNameGenerator";
opcode_map[0x005d]="LiveOP_GuildsList";
opcode_map[0x0125]="LiveOP_ApproveName";
opcode_map[0x0261]="LiveOP_EnterWorld";
opcode_map[0x015a]="LiveOP_World_Client_CRC1";
opcode_map[0x015e]="LiveOP_World_Client_CRC2";
opcode_map[0x0269]="LiveOP_SetChatServer";
opcode_map[0x0264]="LiveOP_ZoneServerInfo";
opcode_map[0x0017]="LiveOP_AckPacket";
opcode_map[0x012c]="LiveOP_WearChange";
opcode_map[0x1FA1]="LiveOP_WorldObjectsSent";
opcode_map[0x39C4]="LiveOP_BlockedBuffs";
opcode_map[0x4656]="LiveOP_SpawnPositionUpdate";
opcode_map[0x4b61]="LiveOP_ManaUpdate";
opcode_map[0x02d6]="LiveOP_EnduranceUpdate";
opcode_map[0x2ac1]="LiveOP_MobManaUpdate";
opcode_map[0x6c5f]="LiveOP_MobEnduranceUpdate";
opcode_map[0x73a8]="LiveOP_SendMaxCharacters";
opcode_map[0x0176] = "LiveOP_Heartbeat";
opcode_map[0x02d7] = "LiveOP_ReloadUI";
opcode_map[0x01eb] = "LiveOP_IncreaseStats";
opcode_map[0x0134] = "LiveOP_ApproveZone";
opcode_map[0x01d5] = "LiveOP_Dye";
opcode_map[0x0168] = "LiveOP_Stamina";
opcode_map[0x014d] = "LiveOP_ControlBoat";
opcode_map[0x003e] = "LiveOP_MobUpdate";
opcode_map[0x0027] = "LiveOP_ClientUpdate";
opcode_map[0x0024] = "LiveOP_ChannelMessage";
opcode_map[0x01d7] = "LiveOP_SimpleMessage";
opcode_map[0x01d8] = "LiveOP_FormattedMessage";
opcode_map[0x01c6] = "LiveOP_TGB";
opcode_map[0x0285] = "LiveOP_TestBuff";
opcode_map[0x012d] = "LiveOP_Bind_Wound";
opcode_map[0x01ab] = "LiveOP_Charm";
opcode_map[0x014c] = "LiveOP_Begging";
opcode_map[0x0152] = "LiveOP_MoveCoin";
opcode_map[0x0292] = "LiveOP_SpawnDoor";
opcode_map[0x009d] = "LiveOP_Sneak";
opcode_map[0x0079] = "LiveOP_ExpUpdate";
opcode_map[0x027d] = "LiveOP_DumpName";
opcode_map[0x01ea] = "LiveOP_RespondAA";
opcode_map[0x01c9] = "LiveOP_SendAAStats";
opcode_map[0x0366] = "LiveOP_SendAATable";
opcode_map[0x01e9] = "LiveOP_AAAction";
opcode_map[0x00bb] = "LiveOP_BoardBoat";
opcode_map[0x00bc] = "LiveOP_LeaveBoat";
opcode_map[0x02b8] = "LiveOP_AdventureInfoRequest";
opcode_map[0x02b9] = "LiveOP_AdventureInfo";
opcode_map[0x02a6] = "LiveOP_AdventureRequest";
opcode_map[0x02a8] = "LiveOP_AdventureDetails";
opcode_map[0x02a9] = "LiveOP_LDoNButton";
opcode_map[0x02ba] = "LiveOP_AdventureData";
opcode_map[0x02c9] = "LiveOP_AdventureFinish";
opcode_map[0x02c6] = "LiveOP_LeaveAdventure";
opcode_map[0x02ce] = "LiveOP_AdventureUpdate";
opcode_map[0x002b] = "LiveOP_SendExpZonein";
opcode_map[0x01e4] = "LiveOP_ZoneInSendName";
opcode_map[0x01bf] = "LiveOP_GuildLeader";
opcode_map[0x009a] = "LiveOP_GuildPeace";
opcode_map[0x0132] = "LiveOP_GuildRemove";
opcode_map[0x0059] = "LiveOP_GuildMemberList";
opcode_map[0x026e] = "LiveOP_GuildMemberUpdate";
opcode_map[0x0130] = "LiveOP_GuildInvite";
opcode_map[0x01c0] = "LiveOP_GuildMOTD";
opcode_map[0x003c] = "LiveOP_GuildPublicNote";
opcode_map[0x027e] = "LiveOP_GetGuildMOTD";
opcode_map[0x0277] = "LiveOP_GuildDemote";
opcode_map[0x0131] = "LiveOP_GuildInviteAccept";
opcode_map[0x00a4] = "LiveOP_GuildWar";
opcode_map[0x0133] = "LiveOP_GuildDelete";
opcode_map[0x0233] = "LiveOP_GuildManageRemove";
opcode_map[0x022d] = "LiveOP_GuildManageAdd";
opcode_map[0x0039] = "LiveOP_GuildManageStatus";
opcode_map[0x01e8] = "LiveOP_Trader";
opcode_map[0x01e7] = "LiveOP_Bazaar";
opcode_map[0x01c4] = "LiveOP_BecomeTrader";
opcode_map[0x01f4] = "LiveOP_BazaarInspect";
opcode_map[0x006e] = "LiveOP_TraderItemUpdate";
opcode_map[0x017c] = "LiveOP_TraderDelItem";
opcode_map[0x01eb] = "LiveOP_TraderShop";
opcode_map[0x01ca] = "LiveOP_TraderBuy";
opcode_map[0x01ac] = "LiveOP_PetCommands";
opcode_map[0x0042] = "LiveOP_TradeSkillCombine";
opcode_map[0x02e5] = "LiveOP_AugmentItem";
opcode_map[0x0367] = "LiveOP_ItemName";
opcode_map[0x02cd] = "LiveOP_ShopItem";
opcode_map[0x0065] = "LiveOP_ShopPlayerBuy";
opcode_map[0x006a] = "LiveOP_ShopPlayerSell";
opcode_map[0x006d] = "LiveOP_ShopDelItem";
opcode_map[0x0f6d] = "LiveOP_ShopEndConfirm";
opcode_map[0x00f7] = "LiveOP_ShopRequest";
opcode_map[0x006c] = "LiveOP_ShopEnd";
opcode_map[0x02d1] = "LiveOP_AdventureMerchantRequest";
opcode_map[0x02d2] = "LiveOP_AdventureMerchantResponse";
opcode_map[0x02d3] = "LiveOP_AdventureMerchantPurchase";
opcode_map[0x02e3] = "LiveOP_AdventurePointsUpdate";
opcode_map[0x0270] = "LiveOP_LFGCommand";
opcode_map[0x01d0] = "LiveOP_LFGAppearance";
opcode_map[0x01b5] = "LiveOP_MoneyUpdate";
opcode_map[0x0721] = "LiveOP_GroupDelete";
opcode_map[0x0272] = "LiveOP_GroupAcknowledge";
opcode_map[0x024a] = "LiveOP_GroupUpdate";
opcode_map[0x025f] = "LiveOP_GroupInvite";
opcode_map[0x00ff] = "LiveOP_GroupDisband";
opcode_map[0x00d5] = "LiveOP_GroupInvite2";
opcode_map[0x025e] = "LiveOP_GroupFollow";
opcode_map[0x00d7] = "LiveOP_GroupFollow2";
opcode_map[0x00d6] = "LiveOP_GroupCancelInvite";
opcode_map[0x0156] = "LiveOP_Split";
opcode_map[0x00d8] = "LiveOP_Jump";
opcode_map[0x01d6] = "LiveOP_ConsiderCorpse";
opcode_map[0x0064] = "LiveOP_SkillUpdate";
opcode_map[0x0178] = "LiveOP_GMEndTrainingResponse";
opcode_map[0x013c] = "LiveOP_GMEndTraining";
opcode_map[0x0175] = "LiveOP_GMTrainSkill";
opcode_map[0x013b] = "LiveOP_GMTraining";
opcode_map[0x017b] = "LiveOP_ConsumeAmmo";
opcode_map[0x0171] = "LiveOP_CombatAbility";
opcode_map[0x009c] = "LiveOP_TrackUnknown";
opcode_map[0x0234] = "LiveOP_TrackTarget";
opcode_map[0x0286] = "LiveOP_Track";
opcode_map[0x0297] = "LiveOP_ReadBook";
opcode_map[0x001f] = "LiveOP_ItemLinkClick";
opcode_map[0x01f4] = "LiveOP_ItemLinkResponse";
opcode_map[0x01d9] = "LiveOP_ItemLinkText";
opcode_map[0x0a41] = "LiveOP_RezzRequest";
opcode_map[0x00e5] = "LiveOP_RezzAnswer";
opcode_map[0x019b] = "LiveOP_RezzComplete";
opcode_map[0x0128] = "LiveOP_MoveDoor";
opcode_map[0x0127] = "LiveOP_ClickDoor";
opcode_map[0x0247] = "LiveOP_SendZonepoints";
opcode_map[0x008c] = "LiveOP_SetRunMode";
opcode_map[0x0248] = "LiveOP_InspectRequest";
opcode_map[0x0249] = "LiveOP_InspectAnswer";
opcode_map[0x0187] = "LiveOP_SenseTraps";
opcode_map[0x018e] = "LiveOP_DisarmTraps";
opcode_map[0x01bc] = "LiveOP_Assist";
opcode_map[0x0240] = "LiveOP_PickPocket";
opcode_map[0x0119] = "LiveOP_LootRequest";
opcode_map[0x011a] = "LiveOP_EndLootRequest";
opcode_map[0x011b] = "LiveOP_MoneyOnCorpse";
opcode_map[0x0179] = "LiveOP_LootComplete";
opcode_map[0x013f] = "LiveOP_LootItem";
opcode_map[0x0151] = "LiveOP_MoveItem";
opcode_map[0x0056] = "LiveOP_WhoAllRequest";
opcode_map[0x0229] = "LiveOP_WhoAllResponse";
opcode_map[0x0167] = "LiveOP_Consume";
opcode_map[0x0172] = "LiveOP_AutoAttack";
opcode_map[0x0186] = "LiveOP_AutoAttack2";
opcode_map[0x0173] = "LiveOP_TargetMouse";
opcode_map[0x01ba] = "LiveOP_TargetCommand";
opcode_map[0x01d8] = "LiveOP_TargetReject";
opcode_map[0x009e] = "LiveOP_Hide";
opcode_map[0x012e] = "LiveOP_Forage";
opcode_map[0x0077] = "LiveOP_Fishing";
opcode_map[0x0246] = "LiveOP_Bug";
opcode_map[0x00f2] = "LiveOP_Emote";
opcode_map[0x0140] = "LiveOP_EmoteAnim";
opcode_map[0x015c] = "LiveOP_Consider";
opcode_map[0x01cb] = "LiveOP_FaceChange";
opcode_map[0x0197] = "LiveOP_RandomReq";
opcode_map[0x0087] = "LiveOP_RandomReply";
opcode_map[0x01c3] = "LiveOP_Camp";
opcode_map[0x0192] = "LiveOP_YellForHelp";
opcode_map[0x00ef] = "LiveOP_SafePoint";
opcode_map[0x0157] = "LiveOP_Buff";
opcode_map[0x00c0] = "LiveOP_ColoredText";
opcode_map[0x0440] = "LiveOP_MultiLineMsg";
opcode_map[0x021c] = "LiveOP_SpecialMesg";
opcode_map[0x0013] = "LiveOP_Consent";
opcode_map[0x029d] = "LiveOP_ConsentResponse";
opcode_map[0x02d4] = "LiveOP_Deny";
opcode_map[0x016c] = "LiveOP_Stun";
opcode_map[0x0021] = "LiveOP_BeginCast";
opcode_map[0x00be] = "LiveOP_CastSpell";
opcode_map[0x01a8] = "LiveOP_InterruptCast";
opcode_map[0x0105] = "LiveOP_Death";
opcode_map[0x023f] = "LiveOP_FeignDeath";
opcode_map[0x012b] = "LiveOP_Illusion";
opcode_map[0x0078] = "LiveOP_LevelUpdate";
opcode_map[0x0371] = "LiveOP_LevelAppearance";
opcode_map[0x00c2] = "LiveOP_MemorizeSpell";
opcode_map[0x0244] = "LiveOP_HPUpdate";
opcode_map[0x022e] = "LiveOP_SendHPTarget";
opcode_map[0x007d] = "LiveOP_Mend";
opcode_map[0x0160] = "LiveOP_Taunt";
opcode_map[0x0199] = "LiveOP_GMDelCorpse";
opcode_map[0x0047] = "LiveOP_GMFind";
opcode_map[0x0020] = "LiveOP_GMServers";
opcode_map[0x010b] = "LiveOP_GMGoto";
opcode_map[0x028c] = "LiveOP_GMSummon";
opcode_map[0x010a] = "LiveOP_GMKick";
opcode_map[0x0109] = "LiveOP_GMKill";
opcode_map[0x0b40] = "LiveOP_GMNameChange";
opcode_map[0x00a3] = "LiveOP_GMLastName";
opcode_map[0x01b3] = "LiveOP_GMToggle";
opcode_map[0x028f] = "LiveOP_GMEmoteZone";
opcode_map[0x0074] = "LiveOP_GMBecomeNPC";
opcode_map[0x00de] = "LiveOP_GMHideMe";
opcode_map[0x0184] = "LiveOP_GMZoneRequest";
opcode_map[0x0239] = "LiveOP_GMZoneRequest2";
opcode_map[0x0068] = "LiveOP_Petition";
opcode_map[0x0085] = "LiveOP_PetitionRefresh";
opcode_map[0x01ee] = "LiveOP_PDeletePetition";
opcode_map[0x0092] = "LiveOP_PetitionBug";
opcode_map[0x0069] = "LiveOP_PetitionUpdate";
opcode_map[0x0076] = "LiveOP_PetitionCheckout";
opcode_map[0x0056] = "LiveOP_PetitionCheckout2";
opcode_map[0x0091] = "LiveOP_PetitionDelete";
opcode_map[0x02b4] = "LiveOP_PetitionResolve";
opcode_map[0x007e] = "LiveOP_PetitionCheckIn";
opcode_map[0x0090] = "LiveOP_PetitionUnCheckout";
opcode_map[0x01ec] = "LiveOP_PetitionQue";
opcode_map[0x01bb] = "LiveOP_SetServerFilter";
opcode_map[0x0218] = "LiveOP_NewSpawn";
opcode_map[0x0140] = "LiveOP_Animation";
opcode_map[0x0142] = "LiveOP_ZoneChange";
opcode_map[0x00f3] = "LiveOP_DeleteSpawn";
opcode_map[0x0265] = "LiveOP_CrashDump";
opcode_map[0x00e8] = "LiveOP_EnvDamage";
opcode_map[0x0101] = "LiveOP_Action";
opcode_map[0x00e2] = "LiveOP_Damage";
opcode_map[0x00bf] = "LiveOP_ManaChange";
opcode_map[0x027c] = "LiveOP_ClientError";
opcode_map[0x00fb] = "LiveOP_Save";
opcode_map[0x0316] = "LiveOP_LocInfo";
opcode_map[0x0188] = "LiveOP_Surname";
opcode_map[0x018f] = "LiveOP_SwapSpell";
opcode_map[0x01db] = "LiveOP_DeleteSpell";
opcode_map[0x029f] = "LiveOP_CloseContainer";
opcode_map[0x029f] = "LiveOP_ClickObjectAck";
opcode_map[0x00fa] = "LiveOP_CreateObject";
opcode_map[0x00f9] = "LiveOP_ClickObject";
opcode_map[0x01c1] = "LiveOP_ClearObject";
opcode_map[0x0265] = "LiveOP_ZoneUnavail";
opcode_map[0x02e0] = "LiveOP_ItemPacket";
opcode_map[0x029a] = "LiveOP_TradeRequest";
opcode_map[0x0037] = "LiveOP_TradeRequestAck";
opcode_map[0x002d] = "LiveOP_TradeAcceptClick";
opcode_map[0x0162] = "LiveOP_TradeMoneyUpdate";
opcode_map[0x0036] = "LiveOP_TradeCoins";
opcode_map[0x002e] = "LiveOP_CancelTrade";
opcode_map[0x002f] = "LiveOP_FinishTrade";
opcode_map[0x00a1] = "LiveOP_SaveOnZoneReq";
opcode_map[0x0185] = "LiveOP_Logout";
opcode_map[0x0298] = "LiveOP_RequestDuel";
opcode_map[0x0a5d] = "LiveOP_DuelResponse";
opcode_map[0x016e] = "LiveOP_DuelResponse2";
opcode_map[0x007c] = "LiveOP_InstillDoubt";
opcode_map[0x00ac] = "LiveOP_SafeFallSuccess";
opcode_map[0x02fb] = "LiveOP_DisciplineUpdate";
opcode_map[0x02f2] = "LiveOP_TributeUpdate";
opcode_map[0x02f3] = "LiveOP_TributeItem";
opcode_map[0x02f4] = "LiveOP_TributePointUpdate";
opcode_map[0x02f5] = "LiveOP_SendTributes";
opcode_map[0x02f6] = "LiveOP_TributeInfo";
opcode_map[0x02f7] = "LiveOP_SelectTribute";
opcode_map[0x02f8] = "LiveOP_TributeTimer";
opcode_map[0x02f9] = "LiveOP_StartTribute";
opcode_map[0x02fa] = "LiveOP_TributeNPC";
opcode_map[0x02fe] = "LiveOP_TributeMoney";
opcode_map[0x0364] = "LiveOP_TributeToggle";
opcode_map[0x0322] = "LiveOP_RecipesFavorite";
opcode_map[0x01f9] = "LiveOP_RecipesSearch";
opcode_map[0x01fa] = "LiveOP_RecipeReply";
opcode_map[0x01fb] = "LiveOP_RecipeDetails";
opcode_map[0x01fc] = "LiveOP_RecipeAutoCombine";
opcode_map[0x02db] = "LiveOP_FindPersonRequest";
opcode_map[0x02dc] = "LiveOP_FindPersonReply";
opcode_map[0x01dd] = "LiveOP_Shielding";
opcode_map[0x0198] = "LiveOP_SetDataRate";
opcode_map[0x023b] = "LiveOP_ZoneEntry";
opcode_map[0x006b] = "LiveOP_PlayerProfile";
opcode_map[0x0291] = "LiveOP_CharInventory";
opcode_map[0x0170] = "LiveOP_ZoneSpawns";
opcode_map[0x0026] = "LiveOP_TimeOfDay";
opcode_map[0x015b] = "LiveOP_Weather";
opcode_map[0x00ec] = "LiveOP_ReqNewZone";
opcode_map[0x00eb] = "LiveOP_NewZone";
opcode_map[0x00fd] = "LiveOP_ReqClientSpawn";
opcode_map[0x012F] = "LiveOP_SpawnAppearance";
opcode_map[0x0086] = "LiveOP_ClientReady";
opcode_map[0x0086] = "LiveOP_ZoneComplete";
opcode_map[0x02db] = "LiveOP_LoginComplete";
opcode_map[0x0195] = "LiveOP_ApproveWorld";
opcode_map[0x035f] = "LiveOP_LogServer";
opcode_map[0x01b2] = "LiveOP_MOTD";
opcode_map[0x0251] = "LiveOP_SendLoginInfo";
opcode_map[0x00ea] = "LiveOP_DeleteCharacter";
opcode_map[0x0102] = "LiveOP_SendCharInfo";
opcode_map[0x00e1] = "LiveOP_ExpansionInfo";
opcode_map[0x0104] = "LiveOP_CharacterCreate";
opcode_map[0x02ab] = "LiveOP_RandomNameGenerator";
opcode_map[0x005d] = "LiveOP_GuildsList";
opcode_map[0x0125] = "LiveOP_ApproveName";
opcode_map[0x0261] = "LiveOP_EnterWorld";
opcode_map[0x015a] = "LiveOP_World_Client_CRC1";
opcode_map[0x015e] = "LiveOP_World_Client_CRC2";
opcode_map[0x0269] = "LiveOP_SetChatServer";
opcode_map[0x0264] = "LiveOP_ZoneServerInfo";
opcode_map[0x0017] = "LiveOP_AckPacket";
opcode_map[0x012c] = "LiveOP_WearChange";
opcode_map[0x1FA1] = "LiveOP_WorldObjectsSent";
opcode_map[0x39C4] = "LiveOP_BlockedBuffs";
opcode_map[0x4656] = "LiveOP_SpawnPositionUpdate";
opcode_map[0x4b61] = "LiveOP_ManaUpdate";
opcode_map[0x02d6] = "LiveOP_EnduranceUpdate";
opcode_map[0x2ac1] = "LiveOP_MobManaUpdate";
opcode_map[0x6c5f] = "LiveOP_MobEnduranceUpdate";
opcode_map[0x73a8] = "LiveOP_SendMaxCharacters";
}

View File

@ -15,15 +15,13 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "debug.h"
#include <stdio.h>
#include "opcodemgr.h"
#include "debug.h"
#include "emu_opcodes.h"
#include <cstdlib>
#include <cstring>
#include "emu_opcodes.h"
#include "opcodemgr.h"
#include <cstring>
#include <map>
#include <stdio.h>
#include <string>
OpcodeManager::OpcodeManager() {

View File

@ -15,13 +15,12 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "../common/debug.h"
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include "packet_dump.h"
#include "eq_packet.h"
#include "../common/servertalk.h"
void DumpPacketAscii(const uchar* buf, uint32 size, uint32 cols, uint32 skip) {

View File

@ -15,16 +15,18 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <fstream>
#include <iostream>
#include <iomanip>
#include "../common/debug.h"
#include <fstream>
#include <iomanip>
#include <iostream>
#include <stdio.h>
//#ifdef _CRTDBG_MAP_ALLOC
// #undef new
// #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
//#endif
#include <time.h>
#include <string.h>
#ifdef _WINDOWS

File diff suppressed because it is too large Load Diff

View File

@ -1,37 +0,0 @@
#ifndef CLIENT62_H_
#define CLIENT62_H_
#include "../struct_strategy.h"
#include "../item.h"
class EQStreamIdentifier;
namespace Client62 {
//these are the only public member of this namespace.
extern void Register(EQStreamIdentifier &into);
extern void Reload();
//you should not directly access anything below..
//I just dont feel like making a seperate header for it.
class Strategy : public StructStrategy {
public:
Strategy();
protected:
virtual std::string Describe() const;
virtual const EQClientVersion ClientVersion() const;
//magic macro to declare our opcode processors
#include "ss_declare.h"
#include "client62_ops.h"
};
};
#endif /*CLIENT62_H_*/

View File

@ -1,212 +0,0 @@
/*
EQEMu: Everquest Server Emulator
Copyright (C) 2001-2014 EQEMu Development Team (http://eqemulator.net)
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.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
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
*/
#ifndef CLIENT62_CONSTANTS_H_
#define CLIENT62_CONSTANTS_H_
#include "../types.h"
namespace Client62 {
namespace maps {
typedef enum : int16 {
// this needs work to match actual client equivilents
MapPossessions = 0,
MapBank,
MapSharedBank,
MapTrade,
MapWorld,
MapLimbo,
MapTribute,
MapTrophyTribute,
MapGuildTribute,
MapMerchant,
MapDeleted,
MapCorpse,
MapBazaar,
MapInspect,
MapRealEstate,
MapViewMODPC,
MapViewMODBank,
MapViewMODSharedBank,
MapViewMODLimbo,
MapAltStorage,
MapArchived,
MapMail,
MapGuildTrophyTribute,
MapOther,
_MapCount
} InventoryMaps;
}
namespace slots {
typedef enum : int16 {
MainCharm = 0,
MainEar1,
MainHead,
MainFace,
MainEar2,
MainNeck,
MainShoulders,
MainArms,
MainBack,
MainWrist1,
MainWrist2,
MainRange,
MainHands,
MainPrimary,
MainSecondary,
MainFinger1,
MainFinger2,
MainChest,
MainLegs,
MainFeet,
MainWaist,
MainAmmo,
MainGeneral1,
MainGeneral2,
MainGeneral3,
MainGeneral4,
MainGeneral5,
MainGeneral6,
MainGeneral7,
MainGeneral8,
MainCursor,
_MainCount,
_MainEquipmentBegin = MainCharm,
_MainEquipmentEnd = MainAmmo,
_MainEquipmentCount = (_MainEquipmentEnd - _MainEquipmentBegin + 1),
_MainGeneralBegin = MainGeneral1,
_MainGeneralEnd = MainGeneral8,
_MainGeneralCount = (_MainGeneralEnd - _MainGeneralBegin + 1)
} EquipmentSlots;
}
namespace consts {
static const uint16 MAP_POSSESSIONS_SIZE = slots::_MainCount;
static const uint16 MAP_BANK_SIZE = 16;
static const uint16 MAP_SHARED_BANK_SIZE = 2;
static const uint16 MAP_TRADE_SIZE = 8;
static const uint16 MAP_WORLD_SIZE = 10;
static const uint16 MAP_LIMBO_SIZE = 36;
static const uint16 MAP_TRIBUTE_SIZE = 0; //?
static const uint16 MAP_TROPHY_TRIBUTE_SIZE = 0;
static const uint16 MAP_GUILD_TRIBUTE_SIZE = 0;
static const uint16 MAP_MERCHANT_SIZE = 0;
static const uint16 MAP_DELETED_SIZE = 0;
static const uint16 MAP_CORPSE_SIZE = slots::_MainCount;
static const uint16 MAP_BAZAAR_SIZE = 80;
static const uint16 MAP_INSPECT_SIZE = slots::_MainEquipmentCount;
static const uint16 MAP_REAL_ESTATE_SIZE = 0;
static const uint16 MAP_VIEW_MOD_PC_SIZE = MAP_POSSESSIONS_SIZE;
static const uint16 MAP_VIEW_MOD_BANK_SIZE = MAP_BANK_SIZE;
static const uint16 MAP_VIEW_MOD_SHARED_BANK_SIZE = MAP_SHARED_BANK_SIZE;
static const uint16 MAP_VIEW_MOD_LIMBO_SIZE = MAP_LIMBO_SIZE;
static const uint16 MAP_ALT_STORAGE_SIZE = 0;
static const uint16 MAP_ARCHIVED_SIZE = 0;
static const uint16 MAP_MAIL_SIZE = 0;
static const uint16 MAP_GUILD_TROPHY_TRIBUTE_SIZE = 0;
static const uint16 MAP_KRONO_SIZE = NOT_USED;
static const uint16 MAP_OTHER_SIZE = 0;
static const int16 EQUIPMENT_BEGIN = slots::MainCharm;
static const int16 EQUIPMENT_END = slots::MainAmmo;
static const uint16 EQUIPMENT_SIZE = slots::_MainEquipmentCount;
static const int16 GENERAL_BEGIN = slots::MainGeneral1;
static const int16 GENERAL_END = slots::MainGeneral8;
static const uint16 GENERAL_SIZE = slots::_MainGeneralCount;
static const int16 GENERAL_BAGS_BEGIN = 251;
static const int16 GENERAL_BAGS_END_OFFSET = 79;
static const int16 GENERAL_BAGS_END = GENERAL_BAGS_BEGIN + GENERAL_BAGS_END_OFFSET;
static const int16 CURSOR = slots::MainCursor;
static const int16 CURSOR_BAG_BEGIN = 331;
static const int16 CURSOR_BAG_END_OFFSET = 9;
static const int16 CURSOR_BAG_END = CURSOR_BAG_BEGIN + CURSOR_BAG_END_OFFSET;
static const int16 BANK_BEGIN = 2000;
static const int16 BANK_END = 2015;
static const int16 BANK_BAGS_BEGIN = 2031;
static const int16 BANK_BAGS_END_OFFSET = 159;
static const int16 BANK_BAGS_END = BANK_BAGS_BEGIN + BANK_BAGS_END_OFFSET;
static const int16 SHARED_BANK_BEGIN = 2500;
static const int16 SHARED_BANK_END = 2501;
static const int16 SHARED_BANK_BAGS_BEGIN = 2531;
static const int16 SHARED_BANK_BAGS_END_OFFSET = 19;
static const int16 SHARED_BANK_BAGS_END = SHARED_BANK_BAGS_BEGIN + SHARED_BANK_BAGS_END_OFFSET;
static const int16 TRADE_BEGIN = 3000;
static const int16 TRADE_END = 3007;
static const int16 TRADE_NPC_END = 3003;
static const int16 TRADE_BAGS_BEGIN = 3031;
static const int16 TRADE_BAGS_END_OFFSET = 79;
static const int16 TRADE_BAGS_END = TRADE_BAGS_BEGIN + TRADE_BAGS_END_OFFSET;
static const int16 WORLD_BEGIN = 4000;
static const int16 WORLD_END = 4009;
static const int16 TRIBUTE_BEGIN = 400;
static const int16 TRIBUTE_END = 404;
static const int16 CORPSE_BEGIN = slots::MainGeneral1;
static const int16 CORPSE_END = slots::MainGeneral1 + slots::MainCursor;
static const uint16 ITEM_COMMON_SIZE = 5;
static const uint16 ITEM_CONTAINER_SIZE = 10;
static const uint32 BANDOLIERS_COUNT = 4; // count = number of bandolier instances
static const uint32 BANDOLIER_SIZE = 4; // size = number of equipment slots in bandolier instance
static const uint32 POTION_BELT_SIZE = 4;
}
namespace limits {
static const bool ALLOWS_EMPTY_BAG_IN_BAG = false;
static const bool ALLOWS_CLICK_CAST_FROM_BAG = false;
static const bool COIN_HAS_WEIGHT = true;
}
}; //end namespace Client62
#endif /*CLIENT62_CONSTANTS_H_*/
/*
Client62 Notes:
** Integer-based inventory **
ok Possessions: 0 - 30 (Corpse: 22 - 52 [Offset 22])
ok [Equipment: 0 - 21]
ok [General: 22 - 29]
ok [Cursor: 30]
ok General Bags: 251 - 330
ok Cursor Bags: 331 - 340
ok Bank: 2000 - 2015
ok Bank Bags: 2031 - 2190
ok Shared Bank: 2500 - 2501
ok Shared Bank Bags: 2531 - 2550
Trade: 3000 - 3007
(Trade Bags: 3031 - 3110 -- server values)
World: 4000 - 4009
*/

View File

@ -1,166 +0,0 @@
/*
These fields must be in the order of how they are serialized!
*/
/* 000 */ //I(ItemClass) Leave this one off on purpose
/* 001 */ S(Name)
/* 002 */ S(Lore)
/* 003 */ S(IDFile)
/* 004 */ I(ID)
/* 005 */ I(Weight)
/* 006 */ I(NoRent)
/* 007 */ I(NoDrop)
/* 008 */ I(Size)
/* 009 */ I(Slots)
/* 010 */ I(Price)
/* 011 */ I(Icon)
/* 012 */ C("0")
/* 013 */ C("0")
/* 014 */ I(BenefitFlag)
/* 015 */ I(Tradeskills)
/* 016 */ I(CR)
/* 017 */ I(DR)
/* 018 */ I(PR)
/* 019 */ I(MR)
/* 020 */ I(FR)
/* 021 */ I(AStr)
/* 022 */ I(ASta)
/* 023 */ I(AAgi)
/* 024 */ I(ADex)
/* 025 */ I(ACha)
/* 026 */ I(AInt)
/* 027 */ I(AWis)
/* 028 */ I(HP)
/* 029 */ I(Mana)
/* 030 */ I(AC)
/* 031 */ I(Deity)
/* 032 */ C("0")
/* 033 */ I(SkillModValue)
/* 034 */ I(SkillModType)
/* 035 */ I(BaneDmgRace)
/* 036 */ I(BaneDmgAmt)
/* 037 */ I(BaneDmgBody)
/* 038 */ I(Magic)
/* 039 */ I(CastTime_)
/* 040 */ I(ReqLevel)
/* 041 */ I(BardType)
/* 042 */ I(BardValue)
/* 043 */ I(Light)
/* 044 */ I(Delay)
/* 045 */ I(RecLevel)
/* 046 */ I(RecSkill)
/* 047 */ I(ElemDmgType)
/* 048 */ I(ElemDmgAmt)
/* 049 */ I(Range)
/* 050 */ I(Damage)
/* 051 */ I(Color)
/* 052 */ I(Classes)
/* 053 */ I(Races)
/* 054 */ C("0")
/* 055 */ I(MaxCharges)
/* 056 */ I(ItemType)
/* 057 */ I(Material)
/* 058 */ F(SellRate)
/* 059 */ C("0")
/* 060 */ I(CastTime_)
/* 061 */ C("0")
/* 062 */ I(ProcRate)
/* 063 */ I(CombatEffects)
/* 064 */ I(Shielding)
/* 065 */ I(StunResist)
/* 066 */ I(StrikeThrough)
/* 067 */ I(ExtraDmgSkill)
/* 068 */ I(ExtraDmgAmt)
/* 069 */ I(SpellShield)
/* 070 */ I(Avoidance)
/* 071 */ I(Accuracy)
/* 072 */ I(CharmFileID)
/* 073 */ I(FactionMod1)
/* 074 */ I(FactionMod2)
/* 075 */ I(FactionMod3)
/* 076 */ I(FactionMod4)
/* 077 */ I(FactionAmt1)
/* 078 */ I(FactionAmt2)
/* 079 */ I(FactionAmt3)
/* 080 */ I(FactionAmt4)
/* 081 */ S(CharmFile)
/* 082 */ I(AugType)
/* 083 */ I(AugSlotType[0])
/* 084 */ I(AugSlotType[1])
/* 085 */ I(AugSlotType[2])
/* 086 */ I(AugSlotType[3])
/* 087 */ I(AugSlotType[4])
/* 088 */ I(LDoNTheme)
/* 089 */ I(LDoNPrice)
/* 090 */ I(LDoNSold)
/* 091 */ I(BagType)
/* 092 */ I(BagSlots)
/* 093 */ I(BagSize)
/* 094 */ I(BagWR)
/* 095 */ I(Book)
/* 096 */ I(BookType)
/* 097 */ S(Filename)
/* 098 */ I(BaneDmgRaceAmt)
/* 099 */ I(AugRestrict)
/* 100 */ I(LoreFlag)
/* 101 */ I(PendingLoreFlag)
/* 102 */ I(ArtifactFlag)
/* 103 */ I(SummonedFlag)
/* 104 */ I(Favor)
/* 105 */ I(FVNoDrop)
/* 106 */ I(Endur)
/* 107 */ I(DotShielding)
/* 108 */ I(Attack)
/* 109 */ I(Regen)
/* 110 */ I(ManaRegen)
/* 111 */ I(Haste)
/* 112 */ I(DamageShield)
/* 113 */ I(RecastDelay)
/* 114 */ I(RecastType)
/* 115 */ I(GuildFavor)
/* 116 */ I(AugDistiller)
/* 117 */ C("0")
/* 118 */ C("0")
/* 119 */ I(Attuneable)
/* 120 */ I(NoPet)
/* 121 */ C("0")
/* 122 */ I(PointType)
/* 123 */ I(PotionBelt)
/* 124 */ I(PotionBeltSlots)
/* 125 */ I(StackSize)
/* 126 */ I(Click.Effect)
/* 127 */ I(Click.Type)
/* 128 */ I(Click.Level2)
/* 129 */ I(Click.Level)
/* 130 */ C("0")
/* 131 */ I(Proc.Effect)
/* 132 */ I(Proc.Type)
/* 133 */ I(Proc.Level2)
/* 134 */ I(Proc.Level)
/* 135 */ C("0")
/* 136 */ I(Worn.Effect)
/* 137 */ I(Worn.Type)
/* 138 */ I(Worn.Level2)
/* 139 */ I(Worn.Level)
/* 140 */ C("0")
/* 141 */ I(Focus.Effect)
/* 142 */ I(Focus.Type)
/* 143 */ I(Focus.Level2)
/* 144 */ I(Focus.Level)
/* 145 */ C("0")
/* 146 */ I(Scroll.Effect)
/* 147 */ I(Scroll.Type)
/* 148 */ I(Scroll.Level2)
/* 149 */ I(Scroll.Level)
/* 150 */ C("0")
#undef I
#undef C
#undef S
#undef F

View File

@ -1,54 +0,0 @@
// out-going packets that require an ENCODE translation:
E(OP_Action)
E(OP_AdventureMerchantSell)
E(OP_ApplyPoison)
E(OP_BazaarSearch)
E(OP_BecomeTrader)
E(OP_CharInventory)
E(OP_DeleteCharge)
E(OP_DeleteItem)
E(OP_DeleteSpawn)
E(OP_GuildMemberLevelUpdate)
E(OP_GuildMemberList)
E(OP_Illusion)
E(OP_ItemLinkResponse)
E(OP_ItemPacket)
E(OP_LeadershipExpUpdate)
E(OP_LootItem)
E(OP_MoveItem)
E(OP_NewSpawn)
E(OP_OnLevelMessage)
E(OP_PetBuffWindow)
E(OP_PlayerProfile)
E(OP_ReadBook)
E(OP_RespondAA)
E(OP_SendAATable)
E(OP_SendCharInfo)
E(OP_ShopPlayerSell)
E(OP_Track)
E(OP_TributeItem)
E(OP_WearChange)
E(OP_ZoneEntry)
E(OP_ZoneServerReady)
E(OP_ZoneSpawns)
// incoming packets that require a DECODE translation:
D(OP_AdventureMerchantSell)
D(OP_ApplyPoison)
D(OP_AugmentItem)
D(OP_CastSpell)
D(OP_CharacterCreate)
D(OP_Consume)
D(OP_DeleteItem)
D(OP_FaceChange)
D(OP_ItemLinkClick)
D(OP_LootItem)
D(OP_MoveItem)
D(OP_ReadBook)
D(OP_SetServerFilter)
D(OP_ShopPlayerSell)
D(OP_TradeSkillCombine)
D(OP_TributeItem)
D(OP_WearChange)
D(OP_WhoAllRequest)
#undef E
#undef D

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,6 @@
#include "../debug.h"
#include "patches.h"
#include "client62.h"
#include "titanium.h"
#include "underfoot.h"
#include "sof.h"
@ -11,23 +10,19 @@
#include "rof2.h"
void RegisterAllPatches(EQStreamIdentifier &into) {
Client62::Register(into);
Titanium::Register(into);
SoF::Register(into);
SoD::Register(into);
Underfoot::Register(into);
RoF::Register(into);
// Uncomment the line below to enable RoF2 Client
//RoF2::Register(into);
RoF2::Register(into);
}
void ReloadAllPatches() {
Client62::Reload();
Titanium::Reload();
SoF::Reload();
SoD::Reload();
Underfoot::Reload();
RoF::Reload();
// Uncomment the line below to enable RoF2 Client
//RoF2::Reload();
RoF2::Reload();
}

View File

@ -205,7 +205,7 @@ namespace RoF
SETUP_DIRECT_ENCODE(AltCurrencySellItem_Struct, structs::AltCurrencySellItem_Struct);
OUT(merchant_entity_id);
eq->slot_id = ServerToRoFSlot(emu->slot_id);
eq->slot_id = ServerToRoFMainInvSlot(emu->slot_id);
OUT(charges);
OUT(cost);
@ -2045,15 +2045,6 @@ namespace RoF
outapp->WriteUInt32(emu->skills[r]);
}
// deprecated
// Write zeroes for the rest of the skills
/*
for(uint32 r = 0; r < structs::MAX_PP_SKILL - MAX_PP_SKILL; r++)
{
outapp->WriteUInt32(emu->skills[r]);
}
*/
outapp->WriteUInt32(25); // Unknown count
for (uint32 r = 0; r < 25; r++)
@ -2130,18 +2121,6 @@ namespace RoF
outapp->WriteUInt32(structs::BUFF_COUNT);
//*000*/ uint8 slotid; // badly named... seems to be 2 for a real buff, 0 otherwise
//*001*/ float unknown004; // Seen 1 for no buff
//*005*/ uint32 player_id; // 'global' ID of the caster, for wearoff messages
//*009*/ uint32 unknown016;
//*013*/ uint8 bard_modifier;
//*014*/ uint32 duration;
//*018*/ uint8 level;
//*019*/ uint32 spellid;
//*023*/ uint32 counters;
//*027*/ uint8 unknown0028[53];
//*080*/
for (uint32 r = 0; r < BUFF_COUNT; r++)
{
float instrument_mod = 0.0f;
@ -2874,12 +2853,12 @@ namespace RoF
eq2->face = emu->face[r];
int k;
for (k = 0; k < _MaterialCount; k++) {
eq2->equip[k].equip0 = emu->equip[r][k];
eq2->equip[k].equip1 = 0;
eq2->equip[k].equip2 = 0;
eq2->equip[k].itemid = 0;
eq2->equip[k].equip3 = emu->equip[r][k];
eq2->equip[k].color.color = emu->cs_colors[r][k].color;
eq2->equip[k].material = emu->equip[r][k].material;
eq2->equip[k].unknown1 = emu->equip[r][k].unknown1;
eq2->equip[k].elitematerial = emu->equip[r][k].elitematerial;
eq2->equip[k].heroforgemodel = emu->equip[r][k].heroforgemodel;
eq2->equip[k].material2 = emu->equip[r][k].material2;
eq2->equip[k].color.color = emu->equip[r][k].color.color;
}
eq2->u15 = 0xff;
eq2->u19 = 0xFF;
@ -3706,7 +3685,7 @@ namespace RoF
Bitfields->showhelm = emu->showhelm;
Bitfields->trader = 0;
Bitfields->targetable = 1;
Bitfields->targetable_with_hotkey = (emu->IsMercenary ? 0 : 1);
Bitfields->targetable_with_hotkey = emu->targetable_with_hotkey ? 1 : 0;
Bitfields->showname = ShowName;
// Not currently found
@ -3809,11 +3788,11 @@ namespace RoF
structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer;
for (k = 0; k < 9; k++) {
Equipment[k].equip0 = emu->equipment[k];
Equipment[k].equip1 = 0;
Equipment[k].equip2 = 0;
Equipment[k].equip3 = 0;
Equipment[k].itemId = 0;
Equipment[k].material = emu->equipment[k].material;
Equipment[k].unknown1 = emu->equipment[k].unknown1;
Equipment[k].elitematerial = emu->equipment[k].elitematerial;
Equipment[k].heroforgemodel = emu->equipment[k].heroforgemodel;
Equipment[k].material2 = emu->equipment[k].material2;
}
Buffer += (sizeof(structs::EquipStruct) * 9);
@ -3826,13 +3805,13 @@ namespace RoF
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary]);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary].material);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary]);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary].material);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
@ -3902,7 +3881,7 @@ namespace RoF
SETUP_DIRECT_DECODE(AltCurrencySellItem_Struct, structs::AltCurrencySellItem_Struct);
IN(merchant_entity_id);
emu->slot_id = RoFToServerSlot(eq->slot_id);
emu->slot_id = RoFToServerMainInvSlot(eq->slot_id);
IN(charges);
IN(cost);
@ -3915,7 +3894,7 @@ namespace RoF
SETUP_DIRECT_DECODE(AltCurrencySelectItem_Struct, structs::AltCurrencySelectItem_Struct);
IN(merchant_entity_id);
emu->slot_id = RoFToServerSlot(eq->slot_id);
emu->slot_id = RoFToServerMainInvSlot(eq->slot_id);
FINISH_DIRECT_DECODE();
}
@ -4406,7 +4385,7 @@ namespace RoF
IN(item_id);
int r;
for (r = 0; r < 5; r++) {
for (r = 0; r < EmuConstants::ITEM_COMMON_SIZE; r++) {
IN(augments[r]);
}
// Max Augs is now 6, but no code to support that many yet
@ -4847,7 +4826,6 @@ namespace RoF
hdr.main_slot = (merchant_slot == 0) ? slot_id.MainSlot : merchant_slot;
hdr.sub_slot = (merchant_slot == 0) ? slot_id.SubSlot : 0xffff;
hdr.unknown013 = (merchant_slot == 0) ? slot_id.AugSlot : 0xffff;
//hdr.unknown013 = 0xffff;
hdr.price = inst->GetPrice();
hdr.merchant_slot = (merchant_slot == 0) ? 1 : inst->GetMerchantCount();
//hdr.merchant_slot = (merchant_slot == 0) ? 1 : 0xffffffff;
@ -4856,7 +4834,7 @@ namespace RoF
hdr.unknown028 = 0;
hdr.last_cast_time = ((item->RecastDelay > 1) ? 1212693140 : 0);
hdr.charges = (stackable ? (item->MaxCharges ? 1 : 0) : charges);
hdr.inst_nodrop = inst->IsInstNoDrop() ? 1 : 0;
hdr.inst_nodrop = inst->IsAttuned() ? 1 : 0;
hdr.unknown044 = 0;
hdr.unknown048 = 0;
hdr.unknown052 = 0;
@ -4877,7 +4855,10 @@ namespace RoF
}
//ORNAMENT IDFILE / ICON
uint16 ornaIcon = 0;
if (inst->GetOrnamentationAug(ornamentationAugtype)) {
int32 heroModel = 0;
/*
if (inst->GetOrnamentationAug(ornamentationAugtype))
{
const Item_Struct *aug_weap = inst->GetOrnamentationAug(ornamentationAugtype)->GetItem();
//Mainhand
ss.write(aug_weap->IDFile, strlen(aug_weap->IDFile));
@ -4887,8 +4868,16 @@ namespace RoF
ss.write((const char*)&null_term, sizeof(uint8));
//Icon
ornaIcon = aug_weap->Icon;
if (aug_weap->HerosForgeModel > 0)
{
heroModel = (aug_weap->HerosForgeModel * 100) + Inventory::CalcMaterialFromSlot(slot_id_in);
}
}
else if (inst->GetOrnamentationIDFile() && inst->GetOrnamentationIcon()) {
else
*/
if (inst->GetOrnamentationIDFile() && inst->GetOrnamentationIcon())
{
char tmp[30]; memset(tmp, 0x0, 30); sprintf(tmp, "IT%d", inst->GetOrnamentationIDFile());
//Mainhand
ss.write(tmp, strlen(tmp));
@ -4897,10 +4886,12 @@ namespace RoF
ss.write(tmp, strlen(tmp));
ss.write((const char*)&null_term, sizeof(uint8));
ornaIcon = inst->GetOrnamentationIcon();
heroModel = inst->GetOrnamentHeroModel(Inventory::CalcMaterialFromSlot(slot_id_in));
}
else {
ss.write((const char*)&null_term, sizeof(uint8)); //no mh
ss.write((const char*)&null_term, sizeof(uint8));//no of
else
{
ss.write((const char*)&null_term, sizeof(uint8)); // no main hand Ornamentation
ss.write((const char*)&null_term, sizeof(uint8)); // no off hand Ornamentation
}
RoF::structs::ItemSerializationHeaderFinish hdrf;
@ -4908,12 +4899,13 @@ namespace RoF
hdrf.unknown061 = 0;
hdrf.unknown062 = 0;
hdrf.unknowna1 = 0xffffffff;
hdrf.unknowna2 = 0;
hdrf.ornamentHeroModel = heroModel;
hdrf.unknown063 = 0;
hdrf.unknowna3 = 0;
hdrf.unknowna4 = 0xffffffff;
hdrf.unknowna5 = 0;
hdrf.ItemClass = item->ItemClass;
ss.write((const char*)&hdrf, sizeof(RoF::structs::ItemSerializationHeaderFinish));
if (strlen(item->Name) > 0)
@ -5017,10 +5009,10 @@ namespace RoF
ibs.Prestige = 0;
ibs.ItemType = item->ItemType;
ibs.Material = item->Material;
ibs.unknown7 = 0;
ibs.MaterialUnknown1 = 0;
ibs.EliteMaterial = item->EliteMaterial;
ibs.unknown_RoF3 = 0;
ibs.unknown_RoF4 = 0;
ibs.HerosForgeModel = item->HerosForgeModel;
ibs.MaterialUnknown2 = 0;
ibs.SellRate = item->SellRate;
ibs.CombatEffects = item->CombatEffects;
ibs.Shielding = item->Shielding;
@ -5062,18 +5054,13 @@ namespace RoF
isbs.augdistiller = 65535;
isbs.augrestrict = item->AugRestrict;
for (int x = AUG_BEGIN; x < EmuConstants::ITEM_COMMON_SIZE; ++x)
for (int x = AUG_BEGIN; x < consts::ITEM_COMMON_SIZE; x++)
{
isbs.augslots[x].type = item->AugSlotType[x];
isbs.augslots[x].visible = item->AugSlotVisible[x];
isbs.augslots[x].unknown = item->AugSlotUnk2[x];
}
// Increased to 6 max aug slots
isbs.augslots[5].type = 0;
isbs.augslots[5].visible = 1;
isbs.augslots[5].unknown = 0;
isbs.ldonpoint_type = item->PointType;
isbs.ldontheme = item->LDoNTheme;
isbs.ldonprice = item->LDoNPrice;

View File

@ -205,7 +205,7 @@ namespace RoF2
SETUP_DIRECT_ENCODE(AltCurrencySellItem_Struct, structs::AltCurrencySellItem_Struct);
OUT(merchant_entity_id);
eq->slot_id = ServerToRoF2Slot(emu->slot_id);
eq->slot_id = ServerToRoF2MainInvSlot(emu->slot_id);
OUT(charges);
OUT(cost);
@ -1696,6 +1696,8 @@ namespace RoF2
eq->unknown932 = -1; // Set from PoK Example
eq->unknown936 = -1; // Set from PoK Example
eq->unknown944 = 1.0; // Set from PoK Example
eq->unknown948 = 0; // New on Live as of Dec 15 2014
eq->unknown952 = 100; // New on Live as of Dec 15 2014
FINISH_ENCODE();
}
@ -2045,15 +2047,6 @@ namespace RoF2
outapp->WriteUInt32(emu->skills[r]);
}
// deprecated
// Write zeroes for the rest of the skills
/*
for(uint32 r = 0; r < structs::MAX_PP_SKILL - MAX_PP_SKILL; r++)
{
outapp->WriteUInt32(emu->skills[r]);
}
*/
outapp->WriteUInt32(25); // Unknown count
for (uint32 r = 0; r < 25; r++)
@ -2130,18 +2123,6 @@ namespace RoF2
outapp->WriteUInt32(structs::BUFF_COUNT);
//*000*/ uint8 slotid; // badly named... seems to be 2 for a real buff, 0 otherwise
//*001*/ float unknown004; // Seen 1 for no buff
//*005*/ uint32 player_id; // 'global' ID of the caster, for wearoff messages
//*009*/ uint32 unknown016;
//*013*/ uint8 bard_modifier;
//*014*/ uint32 duration;
//*018*/ uint8 level;
//*019*/ uint32 spellid;
//*023*/ uint32 counters;
//*027*/ uint8 unknown0028[53];
//*080*/
for (uint32 r = 0; r < BUFF_COUNT; r++)
{
float instrument_mod = 0.0f;
@ -2181,7 +2162,6 @@ namespace RoF2
// 80 bytes of zeroes
for (uint32 j = 0; j < 20; ++j)
outapp->WriteUInt32(0);
}
outapp->WriteUInt32(emu->platinum);
@ -2206,8 +2186,8 @@ namespace RoF2
outapp->WriteUInt32(emu->aapoints_spent);
outapp->WriteUInt32(5); // AA Points count ??
outapp->WriteUInt32(1234); // AA Points assigned
outapp->WriteUInt32(5); // AA Window Tab Count
outapp->WriteUInt32(0); // AA Points assigned ?
outapp->WriteUInt32(0); // AA Points in General ?
outapp->WriteUInt32(0); // AA Points in Class ?
outapp->WriteUInt32(0); // AA Points in Archetype ?
@ -2334,15 +2314,16 @@ namespace RoF2
outapp->WriteUInt8(emu->pvp);
outapp->WriteUInt8(0); // Unknown
outapp->WriteUInt8(emu->gm);
outapp->WriteUInt32(emu->guild_id);
outapp->WriteUInt8(0); // Unknown - observed 1 in a live packet.
outapp->WriteUInt32(0); // Unknown - observed 1 in a live packet.
outapp->WriteUInt8(0); // Unknown - observed 1 in a live packet.
outapp->WriteUInt8(0); // Unknown
outapp->WriteUInt32(0); // Unknown
outapp->WriteUInt8(0); // Unknown
outapp->WriteUInt32(0); // Unknown
outapp->WriteUInt64(emu->exp);
outapp->WriteUInt8(0); // Unknown
outapp->WriteUInt64(emu->exp); // int32 in client
outapp->WriteUInt8(0); // Unknown - Seen 5 on Live
outapp->WriteUInt32(emu->platinum_bank);
outapp->WriteUInt32(emu->gold_bank);
@ -2354,17 +2335,11 @@ namespace RoF2
outapp->WriteUInt32(0); // Unknown
outapp->WriteUInt32(0); // Unknown
outapp->WriteUInt32(42); // The meaning of life ?
for (uint32 r = 0; r < 42; r++)
{
outapp->WriteUInt32(0); // Unknown
outapp->WriteUInt32(0); // Unknown
}
outapp->WriteUInt32(0); // Unknown
outapp->WriteUInt32(0); // Unknown
outapp->WriteSInt32(-1); // Unknown
outapp->WriteSInt32(-1); // Unknown
outapp->WriteUInt32(emu->career_tribute_points);
outapp->WriteUInt32(0); // Unknown
outapp->WriteUInt32(emu->tribute_points);
@ -2395,11 +2370,12 @@ namespace RoF2
outapp->WriteUInt32(0); // Unknown
outapp->WriteUInt32(0); // Unknown
outapp->WriteUInt32(0); // Unknown
// Block of 121 unknown bytes
for (uint32 r = 0; r < 121; r++)
for (uint32 r = 0; r < 125; r++)
{
outapp->WriteUInt8(0); // Unknown
}
outapp->WriteUInt32(0); // Unknown
outapp->WriteUInt32(0); // Unknown
outapp->WriteUInt32(emu->currentRadCrystals);
@ -2413,7 +2389,9 @@ namespace RoF2
// Unknown String ?
outapp->WriteUInt32(64); // Unknown
for (uint32 r = 0; r < 64; r++)
{
outapp->WriteUInt8(0); // Unknown
}
outapp->WriteUInt8(0); // Unknown
outapp->WriteUInt8(0); // Unknown
@ -2441,22 +2419,30 @@ namespace RoF2
// Unknown String ?
outapp->WriteUInt32(64); // Unknown
for (uint32 r = 0; r < 64; r++)
{
outapp->WriteUInt8(0); // Unknown
}
// Unknown String ?
outapp->WriteUInt32(64); // Unknown
for (uint32 r = 0; r < 64; r++)
{
outapp->WriteUInt8(0); // Unknown
}
outapp->WriteUInt32(0); // Unknown
// Block of 320 unknown bytes
for (uint32 r = 0; r < 320; r++)
{
outapp->WriteUInt8(0); // Unknown
}
// Block of 343 unknown bytes
for (uint32 r = 0; r < 343; r++)
{
outapp->WriteUInt8(0); // Unknown
}
outapp->WriteUInt32(0); // Unknown
@ -2481,10 +2467,14 @@ namespace RoF2
outapp->WriteUInt32(64); // Group of 64 int32s follow Group/Raid Leadership abilities ?
for (uint32 r = 0; r < MAX_LEADERSHIP_AA_ARRAY; r++)
{
outapp->WriteUInt32(emu->leader_abilities.ranks[r]);
}
for (uint32 r = 0; r < 64 - MAX_LEADERSHIP_AA_ARRAY; r++)
{
outapp->WriteUInt32(0); // Unused/unsupported Leadership abilities
}
outapp->WriteUInt32(emu->air_remaining); // ?
@ -2537,31 +2527,31 @@ namespace RoF2
outapp->WriteUInt32(0); // Unknown
outapp->WriteUInt32(0); // Unknown
outapp->WriteUInt32(0); // Unknown
outapp->WriteUInt32(0); // Krono - itemid 88888 Hard coded in client?
outapp->WriteUInt8(emu->groupAutoconsent);
outapp->WriteUInt8(emu->raidAutoconsent);
outapp->WriteUInt8(emu->guildAutoconsent);
outapp->WriteUInt8(0); // Unknown
outapp->WriteUInt32(emu->level); // Level3 ?
outapp->WriteUInt32(emu->level); // Level3 ?
outapp->WriteUInt8(emu->showhelm);
outapp->WriteUInt32(emu->RestTimer);
outapp->WriteUInt32(1024); // Unknown Count
// Block of 1024 unknown bytes
outapp->WriteUInt8(31); // Unknown
for (uint32 r = 0; r < 1023; r++)
for (uint32 r = 0; r < 1024; r++)
{
outapp->WriteUInt8(0); // Unknown
}
outapp->WriteUInt32(0); // Unknown
outapp->WriteUInt32(0); // Unknown
// Think we need 1 byte of padding at the end
outapp->WriteUInt8(0); // Unknown
_log(NET__STRUCTS, "Player Profile Packet is %i bytes", outapp->GetWritePosition());
@ -2874,12 +2864,12 @@ namespace RoF2
eq2->face = emu->face[r];
int k;
for (k = 0; k < _MaterialCount; k++) {
eq2->equip[k].equip0 = emu->equip[r][k];
eq2->equip[k].equip1 = 0;
eq2->equip[k].equip2 = 0;
eq2->equip[k].itemid = 0;
eq2->equip[k].equip3 = emu->equip[r][k];
eq2->equip[k].color.color = emu->cs_colors[r][k].color;
eq2->equip[k].material = emu->equip[r][k].material;
eq2->equip[k].unknown1 = emu->equip[r][k].unknown1;
eq2->equip[k].elitematerial = emu->equip[r][k].elitematerial;
eq2->equip[k].heroforgemodel = emu->equip[r][k].heroforgemodel;
eq2->equip[k].material2 = emu->equip[r][k].material2;
eq2->equip[k].color.color = emu->equip[r][k].color.color;
}
eq2->u15 = 0xff;
eq2->u19 = 0xFF;
@ -3706,7 +3696,7 @@ namespace RoF2
Bitfields->showhelm = emu->showhelm;
Bitfields->trader = 0;
Bitfields->targetable = 1;
Bitfields->targetable_with_hotkey = (emu->IsMercenary ? 0 : 1);
Bitfields->targetable_with_hotkey = emu->targetable_with_hotkey ? 1 : 0;
Bitfields->showname = ShowName;
// Not currently found
@ -3781,6 +3771,10 @@ namespace RoF2
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->light);
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->flymode);
//VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 100); // LiveUnknown1 12/06/14 (possibly mana percent?)
//VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 10); // LiveUnknown2 12/06/14
//VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // LiveUnknown3 12/06/14
VARSTRUCT_ENCODE_STRING(Buffer, emu->lastName);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // aatitle ??
@ -3809,11 +3803,11 @@ namespace RoF2
structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer;
for (k = 0; k < 9; k++) {
Equipment[k].equip0 = emu->equipment[k];
Equipment[k].equip1 = 0;
Equipment[k].equip2 = 0;
Equipment[k].equip3 = 0;
Equipment[k].itemId = 0;
Equipment[k].material = emu->equipment[k].material;
Equipment[k].unknown1 = emu->equipment[k].unknown1;
Equipment[k].elitematerial = emu->equipment[k].elitematerial;
Equipment[k].heroforgemodel = emu->equipment[k].heroforgemodel;
Equipment[k].material2 = emu->equipment[k].material2;
}
Buffer += (sizeof(structs::EquipStruct) * 9);
@ -3826,13 +3820,13 @@ namespace RoF2
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary]);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary].material);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary]);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary].material);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
@ -3883,6 +3877,7 @@ namespace RoF2
}
// DECODE methods
DECODE(OP_AdventureMerchantSell)
{
DECODE_LENGTH_EXACT(structs::Adventure_Sell_Struct);
@ -3902,7 +3897,7 @@ namespace RoF2
SETUP_DIRECT_DECODE(AltCurrencySellItem_Struct, structs::AltCurrencySellItem_Struct);
IN(merchant_entity_id);
emu->slot_id = RoF2ToServerSlot(eq->slot_id);
emu->slot_id = RoF2ToServerMainInvSlot(eq->slot_id);
IN(charges);
IN(cost);
@ -3915,7 +3910,7 @@ namespace RoF2
SETUP_DIRECT_DECODE(AltCurrencySelectItem_Struct, structs::AltCurrencySelectItem_Struct);
IN(merchant_entity_id);
emu->slot_id = RoF2ToServerSlot(eq->slot_id);
emu->slot_id = RoF2ToServerMainInvSlot(eq->slot_id);
FINISH_DIRECT_DECODE();
}
@ -4406,10 +4401,9 @@ namespace RoF2
IN(item_id);
int r;
for (r = 0; r < 5; r++) {
for (r = 0; r < EmuConstants::ITEM_COMMON_SIZE; r++) {
IN(augments[r]);
}
// Max Augs is now 6, but no code to support that many yet
IN(link_hash);
IN(icon);
@ -4847,7 +4841,6 @@ namespace RoF2
hdr.main_slot = (merchant_slot == 0) ? slot_id.MainSlot : merchant_slot;
hdr.sub_slot = (merchant_slot == 0) ? slot_id.SubSlot : 0xffff;
hdr.unknown013 = (merchant_slot == 0) ? slot_id.AugSlot : 0xffff;
//hdr.unknown013 = 0xffff;
hdr.price = inst->GetPrice();
hdr.merchant_slot = (merchant_slot == 0) ? 1 : inst->GetMerchantCount();
//hdr.merchant_slot = (merchant_slot == 0) ? 1 : 0xffffffff;
@ -4856,7 +4849,7 @@ namespace RoF2
hdr.unknown028 = 0;
hdr.last_cast_time = ((item->RecastDelay > 1) ? 1212693140 : 0);
hdr.charges = (stackable ? (item->MaxCharges ? 1 : 0) : charges);
hdr.inst_nodrop = inst->IsInstNoDrop() ? 1 : 0;
hdr.inst_nodrop = inst->IsAttuned() ? 1 : 0;
hdr.unknown044 = 0;
hdr.unknown048 = 0;
hdr.unknown052 = 0;
@ -4877,7 +4870,10 @@ namespace RoF2
}
//ORNAMENT IDFILE / ICON
uint16 ornaIcon = 0;
if (inst->GetOrnamentationAug(ornamentationAugtype)) {
int32 heroModel = 0;
/*
if (inst->GetOrnamentationAug(ornamentationAugtype))
{
const Item_Struct *aug_weap = inst->GetOrnamentationAug(ornamentationAugtype)->GetItem();
//Mainhand
ss.write(aug_weap->IDFile, strlen(aug_weap->IDFile));
@ -4887,8 +4883,16 @@ namespace RoF2
ss.write((const char*)&null_term, sizeof(uint8));
//Icon
ornaIcon = aug_weap->Icon;
if (aug_weap->HerosForgeModel > 0)
{
heroModel = (aug_weap->HerosForgeModel * 100) + Inventory::CalcMaterialFromSlot(slot_id_in);
}
}
else if (inst->GetOrnamentationIDFile() && inst->GetOrnamentationIcon()) {
else
*/
if (inst->GetOrnamentationIDFile() && inst->GetOrnamentationIcon())
{
char tmp[30]; memset(tmp, 0x0, 30); sprintf(tmp, "IT%d", inst->GetOrnamentationIDFile());
//Mainhand
ss.write(tmp, strlen(tmp));
@ -4897,10 +4901,12 @@ namespace RoF2
ss.write(tmp, strlen(tmp));
ss.write((const char*)&null_term, sizeof(uint8));
ornaIcon = inst->GetOrnamentationIcon();
heroModel = inst->GetOrnamentHeroModel(Inventory::CalcMaterialFromSlot(slot_id_in));
}
else {
ss.write((const char*)&null_term, sizeof(uint8)); //no mh
ss.write((const char*)&null_term, sizeof(uint8));//no of
else
{
ss.write((const char*)&null_term, sizeof(uint8)); // no main hand Ornamentation
ss.write((const char*)&null_term, sizeof(uint8)); // no off hand Ornamentation
}
RoF2::structs::ItemSerializationHeaderFinish hdrf;
@ -4908,14 +4914,15 @@ namespace RoF2
hdrf.unknown061 = 0;
hdrf.unknown062 = 0;
hdrf.unknowna1 = 0xffffffff;
hdrf.unknowna2 = 0;
hdrf.ornamentHeroModel = heroModel;
hdrf.unknown063 = 0;
hdrf.unknowna3 = 0;
hdrf.unknowna4 = 0xffffffff;
hdrf.unknowna5 = 0;
hdrf.ItemClass = item->ItemClass;
ss.write((const char*)&hdrf, sizeof(RoF2::structs::ItemSerializationHeaderFinish));
if (strlen(item->Name) > 0)
{
ss.write(item->Name, strlen(item->Name));
@ -5017,10 +5024,10 @@ namespace RoF2
ibs.Prestige = 0;
ibs.ItemType = item->ItemType;
ibs.Material = item->Material;
ibs.unknown7 = 0;
ibs.MaterialUnknown1 = 0;
ibs.EliteMaterial = item->EliteMaterial;
ibs.unknown_RoF23 = 0;
ibs.unknown_RoF24 = 0;
ibs.HerosForgeModel = item->HerosForgeModel;
ibs.MaterialUnknown2 = 0;
ibs.SellRate = item->SellRate;
ibs.CombatEffects = item->CombatEffects;
ibs.Shielding = item->Shielding;
@ -5062,18 +5069,13 @@ namespace RoF2
isbs.augdistiller = 65535;
isbs.augrestrict = item->AugRestrict;
for (int x = AUG_BEGIN; x < EmuConstants::ITEM_COMMON_SIZE; ++x)
for (int x = AUG_BEGIN; x < consts::ITEM_COMMON_SIZE; x++)
{
isbs.augslots[x].type = item->AugSlotType[x];
isbs.augslots[x].visible = item->AugSlotVisible[x];
isbs.augslots[x].unknown = item->AugSlotUnk2[x];
}
// Increased to 6 max aug slots
isbs.augslots[5].type = 0;
isbs.augslots[5].visible = 1;
isbs.augslots[5].unknown = 0;
isbs.ldonpoint_type = item->PointType;
isbs.ldontheme = item->LDoNTheme;
isbs.ldonprice = item->LDoNPrice;
@ -5309,13 +5311,8 @@ namespace RoF2
iqbs.SpellDmg = item->SpellDmg;
iqbs.clairvoyance = item->Clairvoyance;
iqbs.unknown28 = 0;
// Begin RoF2 Test
iqbs.unknown_TEST1 = 0;
// End RoF2 Test
iqbs.unknown30 = 0;
iqbs.unknown37a = 0;
iqbs.unknown39 = 1;
iqbs.subitem_count = 0;

View File

@ -332,6 +332,9 @@ These fields must be in the order of how they are serialized!
/* 091 */ I(AugSlotType[4])
/* 092 */ I(AugSlotVisible[4])
/* 092 */ I(AugSlotUnk2[4])
/* 091 */ I(AugSlotType[5])
/* 092 */ I(AugSlotVisible[5])
/* 092 */ I(AugSlotUnk2[5])
/* 093 */ I(PointType)
/* 093 */ I(LDoNTheme)
/* 094 */ I(LDoNPrice)

View File

@ -4,7 +4,6 @@
// incoming packets that require a DECODE translation:
// Begin RoF2 Decodes
// End RoF2 Encodes/Decodes
// These require Encodes/Decodes for RoF, so they do for RoF2 as well

View File

@ -160,13 +160,25 @@ struct Color_Struct
};
};
/*
* Visible equiptment.
* Size: 20 Octets
*/
struct EquipStruct {
/*00*/ uint32 material;
/*04*/ uint32 unknown1;
/*08*/ uint32 elitematerial;
/*12*/ uint32 heroforgemodel;
/*16*/ uint32 material2; // Same as material?
/*20*/
};
struct CharSelectEquip {
//totally guessed;
uint32 equip0;
uint32 equip1;
uint32 equip2;
uint32 itemid;
uint32 equip3;
uint32 material;
uint32 unknown1;
uint32 elitematerial;
uint32 heroforgemodel;
uint32 material2;
Color_Struct color;
};
@ -252,21 +264,6 @@ struct Membership_Struct
/*104*/
};
/*
* Visible equiptment.
* Size: 20 Octets
*/
struct EquipStruct {
/*00*/ uint32 equip0;
/*04*/ uint32 equip1;
/*08*/ uint32 equip2;
/*12*/ uint32 itemId;
/*16*/ uint32 equip3; // Same as equip0?
/*20*/
};
/*
** Generic Spawn Struct
** Length: 897 Octets
@ -523,72 +520,73 @@ struct ServerZoneEntry_Struct //Adjusted from SEQ Everquest.h Struct
//New Zone Struct - Size: 948
struct NewZone_Struct {
/*0000*/ char char_name[64]; // Character Name
/*0064*/ char zone_short_name[32]; // Zone Short Name
/*0096*/ char unknown0096[96];
/*0192*/ char zone_long_name[278]; // Zone Long Name
/*0470*/ uint8 ztype; // Zone type (usually FF)
/*0471*/ uint8 fog_red[4]; // Zone fog (red)
/*0475*/ uint8 fog_green[4]; // Zone fog (green)
/*0479*/ uint8 fog_blue[4]; // Zone fog (blue)
/*0483*/ uint8 unknown323;
/*0484*/ float fog_minclip[4];
/*0500*/ float fog_maxclip[4];
/*0516*/ float gravity;
/*0520*/ uint8 time_type;
/*0521*/ uint8 rain_chance[4];
/*0525*/ uint8 rain_duration[4];
/*0529*/ uint8 snow_chance[4];
/*0533*/ uint8 snow_duration[4];
/*0537*/ uint8 unknown537[33];
/*0570*/ uint8 sky; // Sky Type
/*0571*/ uint8 unknown571[13]; // ***Placeholder
/*0584*/ float zone_exp_multiplier; // Experience Multiplier
/*0588*/ float safe_y; // Zone Safe Y
/*0592*/ float safe_x; // Zone Safe X
/*0596*/ float safe_z; // Zone Safe Z
/*0600*/ float min_z; // Guessed - NEW - Seen 0
/*0604*/ float max_z; // Guessed
/*0608*/ float underworld; // Underworld, min z (Not Sure?)
/*0612*/ float minclip; // Minimum View Distance
/*0616*/ float maxclip; // Maximum View DIstance
/*0620*/ uint8 unknown620[84]; // ***Placeholder
/*0704*/ char zone_short_name2[96]; //zone file name? excludes instance number which can be in previous version.
/*0800*/ int32 unknown800; //seen -1
/*0804*/ char unknown804[40]; //
/*0844*/ int32 unknown844; //seen 600
/*0848*/ int32 unknown848;
/*0852*/ uint16 zone_id;
/*0854*/ uint16 zone_instance;
/*0856*/ char unknown856[20];
/*0876*/ uint32 SuspendBuffs;
/*0880*/ uint32 unknown880; // Seen 50
/*0884*/ uint32 unknown884; // Seen 10
/*0888*/ uint8 unknown888; // Seen 1
/*0889*/ uint8 unknown889; // Seen 0 (POK) or 1 (rujj)
/*0890*/ uint8 unknown890; // Seen 1
/*0891*/ uint8 unknown891; // Seen 0
/*0892*/ uint8 unknown892; // Seen 0
/*0893*/ uint8 unknown893; // Seen 0 - 00
/*0894*/ uint8 fall_damage; // 0 = Fall Damage on, 1 = Fall Damage off
/*0895*/ uint8 unknown895; // Seen 0 - 00
/*0896*/ uint32 unknown896; // Seen 180
/*0900*/ uint32 unknown900; // Seen 180
/*0904*/ uint32 unknown904; // Seen 180
/*0908*/ uint32 unknown908; // Seen 2
/*0912*/ uint32 unknown912; // Seen 2
/*0916*/ float FogDensity; // Most zones have this set to 0.33 Blightfire had 0.16
/*0920*/ uint32 unknown920; // Seen 0
/*0924*/ uint32 unknown924; // Seen 0
/*0928*/ uint32 unknown928; // Seen 0
/*0932*/ int32 unknown932; // Seen -1
/*0936*/ int32 unknown936; // Seen -1
/*0940*/ uint32 unknown940; // Seen 0
/*0944*/ float unknown944; // Seen 1.0
/*0948*/
/*0000*/ char char_name[64]; // Character Name
/*0064*/ char zone_short_name[32]; // Zone Short Name
/*0096*/ char unknown0096[96];
/*0192*/ char zone_long_name[278]; // Zone Long Name
/*0470*/ uint8 ztype; // Zone type (usually FF)
/*0471*/ uint8 fog_red[4]; // Zone fog (red)
/*0475*/ uint8 fog_green[4]; // Zone fog (green)
/*0479*/ uint8 fog_blue[4]; // Zone fog (blue)
/*0483*/ uint8 unknown323;
/*0484*/ float fog_minclip[4];
/*0500*/ float fog_maxclip[4];
/*0516*/ float gravity;
/*0520*/ uint8 time_type;
/*0521*/ uint8 rain_chance[4];
/*0525*/ uint8 rain_duration[4];
/*0529*/ uint8 snow_chance[4];
/*0533*/ uint8 snow_duration[4];
/*0537*/ uint8 unknown537[33];
/*0570*/ uint8 sky; // Sky Type
/*0571*/ uint8 unknown571[13]; // ***Placeholder
/*0584*/ float zone_exp_multiplier; // Experience Multiplier
/*0588*/ float safe_y; // Zone Safe Y
/*0592*/ float safe_x; // Zone Safe X
/*0596*/ float safe_z; // Zone Safe Z
/*0600*/ float min_z; // Guessed - NEW - Seen 0
/*0604*/ float max_z; // Guessed
/*0608*/ float underworld; // Underworld, min z (Not Sure?)
/*0612*/ float minclip; // Minimum View Distance
/*0616*/ float maxclip; // Maximum View DIstance
/*0620*/ uint8 unknown620[84]; // ***Placeholder
/*0704*/ char zone_short_name2[96]; //zone file name? excludes instance number which can be in previous version.
/*0800*/ int32 unknown800; //seen -1
/*0804*/ char unknown804[40]; //
/*0844*/ int32 unknown844; //seen 600
/*0848*/ int32 unknown848;
/*0852*/ uint16 zone_id;
/*0854*/ uint16 zone_instance;
/*0856*/ char unknown856[20];
/*0876*/ uint32 SuspendBuffs;
/*0880*/ uint32 unknown880; // Seen 50
/*0884*/ uint32 unknown884; // Seen 10
/*0888*/ uint8 unknown888; // Seen 1
/*0889*/ uint8 unknown889; // Seen 0 (POK) or 1 (rujj)
/*0890*/ uint8 unknown890; // Seen 1
/*0891*/ uint8 unknown891; // Seen 0
/*0892*/ uint8 unknown892; // Seen 0
/*0893*/ uint8 unknown893; // Seen 0 - 00
/*0894*/ uint8 fall_damage; // 0 = Fall Damage on, 1 = Fall Damage off
/*0895*/ uint8 unknown895; // Seen 0 - 00
/*0896*/ uint32 unknown896; // Seen 180
/*0900*/ uint32 unknown900; // Seen 180
/*0904*/ uint32 unknown904; // Seen 180
/*0908*/ uint32 unknown908; // Seen 2
/*0912*/ uint32 unknown912; // Seen 2
/*0916*/ float FogDensity; // Most zones have this set to 0.33 Blightfire had 0.16
/*0920*/ uint32 unknown920; // Seen 0
/*0924*/ uint32 unknown924; // Seen 0
/*0928*/ uint32 unknown928; // Seen 0
/*0932*/ int32 unknown932; // Seen -1
/*0936*/ int32 unknown936; // Seen -1
/*0940*/ uint32 unknown940; // Seen 0
/*0944*/ float unknown944; // Seen 1.0
/*0948*/ uint32 unknown948; // Seen 0 - New on Live as of Dec 15 2014
/*0952*/ uint32 unknown952; // Seen 100 - New on Live as of Dec 15 2014
/*0956*/
};
/*
** Memorize Spell Struct
** Length: 16 Bytes
@ -1018,38 +1016,38 @@ union
{
struct
{
/*00184*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
/*00204*/ EquipStruct equip_chest; // Equiptment: Chest visual
/*00224*/ EquipStruct equip_arms; // Equiptment: Arms visual
/*00244*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
/*00264*/ EquipStruct equip_hands; // Equiptment: Hands visual
/*00284*/ EquipStruct equip_legs; // Equiptment: Legs visual
/*00304*/ EquipStruct equip_feet; // Equiptment: Boots visual
/*00324*/ EquipStruct equip_primary; // Equiptment: Main visual
/*00344*/ EquipStruct equip_secondary; // Equiptment: Off visual
/*00184*/ EquipStruct equip_helmet; // Equipment: Helmet visual
/*00204*/ EquipStruct equip_chest; // Equipment: Chest visual
/*00224*/ EquipStruct equip_arms; // Equipment: Arms visual
/*00244*/ EquipStruct equip_bracers; // Equipment: Wrist visual
/*00264*/ EquipStruct equip_hands; // Equipment: Hands visual
/*00284*/ EquipStruct equip_legs; // Equipment: Legs visual
/*00304*/ EquipStruct equip_feet; // Equipment: Boots visual
/*00324*/ EquipStruct equip_primary; // Equipment: Main visual
/*00344*/ EquipStruct equip_secondary; // Equipment: Off visual
// Below slots are just guesses, but all 0s anyway...
/*00364*/ EquipStruct equip_charm; // Equiptment: Non-visual
/*00384*/ EquipStruct equip_ear1; // Equiptment: Non-visual
/*00404*/ EquipStruct equip_ear2; // Equiptment: Non-visual
/*00424*/ EquipStruct equip_face; // Equiptment: Non-visual
/*00444*/ EquipStruct equip_neck; // Equiptment: Non-visual
/*00464*/ EquipStruct equip_shoulder; // Equiptment: Non-visual
/*00484*/ EquipStruct equip_bracer2; // Equiptment: Non-visual
/*00504*/ EquipStruct equip_range; // Equiptment: Non-visual
/*00524*/ EquipStruct equip_ring1; // Equiptment: Non-visual
/*00544*/ EquipStruct equip_ring2; // Equiptment: Non-visual
/*00564*/ EquipStruct equip_waist; // Equiptment: Non-visual
/*00584*/ EquipStruct equip_powersource; // Equiptment: Non-visual
/*00604*/ EquipStruct equip_ammo; // Equiptment: Non-visual
/*00364*/ EquipStruct equip_charm; // Equipment: Non-visual
/*00384*/ EquipStruct equip_ear1; // Equipment: Non-visual
/*00404*/ EquipStruct equip_ear2; // Equipment: Non-visual
/*00424*/ EquipStruct equip_face; // Equipment: Non-visual
/*00444*/ EquipStruct equip_neck; // Equipment: Non-visual
/*00464*/ EquipStruct equip_shoulder; // Equipment: Non-visual
/*00484*/ EquipStruct equip_bracer2; // Equipment: Non-visual
/*00504*/ EquipStruct equip_range; // Equipment: Non-visual
/*00524*/ EquipStruct equip_ring1; // Equipment: Non-visual
/*00544*/ EquipStruct equip_ring2; // Equipment: Non-visual
/*00564*/ EquipStruct equip_waist; // Equipment: Non-visual
/*00584*/ EquipStruct equip_powersource;// Equipment: Non-visual
/*00604*/ EquipStruct equip_ammo; // Equipment: Non-visual
} equip;
/*00184*/ EquipStruct equipment[22];
/*00184*/ EquipStruct equipment[22]; // Total Slots
};
/*00624*/ uint32 equip2_count; // Seen 9
/*00628*/ EquipStruct equipment2[9]; // Appears to be Visible slots, but all 0s
/*00628*/ EquipStruct equipment2[_MaterialCount]; // Appears to be Visible slots, but all 0s
/*00808*/ uint32 tint_count; // Seen 9
/*00812*/ Color_Struct item_tint[9]; // RR GG BB 00
/*00812*/ Color_Struct item_tint[_MaterialCount]; // RR GG BB 00
/*00848*/ uint32 tint_count2; // Seen 9
/*00852*/ Color_Struct item_tint2[9]; // RR GG BB 00
/*00852*/ Color_Struct item_tint2[_MaterialCount]; // RR GG BB 00
/*00888*/ uint8 haircolor; // Player hair color
/*00889*/ uint8 beardcolor; // Player beard color
/*00890*/ uint32 unknown_rof5; //
@ -1205,7 +1203,7 @@ union
/*00000*/ uint8 unknown_rof52[82]; //
/*00000*/ uint32 unknown_rof53; // Seen 50
uint8 unknown_rof54[1325]; // Unknown Section
/*00000*/ uint8 unknown_rof54[1325]; // Unknown Section
// Bottom of Struct:
/*00000*/ uint8 groupAutoconsent; // 0=off, 1=on
@ -1601,23 +1599,24 @@ struct RespawnWindow_Struct {
*/
struct PlayerPositionUpdateServer_Struct
{
uint16 spawn_id;
uint16 spawnId2;
signed padding0004:12;
signed y_pos:19; // y coord
unsigned padding:1;
signed delta_z:13; // change in z
signed delta_x:13; // change in x
signed padding0008:6;
signed x_pos:19; // x coord
unsigned heading:12; // heading
signed padding0016:1;
signed delta_heading:10; // change in heading
signed z_pos:19; // z coord
signed padding0020:3;
signed animation:10; // animation
signed delta_y:13; // change in y
signed padding0024:9;
/*0000*/ uint16 spawn_id;
/*0002*/ uint16 spawnId2;
/*0004*/ signed padding0004 : 12;
signed y_pos : 19; // y coord
unsigned padding : 1;
/*0008*/ signed delta_z : 13; // change in z
signed delta_x : 13; // change in x
signed padding0008 : 6;
/*0012*/ signed x_pos : 19; // x coord
unsigned heading : 12; // heading
signed padding0016 : 1;
/*0016*/ signed delta_heading : 10; // change in heading
signed z_pos : 19; // z coord
signed padding0020 : 3;
/*0020*/ signed animation : 10; // animation
signed delta_y : 13; // change in y
signed padding0024 : 9;
/*0024*/
};
/*
@ -1628,21 +1627,22 @@ struct PlayerPositionUpdateServer_Struct
*/
struct PlayerPositionUpdateClient_Struct
{
uint16 sequence; // increments one each packet - Verified
uint16 spawn_id; // Player's spawn id
uint8 unknown0004[6]; // ***Placeholder
float delta_x; // Change in x
unsigned heading:12; // Directional heading
unsigned padding0040:20; // ***Placeholder
float x_pos; // x coord (2nd loc value)
float delta_z; // Change in z
float z_pos; // z coord (3rd loc value)
float y_pos; // y coord (1st loc value)
unsigned animation:10; // ***Placeholder
unsigned padding0024:22; // animation
float delta_y; // Change in y
signed delta_heading:10; // change in heading
unsigned padding0041:22; // ***Placeholder
/*0000*/ uint16 sequence; // increments one each packet - Verified
/*0002*/ uint16 spawn_id; // Player's spawn id
/*0004*/ uint8 unknown0004[6]; // ***Placeholder
/*0010*/ float delta_x; // Change in x
/*0014*/ unsigned heading : 12; // Directional heading
unsigned padding0040 : 20; // ***Placeholder
/*0018*/ float x_pos; // x coord (2nd loc value)
/*0022*/ float delta_z; // Change in z
/*0026*/ float z_pos; // z coord (3rd loc value)
/*0030*/ float y_pos; // y coord (1st loc value)
/*0034*/ unsigned animation : 10; // ***Placeholder
unsigned padding0024 : 22; // animation
/*0038*/ float delta_y; // Change in y
/*0042*/ signed delta_heading : 10; // change in heading
unsigned padding0041 : 22; // ***Placeholder
/*0046*/
};
/*
@ -2180,8 +2180,8 @@ struct AltCurrencyUpdate_Struct {
//When an item is selected while the alt currency merchant window is open
struct AltCurrencySelectItem_Struct {
/*000*/ uint32 merchant_entity_id;
/*004*/ MainInvItemSlotStruct slot_id;
/*004*/ //uint32 slot_id;
ItemSlotStruct slot_id;
/*008*/ uint32 unknown008;
/*012*/ uint32 unknown012;
/*016*/ uint32 unknown016;
@ -2238,10 +2238,10 @@ struct AltCurrencyReclaim_Struct {
struct AltCurrencySellItem_Struct {
/*000*/ uint32 merchant_entity_id;
/*004*/ MainInvItemSlotStruct slot_id;
/*004*/ //uint32 slot_id;
ItemSlotStruct slot_id;
/*008*/ uint32 charges;
/*012*/ uint32 cost;
/*016*/ uint32 charges;
/*020*/ uint32 cost;
};
struct Adventure_Purchase_Struct {
@ -2261,14 +2261,14 @@ struct Adventure_Sell_Struct {
};
struct AdventurePoints_Update_Struct {
/*000*/ uint32 ldon_available_points; // Total available points
/*004*/ uint8 unkown_apu004[20];
/*024*/ uint32 ldon_guk_points; // Earned Deepest Guk points
/*028*/ uint32 ldon_mirugal_points; // Earned Mirugal' Mebagerie points
/*032*/ uint32 ldon_mistmoore_points; // Earned Mismoore Catacombs Points
/*036*/ uint32 ldon_rujarkian_points; // Earned Rujarkian Hills points
/*040*/ uint32 ldon_takish_points; // Earned Takish points
/*044*/ uint8 unknown_apu042[216];
/*000*/ uint32 ldon_available_points; // Total available points
/*004*/ uint8 unkown_apu004[20];
/*024*/ uint32 ldon_guk_points; // Earned Deepest Guk points
/*028*/ uint32 ldon_mirugal_points; // Earned Mirugal' Mebagerie points
/*032*/ uint32 ldon_mistmoore_points; // Earned Mismoore Catacombs Points
/*036*/ uint32 ldon_rujarkian_points; // Earned Rujarkian Hills points
/*040*/ uint32 ldon_takish_points; // Earned Takish points
/*044*/ uint8 unknown_apu042[216];
};
@ -2833,8 +2833,8 @@ struct Door_Struct
/*0085*/ uint8 unknown0085; // seen 1 or 0 or rarely 2C or 90 or ED or 2D or A1
/*0086*/ uint8 unknown0086; // seen 0 or rarely FF or FE or 10 or 5A or 82
/*0087*/ uint8 unknown0087; // seen 0 or rarely 02 or 7C
/*0088*/ uint8 unknown0088[8]; // mostly 0s, the last 3 bytes are something tho
/*0096*/
/*0088*/ uint8 unknown0088[12]; // mostly 0s, the last 3 bytes are something tho
/*0100*/
};
struct DoorSpawns_Struct {
@ -4428,14 +4428,14 @@ struct EvolvingItem {
struct ItemSerializationHeaderFinish
{
uint16 ornamentIcon;
/*079*/ uint16 ornamentIcon;
/*081*/ uint8 unknown061; // 0 - Add Evolving Item struct if this isn't set to 0?
/*082*/ uint8 unknown062; // 0
/*083*/ uint32 unknowna1; // 0xffffffff
/*087*/ uint32 unknowna2; // 0
/*083*/ int32 unknowna1; // 0xffffffff
/*087*/ uint32 ornamentHeroModel; // 0
/*091*/ uint8 unknown063; // 0
/*092*/ uint32 unknowna3; // 0
/*096*/ uint32 unknowna4; // 0xffffffff
/*096*/ int32 unknowna4; // 0xffffffff
/*100*/ uint32 unknowna5; // 0
/*104*/ uint8 ItemClass; //0, 1, or 2
/*105*/
@ -4504,10 +4504,10 @@ struct ItemBodyStruct
uint32 Prestige; // New to March 21 2012 client
uint8 ItemType;
uint32 Material;
uint32 unknown7;
uint32 MaterialUnknown1;
uint32 EliteMaterial;
uint32 unknown_RoF23; // New to March 21 2012 client
uint32 unknown_RoF24; // New to December 10th 2012 client - NEW
uint32 HerosForgeModel; // New to March 21 2012 client
uint32 MaterialUnknown2; // New to December 10th 2012 client - NEW
float SellRate;
int32 CombatEffects;
int32 Shielding;
@ -4690,11 +4690,7 @@ struct ItemQuaternaryBodyStruct
uint32 unknown37;
uint32 unknown_RoF27;
uint32 unknown_RoF28;
// Begin RoF2 Test
uint8 unknown_TEST1;
// End RoF2 Test
uint8 unknown37a; // (guessed position) New to RoF2
uint8 unknown38; // 0
uint8 unknown39; // 1
uint32 subitem_count;

View File

@ -332,6 +332,9 @@ These fields must be in the order of how they are serialized!
/* 091 */ I(AugSlotType[4])
/* 092 */ I(AugSlotVisible[4])
/* 092 */ I(AugSlotUnk2[4])
/* 091 */ I(AugSlotType[5])
/* 092 */ I(AugSlotVisible[5])
/* 092 */ I(AugSlotUnk2[5])
/* 093 */ I(PointType)
/* 093 */ I(LDoNTheme)
/* 094 */ I(LDoNPrice)

View File

@ -161,12 +161,11 @@ struct Color_Struct
};
struct CharSelectEquip {
//totally guessed;
uint32 equip0;
uint32 equip1;
uint32 equip2;
uint32 itemid;
uint32 equip3;
uint32 material;
uint32 unknown1;
uint32 elitematerial;
uint32 heroforgemodel;
uint32 material2;
Color_Struct color;
};
@ -258,11 +257,11 @@ struct Membership_Struct
* Size: 20 Octets
*/
struct EquipStruct {
/*00*/ uint32 equip0;
/*04*/ uint32 equip1;
/*08*/ uint32 equip2;
/*12*/ uint32 itemId;
/*16*/ uint32 equip3; // Same as equip0?
/*00*/ uint32 material;
/*04*/ uint32 unknown1;
/*08*/ uint32 elitematerial;
/*12*/ uint32 heroforgemodel;
/*16*/ uint32 material2; // Same as material?
/*20*/
};
@ -2175,8 +2174,7 @@ struct AltCurrencyUpdate_Struct {
//When an item is selected while the alt currency merchant window is open
struct AltCurrencySelectItem_Struct {
/*000*/ uint32 merchant_entity_id;
/*004*/ //uint32 slot_id;
ItemSlotStruct slot_id;
/*004*/ MainInvItemSlotStruct slot_id;
/*008*/ uint32 unknown008;
/*012*/ uint32 unknown012;
/*016*/ uint32 unknown016;
@ -2233,8 +2231,7 @@ struct AltCurrencyReclaim_Struct {
struct AltCurrencySellItem_Struct {
/*000*/ uint32 merchant_entity_id;
/*004*/ //uint32 slot_id;
ItemSlotStruct slot_id;
/*004*/ MainInvItemSlotStruct slot_id;
/*008*/ uint32 charges;
/*012*/ uint32 cost;
};
@ -4423,14 +4420,14 @@ struct EvolvingItem {
struct ItemSerializationHeaderFinish
{
uint16 ornamentIcon;
/*079*/ uint16 ornamentIcon;
/*081*/ uint8 unknown061; // 0 - Add Evolving Item struct if this isn't set to 0?
/*082*/ uint8 unknown062; // 0
/*083*/ uint32 unknowna1; // 0xffffffff
/*087*/ uint32 unknowna2; // 0
/*083*/ int32 unknowna1; // 0xffffffff
/*087*/ uint32 ornamentHeroModel; // 0
/*091*/ uint8 unknown063; // 0
/*092*/ uint32 unknowna3; // 0
/*096*/ uint32 unknowna4; // 0xffffffff
/*096*/ int32 unknowna4; // 0xffffffff
/*100*/ uint32 unknowna5; // 0
/*104*/ uint8 ItemClass; //0, 1, or 2
/*105*/
@ -4499,10 +4496,10 @@ struct ItemBodyStruct
uint32 Prestige; // New to March 21 2012 client
uint8 ItemType;
uint32 Material;
uint32 unknown7;
uint32 MaterialUnknown1;
uint32 EliteMaterial;
uint32 unknown_RoF3; // New to March 21 2012 client
uint32 unknown_RoF4; // New to December 10th 2012 client - NEW
uint32 HerosForgeModel; // New to March 21 2012 client
uint32 MaterialUnknown2; // New to December 10th 2012 client - NEW
float SellRate;
int32 CombatEffects;
int32 Shielding;

View File

@ -1429,9 +1429,9 @@ namespace SoD
OUT(beard);
// OUT(unknown00178[10]);
for (r = 0; r < 9; r++) {
eq->equipment[r].equip0 = emu->item_material[r];
eq->equipment[r].equip1 = 0;
eq->equipment[r].itemId = 0;
eq->equipment[r].material = emu->item_material[r];
eq->equipment[r].unknown1 = 0;
eq->equipment[r].elitematerial = 0;
//eq->colors[r].color = emu->colors[r].color;
}
for (r = 0; r < 7; r++) {
@ -1825,10 +1825,10 @@ namespace SoD
eq2->face = emu->face[r];
int k;
for (k = 0; k < _MaterialCount; k++) {
eq2->equip[k].equip0 = emu->equip[r][k];
eq2->equip[k].equip1 = 0;
eq2->equip[k].itemid = 0;
eq2->equip[k].color.color = emu->cs_colors[r][k].color;
eq2->equip[k].material = emu->equip[r][k].material;
eq2->equip[k].unknown1 = emu->equip[r][k].unknown1;
eq2->equip[k].elitematerial = emu->equip[r][k].elitematerial;
eq2->equip[k].color.color = emu->equip[r][k].color.color;
}
eq2->primary = emu->primary[r];
eq2->secondary = emu->secondary[r];
@ -2383,7 +2383,7 @@ namespace SoD
Bitfields->anon = emu->anon;
Bitfields->showhelm = emu->showhelm;
Bitfields->targetable = 1;
Bitfields->targetable_with_hotkey = (emu->IsMercenary ? 0 : 1);
Bitfields->targetable_with_hotkey = emu->targetable_with_hotkey ? 1 : 0;
Bitfields->statue = 0;
Bitfields->trader = 0;
Bitfields->buyer = 0;
@ -2548,11 +2548,11 @@ namespace SoD
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary]);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary].material);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary]);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary].material);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
}
@ -2563,9 +2563,9 @@ namespace SoD
structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer;
for (k = 0; k < 9; k++) {
Equipment[k].equip0 = emu->equipment[k];
Equipment[k].equip1 = 0;
Equipment[k].itemId = 0;
Equipment[k].material = emu->equipment[k].material;
Equipment[k].unknown1 = emu->equipment[k].unknown1;
Equipment[k].elitematerial = emu->equipment[k].elitematerial;
}
Buffer += (sizeof(structs::EquipStruct) * 9);
@ -3223,7 +3223,7 @@ namespace SoD
hdr.unknown028 = 0;
hdr.last_cast_time = ((item->RecastDelay > 1) ? 1212693140 : 0);
hdr.charges = (stackable ? (item->MaxCharges ? 1 : 0) : charges);
hdr.inst_nodrop = inst->IsInstNoDrop() ? 1 : 0;
hdr.inst_nodrop = inst->IsAttuned() ? 1 : 0;
hdr.unknown044 = 0;
hdr.unknown048 = 0;
hdr.unknown052 = 0;
@ -3370,7 +3370,7 @@ namespace SoD
isbs.augtype = item->AugType;
isbs.augrestrict = item->AugRestrict;
for (int x = 0; x < 5; ++x)
for (int x = 0; x < consts::ITEM_COMMON_SIZE; x++)
{
isbs.augslots[x].type = item->AugSlotType[x];
isbs.augslots[x].visible = item->AugSlotVisible[x];

View File

@ -118,9 +118,9 @@ struct Color_Struct
struct CharSelectEquip {
//totally guessed;
uint32 equip0;
uint32 equip1;
uint32 itemid;
uint32 material;
uint32 unknown1;
uint32 elitematerial;
Color_Struct color;
};
@ -169,9 +169,9 @@ struct CharacterSelect_Struct {
* Size: 12 Octets
*/
struct EquipStruct {
/*00*/ uint32 equip0;
/*04*/ uint32 equip1;
/*08*/ uint32 itemId;
/*00*/ uint32 material;
/*04*/ uint32 unknown1;
/*08*/ uint32 elitematerial;
/*12*/
};

View File

@ -1087,9 +1087,9 @@ namespace SoF
OUT(beard);
// OUT(unknown00178[10]);
for (r = 0; r < 9; r++) {
eq->equipment[r].equip0 = emu->item_material[r];
eq->equipment[r].equip1 = 0;
eq->equipment[r].itemId = 0;
eq->equipment[r].material = emu->item_material[r];
eq->equipment[r].unknown1 = 0;
eq->equipment[r].elitematerial = 0;
//eq->colors[r].color = emu->colors[r].color;
}
for (r = 0; r < 7; r++) {
@ -1484,10 +1484,10 @@ namespace SoF
eq2->face = emu->face[r];
int k;
for (k = 0; k < _MaterialCount; k++) {
eq2->equip[k].equip0 = emu->equip[r][k];
eq2->equip[k].equip1 = 0;
eq2->equip[k].itemid = 0;
eq2->equip[k].color.color = emu->cs_colors[r][k].color;
eq2->equip[k].material = emu->equip[r][k].material;
eq2->equip[k].unknown1 = emu->equip[r][k].unknown1;
eq2->equip[k].elitematerial = emu->equip[r][k].elitematerial;
eq2->equip[k].color.color = emu->equip[r][k].color.color;
}
eq2->primary = emu->primary[r];
eq2->secondary = emu->secondary[r];
@ -1840,9 +1840,9 @@ namespace SoF
eq->drakkin_heritage = emu->drakkin_heritage;
eq->gender = emu->gender;
for (k = 0; k < 9; k++) {
eq->equipment[k].equip0 = emu->equipment[k];
eq->equipment[k].equip1 = 0;
eq->equipment[k].itemId = 0;
eq->equipment[k].material = emu->equipment[k].material;
eq->equipment[k].unknown1 = emu->equipment[k].unknown1;
eq->equipment[k].elitematerial = emu->equipment[k].elitematerial;
eq->colors[k].color = emu->colors[k].color;
}
eq->StandState = emu->StandState;
@ -1889,7 +1889,7 @@ namespace SoF
eq->beard = emu->beard;
eq->targetable = 1; //New Field - Toggle Targetable on or off - 0 = off, 1 = on
eq->NPC = emu->NPC;
eq->targetable_with_hotkey = 1;//New Field - Toggle Targetable on or off - 0 = off, 1 = on
eq->targetable_with_hotkey = emu->targetable_with_hotkey ? 1 : 0; //New Field - Toggle Targetable on or off - 0 = off, 1 = on
eq->x = emu->x;
eq->deltaX = emu->deltaX;
eq->deltaY = emu->deltaY;
@ -2547,7 +2547,7 @@ namespace SoF
hdr.unknown028 = 0;
hdr.last_cast_time = ((item->RecastDelay > 1) ? 1212693140 : 0);
hdr.charges = (stackable ? (item->MaxCharges ? 1 : 0) : charges);
hdr.inst_nodrop = inst->IsInstNoDrop() ? 1 : 0;
hdr.inst_nodrop = inst->IsAttuned() ? 1 : 0;
hdr.unknown044 = 0;
hdr.unknown048 = 0;
hdr.unknown052 = 0;
@ -2693,7 +2693,7 @@ namespace SoF
isbs.augtype = item->AugType;
isbs.augrestrict = item->AugRestrict;
for (int x = 0; x < 5; ++x)
for (int x = 0; x < consts::ITEM_COMMON_SIZE; x++)
{
isbs.augslots[x].type = item->AugSlotType[x];
isbs.augslots[x].visible = item->AugSlotVisible[x];

View File

@ -117,10 +117,9 @@ struct Color_Struct
};
struct CharSelectEquip {
//totally guessed;
uint32 equip0;
uint32 equip1;
uint32 itemid;
uint32 material;
uint32 unknown1;
uint32 elitematerial;
Color_Struct color;
};
@ -167,9 +166,9 @@ struct CharacterSelect_Struct {
* Size: 12 Octets
*/
struct EquipStruct {
/*00*/ uint32 equip0;
/*04*/ uint32 equip1;
/*08*/ uint32 itemId;
/*00*/ uint32 material;
/*04*/ uint32 unknown1;
/*08*/ uint32 elitematerial;
/*12*/
};

View File

@ -1042,8 +1042,8 @@ namespace Titanium
OUT(beard[r]);
int k;
for (k = 0; k < 9; k++) {
OUT(equip[r][k]);
OUT(cs_colors[r][k].color);
eq->equip[r][k] = emu->equip[r][k].material;
eq->cs_colors[r][k].color = emu->equip[r][k].color.color;
}
OUT(haircolor[r]);
OUT(gohome[r]);
@ -1270,7 +1270,7 @@ namespace Titanium
eq->guildrank = emu->guildrank;
// eq->unknown0194[3] = emu->unknown0194[3];
for (k = 0; k < 9; k++) {
eq->equipment[k] = emu->equipment[k];
eq->equipment[k] = emu->equipment[k].material;
eq->colors[k].color = emu->colors[k].color;
}
for (k = 0; k < 8; k++) {
@ -1678,7 +1678,7 @@ namespace Titanium
(merchant_slot == 0) ? inst->GetSerialNumber() : merchant_slot,
0, // item recast timer timestamp field (aka..last_cast_time field in SoF+ clients)
(stackable ? ((inst->GetItem()->ItemType == ItemTypePotion) ? 1 : 0) : charges),
inst->IsInstNoDrop() ? 1 : 0,
inst->IsAttuned() ? 1 : 0,
0
);

View File

@ -1702,9 +1702,9 @@ namespace Underfoot
OUT(beard);
// OUT(unknown00178[10]);
for (r = 0; r < 9; r++) {
eq->equipment[r].equip0 = emu->item_material[r];
eq->equipment[r].equip1 = 0;
eq->equipment[r].itemId = 0;
eq->equipment[r].material = emu->item_material[r];
eq->equipment[r].unknown1 = 0;
eq->equipment[r].elitematerial = 0;
//eq->colors[r].color = emu->colors[r].color;
}
for (r = 0; r < 7; r++) {
@ -2132,10 +2132,10 @@ namespace Underfoot
eq2->face = emu->face[r];
int k;
for (k = 0; k < _MaterialCount; k++) {
eq2->equip[k].equip0 = emu->equip[r][k];
eq2->equip[k].equip1 = 0;
eq2->equip[k].itemid = 0;
eq2->equip[k].color.color = emu->cs_colors[r][k].color;
eq2->equip[k].material = emu->equip[r][k].material;
eq2->equip[k].unknown1 = emu->equip[r][k].unknown1;
eq2->equip[k].elitematerial = emu->equip[r][k].elitematerial;
eq2->equip[k].color.color = emu->equip[r][k].color.color;
}
eq2->primary = emu->primary[r];
eq2->secondary = emu->secondary[r];
@ -2668,7 +2668,7 @@ namespace Underfoot
Bitfields->anon = emu->anon;
Bitfields->showhelm = emu->showhelm;
Bitfields->targetable = 1;
Bitfields->targetable_with_hotkey = (emu->IsMercenary ? 0 : 1);
Bitfields->targetable_with_hotkey = emu->targetable_with_hotkey ? 1 : 0;
Bitfields->statue = 0;
Bitfields->trader = 0;
Bitfields->buyer = 0;
@ -2832,11 +2832,11 @@ namespace Underfoot
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary]);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary].material);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary]);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary].material);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
}
@ -2846,9 +2846,9 @@ namespace Underfoot
structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer;
for (k = 0; k < 9; k++) {
Equipment[k].equip0 = emu->equipment[k];
Equipment[k].equip1 = 0;
Equipment[k].itemId = 0;
Equipment[k].material = emu->equipment[k].material;
Equipment[k].unknown1 = emu->equipment[k].unknown1;
Equipment[k].elitematerial = emu->equipment[k].elitematerial;
}
Buffer += (sizeof(structs::EquipStruct) * 9);
@ -3637,7 +3637,7 @@ namespace Underfoot
hdr.unknown028 = 0;
hdr.last_cast_time = ((item->RecastDelay > 1) ? 1212693140 : 0);
hdr.charges = (stackable ? (item->MaxCharges ? 1 : 0) : charges);
hdr.inst_nodrop = inst->IsInstNoDrop() ? 1 : 0;
hdr.inst_nodrop = inst->IsAttuned() ? 1 : 0;
hdr.unknown044 = 0;
hdr.unknown048 = 0;
hdr.unknown052 = 0;
@ -3817,7 +3817,7 @@ namespace Underfoot
isbs.augtype = item->AugType;
isbs.augrestrict = item->AugRestrict;
for (int x = 0; x < 5; ++x)
for (int x = 0; x < consts::ITEM_COMMON_SIZE; x++)
{
isbs.augslots[x].type = item->AugSlotType[x];
isbs.augslots[x].visible = item->AugSlotVisible[x];

View File

@ -117,10 +117,9 @@ struct Color_Struct
};
struct CharSelectEquip {
//totally guessed;
uint32 equip0;
uint32 equip1;
uint32 itemid;
uint32 material;
uint32 unknown1;
uint32 elitematerial;
Color_Struct color;
};
@ -169,9 +168,9 @@ struct CharacterSelect_Struct {
* Size: 12 Octets
*/
struct EquipStruct {
/*00*/ uint32 equip0;
/*04*/ uint32 equip1;
/*08*/ uint32 itemId;
/*00*/ uint32 material;
/*04*/ uint32 unknown1;
/*08*/ uint32 elitematerial;
/*12*/
};
@ -4366,8 +4365,8 @@ struct AltCurrencySelectItem_Struct {
struct AltCurrencySellItem_Struct {
/*000*/ uint32 merchant_entity_id;
/*004*/ uint32 slot_id;
/*006*/ uint32 charges;
/*010*/ uint32 cost;
/*008*/ uint32 charges;
/*012*/ uint32 cost;
};
struct AltCurrencyPopulateEntry_Struct

View File

@ -15,15 +15,13 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "debug.h"
#include "timer.h"
#include "ptimer.h"
#include "database.h"
#include "string_util.h"
#include <stdio.h>
#include <cstdlib>
#include <cstring>
#ifdef _WINDOWS
#include <windows.h>

View File

@ -15,8 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "../common/debug.h"
#include "../common/eq_packet_structs.h"
#include "../common/races.h"
const char* GetRaceName(uint16 race) {

View File

@ -21,6 +21,9 @@
#include <random>
#include <utility>
#include <algorithm>
#include <iterator>
#include <type_traits>
/* This uses mt19937 seeded with the std::random_device
* The idea is to have this be included as a member of another class
@ -33,35 +36,45 @@ namespace EQEmu {
class Random {
public:
// AKA old MakeRandomInt
const int Int(int low, int high)
int Int(int low, int high)
{
if (low > high)
std::swap(low, high);
return std::uniform_int_distribution<int>(low, high)(m_gen); // [low, high]
return int_dist(m_gen, int_param_t(low, high)); // [low, high]
}
// AKA old MakeRandomFloat
const double Real(double low, double high)
double Real(double low, double high)
{
if (low > high)
std::swap(low, high);
return std::uniform_real_distribution<double>(low, high)(m_gen); // [low, high)
return real_dist(m_gen, real_param_t(low, high)); // [low, high)
}
// example Roll(50) would have a 50% success rate
// Roll(100) 100%, etc
// valid values 0-100 (well, higher works too but ...)
const bool Roll(const int required)
bool Roll(const int required)
{
return Int(0, 99) < required;
}
// valid values 0.0 - 1.0
const bool Roll(const double required)
bool Roll(const double required)
{
return Real(0.0, 1.0) <= required;
}
// std::shuffle requires a RNG engine passed to it, so lets provide a wrapper to use our engine
template<typename RandomAccessIterator>
void Shuffle(RandomAccessIterator first, RandomAccessIterator last)
{
static_assert(std::is_same<std::random_access_iterator_tag,
typename std::iterator_traits<RandomAccessIterator>::iterator_category>::value,
"EQEmu::Random::Shuffle requires random access iterators");
std::shuffle(first, last, m_gen);
}
void Reseed()
{
// We could do the seed_seq thing here too if we need better seeding
@ -76,7 +89,11 @@ namespace EQEmu {
}
private:
typedef std::uniform_int_distribution<int>::param_type int_param_t;
typedef std::uniform_real_distribution<double>::param_type real_param_t;
std::mt19937 m_gen;
std::uniform_int_distribution<int> int_dist;
std::uniform_real_distribution<double> real_dist;
};
}

View File

@ -15,10 +15,9 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "debug.h"
#include "rdtsc.h"
#include "types.h"
#include <stdio.h>
#ifdef _WINDOWS
#include <sys/timeb.h>

View File

@ -136,7 +136,6 @@ RULE_CATEGORY_END()
RULE_CATEGORY( Pets )
RULE_REAL( Pets, AttackCommandRange, 150 )
RULE_BOOL( Pets, UnTargetableSwarmPet, false )
RULE_BOOL( Pets, SwarmPetNotTargetableWithHotKey, false ) //On SOF+ clients this a semi-hack to make swarm pets not F8 targetable.
RULE_CATEGORY_END()
RULE_CATEGORY( GM )
@ -325,6 +324,8 @@ RULE_INT ( Spells, AI_IdleBeneficialChance, 100) // Chance while idle to do a be
RULE_BOOL ( Spells, SHDProcIDOffByOne, true) // pre June 2009 SHD spell procs were off by 1, they stopped doing this in June 2009 (so UF+ spell files need this false)
RULE_BOOL ( Spells, Jun182014HundredHandsRevamp, false) // this should be true for if you import a spell file newer than June 18, 2014
RULE_BOOL ( Spells, SwarmPetTargetLock, false) // Use old method of swarm pets target locking till target dies then despawning.
RULE_BOOL ( Spells, NPC_UseFocusFromSpells, true) // Allow npcs to use most spell derived focus effects.
RULE_BOOL ( Spells, NPC_UseFocusFromItems, false) // Allow npcs to use most item derived focus effects.
RULE_CATEGORY_END()
RULE_CATEGORY( Combat )

View File

@ -126,7 +126,7 @@ public:
if (check[i] == '.' && !SeenDec) {
SeenDec = true;
}
else if (i == 0 && (check[i] == '-' || check[i] == '+') && !check[i+1] == 0) {
else if (i == 0 && (check[i] == '-' || check[i] == '+') && check[i + 1] != '\0') {
// this is ok, do nothin
}
else {

View File

@ -1,24 +1,19 @@
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include "shareddb.h"
#include "mysql.h"
#include "item.h"
#include "classes.h"
#include "rulesys.h"
#include "seperator.h"
#include "string_util.h"
#include "eq_packet_structs.h"
#include "guilds.h"
#include "extprofile.h"
#include "memory_mapped_file.h"
#include "ipc_mutex.h"
#include "eqemu_exception.h"
#include "loottable.h"
#include "faction.h"
#include "features.h"
#include "ipc_mutex.h"
#include "item.h"
#include "loottable.h"
#include "memory_mapped_file.h"
#include "mysql.h"
#include "rulesys.h"
#include "shareddb.h"
#include "string_util.h"
SharedDatabase::SharedDatabase()
: Database(), skill_caps_mmf(nullptr), items_mmf(nullptr), items_hash(nullptr), faction_mmf(nullptr), faction_hash(nullptr),
@ -183,7 +178,7 @@ bool SharedDatabase::SaveInventory(uint32 char_id, const ItemInst* inst, int16 s
bool SharedDatabase::UpdateInventorySlot(uint32 char_id, const ItemInst* inst, int16 slot_id) {
uint32 augslot[EmuConstants::ITEM_COMMON_SIZE] = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM };
uint32 augslot[EmuConstants::ITEM_COMMON_SIZE] = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM };
if (inst->IsType(ItemClassCommon))
for(int i = AUG_BEGIN; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
ItemInst *auginst=inst->GetItem(i);
@ -199,14 +194,15 @@ bool SharedDatabase::UpdateInventorySlot(uint32 char_id, const ItemInst* inst, i
// Update/Insert item
std::string query = StringFormat("REPLACE INTO inventory "
"(charid, slotid, itemid, charges, instnodrop, custom_data, color, "
"augslot1, augslot2, augslot3, augslot4, augslot5, ornamenticon, ornamentidfile) "
"augslot1, augslot2, augslot3, augslot4, augslot5, augslot6, ornamenticon, ornamentidfile, ornament_hero_model) "
"VALUES( %lu, %lu, %lu, %lu, %lu, '%s', %lu, "
"%lu, %lu, %lu, %lu, %lu, %lu, %lu)",
"%lu, %lu, %lu, %lu, %lu, %lu, %lu, %lu, %lu)",
(unsigned long)char_id, (unsigned long)slot_id, (unsigned long)inst->GetItem()->ID,
(unsigned long)charges, (unsigned long)(inst->IsInstNoDrop()? 1: 0),
(unsigned long)charges, (unsigned long)(inst->IsAttuned()? 1: 0),
inst->GetCustomDataString().c_str(), (unsigned long)inst->GetColor(),
(unsigned long)augslot[0], (unsigned long)augslot[1], (unsigned long)augslot[2],
(unsigned long)augslot[3],(unsigned long)augslot[4], (unsigned long)inst->GetOrnamentationIcon(), (unsigned long)inst->GetOrnamentationIDFile());
(unsigned long)augslot[3], (unsigned long)augslot[4], (unsigned long)augslot[5], (unsigned long)inst->GetOrnamentationIcon(),
(unsigned long)inst->GetOrnamentationIDFile(), (unsigned long)inst->GetOrnamentHeroModel());
auto results = QueryDatabase(query);
// Save bag contents, if slot supports bag contents
@ -226,7 +222,7 @@ bool SharedDatabase::UpdateInventorySlot(uint32 char_id, const ItemInst* inst, i
bool SharedDatabase::UpdateSharedBankSlot(uint32 char_id, const ItemInst* inst, int16 slot_id) {
uint32 augslot[EmuConstants::ITEM_COMMON_SIZE] = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM };
uint32 augslot[EmuConstants::ITEM_COMMON_SIZE] = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM };
if (inst->IsType(ItemClassCommon))
for(int i = AUG_BEGIN; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
ItemInst *auginst=inst->GetItem(i);
@ -243,12 +239,13 @@ bool SharedDatabase::UpdateSharedBankSlot(uint32 char_id, const ItemInst* inst,
std::string query = StringFormat("REPLACE INTO sharedbank "
"(acctid, slotid, itemid, charges, custom_data, "
"augslot1, augslot2, augslot3, augslot4, augslot5) "
"augslot1, augslot2, augslot3, augslot4, augslot5, augslot6) "
"VALUES( %lu, %lu, %lu, %lu, '%s', "
"%lu, %lu, %lu, %lu, %lu)",
"%lu, %lu, %lu, %lu, %lu, %lu)",
(unsigned long)account_id, (unsigned long)slot_id, (unsigned long)inst->GetItem()->ID,
(unsigned long)charges, inst->GetCustomDataString().c_str(), (unsigned long)augslot[0],
(unsigned long)augslot[1],(unsigned long)augslot[2],(unsigned long)augslot[3],(unsigned long)augslot[4]);
(unsigned long)augslot[1], (unsigned long)augslot[2], (unsigned long)augslot[3], (unsigned long)augslot[4],
(unsigned long)augslot[5]);
auto results = QueryDatabase(query);
// Save bag contents, if slot supports bag contents
@ -394,13 +391,13 @@ bool SharedDatabase::GetSharedBank(uint32 id, Inventory* inv, bool is_charid) {
if (is_charid)
query = StringFormat("SELECT sb.slotid, sb.itemid, sb.charges, "
"sb.augslot1, sb.augslot2, sb.augslot3, "
"sb.augslot4, sb.augslot5, sb.custom_data "
"sb.augslot4, sb.augslot5, sb.augslot6, sb.custom_data "
"FROM sharedbank sb INNER JOIN character_data ch "
"ON ch.account_id=sb.acctid WHERE ch.id = %i", id);
else
query = StringFormat("SELECT slotid, itemid, charges, "
"augslot1, augslot2, augslot3, "
"augslot4, augslot5, custom_data "
"augslot4, augslot5, augslot6, custom_data "
"FROM sharedbank WHERE acctid=%i", id);
auto results = QueryDatabase(query);
if (!results.Success()) {
@ -414,11 +411,12 @@ bool SharedDatabase::GetSharedBank(uint32 id, Inventory* inv, bool is_charid) {
int8 charges = (int8)atoi(row[2]);
uint32 aug[EmuConstants::ITEM_COMMON_SIZE];
aug[0] = (uint32)atoi(row[3]);
aug[1] = (uint32)atoi(row[4]);
aug[2] = (uint32)atoi(row[5]);
aug[3] = (uint32)atoi(row[6]);
aug[4] = (uint32)atoi(row[7]);
aug[0] = (uint32)atoi(row[3]);
aug[1] = (uint32)atoi(row[4]);
aug[2] = (uint32)atoi(row[5]);
aug[3] = (uint32)atoi(row[6]);
aug[4] = (uint32)atoi(row[7]);
aug[5] = (uint32)atoi(row[8]);
const Item_Struct* item = GetItem(item_id);
@ -440,10 +438,10 @@ bool SharedDatabase::GetSharedBank(uint32 id, Inventory* inv, bool is_charid) {
}
}
if(!row[8])
if(!row[9])
continue;
std::string data_str(row[8]);
std::string data_str(row[9]);
std::string idAsString;
std::string value;
bool use_id = true;
@ -488,7 +486,7 @@ bool SharedDatabase::GetSharedBank(uint32 id, Inventory* inv, bool is_charid) {
bool SharedDatabase::GetInventory(uint32 char_id, Inventory* inv) {
// Retrieve character inventory
std::string query = StringFormat("SELECT slotid, itemid, charges, color, augslot1, "
"augslot2, augslot3, augslot4, augslot5, instnodrop, custom_data, ornamenticon, ornamentidfile "
"augslot2, augslot3, augslot4, augslot5, augslot6, instnodrop, custom_data, ornamenticon, ornamentidfile, ornament_hero_model "
"FROM inventory WHERE charid = %i ORDER BY slotid", char_id);
auto results = QueryDatabase(query);
if (!results.Success()) {
@ -505,16 +503,18 @@ bool SharedDatabase::GetInventory(uint32 char_id, Inventory* inv) {
uint32 aug[EmuConstants::ITEM_COMMON_SIZE];
aug[0] = (uint32)atoul(row[4]);
aug[1] = (uint32)atoul(row[5]);
aug[2] = (uint32)atoul(row[6]);
aug[3] = (uint32)atoul(row[7]);
aug[4] = (uint32)atoul(row[8]);
aug[0] = (uint32)atoul(row[4]);
aug[1] = (uint32)atoul(row[5]);
aug[2] = (uint32)atoul(row[6]);
aug[3] = (uint32)atoul(row[7]);
aug[4] = (uint32)atoul(row[8]);
aug[5] = (uint32)atoul(row[9]);
bool instnodrop = (row[9] && (uint16)atoi(row[9]))? true: false;
bool instnodrop = (row[10] && (uint16)atoi(row[10]))? true: false;
uint32 ornament_icon = (uint32)atoul(row[11]);
uint32 ornament_idfile = (uint32)atoul(row[12]);
uint32 ornament_icon = (uint32)atoul(row[12]);
uint32 ornament_idfile = (uint32)atoul(row[13]);
uint32 ornament_hero_model = (uint32)atoul(row[14]);
const Item_Struct* item = GetItem(item_id);
@ -527,8 +527,8 @@ bool SharedDatabase::GetInventory(uint32 char_id, Inventory* inv) {
ItemInst* inst = CreateBaseItem(item, charges);
if(row[10]) {
std::string data_str(row[10]);
if(row[11]) {
std::string data_str(row[11]);
std::string idAsString;
std::string value;
bool use_id = true;
@ -552,21 +552,22 @@ bool SharedDatabase::GetInventory(uint32 char_id, Inventory* inv) {
value.push_back(v);
}
}
if (ornament_icon > 0)
inst->SetOrnamentIcon(ornament_icon);
if (ornament_idfile > 0)
inst->SetOrnamentationIDFile(ornament_idfile);
inst->SetOrnamentIcon(ornament_icon);
inst->SetOrnamentationIDFile(ornament_idfile);
inst->SetOrnamentHeroModel(ornament_hero_model);
if (instnodrop || (((slot_id >= EmuConstants::EQUIPMENT_BEGIN && slot_id <= EmuConstants::EQUIPMENT_END) || slot_id == MainPowerSource) && inst->GetItem()->Attuneable))
inst->SetInstNoDrop(true);
inst->SetAttuned(true);
if (color > 0)
inst->SetColor(color);
if(charges==0x7FFF)
inst->SetCharges(-1);
else
else if (charges == 0 && inst->IsStackable()) // Stackable items need a minimum charge of 1 remain moveable.
inst->SetCharges(1);
else
inst->SetCharges(charges);
if (item->ItemClass == ItemClassCommon)
@ -599,7 +600,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, Inventory* inv) {
bool SharedDatabase::GetInventory(uint32 account_id, char* name, Inventory* inv) {
// Retrieve character inventory
std::string query = StringFormat("SELECT slotid, itemid, charges, color, augslot1, "
"augslot2, augslot3, augslot4, augslot5, instnodrop, custom_data, ornamenticon, ornamentidfile "
"augslot2, augslot3, augslot4, augslot5, augslot6, instnodrop, custom_data, ornamenticon, ornamentidfile, ornament_hero_model "
"FROM inventory INNER JOIN character_data ch "
"ON ch.id = charid WHERE ch.name = '%s' AND ch.account_id = %i ORDER BY slotid",
name, account_id);
@ -618,15 +619,17 @@ bool SharedDatabase::GetInventory(uint32 account_id, char* name, Inventory* inv)
uint32 color = atoul(row[3]);
uint32 aug[EmuConstants::ITEM_COMMON_SIZE];
aug[0] = (uint32)atoi(row[4]);
aug[1] = (uint32)atoi(row[5]);
aug[2] = (uint32)atoi(row[6]);
aug[3] = (uint32)atoi(row[7]);
aug[4] = (uint32)atoi(row[8]);
aug[0] = (uint32)atoi(row[4]);
aug[1] = (uint32)atoi(row[5]);
aug[2] = (uint32)atoi(row[6]);
aug[3] = (uint32)atoi(row[7]);
aug[4] = (uint32)atoi(row[8]);
aug[5] = (uint32)atoi(row[9]);
bool instnodrop = (row[9] && (uint16)atoi(row[9])) ? true : false;
uint32 ornament_icon = (uint32)atoul(row[11]);
uint32 ornament_idfile = (uint32)atoul(row[12]);
bool instnodrop = (row[10] && (uint16)atoi(row[10])) ? true : false;
uint32 ornament_icon = (uint32)atoul(row[12]);
uint32 ornament_idfile = (uint32)atoul(row[13]);
uint32 ornament_hero_model = (uint32)atoul(row[14]);
const Item_Struct* item = GetItem(item_id);
int16 put_slot_id = INVALID_INDEX;
@ -634,10 +637,10 @@ bool SharedDatabase::GetInventory(uint32 account_id, char* name, Inventory* inv)
continue;
ItemInst* inst = CreateBaseItem(item, charges);
inst->SetInstNoDrop(instnodrop);
inst->SetAttuned(instnodrop);
if(row[10]) {
std::string data_str(row[10]);
if(row[11]) {
std::string data_str(row[11]);
std::string idAsString;
std::string value;
bool use_id = true;
@ -663,11 +666,9 @@ bool SharedDatabase::GetInventory(uint32 account_id, char* name, Inventory* inv)
}
}
if (ornament_icon > 0)
inst->SetOrnamentIcon(ornament_icon);
if (ornament_idfile > 0)
inst->SetOrnamentationIDFile(ornament_idfile);
inst->SetOrnamentIcon(ornament_icon);
inst->SetOrnamentationIDFile(ornament_idfile);
inst->SetOrnamentHeroModel(ornament_hero_model);
if (color > 0)
inst->SetColor(color);
@ -852,9 +853,9 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_
item.MaxCharges = (int16)atoi(row[ItemField::maxcharges]);
item.ItemType = (uint8)atoi(row[ItemField::itemtype]);
item.Material = (uint8)atoi(row[ItemField::material]);
item.Material = (uint8)atoi(row[ItemField::material]);
item.HerosForgeModel = (uint32)atoi(row[ItemField::herosforgemodel]);
item.SellRate = (float)atof(row[ItemField::sellrate]);
item.CastTime = (uint32)atoul(row[ItemField::casttime]);
item.EliteMaterial = (uint32)atoul(row[ItemField::elitematerial]);
item.ProcRate = (int32)atoi(row[ItemField::procrate]);
@ -895,6 +896,9 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_
item.AugSlotType[4] = (uint8)atoi(row[ItemField::augslot5type]);
item.AugSlotVisible[4] = (uint8)atoi(row[ItemField::augslot5visible]);
item.AugSlotUnk2[4] = 0;
item.AugSlotType[5] = (uint8)atoi(row[ItemField::augslot6type]);
item.AugSlotVisible[5] = (uint8)atoi(row[ItemField::augslot6visible]);
item.AugSlotUnk2[5] = 0;
item.LDoNTheme = (uint32)atoul(row[ItemField::ldontheme]);
item.LDoNPrice = (uint32)atoul(row[ItemField::ldonprice]);
@ -1007,11 +1011,18 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_
}
const Item_Struct* SharedDatabase::GetItem(uint32 id) {
if(!items_hash || id > items_hash->max_key()) {
if (id == 0)
{
return nullptr;
}
if(items_hash->exists(id)) {
if(!items_hash || id > items_hash->max_key())
{
return nullptr;
}
if(items_hash->exists(id))
{
return &(items_hash->at(id));
}
@ -1180,7 +1191,7 @@ bool SharedDatabase::LoadNPCFactionLists() {
}
// Create appropriate ItemInst class
ItemInst* SharedDatabase::CreateItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5)
ItemInst* SharedDatabase::CreateItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6, uint8 attuned)
{
const Item_Struct* item = nullptr;
ItemInst* inst = nullptr;
@ -1192,6 +1203,8 @@ ItemInst* SharedDatabase::CreateItem(uint32 item_id, int16 charges, uint32 aug1,
inst->PutAugment(this, 2, aug3);
inst->PutAugment(this, 3, aug4);
inst->PutAugment(this, 4, aug5);
inst->PutAugment(this, 5, aug6);
inst->SetAttuned(attuned);
}
return inst;
@ -1199,7 +1212,7 @@ ItemInst* SharedDatabase::CreateItem(uint32 item_id, int16 charges, uint32 aug1,
// Create appropriate ItemInst class
ItemInst* SharedDatabase::CreateItem(const Item_Struct* item, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5)
ItemInst* SharedDatabase::CreateItem(const Item_Struct* item, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6, uint8 attuned)
{
ItemInst* inst = nullptr;
if (item) {
@ -1209,6 +1222,8 @@ ItemInst* SharedDatabase::CreateItem(const Item_Struct* item, int16 charges, uin
inst->PutAugment(this, 2, aug3);
inst->PutAugment(this, 3, aug4);
inst->PutAugment(this, 4, aug5);
inst->PutAugment(this, 5, aug6);
inst->SetAttuned(attuned);
}
return inst;
@ -1221,6 +1236,9 @@ ItemInst* SharedDatabase::CreateBaseItem(const Item_Struct* item, int16 charges)
// set it to 1 charge so that it is usable on creation
if (charges == 0 && item->MaxCharges == -1)
charges = 1;
// Stackable items need a minimum charge of 1 to remain moveable.
if(charges <= 0 && item->Stackable)
charges = 1;
inst = new ItemInst(item, charges);

View File

@ -6,128 +6,134 @@
#include "database.h"
#include "skills.h"
#include "spdat.h"
#include "item.h"
#include "base_data.h"
#include "fixed_memory_hash_set.h"
#include "fixed_memory_variable_hash_set.h"
#include <list>
class EvolveInfo;
class Inventory;
class ItemInst;
struct BaseDataStruct;
struct InspectMessage_Struct;
struct PlayerProfile_Struct;
struct SPDat_Spell_Struct;
struct Item_Struct;
struct NPCFactionList;
struct Faction;
struct LootTable_Struct;
struct LootDrop_Struct;
namespace EQEmu {
namespace EQEmu
{
class MemoryMappedFile;
}
/*
* This object is inherited by world and zone's DB object,
* and is mainly here to facilitate shared memory, and other
* things which only world and zone need.
*/
class SharedDatabase : public Database {
public:
SharedDatabase();
SharedDatabase(const char* host, const char* user, const char* passwd, const char* database,uint32 port);
virtual ~SharedDatabase();
This object is inherited by world and zone's DB object,
and is mainly here to facilitate shared memory, and other
things which only world and zone need.
*/
class SharedDatabase : public Database
{
public:
SharedDatabase();
SharedDatabase(const char* host, const char* user, const char* passwd, const char* database, uint32 port);
virtual ~SharedDatabase();
/*
* General Character Related Stuff
*/
bool SetGMSpeed(uint32 account_id, uint8 gmspeed);
uint8 GetGMSpeed(uint32 account_id);
bool SetHideMe(uint32 account_id, uint8 hideme);
int32 DeleteStalePlayerCorpses();
void LoadCharacterInspectMessage(uint32 character_id, InspectMessage_Struct* message);
void SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* message);
void GetBotInspectMessage(uint32 botid, InspectMessage_Struct* message);
void SetBotInspectMessage(uint32 botid, const InspectMessage_Struct* message);
bool GetCommandSettings(std::map<std::string,uint8> &commands);
uint32 GetTotalTimeEntitledOnAccount(uint32 AccountID);
/*
General Character Related Stuff
*/
bool SetGMSpeed(uint32 account_id, uint8 gmspeed);
uint8 GetGMSpeed(uint32 account_id);
bool SetHideMe(uint32 account_id, uint8 hideme);
int32 DeleteStalePlayerCorpses();
void LoadCharacterInspectMessage(uint32 character_id, InspectMessage_Struct* message);
void SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* message);
void GetBotInspectMessage(uint32 botid, InspectMessage_Struct* message);
void SetBotInspectMessage(uint32 botid, const InspectMessage_Struct* message);
bool GetCommandSettings(std::map<std::string, uint8> &commands);
uint32 GetTotalTimeEntitledOnAccount(uint32 AccountID);
/*
* Character Inventory
*/
bool SaveCursor(uint32 char_id, std::list<ItemInst*>::const_iterator &start, std::list<ItemInst*>::const_iterator &end);
bool SaveInventory(uint32 char_id, const ItemInst* inst, int16 slot_id);
bool DeleteSharedBankSlot(uint32 char_id, int16 slot_id);
bool DeleteInventorySlot(uint32 char_id, int16 slot_id);
bool UpdateInventorySlot(uint32 char_id, const ItemInst* inst, int16 slot_id);
bool UpdateSharedBankSlot(uint32 char_id, const ItemInst* inst, int16 slot_id);
bool VerifyInventory(uint32 account_id, int16 slot_id, const ItemInst* inst);
bool GetSharedBank(uint32 id, Inventory* inv, bool is_charid);
int32 GetSharedPlatinum(uint32 account_id);
bool SetSharedPlatinum(uint32 account_id, int32 amount_to_add);
bool GetInventory(uint32 char_id, Inventory* inv);
bool GetInventory(uint32 account_id, char* name, Inventory* inv);
bool SetStartingItems(PlayerProfile_Struct* pp, Inventory* inv, uint32 si_race, uint32 si_class, uint32 si_deity, uint32 si_current_zone, char* si_name, int admin);
/*
Character Inventory
*/
bool SaveCursor(uint32 char_id, std::list<ItemInst*>::const_iterator &start, std::list<ItemInst*>::const_iterator &end);
bool SaveInventory(uint32 char_id, const ItemInst* inst, int16 slot_id);
bool DeleteSharedBankSlot(uint32 char_id, int16 slot_id);
bool DeleteInventorySlot(uint32 char_id, int16 slot_id);
bool UpdateInventorySlot(uint32 char_id, const ItemInst* inst, int16 slot_id);
bool UpdateSharedBankSlot(uint32 char_id, const ItemInst* inst, int16 slot_id);
bool VerifyInventory(uint32 account_id, int16 slot_id, const ItemInst* inst);
bool GetSharedBank(uint32 id, Inventory* inv, bool is_charid);
int32 GetSharedPlatinum(uint32 account_id);
bool SetSharedPlatinum(uint32 account_id, int32 amount_to_add);
bool GetInventory(uint32 char_id, Inventory* inv);
bool GetInventory(uint32 account_id, char* name, Inventory* inv);
bool SetStartingItems(PlayerProfile_Struct* pp, Inventory* inv, uint32 si_race, uint32 si_class, uint32 si_deity, uint32 si_current_zone, char* si_name, int admin);
std::string GetBook(const char *txtfile);
std::string GetBook(const char *txtfile);
/*
* Item Methods
*/
ItemInst* CreateItem(uint32 item_id, int16 charges=0, uint32 aug1=0, uint32 aug2=0, uint32 aug3=0, uint32 aug4=0, uint32 aug5=0);
ItemInst* CreateItem(const Item_Struct* item, int16 charges=0, uint32 aug1=0, uint32 aug2=0, uint32 aug3=0, uint32 aug4=0, uint32 aug5=0);
ItemInst* CreateBaseItem(const Item_Struct* item, int16 charges=0);
/*
Item Methods
*/
ItemInst* CreateItem(uint32 item_id, int16 charges = 0, uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, uint32 aug4 = 0, uint32 aug5 = 0, uint32 aug6 = 0, uint8 attuned = 0);
ItemInst* CreateItem(const Item_Struct* item, int16 charges = 0, uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, uint32 aug4 = 0, uint32 aug5 = 0, uint32 aug6 = 0, uint8 attuned = 0);
ItemInst* CreateBaseItem(const Item_Struct* item, int16 charges = 0);
/*
* Shared Memory crap
*/
/*
Shared Memory crap
*/
//items
void GetItemsCount(int32 &item_count, uint32 &max_id);
void LoadItems(void *data, uint32 size, int32 items, uint32 max_item_id);
bool LoadItems();
const Item_Struct* IterateItems(uint32* id);
const Item_Struct* GetItem(uint32 id);
const EvolveInfo* GetEvolveInfo(uint32 loregroup);
//items
void GetItemsCount(int32 &item_count, uint32 &max_id);
void LoadItems(void *data, uint32 size, int32 items, uint32 max_item_id);
bool LoadItems();
const Item_Struct* IterateItems(uint32* id);
const Item_Struct* GetItem(uint32 id);
const EvolveInfo* GetEvolveInfo(uint32 loregroup);
//faction lists
void GetFactionListInfo(uint32 &list_count, uint32 &max_lists);
const NPCFactionList* GetNPCFactionEntry(uint32 id);
void LoadNPCFactionLists(void *data, uint32 size, uint32 list_count, uint32 max_lists);
bool LoadNPCFactionLists();
//faction lists
void GetFactionListInfo(uint32 &list_count, uint32 &max_lists);
const NPCFactionList* GetNPCFactionEntry(uint32 id);
void LoadNPCFactionLists(void *data, uint32 size, uint32 list_count, uint32 max_lists);
bool LoadNPCFactionLists();
//loot
void GetLootTableInfo(uint32 &loot_table_count, uint32 &max_loot_table, uint32 &loot_table_entries);
void GetLootDropInfo(uint32 &loot_drop_count, uint32 &max_loot_drop, uint32 &loot_drop_entries);
void LoadLootTables(void *data, uint32 size);
void LoadLootDrops(void *data, uint32 size);
bool LoadLoot();
const LootTable_Struct* GetLootTable(uint32 loottable_id);
const LootDrop_Struct* GetLootDrop(uint32 lootdrop_id);
//loot
void GetLootTableInfo(uint32 &loot_table_count, uint32 &max_loot_table, uint32 &loot_table_entries);
void GetLootDropInfo(uint32 &loot_drop_count, uint32 &max_loot_drop, uint32 &loot_drop_entries);
void LoadLootTables(void *data, uint32 size);
void LoadLootDrops(void *data, uint32 size);
bool LoadLoot();
const LootTable_Struct* GetLootTable(uint32 loottable_id);
const LootDrop_Struct* GetLootDrop(uint32 lootdrop_id);
void LoadSkillCaps(void *data);
bool LoadSkillCaps();
uint16 GetSkillCap(uint8 Class_, SkillUseTypes Skill, uint8 Level);
uint8 GetTrainLevel(uint8 Class_, SkillUseTypes Skill, uint8 Level);
void LoadSkillCaps(void *data);
bool LoadSkillCaps();
uint16 GetSkillCap(uint8 Class_, SkillUseTypes Skill, uint8 Level);
uint8 GetTrainLevel(uint8 Class_, SkillUseTypes Skill, uint8 Level);
int GetMaxSpellID();
void LoadSpells(void *data, int max_spells);
void LoadDamageShieldTypes(SPDat_Spell_Struct* sp, int32 iMaxSpellID);
int GetMaxSpellID();
void LoadSpells(void *data, int max_spells);
void LoadDamageShieldTypes(SPDat_Spell_Struct* sp, int32 iMaxSpellID);
int GetMaxBaseDataLevel();
bool LoadBaseData();
void LoadBaseData(void *data, int max_level);
const BaseDataStruct* GetBaseData(int lvl, int cl);
int GetMaxBaseDataLevel();
bool LoadBaseData();
void LoadBaseData(void *data, int max_level);
const BaseDataStruct* GetBaseData(int lvl, int cl);
protected:
protected:
EQEmu::MemoryMappedFile *skill_caps_mmf;
EQEmu::MemoryMappedFile *items_mmf;
EQEmu::FixedMemoryHashSet<Item_Struct> *items_hash;
EQEmu::MemoryMappedFile *faction_mmf;
EQEmu::FixedMemoryHashSet<NPCFactionList> *faction_hash;
EQEmu::MemoryMappedFile *loot_table_mmf;
EQEmu::FixedMemoryVariableHashSet<LootTable_Struct> *loot_table_hash;
EQEmu::MemoryMappedFile *loot_drop_mmf;
EQEmu::FixedMemoryVariableHashSet<LootDrop_Struct> *loot_drop_hash;
EQEmu::MemoryMappedFile *base_data_mmf;
EQEmu::MemoryMappedFile *skill_caps_mmf;
EQEmu::MemoryMappedFile *items_mmf;
EQEmu::FixedMemoryHashSet<Item_Struct> *items_hash;
EQEmu::MemoryMappedFile *faction_mmf;
EQEmu::FixedMemoryHashSet<NPCFactionList> *faction_hash;
EQEmu::MemoryMappedFile *loot_table_mmf;
EQEmu::FixedMemoryVariableHashSet<LootTable_Struct> *loot_table_hash;
EQEmu::MemoryMappedFile *loot_drop_mmf;
EQEmu::FixedMemoryVariableHashSet<LootDrop_Struct> *loot_drop_hash;
EQEmu::MemoryMappedFile *base_data_mmf;
};
#endif /*SHAREDDB_H_*/

View File

@ -15,6 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "types.h"
#include "skills.h"

View File

@ -70,15 +70,12 @@
*/
#include "debug.h"
#include "spdat.h"
#include "packet_dump.h"
#include "moremath.h"
#include "item.h"
#include "skills.h"
#include "bodytypes.h"
#include "../common/logsys.h"
#include "../common/logtypes.h"
#include "classes.h"
#include <math.h>
#include "spdat.h"
#ifndef WIN32
#include <stdlib.h>
#include "unix.h"
@ -896,7 +893,7 @@ bool IsHealOverTimeSpell(uint16 spell_id)
bool IsCompleteHealSpell(uint16 spell_id)
{
if (spell_id == 13 || IsEffectInSpell(spell_id, SE_CompleteHeal) ||
IsPercentalHealSpell(spell_id) && !IsGroupSpell(spell_id))
(IsPercentalHealSpell(spell_id) && !IsGroupSpell(spell_id)))
return true;
return false;

View File

@ -16,9 +16,6 @@
#include "string_util.h"
#include <cstring> // for strncpy
#include <stdexcept>
#ifdef _WINDOWS
#include <windows.h>

View File

@ -17,9 +17,10 @@
#define _STRINGUTIL_H_
#include <sstream>
#include <string.h>
#include <vector>
#include <cstdarg>
#include <string.h>
#include "types.h"

View File

@ -15,17 +15,14 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "../common/debug.h"
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <iomanip>
#include "tcp_connection.h"
#include "../common/servertalk.h"
#include "../common/timer.h"
#include "../common/packet_dump.h"
#ifdef FREEBSD //Timothy Whitman - January 7, 2003
#define MSG_NOSIGNAL 0

View File

@ -48,8 +48,6 @@
#include "queue.h"
#include "misc_functions.h"
class BaseTCPServer;
class ServerPacket;
#define TCPConnection_ErrorBufferSize 1024
#define MaxTCPReceiveBuffferSize 524288

View File

@ -1,5 +1,6 @@
#include "debug.h"
#include "tcp_server.h"
#include <stdio.h>
#include <cstdlib>
#include <cstring>

View File

@ -15,7 +15,8 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "../common/debug.h"
// Disgrace: for windows compile
#ifndef WIN32
#include <sys/time.h>
@ -23,8 +24,6 @@
#include <sys/timeb.h>
#endif
#include <iostream>
#include "timer.h"
uint32 current_time = 0;

View File

@ -30,7 +30,7 @@
Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
*/
#define CURRENT_BINARY_DATABASE_VERSION 9059
#define CURRENT_BINARY_DATABASE_VERSION 9062
#define COMPILE_DATE __DATE__
#define COMPILE_TIME __TIME__
#ifndef WIN32

View File

@ -17,18 +17,11 @@
*/
#include "../common/debug.h"
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <iomanip>
#include <time.h>
#include <stdlib.h>
#include <stdarg.h>
#include "worldconn.h"
#include "eqemu_config.h"
#include "md5.h"
#include "database.h"
#include "servertalk.h"
WorldConnection::WorldConnection(EmuTCPConnection::ePacketMode mode, const char *password)

View File

@ -1,539 +0,0 @@
#ShowEQ Import Notes:
# ZERO THE FILE first
# sed 's/0x[0-9a-fA-F]{4}/0x0000/g'
#Unknown Mapping:
#OP_Action2 -> OP_Damage
#OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
#Name Differences:
#OP_CancelInvite -> OP_GroupCancelInvite
#OP_GMFind -> OP_FindPersonRequest
OP_Unknown=0x0000
OP_ExploreUnknown=0x0292 #used for unknown explorer
#world packets
OP_ApproveWorld=0x41b1 # ShowEQ 06/29/05
OP_LogServer=0x4668 # EQEmu 06/29/05
OP_MOTD=0x7fea # EQEmu 06/29/05
OP_SendLoginInfo=0x2792 # EQEmu 06/29/05
OP_DeleteCharacter=0x0920 # ShowEQ 06/29/05
OP_SendCharInfo=0x732c # EQEmu 06/29/05
OP_ExpansionInfo=0x5c78 # EQEmu 06/29/05
OP_CharacterCreate=0x6160 # EQEmu 06/29/05
OP_RandomNameGenerator=0x23d4 # ShowEQ 06/29/05
OP_GuildsList=0x6957 # ShowEQ 06/29/05
OP_ApproveName=0x46b1 # EQEmu 06/29/05
OP_EnterWorld=0x7262 # EQEmu 06/29/05
OP_PostEnterWorld=0x0df0 # EQEmu 06/29/05
OP_World_Client_CRC1=0x254d # ShowEQ 06/29/05
OP_World_Client_CRC2=0x16c9 # ShowEQ 06/29/05
OP_SetChatServer=0x6238 # EQEmu 06/29/05
OP_SetChatServer2=0x6536 # EQEmu 06/29/05
OP_ZoneServerInfo=0x407c # EQEmu 06/29/05
OP_WorldComplete=0x509d # EQEmu 06/29/05
OP_WorldClientReady=0x5e99 # EQEmu 06/29/05 (Guess - Doodman)
OP_WorldUnknown001=0x7510 # EQEmu 06/29/05 (New to 6/29)
OP_SendSystemStats=0x681b # anonymous system stats reporting
OP_WorldLogout=0x7186
OP_ZoneUnavail=0x6d95
OP_WorldLevelTooHigh=0x583b # world->client. Cancels zone in.
OP_CharInacessable=0x28aa # world->client. Cancels zone in.
#OP_InvalidLoginPassword=0x52A4
#Zone in opcodes
OP_ZoneEntry=0x2ec9 # ShowEQ 06/29/05
OP_ZoneInUnknown=0x0000
OP_AckPacket=0x7752 # ShowEQ 06/29/05
OP_NewZone=0x7ac5 # ShowEQ 06/29/05
OP_ReqClientSpawn=0x0e76 # ShowEQ 06/29/05
OP_ZoneSpawns=0x5ee8 # ShowEQ 06/29/05
OP_CharInventory=0x15ff # EQEmu 06/29/05
OP_SetServerFilter=0x7709 # ShowEQ 06/29/05
OP_LockoutTimerInfo=0x7c12 # EQEmu 06/29/05
OP_SendZonepoints=0x775d # EQEmu 06/29/05
OP_SpawnDoor=0x4c24 # ShowEQ 06/29/05
OP_ReqNewZone=0x47c9 # ShowEQ 06/29/05
OP_PlayerProfile=0x75df # ShowEQ 06/29/05
OP_TimeOfDay=0x1580 # ShowEQ 06/29/05
OP_SendAATable=0x367d # ShowEQ 06/29/05
OP_ZoneServerReady=0x0000 #dosent exist in this version
OP_Logout=0x0701 # EQEmu 06/29/05
OP_LogoutReply=0x48c2 # ShowEQ 06/29/05 (OP_Logout)
OP_PreLogoutReply=0x711e #0 len packet sent during logout/zoning
OP_LevelUpdate=0x6d44 # ShowEQ 06/29/05
OP_MobUpdate=0x0000
OP_Stamina=0x74ab # ShowEQ 06/29/05
#Petition Opcodes
OP_PetitionSearch=0x2aec #search term for petition
OP_PetitionSearchResults=0x2aec #(list of?) matches from search
OP_PetitionSearchText=0x0000 #text results of search
OP_Petition=0x251f #0x73cb
OP_PetitionUpdate=0x3813 #guess
OP_PetitionCheckout=0x0000
OP_PetitionCheckIn=0x0000
OP_PetitionQue=0x0000
OP_PetitionUnCheckout=0x0000
OP_PetitionDelete=0x0000
OP_DeletePetition=0x0000
OP_PetitionResolve=0x6ea9 #0x688f # ShowEQ 5/11/05
OP_PDeletePetition=0x0000
OP_PetitionBug=0x0000
OP_PetitionRefresh=0x0000
OP_PetitionCheckout2=0x0000
OP_PetitionViewPetition=0x0000
#Guild Opcodes
OP_ZoneGuildList=0x68AC
OP_GuildMemberList=0x147d # ShowEQ 06/29/05
OP_GuildMemberUpdate=0x4cc7 # ShowEQ 06/29/05
OP_GuildMemberLevelUpdate=0x0000 #dosent exist in this version.
OP_GuildRemove=0x6cce # EQEmu - Doodman (found 8/26/05
OP_GuildPeace=0x0e37 # EQEmu - Doodman (found 8/26/05
OP_GuildWar=0x186d # EQEmu - Doodman (found 8/26/05
OP_GuildLeader=0x1ef1 # EQEmu - Doodman (found 8/26/05)
OP_GuildDemote=0x1f46 # EQEmu - Doodman (found 8/26/05)
OP_GuildMOTD=0x21ed # ShowEQ 06/29/05
OP_SetGuildMOTD=0x475a # EQEmu - Doodman (found 8/26/05)
OP_GetGuildsList=0x7fec # ShowEQ 06/29/05
OP_GuildInvite=0x61d0 # EQEmu - Doodman (found 8/26/05)
OP_GuildPublicNote=0x17a2 # EQEmu - Doodman (found 8/26/05)
OP_GuildDelete=0x5a4d # EQEmu - Doodman (found 8/26/05
OP_GuildInviteAccept=0x0179 # EQEmu - Doodman (found 8/26/05)
OP_GetGuildMOTD=0x3246
OP_GetGuildMOTDReply=0x5B14
OP_GuildManageBanker=0x3d1e
OP_GuildBank=0x0000
#guild opcodes: 549F (clear guild?), 0x0695, 0x0AC0, 0x1864, 0x32cf, 0x4cc7,
# 0x461A, 0x6966, 0x7085
#GM/guide opcodes
OP_GMServers=0x3387 #/servers
OP_GMBecomeNPC=0x7864 #/becomenpc
OP_GMZoneRequest=0x61ff #/zone
OP_GMSearchCorpse=0x7f3e #/searchcorpse
OP_GMHideMe=0x0581 #/hideme
OP_GMGoto=0x69c8 #/goto
OP_GMDelCorpse=0x727a #/delcorpse
OP_GMApproval=0x0000
OP_GMToggle=0x5ce2 #/toggle
OP_GMZoneRequest2=0x0000
OP_GMSummon=0x3383 #/summon
OP_GMEmoteZone=0x3905 #/emotezone
OP_GMFind=0x5e6a #/find
OP_GMKick=0x1cee #/kick
OP_GMNameChange=0x0000
OP_SafePoint=0x0000
OP_Bind_Wound=0x4796
OP_GMTraining=0x613d
OP_GMEndTraining=0x181c
OP_GMTrainSkill=0x3838
OP_GMEndTrainingResponse=0x0a94
OP_Animation=0x0b71 # EQEmu 06/29/05
OP_Taunt=0x5306
OP_Stun=0x7DCF
OP_MoneyUpdate=0x425c
OP_SendAAStats=0x5966 # EQEmu 06/29/05
OP_SendExpZonein=0x0587 # ShowEQ 06/29/05
OP_RespondAA=0x35e8
OP_UpdateAA=0x0000
OP_IncreaseStats=0x0000
OP_ReadBook=0x1496
OP_CombatAbility=0x5e55
OP_Dye=0x773f # ShowEQ 06/29/05
OP_Consume=0x7a83 # ShowEQ 06/29/05
OP_Begging=0x2c81 # ShowEQ 06/29/05
OP_InspectRequest=0x2403
OP_Action2=0x0000 # ShowEQ 06/29/05
OP_BeginCast=0x3990 # ShowEQ 06/29/05
OP_WhoAllRequest=0x5cdd # ShowEQ 06/29/05
OP_ColoredText=0x4bc6 # ShowEQ 06/29/05
OP_Consent=0x1081 # ShowEQ 06/29/05
OP_LFGCommand=0x022f # ShowEQ 06/29/05
OP_LFGGetMatchesRequest=0x6f82 # ShowEQ 06/29/05
OP_LFGAppearance=0x024d
OP_LFGResponse=0x1fe1 # ShowEQ 5/11/05
OP_LFGGetMatchesResponse=0x06c5 # ShowEQ 06/29/05
OP_LootItem=0x2acf # ShowEQ 06/29/05
OP_Bug=0x3eba # ShowEQ 06/29/05
OP_BoardBoat=0x67c9 # ShowEQ 06/29/05
OP_Save=0x6d9b # ShowEQ 06/29/05
OP_Camp=0x2844 # ShowEQ 06/29/05
OP_EndLootRequest=0x7fe4 # ShowEQ 06/29/05
OP_LoadSpellSet=0x403e # ShowEQ 06/29/05
OP_AutoAttack=0x6c47 # ShowEQ 06/29/05
OP_AutoFire=0x6c53
OP_Consider=0x2717 # ShowEQ 06/29/05
OP_Emote=0x55bc # ShowEQ 06/29/05
OP_PetCommands=0x58b2 # ShowEQ 06/29/05
OP_PetBuffWindow=0x4e31
OP_SpawnAppearance=0x18b7 # ShowEQ 06/29/05
OP_DeleteSpawn=0x1a64 # ShowEQ 06/29/05
OP_FormattedMessage=0x42cd # ShowEQ 06/29/05
OP_WhoAllResponse=0x6686 # ShowEQ 06/29/05
OP_AutoAttack2=0x0fa6 # ShowEQ 06/29/05
OP_SetRunMode=0x0342 # ShowEQ 06/29/05
OP_SimpleMessage=0x5a48 # ShowEQ 06/29/05
OP_SaveOnZoneReq=0x2baf # ShowEQ 06/29/05
OP_MoveDoor=0x0ef7 # ShowEQ 06/29/05
OP_SenseHeading=0x5666 # ShowEQ 06/29/05
OP_Buff=0x33dc # ShowEQ 06/29/05
OP_LootComplete=0x20b2 # ShowEQ 06/29/05
OP_EnvDamage=0x0990
OP_Split=0x6a53 # ShowEQ 06/29/05
OP_Surname=0x48fe # ShowEQ 06/29/05
OP_ClearSurname=0x0000
OP_MoveItem=0x7657 # ShowEQ 06/29/05
OP_FaceChange=0x763b # ShowEQ 06/29/05
OP_ItemPacket=0x3397 # ShowEQ 06/29/05
OP_ItemLinkResponse=0x1d43 # ShowEQ 06/29/05
OP_ClientReady=0x5e20 # ShowEQ 06/29/05
OP_ZoneChange=0x60ef # ShowEQ 06/29/05
OP_MemorizeSpell=0x05ac # ShowEQ 06/29/05
OP_ItemLinkClick=0x53e5 # ShowEQ 06/29/05
OP_SwapSpell=0x36b2 # ShowEQ 06/29/05
OP_Forage=0x7c32 # ShowEQ 06/29/05
OP_ConsentResponse=0x6380 # ShowEQ 06/29/05
OP_BazaarSearch=0x524e # ShowEQ 06/29/05
OP_NewSpawn=0x4f11 # ShowEQ 06/29/05
OP_WearChange=0x601d # ShowEQ 06/29/05
OP_Action=0x4513 # ShowEQ 06/29/05
OP_SpecialMesg=0x5ef7 # ShowEQ 06/29/05
OP_Bazaar=0x0000
OP_LeaveBoat=0x7187 # ShowEQ 06/29/05
OP_Weather=0x65ca # ShowEQ 06/29/05
OP_LFPGetMatchesRequest=0x45d0 # ShowEQ 06/29/05
OP_Illusion=0x7441 # ShowEQ 06/29/05
OP_TargetMouse=0x2274 # ShowEQ 06/29/05
OP_InspectAnswer=0x2dd6 # ShowEQ 06/29/05
OP_GMKill=0x692c # ShowEQ 06/29/05
OP_MoneyOnCorpse=0x2fca # ShowEQ 06/29/05
OP_ClickDoor=0x700d # ShowEQ 06/29/05
OP_LootRequest=0x2316 # ShowEQ 06/29/05
OP_YellForHelp=0x2e20 # ShowEQ 06/29/05
OP_ManaChange=0x0b2d # ShowEQ 06/29/05
OP_ConsentDeny=0x4e8c # ShowEQ 06/29/05
OP_LFPCommand=0x35a6 # ShowEQ 06/29/05
OP_RandomReply=0x6cd5 # ShowEQ 06/29/05
OP_DenyResponse=0x7c66 # ShowEQ 06/29/05
OP_ConsiderCorpse=0x673c # ShowEQ 06/29/05
OP_CorpseDrag=0x50c0 #
OP_CorpseDrop=0x7c7c #
OP_ConfirmDelete=0x28f2 # ShowEQ 06/29/05
OP_MobHealth=0x3d2d # ShowEQ 06/29/05
OP_SkillUpdate=0x6a93 # ShowEQ 06/29/05
OP_RandomReq=0x21e0 # ShowEQ 06/29/05
OP_CastSpell=0x4839 # ShowEQ 06/29/05
OP_ClientUpdate=0x14cb # ShowEQ 06/29/05
OP_MobUpdate=0x0000 #not used anymore, here for backwards compat
OP_Report=0x0375 # ShowEQ 06/29/05
OP_GroundSpawn=0x736b # ShowEQ 06/29/05
OP_TargetCommand=0x6563 #0x0dfe # ShowEQ 06/29/05
OP_TargetHoTT=0x3ef6
OP_LFPGetMatchesResponse=0x63fe # ShowEQ 06/29/05
OP_Jump=0x4dbc # ShowEQ 06/29/05
OP_ExpUpdate=0x5ecd # ShowEQ 06/29/05
OP_AAAction=0x3af4 # ShowEQ 06/29/05
OP_Death=0x5188 # ShowEQ 06/29/05
OP_BecomeCorpse=0x128c
OP_GMLastName=0x0c81 # ShowEQ 06/29/05
OP_InitialMobHealth=0x2ecc # ShowEQ 06/29/05
OP_Mend=0x14ef # ShowEQ 06/29/05
OP_MendHPUpdate=0x1ffa # ShowEQ 5/11/05
OP_Feedback=0x224d # ShowEQ 06/29/05
OP_TGB=0x5e51 # ShowEQ 06/29/05
OP_InterruptCast=0x0db3
OP_Damage=0x1848 # ShowEQ 06/29/05 (OP_Action2)
OP_ChannelMessage=0x1004 # ShowEQ 06/29/05 (OP_CommonMessage)
OP_LevelAppearance=0x358e
OP_MultiLineMsg=0x0000
OP_Charm=0x10a1
OP_DeleteSpell=0x3fe6
OP_ApproveZone=0x0000
OP_Assist=0x5D02
OP_AugmentItem=0x539b
OP_BazaarInspect=0x0000
OP_AAExpUpdate=0x6dd8 # ShowEQ 06/29/05
OP_ClientError=0x0000
OP_DeleteItem=0x1c4a
OP_DeleteCharge=0x0841
OP_ControlBoat=0x0000
OP_DumpName=0x0000
OP_FeignDeath=0x2ad8
OP_Fishing=0x0b36
OP_Heartbeat=0x0000
OP_InstillDoubt=0x389e
OP_ItemName=0x0000
OP_LDoNButton=0x0000
OP_LDoNOpen=0x083b
OP_MoveCoin=0x1dd9
OP_ReloadUI=0x0000
OP_ZonePlayerToBind=0x385e # FNW Discovered on Feb 9, 2007
OP_Translocate=0x78c1
OP_Sacrifice=0x5f62
OP_ApplyPoison=0x4298
#bazaar trader stuff stuff:
#become and buy from
#Server->Client: [ Opcode: OP_Unknown (0x2403) Size: 8 ]
# 0: 46 01 00 00 39 01 00 00 | F...9...
OP_TraderDelItem=0x0da9
OP_BecomeTrader=0x66f9
OP_TraderShop=0x19d8
OP_TraderItemUpdate=0x0000
OP_Trader=0x0681
OP_ShopItem=0x0000
OP_TraderBuy=0x0f8e # ShowEQ 06/29/05
OP_Barter=0x7460
#pc/npc trading
OP_TradeRequest=0x372f # ShowEQ 06/29/05
OP_TradeAcceptClick=0x0065 # ShowEQ 06/29/05
OP_TradeRequestAck=0x4048 # ShowEQ 06/29/05
OP_TradeCoins=0x34c1
OP_FinishTrade=0x6014
OP_CancelTrade=0x2dc1 # ShowEQ 06/29/05
OP_TradeMoneyUpdate=0x3e63 #not sure
#merchant crap
OP_ShopPlayerSell=0x0e13 # ShowEQ 06/29/05
OP_ShopEnd=0x7e03 # ShowEQ 06/29/05
OP_ShopEndConfirm=0x0000
OP_ShopPlayerBuy=0x221e
OP_ShopRequest=0x3c4b # ShowEQ 06/29/05
OP_ShopDelItem=0x0000 #0x0da9 maybe, 16 bytes though
#tradeskill stuff:
OP_ClickObject=0x0f47 # ShowEQ 06/29/05
OP_ClickObjectAction=0x6937 # EQEMu 06/29/05
OP_RecipeDetails=0x0353 # EQEMu 06/29/05
OP_RecipesFavorite=0x23f0
OP_RecipesSearch=0x31f8 # EQEmu 06/29/05
OP_RecipeReply=0x4ea2 # EQEmu 06/29/05
OP_RecipeAutoCombine=0x7822
OP_TradeSkillCombine=0x0b40 # ShowEQ 06/29/05
OP_RequestDuel=0x28e1
OP_DuelResponse=0x2e78
OP_DuelResponse2=0x3bad #when accepted
OP_RezzComplete=0x60fa
OP_RezzRequest=0x417a
OP_RezzAnswer=0x6219
OP_SafeFallSuccess=0x5309
OP_Shielding=0x0000
OP_TargetReject=0x0000
OP_TestBuff=0x0000
OP_Track=0x5205 # ShowEQ 06/29/05
OP_TrackTarget=0x71ae
OP_TrackUnknown=0x74e1 #size 0 right after OP_Track
#Tribute Packets:
OP_OpenGuildTributeMaster=0x60b6 #open guild tribute master window
OP_OpenTributeMaster=0x512e #open tribute master window
OP_OpenTributeReply=0x0000 #reply to open request
OP_SelectTribute=0x625d #clicking on a tribute, and text reply
OP_TributeItem=0x6f6c #donating an item
OP_TributeMoney=0x27b3 #donating money
OP_TributeNPC=0x0000 #seems to be missing now
OP_TributeToggle=0x2688 #activating/deactivating tribute
OP_TributeTimer=0x4665 #a 4 byte tier update, 10 minutes for seconds
OP_TributePointUpdate=0x6463 #16 byte point packet
OP_TributeUpdate=0x5639 # ShowEQ 06/29/05
OP_GuildTributeInfo=0x5e3d # EQEmu 06/29/05
OP_TributeInfo=0x152d # EQEmu 06/29/05
OP_SendGuildTributes=0x5e3a # request packet, 4 bytes
OP_SendTributes=0x067a # request packet, 4 bytes, migth be backwards
OP_CloseTributeMaster=0x7f25 #sent by client when they close window
#Adventure packets:
OP_LeaveAdventure=0x0c0d
OP_AdventureFinish=0x3906
OP_AdventureInfoRequest=0x2aaf #right click adventure recruiter
OP_AdventureInfo=0x1db5 #text reply to right click
OP_AdventureRequest=0x43fd
OP_AdventureDetails=0x3f26
OP_AdventureData=0x0677
OP_AdventureUpdate=0x64ac
OP_AdventureMerchantRequest=0x0950
OP_AdventureMerchantResponse=0x4416
OP_AdventureMerchantPurchase=0x413d
OP_AdventureMerchantSell=0x0097
OP_AdventurePointsUpdate=0x420a #not sure, followed purchase
OP_AdventureStatsRequest=0x5fc7
OP_AdventureStatsReply=0x56cd
OP_AdventureLeaderboardRequest=0x230a
OP_AdventureLeaderboardReply=0x0d0f
# request stats: 0x5fc7, reply 0x56cd
# request leaderboard: 0x230a, reply 0x0d0f
#Group Opcodes
OP_GroupDisband=0x4033 # ShowEQ 06/29/05
OP_GroupInvite=0x3853 # ShowEQ 06/29/05
OP_GroupFollow=0x1b48 # ShowEQ 06/29/05
OP_GroupUpdate=0x66ba # ShowEQ 06/29/05
OP_GroupAcknowledge=0x0797
OP_GroupCancelInvite=0x42c9 # ShowEQ 06/29/05
OP_GroupDelete=0x0000
OP_GroupFollow2=0x0000 #used with GroupInvite2
OP_GroupInvite2=0x1f27 #this is sometimes sent instead of OP_GroupInvite
OP_CancelInvite=0x0000
OP_RaidJoin=0x0000 # ShowEQ 06/29/05
OP_RaidInvite=0x1f21 # ShowEQ 06/29/05
OP_RaidUpdate=0x1974 # EQEmu 06/29/05
OP_ZoneComplete=0x0000
OP_ItemLinkText=0x0000
OP_ClearObject=0x8258
OP_DisciplineUpdate=0x7180
OP_DisciplineTimer=0x53df
OP_LocInfo=0x0000
OP_FindPersonRequest=0x3c41 # ShowEQ 06/29/05
OP_FindPersonReply=0x5711
OP_ForceFindPerson=0x0000
OP_LoginComplete=0x0000
OP_Sound=0x4a1d
#OP_Zone_MissingName01=0x0000 #remove on recompile
OP_MobRename=0x3230
OP_BankerChange=0x6a5b
#Rogue packets
OP_SenseTraps=0x24ab # ShowEQ 06/29/05
OP_PickPocket=0x4a2a
OP_DisarmTraps=0x0000
OP_Disarm=0x17d9
OP_Hide=0x6f64 # ShowEQ 06/29/05
OP_Sneak=0x4312 # ShowEQ 06/29/05
#Task packets
#task complete related: 0x54eb (24 bytes), 0x4c8c (8 bytes), 0x6a1d (4 bytes)
OP_TaskActivityComplete=0x54eb
OP_CompletedTasks=0x53c4 # ShowEQ 06/29/05
OP_TaskDescription=0x682d # ShowEQ 06/29/05
OP_TaskActivity=0x3ba8 # ShowEQ 06/29/05
OP_TaskMemberList=0x09b6 #not sure
OP_OpenNewTasksWindow=0x5e7c #combined with OP_AvaliableTask I think
OP_AvaliableTask=0x0000
OP_AcceptNewTask=0x207f
OP_TaskHistoryRequest=0x3274
OP_TaskHistoryReply=0x009c
OP_CancelTask=0x4c8c
OP_DeclineAllTasks=0x207f #not sure, 12 bytes
OP_RequestClientZoneChange=0x1235
OP_PurchaseLeadershipAA=0x07f1
OP_UpdateLeadershipAA=0x3eec
OP_LeadershipExpUpdate=0x7416
OP_LeadershipExpToggle=0x17bf
OP_GroupUpdateLeaderAA=0x4c3f
OP_MarkNPC=0x5b37
OP_ClearNPCMarks=0x1794
OP_DoGroupLeadershipAbility=0x4ffe
OP_DelegateAbility=0x56eb
#The following 4 Opcodes are for SoF only:
OP_FinishWindow=0x0000 #Trevius 03/15/09
OP_FinishWindow2=0x0000 #Trevius 03/15/09
OP_ItemVerifyRequest=0x0000 #Trevius 03/15/09
OP_ItemVerifyReply=0x0000 #Trevius 03/15/09
#discovered opcodes not yet used:
OP_CrashDump=0x6d5d
OP_PlayMP3=0x0000
OP_FriendsWho=0x41db
OP_MoveLogRequest=0x78e8 #gone I think
OP_MoveLogDisregard=0x0000 #gone I think
OP_ReclaimCrystals=0x12fd
OP_CrystalCountUpdate=0x0000
OP_DynamicWall=0x0000
OP_CustomTitles=0x2a28 # ShowEQ 06/29/05
OP_RequestTitles=0x5eba # EQEmu 06/29/05
OP_SendTitleList=0x3e89 # EQEmu 06/29/05
OP_SetTitle=0x1f22 # EQEmu 06/29/05
OP_SetTitleReply=0x5eab # EQEmu 06/29/05
OP_Bandolier=0x6f0c
OP_PotionBelt=0x0719
OP_OpenDiscordMerchant=0x0000 #8 bytes
OP_DiscordMerchantInventory=0x0000 #long item packet
OP_GiveMoney=0x56d4 #16 bytes, pp, gp, sp, cp.
OP_OnLevelMessage=0x1dde
OP_PopupResponse=0x3816
OP_RequestKnowledgeBase=0x7584
OP_KnowledgeBase=0x4a52
OP_PlayerUnderWorld=0x46d9
OP_PVPStats=0x5cc0
OP_PVPLeaderBoardRequest=0x61d2
OP_PVPLeaderBoardReply=0x1a59
OP_PVPLeaderBoardDetailsRequest=0x06a2
OP_PVPLeaderBoardDetailsReply=0x246a
OP_WeaponEquip1=0x6c5e
OP_WeaponEquip2=0x63da
OP_WeaponUnequip2=0x381d
OP_VoiceMacroIn=0x2866
OP_VoiceMacroOut=0x2ec6
#named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 # EQEmu 06/29/05
OP_Some6ByteHPUpdate=0x0000 #seems to happen when you target group members
OP_SomeItemPacketMaybe=0x497c # EQEmu 06/29/05
OP_QueryResponseThing=0x6379
OP_FloatListThing=0x7510 # EQEmu 06/29/05
#Login opcodes
OP_SessionReady=0x0001
OP_Login=0x0002
OP_ServerListRequest=0x0004
OP_PlayEverquestRequest=0x000d
OP_PlayEverquestResponse=0x0021
OP_ChatMessage=0x0016
OP_LoginAccepted=0x0017
OP_ServerListResponse=0x0018
OP_Poll=0x0029
OP_EnterChat=0x000f
OP_PollResponse=0x0011
#raw opcodes
OP_RAWSessionRequest=0x0000
OP_RAWSessionResponse=0x0000
OP_RAWCombined=0x0000
OP_RAWSessionDisconnect=0x0000
OP_RAWKeepAlive=0x0000
OP_RAWSessionStatRequest=0x0000
OP_RAWSessionStatResponse=0x0000
OP_RAWPacket=0x0000
OP_RAWFragment=0x0000
OP_RAWOutOfOrderAck=0x0000
OP_RAWAck=0x0000
OP_RAWAppCombined=0x0000
OP_RAWOutOfSession=0x0000
#mail opcodes
OP_Command=0x0000
OP_MailboxHeader=0x0000
OP_MailHeader=0x0000
OP_MailBody=0x0000
OP_NewMail=0x0000
OP_SentConfirm=0x0000
#we need to document the differences between these packets to make identifying them easier
OP_MobHealth=0x3d2d # ShowEQ 06/29/05
OP_HPUpdate=0x217b # ShowEQ 06/29/05
OP_Some3ByteHPUpdate=0x0000 #initial HP update for mobs
OP_InitialHPUpdate=0x7ac2 # ShowEQ 06/29/05
#remove these
#junk
OP_0x0193=0x0000
OP_0x0347=0x0000
OP_ConsumeAmmo=0x0000
OP_EmoteAnim=0x0000
OP_Deny=0x0000
OP_SetDataRate=0x0000

View File

@ -19,7 +19,7 @@ OP_ApproveWorld=0x7499
OP_LogServer=0x7ceb
OP_SendCharInfo=0x00d2
OP_ExpansionInfo=0x590d
OP_GuildsList=0x0000
OP_GuildsList=0x507a
OP_EnterWorld=0x578f
OP_PostEnterWorld=0x6259
OP_World_Client_CRC1=0x12cc
@ -94,6 +94,8 @@ OP_ClearBlockedBuffs=0x34cb
OP_WorldObjectsSent=0x5ae2
OP_SendExpZonein=0x5f8e
OP_SendAATable=0x66b5
OP_ClearAA=0x0f50
OP_ClearLeadershipAbilities=0x6da5
OP_RespondAA=0x7a27
OP_UpdateAA=0x66f0
OP_SendAAStats=0x43c8
@ -102,7 +104,7 @@ OP_ExpUpdate=0x20ed
OP_HPUpdate=0x2828
OP_ManaChange=0x5467
OP_TGB=0x0876
OP_SpecialMesg=0x083
OP_SpecialMesg=0x0083
OP_GuildMemberList=0x12a6
OP_GuildMOTD=0x3e13
OP_CharInventory=0x5ca6
@ -111,7 +113,7 @@ OP_ClientUpdate=0x7dfc
OP_ClientReady=0x345d
OP_SetServerFilter=0x444d
# Guild Opcodes - Disabled until crashes are resolved in RoF
# Guild Opcodes
OP_GetGuildMOTD=0x36e0
OP_GetGuildMOTDReply=0x4f1f
OP_GuildMemberUpdate=0x69b9
@ -119,7 +121,6 @@ OP_GuildInvite=0x7099
OP_GuildRemove=0x1444
OP_GuildPeace=0x67e3
OP_SetGuildMOTD=0x0b0b
OP_GuildList=0x6279
OP_GuildWar=0x1ffb
OP_GuildLeader=0x7e09
OP_GuildDelete=0x3708
@ -210,10 +211,10 @@ OP_ChannelMessage=0x2b2d
OP_Assist=0x4478
OP_AssistGroup=0x27f8
OP_MoveCoin=0x0bcf
OP_ZonePlayerToBind=0x0ecb
OP_ZonePlayerToBind=0x08d8
OP_KeyRing=0x6857
OP_WhoAllRequest=0x674b
OP_WhoAllResponse=0x51b8
OP_WhoAllResponse=0x578c
OP_FriendsWho=0x3956
OP_ConfirmDelete=0x43a3
OP_Logout=0x4ac6
@ -229,10 +230,10 @@ OP_TargetMouse=0x075d
OP_MobHealth=0x37b1
OP_InitialMobHealth=0x0000 # Unused?
OP_TargetHoTT=0x0272
OP_XTargetResponse=0x672f
OP_XTargetRequest=0x45be
OP_XTargetAutoAddHaters=0x792c
OP_TargetBuffs=0x4f4b
OP_XTargetResponse=0x4d59
OP_XTargetRequest=0x3763
OP_XTargetAutoAddHaters=0x672f
OP_BuffCreate=0x3377
OP_BuffRemoveRequest=0x64f2
OP_DeleteSpawn=0x7280
@ -255,9 +256,9 @@ OP_MoveDoor=0x08e8
OP_RemoveAllDoors=0x700c
OP_EnvDamage=0x51fd
OP_BoardBoat=0x4211
OP_Forage=0x5306
OP_LeaveBoat=0x7617
OP_ControlBoat=0x0ae7
OP_Forage=0x5306
OP_SafeFallSuccess=0x2219
OP_RezzComplete=0x760d
OP_RezzRequest=0x3c21
@ -285,19 +286,19 @@ OP_ReadBook=0x72df
OP_Dye=0x23b9
OP_InterruptCast=0x048c
OP_AAAction=0x424e
OP_LeadershipExpToggle=0x6c55
OP_LeadershipExpToggle=0x74bd
OP_LeadershipExpUpdate=0x2797
OP_PurchaseLeadershipAA=0x0026
OP_UpdateLeadershipAA=0x026
OP_MarkNPC=0x5a58
OP_MarkRaidNPC=0x74bd #unimplemented
OP_PurchaseLeadershipAA=0x6c55
OP_UpdateLeadershipAA=0x0026
OP_MarkNPC=0x1fb5
OP_MarkRaidNPC=0x5a58 #unimplemented
OP_ClearNPCMarks=0x2003
OP_ClearRaidNPCMarks=0x20d3 #unimplemented
OP_DelegateAbility=0x76b8
OP_SetGroupTarget=0x2814
OP_DelegateAbility=0x4c9d
OP_SetGroupTarget=0x026
OP_Charm=0x5d92
OP_Stun=0x36a4
OP_SendFindableNPCs=0x7e62
OP_SendFindableNPCs=0x4613
OP_FindPersonRequest=0x5cea
OP_FindPersonReply=0x7e58
OP_Sound=0x1a30
@ -306,7 +307,7 @@ OP_LevelAppearance=0x3bc9
OP_Translocate=0x6580
OP_Sacrifice=0x1821
OP_PopupResponse=0x08a6
OP_OnLevelMessage=0x4d6e
OP_OnLevelMessage=0x575b
OP_AugmentInfo=0x0afb
OP_Petition=0x3de3
OP_SomeItemPacketMaybe=0x747c
@ -316,7 +317,7 @@ OP_PVPLeaderBoardReply=0x071f
OP_PVPLeaderBoardDetailsRequest=0x3707
OP_PVPLeaderBoardDetailsReply=0x25b7
OP_RestState=0x000f
OP_RespawnWindow=0x28bc
OP_RespawnWindow=0x0ecb
OP_LDoNButton=0x5327
OP_SetStartCity=0x6326
OP_VoiceMacroIn=0x17fd
@ -334,13 +335,13 @@ OP_NPCMoveUpdate=0x5892
OP_CameraEffect=0x127f
OP_SpellEffect=0x5936
OP_RemoveNimbusEffect=0x7b1e
OP_AltCurrency=0x62ab
OP_AltCurrencyMerchantRequest=0x61cb
OP_AltCurrencyMerchantReply=0x5409
OP_AltCurrencyPurchase=0x0165
OP_AltCurrencySell=0x74ec
OP_AltCurrencySellSelection=0x3788
OP_AltCurrencyReclaim=0x3899
OP_AltCurrency=0x6b6d
OP_AltCurrencyMerchantRequest=0x5409
OP_AltCurrencyMerchantReply=0x27a2
OP_AltCurrencyPurchase=0x3788
OP_AltCurrencySell=0x40b6
OP_AltCurrencySellSelection=0x532a
OP_AltCurrencyReclaim=0x0339
OP_CrystalCountUpdate=0x467f
OP_CrystalCreate=0x7aee
OP_CrystalReclaim=0x2439
@ -348,7 +349,7 @@ OP_Untargetable=0x053c
OP_IncreaseStats=0x70a3
OP_Weblink=0x6f4b
OP_OpenContainer=0x0000
OP_Marquee=0x0000
OP_Marquee=0x502e
OP_ItemRecastDelay=0x15a9
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
@ -365,10 +366,10 @@ OP_DzExpeditionInfo=0x4f7e
OP_DzExpeditionList=0x9119
OP_DzMemberStatus=0xb2e3
OP_DzLeaderStatus=0x32f0
OP_DzExpeditionEndsWarning=0x7e94
OP_DzExpeditionEndsWarning=0x383c
OP_DzMemberList=0x3de9
OP_DzCompass=0x3e0e
OP_DzChooseZone=0x0000
OP_DzChooseZone=0x0b7d
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
@ -432,7 +433,7 @@ OP_ItemVerifyRequest=0x189c
OP_ItemVerifyReply=0x097b
# merchant stuff
OP_ShopPlayerSell=0x0000
OP_ShopPlayerSell=0x791b
OP_ShopRequest=0x4fed
OP_ShopEnd=0x30a8
OP_ShopEndConfirm=0x3196
@ -443,11 +444,11 @@ OP_ShopDelItem=0x724f
OP_ClickObject=0x4aa1
OP_ClickObjectAction=0x0c1e
OP_ClearObject=0x7a11
OP_RecipeDetails=0x40d7
OP_RecipeDetails=0x6e02
OP_RecipesFavorite=0x71b1
OP_RecipesSearch=0x1db6
OP_RecipeReply=0x6e02
OP_RecipeAutoCombine=0x6261
OP_RecipesSearch=0x6290
OP_RecipeReply=0x1db6
OP_RecipeAutoCombine=0x40d7
OP_TradeSkillCombine=0x579a
# Tribute Packets:
@ -499,7 +500,7 @@ OP_GroupDisbandOther=0x74da
OP_GroupLeaderChange=0x21b4
OP_GroupRoles=0x70e2
OP_GroupMakeLeader=0x4229
OP_DoGroupLeadershipAbility=0x1fb5
OP_DoGroupLeadershipAbility=0x6eae
OP_GroupLeadershipAAUpdate=0x02cf
OP_GroupMentor=0x3342
OP_InspectBuffs=0x486c
@ -585,7 +586,7 @@ OP_LoginComplete=0x0000
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000
OP_PlayMP3=0x0000
OP_PlayMP3=0x5770
OP_ReclaimCrystals=0x0000
OP_DynamicWall=0x0000
OP_OpenDiscordMerchant=0x0000
@ -600,7 +601,7 @@ OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000
OP_Some6ByteHPUpdate=0x0000 seems to happen when you target group members
OP_Some6ByteHPUpdate=0x0000 #seems to happen when you target group members
OP_QueryResponseThing=0x0000
@ -609,9 +610,9 @@ OP_QueryResponseThing=0x0000
#OP_LoginUnknown2=0x040b # OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 search term for petition
OP_PetitionSearchResults=0x0000 (list of?) matches from search
OP_PetitionSearchText=0x0000 text results of search
OP_PetitionSearch=0x0000 #search term for petition
OP_PetitionSearchResults=0x0000 #(list of?) matches from search
OP_PetitionSearchText=0x0000 #text results of search
OP_PetitionUpdate=0x0000
OP_PetitionCheckout=0x0000

View File

@ -1,3 +1,3 @@
# Input and Output txt and conf files.
# Input and Output txt and conf files
*.txt
*.conf

View File

@ -71,32 +71,32 @@ RoF2 Built May 10 2013 23:30:08
0x6d9d
0x2538
0x0017
0x017
0x017
0x691a
0x0520
0x200f
0x65ab OP_WhoAllRequest
0x674b
0x65ab
0x674b OP_WhoAllRequest
0x6a02
0x0e48
0x12a6 OP_GuildMemberList
0x0eae
0x2921
0x7056
0x507a OP_GuildList
0x6279
0x507a
0x6279 OP_GuildList
0x5a26
0x5b51
0x0bad
0x59ad
0x2264
0x004c OP_SkillUpdate
0x04c OP_ShopPlayerBuy
0x0ddd
0x004c
0x04c OP_SkillUpdate
0x0ddd OP_ShopPlayerBuy
0x4101
0x5f03 OP_Petition
0x5f03
0x3de3
0x1901 OP_ShopPlayerSell
0x1901 OP_Petition
0x791b
0x3a5d
0x7013
@ -190,7 +190,7 @@ RoF2 Built May 10 2013 23:30:08
0x4466
0x1287 OP_CastSpell
0x5467 OP_ManaChange
0x43af OP_ManaChange
0x43af OP_ColoredText
0x6a0d
0x217c OP_MemorizeSpell
0x260a OP_SenseHeading
@ -207,18 +207,18 @@ RoF2 Built May 10 2013 23:30:08
0x2acd
0x7c6d
0x6618
0x6c65
0x6c65 OP_GroupInvite2
0x32c2 OP_CancelInvite
0x2a50 OP_GroupFollow2
0x2060 OP_Jump
0x31f4
0x32c2 OP_GroupInvite2
0x2a50 OP_CancelInvite
0x2060 OP_GroupFollow2
0x31f4 OP_Jump
0x4420
0x1256
0x4d38
0x50f5
0x79c5 OP_GMHideMe
0x2fab
0x57a5
@ -239,7 +239,7 @@ RoF2 Built May 10 2013 23:30:08
0x2eb3
0x3db3
0x4008
0x373b OP_Emote
0x7280 OP_DeleteSpawn
0x4bc2
@ -518,8 +518,9 @@ RoF2 Built May 10 2013 23:30:08
0x728a
0x5232
0x77bd
0x70c0
0x633c OP_ItemLinkResponse
0x70c0 OP_ItemLinkResponse
0x633c
0x63eb
0x4765
0x6290
@ -559,22 +560,20 @@ RoF2 Built May 10 2013 23:30:08
0x2b10
0x4d09
0x0083 OP_SpecialMesg
0x083 OP_TaskDescription
0x3714 OP_TaskActivity
0x08d3 OP_CancelTask
0x39f0
0x5f7a OP_ItemScriptAdjustment
0x006a
0x06a
0x3714 OP_TaskDescription
0x08d3 OP_TaskActivity
0x39f0 OP_CancelTask
0x5f7a
0x006a OP_ItemScriptAdjustment
0x7465
0x31c0
0x14ba
0x25e0
0x62a0
0x407a
0x7c88 OP_WhoAllResponse
0x7c88
0x51b8
0x578c
0x578c OP_WhoAllResponse
0x1197
0x2dd3
0x333a
@ -629,16 +628,16 @@ RoF2 Built May 10 2013 23:30:08
0x6259 OP_PostEnterWorld
0x0f70
0x00d1
0x0d1
0x0d1
0x1eac
0x1b54
0x5e23
0x7910
0x152e
0x7555
0x05ce OP_GroupFollow
0x1649 OP_GroupInvite
0x6110
0x05ce
0x1649 OP_GroupFollow
0x6110 OP_GroupInvite
0x0641
0x578f OP_EnterWorld
0x6cb8
@ -755,7 +754,7 @@ RoF2 Built May 10 2013 23:30:08
0x6368
0x6192
0x3aa4
0x502e
0x502e OP_Marquee
0x1b01 OP_AdventureUpdate
0x0f24
0x1015
@ -831,61 +830,62 @@ RoF2 Built May 10 2013 23:30:08
0x150b
0x11e3
0x1ad3
0x59ca
0x4701 OP_DzAddPlayer
0x1abc OP_DzRemovePlayer
0x405b OP_DzSwapPlayer
0x543d OP_DzMakeLeader
0x14c6 OP_DzPlayerList
0x7f4b OP_DzJoinExpeditionConfirm
0x1950 OP_DzJoinExpeditionReply
0x59ca OP_DzAddPlayer
0x4701 OP_DzRemovePlayer
0x1abc OP_DzSwapPlayer
0x405b OP_DzMakeLeader
0x543d OP_DzPlayerList
0x14c6 OP_DzJoinExpeditionConfirm
0x7f4b OP_DzJoinExpeditionReply
0x1950
0x64b5
0x0398
0x7b68 OP_DzListTimers
0x4f7e
0x9119 OP_DzExpeditionInfo
0x205f OP_DzExpeditionList
0xb2e3 OP_DzQuit
0x32f0 OP_DzMemberStatus
0x3de9 OP_DzLeaderStatus
0x5ae4 OP_DzMemberList
0x4d6e
0x4fd0 OP_OnLevelMessage
0x0398 OP_DzListTimers
0x7b68
0x4f7e OP_DzExpeditionInfo
0x9119 OP_DzExpeditionList
0x205f OP_DzQuit
0xb2e3 OP_DzMemberStatus
0x32f0 OP_DzLeaderStatus
0x3de9 OP_DzMemberList
0x5ae4
0x4d6e OP_OnLevelMessage
0x4fd0
0x575b
0x7e94
0x5189 OP_DzExpeditionEndsWarning
0x383c OP_BankerChange
0x791e
0x5c74 OP_RecipesFavorite
0x71b1
0x7e94 OP_DzExpeditionEndsWarning
0x5189
0x383c
0x791e OP_BankerChange
0x5c74
0x71b1 OP_RecipesFavorite
0x20ab
0x025f
0x214a OP_PopupResponse
0x08a6 OP_ItemRecastDelay
0x15a9 OP_PVPLeaderBoardDetailsRequest
0x3707 OP_PVPLeaderBoardRequest
0x04aa OP_PVPLeaderBoardDetailsReply
0x25b7 OP_PVPLeaderBoardReply
0x071f
0x214a
0x08a6 OP_PopupResponse
0x15a9 OP_ItemRecastDelay
0x3707 OP_PVPLeaderBoardDetailsRequest
0x04aa OP_PVPLeaderBoardRequest
0x25b7 OP_PVPLeaderBoardDetailsReply
0x071f OP_PVPLeaderBoardReply
0x2dee
0x4e62
0x0c91
0x18d3 OP_Weblink
0x6f4b OP_PVPStats
0x4b15
0x18d3
0x6f4b OP_Weblink
0x4b15 OP_PVPStats
0x6755
0x5c32
0x5770
0x5770 OP_PlayMP3
0x7425
0x5eed
0x574e
0x11b4
0x4ed6
0x0d9f
0x7d23 OP_ClearSurname
0x3fb0
0xc693 OP_RemoveNimbusEffect
0x7b1e
0x7d23
0x3fb0 OP_ClearSurname
0xc693
0x7b1e OP_RemoveNimbusEffect
0x20ae
0x0727
0x3771
@ -913,8 +913,7 @@ RoF2 Built May 10 2013 23:30:08
0x756a
0x7745
0x039d
0x0f50
0x0f50 OP_ClearAA
0x66b5 OP_SendAATable
0x0afb OP_AugmentInfo
0x10f6
@ -985,7 +984,7 @@ RoF2 Built May 10 2013 23:30:08
0x5b72 OP_AdventureMerchantPurchase
0x2f9b OP_AdventureMerchantSell
0x3e47 OP_AdventureMerchantResponse
0x0b7d
0x0b7d OP_DzChooseZone
0x2818
0x35bd
0x51df
@ -1071,7 +1070,7 @@ RoF2 Built May 10 2013 23:30:08
0x4085
0x1507
0x5d93
0x1669
0x1669 OP_ResetAA
0x4664
0x312d
0x2215
@ -1096,16 +1095,16 @@ RoF2 Built May 10 2013 23:30:08
0x2b37 OP_ShroudRequestStats
0x6c04 OP_ShroudRespondStats
0x1cd0 OP_ShroudSelect
0x79da
0x79da OP_ShroudSelectCancel
0x7806
0x541d OP_ShroudProgress
0x3823
0x3823 OP_ShroudProgress2
0x6562 OP_Shroud
0x4b25
0x2507
0x3acc
0x006e
0x06e
0x06e
0x0728
0x66cd
0x3c54
@ -1133,7 +1132,7 @@ RoF2 Built May 10 2013 23:30:08
0x6b0b
0x555a
0x7786
0x67e8
0x67e8 OP_ShroudRemove
0x6381
0x5628
0xb52f
@ -1148,7 +1147,7 @@ RoF2 Built May 10 2013 23:30:08
0x30e5
0x618c
0x58e6
0x1456
0x1456 OP_ShroudUnknown1
0x053c OP_Untargetable
0x71da
0x333f
@ -1167,7 +1166,7 @@ RoF2 Built May 10 2013 23:30:08
0x7631
0x298e
0x003c
0x03c
0x03c
0x0b0f
0x5a72
0x0767
@ -1180,43 +1179,43 @@ RoF2 Built May 10 2013 23:30:08
0x7707
0x3fb2
0x289e
0x3342
0x5892 OP_GroupMentor
0x189c OP_NPCMoveUpdate
0x097b OP_ItemVerifyRequest
0x2115 OP_ItemVerifyReply
0x3342 OP_GroupMentor
0x5892 OP_NPCMoveUpdate
0x189c OP_ItemVerifyRequest
0x097b OP_ItemVerifyReply
0x2115
0x6411
0x6471
0x134a
0x1304
0x5a79
0x5a79 OP_ShieldGroup
0x2dde
0x7d50
0x1d47
0x10ec
0x000f
0x00f OP_RestState
0x000f OP_RestState
0x00f
0x0f
0x465b
0x2289 OP_ItemViewUnknown
0x465b OP_ItemViewUnknown
0x2289
0x023b
0x4223
0x7261
0x2af9
0x19aa
0x66dd OP_GMTrainSkillConfirm
0x4b64
0x66dd
0x4b64 OP_GMTrainSkillConfirm
0x319e
0x1af3
0x449c
0x8582 #OP_LoginUnknown1
0x4b8d #OP_LoginUnknown2
0x298d
0x8582
0x4b8d #OP_LoginUnknown1
0x298d #OP_LoginUnknown2
0x06c8
0x4f93
0x412d
0x001f
0x01f
0x01f
0x60f6
0x1a9e
0x798e
@ -1249,8 +1248,8 @@ RoF2 Built May 10 2013 23:30:08
0x14ac
0x0d92
0x0001
0x001
0x01
0x001
0x01
0x09bb
0x9e18
0x0d9d
@ -1267,23 +1266,23 @@ RoF2 Built May 10 2013 23:30:08
0x6dec
0x56c9
0x3ee6
0x7121 OP_AltCurrency
0x7121
0x62ab
0x5d88
0x05f0 OP_MercenaryAssign
0x6b6d OP_AltCurrencyMerchantRequest
0x61cb OP_AltCurrencyPurchase
0x0165 OP_AltCurrencySell
0x74ec OP_AltCurrencyMerchantReply
0x5409 OP_AltCurrencySellSelection
0x3788
0x40b6
0x27a2
0x532a OP_AltCurrencyReclaim
0x05f0
0x6b6d OP_AltCurrency
0x61cb
0x0165
0x74ec OP_MercenaryAssign
0x5409 OP_AltCurrencyMerchantRequest
0x3788 OP_AltCurrencyPurchase
0x40b6 OP_AltCurrencySell
0x27a2 OP_AltCurrencyMerchantReply
0x532a OP_AltCurrencySellSelection
0x3899
0x7567
0x4820
0x0339
0x0339 OP_AltCurrencyReclaim
0x0c12
0x074d
0x47ba
@ -1326,17 +1325,18 @@ RoF2 Built May 10 2013 23:30:08
0x65c7
0x5620
0x587e
0x3897 OP_SendFindableNPCs
0x3897
0x7e62
0x67ae
0x74f4
0x4613
0x4613 OP_SendFindableNPCs
0x2a92
0x6d6e
0x2c01
0x1243
0x133e
0x67fc
0x49e1 OP_HideCorpse
0x0e44
0x239a
@ -1423,13 +1423,13 @@ RoF2 Built May 10 2013 23:30:08
0x6c3e
0xee80
0x40e5
0x76d9
0x1dc8 OP_GuildCreate
0x76d9 OP_GuildCreate
0x1dc8
0x794a
0x35c5
0x137d
0x004a
0x04a
0x04a
0x29b4
0x18f1
0x17fc
@ -1600,7 +1600,7 @@ RoF2 Built May 10 2013 23:30:08
0x2d28
0x5dab
0x005a
0x05a
0x05a
0x4506
0x046d
0x36db
@ -1668,4 +1668,4 @@ RoF2 Built May 10 2013 23:30:08
0x4efa
0x1da9
0x6678
0x16e8
0x16e8

View File

@ -6,11 +6,12 @@
# Directions to use this script:
# 1. Copy the opcodes and opcode names columns from the opcode spreadsheet
# for the columns you want to create a new .conf file from into the file.
# 2. Remove the header row entries in the newly created text file and save it.
# 3. Paste the contents of the current patch file in the patch_OLD.conf file.
# 4. Run this script using "perl oplist_to_conf.pl"
# 5. This creates a new .conf file named patch_NEW.conf
# 6. Rename patch_NEW.conf to the desired name and you are all done
# 2. Remove the header row entries in the text file.
# 3. Find/Replace all Tabs " " with 2 spaces " " and save the file.
# 4. Paste the contents of the current patch file in the patch_OLD.conf file.
# 5. Run this script using "perl oplist_to_conf.pl"
# 6. This creates a new .conf file named patch_NEW.conf
# 7. Rename patch_NEW.conf to the desired name and you are all done
$stopmessage = "Failed to open file";

View File

@ -10,7 +10,7 @@
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 used for unknown explorer
OP_ExploreUnknown=0x0000 # used for unknown explorer
# world packets
# Required to reach Char Select:
@ -100,7 +100,7 @@ OP_SendAAStats=0x43c8
OP_AAExpUpdate=0x7d14
OP_ExpUpdate=0x20ed
OP_HPUpdate=0x2828
OP_ManaChange=0x43af
OP_ManaChange=0x5467
OP_TGB=0x0876
OP_SpecialMesg=0x0083
OP_GuildMemberList=0x12a6
@ -108,18 +108,18 @@ OP_GuildMOTD=0x3e13
OP_CharInventory=0x5ca6
OP_WearChange=0x7994
OP_ClientUpdate=0x7dfc
OP_ClientReady=0x345d # 0x422d
OP_ClientReady=0x345d
OP_SetServerFilter=0x444d
# Guild Opcodes - Disabled until crashes are resolved in RoF
OP_GetGuildMOTD=0x36e0 # Was 0x35dc
OP_GetGuildMOTDReply=0x4f1f # Was 0x4586
OP_GuildMemberUpdate=0x69b9 # Was 0x5643
OP_GetGuildMOTD=0x36e0
OP_GetGuildMOTDReply=0x4f1f
OP_GuildMemberUpdate=0x69b9
OP_GuildInvite=0x7099
OP_GuildRemove=0x1444
OP_GuildPeace=0x67e3
OP_SetGuildMOTD=0x0b0b
OP_GuildList=0x507a
OP_GuildList=0x6279
OP_GuildWar=0x1ffb
OP_GuildLeader=0x7e09
OP_GuildDelete=0x3708
@ -127,12 +127,12 @@ OP_GuildInviteAccept=0x7053
OP_GuildDemote=0x2d4e
OP_GuildPromote=0x0000
OP_GuildPublicNote=0x5053
OP_GuildManageBanker=0x748f # Was 0x0737
OP_GuildBank=0x5134 # Was 0x10c3
OP_GuildManageBanker=0x748f
OP_GuildBank=0x5134
OP_SetGuildRank=0x0b9c
OP_GuildUpdateURLAndChannel=0x2958
OP_GuildStatus=0x7326
OP_GuildCreate=0x1dc8 # or maybe 0x086e
OP_GuildCreate=0x76d9
OP_GuildMemberLevelUpdate=0x0000 # Unused?
OP_ZoneGuildList=0x0000 # Unused?
OP_GetGuildsList=0x0000 # Unused?
@ -152,21 +152,21 @@ OP_GMHideMe=0x79c5
OP_GMDelCorpse=0x607e
OP_GMApproval=0x6db5
OP_GMToggle=0x2097
OP_GMSummon=0x486f # Was 0x684f
OP_GMEmoteZone=0x1cfd # Was 0x0655
OP_GMEmoteWorld=0x458e # Was 0x1935
OP_GMSummon=0x486f
OP_GMEmoteZone=0x1cfd
OP_GMEmoteWorld=0x458e
OP_GMFind=0x4a8f
OP_GMKick=0x26a7
OP_GMKill=0x51d3
OP_GMNameChange=0x035f # Was 0x4434
OP_GMLastName=0x46ce # Was 0x3077
OP_GMNameChange=0x035f
OP_GMLastName=0x46ce
# Misc Opcodes
OP_InspectRequest=0x57bc
OP_InspectAnswer=0x71ac
OP_InspectMessageUpdate=0x4d25
OP_BeginCast=0x318f
OP_ColoredText=0x0000
OP_ColoredText=0x43af
OP_ConsentResponse=0x384a
OP_MemorizeSpell=0x217c
OP_SwapSpell=0x0efa
@ -179,8 +179,8 @@ OP_Illusion=0x312a
OP_MoneyOnCorpse=0x5f44
OP_RandomReply=0x106b
OP_DenyResponse=0x2382
OP_SkillUpdate=0x004c
OP_GMTrainSkillConfirm=0x66dd # 0x3960
OP_SkillUpdate=0x04c
OP_GMTrainSkillConfirm=0x4b64
OP_RandomReq=0x7b10
OP_Death=0x6517
OP_GMTraining=0x1966
@ -194,7 +194,7 @@ OP_AutoFire=0x241e
OP_PetCommands=0x0159
OP_DeleteSpell=0x52e5
OP_Surname=0x0423
OP_ClearSurname=0x7d23
OP_ClearSurname=0x3fb0
OP_FaceChange=0x5578
OP_SenseHeading=0x260a
OP_Action=0x744c
@ -212,19 +212,19 @@ OP_AssistGroup=0x27f8
OP_MoveCoin=0x0bcf
OP_ZonePlayerToBind=0x0ecb
OP_KeyRing=0x6857
OP_WhoAllRequest=0x65ab
OP_WhoAllResponse=0x7c88
OP_WhoAllRequest=0x674b
OP_WhoAllResponse=0x578c
OP_FriendsWho=0x3956
OP_ConfirmDelete=0x43a3
OP_Logout=0x4ac6
OP_Rewind=0x1745
OP_TargetCommand=0x58e2
OP_Hide=0x67fe
OP_Jump=0x2060
OP_Jump=0x31f4
OP_Camp=0x28ec
OP_Emote=0x373b
OP_SetRunMode=0x009f
OP_BankerChange=0x383c
OP_BankerChange=0x791e
OP_TargetMouse=0x075d
OP_MobHealth=0x37b1
OP_InitialMobHealth=0x0000 # Unused?
@ -243,7 +243,7 @@ OP_MoveItem=0x32ee
OP_DeleteItem=0x18ad
OP_DeleteCharge=0x01b8
OP_ItemPacket=0x368e
OP_ItemLinkResponse=0x633c
OP_ItemLinkResponse=0x70c0
OP_ItemLinkClick=0x4cef
OP_ItemPreview=0x6b5c
OP_NewSpawn=0x6097
@ -265,19 +265,19 @@ OP_RezzAnswer=0x701c
OP_Shielding=0x48c1
OP_RequestDuel=0x3af1
OP_MobRename=0x2c57
OP_AugmentItem=0x661b # Was 0x37cb
OP_AugmentItem=0x661b
OP_WeaponEquip1=0x34a7
OP_WeaponEquip2=0x559a # Was 0x6022
OP_WeaponUnequip2=0x2d25 # Was 0x0110
OP_WeaponEquip2=0x559a
OP_WeaponUnequip2=0x2d25
OP_ApplyPoison=0x31e6
OP_Save=0x4a39
OP_TestBuff=0x7cb8 # Was 0x3772
OP_TestBuff=0x7cb8
OP_CustomTitles=0x100e
OP_Split=0x3a54
OP_YellForHelp=0x4e56
OP_LoadSpellSet=0x261d
OP_Bandolier=0x7677
OP_PotionBelt=0x1a3e # Was 0x4d3b
OP_PotionBelt=0x1a3e
OP_DuelResponse=0x6a46
OP_DuelResponse2=0x68d3
OP_SaveOnZoneReq=0x600d
@ -290,14 +290,14 @@ OP_LeadershipExpUpdate=0x2797
OP_PurchaseLeadershipAA=0x0026
OP_UpdateLeadershipAA=0x026
OP_MarkNPC=0x5a58
OP_MarkRaidNPC=0x74bd #unimplemented
OP_MarkRaidNPC=0x74bd #unimplemented
OP_ClearNPCMarks=0x2003
OP_ClearRaidNPCMarks=0x20d3 #unimplemented
OP_DelegateAbility=0x76b8
OP_SetGroupTarget=0x2814
OP_Charm=0x5d92
OP_Stun=0x36a4
OP_SendFindableNPCs=0x3897
OP_SendFindableNPCs=0x4613
OP_FindPersonRequest=0x5cea
OP_FindPersonReply=0x7e58
OP_Sound=0x1a30
@ -305,69 +305,70 @@ OP_PetBuffWindow=0x5882
OP_LevelAppearance=0x3bc9
OP_Translocate=0x6580
OP_Sacrifice=0x1821
OP_PopupResponse=0x214a
OP_OnLevelMessage=0x4fd0
OP_PopupResponse=0x08a6
OP_OnLevelMessage=0x4d6e
OP_AugmentInfo=0x0afb
OP_Petition=0x5f03
OP_Petition=0x1901
OP_SomeItemPacketMaybe=0x747c
OP_PVPStats=0x6f4b # Unsure
OP_PVPLeaderBoardRequest=0x3707
OP_PVPLeaderBoardReply=0x25b7
OP_PVPLeaderBoardDetailsRequest=0x15a9
OP_PVPLeaderBoardDetailsReply=0x04aa
OP_RestState=0x00f
OP_PVPStats=0x4b15
OP_PVPLeaderBoardRequest=0x04aa
OP_PVPLeaderBoardReply=0x071f
OP_PVPLeaderBoardDetailsRequest=0x3707
OP_PVPLeaderBoardDetailsReply=0x25b7
OP_RestState=0x000f
OP_RespawnWindow=0x28bc
OP_LDoNButton=0x5327
OP_SetStartCity=0x6326 # Was 0x2d1b
OP_SetStartCity=0x6326
OP_VoiceMacroIn=0x17fd
OP_VoiceMacroOut=0x409a
OP_ItemViewUnknown=0x2289
OP_ItemViewUnknown=0x465b
OP_VetRewardsAvaliable=0x590e
OP_VetClaimRequest=0x1126
OP_VetClaimReply=0x16d4
OP_DisciplineUpdate=0x759e # Was 0x2f05
OP_DisciplineTimer=0x6989 # Was 0x5e3f
OP_DisciplineUpdate=0x759e
OP_DisciplineTimer=0x6989
OP_BecomeCorpse=0x0000 # Unused?
OP_Action2=0x0000 # Unused?
OP_MobUpdate=0x2c84
OP_NPCMoveUpdate=0x189c
OP_NPCMoveUpdate=0x5892
OP_CameraEffect=0x127f
OP_SpellEffect=0x5936
OP_RemoveNimbusEffect=0xc693
OP_AltCurrency=0x7121
OP_AltCurrencyMerchantRequest=0x6b6d
OP_AltCurrencyMerchantReply=0x74ec
OP_AltCurrencyPurchase=0x61cb
OP_AltCurrencySell=0x0165
OP_AltCurrencySellSelection=0x5409
OP_AltCurrencyReclaim=0x532a
OP_CrystalCountUpdate=0x467f # Was 0x3f60
OP_CrystalCreate=0x7aee # Was 0x5a82
OP_CrystalReclaim=0x2439 # Was 0x7616
OP_RemoveNimbusEffect=0x7b1e
OP_AltCurrency=0x6b6d
OP_AltCurrencyMerchantRequest=0x5409
OP_AltCurrencyMerchantReply=0x27a2
OP_AltCurrencyPurchase=0x3788
OP_AltCurrencySell=0x40b6
OP_AltCurrencySellSelection=0x532a
OP_AltCurrencyReclaim=0x0339
OP_CrystalCountUpdate=0x467f
OP_CrystalCreate=0x7aee
OP_CrystalReclaim=0x2439
OP_Untargetable=0x053c
OP_IncreaseStats=0x70a3
OP_Weblink=0x18d3
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
OP_Weblink=0x6f4b
OP_OpenContainer=0x0000
OP_Marquee=0x0000
OP_Marquee=0x502e
OP_ItemRecastDelay=0x15a9
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
OP_DzQuit=0xb2e3
OP_DzListTimers=0x7b68
OP_DzAddPlayer=0x4701
OP_DzRemovePlayer=0x1abc
OP_DzSwapPlayer=0x405b
OP_DzMakeLeader=0x543d
OP_DzPlayerList=0x14c6
OP_DzJoinExpeditionConfirm=0x7f4b
OP_DzJoinExpeditionReply=0x1950
OP_DzExpeditionInfo=0x9119
OP_DzExpeditionList=0x205f
OP_DzMemberStatus=0x32f0
OP_DzLeaderStatus=0x3de9
OP_DzExpeditionEndsWarning=0x5189
OP_DzMemberList=0x5ae4
OP_DzCompass=0x3e0e # Was 0x4f09
OP_DzChooseZone=0x0000 # Maybe 0x29d6
OP_DzQuit=0x205f
OP_DzListTimers=0x0398
OP_DzAddPlayer=0x59ca
OP_DzRemovePlayer=0x4701
OP_DzSwapPlayer=0x1abc
OP_DzMakeLeader=0x405b
OP_DzPlayerList=0x543d
OP_DzJoinExpeditionConfirm=0x14c6
OP_DzJoinExpeditionReply=0x7f4b
OP_DzExpeditionInfo=0x4f7e
OP_DzExpeditionList=0x9119
OP_DzMemberStatus=0xb2e3
OP_DzLeaderStatus=0x32f0
OP_DzExpeditionEndsWarning=0x7e94
OP_DzMemberList=0x3de9
OP_DzCompass=0x3e0e
OP_DzChooseZone=0x0b7d
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
@ -402,7 +403,7 @@ OP_BazaarSearch=0x39d6
OP_TraderDelItem=0x0000
OP_BecomeTrader=0x61b3
OP_TraderShop=0x31df
OP_Trader=0x4ef5 # Was 0x6790
OP_Trader=0x4ef5
OP_TraderBuy=0x0000
OP_Barter=0x243a
OP_ShopItem=0x0000
@ -427,15 +428,15 @@ OP_FinishWindow2=0x40ef
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x097b
OP_ItemVerifyReply=0x2115
OP_ItemVerifyRequest=0x189c
OP_ItemVerifyReply=0x097b
# merchant stuff
OP_ShopPlayerSell=0x1901
OP_ShopPlayerSell=0x0000
OP_ShopRequest=0x4fed
OP_ShopEnd=0x30a8
OP_ShopEndConfirm=0x3196
OP_ShopPlayerBuy=0x04c
OP_ShopPlayerBuy=0x0ddd
OP_ShopDelItem=0x724f
# tradeskill stuff:
@ -443,7 +444,7 @@ OP_ClickObject=0x4aa1
OP_ClickObjectAction=0x0c1e
OP_ClearObject=0x7a11
OP_RecipeDetails=0x40d7
OP_RecipesFavorite=0x5c74
OP_RecipesFavorite=0x71b1
OP_RecipesSearch=0x1db6
OP_RecipeReply=0x6e02
OP_RecipeAutoCombine=0x6261
@ -451,10 +452,10 @@ OP_TradeSkillCombine=0x579a
# Tribute Packets:
OP_OpenGuildTributeMaster=0x378d
OP_OpenTributeMaster=0x7666 # Was 0x40f5
OP_OpenTributeMaster=0x7666
OP_SelectTribute=0x79fc
OP_TributeItem=0x4f3e
OP_TributeMoney=0x58fb # Was 0x6fed
OP_TributeMoney=0x58fb
OP_TributeToggle=0x241d
OP_TributePointUpdate=0x5300
OP_TributeNPC=0x0000
@ -471,11 +472,11 @@ OP_AdventureRequest=0x2c6c
OP_AdventureDetails=0x5648
OP_AdventureData=0x7171
OP_AdventureUpdate=0x1b01
OP_AdventureMerchantRequest=0x6922 # Was 654d
OP_AdventureMerchantResponse=0x3e47 # Was 7949
OP_AdventureMerchantPurchase=0x5b72 # Was 155a
OP_AdventureMerchantSell=0x2f9b # Was 389c
OP_AdventurePointsUpdate=0x65c3 # Was 7589
OP_AdventureMerchantRequest=0x6922
OP_AdventureMerchantResponse=0x3e47
OP_AdventureMerchantPurchase=0x5b72
OP_AdventureMerchantSell=0x2f9b
OP_AdventurePointsUpdate=0x65c3
OP_AdventureStatsRequest=0x5a62
OP_AdventureStatsReply=0x2370
OP_AdventureLeaderboardRequest=0x7093
@ -483,16 +484,16 @@ OP_AdventureLeaderboardReply=0x7f79
# Group Opcodes
OP_GroupDisband=0x4c10
OP_GroupInvite=0x1649
OP_GroupFollow=0x05ce
OP_GroupInvite=0x6110
OP_GroupFollow=0x1649
OP_GroupUpdate=0x3abb
OP_GroupUpdateB=0x6194
OP_GroupCancelInvite=0x0000
OP_GroupAcknowledge=0x7323
OP_GroupDelete=0x0f6c
OP_CancelInvite=0x32c2
OP_GroupFollow2=0x2a50
OP_GroupInvite2=0x6c65
OP_CancelInvite=0x2a50
OP_GroupFollow2=0x2060
OP_GroupInvite2=0x32c2
OP_GroupDisbandYou=0x1ae5
OP_GroupDisbandOther=0x74da
OP_GroupLeaderChange=0x21b4
@ -500,7 +501,7 @@ OP_GroupRoles=0x70e2
OP_GroupMakeLeader=0x4229
OP_DoGroupLeadershipAbility=0x1fb5
OP_GroupLeadershipAAUpdate=0x02cf
OP_GroupMentor=0x5892
OP_GroupMentor=0x3342
OP_InspectBuffs=0x486c
# LFG/LFP Opcodes
@ -521,7 +522,7 @@ OP_RaidJoin=0x0000
# Button-push commands
OP_Taunt=0x2703
OP_CombatAbility=0x3eba
OP_SenseTraps=0x02af # Was 0x2ee0
OP_SenseTraps=0x02af
OP_PickPocket=0x39e8
OP_DisarmTraps=0x78bf
OP_Disarm=0x5ec8
@ -534,15 +535,15 @@ OP_Bind_Wound=0x0386
OP_LDoNOpen=0x3d5c
# Task packets
OP_TaskDescription=0x083
OP_TaskActivity=0x3714
OP_TaskDescription=0x3714
OP_TaskActivity=0x08d3
OP_CompletedTasks=0x4eba
OP_TaskActivityComplete=0x5e19
OP_AcceptNewTask=0x0a23
OP_CancelTask=0x08d3
OP_TaskMemberList=0x5727 # Was 0x1656
OP_OpenNewTasksWindow=0x48a2 # Was 0x11de
OP_AvaliableTask=0x36e8 # Was 0x2377
OP_CancelTask=0x39f0
OP_TaskMemberList=0x5727
OP_OpenNewTasksWindow=0x48a2
OP_AvaliableTask=0x36e8
OP_TaskHistoryRequest=0x5f1c
OP_TaskHistoryReply=0x3d05
OP_DeclineAllTasks=0x0000
@ -584,7 +585,7 @@ OP_LoginComplete=0x0000
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000
OP_PlayMP3=0x0000
OP_PlayMP3=0x5770
OP_ReclaimCrystals=0x0000
OP_DynamicWall=0x0000
OP_OpenDiscordMerchant=0x0000
@ -657,5 +658,3 @@ OP_RAWOutOfSession=0x0000
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000
OP_ItemRecastDelay=0x08a6

View File

@ -10,7 +10,7 @@
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 used for unknown explorer
OP_ExploreUnknown=0x0000 # used for unknown explorer
# world packets
# Required to reach Char Select:
@ -19,8 +19,8 @@ OP_ApproveWorld=0x7499
OP_LogServer=0x7ceb
OP_SendCharInfo=0x00d2
OP_ExpansionInfo=0x590d
OP_GuildsList=0x7056
OP_EnterWorld=0x0641
OP_GuildsList=0x0000
OP_EnterWorld=0x578f
OP_PostEnterWorld=0x6259
OP_World_Client_CRC1=0x12cc
OP_World_Client_CRC2=0x0f13
@ -28,24 +28,24 @@ OP_SendSpellChecksum=0x0000
OP_SendSkillCapsChecksum=0x0000
# Character Select Related:
OP_SendMaxCharacters=0x05a8
OP_SendMembership=0x057b
OP_SendMembershipDetails=0x6a98
OP_CharacterCreateRequest=0x655c
OP_SendMaxCharacters=0x5475
OP_SendMembership=0x7acc
OP_SendMembershipDetails=0x057b
OP_CharacterCreateRequest=0x6773
OP_CharacterCreate=0x6bbf
OP_DeleteCharacter=0x1808
OP_RandomNameGenerator=0x5954
OP_ApproveName=0x56a2
OP_MOTD=0x0c22
OP_SetChatServer=0x1bc5
OP_SetChatServer2=0x7db5
OP_ZoneServerInfo=0x6ef5
OP_SetChatServer2=0x7eec
OP_ZoneServerInfo=0x4c44
OP_WorldComplete=0x4493
OP_WorldUnknown001=0x2958
OP_WorldUnknown001=0x2301
OP_FloatListThing=0x46c6
# Reasons for Disconnect:
OP_ZoneUnavail=0x4c44
OP_ZoneUnavail=0x4cb4
OP_WorldClientReady=0x23c1
OP_CharacterStillInZone=0x0000
OP_WorldChecksumFailure=0x0000
@ -81,58 +81,58 @@ OP_ChangeSize=0x4707
OP_TributeUpdate=0x5961
OP_TributeTimer=0x073d
OP_SendTributes=0x729b
OP_SendGuildTributes=0x4d5e
OP_SendGuildTributes=0x1877
OP_TributeInfo=0x4254
OP_Weather=0x661e
OP_ReqClientSpawn=0x35fa
OP_SpawnDoor=0x7291
OP_GroundSpawn=0x6fca
OP_SendZonepoints=0x69a4
OP_BlockedBuffs=0x4d25
OP_RemoveBlockedBuffs=0x3033
OP_ClearBlockedBuffs=0x6b3d
OP_BlockedBuffs=0x3033
OP_RemoveBlockedBuffs=0x0de7
OP_ClearBlockedBuffs=0x34cb
OP_WorldObjectsSent=0x5ae2
OP_SendExpZonein=0x5f8e
OP_SendAATable=0x66b5
OP_RespondAA=0x7a27
OP_UpdateAA=0x66f0
OP_SendAAStats=0x43c8
OP_AAExpUpdate=0x7e92
OP_AAExpUpdate=0x7d14
OP_ExpUpdate=0x20ed
OP_HPUpdate=0x2828
OP_ManaChange=0x1287
OP_TGB=0x0000
OP_SpecialMesg=0x0000
OP_GuildMemberList=0x0e48
OP_ManaChange=0x43af
OP_TGB=0x0876
OP_SpecialMesg=0x0083
OP_GuildMemberList=0x12a6
OP_GuildMOTD=0x3e13
OP_CharInventory=0x5ca6
OP_WearChange=0x7994
OP_ClientUpdate=0x7dfc
OP_ClientReady=0x345d # 0x422d
OP_ClientReady=0x345d
OP_SetServerFilter=0x444d
# Guild Opcodes - Disabled until crashes are resolved in RoF
OP_GetGuildMOTD=0x36e0 # Was 0x35dc
OP_GetGuildMOTDReply=0x4f1f # Was 0x4586
OP_GuildMemberUpdate=0x69b9 # Was 0x5643
OP_GetGuildMOTD=0x36e0
OP_GetGuildMOTDReply=0x4f1f
OP_GuildMemberUpdate=0x69b9
OP_GuildInvite=0x7099
OP_GuildRemove=0x1444
OP_GuildPeace=0x084e
OP_GuildPeace=0x67e3
OP_SetGuildMOTD=0x0b0b
OP_GuildList=0x0000
OP_GuildWar=0x46ce
OP_GuildLeader=0x2f3e
OP_GuildList=0x507a
OP_GuildWar=0x1ffb
OP_GuildLeader=0x7e09
OP_GuildDelete=0x3708
OP_GuildInviteAccept=0x7053
OP_GuildDemote=0x2d4e
OP_GuildPromote=0x0000
OP_GuildPublicNote=0x5053
OP_GuildManageBanker=0x748f # Was 0x0737
OP_GuildBank=0x5134 # Was 0x10c3
OP_GuildManageBanker=0x748f
OP_GuildBank=0x5134
OP_SetGuildRank=0x0b9c
OP_GuildUpdateURLAndChannel=0x6084
OP_GuildUpdateURLAndChannel=0x2958
OP_GuildStatus=0x7326
OP_GuildCreate=0x1dc8 # or maybe 0x086e
OP_GuildCreate=0x1dc8
OP_GuildMemberLevelUpdate=0x0000 # Unused?
OP_ZoneGuildList=0x0000 # Unused?
OP_GetGuildsList=0x0000 # Unused?
@ -147,40 +147,40 @@ OP_GMBecomeNPC=0x3ae1
OP_GMZoneRequest=0x62ac
OP_GMZoneRequest2=0x7e1a
OP_GMGoto=0x7d8e
OP_GMSearchCorpse=0x46b1
OP_GMSearchCorpse=0x357c
OP_GMHideMe=0x79c5
OP_GMDelCorpse=0x607e
OP_GMApproval=0x6db5
OP_GMToggle=0x2097
OP_GMSummon=0x486f # Was 0x684f
OP_GMEmoteZone=0x1cfd # Was 0x0655
OP_GMEmoteWorld=0x458e # Was 0x1935
OP_GMSummon=0x486f
OP_GMEmoteZone=0x1cfd
OP_GMEmoteWorld=0x458e
OP_GMFind=0x4a8f
OP_GMKick=0x26a7
OP_GMKill=0x51d3
OP_GMNameChange=0x035f # Was 0x4434
OP_GMLastName=0x16ce # Was 0x3077
OP_GMNameChange=0x035f
OP_GMLastName=0x46ce
# Misc Opcodes
OP_InspectRequest=0x57bc
OP_InspectAnswer=0x71ac
OP_InspectMessageUpdate=0x6f8b
OP_InspectMessageUpdate=0x4d25
OP_BeginCast=0x318f
OP_ColoredText=0x0000
OP_ConsentResponse=0x384a
OP_MemorizeSpell=0x6a0d
OP_MemorizeSpell=0x217c
OP_SwapSpell=0x0efa
OP_CastSpell=0x4466
OP_CastSpell=0x1287
OP_Consider=0x742b
OP_FormattedMessage=0x1024
OP_SimpleMessage=0x213f
OP_Buff=0x3a54
OP_Buff=0x659c
OP_Illusion=0x312a
OP_MoneyOnCorpse=0x5f44
OP_RandomReply=0x106b
OP_DenyResponse=0x2382
OP_SkillUpdate=0x2264
OP_GMTrainSkillConfirm=0x19aa # 0x3960
OP_SkillUpdate=0x004c
OP_GMTrainSkillConfirm=0x66dd
OP_RandomReq=0x7b10
OP_Death=0x6517
OP_GMTraining=0x1966
@ -196,12 +196,12 @@ OP_DeleteSpell=0x52e5
OP_Surname=0x0423
OP_ClearSurname=0x7d23
OP_FaceChange=0x5578
OP_SenseHeading=0x217c
OP_SenseHeading=0x260a
OP_Action=0x744c
OP_ConsiderCorpse=0x5204
OP_HideCorpse=0x67fc
OP_CorpseDrag=0x7eec
OP_CorpseDrop=0x0904
OP_HideCorpse=0x49e1
OP_CorpseDrag=0x0904
OP_CorpseDrop=0x7037
OP_Bug=0x73f4
OP_Feedback=0x5602
OP_Report=0x1414
@ -213,28 +213,28 @@ OP_MoveCoin=0x0bcf
OP_ZonePlayerToBind=0x0ecb
OP_KeyRing=0x6857
OP_WhoAllRequest=0x65ab
OP_WhoAllResponse=0x407a
OP_WhoAllResponse=0x7c88
OP_FriendsWho=0x3956
OP_ConfirmDelete=0x43a3
OP_Logout=0x4ac6
OP_Rewind=0x1745
OP_TargetCommand=0x58e2
OP_Hide=0x5d55
OP_Hide=0x67fe
OP_Jump=0x2060
OP_Camp=0x28ec
OP_Emote=0x373b
OP_SetRunMode=0x009f
OP_BankerChange=0x383c
OP_TargetMouse=0x075d
OP_MobHealth=0x2dd3
OP_MobHealth=0x37b1
OP_InitialMobHealth=0x0000 # Unused?
OP_TargetHoTT=0x486c
OP_XTargetResponse=0x4d59
OP_XTargetRequest=0x3763
OP_XTargetAutoAddHaters=0x672f
OP_TargetHoTT=0x0272
OP_XTargetResponse=0x672f
OP_XTargetRequest=0x45be
OP_XTargetAutoAddHaters=0x792c
OP_TargetBuffs=0x4f4b
OP_BuffCreate=0x3377
OP_BuffRemoveRequest=0x49bc
OP_BuffRemoveRequest=0x64f2
OP_DeleteSpawn=0x7280
OP_AutoAttack=0x109d
OP_AutoAttack2=0x3526
@ -243,61 +243,61 @@ OP_MoveItem=0x32ee
OP_DeleteItem=0x18ad
OP_DeleteCharge=0x01b8
OP_ItemPacket=0x368e
OP_ItemLinkResponse=0x70c0
OP_ItemLinkResponse=0x633c
OP_ItemLinkClick=0x4cef
OP_ItemPreview=0x7f80
OP_NewSpawn=0x0b04
OP_ItemPreview=0x6b5c
OP_NewSpawn=0x6097
OP_Track=0x17e5
OP_TrackTarget=0x0029
OP_TrackUnknown=0x0f83
OP_TrackUnknown=0x4577
OP_ClickDoor=0x3a8f
OP_MoveDoor=0x08e8
OP_RemoveAllDoors=0x700c
OP_EnvDamage=0x51fd
OP_BoardBoat=0x31e6
OP_BoardBoat=0x4211
OP_Forage=0x5306
OP_LeaveBoat=0x4211
OP_LeaveBoat=0x7617
OP_ControlBoat=0x0ae7
OP_SafeFallSuccess=0x6dbc
OP_SafeFallSuccess=0x2219
OP_RezzComplete=0x760d
OP_RezzRequest=0x3c21
OP_RezzAnswer=0x701c
OP_Shielding=0x48c1
OP_RequestDuel=0x3af1
OP_MobRename=0x2c57
OP_AugmentItem=0x661b # Was 0x37cb
OP_AugmentItem=0x661b
OP_WeaponEquip1=0x34a7
OP_WeaponEquip2=0x559a # Was 0x6022
OP_WeaponUnequip2=0x2d25 # Was 0x0110
OP_ApplyPoison=0x1b0c
OP_WeaponEquip2=0x559a
OP_WeaponUnequip2=0x2d25
OP_ApplyPoison=0x31e6
OP_Save=0x4a39
OP_TestBuff=0x7cb8 # Was 0x3772
OP_TestBuff=0x7cb8
OP_CustomTitles=0x100e
OP_Split=0x0522
OP_Split=0x3a54
OP_YellForHelp=0x4e56
OP_LoadSpellSet=0x261d
OP_Bandolier=0x7677
OP_PotionBelt=0x1a3e # Was 0x4d3b
OP_PotionBelt=0x1a3e
OP_DuelResponse=0x6a46
OP_DuelResponse2=0x68d3
OP_SaveOnZoneReq=0x2c7a
OP_SaveOnZoneReq=0x600d
OP_ReadBook=0x72df
OP_Dye=0x23b9
OP_InterruptCast=0x048c
OP_AAAction=0x424e
OP_LeadershipExpToggle=0x74bd
OP_LeadershipExpUpdate=0x4ee2
OP_PurchaseLeadershipAA=0x6c55
OP_UpdateLeadershipAA=0x0026
OP_LeadershipExpToggle=0x6c55
OP_LeadershipExpUpdate=0x2797
OP_PurchaseLeadershipAA=0x0026
OP_UpdateLeadershipAA=0x026
OP_MarkNPC=0x5a58
OP_MarkRaidNPC=0x0000 #unimplemented
OP_ClearNPCMarks=0x0272
OP_ClearRaidNPCMarks=0x0000 #unimplemented
OP_DelegateAbility=0x4c9d
OP_SetGroupTarget=0x026
OP_MarkRaidNPC=0x74bd #unimplemented
OP_ClearNPCMarks=0x2003
OP_ClearRaidNPCMarks=0x20d3 #unimplemented
OP_DelegateAbility=0x76b8
OP_SetGroupTarget=0x2814
OP_Charm=0x5d92
OP_Stun=0x36a4
OP_SendFindableNPCs=0x587e
OP_SendFindableNPCs=0x3897
OP_FindPersonRequest=0x5cea
OP_FindPersonReply=0x7e58
OP_Sound=0x1a30
@ -308,48 +308,49 @@ OP_Sacrifice=0x1821
OP_PopupResponse=0x214a
OP_OnLevelMessage=0x4fd0
OP_AugmentInfo=0x0afb
OP_Petition=0x4101
OP_Petition=0x5f03
OP_SomeItemPacketMaybe=0x747c
OP_PVPStats=0x6f4b # Unsure
OP_PVPStats=0x6f4b
OP_PVPLeaderBoardRequest=0x3707
OP_PVPLeaderBoardReply=0x25b7
OP_PVPLeaderBoardDetailsRequest=0x15a9
OP_PVPLeaderBoardDetailsReply=0x04aa
OP_RestState=0x000f
OP_RestState=0x00f
OP_RespawnWindow=0x28bc
OP_LDoNButton=0x5327
OP_SetStartCity=0x6326 # Was 0x2d1b
OP_SetStartCity=0x6326
OP_VoiceMacroIn=0x17fd
OP_VoiceMacroOut=0x409a
OP_ItemViewUnknown=0x465b
OP_VetRewardsAvaliable=0x6773
OP_ItemViewUnknown=0x2289
OP_VetRewardsAvaliable=0x590e
OP_VetClaimRequest=0x1126
OP_VetClaimReply=0x16d4
OP_DisciplineUpdate=0x759e # Was 0x2f05
OP_DisciplineTimer=0x6989 # Was 0x5e3f
OP_DisciplineUpdate=0x759e
OP_DisciplineTimer=0x6989
OP_BecomeCorpse=0x0000 # Unused?
OP_Action2=0x0000 # Unused?
OP_MobUpdate=0x2c84
OP_NPCMoveUpdate=0x5892
OP_NPCMoveUpdate=0x189c
OP_CameraEffect=0x127f
OP_SpellEffect=0x5936
OP_RemoveNimbusEffect=0xc693
OP_AltCurrency=0x3ee6
OP_AltCurrencyMerchantRequest=0x05f0
OP_AltCurrencyMerchantReply=0x0165
OP_AltCurrencyPurchase=0x6b6d
OP_AltCurrencySell=0x61cb
OP_AltCurrencySellSelection=0x74ec
OP_AltCurrencyReclaim=0x27a2
OP_CrystalCountUpdate=0x467f # Was 0x3f60
OP_CrystalCreate=0x7aee # Was 0x5a82
OP_CrystalReclaim=0x2439 # Was 0x7616
OP_Untargetable=0x1456
OP_AltCurrency=0x7121
OP_AltCurrencyMerchantRequest=0x6b6d
OP_AltCurrencyMerchantReply=0x74ec
OP_AltCurrencyPurchase=0x61cb
OP_AltCurrencySell=0x0165
OP_AltCurrencySellSelection=0x5409
OP_AltCurrencyReclaim=0x532a
OP_CrystalCountUpdate=0x467f
OP_CrystalCreate=0x7aee
OP_CrystalReclaim=0x2439
OP_Untargetable=0x053c
OP_IncreaseStats=0x70a3
OP_Weblink=0x18d3
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
OP_OpenContainer=0x0000
OP_Marquee=0x0000
OP_ItemRecastDelay=0x08a6
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
OP_DzQuit=0xb2e3
OP_DzListTimers=0x7b68
@ -365,31 +366,31 @@ OP_DzExpeditionList=0x205f
OP_DzMemberStatus=0x32f0
OP_DzLeaderStatus=0x3de9
OP_DzExpeditionEndsWarning=0x5189
OP_DzMemberList=0x0000
OP_DzCompass=0x3e0e # Was 0x4f09
OP_DzChooseZone=0x0000 # Maybe 0x29d6
OP_DzMemberList=0x5ae4
OP_DzCompass=0x3e0e
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
OP_ManaUpdate=0x3791
OP_EnduranceUpdate=0x5f42
OP_MobManaUpdate=0x2925
OP_MobEnduranceUpdate=0x7314
OP_MobManaUpdate=0x2404
OP_MobEnduranceUpdate=0x1c81
# Mercenary Opcodes
OP_MercenaryDataUpdateRequest=0x2bcb
OP_MercenaryDataUpdate=0x7b89
OP_MercenaryDataRequest=0x61a4
OP_MercenaryDataResponse=0x11c1
OP_MercenaryHire=0x72ce
OP_MercenaryDismiss=0x7169
OP_MercenaryTimerRequest=0x6e83
OP_MercenaryTimer=0x31e4
OP_MercenaryUnknown1=0x20b9
OP_MercenaryCommand=0x1b37
OP_MercenarySuspendRequest=0x6e9f
OP_MercenarySuspendResponse=0x4407
OP_MercenaryUnsuspendResponse=0x6f03
OP_MercenaryDataUpdateRequest=0x7b89
OP_MercenaryDataUpdate=0x61a4
OP_MercenaryDataRequest=0x11c1
OP_MercenaryDataResponse=0x72ce
OP_MercenaryHire=0x7169
OP_MercenaryDismiss=0x6e83
OP_MercenaryTimerRequest=0x31e4
OP_MercenaryTimer=0x0763
OP_MercenaryUnknown1=0x5d26
OP_MercenaryCommand=0x27f2
OP_MercenarySuspendRequest=0x4407
OP_MercenarySuspendResponse=0x6f03
OP_MercenaryUnsuspendResponse=0x27a0
# Looting
OP_LootRequest=0x0adf
@ -401,8 +402,8 @@ OP_LootComplete=0x55c4
OP_BazaarSearch=0x39d6
OP_TraderDelItem=0x0000
OP_BecomeTrader=0x61b3
OP_TraderShop=0x5eca
OP_Trader=0x4ef5 # Was 0x6790
OP_TraderShop=0x31df
OP_Trader=0x4ef5
OP_TraderBuy=0x0000
OP_Barter=0x243a
OP_ShopItem=0x0000
@ -427,35 +428,35 @@ OP_FinishWindow2=0x40ef
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x189c
OP_ItemVerifyReply=0x097b
OP_ItemVerifyRequest=0x097b
OP_ItemVerifyReply=0x2115
# merchant stuff
OP_ShopPlayerSell=0x3de3
OP_ShopPlayerSell=0x1901
OP_ShopRequest=0x4fed
OP_ShopEnd=0x30a8
OP_ShopEndConfirm=0x3196
OP_ShopPlayerBuy=0x004c
OP_ShopPlayerBuy=0x04c
OP_ShopDelItem=0x724f
# tradeskill stuff:
OP_ClickObject=0x4aa1
OP_ClickObjectAction=0x0c1e
OP_ClearObject=0x7a11
OP_RecipeDetails=0x6e02
OP_RecipeDetails=0x40d7
OP_RecipesFavorite=0x5c74
OP_RecipesSearch=0x6290
OP_RecipeReply=0x1db6
OP_RecipeAutoCombine=0x40d7
OP_RecipesSearch=0x1db6
OP_RecipeReply=0x6e02
OP_RecipeAutoCombine=0x6261
OP_TradeSkillCombine=0x579a
# Tribute Packets:
OP_OpenGuildTributeMaster=0x49ea
OP_OpenTributeMaster=0x7666 # Was 0x40f5
OP_OpenGuildTributeMaster=0x378d
OP_OpenTributeMaster=0x7666
OP_SelectTribute=0x79fc
OP_TributeItem=0x4f3e
OP_TributeMoney=0x58fb # Was 0x6fed
OP_TributeToggle=0x4e32
OP_TributeMoney=0x58fb
OP_TributeToggle=0x241d
OP_TributePointUpdate=0x5300
OP_TributeNPC=0x0000
OP_GuildTributeInfo=0x0000
@ -471,11 +472,11 @@ OP_AdventureRequest=0x2c6c
OP_AdventureDetails=0x5648
OP_AdventureData=0x7171
OP_AdventureUpdate=0x1b01
OP_AdventureMerchantRequest=0x6922 # Was 654d
OP_AdventureMerchantResponse=0x3e47 # Was 7949
OP_AdventureMerchantPurchase=0x5b72 # Was 155a
OP_AdventureMerchantSell=0x2f9b # Was 389c
OP_AdventurePointsUpdate=0x65c3 # Was 7589
OP_AdventureMerchantRequest=0x6922
OP_AdventureMerchantResponse=0x3e47
OP_AdventureMerchantPurchase=0x5b72
OP_AdventureMerchantSell=0x2f9b
OP_AdventurePointsUpdate=0x65c3
OP_AdventureStatsRequest=0x5a62
OP_AdventureStatsReply=0x2370
OP_AdventureLeaderboardRequest=0x7093
@ -485,23 +486,23 @@ OP_AdventureLeaderboardReply=0x7f79
OP_GroupDisband=0x4c10
OP_GroupInvite=0x1649
OP_GroupFollow=0x05ce
OP_GroupUpdate=0x4ced
OP_GroupUpdateB=0x0cbc
OP_GroupUpdate=0x3abb
OP_GroupUpdateB=0x6194
OP_GroupCancelInvite=0x0000
OP_GroupAcknowledge=0x04d0
OP_GroupDelete=0x3abb
OP_GroupAcknowledge=0x7323
OP_GroupDelete=0x0f6c
OP_CancelInvite=0x32c2
OP_GroupFollow2=0x2a50
OP_GroupInvite2=0x6c65
OP_GroupDisbandYou=0x7323
OP_GroupDisbandOther=0x88a1
OP_GroupLeaderChange=0x74da
OP_GroupRoles=0x4d9f
OP_GroupDisbandYou=0x1ae5
OP_GroupDisbandOther=0x74da
OP_GroupLeaderChange=0x21b4
OP_GroupRoles=0x70e2
OP_GroupMakeLeader=0x4229
OP_DoGroupLeadershipAbility=0x6eae
OP_GroupLeadershipAAUpdate=0x6298
OP_GroupMentor=0x3342
OP_InspectBuffs=0x0000
OP_DoGroupLeadershipAbility=0x1fb5
OP_GroupLeadershipAAUpdate=0x02cf
OP_GroupMentor=0x5892
OP_InspectBuffs=0x486c
# LFG/LFP Opcodes
OP_LFGCommand=0x6060
@ -514,18 +515,18 @@ OP_LFGAppearance=0x0000
OP_LFGResponse=0x0000
# Raid Opcodes
OP_RaidInvite=0x3973
OP_RaidUpdate=0x56fe
OP_RaidInvite=0x55ac
OP_RaidUpdate=0x3973
OP_RaidJoin=0x0000
# Button-push commands
OP_Taunt=0x2703
OP_CombatAbility=0x3eba
OP_SenseTraps=0x02af # Was 0x2ee0
OP_SenseTraps=0x02af
OP_PickPocket=0x39e8
OP_DisarmTraps=0x0000
OP_DisarmTraps=0x78bf
OP_Disarm=0x5ec8
OP_Sneak=0x4577
OP_Sneak=0x5d55
OP_Fishing=0x1e2a
OP_InstillDoubt=0x640e
OP_FeignDeath=0x52fa
@ -534,15 +535,15 @@ OP_Bind_Wound=0x0386
OP_LDoNOpen=0x3d5c
# Task packets
OP_TaskDescription=0x0083
OP_TaskActivity=0x083
OP_TaskDescription=0x083
OP_TaskActivity=0x3714
OP_CompletedTasks=0x4eba
OP_TaskActivityComplete=0x7037
OP_TaskActivityComplete=0x5e19
OP_AcceptNewTask=0x0a23
OP_CancelTask=0x3714
OP_TaskMemberList=0x5727 # Was 0x1656
OP_OpenNewTasksWindow=0x48a2 # Was 0x11de
OP_AvaliableTask=0x36e8 # Was 0x2377
OP_CancelTask=0x08d3
OP_TaskMemberList=0x5727
OP_OpenNewTasksWindow=0x48a2
OP_AvaliableTask=0x36e8
OP_TaskHistoryRequest=0x5f1c
OP_TaskHistoryReply=0x3d05
OP_DeclineAllTasks=0x0000
@ -656,6 +657,4 @@ OP_RAWOutOfSession=0x0000
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000
OP_ItemRecastDelay=0x08a6
OP_InitialHPUpdate=0x0000

View File

@ -313,6 +313,9 @@
9057|2014_11_13_spells_new_updates.sql|SHOW COLUMNS FROM `spells_new` LIKE 'disallow_sit'|empty|
9058|2014_11_26_InventoryTableUpdate.sql|SHOW COLUMNS FROM `inventory` LIKE 'ornamenticon'|empty|
9059|2014_12_01_mercs_table_update.sql|SHOW COLUMNS FROM `mercs` LIKE 'MercSize'|empty|
9060|2014_12_09_items_table_update.sql|SHOW COLUMNS FROM `items` LIKE 'herosforgemodel'|empty|
9061|2014_12_13_inventory_table_update.sql|SHOW COLUMNS FROM `inventory` LIKE 'ornament_hero_model'|empty|
9062|2014_12_15_multiple_table_updates.sql|SHOW COLUMNS FROM `items` LIKE 'augslot6type'|empty|
# Upgrade conditions:
# This won't be needed after this system is implemented, but it is used database that are not

View File

@ -0,0 +1,2 @@
INSERT INTO `commands` (`command`, `access`) VALUES ('heromodel', 80);
INSERT INTO `commands` (`command`, `access`) VALUES ('hm', 80);

View File

@ -0,0 +1,2 @@
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'Spells:NPC_UseFocusFromSpells', 'true', 'Allow npcs to use most spell buff derived focus effects.');
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'Spells:NPC_UseFocusFromItems', 'false', 'Allow npcs to use most item derived focus effects.');

View File

@ -0,0 +1 @@
ALTER TABLE `items` ADD `herosforgemodel` int( 11 ) NOT NULL DEFAULT '0' AFTER `material`;

View File

@ -0,0 +1 @@
ALTER TABLE `inventory` ADD `ornament_hero_model` int( 11 ) NOT NULL DEFAULT '0' AFTER `ornamentidfile`;

View File

@ -0,0 +1,16 @@
/* Add the new Aug Slot 6 Fields to the items table */
ALTER TABLE `items` ADD `augslot6type` tinyint( 3 ) NOT NULL DEFAULT '0' AFTER `augslot5visible`;
ALTER TABLE `items` ADD `augslot6visible` tinyint( 3 ) NOT NULL DEFAULT '0' AFTER `augslot6type`;
ALTER TABLE `items` ADD `augslot6unk2` int( 11 ) NOT NULL DEFAULT '0' AFTER `augslot5unk2`;
/* Add the new Aug Slot 6 Field to the inventory table */
ALTER TABLE `inventory` ADD `augslot6` mediumint( 7 ) NOT NULL DEFAULT '0' AFTER `augslot5`;
/* Add the new Aug Slot 6 Field to the sharedbank table */
ALTER TABLE `sharedbank` ADD `augslot6` mediumint( 7 ) NOT NULL DEFAULT '0' AFTER `augslot5`;
/* Add the new Aug Slot 6 Field to the object_contents table */
ALTER TABLE `object_contents` ADD `augslot6` mediumint( 7 ) NOT NULL DEFAULT '0' AFTER `augslot5`;
/* Add the new Aug Slot 6 Field to the sharedbank table */
ALTER TABLE `character_corpse_items` ADD `aug_6` int( 11 ) NOT NULL DEFAULT '0' AFTER `aug_5`;

View File

@ -223,7 +223,7 @@ void Client::SendMembership() {
mc->entries[1] = 0xffffffff; // Max Level Restriction
mc->entries[2] = 0xffffffff; // Max Char Slots per Account (not used by client?)
mc->entries[3] = 0xffffffff; // 1 for Silver
mc->entries[4] = 8; // Main Inventory Size (0xffffffff on Live for Gold, but limitting to 8 until 10 is supported)
mc->entries[4] = 8; // Main Inventory Size (0xffffffff on Live for Gold, but limiting to 8 until 10 is supported)
mc->entries[5] = 0xffffffff; // Max Platinum per level
mc->entries[6] = 1; // 0 for Silver
mc->entries[7] = 1; // 0 for Silver
@ -397,6 +397,11 @@ bool Client::HandleSendLoginInfoPacket(const EQApplicationPacket *app) {
}
else if(strncasecmp(name, "LS#", 3) == 0)
id=atoi(&name[3]);
else if(database.GetAccountIDByName(name)){
int16 status = 0;
uint32 lsid = 0;
id = database.GetAccountIDByName(name, &status, &lsid);
}
else
id=atoi(name);
#ifdef IPBASED_AUTH_HACK
@ -406,7 +411,7 @@ bool Client::HandleSendLoginInfoPacket(const EQApplicationPacket *app) {
clog(WORLD__CLIENT_ERR,"Error: Login server login while not connected to login server.");
return false;
}
if ((minilogin && (cle = client_list.CheckAuth(id,password,ip))) || (cle = client_list.CheckAuth(id, password)))
if (((cle = client_list.CheckAuth(name, password)) || (cle = client_list.CheckAuth(id, password))))
#endif
{
if (cle->AccountID() == 0 || (!minilogin && cle->LSID()==0)) {

View File

@ -424,11 +424,13 @@ ClientListEntry* ClientList::CheckAuth(const char* iName, const char* iPassword)
}
int16 tmpadmin;
_log(WORLD__ZONELIST,"Login with '%s' and '%s'", iName, iPassword);
//_log(WORLD__ZONELIST,"Login with '%s' and '%s'", iName, iPassword);
uint32 accid = database.CheckLogin(iName, iPassword, &tmpadmin);
if (accid) {
ClientListEntry* tmp = new ClientListEntry(GetNextCLEID(), accid, iName, tmpMD5, tmpadmin);
uint32 lsid = 0;
database.GetAccountIDByName(iName, &tmpadmin, &lsid);
ClientListEntry* tmp = new ClientListEntry(GetNextCLEID(), lsid, iName, tmpMD5, tmpadmin, 0, 0);
clientlist.Append(tmp);
return tmp;
}
@ -545,7 +547,7 @@ void ClientList::SendWhoAll(uint32 fromid,const char* to, int16 admin, Who_All_S
if(totalusers<=20 || admin>=100)
totallength=totallength+strlen(countcle->name())+strlen(countcle->AccountName())+strlen(guild_mgr.GetGuildName(countcle->GuildID()))+5;
}
else if((countcle->Anon()>0 && admin<=countcle->Admin()) || countcle->Anon()==0 && !countcle->GetGM()){
else if((countcle->Anon()>0 && admin<=countcle->Admin()) || (countcle->Anon()==0 && !countcle->GetGM())) {
totalusers++;
if(totalusers<=20 || admin>=100)
totallength=totallength+strlen(countcle->name())+strlen(guild_mgr.GetGuildName(countcle->GuildID()))+5;
@ -1294,12 +1296,13 @@ void ClientList::GetClients(const char *zone_name, std::vector<ClientListEntry *
void ClientList::SendClientVersionSummary(const char *Name)
{
uint32 Client62Count = 0;
uint32 ClientTitaniumCount = 0;
uint32 ClientSoFCount = 0;
uint32 ClientSoDCount = 0;
uint32 ClientUnderfootCount = 0;
uint32 ClientRoFCount = 0;
uint32 ClientRoF2Count = 0;
LinkedListIterator<ClientListEntry*> Iterator(clientlist);
@ -1315,7 +1318,6 @@ void ClientList::SendClientVersionSummary(const char *Name)
{
case 1:
{
++Client62Count;
break;
}
case 2:
@ -1343,6 +1345,11 @@ void ClientList::SendClientVersionSummary(const char *Name)
++ClientRoFCount;
break;
}
case 7:
{
++ClientRoF2Count;
break;
}
default:
break;
}
@ -1352,7 +1359,7 @@ void ClientList::SendClientVersionSummary(const char *Name)
}
zoneserver_list.SendEmoteMessage(Name, 0, 0, 13, "There are %i 6.2, %i Titanium, %i SoF, %i SoD, %i UF, %i RoF clients currently connected.",
Client62Count, ClientTitaniumCount, ClientSoFCount, ClientSoDCount, ClientUnderfootCount, ClientRoFCount);
zoneserver_list.SendEmoteMessage(Name, 0, 0, 13, "There are %i Titanium, %i SoF, %i SoD, %i UF, %i RoF, %i RoF2 clients currently connected.",
ClientTitaniumCount, ClientSoFCount, ClientSoDCount, ClientUnderfootCount, ClientRoFCount, ClientRoF2Count);
}

View File

@ -154,18 +154,11 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct*
}
/* Bind End */
/*
Character's equipped items
@merth: Haven't done bracer01/bracer02 yet.
Also: this needs a second look after items are a little more solid
NOTE: items don't have a color, players MAY have a tint, if the
use_tint part is set. otherwise use the regular color
*/
/* Load Character Material Data for Char Select */
cquery = StringFormat("SELECT slot, red, green, blue, use_tint, color FROM `character_material` WHERE `id` = %u", character_id);
auto results_b = database.QueryDatabase(cquery); uint8 slot = 0;
for (auto row_b = results_b.begin(); row_b != results_b.end(); ++row_b) {
for (auto row_b = results_b.begin(); row_b != results_b.end(); ++row_b)
{
slot = atoi(row_b[0]);
pp.item_tint[slot].rgb.red = atoi(row_b[1]);
pp.item_tint[slot].rgb.green = atoi(row_b[2]);
@ -175,49 +168,80 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct*
/* Load Inventory */
inv = new Inventory;
if (GetInventory(account_id, cs->name[char_num], inv)) {
for (uint8 material = 0; material <= 8; material++) {
uint32 color = 0;
ItemInst *item = inv->GetItem(Inventory::CalcSlotFromMaterial(material));
if (item == 0)
continue;
if (GetInventory(account_id, cs->name[char_num], inv))
{
const Item_Struct* item = nullptr;
const ItemInst* inst = nullptr;
int16 invslot = 0;
cs->equip[char_num][material] = item->GetItem()->Material;
for (uint32 matslot = 0; matslot < _MaterialCount; matslot++)
{
invslot = Inventory::CalcSlotFromMaterial(matslot);
if (invslot == INVALID_INDEX) { continue; }
if (pp.item_tint[material].rgb.use_tint){ color = pp.item_tint[material].color; }
else{ color = item->GetItem()->Color; }
inst = inv->GetItem(invslot);
if (inst == nullptr) { continue; }
cs->cs_colors[char_num][material].color = color;
item = inst->GetItem();
if (item == nullptr) { continue; }
/* Weapons are handled a bit differently */
if ((material == MaterialPrimary) || (material == MaterialSecondary)) {
if (strlen(item->GetItem()->IDFile) > 2) {
int ornamentationAugtype = RuleI(Character, OrnamentationAugmentType);
uint32 idfile;
if (item->GetOrnamentationAug(ornamentationAugtype)) {
idfile = atoi(&item->GetOrnamentationAug(ornamentationAugtype)->GetItem()->IDFile[2]);
}
else if (item->GetOrnamentationIcon() && item->GetOrnamentationIDFile()) {
idfile = item->GetOrnamentationIDFile();
}
else {
idfile = atoi(&item->GetItem()->IDFile[2]);
}
if (material == MaterialPrimary)
cs->primary[char_num] = idfile;
else
cs->secondary[char_num] = idfile;
if (matslot > 6)
{
uint32 idfile = 0;
// Weapon Models
if (inst->GetOrnamentationIDFile() != 0)
{
idfile = inst->GetOrnamentationIDFile();
cs->equip[char_num][matslot].material = idfile;
}
else
{
if (strlen(item->IDFile) > 2)
{
idfile = atoi(&item->IDFile[2]);
cs->equip[char_num][matslot].material = idfile;
}
}
if (matslot == MaterialPrimary)
{
cs->primary[char_num] = idfile;
}
else
{
cs->secondary[char_num] = idfile;
}
}
else
{
uint32 color = 0;
if (pp.item_tint[matslot].rgb.use_tint)
{
color = pp.item_tint[matslot].color;
}
else
{
color = inst->GetColor();
}
// Armor Materials/Models
cs->equip[char_num][matslot].material = item->Material;
cs->equip[char_num][matslot].elitematerial = item->EliteMaterial;
cs->equip[char_num][matslot].heroforgemodel = inst->GetOrnamentHeroModel(matslot);
cs->equip[char_num][matslot].color.color = color;
}
}
}
else {
else
{
printf("Error loading inventory for %s\n", cs->name[char_num]);
}
safe_delete(inv);
if (++char_num > 10)
{
break;
}
}
return;

View File

@ -19,7 +19,6 @@ Copyright (C) 2001-2004 EQEMu Development Team (http://eqemulator.net)
#include "../common/classes.h"
#include "../common/debug.h"
#include "../common/eq_packet_structs.h"
#include "../common/packet_dump.h"
#include "../common/races.h"
#include "../common/spdat.h"
#include "../common/string_util.h"
@ -519,8 +518,7 @@ void Mob::TemporaryPets(uint16 spell_id, Mob *targ, const char *name_override, u
}
}
if(IsClient())
pet.duration += (CastToClient()->GetFocusEffect(focusSwarmPetDuration, spell_id) / 1000);
pet.duration += GetFocusEffect(focusSwarmPetDuration, spell_id) / 1000;
pet.npc_id = record.npc_type;
@ -893,7 +891,7 @@ void Mob::WakeTheDead(uint16 spell_id, Mob *target, uint32 duration)
//turn on an AA effect
//duration == 0 means no time limit, used for one-shot deals, etc..
void Client::EnableAAEffect(aaEffectType type, uint32 duration) {
if(type > 32)
if(type > _maxaaEffectType)
return; //for now, special logic needed.
m_epp.aa_effects |= 1 << (type-1);
@ -905,7 +903,7 @@ void Client::EnableAAEffect(aaEffectType type, uint32 duration) {
}
void Client::DisableAAEffect(aaEffectType type) {
if(type > 32)
if(type > _maxaaEffectType)
return; //for now, special logic needed.
uint32 bit = 1 << (type-1);
if(m_epp.aa_effects & bit) {
@ -919,7 +917,7 @@ By default an AA effect is a one shot deal, unless
a duration timer is set.
*/
bool Client::CheckAAEffect(aaEffectType type) {
if(type > 32)
if(type > _maxaaEffectType)
return(false); //for now, special logic needed.
if(m_epp.aa_effects & (1 << (type-1))) { //is effect enabled?
//has our timer expired?
@ -987,13 +985,20 @@ void Client::BuyAA(AA_Action* action)
}
uint32 real_cost;
uint8 req_level;
std::map<uint32, AALevelCost_Struct>::iterator RequiredLevel = AARequiredLevelAndCost.find(action->ability);
if(RequiredLevel != AARequiredLevelAndCost.end()) {
real_cost = RequiredLevel->second.Cost;
req_level = RequiredLevel->second.Level;
}
else
else {
real_cost = aa2->cost + (aa2->cost_inc * cur_level);
req_level = aa2->class_type + (aa2->level_inc * cur_level);
}
if (req_level > GetLevel())
return; //Cheater trying to Buy AA...
if (m_pp.aapoints >= real_cost && cur_level < aa2->max_level) {
SetAA(aa2->id, cur_level + 1);

View File

@ -5,6 +5,7 @@
struct AA_Ability;
struct SendAA_Struct;
#define MANA_BURN 664
#include <map>
@ -51,7 +52,8 @@ typedef enum { //AA Effect IDs
aaEffectFrostArrows,
aaEffectWarcry,
aaEffectLeechTouch,
aaEffectProjectIllusion // unused - Handled via spell effect
aaEffectProjectIllusion, // unused - Handled via spell effect
_maxaaEffectType = 32
} aaEffectType;
@ -2154,6 +2156,7 @@ enum { //values of AA_Action.action
};
class Timer;
class Mob;
class AA_SwarmPetInfo {
public:
AA_SwarmPetInfo();

Some files were not shown because too many files have changed in this diff Show More