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) 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 == == 12/04/2014 ==
Kayen: Ranged attacks will now more accurately check MAX firing range, fixing the issue where you would 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. 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 worldconn.cpp
xml_parser.cpp xml_parser.cpp
platform.cpp platform.cpp
patches/client62.cpp
patches/patches.cpp patches/patches.cpp
patches/sod.cpp patches/sod.cpp
patches/sof.cpp patches/sof.cpp
@ -193,11 +192,6 @@ SET(common_headers
worldconn.h worldconn.h
xml_parser.h xml_parser.h
zone_numbers.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/patches.h
patches/sod.h patches/sod.h
patches/sod_constants.h patches/sod_constants.h
@ -251,11 +245,6 @@ SET(common_headers
) )
SOURCE_GROUP(Patches FILES 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/patches.h
patches/sod.h patches/sod.h
patches/sod_itemfields.h patches/sod_itemfields.h
@ -291,7 +280,6 @@ SOURCE_GROUP(Patches FILES
patches/underfoot_ops.h patches/underfoot_ops.h
patches/underfoot_constants.h patches/underfoot_constants.h
patches/underfoot_structs.h patches/underfoot_structs.h
patches/client62.cpp
patches/patches.cpp patches/patches.cpp
patches/sod.cpp patches/sod.cpp
patches/sof.cpp patches/sof.cpp

View File

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

View File

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

View File

@ -14,7 +14,7 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "../common/debug.h" #include "../common/debug.h"
#include "../common/classes.h" #include "../common/classes.h"

View File

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

View File

@ -15,13 +15,13 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "../common/debug.h" #include "../common/debug.h"
#include "../common/rulesys.h" #include "../common/rulesys.h"
#include <cmath>
#include <ctype.h> #include <ctype.h>
#include <iomanip> #include <iomanip>
#include <iostream> #include <iostream>
#include <limits.h>
#include <map> #include <map>
#include <mysqld_error.h> #include <mysqld_error.h>
#include <stdio.h> #include <stdio.h>
@ -42,8 +42,8 @@
#include "database.h" #include "database.h"
#include "eq_packet_structs.h" #include "eq_packet_structs.h"
#include "string_util.h"
#include "extprofile.h" #include "extprofile.h"
#include "string_util.h"
extern Client client; extern Client client;
@ -2099,6 +2099,7 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
"`aug_3` int(11) unsigned DEFAULT '0', " "`aug_3` int(11) unsigned DEFAULT '0', "
"`aug_4` int(11) unsigned DEFAULT '0', " "`aug_4` int(11) unsigned DEFAULT '0', "
"`aug_5` 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', " "`attuned` smallint(5) NOT NULL DEFAULT '0', "
"PRIMARY KEY(`corpse_id`, `equip_slot`) " "PRIMARY KEY(`corpse_id`, `equip_slot`) "
") ENGINE = InnoDB DEFAULT CHARSET = latin1; " ") ENGINE = InnoDB DEFAULT CHARSET = latin1; "
@ -2276,8 +2277,8 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
for (unsigned int i = 0; i < dbpc->itemcount; i++) { for (unsigned int i = 0; i < dbpc->itemcount; i++) {
if (first_entry != 1){ if (first_entry != 1){
scquery = StringFormat("REPLACE INTO `character_corpse_items` \n" 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" " (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, 0) \n", " VALUES (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u) \n",
atoi(row2[0]), atoi(row2[0]),
dbpc->items[i].equipSlot, dbpc->items[i].equipSlot,
dbpc->items[i].item_id, dbpc->items[i].item_id,
@ -2286,12 +2287,14 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
dbpc->items[i].aug2, dbpc->items[i].aug2,
dbpc->items[i].aug3, dbpc->items[i].aug3,
dbpc->items[i].aug4, dbpc->items[i].aug4,
dbpc->items[i].aug5 dbpc->items[i].aug5,
dbpc->items[i].aug6,
dbpc->items[i].attuned
); );
first_entry = 1; first_entry = 1;
} }
else{ 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]), atoi(row2[0]),
dbpc->items[i].equipSlot, dbpc->items[i].equipSlot,
dbpc->items[i].item_id, dbpc->items[i].item_id,
@ -2300,7 +2303,9 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
dbpc->items[i].aug2, dbpc->items[i].aug2,
dbpc->items[i].aug3, dbpc->items[i].aug3,
dbpc->items[i].aug4, dbpc->items[i].aug4,
dbpc->items[i].aug5 dbpc->items[i].aug5,
dbpc->items[i].aug6,
dbpc->items[i].attuned
); );
} }
} }
@ -2381,8 +2386,8 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
for (unsigned int i = 0; i < dbpc_c->itemcount; i++) { for (unsigned int i = 0; i < dbpc_c->itemcount; i++) {
if (first_entry != 1){ if (first_entry != 1){
scquery = StringFormat("REPLACE INTO `character_corpse_items` \n" 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" " (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, 0) \n", " VALUES (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u) \n",
atoi(row2[0]), atoi(row2[0]),
dbpc_c->items[i].equipSlot, dbpc_c->items[i].equipSlot,
dbpc_c->items[i].item_id, dbpc_c->items[i].item_id,
@ -2391,12 +2396,14 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
dbpc_c->items[i].aug2, dbpc_c->items[i].aug2,
dbpc_c->items[i].aug3, dbpc_c->items[i].aug3,
dbpc_c->items[i].aug4, 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; first_entry = 1;
} }
else{ 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]), atoi(row2[0]),
dbpc_c->items[i].equipSlot, dbpc_c->items[i].equipSlot,
dbpc_c->items[i].item_id, dbpc_c->items[i].item_id,
@ -2405,7 +2412,9 @@ bool Database::CheckDatabaseConvertCorpseDeblob(){
dbpc_c->items[i].aug2, dbpc_c->items[i].aug2,
dbpc_c->items[i].aug3, dbpc_c->items[i].aug3,
dbpc_c->items[i].aug4, 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 "dbcore.h"
#include "linked_list.h" #include "linked_list.h"
#include "eq_packet_structs.h" #include "eq_packet_structs.h"
#include <cmath>
#include <string> #include <string>
#include <vector> #include <vector>
#include <map> #include <map>
@ -33,23 +35,9 @@
//atoi is not uint32 or uint32 safe!!!! //atoi is not uint32 or uint32 safe!!!!
#define atoul(str) strtoul(str, nullptr, 10) #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 Inventory;
class ItemInst; class MySQLRequestResult;
class Client;
struct EventLogDetails_Struct { struct EventLogDetails_Struct {
uint32 id; uint32 id;
@ -81,11 +69,6 @@ struct VarCache_Struct {
char value[0]; char value[0];
}; };
struct PlayerProfile_Struct;
struct GuildRankLevel_Struct;
struct GuildRanks_Struct;
struct ExtendedProfile_Struct;
struct GuildMember_Struct;
class PTimerList; class PTimerList;
#pragma pack(1) #pragma pack(1)
@ -426,6 +409,8 @@ namespace Convert {
uint32 aug3; uint32 aug3;
uint32 aug4; uint32 aug4;
uint32 aug5; uint32 aug5;
uint32 aug6;
uint8 attuned;
}; };
} }

View File

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

View File

@ -6,15 +6,12 @@
#include <windows.h> #include <windows.h>
#endif #endif
#include "../common/mutex.h"
#include "../common/mysql_request_result.h"
#include "../common/types.h"
#include <mysql.h> #include <mysql.h>
#include <string.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 { class DBcore {
public: public:

View File

@ -1,7 +1,5 @@
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <cstdarg>
#include <time.h>
#ifdef _WINDOWS #ifdef _WINDOWS
#include <process.h> #include <process.h>
@ -19,7 +17,6 @@
#endif #endif
#include "debug.h" #include "debug.h"
#include "string_util.h"
#include "misc_functions.h" #include "misc_functions.h"
#include "platform.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* 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" }; static const char* LogNames[EQEMuLog::MaxLogID] = { "Status", "Normal", "Error", "Debug", "Quest", "Command", "Crash" };
EQEMuLog::EQEMuLog() { EQEMuLog::EQEMuLog()
for (int i=0; i<MaxLogID; i++) { {
for (int i = 0; i < MaxLogID; i++) {
fp[i] = 0; fp[i] = 0;
logCallbackFmt[i] = nullptr; logCallbackFmt[i] = nullptr;
logCallbackBuf[i] = nullptr; logCallbackBuf[i] = nullptr;
logCallbackPva[i] = nullptr; logCallbackPva[i] = nullptr;
} }
pLogStatus[EQEMuLog::LogIDs::Status] = LOG_LEVEL_STATUS;
pLogStatus[Status] = LOG_LEVEL_STATUS; pLogStatus[EQEMuLog::LogIDs::Normal] = LOG_LEVEL_NORMAL;
pLogStatus[Normal] = LOG_LEVEL_NORMAL; pLogStatus[EQEMuLog::LogIDs::Error] = LOG_LEVEL_ERROR;
pLogStatus[Error] = LOG_LEVEL_ERROR; pLogStatus[EQEMuLog::LogIDs::Debug] = LOG_LEVEL_DEBUG;
pLogStatus[Debug] = LOG_LEVEL_DEBUG; pLogStatus[EQEMuLog::LogIDs::Quest] = LOG_LEVEL_QUEST;
pLogStatus[Quest] = LOG_LEVEL_QUEST; pLogStatus[EQEMuLog::LogIDs::Commands] = LOG_LEVEL_COMMANDS;
pLogStatus[Commands] = LOG_LEVEL_COMMANDS; pLogStatus[EQEMuLog::LogIDs::Crash] = LOG_LEVEL_CRASH;
pLogStatus[Crash] = LOG_LEVEL_CRASH;
logFileValid = true; logFileValid = true;
} }
EQEMuLog::~EQEMuLog() { EQEMuLog::~EQEMuLog()
{
logFileValid = false; logFileValid = false;
for (int i=0; i<MaxLogID; i++) { for (int i = 0; i < MaxLogID; i++) {
LockMutex lock(&MLog[i]); //to prevent termination race LockMutex lock(&MLog[i]); //to prevent termination race
if (fp[i]) if (fp[i]) {
fclose(fp[i]); fclose(fp[i]);
} }
}
} }
bool EQEMuLog::open(LogIDs id) { bool EQEMuLog::open(LogIDs id)
{
if (!logFileValid) { if (!logFileValid) {
return false; return false;
} }
@ -76,114 +76,44 @@ bool EQEMuLog::open(LogIDs id) {
//cerr<<"Warning: LogFile already open"<<endl; //cerr<<"Warning: LogFile already open"<<endl;
return true; return true;
} }
char exename[200] = ""; char exename[200] = "";
const EQEmuExePlatform &platform = GetExecutablePlatform(); const EQEmuExePlatform &platform = GetExecutablePlatform();
if(platform == ExePlatformWorld) { if (platform == ExePlatformWorld) {
snprintf(exename, sizeof(exename), "_world"); snprintf(exename, sizeof(exename), "_world");
} else if(platform == ExePlatformZone) { } else if (platform == ExePlatformZone) {
snprintf(exename, sizeof(exename), "_zone"); snprintf(exename, sizeof(exename), "_zone");
} else if(platform == ExePlatformLaunch) { } else if (platform == ExePlatformLaunch) {
snprintf(exename, sizeof(exename), "_launch"); snprintf(exename, sizeof(exename), "_launch");
} else if(platform == ExePlatformUCS) { } else if (platform == ExePlatformUCS) {
snprintf(exename, sizeof(exename), "_ucs"); snprintf(exename, sizeof(exename), "_ucs");
} else if(platform == ExePlatformQueryServ) { } else if (platform == ExePlatformQueryServ) {
snprintf(exename, sizeof(exename), "_queryserv"); snprintf(exename, sizeof(exename), "_queryserv");
} else if(platform == ExePlatformSharedMemory) { } else if (platform == ExePlatformSharedMemory) {
snprintf(exename, sizeof(exename), "_shared_memory"); snprintf(exename, sizeof(exename), "_shared_memory");
} else if(platform == ExePlatformClientImport) { } else if (platform == ExePlatformClientImport) {
snprintf(exename, sizeof(exename), "_import"); snprintf(exename, sizeof(exename), "_import");
} else if(platform == ExePlatformClientExport) { } else if (platform == ExePlatformClientExport) {
snprintf(exename, sizeof(exename), "_export"); snprintf(exename, sizeof(exename), "_export");
} }
char filename[200]; char filename[200];
#ifndef NO_PIDLOG #ifndef NO_PIDLOG
snprintf(filename, sizeof(filename), "%s%s_%04i.log", FileNames[id], exename, getpid()); snprintf(filename, sizeof(filename), "%s%s_%04i.log", FileNames[id], exename, getpid());
#else #else
snprintf(filename, sizeof(filename), "%s%s.log", FileNames[id], exename); snprintf(filename, sizeof(filename), "%s%s.log", FileNames[id], exename);
#endif #endif
fp[id] = fopen(filename, "a"); fp[id] = fopen(filename, "a");
if (!fp[id]) { if (!fp[id]) {
std::cerr << "Failed to open log file: " << filename << std::endl; std::cerr << "Failed to open log file: " << filename << std::endl;
pLogStatus[id] |= 4; // set file state to error pLogStatus[id] |= 4; // set file state to error
return false; return false;
} }
fputs("---------------------------------------------\n",fp[id]); fputs("---------------------------------------------\n", fp[id]);
write(id, "Starting Log: %s", filename); write(id, "Starting Log: %s", filename);
return true; return true;
} }
bool EQEMuLog::write(LogIDs id, const char *fmt, ...) { 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) {
if (!logFileValid) { if (!logFileValid) {
return false; return false;
} }
@ -198,56 +128,61 @@ bool EQEMuLog::writePVA(LogIDs id, const char *prefix, const char *fmt, va_list
return false; return false;
} }
LockMutex lock(&MLog[id]); LockMutex lock(&MLog[id]);
if (!logFileValid) if (!logFileValid) {
return false; //check again for threading race reasons (to avoid two mutexes) return false; //check again for threading race reasons (to avoid two mutexes)
}
time_t aclock; time_t aclock;
struct tm *newtime; struct tm *newtime;
time( &aclock ); /* Get time in seconds */ time( &aclock ); /* Get time in seconds */
newtime = localtime( &aclock ); /* Convert time to struct */ newtime = localtime( &aclock ); /* Convert time to struct */
if (dofile)
va_list tmpargptr; #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) { 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); va_copy(tmpargptr, argptr);
vfprintf( fp[id], fmt, tmpargptr ); vfprintf( fp[id], fmt, tmpargptr );
} }
if(logCallbackPva[id]) { if (logCallbackFmt[id]) {
msgCallbackPva p = logCallbackPva[id]; msgCallbackFmt p = logCallbackFmt[id];
va_copy(tmpargptr, argptr); va_copy(tmpargptr, argptr);
p(id, prefix, fmt, tmpargptr ); p(id, fmt, tmpargptr );
} }
if (pLogStatus[id] & 2) { if (pLogStatus[id] & 2) {
if (pLogStatus[id] & 8) { if (pLogStatus[id] & 8) {
fprintf(stderr, "[%s] %s", LogNames[id], prefix); fprintf(stderr, "[%s] ", LogNames[id]);
vfprintf( stderr, fmt, argptr ); vfprintf( stderr, fmt, argptr );
} } else {
else { fprintf(stdout, "[%s] ", LogNames[id]);
fprintf(stdout, "[%s] %s", LogNames[id], prefix);
vfprintf( stdout, fmt, argptr ); vfprintf( stdout, fmt, argptr );
} }
} }
va_end(argptr); va_end(argptr);
if (dofile) if (dofile) {
fprintf(fp[id], "\n"); 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]); fflush(fp[id]);
}
return true; 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) { if (!logFileValid) {
return false; return false;
} }
@ -258,30 +193,92 @@ bool EQEMuLog::writebuf(LogIDs id, const char *buf, uint8 size, uint32 count) {
if (pLogStatus[id] & 1) { if (pLogStatus[id] & 1) {
dofile = open(id); dofile = open(id);
} }
if (!(dofile || pLogStatus[id] & 2)) if (!(dofile || pLogStatus[id] & 2)) {
return false; return false;
}
LockMutex lock(&MLog[id]); LockMutex lock(&MLog[id]);
if (!logFileValid) if (!logFileValid) {
return false; //check again for threading race reasons (to avoid two mutexes) return false; //check again for threading race reasons (to avoid two mutexes)
}
time_t aclock; time_t aclock;
struct tm *newtime; struct tm *newtime;
time( &aclock ); /* Get time in seconds */ time( &aclock ); /* Get time in seconds */
newtime = localtime( &aclock ); /* Convert time to struct */ 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) if (dofile)
#ifndef NO_PIDLOG #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); 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 #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); 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 #endif
if (dofile) { if (dofile) {
fwrite(buf, size, count, fp[id]); fwrite(buf, size, count, fp[id]);
fprintf(fp[id], "\n"); fprintf(fp[id], "\n");
} }
if(logCallbackBuf[id]) { if (logCallbackBuf[id]) {
msgCallbackBuf p = logCallbackBuf[id]; msgCallbackBuf p = logCallbackBuf[id];
p(id, buf, size, count); p(id, buf, size, count);
} }
@ -296,12 +293,14 @@ bool EQEMuLog::writebuf(LogIDs id, const char *buf, uint8 size, uint32 count) {
fprintf(stdout, "\n"); fprintf(stdout, "\n");
} }
} }
if(dofile) if (dofile) {
fflush(fp[id]); fflush(fp[id]);
}
return true; 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_list argptr, tmpargptr;
va_start(argptr, fmt); va_start(argptr, fmt);
if (dofile) { if (dofile) {
@ -309,132 +308,146 @@ bool EQEMuLog::writeNTS(LogIDs id, bool dofile, const char *fmt, ...) {
vfprintf( fp[id], fmt, tmpargptr ); vfprintf( fp[id], fmt, tmpargptr );
} }
if (pLogStatus[id] & 2) { if (pLogStatus[id] & 2) {
if (pLogStatus[id] & 8) if (pLogStatus[id] & 8) {
vfprintf( stderr, fmt, argptr ); vfprintf( stderr, fmt, argptr );
else } else {
vfprintf( stdout, fmt, argptr ); vfprintf( stdout, fmt, argptr );
} }
}
va_end(argptr); va_end(argptr);
return true; 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 (!logFileValid) {
#if EQDEBUG >= 10 #if EQDEBUG >= 10
std::cerr << "Error: Dump() from null pointer" << std::endl; std::cerr << "Error: Dump() from null pointer" << std::endl;
#endif #endif
return false; return false;
} }
if (size == 0) if (size == 0) {
return true; return true;
if (!LogFile) }
if (!LogFile) {
return false; return false;
if (id >= MaxLogID) }
if (id >= MaxLogID) {
return false; return false;
}
bool dofile = false; bool dofile = false;
if (pLogStatus[id] & 1) { if (pLogStatus[id] & 1) {
dofile = open(id); dofile = open(id);
} }
if (!(dofile || pLogStatus[id] & 2)) if (!(dofile || pLogStatus[id] & 2)) {
return false; return false;
}
LockMutex lock(&MLog[id]); LockMutex lock(&MLog[id]);
if (!logFileValid) if (!logFileValid) {
return false; //check again for threading race reasons (to avoid two mutexes) return false; //check again for threading race reasons (to avoid two mutexes)
}
write(id, "Dumping Packet: %i", size); write(id, "Dumping Packet: %i", size);
// Output as HEX // Output as HEX
int beginningOfLineOffset = 0; int beginningOfLineOffset = 0;
uint32 indexInData; uint32 indexInData;
std::string asciiOutput; std::string asciiOutput;
for (indexInData = skip; indexInData < size; indexInData++) {
for(indexInData=skip; indexInData<size; indexInData++) { if ((indexInData - skip) % cols == 0) {
if ((indexInData-skip)%cols==0) { if (indexInData != skip) {
if (indexInData != skip)
writeNTS(id, dofile, " | %s\n", asciiOutput.c_str()); writeNTS(id, dofile, " | %s\n", asciiOutput.c_str());
writeNTS(id, dofile, "%4i: ", indexInData-skip); }
writeNTS(id, dofile, "%4i: ", indexInData - skip);
asciiOutput.clear(); asciiOutput.clear();
beginningOfLineOffset = 0; beginningOfLineOffset = 0;
} } else if ((indexInData - skip) % (cols / 2) == 0) {
else if ((indexInData-skip)%(cols/2) == 0) {
writeNTS(id, dofile, "- "); writeNTS(id, dofile, "- ");
} }
writeNTS(id, dofile, "%02X ", (unsigned char)data[indexInData]); 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 // 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. // version.
asciiOutput.append(std::to_string((long long)data[indexInData])); asciiOutput.append(std::to_string((long long)data[indexInData]));
} } else {
else
{
asciiOutput.append("."); asciiOutput.append(".");
} }
} }
uint32 k = ((indexInData-skip)-1)%cols; uint32 k = ((indexInData - skip) - 1) % cols;
if (k < 8) if (k < 8) {
writeNTS(id, dofile, " "); 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, " ");
} }
writeNTS(id, dofile, " | %s\n", asciiOutput.c_str()); writeNTS(id, dofile, " | %s\n", asciiOutput.c_str());
if (dofile) if (dofile) {
fflush(fp[id]); fflush(fp[id]);
}
return true; return true;
} }
void EQEMuLog::SetCallback(LogIDs id, msgCallbackFmt proc) { void EQEMuLog::SetCallback(LogIDs id, msgCallbackFmt proc)
if (!logFileValid) {
if (!logFileValid) {
return; return;
}
if (id >= MaxLogID) { if (id >= MaxLogID) {
return; return;
} }
logCallbackFmt[id] = proc; logCallbackFmt[id] = proc;
} }
void EQEMuLog::SetCallback(LogIDs id, msgCallbackBuf proc) { void EQEMuLog::SetCallback(LogIDs id, msgCallbackBuf proc)
if (!logFileValid) {
if (!logFileValid) {
return; return;
}
if (id >= MaxLogID) { if (id >= MaxLogID) {
return; return;
} }
logCallbackBuf[id] = proc; logCallbackBuf[id] = proc;
} }
void EQEMuLog::SetCallback(LogIDs id, msgCallbackPva proc) { void EQEMuLog::SetCallback(LogIDs id, msgCallbackPva proc)
if (!logFileValid) {
if (!logFileValid) {
return; return;
}
if (id >= MaxLogID) { if (id >= MaxLogID) {
return; return;
} }
logCallbackPva[id] = proc; logCallbackPva[id] = proc;
} }
void EQEMuLog::SetAllCallbacks(msgCallbackFmt proc) { void EQEMuLog::SetAllCallbacks(msgCallbackFmt proc)
if (!logFileValid) {
if (!logFileValid) {
return; return;
}
int r; int r;
for(r = Status; r < MaxLogID; r++) { for (r = Status; r < MaxLogID; r++) {
SetCallback((LogIDs)r, proc); SetCallback((LogIDs)r, proc);
} }
} }
void EQEMuLog::SetAllCallbacks(msgCallbackBuf proc) { void EQEMuLog::SetAllCallbacks(msgCallbackBuf proc)
if (!logFileValid) {
if (!logFileValid) {
return; return;
}
int r; int r;
for(r = Status; r < MaxLogID; r++) { for (r = Status; r < MaxLogID; r++) {
SetCallback((LogIDs)r, proc); SetCallback((LogIDs)r, proc);
} }
} }
void EQEMuLog::SetAllCallbacks(msgCallbackPva proc) { void EQEMuLog::SetAllCallbacks(msgCallbackPva proc)
if (!logFileValid) {
if (!logFileValid) {
return; return;
}
int r; int r;
for(r = Status; r < MaxLogID; r++) { for (r = Status; r < MaxLogID; r++) {
SetCallback((LogIDs)r, proc); SetCallback((LogIDs)r, proc);
} }
} }

View File

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

View File

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

View File

@ -548,7 +548,7 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
}, },
{ // local[MapBank] { // local[MapBank]
/*Unknown*/ NOT_USED, /*Unknown*/ NOT_USED,
/*62*/ Client62::consts::MAP_BANK_SIZE, /*62*/ NOT_USED,
/*Titanium*/ Titanium::consts::MAP_BANK_SIZE, /*Titanium*/ Titanium::consts::MAP_BANK_SIZE,
/*SoF*/ EmuConstants::MAP_BANK_SIZE, /*SoF*/ EmuConstants::MAP_BANK_SIZE,
/*SoD*/ EmuConstants::MAP_BANK_SIZE, /*SoD*/ EmuConstants::MAP_BANK_SIZE,
@ -698,7 +698,7 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
}, },
{ // local[MapCorpse] { // local[MapCorpse]
/*Unknown*/ NOT_USED, /*Unknown*/ NOT_USED,
/*62*/ Client62::consts::MAP_CORPSE_SIZE, /*62*/ NOT_USED,
/*Titanium*/ Titanium::consts::MAP_CORPSE_SIZE, /*Titanium*/ Titanium::consts::MAP_CORPSE_SIZE,
/*SoF*/ SoF::consts::MAP_CORPSE_SIZE, /*SoF*/ SoF::consts::MAP_CORPSE_SIZE,
/*SoD*/ SoD::consts::MAP_CORPSE_SIZE, /*SoD*/ SoD::consts::MAP_CORPSE_SIZE,
@ -728,7 +728,7 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
}, },
{ // local[MapInspect] { // local[MapInspect]
/*Unknown*/ NOT_USED, /*Unknown*/ NOT_USED,
/*62*/ Client62::consts::MAP_INSPECT_SIZE, /*62*/ NOT_USED,
/*Titanium*/ Titanium::consts::MAP_INSPECT_SIZE, /*Titanium*/ Titanium::consts::MAP_INSPECT_SIZE,
/*SoF*/ SoF::consts::MAP_INSPECT_SIZE, /*SoF*/ SoF::consts::MAP_INSPECT_SIZE,
/*SoD*/ SoD::consts::MAP_INSPECT_SIZE, /*SoD*/ SoD::consts::MAP_INSPECT_SIZE,
@ -1006,7 +1006,7 @@ uint64 EQLimits::CursorBitmask(uint32 version) {
bool EQLimits::AllowsEmptyBagInBag(uint32 version) { bool EQLimits::AllowsEmptyBagInBag(uint32 version) {
static const bool local[_EmuClientCount] = { static const bool local[_EmuClientCount] = {
/*Unknown*/ false, /*Unknown*/ false,
/*62*/ Client62::limits::ALLOWS_EMPTY_BAG_IN_BAG, /*62*/ false,
/*Titanium*/ Titanium::limits::ALLOWS_EMPTY_BAG_IN_BAG, /*Titanium*/ Titanium::limits::ALLOWS_EMPTY_BAG_IN_BAG,
/*SoF*/ SoF::limits::ALLOWS_EMPTY_BAG_IN_BAG, /*SoF*/ SoF::limits::ALLOWS_EMPTY_BAG_IN_BAG,
/*SoD*/ SoD::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) { bool EQLimits::AllowsClickCastFromBag(uint32 version) {
static const bool local[_EmuClientCount] = { static const bool local[_EmuClientCount] = {
/*Unknown*/ false, /*Unknown*/ false,
/*62*/ Client62::limits::ALLOWS_CLICK_CAST_FROM_BAG, /*62*/ false,
/*Titanium*/ Titanium::limits::ALLOWS_CLICK_CAST_FROM_BAG, /*Titanium*/ Titanium::limits::ALLOWS_CLICK_CAST_FROM_BAG,
/*SoF*/ SoF::limits::ALLOWS_CLICK_CAST_FROM_BAG, /*SoF*/ SoF::limits::ALLOWS_CLICK_CAST_FROM_BAG,
/*SoD*/ SoD::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) { bool EQLimits::CoinHasWeight(uint32 version) {
static const bool local[_EmuClientCount] = { static const bool local[_EmuClientCount] = {
/*Unknown*/ true, /*Unknown*/ true,
/*62*/ Client62::limits::COIN_HAS_WEIGHT, /*62*/ true,
/*Titanium*/ Titanium::limits::COIN_HAS_WEIGHT, /*Titanium*/ Titanium::limits::COIN_HAS_WEIGHT,
/*SoF*/ SoF::limits::COIN_HAS_WEIGHT, /*SoF*/ SoF::limits::COIN_HAS_WEIGHT,
/*SoD*/ SoD::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 "eq_constants.h"
#include "clientversions.h" #include "clientversions.h"
#include <string> #include <string>
#include "../common/patches/client62_constants.h"
#include "../common/patches/titanium_constants.h" #include "../common/patches/titanium_constants.h"
#include "../common/patches/sof_constants.h" #include "../common/patches/sof_constants.h"
#include "../common/patches/sod_constants.h" #include "../common/patches/sod_constants.h"
@ -138,8 +137,8 @@ public:
// items // items
// common and container sizes will not increase until the new 'location' struct is implemented // 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_COMMON_SIZE = RoF::consts::ITEM_COMMON_SIZE;
static const uint16 ITEM_CONTAINER_SIZE = Underfoot::consts::ITEM_CONTAINER_SIZE; static const uint16 ITEM_CONTAINER_SIZE = Titanium::consts::ITEM_CONTAINER_SIZE;
// player profile // player profile
//static const uint32 CLASS_BITMASK = 0; // needs value //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 along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "crc16.h"
#include "debug.h" #include "debug.h"
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include "eq_packet.h" #include "eq_packet.h"
#include "misc.h" #include "misc.h"
#include "op_codes.h" #include "op_codes.h"
#include "crc16.h"
#include "platform.h" #include "platform.h"
#include <iomanip>
#include <iostream>
#include <stdio.h>
#ifndef STATIC_OPCODE #ifndef STATIC_OPCODE
#include "opcodemgr.h" #include "opcodemgr.h"
#endif #endif
#include "packet_dump.h" #include "packet_dump.h"
#include "packet_functions.h" #include "packet_functions.h"
#include <cstdlib> #include <cstdlib>

View File

@ -19,8 +19,6 @@
#define _EQPACKET_H #define _EQPACKET_H
#include "base_packet.h" #include "base_packet.h"
#include "eq_stream_type.h"
#include "op_codes.h"
#include "platform.h" #include "platform.h"
#ifdef STATIC_OPCODE #ifdef STATIC_OPCODE
@ -30,9 +28,6 @@
#include "emu_opcodes.h" #include "emu_opcodes.h"
#endif #endif
class EQStream;
class EQStreamPair;
class EQPacket : public BasePacket { class EQPacket : public BasePacket {
friend class EQStream; friend class EQStream;
public: 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 ** Character Selection Struct
** Length: 1704 Bytes ** Length: 1704 Bytes
@ -152,10 +174,11 @@ struct Color_Struct
*/ */
struct CharacterSelect_Struct { struct CharacterSelect_Struct {
/*0000*/ uint32 race[10]; // Characters Race /*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 /*0400*/ uint8 beardcolor[10]; // Characters beard Color
/*0410*/ uint8 hairstyle[10]; // Characters hair style /*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 /*0780*/ uint32 secondary[10]; // Characters secondary IDFile number
/*0820*/ uint32 drakkin_heritage[10]; // added for SoF /*0820*/ uint32 drakkin_heritage[10]; // added for SoF
/*0860*/ uint32 drakkin_tattoo[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 /*0193*/ uint8 guildrank; // 0=normal, 1=officer, 2=leader
/*0194*/ uint8 unknown0194[3]; /*0194*/ uint8 unknown0194[3];
/*0197*/ union /*0197*/ union
{ {
struct struct
{ {
/*0197*/ uint32 equip_helmet; // Equipment: Helmet Visual /*0000*/ EquipStruct equip_helmet; // Equipment: Helmet visual
/*0201*/ uint32 equip_chest; // Equipment: Chest Visual /*0000*/ EquipStruct equip_chest; // Equipment: Chest visual
/*0205*/ uint32 equip_arms; // Equipment: Arms Visual /*0000*/ EquipStruct equip_arms; // Equipment: Arms visual
/*0209*/ uint32 equip_bracers; // Equipment: Bracers Visual /*0000*/ EquipStruct equip_bracers; // Equipment: Wrist visual
/*0213*/ uint32 equip_hands; // Equipment: Hands Visual /*0000*/ EquipStruct equip_hands; // Equipment: Hands visual
/*0217*/ uint32 equip_legs; // Equipment: Legs Visual /*0000*/ EquipStruct equip_legs; // Equipment: Legs visual
/*0221*/ uint32 equip_feet; // Equipment: Feet Visual /*0000*/ EquipStruct equip_feet; // Equipment: Boots visual
/*0225*/ uint32 equip_primary; // Equipment: Primary Visual /*0000*/ EquipStruct equip_primary; // Equipment: Main visual
/*0229*/ uint32 equip_secondary; // Equipment: Secondary Visual /*0000*/ EquipStruct equip_secondary; // Equipment: Off visual
} equip; } equip;
/*0197*/ uint32 equipment[_MaterialCount]; // Array elements correspond to struct equipment above /*0000*/ EquipStruct equipment[_MaterialCount];
}; };
/*0233*/ float runspeed; // Speed when running /*0233*/ float runspeed; // Speed when running
/*0036*/ uint8 afk; // 0=no, 1=afk /*0036*/ uint8 afk; // 0=no, 1=afk
/*0238*/ uint32 guildID; // Current guild /*0238*/ uint32 guildID; // Current guild
@ -340,6 +363,7 @@ union
uint32 DestructibleUnk7; uint32 DestructibleUnk7;
uint8 DestructibleUnk8; uint8 DestructibleUnk8;
uint32 DestructibleUnk9; uint32 DestructibleUnk9;
bool targetable_with_hotkey;
}; };
@ -1356,19 +1380,19 @@ struct PlayerPositionUpdateServer_Struct
struct PlayerPositionUpdateClient_Struct struct PlayerPositionUpdateClient_Struct
{ {
/*0000*/ uint16 spawn_id; /*0000*/ uint16 spawn_id;
/*0022*/ uint16 sequence; //increments one each packet /*0002*/ uint16 sequence; //increments one each packet
/*0004*/ float y_pos; // y coord /*0004*/ float y_pos; // y coord
/*0008*/ float delta_z; // Change in z /*0008*/ float delta_z; // Change in z
/*0016*/ float delta_x; // Change in x /*0012*/ float delta_x; // Change in x
/*0012*/ float delta_y; // Change in y /*0016*/ float delta_y; // Change in y
/*0020*/ int32 animation:10, // animation /*0020*/ int32 animation:10, // animation
delta_heading:10, // change in heading delta_heading:10, // change in heading
padding0020:12; // ***Placeholder (mostly 1) padding0020:12; // ***Placeholder (mostly 1)
/*0024*/ float x_pos; // x coord /*0024*/ float x_pos; // x coord
/*0028*/ float z_pos; // z coord /*0028*/ float z_pos; // z coord
/*0034*/ uint16 heading:12, // Directional heading /*0032*/ uint16 heading:12, // Directional heading
padding0004:4; // ***Placeholder padding0004:4; // ***Placeholder
/*0032*/ uint8 unknown0006[2]; // ***Placeholder /*0034*/ uint8 unknown0006[2]; // ***Placeholder
/*0036*/ /*0036*/
}; };
@ -2895,7 +2919,7 @@ uint8 npccastfilters; // 0) No, 1) Ignore NPC Casts (all), 2) Ignore NPC Casts
*/ */
struct ItemViewRequest_Struct { struct ItemViewRequest_Struct {
/*000*/ uint32 item_id; /*000*/ uint32 item_id;
/*004*/ uint32 augments[5]; /*004*/ uint32 augments[6];
/*024*/ uint32 link_hash; /*024*/ uint32 link_hash;
/*028*/ uint32 unknown028; /*028*/ uint32 unknown028;
/*032*/ char unknown032[12]; //probably includes loregroup & evolving info. see Client::MakeItemLink() in zone/inventory.cpp:469 /*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_3; // uint32 aug_3;
uint32 aug_4; // uint32 aug_4; uint32 aug_4; // uint32 aug_4;
uint32 aug_5; // uint32 aug_5; uint32 aug_5; // uint32 aug_5;
uint8 min_level; // uint32 aug_6; // uint32 aug_5;
uint8 max_level; // uint8 attuned;
uint8 min_level;
uint8 max_level;
}; };
//Found in client near a ref to the string: //Found in client near a ref to the string:

View File

@ -19,15 +19,12 @@
#include "debug.h" #include "debug.h"
#include "eq_packet.h" #include "eq_packet.h"
#include "eq_stream.h" #include "eq_stream.h"
#include "misc.h"
#include "mutex.h"
#include "op_codes.h" #include "op_codes.h"
#include "crc16.h" #include "crc16.h"
#include "platform.h" #include "platform.h"
#include <string> #include <string>
#include <iomanip> #include <iomanip>
#include <iostream>
#include <vector> #include <vector>
#include <algorithm> #include <algorithm>
@ -50,7 +47,13 @@
uint16 EQStream::MaxWindowSize=2048; 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; active_users = 0;
Session=0; Session=0;
Key=0; Key=0;
@ -316,18 +319,22 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
} }
#ifndef COLLECTOR #ifndef COLLECTOR
if (GetState()==ESTABLISHED) { 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(); // client seems to try a max of 30 times (initial+3 retries) then gives up, giving it a few more attempts just in case
init(); // streamactive means we identified the opcode for the stream, we cannot re-establish this connection
State=UNESTABLISHED;*/ if ( streamactive || ( sessionAttempts > MAX_SESSION_RETRIES ) )
{
_SendDisconnect(); _SendDisconnect();
SetState(CLOSED); SetState(CLOSED);
break; break;
} }
}
#endif #endif
//std::cout << "Got OP_SessionRequest" << std::endl; //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(); OutboundQueueClear();
SessionRequest *Request=(SessionRequest *)p->pBuffer; SessionRequest *Request=(SessionRequest *)p->pBuffer;
Session=ntohl(Request->Session); Session=ntohl(Request->Session);

View File

@ -1,22 +1,26 @@
#ifndef _EQSTREAM_H #ifndef _EQSTREAM_H
#define _EQSTREAM_H #define _EQSTREAM_H
#include <string>
#include <vector> #include <vector>
#include <map> #include <map>
#include <queue> #include <queue>
#include <deque> #include <deque>
#ifndef WIN32 #ifndef WIN32
#include <netinet/in.h> #include <netinet/in.h>
#endif #endif
#include "eq_stream_type.h"
#include "../common/misc.h"
#include "../common/opcodemgr.h"
#include "../common/timer.h"
#include "eq_packet.h" #include "eq_packet.h"
#include "eq_stream_intf.h" #include "eq_stream_intf.h"
#include "eq_stream_type.h"
#include "mutex.h" #include "mutex.h"
#include "../common/opcodemgr.h"
#include "../common/misc.h" class EQApplicationPacket;
#include "../common/condition.h" class EQProtocolPacket;
#include "../common/timer.h"
#define FLAG_COMPRESSED 0x01 #define FLAG_COMPRESSED 0x01
#define FLAG_ENCODED 0x04 #define FLAG_ENCODED 0x04
@ -45,6 +49,10 @@
#define RETRANSMIT_ACKED_PACKETS true #define RETRANSMIT_ACKED_PACKETS true
#endif #endif
#ifndef MAX_SESSION_RETRIES
#define MAX_SESSION_RETRIES 30
#endif
#pragma pack(1) #pragma pack(1)
struct SessionRequest { struct SessionRequest {
uint32 UnknownA; uint32 UnknownA;
@ -78,7 +86,6 @@ struct SessionStats {
#pragma pack() #pragma pack()
class OpcodeManager; class OpcodeManager;
class EQStreamPair;
class EQRawApplicationPacket; class EQRawApplicationPacket;
class EQStream : public EQStreamInterface { class EQStream : public EQStreamInterface {
@ -101,6 +108,9 @@ class EQStream : public EQStreamInterface {
uint32 retransmittimer; uint32 retransmittimer;
uint32 retransmittimeout; uint32 retransmittimeout;
uint16 sessionAttempts;
bool streamactive;
//uint32 buffer_len; //uint32 buffer_len;
uint32 Session, Key; uint32 Session, Key;
@ -194,9 +204,9 @@ class EQStream : public EQStreamInterface {
void _SendDisconnect(); void _SendDisconnect();
void init(); void init(bool resetSession=true);
public: 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(); } 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); } virtual ~EQStream() { RemoveData(); SetState(CLOSED); }
void SetMaxLen(uint32 length) { MaxLen=length; } void SetMaxLen(uint32 length) { MaxLen=length; }
@ -221,6 +231,9 @@ class EQStream : public EQStreamInterface {
void SetLastPacketTime(uint32 t) {LastPacket=t;} void SetLastPacketTime(uint32 t) {LastPacket=t;}
void Write(int eq_fd); 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 bool IsInUse() { bool flag; MInUse.lock(); flag=(active_users>0); MInUse.unlock(); return flag; }
inline void PutInUse() { MInUse.lock(); active_users++; MInUse.unlock(); } inline void PutInUse() { MInUse.lock(); active_users++; MInUse.unlock(); }

View File

@ -1,5 +1,6 @@
#include "debug.h" #include "debug.h"
#include "eq_stream_factory.h" #include "eq_stream_factory.h"
#ifdef _WINDOWS #ifdef _WINDOWS
#include <winsock.h> #include <winsock.h>
#include <process.h> #include <process.h>
@ -13,11 +14,11 @@
#include <netdb.h> #include <netdb.h>
#include <pthread.h> #include <pthread.h>
#endif #endif
#include <fcntl.h>
#include <iostream> #include <iostream>
#include <fcntl.h>
#include "op_codes.h" #include "op_codes.h"
#include "eq_stream.h"
#include "logsys.h"
ThreadReturnType EQStreamFactoryReaderLoop(void *eqfs) 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... //bullshit checking, to see if this is really happening, GDB seems to think so...
if(stream_itr->second == nullptr) { 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; continue;
} }

View File

@ -4,11 +4,13 @@
#include <queue> #include <queue>
#include <map> #include <map>
#include "../common/eq_stream.h" #include "../common/eq_stream.h"
#include "../common/condition.h" #include "../common/condition.h"
#include "../common/timeoutmgr.h" #include "../common/timeoutmgr.h"
#include "../common/opcodemgr.h"
#include "../common/timer.h" class EQStream;
class Timer;
class EQStreamFactory : private Timeoutable { class EQStreamFactory : private Timeoutable {
private: 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()); _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.. //might want to do something less-specific here... some day..
EQStreamInterface *s = new EQStreamProxy(r->stream, p->structs, p->opcodes); EQStreamInterface *s = new EQStreamProxy(r->stream, p->structs, p->opcodes);
m_identified.push(s); m_identified.push(s);

View File

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

View File

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

View File

@ -28,8 +28,9 @@ struct LoginConfig {
uint16 LoginPort; uint16 LoginPort;
}; };
class EQEmuConfig : public XMLParser { class EQEmuConfig : public XMLParser
public: {
public:
virtual std::string GetByName(const std::string &var_name) const; virtual std::string GetByName(const std::string &var_name) const;
// From <world/> // From <world/>
@ -104,7 +105,7 @@ public:
// map<string,uint16> StaticZones; // map<string,uint16> StaticZones;
protected: protected:
static EQEmuConfig *_config; static EQEmuConfig *_config;
@ -112,63 +113,54 @@ protected:
#define ELEMENT(name) \ #define ELEMENT(name) \
void do_##name(TiXmlElement *ele); void do_##name(TiXmlElement *ele);
#include "eqemu_config_elements.h" #include "eqemu_config_elements.h"
EQEmuConfig() { EQEmuConfig()
{
// import the needed handler prototypes // import the needed handler prototypes
#define ELEMENT(name) \ #define ELEMENT(name) \
Handlers[#name]=(ElementHandler)&EQEmuConfig::do_##name; Handlers[#name]=(ElementHandler)&EQEmuConfig::do_##name;
#include "eqemu_config_elements.h" #include "eqemu_config_elements.h"
// Set sane defaults // Set sane defaults
// Login server // Login server
LoginHost="eqemulator.net"; LoginHost = "eqemulator.net";
LoginPort=5998; LoginPort = 5998;
// World // World
Locked=false; Locked = false;
WorldTCPPort=9000; WorldTCPPort = 9000;
TelnetEnabled=false; TelnetEnabled = false;
WorldHTTPEnabled=false; WorldHTTPEnabled = false;
WorldHTTPPort=9080; WorldHTTPPort = 9080;
WorldHTTPMimeFile="mime.types"; WorldHTTPMimeFile = "mime.types";
SharedKey = ""; //blank disables authentication SharedKey = ""; //blank disables authentication
// Mail // Mail
ChatHost="eqchat.eqemulator.net"; ChatHost = "eqchat.eqemulator.net";
ChatPort=7778; ChatPort = 7778;
// Mail // Mail
MailHost="eqmail.eqemulator.net"; MailHost = "eqmail.eqemulator.net";
MailPort=7779; MailPort = 7779;
// Mysql // Mysql
DatabaseHost="localhost"; DatabaseHost = "localhost";
DatabasePort=3306; DatabasePort = 3306;
DatabaseUsername="eq"; DatabaseUsername = "eq";
DatabasePassword="eq"; DatabasePassword = "eq";
DatabaseDB="eq"; DatabaseDB = "eq";
// QueryServ Database // QueryServ Database
QSDatabaseHost="localhost"; QSDatabaseHost = "localhost";
QSDatabasePort=3306; QSDatabasePort = 3306;
QSDatabaseUsername="eq"; QSDatabaseUsername = "eq";
QSDatabasePassword="eq"; QSDatabasePassword = "eq";
QSDatabaseDB="eq"; QSDatabaseDB = "eq";
// Files // Files
SpellsFile="spells_us.txt"; SpellsFile = "spells_us.txt";
OpCodesFile="opcodes.conf"; OpCodesFile = "opcodes.conf";
EQTimeFile="eqtime.cfg"; EQTimeFile = "eqtime.cfg";
LogSettingsFile="log.ini"; LogSettingsFile = "log.ini";
// Dirs // Dirs
MapDir="Maps"; MapDir = "Maps";
QuestDir="quests"; QuestDir = "quests";
PluginDir="plugins"; PluginDir = "plugins";
// Launcher // Launcher
LogPrefix = "logs/zone-"; LogPrefix = "logs/zone-";
LogSuffix = ".log"; LogSuffix = ".log";
@ -176,49 +168,49 @@ protected:
TerminateWait = 10000; //milliseconds TerminateWait = 10000; //milliseconds
InitialBootWait = 20000; //milliseconds InitialBootWait = 20000; //milliseconds
ZoneBootInterval = 2000; //milliseconds ZoneBootInterval = 2000; //milliseconds
#ifdef WIN32 #ifdef WIN32
ZoneExe = "zone.exe"; ZoneExe = "zone.exe";
#else #else
ZoneExe = "./zone"; ZoneExe = "./zone";
#endif #endif
// Zones // Zones
ZonePortLow=7000; ZonePortLow = 7000;
ZonePortHigh=7999; ZonePortHigh = 7999;
DefaultStatus=0; DefaultStatus = 0;
// For where zones need to connect to. // For where zones need to connect to.
WorldIP="127.0.0.1"; WorldIP = "127.0.0.1";
// Dynamics to start // Dynamics to start
//DynamicCount=5; //DynamicCount=5;
MaxClients = -1;
MaxClients=-1; LoginCount = 0;
LoginCount=0;
} }
virtual ~EQEmuConfig() {} virtual ~EQEmuConfig() {}
public: public:
// Produce a const singleton // Produce a const singleton
static const EQEmuConfig *get() { static const EQEmuConfig *get()
if (_config == nullptr) {
if (_config == nullptr) {
LoadConfig(); LoadConfig();
return(_config); }
return (_config);
} }
// Allow the use to set the conf file to be used. // Allow the use to set the conf file to be used.
static void SetConfigFile(std::string file) { EQEmuConfig::ConfigFile = file; } static void SetConfigFile(std::string file)
{
EQEmuConfig::ConfigFile = file;
}
// Load the config // Load the config
static bool LoadConfig() { static bool LoadConfig()
if (_config != nullptr) {
if (_config != nullptr) {
delete _config; delete _config;
_config=new EQEmuConfig; }
_config = new EQEmuConfig;
return _config->ParseFile(EQEmuConfig::ConfigFile.c_str(),"server"); return _config->ParseFile(EQEmuConfig::ConfigFile.c_str(), "server");
} }
void Dump() const; void Dump() const;

View File

@ -15,34 +15,35 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "debug.h"
#include "faction.h" #include "faction.h"
#include "races.h" #include "races.h"
const char *FactionValueToString(FACTION_VALUE fv) { const char *FactionValueToString(FACTION_VALUE fv)
switch(fv) { {
switch (fv) {
case FACTION_ALLY: case FACTION_ALLY:
return("Ally"); return ("Ally");
case FACTION_WARMLY: case FACTION_WARMLY:
return("Warmly"); return ("Warmly");
case FACTION_KINDLY: case FACTION_KINDLY:
return("Kindly"); return ("Kindly");
case FACTION_AMIABLE: case FACTION_AMIABLE:
return("Amiable"); return ("Amiable");
case FACTION_INDIFFERENT: case FACTION_INDIFFERENT:
return("Indifferent"); return ("Indifferent");
case FACTION_APPREHENSIVE: case FACTION_APPREHENSIVE:
return("Apprehensive"); return ("Apprehensive");
case FACTION_DUBIOUS: case FACTION_DUBIOUS:
return("Dubious"); return ("Dubious");
case FACTION_THREATENLY: case FACTION_THREATENLY:
return("Threatenly"); return ("Threatenly");
case FACTION_SCOWLS: case FACTION_SCOWLS:
return("Scowls, ready to attack."); return ("Scowls, ready to attack.");
default: default:
break; break;
} }
return("Unknown Faction Con"); return ("Unknown Faction Con");
} }
@ -55,52 +56,74 @@ const char *FactionValueToString(FACTION_VALUE fv) {
FACTION_VALUE CalculateFaction(FactionMods* fm, int32 tmpCharacter_value) FACTION_VALUE CalculateFaction(FactionMods* fm, int32 tmpCharacter_value)
{ {
int32 character_value = tmpCharacter_value; int32 character_value = tmpCharacter_value;
if (fm) if (fm) {
character_value += fm->base + fm->class_mod + fm->race_mod + fm->deity_mod; 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 >= 1101) {
if(character_value >= 401 && character_value <= 700) return FACTION_KINDLY; return FACTION_ALLY;
if(character_value >= 101 && character_value <= 400) return FACTION_AMIABLE; }
if(character_value >= 0 && character_value <= 100) return FACTION_INDIFFERENT; if (character_value >= 701 && character_value <= 1100) {
if(character_value >= -100 && character_value <= -1) return FACTION_APPREHENSIVE; return FACTION_WARMLY;
if(character_value >= -700 && character_value <= -101) return FACTION_DUBIOUS; }
if(character_value >= -999 && character_value <= -701) return FACTION_THREATENLY; if (character_value >= 401 && character_value <= 700) {
if(character_value <= -1000) return FACTION_SCOWLS; 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; return FACTION_INDIFFERENT;
} }
// this function should check if some races have more than one race define // this function should check if some races have more than one race define
bool IsOfEqualRace(int r1, int r2) bool IsOfEqualRace(int r1, int r2)
{ {
if (r1 == r2) if (r1 == r2) {
return true; return true;
}
// TODO: add more values // TODO: add more values
switch(r1) switch (r1) {
{
case DARK_ELF: case DARK_ELF:
if (r2 == 77) if (r2 == 77) {
return true; return true;
}
break; break;
case BARBARIAN: case BARBARIAN:
if (r2 == 90) if (r2 == 90) {
return true; return true;
} }
}
return false; return false;
} }
// trolls endure ogres, dark elves, ... // trolls endure ogres, dark elves, ...
bool IsOfIndiffRace(int r1, int r2) bool IsOfIndiffRace(int r1, int r2)
{ {
if (r1 == r2) if (r1 == r2) {
return true; return true;
}
// TODO: add more values // TODO: add more values
switch(r1) switch (r1) {
{
case DARK_ELF: case DARK_ELF:
case OGRE: case OGRE:
case TROLL: case TROLL:
if (r2 == OGRE || r2 == TROLL || r2 == DARK_ELF) if (r2 == OGRE || r2 == TROLL || r2 == DARK_ELF) {
return true; return true;
}
break; break;
case HUMAN: case HUMAN:
case BARBARIAN: case BARBARIAN:
@ -116,20 +139,24 @@ bool IsOfIndiffRace(int r1, int r2)
r2 == HALFLING || r2 == HALFLING ||
r2 == DWARF || r2 == DWARF ||
r2 == HIGH_ELF || r2 == HIGH_ELF ||
r2 == WOOD_ELF) r2 == WOOD_ELF) {
return true; return true;
}
break; break;
case ERUDITE: case ERUDITE:
if (r2 == HUMAN || r2 == HALF_ELF) if (r2 == HUMAN || r2 == HALF_ELF) {
return true; return true;
}
break; break;
case DWARF: case DWARF:
if (r2 == HALFLING || r2 == GNOME) if (r2 == HALFLING || r2 == GNOME) {
return true; return true;
}
break; break;
case HIGH_ELF: case HIGH_ELF:
if (r2 == WOOD_ELF) if (r2 == WOOD_ELF) {
return true; return true;
}
break; break;
case VAHSHIR: case VAHSHIR:
return true; return true;

View File

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

View File

@ -8,8 +8,9 @@
class Database; class Database;
class CharGuildInfo { class CharGuildInfo
public: {
public:
//fields from `characer_` //fields from `characer_`
uint32 char_id; uint32 char_id;
std::string char_name; std::string char_name;
@ -30,13 +31,17 @@ public:
}; };
//this object holds guild functionality shared between world and zone. //this object holds guild functionality shared between world and zone.
class BaseGuildManager { class BaseGuildManager
public: {
public:
BaseGuildManager(); BaseGuildManager();
virtual ~BaseGuildManager(); virtual ~BaseGuildManager();
//this must be called before doing anything else with this object //this must be called before doing anything else with this object
void SetDatabase(Database *db) { m_db = db; } void SetDatabase(Database *db)
{
m_db = db;
}
bool LoadGuilds(); bool LoadGuilds();
bool RefreshGuild(uint32 guild_id); bool RefreshGuild(uint32 guild_id);
@ -89,7 +94,7 @@ public:
static const char *const GuildActionNames[_MaxGuildAction]; static const char *const GuildActionNames[_MaxGuildAction];
uint32 DoesAccountContainAGuildLeader(uint32 AccountID); uint32 DoesAccountContainAGuildLeader(uint32 AccountID);
protected: protected:
//the methods which must be defined by base classes. //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 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 SendCharRefresh(uint32 old_guild_id, uint32 guild_id, uint32 charid) = 0;
@ -114,13 +119,15 @@ protected:
bool LocalDeleteGuild(uint32 guild_id); bool LocalDeleteGuild(uint32 guild_id);
class RankInfo { class RankInfo
{
public: public:
RankInfo(); RankInfo();
std::string name; std::string name;
bool permissions[_MaxGuildAction]; bool permissions[_MaxGuildAction];
}; };
class GuildInfo { class GuildInfo
{
public: public:
GuildInfo(); GuildInfo();
std::string name; std::string name;
@ -132,7 +139,7 @@ protected:
uint32 leader_char_id; uint32 leader_char_id;
uint8 minstatus; uint8 minstatus;
//tribute is not in here on purpose, since it is only valid in world! //tribute is not in here on purpose, since it is only valid in world!
RankInfo ranks[GUILD_MAX_RANK+1]; RankInfo ranks[GUILD_MAX_RANK + 1];
}; };
std::map<uint32, GuildInfo *> m_guilds; //we own the pointers in this map std::map<uint32, GuildInfo *> m_guilds; //we own the pointers in this map

View File

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

View File

@ -16,18 +16,16 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 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 "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 <limits.h>
#include <sstream>
#include <iostream> #include <iostream>
std::list<ItemInst*> dirty_inst; std::list<ItemInst*> dirty_inst;
@ -1125,10 +1123,12 @@ int16 Inventory::_PutItem(int16 slot_id, ItemInst* inst)
m_trade[slot_id] = inst; m_trade[slot_id] = inst;
result = slot_id; result = slot_id;
} }
else { else
{
// Slot must be within a bag // Slot must be within a bag
ItemInst* baginst = GetItem(Inventory::CalcSlotId(slot_id)); // Get parent 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); baginst->_PutItem(Inventory::CalcBagIdx(slot_id), inst);
result = slot_id; result = slot_id;
} }
@ -1397,7 +1397,7 @@ ItemInst::ItemInst(const Item_Struct* item, int16 charges) {
m_item = item; m_item = item;
m_charges = charges; m_charges = charges;
m_price = 0; m_price = 0;
m_instnodrop = false; m_attuned = false;
m_merchantslot = 0; m_merchantslot = 0;
if(m_item &&m_item->ItemClass == ItemClassCommon) if(m_item &&m_item->ItemClass == ItemClassCommon)
m_color = m_item->Color; m_color = m_item->Color;
@ -1414,6 +1414,7 @@ ItemInst::ItemInst(const Item_Struct* item, int16 charges) {
m_scaling = false; m_scaling = false;
m_ornamenticon = 0; m_ornamenticon = 0;
m_ornamentidfile = 0; m_ornamentidfile = 0;
m_ornament_hero_model = 0;
} }
ItemInst::ItemInst(SharedDatabase *db, uint32 item_id, int16 charges) { 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_charges = charges;
m_price = 0; m_price = 0;
m_merchantslot = 0; m_merchantslot = 0;
m_instnodrop=false; m_attuned=false;
if(m_item && m_item->ItemClass == ItemClassCommon) if(m_item && m_item->ItemClass == ItemClassCommon)
m_color = m_item->Color; m_color = m_item->Color;
else else
@ -1438,6 +1439,7 @@ ItemInst::ItemInst(SharedDatabase *db, uint32 item_id, int16 charges) {
m_scaling = false; m_scaling = false;
m_ornamenticon = 0; m_ornamenticon = 0;
m_ornamentidfile = 0; m_ornamentidfile = 0;
m_ornament_hero_model = 0;
} }
ItemInst::ItemInst(ItemInstTypes use_type) { ItemInst::ItemInst(ItemInstTypes use_type) {
@ -1445,7 +1447,7 @@ ItemInst::ItemInst(ItemInstTypes use_type) {
m_item = nullptr; m_item = nullptr;
m_charges = 0; m_charges = 0;
m_price = 0; m_price = 0;
m_instnodrop = false; m_attuned = false;
m_merchantslot = 0; m_merchantslot = 0;
m_color = 0; m_color = 0;
@ -1457,6 +1459,7 @@ ItemInst::ItemInst(ItemInstTypes use_type) {
m_scaling = false; m_scaling = false;
m_ornamenticon = 0; m_ornamenticon = 0;
m_ornamentidfile = 0; m_ornamentidfile = 0;
m_ornament_hero_model = 0;
} }
// Make a copy of an ItemInst object // Make a copy of an ItemInst object
@ -1469,7 +1472,7 @@ ItemInst::ItemInst(const ItemInst& copy)
m_color=copy.m_color; m_color=copy.m_color;
m_merchantslot=copy.m_merchantslot; m_merchantslot=copy.m_merchantslot;
m_currentslot=copy.m_currentslot; m_currentslot=copy.m_currentslot;
m_instnodrop=copy.m_instnodrop; m_attuned=copy.m_attuned;
m_merchantcount=copy.m_merchantcount; m_merchantcount=copy.m_merchantcount;
// Copy container contents // Copy container contents
iter_contents it; iter_contents it;
@ -1509,6 +1512,7 @@ ItemInst::ItemInst(const ItemInst& copy)
m_scaling = copy.m_scaling; m_scaling = copy.m_scaling;
m_ornamenticon = copy.m_ornamenticon; m_ornamenticon = copy.m_ornamenticon;
m_ornamentidfile = copy.m_ornamentidfile; m_ornamentidfile = copy.m_ornamentidfile;
m_ornament_hero_model = copy.m_ornament_hero_model;
} }
// Clean up container contents // Clean up container contents
@ -1782,21 +1786,79 @@ ItemInst* ItemInst::GetAugment(uint8 slot) const
return nullptr; 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 (ornamentationAugtype > 0)
if (GetAugment(i) && m_item->AugSlotType[i] == ornamentationAugtype) { {
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; 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) if (
(strncmp(item_IDFile, "IT64", strlen(item_IDFile)) == 0
|| strncmp(item_IDFile, "IT63", strlen(item_IDFile)) == 0)
&& GetAugment(i)->GetItem()->HerosForgeModel == 0
)
{
continue; continue;
}
return this->GetAugment(i); return this->GetAugment(i);
} }
} }
}
return nullptr; 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) { bool ItemInst::CanTransform(const Item_Struct *ItemToTry, const Item_Struct *Container, bool AllowAll) {
if (!ItemToTry || !Container) return false; if (!ItemToTry || !Container) return false;

View File

@ -23,21 +23,16 @@
#ifndef __ITEM_H #ifndef __ITEM_H
#define __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 ItemParse; // Parses item packets
class EvolveInfo; // Stores information about an evolving item family 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/eq_constants.h"
#include "../common/item_struct.h" #include "../common/item_struct.h"
#include "../common/timer.h" #include "../common/timer.h"
#include <list>
#include <map>
// Helper typedefs // Helper typedefs
typedef std::list<ItemInst*>::const_iterator iter_queue; typedef std::list<ItemInst*>::const_iterator iter_queue;
typedef std::map<int16, ItemInst*>::const_iterator iter_inst; typedef std::map<int16, ItemInst*>::const_iterator iter_inst;
@ -294,7 +289,7 @@ public:
// //
// Augements // 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; bool AvailableWearSlot(uint32 aug_wear_slots) const;
int8 AvailableAugmentSlot(int32 augtype) const; int8 AvailableAugmentSlot(int32 augtype) const;
bool IsAugmentSlotAvailable(int32 augtype, uint8 slot) const; bool IsAugmentSlotAvailable(int32 augtype, uint8 slot) const;
@ -329,7 +324,8 @@ public:
void DeleteAugment(uint8 slot); void DeleteAugment(uint8 slot);
ItemInst* RemoveAugment(uint8 index); ItemInst* RemoveAugment(uint8 index);
bool IsAugmented(); 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); static bool CanTransform(const Item_Struct *ItemToTry, const Item_Struct *Container, bool AllowAll = false);
// Has attack/delay? // Has attack/delay?
@ -361,8 +357,8 @@ public:
void SetCurrentSlot(int16 curr_slot) { m_currentslot = curr_slot; } void SetCurrentSlot(int16 curr_slot) { m_currentslot = curr_slot; }
// Is this item already attuned? // Is this item already attuned?
bool IsInstNoDrop() const { return m_instnodrop; } bool IsAttuned() const { return m_attuned; }
void SetInstNoDrop(bool flag) { m_instnodrop=flag; } void SetAttuned(bool flag) { m_attuned=flag; }
std::string GetCustomDataString() const; std::string GetCustomDataString() const;
std::string GetCustomData(std::string identifier); std::string GetCustomData(std::string identifier);
@ -397,6 +393,8 @@ public:
void SetOrnamentIcon(uint32 ornament_icon) { m_ornamenticon = ornament_icon; } void SetOrnamentIcon(uint32 ornament_icon) { m_ornamenticon = ornament_icon; }
uint32 GetOrnamentationIDFile() const { return m_ornamentidfile; } uint32 GetOrnamentationIDFile() const { return m_ornamentidfile; }
void SetOrnamentationIDFile(uint32 ornament_idfile) { m_ornamentidfile = ornament_idfile; } 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 Initialize(SharedDatabase *db = nullptr);
void ScaleItem(); void ScaleItem();
@ -432,7 +430,7 @@ protected:
uint32 m_color; uint32 m_color;
uint32 m_merchantslot; uint32 m_merchantslot;
int16 m_currentslot; int16 m_currentslot;
bool m_instnodrop; bool m_attuned;
int32 m_merchantcount; //number avaliable on the merchant, -1=unlimited int32 m_merchantcount; //number avaliable on the merchant, -1=unlimited
int32 m_SerialNumber; // Unique identifier for this instance of an item. Needed for Bazaar. int32 m_SerialNumber; // Unique identifier for this instance of an item. Needed for Bazaar.
uint32 m_exp; uint32 m_exp;
@ -443,6 +441,7 @@ protected:
bool m_scaling; bool m_scaling;
uint32 m_ornamenticon; uint32 m_ornamenticon;
uint32 m_ornamentidfile; uint32 m_ornamentidfile;
uint32 m_ornament_hero_model;
// //
// Items inside of this item (augs or contents); // Items inside of this item (augs or contents);

View File

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

View File

@ -154,6 +154,7 @@ struct Item_Struct {
int16 MaxCharges; // Maximum charges items can hold: -1 if not a chargeable item int16 MaxCharges; // Maximum charges items can hold: -1 if not a chargeable item
uint8 ItemType; // Item Type/Skill (itemClass* from above) uint8 ItemType; // Item Type/Skill (itemClass* from above)
uint8 Material; // Item material type uint8 Material; // Item material type
uint32 HerosForgeModel;// Hero's Forge Armor Model Type (2-13?)
float SellRate; // Sell rate float SellRate; // Sell rate
//uint32 Unk059; //uint32 Unk059;
union { union {
@ -182,9 +183,9 @@ struct Item_Struct {
int32 FactionAmt4; // Faction Amt 4 int32 FactionAmt4; // Faction Amt 4
char CharmFile[32]; // ? char CharmFile[32]; // ?
uint32 AugType; uint32 AugType;
uint8 AugSlotType[EmuConstants::ITEM_COMMON_SIZE]; // LDoN: Augment Slot 1-5 Type uint8 AugSlotType[EmuConstants::ITEM_COMMON_SIZE]; // RoF: Augment Slot 1-6 Type
uint8 AugSlotVisible[EmuConstants::ITEM_COMMON_SIZE]; // LDoN: Augment Slot 1-5 Visible uint8 AugSlotVisible[EmuConstants::ITEM_COMMON_SIZE]; // RoF: Augment Slot 1-6 Visible
uint8 AugSlotUnk2[EmuConstants::ITEM_COMMON_SIZE]; // LDoN: Augment Slot 1-5 Unknown uint8 AugSlotUnk2[EmuConstants::ITEM_COMMON_SIZE]; // RoF: Augment Slot 1-6 Unknown
uint32 LDoNTheme; uint32 LDoNTheme;
uint32 LDoNPrice; uint32 LDoNPrice;
uint32 LDoNSold; uint32 LDoNSold;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -15,15 +15,13 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 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 <map>
#include <stdio.h>
#include <string> #include <string>
OpcodeManager::OpcodeManager() { OpcodeManager::OpcodeManager() {

View File

@ -15,13 +15,12 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "../common/debug.h"
#include <iostream> #include <iostream>
#include <iomanip> #include <iomanip>
#include <stdio.h> #include <stdio.h>
#include "packet_dump.h" #include "packet_dump.h"
#include "eq_packet.h"
#include "../common/servertalk.h" #include "../common/servertalk.h"
void DumpPacketAscii(const uchar* buf, uint32 size, uint32 cols, uint32 skip) { 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 along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include <fstream>
#include <iostream>
#include <iomanip>
#include "../common/debug.h" #include "../common/debug.h"
#include <fstream>
#include <iomanip>
#include <iostream>
#include <stdio.h> #include <stdio.h>
//#ifdef _CRTDBG_MAP_ALLOC //#ifdef _CRTDBG_MAP_ALLOC
// #undef new // #undef new
// #define new new(_NORMAL_BLOCK, __FILE__, __LINE__) // #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
//#endif //#endif
#include <time.h>
#include <string.h> #include <string.h>
#ifdef _WINDOWS #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 "../debug.h"
#include "patches.h" #include "patches.h"
#include "client62.h"
#include "titanium.h" #include "titanium.h"
#include "underfoot.h" #include "underfoot.h"
#include "sof.h" #include "sof.h"
@ -11,23 +10,19 @@
#include "rof2.h" #include "rof2.h"
void RegisterAllPatches(EQStreamIdentifier &into) { void RegisterAllPatches(EQStreamIdentifier &into) {
Client62::Register(into);
Titanium::Register(into); Titanium::Register(into);
SoF::Register(into); SoF::Register(into);
SoD::Register(into); SoD::Register(into);
Underfoot::Register(into); Underfoot::Register(into);
RoF::Register(into); RoF::Register(into);
// Uncomment the line below to enable RoF2 Client RoF2::Register(into);
//RoF2::Register(into);
} }
void ReloadAllPatches() { void ReloadAllPatches() {
Client62::Reload();
Titanium::Reload(); Titanium::Reload();
SoF::Reload(); SoF::Reload();
SoD::Reload(); SoD::Reload();
Underfoot::Reload(); Underfoot::Reload();
RoF::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); SETUP_DIRECT_ENCODE(AltCurrencySellItem_Struct, structs::AltCurrencySellItem_Struct);
OUT(merchant_entity_id); OUT(merchant_entity_id);
eq->slot_id = ServerToRoFSlot(emu->slot_id); eq->slot_id = ServerToRoFMainInvSlot(emu->slot_id);
OUT(charges); OUT(charges);
OUT(cost); OUT(cost);
@ -2045,15 +2045,6 @@ namespace RoF
outapp->WriteUInt32(emu->skills[r]); 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 outapp->WriteUInt32(25); // Unknown count
for (uint32 r = 0; r < 25; r++) for (uint32 r = 0; r < 25; r++)
@ -2130,18 +2121,6 @@ namespace RoF
outapp->WriteUInt32(structs::BUFF_COUNT); 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++) for (uint32 r = 0; r < BUFF_COUNT; r++)
{ {
float instrument_mod = 0.0f; float instrument_mod = 0.0f;
@ -2874,12 +2853,12 @@ namespace RoF
eq2->face = emu->face[r]; eq2->face = emu->face[r];
int k; int k;
for (k = 0; k < _MaterialCount; k++) { for (k = 0; k < _MaterialCount; k++) {
eq2->equip[k].equip0 = emu->equip[r][k]; eq2->equip[k].material = emu->equip[r][k].material;
eq2->equip[k].equip1 = 0; eq2->equip[k].unknown1 = emu->equip[r][k].unknown1;
eq2->equip[k].equip2 = 0; eq2->equip[k].elitematerial = emu->equip[r][k].elitematerial;
eq2->equip[k].itemid = 0; eq2->equip[k].heroforgemodel = emu->equip[r][k].heroforgemodel;
eq2->equip[k].equip3 = emu->equip[r][k]; eq2->equip[k].material2 = emu->equip[r][k].material2;
eq2->equip[k].color.color = emu->cs_colors[r][k].color; eq2->equip[k].color.color = emu->equip[r][k].color.color;
} }
eq2->u15 = 0xff; eq2->u15 = 0xff;
eq2->u19 = 0xFF; eq2->u19 = 0xFF;
@ -3706,7 +3685,7 @@ namespace RoF
Bitfields->showhelm = emu->showhelm; Bitfields->showhelm = emu->showhelm;
Bitfields->trader = 0; Bitfields->trader = 0;
Bitfields->targetable = 1; Bitfields->targetable = 1;
Bitfields->targetable_with_hotkey = (emu->IsMercenary ? 0 : 1); Bitfields->targetable_with_hotkey = emu->targetable_with_hotkey ? 1 : 0;
Bitfields->showname = ShowName; Bitfields->showname = ShowName;
// Not currently found // Not currently found
@ -3809,11 +3788,11 @@ namespace RoF
structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer; structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer;
for (k = 0; k < 9; k++) { for (k = 0; k < 9; k++) {
Equipment[k].equip0 = emu->equipment[k]; Equipment[k].material = emu->equipment[k].material;
Equipment[k].equip1 = 0; Equipment[k].unknown1 = emu->equipment[k].unknown1;
Equipment[k].equip2 = 0; Equipment[k].elitematerial = emu->equipment[k].elitematerial;
Equipment[k].equip3 = 0; Equipment[k].heroforgemodel = emu->equipment[k].heroforgemodel;
Equipment[k].itemId = 0; Equipment[k].material2 = emu->equipment[k].material2;
} }
Buffer += (sizeof(structs::EquipStruct) * 9); 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, 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, 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); 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); SETUP_DIRECT_DECODE(AltCurrencySellItem_Struct, structs::AltCurrencySellItem_Struct);
IN(merchant_entity_id); IN(merchant_entity_id);
emu->slot_id = RoFToServerSlot(eq->slot_id); emu->slot_id = RoFToServerMainInvSlot(eq->slot_id);
IN(charges); IN(charges);
IN(cost); IN(cost);
@ -3915,7 +3894,7 @@ namespace RoF
SETUP_DIRECT_DECODE(AltCurrencySelectItem_Struct, structs::AltCurrencySelectItem_Struct); SETUP_DIRECT_DECODE(AltCurrencySelectItem_Struct, structs::AltCurrencySelectItem_Struct);
IN(merchant_entity_id); IN(merchant_entity_id);
emu->slot_id = RoFToServerSlot(eq->slot_id); emu->slot_id = RoFToServerMainInvSlot(eq->slot_id);
FINISH_DIRECT_DECODE(); FINISH_DIRECT_DECODE();
} }
@ -4406,7 +4385,7 @@ namespace RoF
IN(item_id); IN(item_id);
int r; int r;
for (r = 0; r < 5; r++) { for (r = 0; r < EmuConstants::ITEM_COMMON_SIZE; r++) {
IN(augments[r]); IN(augments[r]);
} }
// Max Augs is now 6, but no code to support that many yet // 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.main_slot = (merchant_slot == 0) ? slot_id.MainSlot : merchant_slot;
hdr.sub_slot = (merchant_slot == 0) ? slot_id.SubSlot : 0xffff; hdr.sub_slot = (merchant_slot == 0) ? slot_id.SubSlot : 0xffff;
hdr.unknown013 = (merchant_slot == 0) ? slot_id.AugSlot : 0xffff; hdr.unknown013 = (merchant_slot == 0) ? slot_id.AugSlot : 0xffff;
//hdr.unknown013 = 0xffff;
hdr.price = inst->GetPrice(); hdr.price = inst->GetPrice();
hdr.merchant_slot = (merchant_slot == 0) ? 1 : inst->GetMerchantCount(); hdr.merchant_slot = (merchant_slot == 0) ? 1 : inst->GetMerchantCount();
//hdr.merchant_slot = (merchant_slot == 0) ? 1 : 0xffffffff; //hdr.merchant_slot = (merchant_slot == 0) ? 1 : 0xffffffff;
@ -4856,7 +4834,7 @@ namespace RoF
hdr.unknown028 = 0; hdr.unknown028 = 0;
hdr.last_cast_time = ((item->RecastDelay > 1) ? 1212693140 : 0); hdr.last_cast_time = ((item->RecastDelay > 1) ? 1212693140 : 0);
hdr.charges = (stackable ? (item->MaxCharges ? 1 : 0) : charges); 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.unknown044 = 0;
hdr.unknown048 = 0; hdr.unknown048 = 0;
hdr.unknown052 = 0; hdr.unknown052 = 0;
@ -4877,7 +4855,10 @@ namespace RoF
} }
//ORNAMENT IDFILE / ICON //ORNAMENT IDFILE / ICON
uint16 ornaIcon = 0; uint16 ornaIcon = 0;
if (inst->GetOrnamentationAug(ornamentationAugtype)) { int32 heroModel = 0;
/*
if (inst->GetOrnamentationAug(ornamentationAugtype))
{
const Item_Struct *aug_weap = inst->GetOrnamentationAug(ornamentationAugtype)->GetItem(); const Item_Struct *aug_weap = inst->GetOrnamentationAug(ornamentationAugtype)->GetItem();
//Mainhand //Mainhand
ss.write(aug_weap->IDFile, strlen(aug_weap->IDFile)); ss.write(aug_weap->IDFile, strlen(aug_weap->IDFile));
@ -4887,8 +4868,16 @@ namespace RoF
ss.write((const char*)&null_term, sizeof(uint8)); ss.write((const char*)&null_term, sizeof(uint8));
//Icon //Icon
ornaIcon = aug_weap->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()); char tmp[30]; memset(tmp, 0x0, 30); sprintf(tmp, "IT%d", inst->GetOrnamentationIDFile());
//Mainhand //Mainhand
ss.write(tmp, strlen(tmp)); ss.write(tmp, strlen(tmp));
@ -4897,10 +4886,12 @@ namespace RoF
ss.write(tmp, strlen(tmp)); ss.write(tmp, strlen(tmp));
ss.write((const char*)&null_term, sizeof(uint8)); ss.write((const char*)&null_term, sizeof(uint8));
ornaIcon = inst->GetOrnamentationIcon(); ornaIcon = inst->GetOrnamentationIcon();
heroModel = inst->GetOrnamentHeroModel(Inventory::CalcMaterialFromSlot(slot_id_in));
} }
else { else
ss.write((const char*)&null_term, sizeof(uint8)); //no mh {
ss.write((const char*)&null_term, sizeof(uint8));//no of 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; RoF::structs::ItemSerializationHeaderFinish hdrf;
@ -4908,12 +4899,13 @@ namespace RoF
hdrf.unknown061 = 0; hdrf.unknown061 = 0;
hdrf.unknown062 = 0; hdrf.unknown062 = 0;
hdrf.unknowna1 = 0xffffffff; hdrf.unknowna1 = 0xffffffff;
hdrf.unknowna2 = 0; hdrf.ornamentHeroModel = heroModel;
hdrf.unknown063 = 0; hdrf.unknown063 = 0;
hdrf.unknowna3 = 0; hdrf.unknowna3 = 0;
hdrf.unknowna4 = 0xffffffff; hdrf.unknowna4 = 0xffffffff;
hdrf.unknowna5 = 0; hdrf.unknowna5 = 0;
hdrf.ItemClass = item->ItemClass; hdrf.ItemClass = item->ItemClass;
ss.write((const char*)&hdrf, sizeof(RoF::structs::ItemSerializationHeaderFinish)); ss.write((const char*)&hdrf, sizeof(RoF::structs::ItemSerializationHeaderFinish));
if (strlen(item->Name) > 0) if (strlen(item->Name) > 0)
@ -5017,10 +5009,10 @@ namespace RoF
ibs.Prestige = 0; ibs.Prestige = 0;
ibs.ItemType = item->ItemType; ibs.ItemType = item->ItemType;
ibs.Material = item->Material; ibs.Material = item->Material;
ibs.unknown7 = 0; ibs.MaterialUnknown1 = 0;
ibs.EliteMaterial = item->EliteMaterial; ibs.EliteMaterial = item->EliteMaterial;
ibs.unknown_RoF3 = 0; ibs.HerosForgeModel = item->HerosForgeModel;
ibs.unknown_RoF4 = 0; ibs.MaterialUnknown2 = 0;
ibs.SellRate = item->SellRate; ibs.SellRate = item->SellRate;
ibs.CombatEffects = item->CombatEffects; ibs.CombatEffects = item->CombatEffects;
ibs.Shielding = item->Shielding; ibs.Shielding = item->Shielding;
@ -5062,18 +5054,13 @@ namespace RoF
isbs.augdistiller = 65535; isbs.augdistiller = 65535;
isbs.augrestrict = item->AugRestrict; 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].type = item->AugSlotType[x];
isbs.augslots[x].visible = item->AugSlotVisible[x]; isbs.augslots[x].visible = item->AugSlotVisible[x];
isbs.augslots[x].unknown = item->AugSlotUnk2[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.ldonpoint_type = item->PointType;
isbs.ldontheme = item->LDoNTheme; isbs.ldontheme = item->LDoNTheme;
isbs.ldonprice = item->LDoNPrice; isbs.ldonprice = item->LDoNPrice;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -21,6 +21,9 @@
#include <random> #include <random>
#include <utility> #include <utility>
#include <algorithm>
#include <iterator>
#include <type_traits>
/* This uses mt19937 seeded with the std::random_device /* This uses mt19937 seeded with the std::random_device
* The idea is to have this be included as a member of another class * The idea is to have this be included as a member of another class
@ -33,35 +36,45 @@ namespace EQEmu {
class Random { class Random {
public: public:
// AKA old MakeRandomInt // AKA old MakeRandomInt
const int Int(int low, int high) int Int(int low, int high)
{ {
if (low > high) if (low > high)
std::swap(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 // AKA old MakeRandomFloat
const double Real(double low, double high) double Real(double low, double high)
{ {
if (low > high) if (low > high)
std::swap(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 // example Roll(50) would have a 50% success rate
// Roll(100) 100%, etc // Roll(100) 100%, etc
// valid values 0-100 (well, higher works too but ...) // 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; return Int(0, 99) < required;
} }
// valid values 0.0 - 1.0 // valid values 0.0 - 1.0
const bool Roll(const double required) bool Roll(const double required)
{ {
return Real(0.0, 1.0) <= 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() void Reseed()
{ {
// We could do the seed_seq thing here too if we need better seeding // We could do the seed_seq thing here too if we need better seeding
@ -76,7 +89,11 @@ namespace EQEmu {
} }
private: 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::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 along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "debug.h"
#include "rdtsc.h" #include "rdtsc.h"
#include "types.h" #include "types.h"
#include <stdio.h>
#ifdef _WINDOWS #ifdef _WINDOWS
#include <sys/timeb.h> #include <sys/timeb.h>

View File

@ -136,7 +136,6 @@ RULE_CATEGORY_END()
RULE_CATEGORY( Pets ) RULE_CATEGORY( Pets )
RULE_REAL( Pets, AttackCommandRange, 150 ) RULE_REAL( Pets, AttackCommandRange, 150 )
RULE_BOOL( Pets, UnTargetableSwarmPet, false ) 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_END()
RULE_CATEGORY( GM ) 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, 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, 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, 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_END()
RULE_CATEGORY( Combat ) RULE_CATEGORY( Combat )

View File

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

View File

@ -1,24 +1,19 @@
#include <iostream> #include <iostream>
#include <cstring> #include <cstring>
#include <cstdlib>
#include <ctime>
#include "shareddb.h"
#include "mysql.h"
#include "item.h"
#include "classes.h" #include "classes.h"
#include "rulesys.h"
#include "seperator.h"
#include "string_util.h"
#include "eq_packet_structs.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 "eqemu_exception.h"
#include "loottable.h"
#include "faction.h" #include "faction.h"
#include "features.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() SharedDatabase::SharedDatabase()
: Database(), skill_caps_mmf(nullptr), items_mmf(nullptr), items_hash(nullptr), faction_mmf(nullptr), faction_hash(nullptr), : 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) { 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)) if (inst->IsType(ItemClassCommon))
for(int i = AUG_BEGIN; i < EmuConstants::ITEM_COMMON_SIZE; i++) { for(int i = AUG_BEGIN; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
ItemInst *auginst=inst->GetItem(i); ItemInst *auginst=inst->GetItem(i);
@ -199,14 +194,15 @@ bool SharedDatabase::UpdateInventorySlot(uint32 char_id, const ItemInst* inst, i
// Update/Insert item // Update/Insert item
std::string query = StringFormat("REPLACE INTO inventory " std::string query = StringFormat("REPLACE INTO inventory "
"(charid, slotid, itemid, charges, instnodrop, custom_data, color, " "(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, " "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)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(), inst->GetCustomDataString().c_str(), (unsigned long)inst->GetColor(),
(unsigned long)augslot[0], (unsigned long)augslot[1], (unsigned long)augslot[2], (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); auto results = QueryDatabase(query);
// Save bag contents, if slot supports bag contents // 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) { 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)) if (inst->IsType(ItemClassCommon))
for(int i = AUG_BEGIN; i < EmuConstants::ITEM_COMMON_SIZE; i++) { for(int i = AUG_BEGIN; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
ItemInst *auginst=inst->GetItem(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 " std::string query = StringFormat("REPLACE INTO sharedbank "
"(acctid, slotid, itemid, charges, custom_data, " "(acctid, slotid, itemid, charges, custom_data, "
"augslot1, augslot2, augslot3, augslot4, augslot5) " "augslot1, augslot2, augslot3, augslot4, augslot5, augslot6) "
"VALUES( %lu, %lu, %lu, %lu, '%s', " "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)account_id, (unsigned long)slot_id, (unsigned long)inst->GetItem()->ID,
(unsigned long)charges, inst->GetCustomDataString().c_str(), (unsigned long)augslot[0], (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); auto results = QueryDatabase(query);
// Save bag contents, if slot supports bag contents // 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) if (is_charid)
query = StringFormat("SELECT sb.slotid, sb.itemid, sb.charges, " query = StringFormat("SELECT sb.slotid, sb.itemid, sb.charges, "
"sb.augslot1, sb.augslot2, sb.augslot3, " "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 " "FROM sharedbank sb INNER JOIN character_data ch "
"ON ch.account_id=sb.acctid WHERE ch.id = %i", id); "ON ch.account_id=sb.acctid WHERE ch.id = %i", id);
else else
query = StringFormat("SELECT slotid, itemid, charges, " query = StringFormat("SELECT slotid, itemid, charges, "
"augslot1, augslot2, augslot3, " "augslot1, augslot2, augslot3, "
"augslot4, augslot5, custom_data " "augslot4, augslot5, augslot6, custom_data "
"FROM sharedbank WHERE acctid=%i", id); "FROM sharedbank WHERE acctid=%i", id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success()) {
@ -419,6 +416,7 @@ bool SharedDatabase::GetSharedBank(uint32 id, Inventory* inv, bool is_charid) {
aug[2] = (uint32)atoi(row[5]); aug[2] = (uint32)atoi(row[5]);
aug[3] = (uint32)atoi(row[6]); aug[3] = (uint32)atoi(row[6]);
aug[4] = (uint32)atoi(row[7]); aug[4] = (uint32)atoi(row[7]);
aug[5] = (uint32)atoi(row[8]);
const Item_Struct* item = GetItem(item_id); 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; continue;
std::string data_str(row[8]); std::string data_str(row[9]);
std::string idAsString; std::string idAsString;
std::string value; std::string value;
bool use_id = true; 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) { bool SharedDatabase::GetInventory(uint32 char_id, Inventory* inv) {
// Retrieve character inventory // Retrieve character inventory
std::string query = StringFormat("SELECT slotid, itemid, charges, color, augslot1, " 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); "FROM inventory WHERE charid = %i ORDER BY slotid", char_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success()) {
@ -510,11 +508,13 @@ bool SharedDatabase::GetInventory(uint32 char_id, Inventory* inv) {
aug[2] = (uint32)atoul(row[6]); aug[2] = (uint32)atoul(row[6]);
aug[3] = (uint32)atoul(row[7]); aug[3] = (uint32)atoul(row[7]);
aug[4] = (uint32)atoul(row[8]); 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_icon = (uint32)atoul(row[12]);
uint32 ornament_idfile = (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); const Item_Struct* item = GetItem(item_id);
@ -527,8 +527,8 @@ bool SharedDatabase::GetInventory(uint32 char_id, Inventory* inv) {
ItemInst* inst = CreateBaseItem(item, charges); ItemInst* inst = CreateBaseItem(item, charges);
if(row[10]) { if(row[11]) {
std::string data_str(row[10]); std::string data_str(row[11]);
std::string idAsString; std::string idAsString;
std::string value; std::string value;
bool use_id = true; bool use_id = true;
@ -552,20 +552,21 @@ bool SharedDatabase::GetInventory(uint32 char_id, Inventory* inv) {
value.push_back(v); value.push_back(v);
} }
} }
if (ornament_icon > 0)
inst->SetOrnamentIcon(ornament_icon);
if (ornament_idfile > 0) inst->SetOrnamentIcon(ornament_icon);
inst->SetOrnamentationIDFile(ornament_idfile); 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)) 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) if (color > 0)
inst->SetColor(color); inst->SetColor(color);
if(charges==0x7FFF) if(charges==0x7FFF)
inst->SetCharges(-1); inst->SetCharges(-1);
else if (charges == 0 && inst->IsStackable()) // Stackable items need a minimum charge of 1 remain moveable.
inst->SetCharges(1);
else else
inst->SetCharges(charges); inst->SetCharges(charges);
@ -599,7 +600,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, Inventory* inv) {
bool SharedDatabase::GetInventory(uint32 account_id, char* name, Inventory* inv) { bool SharedDatabase::GetInventory(uint32 account_id, char* name, Inventory* inv) {
// Retrieve character inventory // Retrieve character inventory
std::string query = StringFormat("SELECT slotid, itemid, charges, color, augslot1, " 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 " "FROM inventory INNER JOIN character_data ch "
"ON ch.id = charid WHERE ch.name = '%s' AND ch.account_id = %i ORDER BY slotid", "ON ch.id = charid WHERE ch.name = '%s' AND ch.account_id = %i ORDER BY slotid",
name, account_id); name, account_id);
@ -623,10 +624,12 @@ bool SharedDatabase::GetInventory(uint32 account_id, char* name, Inventory* inv)
aug[2] = (uint32)atoi(row[6]); aug[2] = (uint32)atoi(row[6]);
aug[3] = (uint32)atoi(row[7]); aug[3] = (uint32)atoi(row[7]);
aug[4] = (uint32)atoi(row[8]); aug[4] = (uint32)atoi(row[8]);
aug[5] = (uint32)atoi(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_icon = (uint32)atoul(row[12]);
uint32 ornament_idfile = (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); const Item_Struct* item = GetItem(item_id);
int16 put_slot_id = INVALID_INDEX; int16 put_slot_id = INVALID_INDEX;
@ -634,10 +637,10 @@ bool SharedDatabase::GetInventory(uint32 account_id, char* name, Inventory* inv)
continue; continue;
ItemInst* inst = CreateBaseItem(item, charges); ItemInst* inst = CreateBaseItem(item, charges);
inst->SetInstNoDrop(instnodrop); inst->SetAttuned(instnodrop);
if(row[10]) { if(row[11]) {
std::string data_str(row[10]); std::string data_str(row[11]);
std::string idAsString; std::string idAsString;
std::string value; std::string value;
bool use_id = true; 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); inst->SetOrnamentIcon(ornament_icon);
if (ornament_idfile > 0)
inst->SetOrnamentationIDFile(ornament_idfile); inst->SetOrnamentationIDFile(ornament_idfile);
inst->SetOrnamentHeroModel(ornament_hero_model);
if (color > 0) if (color > 0)
inst->SetColor(color); inst->SetColor(color);
@ -853,8 +854,8 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_
item.MaxCharges = (int16)atoi(row[ItemField::maxcharges]); item.MaxCharges = (int16)atoi(row[ItemField::maxcharges]);
item.ItemType = (uint8)atoi(row[ItemField::itemtype]); 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.SellRate = (float)atof(row[ItemField::sellrate]);
item.CastTime = (uint32)atoul(row[ItemField::casttime]); item.CastTime = (uint32)atoul(row[ItemField::casttime]);
item.EliteMaterial = (uint32)atoul(row[ItemField::elitematerial]); item.EliteMaterial = (uint32)atoul(row[ItemField::elitematerial]);
item.ProcRate = (int32)atoi(row[ItemField::procrate]); 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.AugSlotType[4] = (uint8)atoi(row[ItemField::augslot5type]);
item.AugSlotVisible[4] = (uint8)atoi(row[ItemField::augslot5visible]); item.AugSlotVisible[4] = (uint8)atoi(row[ItemField::augslot5visible]);
item.AugSlotUnk2[4] = 0; 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.LDoNTheme = (uint32)atoul(row[ItemField::ldontheme]);
item.LDoNPrice = (uint32)atoul(row[ItemField::ldonprice]); 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) { const Item_Struct* SharedDatabase::GetItem(uint32 id) {
if(!items_hash || id > items_hash->max_key()) { if (id == 0)
{
return nullptr; 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)); return &(items_hash->at(id));
} }
@ -1180,7 +1191,7 @@ bool SharedDatabase::LoadNPCFactionLists() {
} }
// Create appropriate ItemInst class // 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; const Item_Struct* item = nullptr;
ItemInst* inst = 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, 2, aug3);
inst->PutAugment(this, 3, aug4); inst->PutAugment(this, 3, aug4);
inst->PutAugment(this, 4, aug5); inst->PutAugment(this, 4, aug5);
inst->PutAugment(this, 5, aug6);
inst->SetAttuned(attuned);
} }
return inst; return inst;
@ -1199,7 +1212,7 @@ ItemInst* SharedDatabase::CreateItem(uint32 item_id, int16 charges, uint32 aug1,
// Create appropriate ItemInst class // 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; ItemInst* inst = nullptr;
if (item) { if (item) {
@ -1209,6 +1222,8 @@ ItemInst* SharedDatabase::CreateItem(const Item_Struct* item, int16 charges, uin
inst->PutAugment(this, 2, aug3); inst->PutAugment(this, 2, aug3);
inst->PutAugment(this, 3, aug4); inst->PutAugment(this, 3, aug4);
inst->PutAugment(this, 4, aug5); inst->PutAugment(this, 4, aug5);
inst->PutAugment(this, 5, aug6);
inst->SetAttuned(attuned);
} }
return inst; 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 // set it to 1 charge so that it is usable on creation
if (charges == 0 && item->MaxCharges == -1) if (charges == 0 && item->MaxCharges == -1)
charges = 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); inst = new ItemInst(item, charges);

View File

@ -6,36 +6,42 @@
#include "database.h" #include "database.h"
#include "skills.h" #include "skills.h"
#include "spdat.h" #include "spdat.h"
#include "item.h"
#include "base_data.h" #include "base_data.h"
#include "fixed_memory_hash_set.h" #include "fixed_memory_hash_set.h"
#include "fixed_memory_variable_hash_set.h" #include "fixed_memory_variable_hash_set.h"
#include <list> #include <list>
class EvolveInfo;
class Inventory;
class ItemInst;
struct BaseDataStruct;
struct InspectMessage_Struct;
struct PlayerProfile_Struct;
struct SPDat_Spell_Struct;
struct Item_Struct; struct Item_Struct;
struct NPCFactionList; struct NPCFactionList;
struct Faction;
struct LootTable_Struct; struct LootTable_Struct;
struct LootDrop_Struct; struct LootDrop_Struct;
namespace EQEmu { namespace EQEmu
{
class MemoryMappedFile; class MemoryMappedFile;
} }
/* /*
* This object is inherited by world and zone's DB object, This object is inherited by world and zone's DB object,
* and is mainly here to facilitate shared memory, and other and is mainly here to facilitate shared memory, and other
* things which only world and zone need. things which only world and zone need.
*/ */
class SharedDatabase : public Database { class SharedDatabase : public Database
public: {
public:
SharedDatabase(); SharedDatabase();
SharedDatabase(const char* host, const char* user, const char* passwd, const char* database,uint32 port); SharedDatabase(const char* host, const char* user, const char* passwd, const char* database, uint32 port);
virtual ~SharedDatabase(); virtual ~SharedDatabase();
/* /*
* General Character Related Stuff General Character Related Stuff
*/ */
bool SetGMSpeed(uint32 account_id, uint8 gmspeed); bool SetGMSpeed(uint32 account_id, uint8 gmspeed);
uint8 GetGMSpeed(uint32 account_id); uint8 GetGMSpeed(uint32 account_id);
@ -45,11 +51,11 @@ public:
void SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* message); void SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* message);
void GetBotInspectMessage(uint32 botid, InspectMessage_Struct* message); void GetBotInspectMessage(uint32 botid, InspectMessage_Struct* message);
void SetBotInspectMessage(uint32 botid, const InspectMessage_Struct* message); void SetBotInspectMessage(uint32 botid, const InspectMessage_Struct* message);
bool GetCommandSettings(std::map<std::string,uint8> &commands); bool GetCommandSettings(std::map<std::string, uint8> &commands);
uint32 GetTotalTimeEntitledOnAccount(uint32 AccountID); uint32 GetTotalTimeEntitledOnAccount(uint32 AccountID);
/* /*
* Character Inventory Character Inventory
*/ */
bool SaveCursor(uint32 char_id, std::list<ItemInst*>::const_iterator &start, std::list<ItemInst*>::const_iterator &end); 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 SaveInventory(uint32 char_id, const ItemInst* inst, int16 slot_id);
@ -69,14 +75,14 @@ public:
std::string GetBook(const char *txtfile); std::string GetBook(const char *txtfile);
/* /*
* Item Methods 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(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); 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); ItemInst* CreateBaseItem(const Item_Struct* item, int16 charges = 0);
/* /*
* Shared Memory crap Shared Memory crap
*/ */
//items //items
@ -116,7 +122,7 @@ public:
void LoadBaseData(void *data, int max_level); void LoadBaseData(void *data, int max_level);
const BaseDataStruct* GetBaseData(int lvl, int cl); const BaseDataStruct* GetBaseData(int lvl, int cl);
protected: protected:
EQEmu::MemoryMappedFile *skill_caps_mmf; EQEmu::MemoryMappedFile *skill_caps_mmf;
EQEmu::MemoryMappedFile *items_mmf; EQEmu::MemoryMappedFile *items_mmf;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -30,7 +30,7 @@
Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt 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_DATE __DATE__
#define COMPILE_TIME __TIME__ #define COMPILE_TIME __TIME__
#ifndef WIN32 #ifndef WIN32

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -313,6 +313,9 @@
9057|2014_11_13_spells_new_updates.sql|SHOW COLUMNS FROM `spells_new` LIKE 'disallow_sit'|empty| 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| 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| 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: # Upgrade conditions:
# This won't be needed after this system is implemented, but it is used database that are not # 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[1] = 0xffffffff; // Max Level Restriction
mc->entries[2] = 0xffffffff; // Max Char Slots per Account (not used by client?) mc->entries[2] = 0xffffffff; // Max Char Slots per Account (not used by client?)
mc->entries[3] = 0xffffffff; // 1 for Silver 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[5] = 0xffffffff; // Max Platinum per level
mc->entries[6] = 1; // 0 for Silver mc->entries[6] = 1; // 0 for Silver
mc->entries[7] = 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) else if(strncasecmp(name, "LS#", 3) == 0)
id=atoi(&name[3]); id=atoi(&name[3]);
else if(database.GetAccountIDByName(name)){
int16 status = 0;
uint32 lsid = 0;
id = database.GetAccountIDByName(name, &status, &lsid);
}
else else
id=atoi(name); id=atoi(name);
#ifdef IPBASED_AUTH_HACK #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."); clog(WORLD__CLIENT_ERR,"Error: Login server login while not connected to login server.");
return false; 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 #endif
{ {
if (cle->AccountID() == 0 || (!minilogin && cle->LSID()==0)) { 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; 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); uint32 accid = database.CheckLogin(iName, iPassword, &tmpadmin);
if (accid) { 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); clientlist.Append(tmp);
return 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) if(totalusers<=20 || admin>=100)
totallength=totallength+strlen(countcle->name())+strlen(countcle->AccountName())+strlen(guild_mgr.GetGuildName(countcle->GuildID()))+5; 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++; totalusers++;
if(totalusers<=20 || admin>=100) if(totalusers<=20 || admin>=100)
totallength=totallength+strlen(countcle->name())+strlen(guild_mgr.GetGuildName(countcle->GuildID()))+5; 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) void ClientList::SendClientVersionSummary(const char *Name)
{ {
uint32 Client62Count = 0;
uint32 ClientTitaniumCount = 0; uint32 ClientTitaniumCount = 0;
uint32 ClientSoFCount = 0; uint32 ClientSoFCount = 0;
uint32 ClientSoDCount = 0; uint32 ClientSoDCount = 0;
uint32 ClientUnderfootCount = 0; uint32 ClientUnderfootCount = 0;
uint32 ClientRoFCount = 0; uint32 ClientRoFCount = 0;
uint32 ClientRoF2Count = 0;
LinkedListIterator<ClientListEntry*> Iterator(clientlist); LinkedListIterator<ClientListEntry*> Iterator(clientlist);
@ -1315,7 +1318,6 @@ void ClientList::SendClientVersionSummary(const char *Name)
{ {
case 1: case 1:
{ {
++Client62Count;
break; break;
} }
case 2: case 2:
@ -1343,6 +1345,11 @@ void ClientList::SendClientVersionSummary(const char *Name)
++ClientRoFCount; ++ClientRoFCount;
break; break;
} }
case 7:
{
++ClientRoF2Count;
break;
}
default: default:
break; 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.", zoneserver_list.SendEmoteMessage(Name, 0, 0, 13, "There are %i Titanium, %i SoF, %i SoD, %i UF, %i RoF, %i RoF2 clients currently connected.",
Client62Count, ClientTitaniumCount, ClientSoFCount, ClientSoDCount, ClientUnderfootCount, ClientRoFCount); ClientTitaniumCount, ClientSoFCount, ClientSoDCount, ClientUnderfootCount, ClientRoFCount, ClientRoF2Count);
} }

View File

@ -154,18 +154,11 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct*
} }
/* Bind End */ /* 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 */ /* 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); 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; 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]); slot = atoi(row_b[0]);
pp.item_tint[slot].rgb.red = atoi(row_b[1]); pp.item_tint[slot].rgb.red = atoi(row_b[1]);
pp.item_tint[slot].rgb.green = atoi(row_b[2]); pp.item_tint[slot].rgb.green = atoi(row_b[2]);
@ -175,50 +168,81 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct*
/* Load Inventory */ /* Load Inventory */
inv = new Inventory; inv = new Inventory;
if (GetInventory(account_id, cs->name[char_num], inv)) { if (GetInventory(account_id, cs->name[char_num], inv))
for (uint8 material = 0; material <= 8; material++) { {
uint32 color = 0; const Item_Struct* item = nullptr;
ItemInst *item = inv->GetItem(Inventory::CalcSlotFromMaterial(material)); const ItemInst* inst = nullptr;
if (item == 0) int16 invslot = 0;
continue;
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; } inst = inv->GetItem(invslot);
else{ color = item->GetItem()->Color; } 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 (matslot > 6)
if ((material == MaterialPrimary) || (material == MaterialSecondary)) { {
if (strlen(item->GetItem()->IDFile) > 2) { uint32 idfile = 0;
int ornamentationAugtype = RuleI(Character, OrnamentationAugmentType); // Weapon Models
uint32 idfile; if (inst->GetOrnamentationIDFile() != 0)
if (item->GetOrnamentationAug(ornamentationAugtype)) { {
idfile = atoi(&item->GetOrnamentationAug(ornamentationAugtype)->GetItem()->IDFile[2]); idfile = inst->GetOrnamentationIDFile();
cs->equip[char_num][matslot].material = idfile;
} }
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 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; 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]); printf("Error loading inventory for %s\n", cs->name[char_num]);
} }
safe_delete(inv); safe_delete(inv);
if (++char_num > 10) if (++char_num > 10)
{
break; break;
} }
}
return; return;
} }

View File

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

View File

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

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