mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-12 01:11:29 +00:00
merge upstream
This commit is contained in:
commit
f409d39f1a
@ -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.
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
179
common/debug.cpp
179
common/debug.cpp
@ -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,7 +76,6 @@ 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) {
|
||||||
@ -96,7 +95,6 @@ bool EQEMuLog::open(LogIDs id) {
|
|||||||
} 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());
|
||||||
@ -114,7 +112,8 @@ bool EQEMuLog::open(LogIDs id) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EQEMuLog::write(LogIDs id, const char *fmt, ...) {
|
bool EQEMuLog::write(LogIDs id, const char *fmt, ...)
|
||||||
|
{
|
||||||
if (!logFileValid) {
|
if (!logFileValid) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -125,25 +124,23 @@ bool EQEMuLog::write(LogIDs id, const char *fmt, ...) {
|
|||||||
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 */
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
va_list argptr, tmpargptr;
|
va_list argptr, tmpargptr;
|
||||||
va_start(argptr, fmt);
|
va_start(argptr, fmt);
|
||||||
if (dofile) {
|
if (dofile) {
|
||||||
@ -159,15 +156,15 @@ bool EQEMuLog::write(LogIDs id, const char *fmt, ...) {
|
|||||||
if (pLogStatus[id] & 8) {
|
if (pLogStatus[id] & 8) {
|
||||||
fprintf(stderr, "[%s] ", LogNames[id]);
|
fprintf(stderr, "[%s] ", LogNames[id]);
|
||||||
vfprintf( stderr, fmt, argptr );
|
vfprintf( stderr, fmt, argptr );
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
fprintf(stdout, "[%s] ", LogNames[id]);
|
fprintf(stdout, "[%s] ", LogNames[id]);
|
||||||
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] & 2) {
|
||||||
if (pLogStatus[id] & 8) {
|
if (pLogStatus[id] & 8) {
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
@ -177,13 +174,15 @@ bool EQEMuLog::write(LogIDs id, const char *fmt, ...) {
|
|||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(dofile)
|
if (dofile) {
|
||||||
fflush(fp[id]);
|
fflush(fp[id]);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//write with Prefix and a VA_list
|
//write with Prefix and a VA_list
|
||||||
bool EQEMuLog::writePVA(LogIDs id, const char *prefix, const char *fmt, va_list argptr) {
|
bool EQEMuLog::writePVA(LogIDs id, const char *prefix, const char *fmt, va_list argptr)
|
||||||
|
{
|
||||||
if (!logFileValid) {
|
if (!logFileValid) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -198,17 +197,14 @@ 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 */
|
||||||
|
|
||||||
va_list tmpargptr;
|
va_list tmpargptr;
|
||||||
|
|
||||||
if (dofile) {
|
if (dofile) {
|
||||||
#ifndef NO_PIDLOG
|
#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);
|
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);
|
||||||
@ -227,27 +223,30 @@ bool EQEMuLog::writePVA(LogIDs id, const char *prefix, const char *fmt, va_list
|
|||||||
if (pLogStatus[id] & 8) {
|
if (pLogStatus[id] & 8) {
|
||||||
fprintf(stderr, "[%s] %s", LogNames[id], prefix);
|
fprintf(stderr, "[%s] %s", LogNames[id], prefix);
|
||||||
vfprintf( stderr, fmt, argptr );
|
vfprintf( stderr, fmt, argptr );
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
fprintf(stdout, "[%s] %s", LogNames[id], prefix);
|
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] & 2) {
|
||||||
if (pLogStatus[id] & 8)
|
if (pLogStatus[id] & 8) {
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
else
|
} else {
|
||||||
fprintf(stdout, "\n");
|
fprintf(stdout, "\n");
|
||||||
}
|
}
|
||||||
if(dofile)
|
}
|
||||||
|
if (dofile) {
|
||||||
fflush(fp[id]);
|
fflush(fp[id]);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EQEMuLog::writebuf(LogIDs id, const char *buf, uint8 size, uint32 count) {
|
bool EQEMuLog::writebuf(LogIDs id, const char *buf, uint8 size, uint32 count)
|
||||||
|
{
|
||||||
if (!logFileValid) {
|
if (!logFileValid) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -258,25 +257,23 @@ 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 */
|
||||||
|
|
||||||
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");
|
||||||
@ -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,130 +308,144 @@ 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);
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
struct SPackSendQueue;
|
struct SPackSendQueue;
|
||||||
class EmuTCPServer;
|
class EmuTCPServer;
|
||||||
|
class ServerPacket;
|
||||||
|
|
||||||
class EmuTCPConnection : public TCPConnection {
|
class EmuTCPConnection : public TCPConnection {
|
||||||
public:
|
public:
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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
|
||||||
@ -261,17 +284,17 @@ struct Spawn_Struct {
|
|||||||
{
|
{
|
||||||
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
|
||||||
@ -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:
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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(); }
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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 {
|
||||||
@ -79,325 +82,369 @@ void EQEmuConfig::do_world(TiXmlElement *ele) {
|
|||||||
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");
|
|
||||||
if (text)
|
|
||||||
WorldTCPPort=atoi(text);
|
|
||||||
|
|
||||||
text = sub_ele->Attribute("telnet");
|
|
||||||
if (text && !strcasecmp(text,"enabled"))
|
|
||||||
TelnetEnabled=true;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
text = sub_ele->Attribute("port");
|
||||||
|
if (text) {
|
||||||
|
WorldTCPPort = atoi(text);
|
||||||
|
}
|
||||||
|
text = sub_ele->Attribute("telnet");
|
||||||
|
if (text && !strcasecmp(text, "enabled")) {
|
||||||
|
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) {
|
|
||||||
const char *text;
|
|
||||||
|
|
||||||
text=ParseTextBlock(ele,"host",true);
|
|
||||||
if (text)
|
|
||||||
QSDatabaseHost=text;
|
|
||||||
|
|
||||||
text=ParseTextBlock(ele,"port",true);
|
|
||||||
if (text)
|
|
||||||
QSDatabasePort=atoi(text);
|
|
||||||
|
|
||||||
text=ParseTextBlock(ele,"username",true);
|
|
||||||
if (text)
|
|
||||||
QSDatabaseUsername=text;
|
|
||||||
|
|
||||||
text=ParseTextBlock(ele,"password",true);
|
|
||||||
if (text)
|
|
||||||
QSDatabasePassword=text;
|
|
||||||
|
|
||||||
text=ParseTextBlock(ele,"db",true);
|
|
||||||
if (text)
|
|
||||||
QSDatabaseDB=text;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EQEmuConfig::do_zones(TiXmlElement *ele) {
|
|
||||||
|
void EQEmuConfig::do_qsdatabase(TiXmlElement *ele)
|
||||||
|
{
|
||||||
|
const char *text;
|
||||||
|
text = ParseTextBlock(ele, "host", true);
|
||||||
|
if (text) {
|
||||||
|
QSDatabaseHost = text;
|
||||||
|
}
|
||||||
|
text = ParseTextBlock(ele, "port", true);
|
||||||
|
if (text) {
|
||||||
|
QSDatabasePort = atoi(text);
|
||||||
|
}
|
||||||
|
text = ParseTextBlock(ele, "username", true);
|
||||||
|
if (text) {
|
||||||
|
QSDatabaseUsername = text;
|
||||||
|
}
|
||||||
|
text = ParseTextBlock(ele, "password", true);
|
||||||
|
if (text) {
|
||||||
|
QSDatabasePassword = text;
|
||||||
|
}
|
||||||
|
text = ParseTextBlock(ele, "db", true);
|
||||||
|
if (text) {
|
||||||
|
QSDatabaseDB = text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
|
||||||
const char *text;
|
|
||||||
|
|
||||||
text=ParseTextBlock(ele,"maps",true);
|
|
||||||
if (text)
|
|
||||||
MapDir=text;
|
|
||||||
|
|
||||||
text=ParseTextBlock(ele,"quests",true);
|
|
||||||
if (text)
|
|
||||||
QuestDir=text;
|
|
||||||
|
|
||||||
text=ParseTextBlock(ele,"plugins",true);
|
|
||||||
if (text)
|
|
||||||
PluginDir=text;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EQEmuConfig::do_launcher(TiXmlElement *ele) {
|
void EQEmuConfig::do_directories(TiXmlElement *ele)
|
||||||
|
{
|
||||||
|
const char *text;
|
||||||
|
text = ParseTextBlock(ele, "maps", true);
|
||||||
|
if (text) {
|
||||||
|
MapDir = text;
|
||||||
|
}
|
||||||
|
text = ParseTextBlock(ele, "quests", true);
|
||||||
|
if (text) {
|
||||||
|
QuestDir = text;
|
||||||
|
}
|
||||||
|
text = ParseTextBlock(ele, "plugins", true);
|
||||||
|
if (text) {
|
||||||
|
PluginDir = text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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")
|
{
|
||||||
|
if (var_name == "ShortName") {
|
||||||
return (ShortName);
|
return (ShortName);
|
||||||
if(var_name == "LongName")
|
}
|
||||||
|
if (var_name == "LongName") {
|
||||||
return (LongName);
|
return (LongName);
|
||||||
if(var_name == "WorldAddress")
|
}
|
||||||
|
if (var_name == "WorldAddress") {
|
||||||
return (WorldAddress);
|
return (WorldAddress);
|
||||||
if(var_name == "LoginHost")
|
}
|
||||||
|
if (var_name == "LoginHost") {
|
||||||
return (LoginHost);
|
return (LoginHost);
|
||||||
if(var_name == "LoginAccount")
|
}
|
||||||
|
if (var_name == "LoginAccount") {
|
||||||
return (LoginAccount);
|
return (LoginAccount);
|
||||||
if(var_name == "LoginPassword")
|
}
|
||||||
|
if (var_name == "LoginPassword") {
|
||||||
return (LoginPassword);
|
return (LoginPassword);
|
||||||
if(var_name == "LoginPort")
|
}
|
||||||
|
if (var_name == "LoginPort") {
|
||||||
return (itoa(LoginPort));
|
return (itoa(LoginPort));
|
||||||
if(var_name == "Locked")
|
}
|
||||||
|
if (var_name == "Locked") {
|
||||||
return (Locked ? "true" : "false");
|
return (Locked ? "true" : "false");
|
||||||
if(var_name == "WorldTCPPort")
|
}
|
||||||
|
if (var_name == "WorldTCPPort") {
|
||||||
return (itoa(WorldTCPPort));
|
return (itoa(WorldTCPPort));
|
||||||
if(var_name == "WorldIP")
|
}
|
||||||
|
if (var_name == "WorldIP") {
|
||||||
return (WorldIP);
|
return (WorldIP);
|
||||||
if(var_name == "TelnetEnabled")
|
}
|
||||||
|
if (var_name == "TelnetEnabled") {
|
||||||
return (TelnetEnabled ? "true" : "false");
|
return (TelnetEnabled ? "true" : "false");
|
||||||
if(var_name == "WorldHTTPPort")
|
}
|
||||||
|
if (var_name == "WorldHTTPPort") {
|
||||||
return (itoa(WorldHTTPPort));
|
return (itoa(WorldHTTPPort));
|
||||||
if(var_name == "WorldHTTPMimeFile")
|
}
|
||||||
|
if (var_name == "WorldHTTPMimeFile") {
|
||||||
return (WorldHTTPMimeFile);
|
return (WorldHTTPMimeFile);
|
||||||
if(var_name == "WorldHTTPEnabled")
|
}
|
||||||
|
if (var_name == "WorldHTTPEnabled") {
|
||||||
return (WorldHTTPEnabled ? "true" : "false");
|
return (WorldHTTPEnabled ? "true" : "false");
|
||||||
if(var_name == "ChatHost")
|
}
|
||||||
|
if (var_name == "ChatHost") {
|
||||||
return (ChatHost);
|
return (ChatHost);
|
||||||
if(var_name == "ChatPort")
|
}
|
||||||
|
if (var_name == "ChatPort") {
|
||||||
return (itoa(ChatPort));
|
return (itoa(ChatPort));
|
||||||
if(var_name == "MailHost")
|
}
|
||||||
|
if (var_name == "MailHost") {
|
||||||
return (MailHost);
|
return (MailHost);
|
||||||
if(var_name == "MailPort")
|
}
|
||||||
|
if (var_name == "MailPort") {
|
||||||
return (itoa(MailPort));
|
return (itoa(MailPort));
|
||||||
if(var_name == "DatabaseHost")
|
}
|
||||||
|
if (var_name == "DatabaseHost") {
|
||||||
return (DatabaseHost);
|
return (DatabaseHost);
|
||||||
if(var_name == "DatabaseUsername")
|
}
|
||||||
|
if (var_name == "DatabaseUsername") {
|
||||||
return (DatabaseUsername);
|
return (DatabaseUsername);
|
||||||
if(var_name == "DatabasePassword")
|
}
|
||||||
|
if (var_name == "DatabasePassword") {
|
||||||
return (DatabasePassword);
|
return (DatabasePassword);
|
||||||
if(var_name == "DatabaseDB")
|
}
|
||||||
|
if (var_name == "DatabaseDB") {
|
||||||
return (DatabaseDB);
|
return (DatabaseDB);
|
||||||
if(var_name == "DatabasePort")
|
}
|
||||||
|
if (var_name == "DatabasePort") {
|
||||||
return (itoa(DatabasePort));
|
return (itoa(DatabasePort));
|
||||||
if(var_name == "QSDatabaseHost")
|
}
|
||||||
|
if (var_name == "QSDatabaseHost") {
|
||||||
return (QSDatabaseHost);
|
return (QSDatabaseHost);
|
||||||
if(var_name == "QSDatabaseUsername")
|
}
|
||||||
|
if (var_name == "QSDatabaseUsername") {
|
||||||
return (QSDatabaseUsername);
|
return (QSDatabaseUsername);
|
||||||
if(var_name == "QSDatabasePassword")
|
}
|
||||||
|
if (var_name == "QSDatabasePassword") {
|
||||||
return (QSDatabasePassword);
|
return (QSDatabasePassword);
|
||||||
if(var_name == "QSDatabaseDB")
|
}
|
||||||
|
if (var_name == "QSDatabaseDB") {
|
||||||
return (QSDatabaseDB);
|
return (QSDatabaseDB);
|
||||||
if(var_name == "QSDatabasePort")
|
}
|
||||||
|
if (var_name == "QSDatabasePort") {
|
||||||
return (itoa(QSDatabasePort));
|
return (itoa(QSDatabasePort));
|
||||||
if(var_name == "SpellsFile")
|
}
|
||||||
|
if (var_name == "SpellsFile") {
|
||||||
return (SpellsFile);
|
return (SpellsFile);
|
||||||
if(var_name == "OpCodesFile")
|
}
|
||||||
|
if (var_name == "OpCodesFile") {
|
||||||
return (OpCodesFile);
|
return (OpCodesFile);
|
||||||
if(var_name == "EQTimeFile")
|
}
|
||||||
|
if (var_name == "EQTimeFile") {
|
||||||
return (EQTimeFile);
|
return (EQTimeFile);
|
||||||
if(var_name == "LogSettingsFile")
|
}
|
||||||
|
if (var_name == "LogSettingsFile") {
|
||||||
return (LogSettingsFile);
|
return (LogSettingsFile);
|
||||||
if(var_name == "MapDir")
|
}
|
||||||
|
if (var_name == "MapDir") {
|
||||||
return (MapDir);
|
return (MapDir);
|
||||||
if(var_name == "QuestDir")
|
}
|
||||||
|
if (var_name == "QuestDir") {
|
||||||
return (QuestDir);
|
return (QuestDir);
|
||||||
if(var_name == "PluginDir")
|
}
|
||||||
|
if (var_name == "PluginDir") {
|
||||||
return (PluginDir);
|
return (PluginDir);
|
||||||
if(var_name == "LogPrefix")
|
}
|
||||||
|
if (var_name == "LogPrefix") {
|
||||||
return (LogPrefix);
|
return (LogPrefix);
|
||||||
if(var_name == "LogSuffix")
|
}
|
||||||
|
if (var_name == "LogSuffix") {
|
||||||
return (LogSuffix);
|
return (LogSuffix);
|
||||||
if(var_name == "ZoneExe")
|
}
|
||||||
|
if (var_name == "ZoneExe") {
|
||||||
return (ZoneExe);
|
return (ZoneExe);
|
||||||
if(var_name == "ZonePortLow")
|
}
|
||||||
|
if (var_name == "ZonePortLow") {
|
||||||
return (itoa(ZonePortLow));
|
return (itoa(ZonePortLow));
|
||||||
if(var_name == "ZonePortHigh")
|
}
|
||||||
|
if (var_name == "ZonePortHigh") {
|
||||||
return (itoa(ZonePortHigh));
|
return (itoa(ZonePortHigh));
|
||||||
if(var_name == "DefaultStatus")
|
}
|
||||||
|
if (var_name == "DefaultStatus") {
|
||||||
return (itoa(DefaultStatus));
|
return (itoa(DefaultStatus));
|
||||||
|
}
|
||||||
// if(var_name == "DynamicCount")
|
// if(var_name == "DynamicCount")
|
||||||
// return(itoa(DynamicCount));
|
// return(itoa(DynamicCount));
|
||||||
return ("");
|
return ("");
|
||||||
|
|||||||
@ -28,7 +28,8 @@ 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;
|
||||||
|
|
||||||
@ -115,18 +116,16 @@ protected:
|
|||||||
#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;
|
||||||
@ -135,40 +134,33 @@ protected:
|
|||||||
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";
|
||||||
@ -181,43 +173,43 @@ protected:
|
|||||||
#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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -15,11 +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 "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");
|
||||||
@ -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;
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
@ -8,7 +8,8 @@
|
|||||||
|
|
||||||
class Database;
|
class Database;
|
||||||
|
|
||||||
class CharGuildInfo {
|
class CharGuildInfo
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
//fields from `characer_`
|
//fields from `characer_`
|
||||||
uint32 char_id;
|
uint32 char_id;
|
||||||
@ -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);
|
||||||
@ -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;
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
100
common/item.cpp
100
common/item.cpp
@ -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
|
||||||
|
{
|
||||||
|
if (ornamentationAugtype > 0)
|
||||||
|
{
|
||||||
|
for (int i = AUG_BEGIN; i < EmuConstants::ITEM_COMMON_SIZE; i++)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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 ,
|
||||||
|
|||||||
@ -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) + ' ')
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -7,9 +7,9 @@ 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";
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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
@ -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_*/
|
|
||||||
@ -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
|
|
||||||
|
|
||||||
*/
|
|
||||||
@ -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
|
|
||||||
|
|
||||||
@ -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
@ -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();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
@ -585,10 +582,11 @@ struct NewZone_Struct {
|
|||||||
/*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;
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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];
|
||||||
|
|||||||
@ -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*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -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];
|
||||||
|
|||||||
@ -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*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -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];
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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 )
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
@ -49,7 +55,7 @@ public:
|
|||||||
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
|
||||||
|
|||||||
@ -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"
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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>
|
||||||
|
|
||||||
|
|||||||
@ -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"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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
|
|
||||||
|
|
||||||
@ -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
|
||||||
|
|||||||
2
utils/scripts/opcode_scripts/.gitignore
vendored
2
utils/scripts/opcode_scripts/.gitignore
vendored
@ -1,3 +1,3 @@
|
|||||||
# Input and Output txt and conf files.
|
# Input and Output txt and conf files
|
||||||
*.txt
|
*.txt
|
||||||
*.conf
|
*.conf
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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";
|
||||||
|
|||||||
@ -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
|
|
||||||
|
|||||||
@ -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
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
2
utils/sql/git/optional/2014_12_15_heromodelCommand.sql
Normal file
2
utils/sql/git/optional/2014_12_15_heromodelCommand.sql
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
INSERT INTO `commands` (`command`, `access`) VALUES ('heromodel', 80);
|
||||||
|
INSERT INTO `commands` (`command`, `access`) VALUES ('hm', 80);
|
||||||
@ -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.');
|
||||||
1
utils/sql/git/required/2014_12_09_items_table_update.sql
Normal file
1
utils/sql/git/required/2014_12_09_items_table_update.sql
Normal file
@ -0,0 +1 @@
|
|||||||
|
ALTER TABLE `items` ADD `herosforgemodel` int( 11 ) NOT NULL DEFAULT '0' AFTER `material`;
|
||||||
@ -0,0 +1 @@
|
|||||||
|
ALTER TABLE `inventory` ADD `ornament_hero_model` int( 11 ) NOT NULL DEFAULT '0' AFTER `ornamentidfile`;
|
||||||
16
utils/sql/git/required/2014_12_15_multiple_table_updates.sql
Normal file
16
utils/sql/git/required/2014_12_15_multiple_table_updates.sql
Normal 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`;
|
||||||
@ -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)) {
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
19
zone/aa.cpp
19
zone/aa.cpp
@ -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);
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -15,18 +15,22 @@
|
|||||||
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 <stdlib.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include "masterentity.h"
|
|
||||||
#include "../common/faction.h"
|
#include "../common/faction.h"
|
||||||
#include "map.h"
|
|
||||||
#include "../common/spdat.h"
|
|
||||||
#include "../common/skills.h"
|
|
||||||
#include "../common/misc_functions.h"
|
|
||||||
#include "../common/rulesys.h"
|
#include "../common/rulesys.h"
|
||||||
#include "string_ids.h"
|
#include "../common/spdat.h"
|
||||||
#include <iostream>
|
|
||||||
|
#include "client.h"
|
||||||
|
#include "corpse.h"
|
||||||
|
#include "entity.h"
|
||||||
|
#include "mob.h"
|
||||||
|
|
||||||
|
#ifdef BOTS
|
||||||
|
#include "bot.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "map.h"
|
||||||
|
|
||||||
extern Zone* zone;
|
extern Zone* zone;
|
||||||
//#define LOSDEBUG 6
|
//#define LOSDEBUG 6
|
||||||
@ -1124,8 +1128,7 @@ int32 Mob::CheckAggroAmount(uint16 spell_id, bool isproc)
|
|||||||
|
|
||||||
int HateMod = RuleI(Aggro, SpellAggroMod);
|
int HateMod = RuleI(Aggro, SpellAggroMod);
|
||||||
|
|
||||||
if (IsClient())
|
HateMod += GetFocusEffect(focusSpellHateMod, spell_id);
|
||||||
HateMod += CastToClient()->GetFocusEffect(focusSpellHateMod, spell_id);
|
|
||||||
|
|
||||||
AggroAmount = (AggroAmount * HateMod) / 100;
|
AggroAmount = (AggroAmount * HateMod) / 100;
|
||||||
|
|
||||||
@ -1174,8 +1177,7 @@ int32 Mob::CheckHealAggroAmount(uint16 spell_id, uint32 heal_possible)
|
|||||||
if (AggroAmount > 0) {
|
if (AggroAmount > 0) {
|
||||||
int HateMod = RuleI(Aggro, SpellAggroMod);
|
int HateMod = RuleI(Aggro, SpellAggroMod);
|
||||||
|
|
||||||
if (IsClient())
|
HateMod += GetFocusEffect(focusSpellHateMod, spell_id);
|
||||||
HateMod += CastToClient()->GetFocusEffect(focusSpellHateMod, spell_id);
|
|
||||||
|
|
||||||
//Live AA - Spell casting subtlety
|
//Live AA - Spell casting subtlety
|
||||||
HateMod += aabonuses.hatemod + spellbonuses.hatemod + itembonuses.hatemod;
|
HateMod += aabonuses.hatemod + spellbonuses.hatemod + itembonuses.hatemod;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user