mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-12 09:31:30 +00:00
merge
This commit is contained in:
commit
089360a3a5
@ -1,4 +1,36 @@
|
|||||||
#EQEmu Cmake
|
#EQEmu CMake
|
||||||
|
#Variables used:
|
||||||
|
#EQEMU_DISABLE_CRT_SECURE_WARNINGS
|
||||||
|
#EQEMU_FAST_FLOATINGPOINT
|
||||||
|
#EQEMU_ENABLE_CRASH_LOGGING
|
||||||
|
#EQEMU_DISABLE_SAFESEH
|
||||||
|
#EQEMU_BUILD_MSVC_MP
|
||||||
|
#EQEMU_DEBUG_LEVEL
|
||||||
|
#EQEMU_LOG_LEVEL_STATUS
|
||||||
|
#EQEMU_LOG_LEVEL_NORMAL
|
||||||
|
#EQEMU_LOG_LEVEL_ERROR
|
||||||
|
#EQEMU_LOG_LEVEL_DEBUG
|
||||||
|
#EQEMU_LOG_LEVEL_QUEST
|
||||||
|
#EQEMU_LOG_LEVEL_COMMANDS
|
||||||
|
#EQEMU_LOG_LEVEL_CRASH
|
||||||
|
#EQEMU_STREAM_SEND_RATE
|
||||||
|
#EQEMU_STREAM_DECAY_RATE
|
||||||
|
#EQEMU_STREAM_RETRANSMIT_TIMEOUT_MUL
|
||||||
|
#EQEMU_STREAM_RETRANSMIT_TIMEOUT_MAX
|
||||||
|
#EQEMU_STREAM_AVERAGE_DELTA_MAX
|
||||||
|
#EQEMU_STREAM_RETRANSMIT_ACKED_PACKETS
|
||||||
|
#EQEMU_DEPOP_INVALIDATES_CACHE
|
||||||
|
#EQEMU_ENABLE_BOTS
|
||||||
|
#EQEMU_DISABLE_LOGSYS
|
||||||
|
#EQEMU_COMMANDS_LOGGING
|
||||||
|
#EQEMU_BUILD_SERVER
|
||||||
|
#EQEMU_BUILD_LOGIN
|
||||||
|
#EQEMU_BUILD_TESTS
|
||||||
|
#EQEMU_BUILD_PERL
|
||||||
|
#EQEMU_BUILD_LUA
|
||||||
|
#EQEMU_SANITIZE_LUA_LIBS
|
||||||
|
#EQEMU_BUILD_CLIENT_FILES
|
||||||
|
#EQEMU_MAP_DIR
|
||||||
|
|
||||||
#We set a fairly new version (as of 2013) because I found finding perl was a bit... buggy on older ones
|
#We set a fairly new version (as of 2013) because I found finding perl was a bit... buggy on older ones
|
||||||
#Can change this if you really want but you should upgrade!
|
#Can change this if you really want but you should upgrade!
|
||||||
@ -7,9 +39,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
|||||||
#FindMySQL is located here so lets make it so CMake can find it
|
#FindMySQL is located here so lets make it so CMake can find it
|
||||||
SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/" ${CMAKE_MODULE_PATH})
|
SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/" ${CMAKE_MODULE_PATH})
|
||||||
|
|
||||||
#For checking includes
|
|
||||||
INCLUDE (CheckIncludeFiles)
|
|
||||||
|
|
||||||
#Our project name is EQEmu
|
#Our project name is EQEmu
|
||||||
PROJECT(EQEmu)
|
PROJECT(EQEmu)
|
||||||
|
|
||||||
@ -75,7 +104,7 @@ IF(MSVC)
|
|||||||
SET(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO} /SAFESEH:NO")
|
SET(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO} /SAFESEH:NO")
|
||||||
ENDIF(EQEMU_DISABLE_SAFESEH)
|
ENDIF(EQEMU_DISABLE_SAFESEH)
|
||||||
|
|
||||||
OPTION(EQEMU_BUILD_MSVC_MP "Enable build with multiple processes." TRUE)
|
OPTION(EQEMU_BUILD_MSVC_MP "Enable build with multiple processes." ON)
|
||||||
IF(EQEMU_BUILD_MSVC_MP)
|
IF(EQEMU_BUILD_MSVC_MP)
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
|
||||||
ENDIF(EQEMU_BUILD_MSVC_MP)
|
ENDIF(EQEMU_BUILD_MSVC_MP)
|
||||||
@ -105,12 +134,6 @@ IF(UNIX)
|
|||||||
ENDIF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
|
ENDIF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
|
||||||
ENDIF(UNIX)
|
ENDIF(UNIX)
|
||||||
|
|
||||||
#use stdint.h types if they exist for this platform (we have to guess otherwise)
|
|
||||||
CHECK_INCLUDE_FILES(stdint.h HAVE_STDINT_H)
|
|
||||||
IF(HAVE_STDINT_H)
|
|
||||||
ADD_DEFINITIONS(-DEQEMU_USE_STDINT)
|
|
||||||
ENDIF(HAVE_STDINT_H)
|
|
||||||
|
|
||||||
#debug level, 5 is default. Most people wont ever change this but it's there if you want to
|
#debug level, 5 is default. Most people wont ever change this but it's there if you want to
|
||||||
SET(EQEMU_DEBUG_LEVEL 5 CACHE STRING "EQEmu debug level:
|
SET(EQEMU_DEBUG_LEVEL 5 CACHE STRING "EQEmu debug level:
|
||||||
0 - Quiet mode Errors to file Status and Normal ignored
|
0 - Quiet mode Errors to file Status and Normal ignored
|
||||||
@ -229,10 +252,9 @@ ENDIF(EQEMU_ENABLE_BOTS)
|
|||||||
#What to build
|
#What to build
|
||||||
OPTION(EQEMU_BUILD_SERVER "Build the game server." ON)
|
OPTION(EQEMU_BUILD_SERVER "Build the game server." ON)
|
||||||
OPTION(EQEMU_BUILD_LOGIN "Build the login server." OFF)
|
OPTION(EQEMU_BUILD_LOGIN "Build the login server." OFF)
|
||||||
OPTION(EQEMU_BUILD_SOCKET_SERVER "Build the socket server." OFF)
|
|
||||||
OPTION(EQEMU_BUILD_TESTS "Build utility tests." OFF)
|
OPTION(EQEMU_BUILD_TESTS "Build utility tests." OFF)
|
||||||
OPTION(EQEMU_BUILD_PERL "Build Perl parser." ON)
|
OPTION(EQEMU_BUILD_PERL "Build Perl parser." ON)
|
||||||
OPTION(EQEMU_BUILD_LUA "Build Lua parser." OFF)
|
OPTION(EQEMU_BUILD_LUA "Build Lua parser." ON)
|
||||||
OPTION(EQEMU_BUILD_CLIENT_FILES "Build Client Import/Export Data Programs." ON)
|
OPTION(EQEMU_BUILD_CLIENT_FILES "Build Client Import/Export Data Programs." ON)
|
||||||
|
|
||||||
#C++11 stuff
|
#C++11 stuff
|
||||||
|
|||||||
@ -1,5 +1,19 @@
|
|||||||
EQEMu Changelog (Started on Sept 24, 2003 15:50)
|
EQEMu Changelog (Started on Sept 24, 2003 15:50)
|
||||||
-------------------------------------------------------
|
-------------------------------------------------------
|
||||||
|
|
||||||
|
== 07/16/2014 ==
|
||||||
|
Uleat: Initial commit of new client/server 'dictionaries' - work in-progress... Changed equipment slot references to reflect new naming
|
||||||
|
conventions. Lua enumerations maintain both the old and new names as to not break existing scripts..but, the old names are deprecated.
|
||||||
|
|
||||||
|
|
||||||
|
== 07/14/2014 ==
|
||||||
|
KLS: Changes to CMake build
|
||||||
|
-Lua builds by default now
|
||||||
|
-Common has been renamed common
|
||||||
|
-Binary files will now be put into ${CMAKE_BINARY_DIR}/bin instead of ${CMAKE_BINARY_DIR}/Bin
|
||||||
|
The last two are of note to people on non-windows systems as case sensitivity is important. Edit your scripts accordingly, thank you.
|
||||||
|
|
||||||
|
|
||||||
== 07/10/2014 ==
|
== 07/10/2014 ==
|
||||||
Kayen: Updated table npc_spells to now support defensive and ranged procs.
|
Kayen: Updated table npc_spells to now support defensive and ranged procs.
|
||||||
Note: Proc rate modifier work as it does for spell effects (ie 200 = 200% baseline chance modifier)
|
Note: Proc rate modifier work as it does for spell effects (ie 200 = 200% baseline chance modifier)
|
||||||
@ -33,6 +47,7 @@ Param3: Percent Total Damage modifier
|
|||||||
Required SQL: utils/sql/git/required/2014_07_10_npc_spells.sql
|
Required SQL: utils/sql/git/required/2014_07_10_npc_spells.sql
|
||||||
Optional SQL: utils/sql/git/optional/2014_07_10_AICastingRules.sql
|
Optional SQL: utils/sql/git/optional/2014_07_10_AICastingRules.sql
|
||||||
|
|
||||||
|
|
||||||
== 07/5/2014 ==
|
== 07/5/2014 ==
|
||||||
Kayen: Updated SE_Sanctuary - Adjust way hate lowering effect worked to be more accurate
|
Kayen: Updated SE_Sanctuary - Adjust way hate lowering effect worked to be more accurate
|
||||||
Kayen: Updated SE_SympatheticProc - Revised proc rate formula to be accurate to live.
|
Kayen: Updated SE_SympatheticProc - Revised proc rate formula to be accurate to live.
|
||||||
|
|||||||
@ -11,7 +11,7 @@ ADD_EXECUTABLE(export_client_files ${export_sources} ${export_headers})
|
|||||||
|
|
||||||
INSTALL(TARGETS export_client_files RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
|
INSTALL(TARGETS export_client_files RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
|
||||||
|
|
||||||
TARGET_LINK_LIBRARIES(export_client_files Common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
TARGET_LINK_LIBRARIES(export_client_files common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
SET_TARGET_PROPERTIES(export_client_files PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
SET_TARGET_PROPERTIES(export_client_files PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
||||||
@ -33,4 +33,4 @@ IF(UNIX)
|
|||||||
ADD_DEFINITIONS(-fPIC)
|
ADD_DEFINITIONS(-fPIC)
|
||||||
ENDIF(UNIX)
|
ENDIF(UNIX)
|
||||||
|
|
||||||
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/Bin)
|
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||||
|
|||||||
@ -11,7 +11,7 @@ ADD_EXECUTABLE(import_client_files ${import_sources} ${import_headers})
|
|||||||
|
|
||||||
INSTALL(TARGETS import_client_files RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
|
INSTALL(TARGETS import_client_files RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
|
||||||
|
|
||||||
TARGET_LINK_LIBRARIES(import_client_files Common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
TARGET_LINK_LIBRARIES(import_client_files common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
SET_TARGET_PROPERTIES(import_client_files PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
SET_TARGET_PROPERTIES(import_client_files PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
||||||
@ -33,4 +33,4 @@ IF(UNIX)
|
|||||||
ADD_DEFINITIONS(-fPIC)
|
ADD_DEFINITIONS(-fPIC)
|
||||||
ENDIF(UNIX)
|
ENDIF(UNIX)
|
||||||
|
|
||||||
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/Bin)
|
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||||
|
|||||||
@ -14,6 +14,7 @@ SET(common_sources
|
|||||||
emu_opcodes.cpp
|
emu_opcodes.cpp
|
||||||
EmuTCPConnection.cpp
|
EmuTCPConnection.cpp
|
||||||
EmuTCPServer.cpp
|
EmuTCPServer.cpp
|
||||||
|
eq_dictionary.cpp
|
||||||
EQDB.cpp
|
EQDB.cpp
|
||||||
EQDBRes.cpp
|
EQDBRes.cpp
|
||||||
eqemu_exception.cpp
|
eqemu_exception.cpp
|
||||||
@ -111,6 +112,7 @@ SET(common_headers
|
|||||||
EmuTCPConnection.h
|
EmuTCPConnection.h
|
||||||
EmuTCPServer.h
|
EmuTCPServer.h
|
||||||
eq_constants.h
|
eq_constants.h
|
||||||
|
eq_dictionary.h
|
||||||
eq_packet_structs.h
|
eq_packet_structs.h
|
||||||
EQDB.h
|
EQDB.h
|
||||||
EQDBRes.h
|
EQDBRes.h
|
||||||
@ -315,11 +317,11 @@ SOURCE_GROUP(TinyXML FILES
|
|||||||
|
|
||||||
INCLUDE_DIRECTORIES(Patches SocketLib StackWalker TinyXML)
|
INCLUDE_DIRECTORIES(Patches SocketLib StackWalker TinyXML)
|
||||||
|
|
||||||
ADD_LIBRARY(Common ${common_sources} ${common_headers})
|
ADD_LIBRARY(common ${common_sources} ${common_headers})
|
||||||
|
|
||||||
IF(UNIX)
|
IF(UNIX)
|
||||||
ADD_DEFINITIONS(-fPIC)
|
ADD_DEFINITIONS(-fPIC)
|
||||||
SET_SOURCE_FILES_PROPERTIES("patches/SoD.cpp" "patches/SoF.cpp" "patches/RoF.cpp" "patches/Underfoot.cpp" PROPERTIES COMPILE_FLAGS -O0)
|
SET_SOURCE_FILES_PROPERTIES("patches/SoD.cpp" "patches/SoF.cpp" "patches/RoF.cpp" "patches/Underfoot.cpp" PROPERTIES COMPILE_FLAGS -O0)
|
||||||
ENDIF(UNIX)
|
ENDIF(UNIX)
|
||||||
|
|
||||||
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/Bin)
|
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||||
|
|||||||
@ -366,22 +366,6 @@ bool EmuTCPConnection::LineOutQueuePush(char* line) {
|
|||||||
safe_delete_array(line);
|
safe_delete_array(line);
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
if (strcmp(line, "**PACKETMODESS**") == 0) {
|
|
||||||
MSendQueue.lock();
|
|
||||||
safe_delete_array(sendbuf);
|
|
||||||
if (TCPMode == modeConsole)
|
|
||||||
Send((const uchar*) "\0**PACKETMODESS**\r", 18);
|
|
||||||
TCPMode = modePacket;
|
|
||||||
PacketMode = packetModeSocket_Server;
|
|
||||||
EmuTCPNetPacket_Struct* tnps = 0;
|
|
||||||
while ((tnps = InModeQueue.pop())) {
|
|
||||||
SendPacket(tnps);
|
|
||||||
safe_delete_array(tnps);
|
|
||||||
}
|
|
||||||
MSendQueue.unlock();
|
|
||||||
safe_delete_array(line);
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return(TCPConnection::LineOutQueuePush(line));
|
return(TCPConnection::LineOutQueuePush(line));
|
||||||
@ -435,13 +419,6 @@ bool EmuTCPConnection::ConnectIP(uint32 irIP, uint16 irPort, char* errbuf) {
|
|||||||
sendbuf = new uchar[sendbuf_size];
|
sendbuf = new uchar[sendbuf_size];
|
||||||
memcpy(sendbuf, "\0**PACKETMODEQS**\r", sendbuf_size);
|
memcpy(sendbuf, "\0**PACKETMODEQS**\r", sendbuf_size);
|
||||||
}
|
}
|
||||||
else if (PacketMode == packetModeSocket_Server) {
|
|
||||||
safe_delete_array(sendbuf);
|
|
||||||
sendbuf_size = 18;
|
|
||||||
sendbuf_used = sendbuf_size;
|
|
||||||
sendbuf = new uchar[sendbuf_size];
|
|
||||||
memcpy(sendbuf, "\0**PACKETMODESS**\r", sendbuf_size);
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
//default: packetModeZone
|
//default: packetModeZone
|
||||||
safe_delete_array(sendbuf);
|
safe_delete_array(sendbuf);
|
||||||
|
|||||||
@ -30,7 +30,7 @@ class EmuTCPServer;
|
|||||||
class EmuTCPConnection : public TCPConnection {
|
class EmuTCPConnection : public TCPConnection {
|
||||||
public:
|
public:
|
||||||
enum eTCPMode { modeConsole, modeTransition, modePacket };
|
enum eTCPMode { modeConsole, modeTransition, modePacket };
|
||||||
enum ePacketMode { packetModeZone, packetModeLauncher, packetModeLogin, packetModeUCS, packetModeQueryServ, packetModeSocket_Server };
|
enum ePacketMode { packetModeZone, packetModeLauncher, packetModeLogin, packetModeUCS, packetModeQueryServ };
|
||||||
|
|
||||||
EmuTCPConnection(uint32 ID, EmuTCPServer* iServer, SOCKET iSock, uint32 irIP, uint16 irPort, bool iOldFormat = false);
|
EmuTCPConnection(uint32 ID, EmuTCPServer* iServer, SOCKET iSock, uint32 irIP, uint16 irPort, bool iOldFormat = false);
|
||||||
EmuTCPConnection(bool iOldFormat = false, EmuTCPServer* iRelayServer = 0, eTCPMode iMode = modePacket); // for outgoing connections
|
EmuTCPConnection(bool iOldFormat = false, EmuTCPServer* iRelayServer = 0, eTCPMode iMode = modePacket); // for outgoing connections
|
||||||
|
|||||||
154
common/Item.cpp
154
common/Item.cpp
@ -166,7 +166,7 @@ ItemInst* Inventory::GetItem(int16 slot_id) const
|
|||||||
ItemInst* result = nullptr;
|
ItemInst* result = nullptr;
|
||||||
|
|
||||||
// Cursor
|
// Cursor
|
||||||
if (slot_id == SLOT_CURSOR) {
|
if (slot_id == MainCursor) {
|
||||||
// Cursor slot
|
// Cursor slot
|
||||||
result = m_cursor.peek_front();
|
result = m_cursor.peek_front();
|
||||||
}
|
}
|
||||||
@ -258,7 +258,7 @@ int16 Inventory::PutItem(int16 slot_id, const ItemInst& inst)
|
|||||||
int16 Inventory::PushCursor(const ItemInst& inst)
|
int16 Inventory::PushCursor(const ItemInst& inst)
|
||||||
{
|
{
|
||||||
m_cursor.push(inst.Clone());
|
m_cursor.push(inst.Clone());
|
||||||
return SLOT_CURSOR;
|
return MainCursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Swap items in inventory
|
// Swap items in inventory
|
||||||
@ -332,7 +332,7 @@ ItemInst* Inventory::PopItem(int16 slot_id)
|
|||||||
{
|
{
|
||||||
ItemInst* p = nullptr;
|
ItemInst* p = nullptr;
|
||||||
|
|
||||||
if (slot_id == SLOT_CURSOR) { // Cursor
|
if (slot_id == MainCursor) { // Cursor
|
||||||
p = m_cursor.pop();
|
p = m_cursor.pop();
|
||||||
}
|
}
|
||||||
else if ((slot_id >= 0 && slot_id <= 21) || (slot_id >= 400 && slot_id <= 404) || (slot_id == 9999)) { // Worn slots
|
else if ((slot_id >= 0 && slot_id <= 21) || (slot_id >= 400 && slot_id <= 404) || (slot_id == 9999)) { // Worn slots
|
||||||
@ -469,7 +469,7 @@ bool Inventory::HasSpaceForItem(const Item_Struct *ItemToTry, int16 Quantity) {
|
|||||||
//when quantity is greater than 1 and not all of quantity can be found in 1 stack.
|
//when quantity is greater than 1 and not all of quantity can be found in 1 stack.
|
||||||
int16 Inventory::HasItem(uint32 item_id, uint8 quantity, uint8 where)
|
int16 Inventory::HasItem(uint32 item_id, uint8 quantity, uint8 where)
|
||||||
{
|
{
|
||||||
int16 slot_id = SLOT_INVALID;
|
int16 slot_id = INVALID_INDEX;
|
||||||
|
|
||||||
//Altered by Father Nitwit to support a specification of
|
//Altered by Father Nitwit to support a specification of
|
||||||
//where to search, with a default value to maintain compatibility
|
//where to search, with a default value to maintain compatibility
|
||||||
@ -477,38 +477,38 @@ int16 Inventory::HasItem(uint32 item_id, uint8 quantity, uint8 where)
|
|||||||
// Check each inventory bucket
|
// Check each inventory bucket
|
||||||
if (where & invWhereWorn) {
|
if (where & invWhereWorn) {
|
||||||
slot_id = _HasItem(m_worn, item_id, quantity);
|
slot_id = _HasItem(m_worn, item_id, quantity);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (where & invWherePersonal) {
|
if (where & invWherePersonal) {
|
||||||
slot_id = _HasItem(m_inv, item_id, quantity);
|
slot_id = _HasItem(m_inv, item_id, quantity);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (where & invWhereBank) {
|
if (where & invWhereBank) {
|
||||||
slot_id = _HasItem(m_bank, item_id, quantity);
|
slot_id = _HasItem(m_bank, item_id, quantity);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (where & invWhereSharedBank) {
|
if (where & invWhereSharedBank) {
|
||||||
slot_id = _HasItem(m_shbank, item_id, quantity);
|
slot_id = _HasItem(m_shbank, item_id, quantity);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (where & invWhereTrading) {
|
if (where & invWhereTrading) {
|
||||||
slot_id = _HasItem(m_trade, item_id, quantity);
|
slot_id = _HasItem(m_trade, item_id, quantity);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (where & invWhereCursor) {
|
if (where & invWhereCursor) {
|
||||||
// Check cursor queue
|
// Check cursor queue
|
||||||
slot_id = _HasItem(m_cursor, item_id, quantity);
|
slot_id = _HasItem(m_cursor, item_id, quantity);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -518,43 +518,43 @@ int16 Inventory::HasItem(uint32 item_id, uint8 quantity, uint8 where)
|
|||||||
//this function has the same quantity flaw mentioned above in HasItem()
|
//this function has the same quantity flaw mentioned above in HasItem()
|
||||||
int16 Inventory::HasItemByUse(uint8 use, uint8 quantity, uint8 where)
|
int16 Inventory::HasItemByUse(uint8 use, uint8 quantity, uint8 where)
|
||||||
{
|
{
|
||||||
int16 slot_id = SLOT_INVALID;
|
int16 slot_id = INVALID_INDEX;
|
||||||
|
|
||||||
// Check each inventory bucket
|
// Check each inventory bucket
|
||||||
if (where & invWhereWorn) {
|
if (where & invWhereWorn) {
|
||||||
slot_id = _HasItemByUse(m_worn, use, quantity);
|
slot_id = _HasItemByUse(m_worn, use, quantity);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (where & invWherePersonal) {
|
if (where & invWherePersonal) {
|
||||||
slot_id = _HasItemByUse(m_inv, use, quantity);
|
slot_id = _HasItemByUse(m_inv, use, quantity);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (where & invWhereBank) {
|
if (where & invWhereBank) {
|
||||||
slot_id = _HasItemByUse(m_bank, use, quantity);
|
slot_id = _HasItemByUse(m_bank, use, quantity);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (where & invWhereSharedBank) {
|
if (where & invWhereSharedBank) {
|
||||||
slot_id = _HasItemByUse(m_shbank, use, quantity);
|
slot_id = _HasItemByUse(m_shbank, use, quantity);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (where & invWhereTrading) {
|
if (where & invWhereTrading) {
|
||||||
slot_id = _HasItemByUse(m_trade, use, quantity);
|
slot_id = _HasItemByUse(m_trade, use, quantity);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (where & invWhereCursor) {
|
if (where & invWhereCursor) {
|
||||||
// Check cursor queue
|
// Check cursor queue
|
||||||
slot_id = _HasItemByUse(m_cursor, use, quantity);
|
slot_id = _HasItemByUse(m_cursor, use, quantity);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -563,43 +563,43 @@ int16 Inventory::HasItemByUse(uint8 use, uint8 quantity, uint8 where)
|
|||||||
|
|
||||||
int16 Inventory::HasItemByLoreGroup(uint32 loregroup, uint8 where)
|
int16 Inventory::HasItemByLoreGroup(uint32 loregroup, uint8 where)
|
||||||
{
|
{
|
||||||
int16 slot_id = SLOT_INVALID;
|
int16 slot_id = INVALID_INDEX;
|
||||||
|
|
||||||
// Check each inventory bucket
|
// Check each inventory bucket
|
||||||
if (where & invWhereWorn) {
|
if (where & invWhereWorn) {
|
||||||
slot_id = _HasItemByLoreGroup(m_worn, loregroup);
|
slot_id = _HasItemByLoreGroup(m_worn, loregroup);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (where & invWherePersonal) {
|
if (where & invWherePersonal) {
|
||||||
slot_id = _HasItemByLoreGroup(m_inv, loregroup);
|
slot_id = _HasItemByLoreGroup(m_inv, loregroup);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (where & invWhereBank) {
|
if (where & invWhereBank) {
|
||||||
slot_id = _HasItemByLoreGroup(m_bank, loregroup);
|
slot_id = _HasItemByLoreGroup(m_bank, loregroup);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (where & invWhereSharedBank) {
|
if (where & invWhereSharedBank) {
|
||||||
slot_id = _HasItemByLoreGroup(m_shbank, loregroup);
|
slot_id = _HasItemByLoreGroup(m_shbank, loregroup);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (where & invWhereTrading) {
|
if (where & invWhereTrading) {
|
||||||
slot_id = _HasItemByLoreGroup(m_trade, loregroup);
|
slot_id = _HasItemByLoreGroup(m_trade, loregroup);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (where & invWhereCursor) {
|
if (where & invWhereCursor) {
|
||||||
// Check cursor queue
|
// Check cursor queue
|
||||||
slot_id = _HasItemByLoreGroup(m_cursor, loregroup);
|
slot_id = _HasItemByLoreGroup(m_cursor, loregroup);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -644,21 +644,21 @@ int16 Inventory::FindFreeSlot(bool for_bag, bool try_cursor, uint8 min_size, boo
|
|||||||
if (try_cursor)
|
if (try_cursor)
|
||||||
// Always room on cursor (it's a queue)
|
// Always room on cursor (it's a queue)
|
||||||
// (we may wish to cap this in the future)
|
// (we may wish to cap this in the future)
|
||||||
return SLOT_CURSOR;
|
return MainCursor;
|
||||||
|
|
||||||
// No available slots
|
// No available slots
|
||||||
return SLOT_INVALID;
|
return INVALID_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opposite of below: Get parent bag slot_id from a slot inside of bag
|
// Opposite of below: Get parent bag slot_id from a slot inside of bag
|
||||||
int16 Inventory::CalcSlotId(int16 slot_id)
|
int16 Inventory::CalcSlotId(int16 slot_id)
|
||||||
{
|
{
|
||||||
int16 parent_slot_id = SLOT_INVALID;
|
int16 parent_slot_id = INVALID_INDEX;
|
||||||
|
|
||||||
if (slot_id >= 251 && slot_id <= 330)
|
if (slot_id >= 251 && slot_id <= 330)
|
||||||
parent_slot_id = IDX_INV + (slot_id - 251) / MAX_ITEMS_PER_BAG;
|
parent_slot_id = IDX_INV + (slot_id - 251) / MAX_ITEMS_PER_BAG;
|
||||||
else if (slot_id >= 331 && slot_id <= 340)
|
else if (slot_id >= 331 && slot_id <= 340)
|
||||||
parent_slot_id = SLOT_CURSOR;
|
parent_slot_id = MainCursor;
|
||||||
else if (slot_id >= 2000 && slot_id <= 2023)
|
else if (slot_id >= 2000 && slot_id <= 2023)
|
||||||
parent_slot_id = IDX_BANK + (slot_id - 2000) / MAX_ITEMS_PER_BAG;
|
parent_slot_id = IDX_BANK + (slot_id - 2000) / MAX_ITEMS_PER_BAG;
|
||||||
else if (slot_id >= 2031 && slot_id <= 2270)
|
else if (slot_id >= 2031 && slot_id <= 2270)
|
||||||
@ -675,12 +675,12 @@ int16 Inventory::CalcSlotId(int16 slot_id)
|
|||||||
int16 Inventory::CalcSlotId(int16 bagslot_id, uint8 bagidx)
|
int16 Inventory::CalcSlotId(int16 bagslot_id, uint8 bagidx)
|
||||||
{
|
{
|
||||||
if (!Inventory::SupportsContainers(bagslot_id)) {
|
if (!Inventory::SupportsContainers(bagslot_id)) {
|
||||||
return SLOT_INVALID;
|
return INVALID_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
int16 slot_id = SLOT_INVALID;
|
int16 slot_id = INVALID_INDEX;
|
||||||
|
|
||||||
if (bagslot_id == SLOT_CURSOR || bagslot_id == 8000) // Cursor
|
if (bagslot_id == MainCursor || bagslot_id == 8000) // Cursor
|
||||||
slot_id = IDX_CURSOR_BAG + bagidx;
|
slot_id = IDX_CURSOR_BAG + bagidx;
|
||||||
else if (bagslot_id >= 22 && bagslot_id <= 29) // Inventory slots
|
else if (bagslot_id >= 22 && bagslot_id <= 29) // Inventory slots
|
||||||
slot_id = IDX_INV_BAG + (bagslot_id - 22)*MAX_ITEMS_PER_BAG + bagidx;
|
slot_id = IDX_INV_BAG + (bagslot_id - 22)*MAX_ITEMS_PER_BAG + bagidx;
|
||||||
@ -721,25 +721,25 @@ int16 Inventory::CalcSlotFromMaterial(uint8 material)
|
|||||||
switch (material)
|
switch (material)
|
||||||
{
|
{
|
||||||
case MaterialHead:
|
case MaterialHead:
|
||||||
return SLOT_HEAD;
|
return MainHead;
|
||||||
case MaterialChest:
|
case MaterialChest:
|
||||||
return SLOT_CHEST;
|
return MainChest;
|
||||||
case MaterialArms:
|
case MaterialArms:
|
||||||
return SLOT_ARMS;
|
return MainArms;
|
||||||
case MaterialWrist:
|
case MaterialWrist:
|
||||||
return SLOT_BRACER01; // there's 2 bracers, only one bracer material
|
return MainWrist1; // there's 2 bracers, only one bracer material
|
||||||
case MaterialHands:
|
case MaterialHands:
|
||||||
return SLOT_HANDS;
|
return MainHands;
|
||||||
case MaterialLegs:
|
case MaterialLegs:
|
||||||
return SLOT_LEGS;
|
return MainLegs;
|
||||||
case MaterialFeet:
|
case MaterialFeet:
|
||||||
return SLOT_FEET;
|
return MainFeet;
|
||||||
case MaterialPrimary:
|
case MaterialPrimary:
|
||||||
return SLOT_PRIMARY;
|
return MainPrimary;
|
||||||
case MaterialSecondary:
|
case MaterialSecondary:
|
||||||
return SLOT_SECONDARY;
|
return MainSecondary;
|
||||||
default:
|
default:
|
||||||
return SLOT_INVALID;
|
return INVALID_INDEX;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -747,24 +747,24 @@ uint8 Inventory::CalcMaterialFromSlot(int16 equipslot)
|
|||||||
{
|
{
|
||||||
switch (equipslot)
|
switch (equipslot)
|
||||||
{
|
{
|
||||||
case SLOT_HEAD:
|
case MainHead:
|
||||||
return MaterialHead;
|
return MaterialHead;
|
||||||
case SLOT_CHEST:
|
case MainChest:
|
||||||
return MaterialChest;
|
return MaterialChest;
|
||||||
case SLOT_ARMS:
|
case MainArms:
|
||||||
return MaterialArms;
|
return MaterialArms;
|
||||||
case SLOT_BRACER01:
|
case MainWrist1:
|
||||||
case SLOT_BRACER02:
|
//case SLOT_BRACER02: // non-live behavior
|
||||||
return MaterialWrist;
|
return MaterialWrist;
|
||||||
case SLOT_HANDS:
|
case MainHands:
|
||||||
return MaterialHands;
|
return MaterialHands;
|
||||||
case SLOT_LEGS:
|
case MainLegs:
|
||||||
return MaterialLegs;
|
return MaterialLegs;
|
||||||
case SLOT_FEET:
|
case MainFeet:
|
||||||
return MaterialFeet;
|
return MaterialFeet;
|
||||||
case SLOT_PRIMARY:
|
case MainPrimary:
|
||||||
return MaterialPrimary;
|
return MaterialPrimary;
|
||||||
case SLOT_SECONDARY:
|
case MainSecondary:
|
||||||
return MaterialSecondary;
|
return MaterialSecondary;
|
||||||
default:
|
default:
|
||||||
return _MaterialInvalid;
|
return _MaterialInvalid;
|
||||||
@ -790,7 +790,7 @@ bool Inventory::SupportsContainers(int16 slot_id)
|
|||||||
if ((slot_id >= 22 && slot_id <= 30) || // Personal inventory slots
|
if ((slot_id >= 22 && slot_id <= 30) || // Personal inventory slots
|
||||||
(slot_id >= 2000 && slot_id <= 2023) || // Bank slots
|
(slot_id >= 2000 && slot_id <= 2023) || // Bank slots
|
||||||
(slot_id >= 2500 && slot_id <= 2501) || // Shared bank slots
|
(slot_id >= 2500 && slot_id <= 2501) || // Shared bank slots
|
||||||
(slot_id == SLOT_CURSOR) || // Cursor
|
(slot_id == MainCursor) || // Cursor
|
||||||
(slot_id >= 3000 && slot_id <= 3007)) // Trade window
|
(slot_id >= 3000 && slot_id <= 3007)) // Trade window
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
@ -826,7 +826,7 @@ int Inventory::GetSlotByItemInst(ItemInst *inst) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (m_cursor.peek_front() == inst) {
|
if (m_cursor.peek_front() == inst) {
|
||||||
return SLOT_CURSOR;
|
return MainCursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
@ -944,9 +944,9 @@ int16 Inventory::_PutItem(int16 slot_id, ItemInst* inst)
|
|||||||
return slot_id;
|
return slot_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
int16 result = SLOT_INVALID;
|
int16 result = INVALID_INDEX;
|
||||||
|
|
||||||
if (slot_id == SLOT_CURSOR) { // Cursor
|
if (slot_id == MainCursor) { // Cursor
|
||||||
// Replace current item on cursor, if exists
|
// Replace current item on cursor, if exists
|
||||||
m_cursor.pop(); // no memory delete, clients of this function know what they are doing
|
m_cursor.pop(); // no memory delete, clients of this function know what they are doing
|
||||||
m_cursor.push_front(inst);
|
m_cursor.push_front(inst);
|
||||||
@ -981,7 +981,7 @@ int16 Inventory::_PutItem(int16 slot_id, ItemInst* inst)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result == SLOT_INVALID) {
|
if (result == INVALID_INDEX) {
|
||||||
LogFile->write(EQEMuLog::Error, "Inventory::_PutItem: Invalid slot_id specified (%i)", slot_id);
|
LogFile->write(EQEMuLog::Error, "Inventory::_PutItem: Invalid slot_id specified (%i)", slot_id);
|
||||||
Inventory::MarkDirty(inst); // Slot not found, clean up
|
Inventory::MarkDirty(inst); // Slot not found, clean up
|
||||||
}
|
}
|
||||||
@ -1007,7 +1007,7 @@ int16 Inventory::_HasItem(std::map<int16, ItemInst*>& bucket, uint32 item_id, ui
|
|||||||
return it->first;
|
return it->first;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < MAX_AUGMENT_SLOTS; i++) {
|
for (int i = 0; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
|
||||||
if (inst->GetAugmentItemID(i) == item_id && quantity <= 1)
|
if (inst->GetAugmentItemID(i) == item_id && quantity <= 1)
|
||||||
return SLOT_AUGMENT; // Only one augment per slot.
|
return SLOT_AUGMENT; // Only one augment per slot.
|
||||||
}
|
}
|
||||||
@ -1022,7 +1022,7 @@ int16 Inventory::_HasItem(std::map<int16, ItemInst*>& bucket, uint32 item_id, ui
|
|||||||
if (quantity_found >= quantity)
|
if (quantity_found >= quantity)
|
||||||
return Inventory::CalcSlotId(it->first, itb->first);
|
return Inventory::CalcSlotId(it->first, itb->first);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < MAX_AUGMENT_SLOTS; i++) {
|
for (int i = 0; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
|
||||||
if (baginst->GetAugmentItemID(i) == item_id && quantity <= 1)
|
if (baginst->GetAugmentItemID(i) == item_id && quantity <= 1)
|
||||||
return SLOT_AUGMENT; // Only one augment per slot.
|
return SLOT_AUGMENT; // Only one augment per slot.
|
||||||
}
|
}
|
||||||
@ -1031,7 +1031,7 @@ int16 Inventory::_HasItem(std::map<int16, ItemInst*>& bucket, uint32 item_id, ui
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Not found
|
// Not found
|
||||||
return SLOT_INVALID;
|
return INVALID_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Internal Method: Checks an inventory queue type bucket for a particular item
|
// Internal Method: Checks an inventory queue type bucket for a particular item
|
||||||
@ -1049,9 +1049,9 @@ int16 Inventory::_HasItem(ItemInstQueue& iqueue, uint32 item_id, uint8 quantity)
|
|||||||
if (inst->GetID() == item_id) {
|
if (inst->GetID() == item_id) {
|
||||||
quantity_found += (inst->GetCharges() <= 0) ? 1 : inst->GetCharges();
|
quantity_found += (inst->GetCharges() <= 0) ? 1 : inst->GetCharges();
|
||||||
if (quantity_found >= quantity)
|
if (quantity_found >= quantity)
|
||||||
return SLOT_CURSOR;
|
return MainCursor;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < MAX_AUGMENT_SLOTS; i++) {
|
for (int i = 0; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
|
||||||
if (inst->GetAugmentItemID(i) == item_id && quantity <= 1)
|
if (inst->GetAugmentItemID(i) == item_id && quantity <= 1)
|
||||||
return SLOT_AUGMENT; // Only one augment per slot.
|
return SLOT_AUGMENT; // Only one augment per slot.
|
||||||
}
|
}
|
||||||
@ -1064,9 +1064,9 @@ int16 Inventory::_HasItem(ItemInstQueue& iqueue, uint32 item_id, uint8 quantity)
|
|||||||
if (baginst->GetID() == item_id) {
|
if (baginst->GetID() == item_id) {
|
||||||
quantity_found += (baginst->GetCharges() <= 0) ? 1 : baginst->GetCharges();
|
quantity_found += (baginst->GetCharges() <= 0) ? 1 : baginst->GetCharges();
|
||||||
if (quantity_found >= quantity)
|
if (quantity_found >= quantity)
|
||||||
return Inventory::CalcSlotId(SLOT_CURSOR, itb->first);
|
return Inventory::CalcSlotId(MainCursor, itb->first);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < MAX_AUGMENT_SLOTS; i++) {
|
for (int i = 0; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
|
||||||
if (baginst->GetAugmentItemID(i) == item_id && quantity <= 1)
|
if (baginst->GetAugmentItemID(i) == item_id && quantity <= 1)
|
||||||
return SLOT_AUGMENT; // Only one augment per slot.
|
return SLOT_AUGMENT; // Only one augment per slot.
|
||||||
}
|
}
|
||||||
@ -1076,7 +1076,7 @@ int16 Inventory::_HasItem(ItemInstQueue& iqueue, uint32 item_id, uint8 quantity)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Not found
|
// Not found
|
||||||
return SLOT_INVALID;
|
return INVALID_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Internal Method: Checks an inventory bucket for a particular item
|
// Internal Method: Checks an inventory bucket for a particular item
|
||||||
@ -1111,7 +1111,7 @@ int16 Inventory::_HasItemByUse(std::map<int16, ItemInst*>& bucket, uint8 use, ui
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Not found
|
// Not found
|
||||||
return SLOT_INVALID;
|
return INVALID_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Internal Method: Checks an inventory queue type bucket for a particular item
|
// Internal Method: Checks an inventory queue type bucket for a particular item
|
||||||
@ -1127,7 +1127,7 @@ int16 Inventory::_HasItemByUse(ItemInstQueue& iqueue, uint8 use, uint8 quantity)
|
|||||||
if (inst && inst->IsType(ItemClassCommon) && inst->GetItem()->ItemType == use) {
|
if (inst && inst->IsType(ItemClassCommon) && inst->GetItem()->ItemType == use) {
|
||||||
quantity_found += (inst->GetCharges() <= 0) ? 1 : inst->GetCharges();
|
quantity_found += (inst->GetCharges() <= 0) ? 1 : inst->GetCharges();
|
||||||
if (quantity_found >= quantity)
|
if (quantity_found >= quantity)
|
||||||
return SLOT_CURSOR;
|
return MainCursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Go through bag, if bag
|
// Go through bag, if bag
|
||||||
@ -1138,14 +1138,14 @@ int16 Inventory::_HasItemByUse(ItemInstQueue& iqueue, uint8 use, uint8 quantity)
|
|||||||
if (baginst && baginst->IsType(ItemClassCommon) && baginst->GetItem()->ItemType == use) {
|
if (baginst && baginst->IsType(ItemClassCommon) && baginst->GetItem()->ItemType == use) {
|
||||||
quantity_found += (baginst->GetCharges() <= 0) ? 1 : baginst->GetCharges();
|
quantity_found += (baginst->GetCharges() <= 0) ? 1 : baginst->GetCharges();
|
||||||
if (quantity_found >= quantity)
|
if (quantity_found >= quantity)
|
||||||
return Inventory::CalcSlotId(SLOT_CURSOR, itb->first);
|
return Inventory::CalcSlotId(MainCursor, itb->first);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Not found
|
// Not found
|
||||||
return SLOT_INVALID;
|
return INVALID_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
int16 Inventory::_HasItemByLoreGroup(std::map<int16, ItemInst*>& bucket, uint32 loregroup)
|
int16 Inventory::_HasItemByLoreGroup(std::map<int16, ItemInst*>& bucket, uint32 loregroup)
|
||||||
@ -1162,7 +1162,7 @@ int16 Inventory::_HasItemByLoreGroup(std::map<int16, ItemInst*>& bucket, uint32
|
|||||||
return it->first;
|
return it->first;
|
||||||
|
|
||||||
ItemInst* Aug;
|
ItemInst* Aug;
|
||||||
for (int i = 0; i < MAX_AUGMENT_SLOTS; i++) {
|
for (int i = 0; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
|
||||||
Aug = inst->GetAugment(i);
|
Aug = inst->GetAugment(i);
|
||||||
if (Aug && Aug->GetItem()->LoreGroup == loregroup)
|
if (Aug && Aug->GetItem()->LoreGroup == loregroup)
|
||||||
return SLOT_AUGMENT; // Only one augment per slot.
|
return SLOT_AUGMENT; // Only one augment per slot.
|
||||||
@ -1177,7 +1177,7 @@ int16 Inventory::_HasItemByLoreGroup(std::map<int16, ItemInst*>& bucket, uint32
|
|||||||
return Inventory::CalcSlotId(it->first, itb->first);
|
return Inventory::CalcSlotId(it->first, itb->first);
|
||||||
|
|
||||||
ItemInst* Aug2;
|
ItemInst* Aug2;
|
||||||
for (int i = 0; i < MAX_AUGMENT_SLOTS; i++) {
|
for (int i = 0; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
|
||||||
Aug2 = baginst->GetAugment(i);
|
Aug2 = baginst->GetAugment(i);
|
||||||
if (Aug2 && Aug2->GetItem()->LoreGroup == loregroup)
|
if (Aug2 && Aug2->GetItem()->LoreGroup == loregroup)
|
||||||
return SLOT_AUGMENT; // Only one augment per slot.
|
return SLOT_AUGMENT; // Only one augment per slot.
|
||||||
@ -1187,7 +1187,7 @@ int16 Inventory::_HasItemByLoreGroup(std::map<int16, ItemInst*>& bucket, uint32
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Not found
|
// Not found
|
||||||
return SLOT_INVALID;
|
return INVALID_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Internal Method: Checks an inventory queue type bucket for a particular item
|
// Internal Method: Checks an inventory queue type bucket for a particular item
|
||||||
@ -1202,10 +1202,10 @@ int16 Inventory::_HasItemByLoreGroup(ItemInstQueue& iqueue, uint32 loregroup)
|
|||||||
if (inst)
|
if (inst)
|
||||||
{
|
{
|
||||||
if (inst->GetItem()->LoreGroup == loregroup)
|
if (inst->GetItem()->LoreGroup == loregroup)
|
||||||
return SLOT_CURSOR;
|
return MainCursor;
|
||||||
|
|
||||||
ItemInst* Aug;
|
ItemInst* Aug;
|
||||||
for (int i = 0; i < MAX_AUGMENT_SLOTS; i++) {
|
for (int i = 0; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
|
||||||
Aug = inst->GetAugment(i);
|
Aug = inst->GetAugment(i);
|
||||||
if (Aug && Aug->GetItem()->LoreGroup == loregroup)
|
if (Aug && Aug->GetItem()->LoreGroup == loregroup)
|
||||||
return SLOT_AUGMENT; // Only one augment per slot.
|
return SLOT_AUGMENT; // Only one augment per slot.
|
||||||
@ -1217,11 +1217,11 @@ int16 Inventory::_HasItemByLoreGroup(ItemInstQueue& iqueue, uint32 loregroup)
|
|||||||
for (itb = inst->_begin(); itb != inst->_end(); ++itb) {
|
for (itb = inst->_begin(); itb != inst->_end(); ++itb) {
|
||||||
ItemInst* baginst = itb->second;
|
ItemInst* baginst = itb->second;
|
||||||
if (baginst && baginst->IsType(ItemClassCommon) && baginst->GetItem()->LoreGroup == loregroup)
|
if (baginst && baginst->IsType(ItemClassCommon) && baginst->GetItem()->LoreGroup == loregroup)
|
||||||
return Inventory::CalcSlotId(SLOT_CURSOR, itb->first);
|
return Inventory::CalcSlotId(MainCursor, itb->first);
|
||||||
|
|
||||||
|
|
||||||
ItemInst* Aug2;
|
ItemInst* Aug2;
|
||||||
for (int i = 0; i < MAX_AUGMENT_SLOTS; i++) {
|
for (int i = 0; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
|
||||||
Aug2 = baginst->GetAugment(i);
|
Aug2 = baginst->GetAugment(i);
|
||||||
if (Aug2 && Aug2->GetItem()->LoreGroup == loregroup)
|
if (Aug2 && Aug2->GetItem()->LoreGroup == loregroup)
|
||||||
return SLOT_AUGMENT; // Only one augment per slot.
|
return SLOT_AUGMENT; // Only one augment per slot.
|
||||||
@ -1232,7 +1232,7 @@ int16 Inventory::_HasItemByLoreGroup(ItemInstQueue& iqueue, uint32 loregroup)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Not found
|
// Not found
|
||||||
return SLOT_INVALID;
|
return INVALID_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1656,7 +1656,7 @@ ItemInst* ItemInst::RemoveAugment(uint8 index)
|
|||||||
|
|
||||||
bool ItemInst::IsAugmented()
|
bool ItemInst::IsAugmented()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAX_AUGMENT_SLOTS; ++i)
|
for (int i = 0; i < EmuConstants::ITEM_COMMON_SIZE; ++i)
|
||||||
if (GetAugmentItemID(i))
|
if (GetAugmentItemID(i))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|||||||
@ -7,8 +7,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <mysql.h>
|
#include <mysql.h>
|
||||||
#include "../common/types.h"
|
#include "types.h"
|
||||||
#include "../common/MySQLRequestRow.h"
|
#include "MySQLRequestRow.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
#include <mysql.h>
|
#include <mysql.h>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include "../common/types.h"
|
#include "types.h"
|
||||||
|
|
||||||
class MySQLRequestRow : public std::iterator<std::input_iterator_tag, MYSQL_ROW>
|
class MySQLRequestRow : public std::iterator<std::input_iterator_tag, MYSQL_ROW>
|
||||||
{
|
{
|
||||||
|
|||||||
@ -7,21 +7,41 @@ static const uint32 BIT_SoF = 4;
|
|||||||
static const uint32 BIT_SoD = 8;
|
static const uint32 BIT_SoD = 8;
|
||||||
static const uint32 BIT_Underfoot = 16;
|
static const uint32 BIT_Underfoot = 16;
|
||||||
static const uint32 BIT_RoF = 32;
|
static const uint32 BIT_RoF = 32;
|
||||||
static const uint32 BIT_TitaniumAndEarlier = 3;
|
static const uint32 BIT_RoF2 = 64;
|
||||||
|
|
||||||
|
static const uint32 BIT_TitaniumAndEarlier = 0x00000003;
|
||||||
static const uint32 BIT_SoFAndLater = 0xFFFFFFFC;
|
static const uint32 BIT_SoFAndLater = 0xFFFFFFFC;
|
||||||
static const uint32 BIT_SoDAndLater = 0xFFFFFFF8;
|
static const uint32 BIT_SoDAndLater = 0xFFFFFFF8;
|
||||||
static const uint32 BIT_UnderfootAndLater = 0xFFFFFFF0;
|
static const uint32 BIT_UnderfootAndLater = 0xFFFFFFF0;
|
||||||
static const uint32 BIT_RoFAndLater = 0xFFFFFFE0;
|
static const uint32 BIT_RoFAndLater = 0xFFFFFFE0;
|
||||||
|
static const uint32 BIT_RoF2AndLater = 0xFFFFFFC0;
|
||||||
static const uint32 BIT_AllClients = 0xFFFFFFFF;
|
static const uint32 BIT_AllClients = 0xFFFFFFFF;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
EQClientUnknown = 0,
|
EQClientUnknown = 0,
|
||||||
EQClient62,
|
EQClient62, // Build: 'Aug 4 2005 15:40:59'
|
||||||
EQClientTitanium,
|
EQClientTitanium, // Build: 'Oct 31 2005 10:33:37'
|
||||||
EQClientSoF,
|
EQClientSoF, // Build: 'Sep 7 2007 09:11:49'
|
||||||
EQClientSoD,
|
EQClientSoD, // Build: 'Dec 19 2008 15:22:49'
|
||||||
EQClientUnderfoot,
|
EQClientUnderfoot, // Build: 'Jun 8 2010 16:44:32'
|
||||||
EQClientRoF
|
EQClientRoF, // Build: 'Dec 10 2012 17:35:44'
|
||||||
|
EQClientRoF2, // Build: 'May 10 2013 23:30:08'
|
||||||
|
|
||||||
|
_EQClientCount, // place new clients before this point (preferably, in release/attribute order)
|
||||||
|
|
||||||
|
// Values below are not implemented, as yet...
|
||||||
|
|
||||||
|
// - RoF2 is added for convenience of implementor..creation client will need to be changed once that client is actually added
|
||||||
|
// - Code will be added to 'relieve' characters of any illegal inventory items based on their client version. This will
|
||||||
|
// oversee cheats and mis-placement of starting items whenever a client is loaded.
|
||||||
|
_EQCreationClient = EQClientRoF, // bump to latest client as new ones are added (make sure that db is updated accordingly)
|
||||||
|
|
||||||
|
EmuNPC = _EQClientCount,
|
||||||
|
EmuMerc,
|
||||||
|
EmuBot,
|
||||||
|
EmuPet,
|
||||||
|
|
||||||
|
_EmuClientCount // array size for EQLimits
|
||||||
} EQClientVersion;
|
} EQClientVersion;
|
||||||
|
|
||||||
#endif /* CLIENTVERSIONS_H */
|
#endif /* CLIENTVERSIONS_H */
|
||||||
|
|||||||
@ -138,45 +138,86 @@ enum ItemUseTypes : uint8
|
|||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Augmentation use types (in-work)
|
** Augmentation use type bitmasks (1-based)
|
||||||
**
|
**
|
||||||
** (ref: dbstr_us.txt)
|
** (ref: dbstr_us.txt)
|
||||||
**
|
**
|
||||||
*/
|
*/
|
||||||
enum AugmentationUseTypes : uint32 {
|
enum AugmentationUseTypeBitmasks : uint32 {
|
||||||
AugTypeNone = 0, // not 100% sure on this...
|
AugUseNone = 0x00000000,
|
||||||
AugTypeGeneralSingleStat, /*1^16^1 (General: Single Stat)^0*/
|
AugUseGeneralSingleStat = 0x00000001, /*1^16^1 (General: Single Stat)^0*/
|
||||||
AugTypeGeneralMultipleStat, /*2^16^2 (General: Multiple Stat)^0*/
|
AugUseGeneralMultipleStat = 0x00000002, /*2^16^2 (General: Multiple Stat)^0*/
|
||||||
AugTypeGeneralSpellEffect, /*3^16^3 (General: Spell Effect)^0*/
|
AugUseGeneralSpellEffect = 0x00000004, /*3^16^3 (General: Spell Effect)^0*/
|
||||||
AugTypeWeaponGeneral, /*4^16^4 (Weapon: General)^0*/
|
AugUseWeaponGeneral = 0x00000008, /*4^16^4 (Weapon: General)^0*/
|
||||||
AugTypeWeaponElemDamage, /*5^16^5 (Weapon: Elem Damage)^0*/
|
AugUseWeaponElemDamage = 0x00000010, /*5^16^5 (Weapon: Elem Damage)^0*/
|
||||||
AugTypeWeaponBaseDamage, /*6^16^6 (Weapon: Base Damage)^0*/
|
AugUseWeaponBaseDamage = 0x00000020, /*6^16^6 (Weapon: Base Damage)^0*/
|
||||||
AugTypeGeneralGroup, /*7^16^7 (General: Group)^0*/
|
AugUseGeneralGroup = 0x00000040, /*7^16^7 (General: Group)^0*/
|
||||||
AugTypeGeneralRaid, /*8^16^8 (General: Raid)^0*/
|
AugUseGeneralRaid = 0x00000080, /*8^16^8 (General: Raid)^0*/
|
||||||
AugTypeGeneralDragonsPoints, /*9^16^9 (General: Dragons Points)^0*/
|
AugUseGeneralDragonsPoints = 0x00000100, /*9^16^9 (General: Dragons Points)^0*/
|
||||||
AugTypeCraftedCommon, /*10^16^10 (Crafted: Common)^0*/
|
AugUseCraftedCommon = 0x00000200, /*10^16^10 (Crafted: Common)^0*/
|
||||||
AugTypeCraftedGroup1, /*11^16^11 (Crafted: Group)^0*/
|
AugUseCraftedGroup1 = 0x00000400, /*11^16^11 (Crafted: Group)^0*/
|
||||||
AugTypeCraftedRaid1, /*12^16^12 (Crafted: Raid)^0*/
|
AugUseCraftedRaid1 = 0x00000800, /*12^16^12 (Crafted: Raid)^0*/
|
||||||
AugTypeEnergeiacGroup, /*13^16^13 (Energeiac: Group)^0*/
|
AugUseEnergeiacGroup = 0x00001000, /*13^16^13 (Energeiac: Group)^0*/
|
||||||
AugTypeEnergeiacRaid, /*14^16^14 (Energeiac: Raid)^0*/
|
AugUseEnergeiacRaid = 0x00002000, /*14^16^14 (Energeiac: Raid)^0*/
|
||||||
AugTypeEmblem, /*15^16^15 (Emblem)^0*/
|
AugUseEmblem = 0x00004000, /*15^16^15 (Emblem)^0*/
|
||||||
AugTypeCraftedGroup2, /*16^16^16 (Crafted: Group)^0*/
|
AugUseCraftedGroup2 = 0x00008000, /*16^16^16 (Crafted: Group)^0*/
|
||||||
AugTypeCraftedRaid2, /*17^16^17 (Crafted: Raid)^0*/
|
AugUseCraftedRaid2 = 0x00010000, /*17^16^17 (Crafted: Raid)^0*/
|
||||||
AugTypeUnknown1, /*18^16^18^0*/
|
AugUseUnknown1 = 0x00020000, /*18^16^18^0*/
|
||||||
AugTypeUnknown2, /*19^16^19^0*/
|
AugUseUnknown2 = 0x00040000, /*19^16^19^0*/
|
||||||
AugTypeOrnamentation, /*20^16^20 (Ornamentation)^0*/
|
AugUseOrnamentation = 0x00080000, /*20^16^20 (Ornamentation)^0*/
|
||||||
AugTypeSpecialOrnamentation, /*21^16^21 (Special Ornamentation)^0*/
|
AugUseSpecialOrnamentation = 0x00100000, /*21^16^21 (Special Ornamentation)^0*/
|
||||||
AugTypeUnknown3, /*22^16^22^0*/
|
AugUseUnknown3 = 0x00200000, /*22^16^22^0*/
|
||||||
AugTypeUnknown4, /*23^16^23^0*/
|
AugUseUnknown4 = 0x00400000, /*23^16^23^0*/
|
||||||
AugTypeUnknown5, /*24^16^24^0*/
|
AugUseUnknown5 = 0x00800000, /*24^16^24^0*/
|
||||||
AugTypeUnknown6, /*25^16^25^0*/
|
AugUseUnknown6 = 0x01000000, /*25^16^25^0*/
|
||||||
AugTypeUnknown7, /*26^16^26^0*/
|
AugUseUnknown7 = 0x02000000, /*26^16^26^0*/
|
||||||
AugTypeUnknown8, /*27^16^27^0*/
|
AugUseUnknown8 = 0x04000000, /*27^16^27^0*/
|
||||||
AugTypeUnknown9, /*28^16^28^0*/
|
AugUseUnknown9 = 0x08000000, /*28^16^28^0*/
|
||||||
AugTypeUnknown10, /*29^16^29^0*/
|
AugUseUnknown10 = 0x10000000, /*29^16^29^0*/
|
||||||
AugTypeEpic25, /*30^16^30^0*/
|
AugUseEpic25 = 0x20000000, /*30^16^30^0*/
|
||||||
AugTypeTest, /*31^16^Test^0*/ // listed as 31^16^31^0 in 5-10 client
|
AugUseTest = 0x40000000, /*31^16^Test^0*/ // listed as 31^16^31^0 in 5-10 client
|
||||||
_AugTypeCount
|
AugUseAll = 0xFFFFFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Augmentation use types (enumerated)
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
enum AugmentationUseTypes : uint8 {
|
||||||
|
AugTypeNone = 0,
|
||||||
|
AugTypeGeneralSingleStat,
|
||||||
|
AugTypeGeneralMultipleStat,
|
||||||
|
AugTypeGeneralSpellEffect,
|
||||||
|
AugTypeWeaponGeneral,
|
||||||
|
AugTypeWeaponElemDamage,
|
||||||
|
AugTypeWeaponBaseDamage,
|
||||||
|
AugTypeGeneralGroup,
|
||||||
|
AugTypeGeneralRaid,
|
||||||
|
AugTypeGeneralDragonsPoints,
|
||||||
|
AugTypeCraftedCommon,
|
||||||
|
AugTypeCraftedGroup1,
|
||||||
|
AugTypeCraftedRaid1,
|
||||||
|
AugTypeEnergeiacGroup,
|
||||||
|
AugTypeEnergeiacRaid,
|
||||||
|
AugTypeEmblem,
|
||||||
|
AugTypeCraftedGroup2,
|
||||||
|
AugTypeCraftedRaid2,
|
||||||
|
AugTypeUnknown1,
|
||||||
|
AugTypeUnknown2,
|
||||||
|
AugTypeOrnamentation,
|
||||||
|
AugTypeSpecialOrnamentation,
|
||||||
|
AugTypeUnknown3,
|
||||||
|
AugTypeUnknown4,
|
||||||
|
AugTypeUnknown5,
|
||||||
|
AugTypeUnknown6,
|
||||||
|
AugTypeUnknown7,
|
||||||
|
AugTypeUnknown8,
|
||||||
|
AugTypeUnknown9,
|
||||||
|
AugTypeUnknown10,
|
||||||
|
AugTypeEpic25,
|
||||||
|
AugTypeTest,
|
||||||
|
_AugTypeCount,
|
||||||
|
AugTypeAll = 255
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -735,10 +776,11 @@ enum MaterialUseSlots : uint8
|
|||||||
_MaterialInvalid = 255
|
_MaterialInvalid = 255
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
// Used for worn NPC inventory tracking. NPCs don't use
|
// Used for worn NPC inventory tracking. NPCs don't use
|
||||||
// augments, so only the basic slots need to be kept track of.
|
// augments, so only the basic slots need to be kept track of.
|
||||||
#define MAX_WORN_INVENTORY 22
|
#define MAX_WORN_INVENTORY 22
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Inventory Slot Equipment Enum
|
** Inventory Slot Equipment Enum
|
||||||
@ -768,42 +810,109 @@ enum MaterialUseSlots : uint8
|
|||||||
**
|
**
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
enum InventoryMapTypes : int16 {
|
||||||
|
MapPossessions = 0,
|
||||||
|
MapBank,
|
||||||
|
MapSharedBank,
|
||||||
|
MapTrade,
|
||||||
|
MapWorld,
|
||||||
|
MapLimbo,
|
||||||
|
MapTribute,
|
||||||
|
MapTrophyTribute,
|
||||||
|
MapGuildTribute,
|
||||||
|
MapMerchant,
|
||||||
|
MapDeleted,
|
||||||
|
MapCorpse,
|
||||||
|
MapBazaar,
|
||||||
|
MapInspect,
|
||||||
|
MapRealEstate,
|
||||||
|
MapViewMODPC,
|
||||||
|
MapViewMODBank,
|
||||||
|
MapViewMODSharedBank,
|
||||||
|
MapViewMODLimbo,
|
||||||
|
MapAltStorage,
|
||||||
|
MapArchived,
|
||||||
|
MapMail,
|
||||||
|
MapGuildTrophyTribute,
|
||||||
|
MapKrono,
|
||||||
|
MapOther,
|
||||||
|
_MapCount
|
||||||
|
};
|
||||||
|
|
||||||
|
enum InventoryMainTypes : int16 {
|
||||||
|
MainCharm = 0,
|
||||||
|
MainEar1,
|
||||||
|
MainHead,
|
||||||
|
MainFace,
|
||||||
|
MainEar2,
|
||||||
|
MainNeck,
|
||||||
|
MainShoulders,
|
||||||
|
MainArms,
|
||||||
|
MainBack,
|
||||||
|
MainWrist1,
|
||||||
|
MainWrist2,
|
||||||
|
MainRange,
|
||||||
|
MainHands,
|
||||||
|
MainPrimary,
|
||||||
|
MainSecondary,
|
||||||
|
MainFinger1,
|
||||||
|
MainFinger2,
|
||||||
|
MainChest,
|
||||||
|
MainLegs,
|
||||||
|
MainFeet,
|
||||||
|
MainWaist,
|
||||||
|
MainPowerSource = 9999, // temp
|
||||||
|
MainAmmo = 21, // temp
|
||||||
|
MainGeneral1,
|
||||||
|
MainGeneral2,
|
||||||
|
MainGeneral3,
|
||||||
|
MainGeneral4,
|
||||||
|
MainGeneral5,
|
||||||
|
MainGeneral6,
|
||||||
|
MainGeneral7,
|
||||||
|
MainGeneral8,
|
||||||
|
//MainGeneral9,
|
||||||
|
//MainGeneral10,
|
||||||
|
MainCursor //,
|
||||||
|
//_MainCount,
|
||||||
|
};
|
||||||
|
|
||||||
enum InventorySlot
|
enum InventorySlot
|
||||||
{
|
{
|
||||||
////////////////////////
|
////////////////////////
|
||||||
// Equip slots
|
// Equip slots
|
||||||
////////////////////////
|
////////////////////////
|
||||||
|
|
||||||
SLOT_CHARM = 0,
|
//SLOT_CHARM = 0,
|
||||||
SLOT_EAR01 = 1,
|
//SLOT_EAR01 = 1,
|
||||||
SLOT_HEAD = 2,
|
//SLOT_HEAD = 2,
|
||||||
SLOT_FACE = 3,
|
//SLOT_FACE = 3,
|
||||||
SLOT_EAR02 = 4,
|
//SLOT_EAR02 = 4,
|
||||||
SLOT_NECK = 5,
|
//SLOT_NECK = 5,
|
||||||
SLOT_SHOULDER = 6,
|
//SLOT_SHOULDER = 6,
|
||||||
SLOT_ARMS = 7,
|
//SLOT_ARMS = 7,
|
||||||
SLOT_BACK = 8,
|
//SLOT_BACK = 8,
|
||||||
SLOT_BRACER01 = 9,
|
//SLOT_BRACER01 = 9,
|
||||||
SLOT_BRACER02 = 10,
|
//SLOT_BRACER02 = 10,
|
||||||
SLOT_RANGE = 11,
|
//SLOT_RANGE = 11,
|
||||||
SLOT_HANDS = 12,
|
//SLOT_HANDS = 12,
|
||||||
SLOT_PRIMARY = 13,
|
//SLOT_PRIMARY = 13,
|
||||||
SLOT_SECONDARY = 14,
|
//SLOT_SECONDARY = 14,
|
||||||
SLOT_RING01 = 15,
|
//SLOT_RING01 = 15,
|
||||||
SLOT_RING02 = 16,
|
//SLOT_RING02 = 16,
|
||||||
SLOT_CHEST = 17,
|
//SLOT_CHEST = 17,
|
||||||
SLOT_LEGS = 18,
|
//SLOT_LEGS = 18,
|
||||||
SLOT_FEET = 19,
|
//SLOT_FEET = 19,
|
||||||
SLOT_WAIST = 20,
|
//SLOT_WAIST = 20,
|
||||||
SLOT_AMMO = 21,
|
//SLOT_AMMO = 21,
|
||||||
|
|
||||||
////////////////////////
|
////////////////////////
|
||||||
// All other slots
|
// All other slots
|
||||||
////////////////////////
|
////////////////////////
|
||||||
SLOT_PERSONAL_BEGIN = 22,
|
//SLOT_PERSONAL_BEGIN = 22,
|
||||||
SLOT_PERSONAL_END = 29,
|
//SLOT_PERSONAL_END = 29,
|
||||||
|
|
||||||
SLOT_CURSOR = 30,
|
//SLOT_CURSOR = 30,
|
||||||
|
|
||||||
SLOT_CURSOR_END = (int16)0xFFFE, // Last item on cursor queue
|
SLOT_CURSOR_END = (int16)0xFFFE, // Last item on cursor queue
|
||||||
// Cursor bag slots are 331->340 (10 slots)
|
// Cursor bag slots are 331->340 (10 slots)
|
||||||
@ -830,11 +939,15 @@ enum InventorySlot
|
|||||||
|
|
||||||
// Slot used in OP_TradeSkillCombine for world tradeskill containers
|
// Slot used in OP_TradeSkillCombine for world tradeskill containers
|
||||||
SLOT_TRADESKILL = 1000,
|
SLOT_TRADESKILL = 1000,
|
||||||
SLOT_AUGMENT = 1001,
|
SLOT_AUGMENT = 1001//,
|
||||||
SLOT_POWER_SOURCE = 9999,
|
//SLOT_POWER_SOURCE = 9999//,
|
||||||
// Value recognized by client for destroying an item
|
// Value recognized by client for destroying an item
|
||||||
SLOT_INVALID = (int16)0xFFFF
|
//SLOT_INVALID = (int16)0xFFFF
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define INVALID_INDEX -1
|
||||||
|
#define NOT_USED 0
|
||||||
|
#define NO_ITEM 0
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
363
common/eq_dictionary.cpp
Normal file
363
common/eq_dictionary.cpp
Normal file
@ -0,0 +1,363 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
Copyright (C) 2001-2003 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "eq_dictionary.h"
|
||||||
|
|
||||||
|
//
|
||||||
|
// class ServerConstants
|
||||||
|
//
|
||||||
|
uint16 EmuConstants::InventoryMapSize(int16 map) {
|
||||||
|
switch (map) {
|
||||||
|
case MapPossessions:
|
||||||
|
return MAP_POSSESSIONS_SIZE;
|
||||||
|
case MapBank:
|
||||||
|
return MAP_BANK_SIZE;
|
||||||
|
case MapSharedBank:
|
||||||
|
return MAP_SHAREDBANK_SIZE;
|
||||||
|
case MapTrade:
|
||||||
|
return MAP_TRADE_SIZE;
|
||||||
|
case MapWorld:
|
||||||
|
return MAP_WORLD_SIZE;
|
||||||
|
case MapLimbo:
|
||||||
|
return MAP_LIMBO_SIZE;
|
||||||
|
case MapTribute:
|
||||||
|
return MAP_TRIBUTE_SIZE;
|
||||||
|
case MapTrophyTribute:
|
||||||
|
return MAP_TROPHYTRIBUTE_SIZE;
|
||||||
|
case MapGuildTribute:
|
||||||
|
return MAP_GUILDTRIBUTE_SIZE;
|
||||||
|
case MapMerchant:
|
||||||
|
return MAP_MERCHANT_SIZE;
|
||||||
|
case MapDeleted:
|
||||||
|
return MAP_DELETED_SIZE;
|
||||||
|
case MapCorpse:
|
||||||
|
return MAP_CORPSE_SIZE;
|
||||||
|
case MapBazaar:
|
||||||
|
return MAP_BAZAAR_SIZE;
|
||||||
|
case MapInspect:
|
||||||
|
return MAP_INSPECT_SIZE;
|
||||||
|
case MapRealEstate:
|
||||||
|
return MAP_REALESTATE_SIZE;
|
||||||
|
case MapViewMODPC:
|
||||||
|
return MAP_VIEWMODPC_SIZE;
|
||||||
|
case MapViewMODBank:
|
||||||
|
return MAP_VIEWMODBANK_SIZE;
|
||||||
|
case MapViewMODSharedBank:
|
||||||
|
return MAP_VIEWMODSHAREDBANK_SIZE;
|
||||||
|
case MapViewMODLimbo:
|
||||||
|
return MAP_VIEWMODLIMBO_SIZE;
|
||||||
|
case MapAltStorage:
|
||||||
|
return MAP_ALTSTORAGE_SIZE;
|
||||||
|
case MapArchived:
|
||||||
|
return MAP_ARCHIVED_SIZE;
|
||||||
|
case MapMail:
|
||||||
|
return MAP_MAIL_SIZE;
|
||||||
|
case MapGuildTrophyTribute:
|
||||||
|
return MAP_GUILDTROPHYTRIBUTE_SIZE;
|
||||||
|
case MapKrono:
|
||||||
|
return MAP_KRONO_SIZE;
|
||||||
|
case MapOther:
|
||||||
|
return MAP_OTHER_SIZE;
|
||||||
|
default:
|
||||||
|
return NOT_USED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// class ClientLimits
|
||||||
|
//
|
||||||
|
// client validation
|
||||||
|
bool EQLimits::IsValidClientVersion(uint32 version) {
|
||||||
|
if (version < _EQClientCount)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 EQLimits::ValidateClientVersion(uint32 version) {
|
||||||
|
if (version < _EQClientCount)
|
||||||
|
return version;
|
||||||
|
|
||||||
|
return EQClientUnknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQClientVersion EQLimits::ValidateClientVersion(EQClientVersion version) {
|
||||||
|
if (version >= EQClientUnknown)
|
||||||
|
if (version < _EQClientCount)
|
||||||
|
return version;
|
||||||
|
|
||||||
|
return EQClientUnknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
// npc validation
|
||||||
|
bool EQLimits::IsValidNPCVersion(uint32 version) {
|
||||||
|
if (version >= _EQClientCount)
|
||||||
|
if (version < _EmuClientCount)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 EQLimits::ValidateNPCVersion(uint32 version) {
|
||||||
|
if (version >= _EQClientCount)
|
||||||
|
if (version < _EmuClientCount)
|
||||||
|
return version;
|
||||||
|
|
||||||
|
return EQClientUnknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQClientVersion EQLimits::ValidateNPCVersion(EQClientVersion version) {
|
||||||
|
if (version >= _EQClientCount)
|
||||||
|
if (version < _EmuClientCount)
|
||||||
|
return version;
|
||||||
|
|
||||||
|
return EQClientUnknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
// mob validation
|
||||||
|
bool EQLimits::IsValidMobVersion(uint32 version) {
|
||||||
|
if (version < _EmuClientCount)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 EQLimits::ValidateMobVersion(uint32 version) {
|
||||||
|
if (version < _EmuClientCount)
|
||||||
|
return version;
|
||||||
|
|
||||||
|
return EQClientUnknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQClientVersion EQLimits::ValidateMobVersion(EQClientVersion version) {
|
||||||
|
if (version >= EQClientUnknown)
|
||||||
|
if (version < _EmuClientCount)
|
||||||
|
return version;
|
||||||
|
|
||||||
|
return EQClientUnknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
// inventory
|
||||||
|
uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
|
||||||
|
// not all maps will have an instantiated container..some are references for queue generators (i.e., bazaar, mail, etc...)
|
||||||
|
// a zero '0' indicates a needed value..otherwise, change to '_NOTUSED' for a null value so indices requiring research can be identified
|
||||||
|
// ALL of these values need to be verified before pushing to live
|
||||||
|
//
|
||||||
|
// make sure that you transcribe the actual value from 'defaults' to here before updating or client crashes will ensue..and/or...
|
||||||
|
// insert older clients inside of the progression of client order
|
||||||
|
|
||||||
|
static const uint16 local[_MapCount][_EmuClientCount] = {
|
||||||
|
/* { Unknown, 62, Titanium, SoF, SoD, Underfoot, RoF, RoF2, NPC, Merc, Bot, Pet }*/
|
||||||
|
{ NOT_USED, 34, 34, 34, 34, 34, EmuConstants::MAP_POSSESSIONS_SIZE, 0, 0, 0, 0, 0 }, // (requires bitmask use...)
|
||||||
|
{ NOT_USED, 16, 16, 24, 24, 24, EmuConstants::MAP_BANK_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 2, 2, 2, 2, 2, EmuConstants::MAP_SHAREDBANK_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 8, 8, 8, 8, 8, EmuConstants::MAP_TRADE_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 10, 10, 10, 10, 10, EmuConstants::MAP_WORLD_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 36, 36, 36, 36, 36, EmuConstants::MAP_LIMBO_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_TRIBUTE_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_TROPHYTRIBUTE_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_GUILDTRIBUTE_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_MERCHANT_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_DELETED_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 34, EmuConstants::MAP_CORPSE_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 80, EmuConstants::MAP_BAZAAR_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_INSPECT_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_REALESTATE_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_VIEWMODPC_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_VIEWMODBANK_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_VIEWMODSHAREDBANK_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_VIEWMODLIMBO_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_ALTSTORAGE_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_ARCHIVED_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_MAIL_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_GUILDTROPHYTRIBUTE_SIZE, 0, 0, 0, 0, 0 },
|
||||||
|
{ NOT_USED, NOT_USED, NOT_USED, NOT_USED, NOT_USED, NOT_USED, EmuConstants::MAP_KRONO_SIZE, 0, 0, 0, 0, 0 }, // (will be implemented in RoF2)
|
||||||
|
{ NOT_USED, 0, 0, 0, 0, 0, EmuConstants::MAP_OTHER_SIZE, 0, 0, 0, 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
if ((uint16)map < _MapCount)
|
||||||
|
return local[map][ValidateMobVersion(version)];
|
||||||
|
|
||||||
|
return NOT_USED;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64 EQLimits::PossessionsBitmask(uint32 version) {
|
||||||
|
// these are for the new inventory system..not the current one...
|
||||||
|
// 0x0000000000200000 is SlotPowerSource (SoF+)
|
||||||
|
// 0x0000000100000000 is SlotGeneral9 (RoF+)
|
||||||
|
// 0x0000000200000000 is SlotGeneral10 (RoF+)
|
||||||
|
|
||||||
|
static const uint64 local[_EmuClientCount] = {
|
||||||
|
/*Unknown*/ NOT_USED,
|
||||||
|
/*62*/ 0x000000027FDFFFFF,
|
||||||
|
/*Titanium*/ 0x000000027FDFFFFF,
|
||||||
|
/*SoF*/ 0x000000027FFFFFFF,
|
||||||
|
/*SoD*/ 0x000000027FFFFFFF,
|
||||||
|
/*Underfoot*/ 0x000000027FFFFFFF,
|
||||||
|
/*RoF*/ 0x00000003FFFFFFFF,
|
||||||
|
/*RoF2*/ 0,
|
||||||
|
|
||||||
|
/*NPC*/ 0,
|
||||||
|
/*Merc*/ 0,
|
||||||
|
/*Bot*/ 0,
|
||||||
|
/*Pet*/ 0
|
||||||
|
};
|
||||||
|
|
||||||
|
return local[ValidateMobVersion(version)];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64 EQLimits::EquipmentBitmask(uint32 version) {
|
||||||
|
static const uint64 local[_EmuClientCount] = {
|
||||||
|
/*Unknown*/ NOT_USED,
|
||||||
|
/*62*/ 0x00000000005FFFFF,
|
||||||
|
/*Titanium*/ 0x00000000005FFFFF,
|
||||||
|
/*SoF*/ 0x00000000007FFFFF,
|
||||||
|
/*SoD*/ 0x00000000007FFFFF,
|
||||||
|
/*Underfoot*/ 0x00000000007FFFFF,
|
||||||
|
/*RoF*/ 0x00000000007FFFFF,
|
||||||
|
/*RoF2*/ 0,
|
||||||
|
|
||||||
|
/*NPC*/ 0,
|
||||||
|
/*Merc*/ 0,
|
||||||
|
/*Bot*/ 0,
|
||||||
|
/*Pet*/ 0
|
||||||
|
};
|
||||||
|
|
||||||
|
return local[ValidateMobVersion(version)];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64 EQLimits::GeneralBitmask(uint32 version) {
|
||||||
|
static const uint64 local[_EmuClientCount] = {
|
||||||
|
/*Unknown*/ NOT_USED,
|
||||||
|
/*62*/ 0x000000007F800000,
|
||||||
|
/*Titanium*/ 0x000000007F800000,
|
||||||
|
/*SoF*/ 0x000000007F800000,
|
||||||
|
/*SoD*/ 0x000000007F800000,
|
||||||
|
/*Underfoot*/ 0x000000007F800000,
|
||||||
|
/*RoF*/ 0x00000001FF800000,
|
||||||
|
/*RoF2*/ 0,
|
||||||
|
|
||||||
|
/*NPC*/ 0,
|
||||||
|
/*Merc*/ 0,
|
||||||
|
/*Bot*/ 0,
|
||||||
|
/*Pet*/ 0
|
||||||
|
};
|
||||||
|
|
||||||
|
return local[ValidateMobVersion(version)];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64 EQLimits::CursorBitmask(uint32 version) {
|
||||||
|
static const uint64 local[_EmuClientCount] = {
|
||||||
|
/*Unknown*/ NOT_USED,
|
||||||
|
/*62*/ 0x0000000200000000,
|
||||||
|
/*Titanium*/ 0x0000000200000000,
|
||||||
|
/*SoF*/ 0x0000000200000000,
|
||||||
|
/*SoD*/ 0x0000000200000000,
|
||||||
|
/*Underfoot*/ 0x0000000200000000,
|
||||||
|
/*RoF*/ 0x0000000200000000,
|
||||||
|
/*RoF2*/ 0,
|
||||||
|
|
||||||
|
/*NPC*/ 0,
|
||||||
|
/*Merc*/ 0,
|
||||||
|
/*Bot*/ 0,
|
||||||
|
/*Pet*/ 0
|
||||||
|
};
|
||||||
|
|
||||||
|
return local[ValidateMobVersion(version)];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQLimits::AllowsEmptyBagInBag(uint32 version) {
|
||||||
|
static const bool local[_EmuClientCount] = {
|
||||||
|
/*Unknown*/ false,
|
||||||
|
/*62*/ false,
|
||||||
|
/*Titanium*/ false,
|
||||||
|
/*SoF*/ false,
|
||||||
|
/*SoD*/ false,
|
||||||
|
/*Underfoot*/ false,
|
||||||
|
/*RoF*/ true,
|
||||||
|
/*RoF2*/ true,
|
||||||
|
|
||||||
|
/*NPC*/ true,
|
||||||
|
/*Merc*/ true,
|
||||||
|
/*Bot*/ true,
|
||||||
|
/*Pet*/ true
|
||||||
|
};
|
||||||
|
|
||||||
|
return local[ValidateMobVersion(version)];
|
||||||
|
}
|
||||||
|
|
||||||
|
// items
|
||||||
|
uint16 EQLimits::ItemCommonSize(uint32 version) {
|
||||||
|
static const uint16 local[_EmuClientCount] = {
|
||||||
|
/*Unknown*/ NOT_USED,
|
||||||
|
/*62*/ 5,
|
||||||
|
/*Titanium*/ 5,
|
||||||
|
/*SoF*/ 5,
|
||||||
|
/*SoD*/ 5,
|
||||||
|
/*Underfoot*/ 5,
|
||||||
|
/*RoF*/ EmuConstants::ITEM_COMMON_SIZE,
|
||||||
|
/*RoF2*/ 0,
|
||||||
|
|
||||||
|
/*NPC*/ 0,
|
||||||
|
/*Merc*/ 0,
|
||||||
|
/*Bot*/ 0,
|
||||||
|
/*Pet*/ 0
|
||||||
|
};
|
||||||
|
|
||||||
|
return local[ValidateMobVersion(version)];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16 EQLimits::ItemContainerSize(uint32 version) {
|
||||||
|
static const uint16 local[_EmuClientCount] = {
|
||||||
|
/*Unknown*/ NOT_USED,
|
||||||
|
/*62*/ 10,
|
||||||
|
/*Titanium*/ 10,
|
||||||
|
/*SoF*/ 10,
|
||||||
|
/*SoD*/ 10,
|
||||||
|
/*Underfoot*/ 10,
|
||||||
|
/*RoF*/ EmuConstants::ITEM_CONTAINER_SIZE,
|
||||||
|
/*RoF2*/ 0,
|
||||||
|
|
||||||
|
/*NPC*/ 0,
|
||||||
|
/*Merc*/ 0,
|
||||||
|
/*Bot*/ 0,
|
||||||
|
/*Pet*/ 0
|
||||||
|
};
|
||||||
|
|
||||||
|
return local[ValidateMobVersion(version)];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQLimits::CoinHasWeight(uint32 version) {
|
||||||
|
static const bool local[_EmuClientCount] = {
|
||||||
|
/*Unknown*/ true,
|
||||||
|
/*62*/ true,
|
||||||
|
/*Titanium*/ true,
|
||||||
|
/*SoF*/ true,
|
||||||
|
/*SoD*/ false,
|
||||||
|
/*Underfoot*/ false,
|
||||||
|
/*RoF*/ false,
|
||||||
|
/*RoF2*/ false,
|
||||||
|
|
||||||
|
/*NPC*/ false,
|
||||||
|
/*Merc*/ false,
|
||||||
|
/*Bot*/ false,
|
||||||
|
/*Pet*/ false
|
||||||
|
};
|
||||||
|
|
||||||
|
return local[ValidateMobVersion(version)];
|
||||||
|
}
|
||||||
118
common/eq_dictionary.h
Normal file
118
common/eq_dictionary.h
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
Copyright (C) 2001-2003 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 EQ_DICTIONARY_H
|
||||||
|
#define EQ_DICTIONARY_H
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
#include "eq_constants.h"
|
||||||
|
#include "clientversions.h"
|
||||||
|
|
||||||
|
// an immutable value is required to initialize arrays, etc... use this class as a repository for those
|
||||||
|
typedef class {
|
||||||
|
public:
|
||||||
|
// database
|
||||||
|
static const EQClientVersion CHARACTER_CREATION_CLIENT = _EQCreationClient;
|
||||||
|
|
||||||
|
// inventory
|
||||||
|
static uint16 InventoryMapSize(int16 map);
|
||||||
|
|
||||||
|
static const uint16 MAP_POSSESSIONS_SIZE = 22; //_SlotCount;
|
||||||
|
static const uint16 MAP_BANK_SIZE = 24;
|
||||||
|
static const uint16 MAP_SHAREDBANK_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 = 5;
|
||||||
|
static const uint16 MAP_TROPHYTRIBUTE_SIZE = 0;
|
||||||
|
static const uint16 MAP_GUILDTRIBUTE_SIZE = 0;
|
||||||
|
static const uint16 MAP_MERCHANT_SIZE = 0;
|
||||||
|
static const uint16 MAP_DELETED_SIZE = 0;
|
||||||
|
static const uint16 MAP_CORPSE_SIZE = 22; //_SlotCount; // actual code still needs lots of work...
|
||||||
|
static const uint16 MAP_BAZAAR_SIZE = 80; //200;
|
||||||
|
static const uint16 MAP_INSPECT_SIZE = 22; //_SlotEquipmentCount;
|
||||||
|
static const uint16 MAP_REALESTATE_SIZE = 0;
|
||||||
|
static const uint16 MAP_VIEWMODPC_SIZE = NOT_USED;
|
||||||
|
static const uint16 MAP_VIEWMODBANK_SIZE = NOT_USED;
|
||||||
|
static const uint16 MAP_VIEWMODSHAREDBANK_SIZE = NOT_USED;
|
||||||
|
static const uint16 MAP_VIEWMODLIMBO_SIZE = NOT_USED;
|
||||||
|
static const uint16 MAP_ALTSTORAGE_SIZE = 0;
|
||||||
|
static const uint16 MAP_ARCHIVED_SIZE = 0;
|
||||||
|
static const uint16 MAP_MAIL_SIZE = 0;
|
||||||
|
static const uint16 MAP_GUILDTROPHYTRIBUTE_SIZE = 0;
|
||||||
|
static const uint16 MAP_KRONO_SIZE = 0; // this will be '1' when RoF2 is implemented
|
||||||
|
static const uint16 MAP_OTHER_SIZE = 0;
|
||||||
|
|
||||||
|
//static const int16 EQUIPMENT_BEGIN = _SlotEquipmentBegin;
|
||||||
|
//static const int16 EQUIPMENT_END = _SlotEquipmentEnd;
|
||||||
|
static const uint16 EQUIPMENT_SIZE = 22; //_SlotEquipmentCount; // not ready for client usage..only equipment arrays for npcs...
|
||||||
|
|
||||||
|
static const int16 GENERAL_BEGIN = 22; //_SlotGeneralBegin;
|
||||||
|
static const int16 GENERAL_END = 29; //_SlotGeneralEnd;
|
||||||
|
static const uint16 GENERAL_SIZE = 8; //_SlotGeneralCount;
|
||||||
|
|
||||||
|
// items
|
||||||
|
static const uint16 ITEM_COMMON_SIZE = 5;
|
||||||
|
static const uint16 ITEM_CONTAINER_SIZE = 10;
|
||||||
|
|
||||||
|
// player profile
|
||||||
|
//static const uint32 CLASS_BITMASK = 0; // needs value
|
||||||
|
//static const uint32 RACE_BITMASK = 0; // needs value
|
||||||
|
|
||||||
|
// TODO: resolve naming convention and use for bandolier count versus size
|
||||||
|
//static const uint32 BANDOLIER_COUNT = 4;
|
||||||
|
static const uint32 BANDOLIER_SIZE = 4;
|
||||||
|
static const uint32 POTION_BELT_SIZE = 5;
|
||||||
|
} EmuConstants;
|
||||||
|
|
||||||
|
typedef class {
|
||||||
|
public:
|
||||||
|
// client version validation (checks to avoid crashing zone server when accessing reference arrays)
|
||||||
|
// use this inside of class Client (limits to actual clients)
|
||||||
|
static bool IsValidClientVersion(uint32 version);
|
||||||
|
static uint32 ValidateClientVersion(uint32 version);
|
||||||
|
static EQClientVersion ValidateClientVersion(EQClientVersion version);
|
||||||
|
|
||||||
|
// basically..any non-client classes - do not when setting a valid client
|
||||||
|
static bool IsValidNPCVersion(uint32 version);
|
||||||
|
static uint32 ValidateNPCVersion(uint32 version);
|
||||||
|
static EQClientVersion ValidateNPCVersion(EQClientVersion version);
|
||||||
|
|
||||||
|
// these are 'universal' - do not when setting a valid client
|
||||||
|
static bool IsValidMobVersion(uint32 version);
|
||||||
|
static uint32 ValidateMobVersion(uint32 version);
|
||||||
|
static EQClientVersion ValidateMobVersion(EQClientVersion version);
|
||||||
|
|
||||||
|
// inventory
|
||||||
|
static uint16 InventoryMapSize(int16 map, uint32 version);
|
||||||
|
static uint64 PossessionsBitmask(uint32 version);
|
||||||
|
static uint64 EquipmentBitmask(uint32 version);
|
||||||
|
static uint64 GeneralBitmask(uint32 version);
|
||||||
|
static uint64 CursorBitmask(uint32 version);
|
||||||
|
|
||||||
|
static bool AllowsEmptyBagInBag(uint32 version);
|
||||||
|
|
||||||
|
// items
|
||||||
|
static uint16 ItemCommonSize(uint32 version);
|
||||||
|
static uint16 ItemContainerSize(uint32 version);
|
||||||
|
|
||||||
|
// player profile
|
||||||
|
static bool CoinHasWeight(uint32 version);
|
||||||
|
} EQLimits;
|
||||||
|
|
||||||
|
#endif /* EQ_LIMITS_H */
|
||||||
@ -32,7 +32,8 @@ static const uint32 MAX_MERC_GRADES = 10;
|
|||||||
static const uint32 MAX_MERC_STANCES = 10;
|
static const uint32 MAX_MERC_STANCES = 10;
|
||||||
static const uint32 BLOCKED_BUFF_COUNT = 20;
|
static const uint32 BLOCKED_BUFF_COUNT = 20;
|
||||||
|
|
||||||
#include "eq_constants.h"
|
//#include "eq_constants.h"
|
||||||
|
#include "eq_dictionary.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Compiler override to ensure
|
** Compiler override to ensure
|
||||||
|
|||||||
@ -42,7 +42,8 @@
|
|||||||
* Made ya look! Ha!
|
* Made ya look! Ha!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "eq_constants.h"
|
//#include "eq_constants.h"
|
||||||
|
#include "eq_dictionary.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Child struct of Item_Struct:
|
** Child struct of Item_Struct:
|
||||||
@ -68,7 +69,8 @@ struct InternalSerializedItem_Struct {
|
|||||||
const void * inst;
|
const void * inst;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_AUGMENT_SLOTS 5
|
// use EmuConstants::ITEM_COMMON_SIZE
|
||||||
|
//#define MAX_AUGMENT_SLOTS 5
|
||||||
|
|
||||||
struct Item_Struct {
|
struct Item_Struct {
|
||||||
bool IsEquipable(uint16 Race, uint16 Class) const;
|
bool IsEquipable(uint16 Race, uint16 Class) const;
|
||||||
@ -180,9 +182,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[MAX_AUGMENT_SLOTS]; // LDoN: Augment Slot 1-5 Type
|
uint8 AugSlotType[EmuConstants::ITEM_COMMON_SIZE]; // LDoN: Augment Slot 1-5 Type
|
||||||
uint8 AugSlotVisible[MAX_AUGMENT_SLOTS]; // LDoN: Augment Slot 1-5 Visible
|
uint8 AugSlotVisible[EmuConstants::ITEM_COMMON_SIZE]; // LDoN: Augment Slot 1-5 Visible
|
||||||
uint8 AugSlotUnk2[MAX_AUGMENT_SLOTS]; // LDoN: Augment Slot 1-5 Unknown
|
uint8 AugSlotUnk2[EmuConstants::ITEM_COMMON_SIZE]; // LDoN: Augment Slot 1-5 Unknown
|
||||||
uint32 LDoNTheme;
|
uint32 LDoNTheme;
|
||||||
uint32 LDoNPrice;
|
uint32 LDoNPrice;
|
||||||
uint32 LDoNSold;
|
uint32 LDoNSold;
|
||||||
|
|||||||
@ -439,7 +439,7 @@ bool SharedDatabase::GetSharedBank(uint32 id, Inventory* inv, bool is_charid) {
|
|||||||
const Item_Struct* item = GetItem(item_id);
|
const Item_Struct* item = GetItem(item_id);
|
||||||
|
|
||||||
if (item) {
|
if (item) {
|
||||||
int16 put_slot_id = SLOT_INVALID;
|
int16 put_slot_id = INVALID_INDEX;
|
||||||
|
|
||||||
ItemInst* inst = CreateBaseItem(item, charges);
|
ItemInst* inst = CreateBaseItem(item, charges);
|
||||||
if (item->ItemClass == ItemClassCommon) {
|
if (item->ItemClass == ItemClassCommon) {
|
||||||
@ -479,7 +479,7 @@ bool SharedDatabase::GetSharedBank(uint32 id, Inventory* inv, bool is_charid) {
|
|||||||
safe_delete(inst);
|
safe_delete(inst);
|
||||||
|
|
||||||
// Save ptr to item in inventory
|
// Save ptr to item in inventory
|
||||||
if (put_slot_id == SLOT_INVALID) {
|
if (put_slot_id == INVALID_INDEX) {
|
||||||
LogFile->write(EQEMuLog::Error,
|
LogFile->write(EQEMuLog::Error,
|
||||||
"Warning: Invalid slot_id for item in shared bank inventory: %s=%i, item_id=%i, slot_id=%i",
|
"Warning: Invalid slot_id for item in shared bank inventory: %s=%i, item_id=%i, slot_id=%i",
|
||||||
((is_charid==true) ? "charid" : "acctid"), id, item_id, slot_id);
|
((is_charid==true) ? "charid" : "acctid"), id, item_id, slot_id);
|
||||||
@ -535,7 +535,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, Inventory* inv) {
|
|||||||
const Item_Struct* item = GetItem(item_id);
|
const Item_Struct* item = GetItem(item_id);
|
||||||
|
|
||||||
if (item) {
|
if (item) {
|
||||||
int16 put_slot_id = SLOT_INVALID;
|
int16 put_slot_id = INVALID_INDEX;
|
||||||
|
|
||||||
ItemInst* inst = CreateBaseItem(item, charges);
|
ItemInst* inst = CreateBaseItem(item, charges);
|
||||||
|
|
||||||
@ -589,7 +589,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, Inventory* inv) {
|
|||||||
safe_delete(inst);
|
safe_delete(inst);
|
||||||
|
|
||||||
// Save ptr to item in inventory
|
// Save ptr to item in inventory
|
||||||
if (put_slot_id == SLOT_INVALID) {
|
if (put_slot_id == INVALID_INDEX) {
|
||||||
LogFile->write(EQEMuLog::Error,
|
LogFile->write(EQEMuLog::Error,
|
||||||
"Warning: Invalid slot_id for item in inventory: charid=%i, item_id=%i, slot_id=%i",
|
"Warning: Invalid slot_id for item in inventory: charid=%i, item_id=%i, slot_id=%i",
|
||||||
char_id, item_id, slot_id);
|
char_id, item_id, slot_id);
|
||||||
@ -641,7 +641,7 @@ bool SharedDatabase::GetInventory(uint32 account_id, char* name, Inventory* inv)
|
|||||||
aug[4] = (uint32)atoi(row[8]);
|
aug[4] = (uint32)atoi(row[8]);
|
||||||
bool instnodrop = (row[9] && (uint16)atoi(row[9])) ? true : false;
|
bool instnodrop = (row[9] && (uint16)atoi(row[9])) ? true : false;
|
||||||
const Item_Struct* item = GetItem(item_id);
|
const Item_Struct* item = GetItem(item_id);
|
||||||
int16 put_slot_id = SLOT_INVALID;
|
int16 put_slot_id = INVALID_INDEX;
|
||||||
if(!item)
|
if(!item)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -692,7 +692,7 @@ bool SharedDatabase::GetInventory(uint32 account_id, char* name, Inventory* inv)
|
|||||||
safe_delete(inst);
|
safe_delete(inst);
|
||||||
|
|
||||||
// Save ptr to item in inventory
|
// Save ptr to item in inventory
|
||||||
if (put_slot_id == SLOT_INVALID) {
|
if (put_slot_id == INVALID_INDEX) {
|
||||||
LogFile->write(EQEMuLog::Error,
|
LogFile->write(EQEMuLog::Error,
|
||||||
"Warning: Invalid slot_id for item in inventory: name=%s, acctid=%i, item_id=%i, slot_id=%i",
|
"Warning: Invalid slot_id for item in inventory: name=%s, acctid=%i, item_id=%i, slot_id=%i",
|
||||||
name, account_id, item_id, slot_id);
|
name, account_id, item_id, slot_id);
|
||||||
|
|||||||
@ -53,7 +53,8 @@ enum SkillUseTypes : uint32
|
|||||||
/*13879*/ SkillDivination,
|
/*13879*/ SkillDivination,
|
||||||
/*13880*/ SkillDodge,
|
/*13880*/ SkillDodge,
|
||||||
/*13881*/ SkillDoubleAttack,
|
/*13881*/ SkillDoubleAttack,
|
||||||
/*13882*/ SkillDragonPunch, /*13924 SkillTailRake*/
|
/*13882*/ SkillDragonPunch,
|
||||||
|
/*13924*/ SkillTailRake = SkillDragonPunch, // Iksar Monk equivilent
|
||||||
/*13883*/ SkillDualWield,
|
/*13883*/ SkillDualWield,
|
||||||
/*13884*/ SkillEagleStrike,
|
/*13884*/ SkillEagleStrike,
|
||||||
/*13885*/ SkillEvocation,
|
/*13885*/ SkillEvocation,
|
||||||
|
|||||||
@ -18,7 +18,6 @@
|
|||||||
#ifndef TYPES_H
|
#ifndef TYPES_H
|
||||||
#define TYPES_H
|
#define TYPES_H
|
||||||
|
|
||||||
#ifdef EQEMU_USE_STDINT
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
typedef uint8_t byte;
|
typedef uint8_t byte;
|
||||||
typedef uint8_t uint8;
|
typedef uint8_t uint8;
|
||||||
@ -29,29 +28,6 @@ typedef int8_t int8;
|
|||||||
typedef int16_t int16;
|
typedef int16_t int16;
|
||||||
typedef int32_t int32;
|
typedef int32_t int32;
|
||||||
typedef int64_t int64;
|
typedef int64_t int64;
|
||||||
#else
|
|
||||||
typedef unsigned char byte;
|
|
||||||
typedef unsigned char uint8;
|
|
||||||
typedef signed char int8;
|
|
||||||
typedef unsigned short uint16;
|
|
||||||
typedef signed short int16;
|
|
||||||
typedef unsigned int uint32;
|
|
||||||
typedef signed int int32;
|
|
||||||
|
|
||||||
#ifdef _WINDOWS
|
|
||||||
#if defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64
|
|
||||||
typedef unsigned __int64 uint64;
|
|
||||||
typedef unsigned __int64 uint64;
|
|
||||||
typedef signed __int64 int64;
|
|
||||||
#else
|
|
||||||
#error __int64 not supported
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
typedef unsigned long long uint64;
|
|
||||||
typedef unsigned long long uint64;
|
|
||||||
typedef signed long long int64;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _WINDOWS
|
#ifdef _WINDOWS
|
||||||
#pragma warning( disable : 4200 )
|
#pragma warning( disable : 4200 )
|
||||||
|
|||||||
@ -15,7 +15,7 @@ ADD_EXECUTABLE(eqlaunch ${eqlaunch_sources} ${eqlaunch_headers})
|
|||||||
|
|
||||||
INSTALL(TARGETS eqlaunch RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
|
INSTALL(TARGETS eqlaunch RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
|
||||||
|
|
||||||
TARGET_LINK_LIBRARIES(eqlaunch Common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
TARGET_LINK_LIBRARIES(eqlaunch common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
SET_TARGET_PROPERTIES(eqlaunch PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
SET_TARGET_PROPERTIES(eqlaunch PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
||||||
@ -37,4 +37,4 @@ IF(UNIX)
|
|||||||
ADD_DEFINITIONS(-fPIC)
|
ADD_DEFINITIONS(-fPIC)
|
||||||
ENDIF(UNIX)
|
ENDIF(UNIX)
|
||||||
|
|
||||||
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/Bin)
|
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||||
|
|||||||
@ -43,7 +43,7 @@ ADD_EXECUTABLE(loginserver ${eqlogin_sources} ${eqlogin_headers})
|
|||||||
|
|
||||||
INSTALL(TARGETS loginserver RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
|
INSTALL(TARGETS loginserver RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
|
||||||
|
|
||||||
TARGET_LINK_LIBRARIES(loginserver Common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE})
|
TARGET_LINK_LIBRARIES(loginserver common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE})
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
SET_TARGET_PROPERTIES(loginserver PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
SET_TARGET_PROPERTIES(loginserver PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
||||||
@ -67,4 +67,4 @@ IF(UNIX)
|
|||||||
ADD_DEFINITIONS(-fPIC)
|
ADD_DEFINITIONS(-fPIC)
|
||||||
ENDIF(UNIX)
|
ENDIF(UNIX)
|
||||||
|
|
||||||
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/Bin)
|
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||||
|
|||||||
@ -31,4 +31,4 @@ IF(UNIX)
|
|||||||
ADD_DEFINITIONS(-fPIC)
|
ADD_DEFINITIONS(-fPIC)
|
||||||
ENDIF(UNIX)
|
ENDIF(UNIX)
|
||||||
|
|
||||||
SET(LIBRARY_OUTPUT_PATH ../Bin)
|
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||||
|
|||||||
@ -21,7 +21,7 @@ INSTALL(TARGETS queryserv RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
|
|||||||
|
|
||||||
ADD_DEFINITIONS(-DQSERV)
|
ADD_DEFINITIONS(-DQSERV)
|
||||||
|
|
||||||
TARGET_LINK_LIBRARIES(queryserv Common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
TARGET_LINK_LIBRARIES(queryserv common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
SET_TARGET_PROPERTIES(queryserv PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
SET_TARGET_PROPERTIES(queryserv PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
||||||
@ -43,4 +43,4 @@ IF(UNIX)
|
|||||||
ADD_DEFINITIONS(-fPIC)
|
ADD_DEFINITIONS(-fPIC)
|
||||||
ENDIF(UNIX)
|
ENDIF(UNIX)
|
||||||
|
|
||||||
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/Bin)
|
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||||
|
|||||||
@ -23,7 +23,7 @@ ADD_EXECUTABLE(shared_memory ${shared_memory_sources} ${shared_memory_headers})
|
|||||||
|
|
||||||
INSTALL(TARGETS shared_memory RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
|
INSTALL(TARGETS shared_memory RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
|
||||||
|
|
||||||
TARGET_LINK_LIBRARIES(shared_memory Common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
TARGET_LINK_LIBRARIES(shared_memory common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
SET_TARGET_PROPERTIES(shared_memory PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
SET_TARGET_PROPERTIES(shared_memory PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
||||||
@ -45,4 +45,4 @@ IF(UNIX)
|
|||||||
ADD_DEFINITIONS(-fPIC)
|
ADD_DEFINITIONS(-fPIC)
|
||||||
ENDIF(UNIX)
|
ENDIF(UNIX)
|
||||||
|
|
||||||
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/Bin)
|
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||||
|
|||||||
@ -17,7 +17,7 @@ SET(tests_headers
|
|||||||
|
|
||||||
ADD_EXECUTABLE(tests ${tests_sources} ${tests_headers})
|
ADD_EXECUTABLE(tests ${tests_sources} ${tests_headers})
|
||||||
|
|
||||||
TARGET_LINK_LIBRARIES(tests Common cppunit)
|
TARGET_LINK_LIBRARIES(tests common cppunit)
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
SET_TARGET_PROPERTIES(tests PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
SET_TARGET_PROPERTIES(tests PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
||||||
@ -39,4 +39,4 @@ IF(UNIX)
|
|||||||
ADD_DEFINITIONS(-fPIC)
|
ADD_DEFINITIONS(-fPIC)
|
||||||
ENDIF(UNIX)
|
ENDIF(UNIX)
|
||||||
|
|
||||||
SET(EXECUTABLE_OUTPUT_PATH ../Bin)
|
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||||
|
|||||||
@ -23,7 +23,7 @@ INSTALL(TARGETS ucs RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
|
|||||||
|
|
||||||
ADD_DEFINITIONS(-DUCS)
|
ADD_DEFINITIONS(-DUCS)
|
||||||
|
|
||||||
TARGET_LINK_LIBRARIES(ucs Common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
TARGET_LINK_LIBRARIES(ucs common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
SET_TARGET_PROPERTIES(ucs PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
SET_TARGET_PROPERTIES(ucs PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
||||||
@ -45,4 +45,4 @@ IF(UNIX)
|
|||||||
ADD_DEFINITIONS(-fPIC)
|
ADD_DEFINITIONS(-fPIC)
|
||||||
ENDIF(UNIX)
|
ENDIF(UNIX)
|
||||||
|
|
||||||
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/Bin)
|
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
ALTER TABLE `npc_types` ADD `no_target_hotkey` tinyint( 1 ) UNSIGNED NOT NULL DEFAULT '0' AFTER `healscale`;
|
-- npc_types
|
||||||
|
ALTER TABLE `npc_types` ADD `ammo_idfile` varchar( 30 ) NOT NULL DEFAULT 'IT10' AFTER `d_meele_texture2`;
|
||||||
|
ALTER TABLE `npc_types` ADD `ranged_type` tinyint( 4 ) UNSIGNED NOT NULL DEFAULT '7' AFTER `sec_melee_type`;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -23,7 +23,6 @@ SET(world_sources
|
|||||||
perl_EQW.cpp
|
perl_EQW.cpp
|
||||||
perl_HTTPRequest.cpp
|
perl_HTTPRequest.cpp
|
||||||
queryserv.cpp
|
queryserv.cpp
|
||||||
socket_server.cpp
|
|
||||||
ucs.cpp
|
ucs.cpp
|
||||||
wguild_mgr.cpp
|
wguild_mgr.cpp
|
||||||
world_logsys.cpp
|
world_logsys.cpp
|
||||||
@ -54,7 +53,6 @@ SET(world_headers
|
|||||||
LoginServerList.h
|
LoginServerList.h
|
||||||
net.h
|
net.h
|
||||||
queryserv.h
|
queryserv.h
|
||||||
socket_server.h
|
|
||||||
SoFCharCreateData.h
|
SoFCharCreateData.h
|
||||||
ucs.h
|
ucs.h
|
||||||
wguild_mgr.h
|
wguild_mgr.h
|
||||||
@ -71,7 +69,7 @@ INSTALL(TARGETS world RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
|
|||||||
|
|
||||||
ADD_DEFINITIONS(-DWORLD)
|
ADD_DEFINITIONS(-DWORLD)
|
||||||
|
|
||||||
TARGET_LINK_LIBRARIES(world Common ${PERL_LIBRARY} debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
TARGET_LINK_LIBRARIES(world common ${PERL_LIBRARY} debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
SET_TARGET_PROPERTIES(world PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
SET_TARGET_PROPERTIES(world PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
||||||
@ -93,4 +91,4 @@ IF(UNIX)
|
|||||||
ADD_DEFINITIONS(-fPIC)
|
ADD_DEFINITIONS(-fPIC)
|
||||||
ENDIF(UNIX)
|
ENDIF(UNIX)
|
||||||
|
|
||||||
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/Bin)
|
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||||
|
|||||||
@ -46,7 +46,6 @@
|
|||||||
#include "LauncherList.h"
|
#include "LauncherList.h"
|
||||||
#include "ucs.h"
|
#include "ucs.h"
|
||||||
#include "queryserv.h"
|
#include "queryserv.h"
|
||||||
#include "socket_server.h"
|
|
||||||
|
|
||||||
#ifdef _WINDOWS
|
#ifdef _WINDOWS
|
||||||
#define snprintf _snprintf
|
#define snprintf _snprintf
|
||||||
@ -61,7 +60,6 @@ extern ClientList client_list;
|
|||||||
extern LauncherList launcher_list;
|
extern LauncherList launcher_list;
|
||||||
extern UCSConnection UCSLink;
|
extern UCSConnection UCSLink;
|
||||||
extern QueryServConnection QSLink;
|
extern QueryServConnection QSLink;
|
||||||
extern Socket_Server_Connection SSLink;
|
|
||||||
extern volatile bool RunLoops;
|
extern volatile bool RunLoops;
|
||||||
|
|
||||||
ConsoleList console_list;
|
ConsoleList console_list;
|
||||||
@ -265,12 +263,6 @@ bool Console::Process() {
|
|||||||
QSLink.SetConnection(tcpc);
|
QSLink.SetConnection(tcpc);
|
||||||
tcpc = 0;
|
tcpc = 0;
|
||||||
}
|
}
|
||||||
else if (tcpc->GetPacketMode() == EmuTCPConnection::packetModeSocket_Server)
|
|
||||||
{
|
|
||||||
_log(WORLD__CONSOLE, "New Socket Server Connection from %s:%d", inet_ntoa(in), GetPort());
|
|
||||||
SSLink.SetConnection(tcpc);
|
|
||||||
tcpc = 0;
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
_log(WORLD__CONSOLE,"Unsupported packet mode from %s:%d", inet_ntoa(in), GetPort());
|
_log(WORLD__CONSOLE,"Unsupported packet mode from %s:%d", inet_ntoa(in), GetPort());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -86,7 +86,6 @@
|
|||||||
#include "AdventureManager.h"
|
#include "AdventureManager.h"
|
||||||
#include "ucs.h"
|
#include "ucs.h"
|
||||||
#include "queryserv.h"
|
#include "queryserv.h"
|
||||||
#include "socket_server.h"
|
|
||||||
|
|
||||||
TimeoutManager timeout_manager;
|
TimeoutManager timeout_manager;
|
||||||
EQStreamFactory eqsf(WorldStream,9000);
|
EQStreamFactory eqsf(WorldStream,9000);
|
||||||
@ -98,7 +97,6 @@ LoginServerList loginserverlist;
|
|||||||
EQWHTTPServer http_server;
|
EQWHTTPServer http_server;
|
||||||
UCSConnection UCSLink;
|
UCSConnection UCSLink;
|
||||||
QueryServConnection QSLink;
|
QueryServConnection QSLink;
|
||||||
Socket_Server_Connection SSLink;
|
|
||||||
LauncherList launcher_list;
|
LauncherList launcher_list;
|
||||||
AdventureManager adventure_manager;
|
AdventureManager adventure_manager;
|
||||||
DBAsync *dbasync = nullptr;
|
DBAsync *dbasync = nullptr;
|
||||||
@ -456,8 +454,6 @@ int main(int argc, char** argv) {
|
|||||||
|
|
||||||
QSLink.Process();
|
QSLink.Process();
|
||||||
|
|
||||||
SSLink.Process();
|
|
||||||
|
|
||||||
LFPGroupList.Process();
|
LFPGroupList.Process();
|
||||||
|
|
||||||
adventure_manager.Process();
|
adventure_manager.Process();
|
||||||
|
|||||||
@ -1,127 +0,0 @@
|
|||||||
#include "../common/debug.h"
|
|
||||||
#include "socket_server.h"
|
|
||||||
#include "WorldConfig.h"
|
|
||||||
#include "clientlist.h"
|
|
||||||
#include "zonelist.h"
|
|
||||||
#include "../common/logsys.h"
|
|
||||||
#include "../common/logtypes.h"
|
|
||||||
#include "../common/md5.h"
|
|
||||||
#include "../common/EmuTCPConnection.h"
|
|
||||||
#include "../common/packet_dump.h"
|
|
||||||
|
|
||||||
extern ClientList client_list;
|
|
||||||
extern ZSList zoneserver_list;
|
|
||||||
|
|
||||||
Socket_Server_Connection::Socket_Server_Connection()
|
|
||||||
{
|
|
||||||
Stream = 0;
|
|
||||||
authenticated = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Socket_Server_Connection::SetConnection(EmuTCPConnection *inStream)
|
|
||||||
{
|
|
||||||
if(Stream)
|
|
||||||
{
|
|
||||||
_log(SOCKET_SERVER__ERROR, "Incoming Socket_Server Connection while we were already connected to a Socket_Server.");
|
|
||||||
Stream->Disconnect();
|
|
||||||
}
|
|
||||||
|
|
||||||
Stream = inStream;
|
|
||||||
|
|
||||||
authenticated = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Socket_Server_Connection::Process()
|
|
||||||
{
|
|
||||||
if (!Stream || !Stream->Connected())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
ServerPacket *pack = 0;
|
|
||||||
|
|
||||||
while((pack = Stream->PopPacket()))
|
|
||||||
{
|
|
||||||
if (!authenticated)
|
|
||||||
{
|
|
||||||
if (WorldConfig::get()->SharedKey.length() > 0)
|
|
||||||
{
|
|
||||||
if (pack->opcode == ServerOP_ZAAuth && pack->size == 16)
|
|
||||||
{
|
|
||||||
uint8 tmppass[16];
|
|
||||||
|
|
||||||
MD5::Generate((const uchar*) WorldConfig::get()->SharedKey.c_str(), WorldConfig::get()->SharedKey.length(), tmppass);
|
|
||||||
|
|
||||||
if (memcmp(pack->pBuffer, tmppass, 16) == 0)
|
|
||||||
authenticated = true;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
struct in_addr in;
|
|
||||||
in.s_addr = GetIP();
|
|
||||||
_log(SOCKET_SERVER__ERROR, "Socket_Server authorization failed.");
|
|
||||||
ServerPacket* pack = new ServerPacket(ServerOP_ZAAuthFailed);
|
|
||||||
SendPacket(pack);
|
|
||||||
delete pack;
|
|
||||||
Disconnect();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
struct in_addr in;
|
|
||||||
in.s_addr = GetIP();
|
|
||||||
_log(SOCKET_SERVER__ERROR, "Socket_Server_ authorization failed.");
|
|
||||||
ServerPacket* pack = new ServerPacket(ServerOP_ZAAuthFailed);
|
|
||||||
SendPacket(pack);
|
|
||||||
delete pack;
|
|
||||||
Disconnect();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_log(SOCKET_SERVER__ERROR,"**WARNING** You have not configured a world shared key in your config file. You should add a <key>STRING</key> element to your <world> element to prevent unauthorized zone access.");
|
|
||||||
authenticated = true;
|
|
||||||
}
|
|
||||||
delete pack;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
switch(pack->opcode)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ServerOP_KeepAlive:
|
|
||||||
{
|
|
||||||
// ignore this
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ServerOP_ZAAuth:
|
|
||||||
{
|
|
||||||
_log(SOCKET_SERVER__ERROR, "Got authentication from Socket_Server_ when they are already authenticated.");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ServerOP_LFGuildUpdate:
|
|
||||||
{
|
|
||||||
zoneserver_list.SendPacket(pack);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
_log(SOCKET_SERVER__ERROR, "Unknown ServerOPcode from Socket_Server_ 0x%04x, size %d", pack->opcode, pack->size);
|
|
||||||
DumpPacket(pack->pBuffer, pack->size);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delete pack;
|
|
||||||
}
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Socket_Server_Connection::SendPacket(ServerPacket* pack)
|
|
||||||
{
|
|
||||||
if(!Stream)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return Stream->SendPacket(pack);
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
#ifndef Socket_Server__H
|
|
||||||
#define Socket_Server__H
|
|
||||||
|
|
||||||
#include "../common/types.h"
|
|
||||||
#include "../common/EmuTCPConnection.h"
|
|
||||||
#include "../common/servertalk.h"
|
|
||||||
|
|
||||||
class Socket_Server_Connection
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Socket_Server_Connection();
|
|
||||||
void SetConnection(EmuTCPConnection *inStream);
|
|
||||||
bool Process();
|
|
||||||
bool SendPacket(ServerPacket* pack);
|
|
||||||
void Disconnect() { if(Stream) Stream->Disconnect(); }
|
|
||||||
void SendMessage(const char *From, const char *Message);
|
|
||||||
private:
|
|
||||||
inline uint32 GetIP() const { return Stream ? Stream->GetrIP() : 0; }
|
|
||||||
EmuTCPConnection *Stream;
|
|
||||||
bool authenticated;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*Socket_Server__H_*/
|
|
||||||
@ -218,7 +218,7 @@ INSTALL(TARGETS zone RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
|
|||||||
|
|
||||||
ADD_DEFINITIONS(-DZONE)
|
ADD_DEFINITIONS(-DZONE)
|
||||||
|
|
||||||
TARGET_LINK_LIBRARIES(zone Common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
TARGET_LINK_LIBRARIES(zone common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
|
||||||
|
|
||||||
IF(EQEMU_BUILD_PERL)
|
IF(EQEMU_BUILD_PERL)
|
||||||
TARGET_LINK_LIBRARIES(zone ${PERL_LIBRARY})
|
TARGET_LINK_LIBRARIES(zone ${PERL_LIBRARY})
|
||||||
@ -249,4 +249,4 @@ IF(UNIX)
|
|||||||
ADD_DEFINITIONS(-fPIC)
|
ADD_DEFINITIONS(-fPIC)
|
||||||
ENDIF(UNIX)
|
ENDIF(UNIX)
|
||||||
|
|
||||||
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/Bin)
|
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||||
|
|||||||
@ -856,7 +856,7 @@ void Client::AI_Process()
|
|||||||
int16 ExtraAttackChanceBonus = spellbonuses.ExtraAttackChance + itembonuses.ExtraAttackChance + aabonuses.ExtraAttackChance;
|
int16 ExtraAttackChanceBonus = spellbonuses.ExtraAttackChance + itembonuses.ExtraAttackChance + aabonuses.ExtraAttackChance;
|
||||||
|
|
||||||
if (ExtraAttackChanceBonus && GetTarget()) {
|
if (ExtraAttackChanceBonus && GetTarget()) {
|
||||||
ItemInst *wpn = GetInv().GetItem(SLOT_PRIMARY);
|
ItemInst *wpn = GetInv().GetItem(MainPrimary);
|
||||||
if(wpn){
|
if(wpn){
|
||||||
if(wpn->GetItem()->ItemType == ItemType2HSlash ||
|
if(wpn->GetItem()->ItemType == ItemType2HSlash ||
|
||||||
wpn->GetItem()->ItemType == ItemType2HBlunt ||
|
wpn->GetItem()->ItemType == ItemType2HBlunt ||
|
||||||
|
|||||||
@ -456,7 +456,7 @@ bool Object::HandleClick(Client* sender, const ClickObject_Struct* click_object)
|
|||||||
// the client updates itself and takes care of sending "duplicate lore item" messages
|
// the client updates itself and takes care of sending "duplicate lore item" messages
|
||||||
if(sender->CheckLoreConflict(m_inst->GetItem())) {
|
if(sender->CheckLoreConflict(m_inst->GetItem())) {
|
||||||
int16 loreslot = sender->GetInv().HasItem(m_inst->GetItem()->ID, 0, invWhereBank);
|
int16 loreslot = sender->GetInv().HasItem(m_inst->GetItem()->ID, 0, invWhereBank);
|
||||||
if(loreslot != SLOT_INVALID) // if the duplicate is in the bank, delete it.
|
if (loreslot != INVALID_INDEX) // if the duplicate is in the bank, delete it.
|
||||||
sender->DeleteItemInInventory(loreslot);
|
sender->DeleteItemInInventory(loreslot);
|
||||||
else
|
else
|
||||||
cursordelete = true; // otherwise, we delete the new one
|
cursordelete = true; // otherwise, we delete the new one
|
||||||
@ -470,11 +470,11 @@ bool Object::HandleClick(Client* sender, const ClickObject_Struct* click_object)
|
|||||||
parse->EventPlayer(EVENT_PLAYER_PICKUP, sender, buf, 0, &args);
|
parse->EventPlayer(EVENT_PLAYER_PICKUP, sender, buf, 0, &args);
|
||||||
|
|
||||||
// Transfer item to client
|
// Transfer item to client
|
||||||
sender->PutItemInInventory(SLOT_CURSOR, *m_inst, false);
|
sender->PutItemInInventory(MainCursor, *m_inst, false);
|
||||||
sender->SendItemPacket(SLOT_CURSOR, m_inst, ItemPacketTrade);
|
sender->SendItemPacket(MainCursor, m_inst, ItemPacketTrade);
|
||||||
|
|
||||||
if(cursordelete) // delete the item if it's a duplicate lore. We have to do this because the client expects the item packet
|
if(cursordelete) // delete the item if it's a duplicate lore. We have to do this because the client expects the item packet
|
||||||
sender->DeleteItemInInventory(SLOT_CURSOR);
|
sender->DeleteItemInInventory(MainCursor);
|
||||||
|
|
||||||
if(!m_ground_spawn)
|
if(!m_ground_spawn)
|
||||||
safe_delete(m_inst);
|
safe_delete(m_inst);
|
||||||
|
|||||||
@ -166,7 +166,7 @@ bool Mob::AttackAnimation(SkillUseTypes &skillinuse, int Hand, const ItemInst* w
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If we're attacking with the secondary hand, play the dual wield anim
|
// If we're attacking with the secondary hand, play the dual wield anim
|
||||||
if (Hand == 14) // DW anim
|
if (Hand == MainSecondary) // DW anim
|
||||||
type = animDualWield;
|
type = animDualWield;
|
||||||
|
|
||||||
DoAnim(type);
|
DoAnim(type);
|
||||||
@ -960,7 +960,7 @@ int Mob::GetWeaponDamage(Mob *against, const ItemInst *weapon_item, uint32 *hate
|
|||||||
dmg = weapon_item->GetItem()->Damage;
|
dmg = weapon_item->GetItem()->Damage;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int x = 0; x < MAX_AUGMENT_SLOTS; x++){
|
for(int x = 0; x < EmuConstants::ITEM_COMMON_SIZE; x++){
|
||||||
if(weapon_item->GetAugment(x) && weapon_item->GetAugment(x)->GetItem()){
|
if(weapon_item->GetAugment(x) && weapon_item->GetAugment(x)->GetItem()){
|
||||||
dmg += weapon_item->GetAugment(x)->GetItem()->Damage;
|
dmg += weapon_item->GetAugment(x)->GetItem()->Damage;
|
||||||
if (hate) *hate += weapon_item->GetAugment(x)->GetItem()->Damage + weapon_item->GetAugment(x)->GetItem()->ElemDmgAmt;
|
if (hate) *hate += weapon_item->GetAugment(x)->GetItem()->Damage + weapon_item->GetAugment(x)->GetItem()->ElemDmgAmt;
|
||||||
@ -997,7 +997,7 @@ int Mob::GetWeaponDamage(Mob *against, const ItemInst *weapon_item, uint32 *hate
|
|||||||
dmg = weapon_item->GetItem()->Damage;
|
dmg = weapon_item->GetItem()->Damage;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int x = 0; x < MAX_AUGMENT_SLOTS; x++){
|
for (int x = 0; x < EmuConstants::ITEM_COMMON_SIZE; x++){
|
||||||
if(weapon_item->GetAugment(x) && weapon_item->GetAugment(x)->GetItem()){
|
if(weapon_item->GetAugment(x) && weapon_item->GetAugment(x)->GetItem()){
|
||||||
dmg += weapon_item->GetAugment(x)->GetItem()->Damage;
|
dmg += weapon_item->GetAugment(x)->GetItem()->Damage;
|
||||||
if (hate) *hate += weapon_item->GetAugment(x)->GetItem()->Damage + weapon_item->GetAugment(x)->GetItem()->ElemDmgAmt;
|
if (hate) *hate += weapon_item->GetAugment(x)->GetItem()->Damage + weapon_item->GetAugment(x)->GetItem()->ElemDmgAmt;
|
||||||
@ -1034,7 +1034,7 @@ int Mob::GetWeaponDamage(Mob *against, const ItemInst *weapon_item, uint32 *hate
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(weapon_item){
|
if(weapon_item){
|
||||||
for(int x = 0; x < MAX_AUGMENT_SLOTS; x++){
|
for (int x = 0; x < EmuConstants::ITEM_COMMON_SIZE; x++){
|
||||||
if(weapon_item->GetAugment(x) && weapon_item->GetAugment(x)->GetItem()){
|
if(weapon_item->GetAugment(x) && weapon_item->GetAugment(x)->GetItem()){
|
||||||
if(weapon_item->GetAugment(x)->GetItem()->ElemDmgAmt)
|
if(weapon_item->GetAugment(x)->GetItem()->ElemDmgAmt)
|
||||||
eledmg += (weapon_item->GetAugment(x)->GetItem()->ElemDmgAmt * against->ResistSpell(weapon_item->GetAugment(x)->GetItem()->ElemDmgType, 0, this) / 100);
|
eledmg += (weapon_item->GetAugment(x)->GetItem()->ElemDmgAmt * against->ResistSpell(weapon_item->GetAugment(x)->GetItem()->ElemDmgType, 0, this) / 100);
|
||||||
@ -1063,7 +1063,7 @@ int Mob::GetWeaponDamage(Mob *against, const ItemInst *weapon_item, uint32 *hate
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int x = 0; x < MAX_AUGMENT_SLOTS; x++){
|
for (int x = 0; x < EmuConstants::ITEM_COMMON_SIZE; x++){
|
||||||
if(weapon_item->GetAugment(x) && weapon_item->GetAugment(x)->GetItem()){
|
if(weapon_item->GetAugment(x) && weapon_item->GetAugment(x)->GetItem()){
|
||||||
if(weapon_item->GetAugment(x)->GetItem()->BaneDmgBody == against->GetBodyType()){
|
if(weapon_item->GetAugment(x)->GetItem()->BaneDmgBody == against->GetBodyType()){
|
||||||
banedmg += weapon_item->GetAugment(x)->GetItem()->BaneDmgAmt;
|
banedmg += weapon_item->GetAugment(x)->GetItem()->BaneDmgAmt;
|
||||||
@ -1108,7 +1108,7 @@ int Mob::GetWeaponDamage(Mob *against, const ItemInst *weapon_item, uint32 *hate
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int x = 0; x < MAX_AUGMENT_SLOTS; x++){
|
for (int x = 0; x < EmuConstants::ITEM_COMMON_SIZE; x++){
|
||||||
if(weapon_item->GetAugment(x) && weapon_item->GetAugment(x)->GetItem()){
|
if(weapon_item->GetAugment(x) && weapon_item->GetAugment(x)->GetItem()){
|
||||||
if(weapon_item->GetAugment(x)->GetItem()->BaneDmgBody == against->GetBodyType()){
|
if(weapon_item->GetAugment(x)->GetItem()->BaneDmgBody == against->GetBodyType()){
|
||||||
banedmg += weapon_item->GetAugment(x)->GetItem()->BaneDmgAmt;
|
banedmg += weapon_item->GetAugment(x)->GetItem()->BaneDmgAmt;
|
||||||
@ -1170,12 +1170,12 @@ bool Client::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, b
|
|||||||
|
|
||||||
|
|
||||||
ItemInst* weapon;
|
ItemInst* weapon;
|
||||||
if (Hand == 14){ // Kaiyodo - Pick weapon from the attacking hand
|
if (Hand == MainSecondary){ // Kaiyodo - Pick weapon from the attacking hand
|
||||||
weapon = GetInv().GetItem(SLOT_SECONDARY);
|
weapon = GetInv().GetItem(MainSecondary);
|
||||||
OffHandAtk(true);
|
OffHandAtk(true);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
weapon = GetInv().GetItem(SLOT_PRIMARY);
|
weapon = GetInv().GetItem(MainPrimary);
|
||||||
OffHandAtk(false);
|
OffHandAtk(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1244,7 +1244,7 @@ bool Client::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, b
|
|||||||
|
|
||||||
int ucDamageBonus = 0;
|
int ucDamageBonus = 0;
|
||||||
|
|
||||||
if( Hand == 13 && GetLevel() >= 28 && IsWarriorClass() )
|
if( Hand == MainPrimary && GetLevel() >= 28 && IsWarriorClass() )
|
||||||
{
|
{
|
||||||
// Damage bonuses apply only to hits from the main hand (Hand == 13) by characters level 28 and above
|
// Damage bonuses apply only to hits from the main hand (Hand == 13) by characters level 28 and above
|
||||||
// who belong to a melee class. If we're here, then all of these conditions apply.
|
// who belong to a melee class. If we're here, then all of these conditions apply.
|
||||||
@ -1257,7 +1257,7 @@ bool Client::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, b
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
//Live AA - Sinister Strikes *Adds weapon damage bonus to offhand weapon.
|
//Live AA - Sinister Strikes *Adds weapon damage bonus to offhand weapon.
|
||||||
if (Hand==14) {
|
if (Hand == MainSecondary) {
|
||||||
if (aabonuses.SecondaryDmgInc || itembonuses.SecondaryDmgInc || spellbonuses.SecondaryDmgInc){
|
if (aabonuses.SecondaryDmgInc || itembonuses.SecondaryDmgInc || spellbonuses.SecondaryDmgInc){
|
||||||
|
|
||||||
ucDamageBonus = GetWeaponDamageBonus( weapon ? weapon->GetItem() : (const Item_Struct*) nullptr );
|
ucDamageBonus = GetWeaponDamageBonus( weapon ? weapon->GetItem() : (const Item_Struct*) nullptr );
|
||||||
@ -1308,7 +1308,7 @@ bool Client::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, b
|
|||||||
if (damage == -3) {
|
if (damage == -3) {
|
||||||
if (bRiposte) return false;
|
if (bRiposte) return false;
|
||||||
else {
|
else {
|
||||||
if (Hand == 14) {// Do we even have it & was attack with mainhand? If not, don't bother with other calculations
|
if (Hand == MainSecondary) {// Do we even have it & was attack with mainhand? If not, don't bother with other calculations
|
||||||
//Live AA - SlipperyAttacks
|
//Live AA - SlipperyAttacks
|
||||||
//This spell effect most likely directly modifies the actual riposte chance when using offhand attack.
|
//This spell effect most likely directly modifies the actual riposte chance when using offhand attack.
|
||||||
int16 OffhandRiposteFail = aabonuses.OffhandRiposteFail + itembonuses.OffhandRiposteFail + spellbonuses.OffhandRiposteFail;
|
int16 OffhandRiposteFail = aabonuses.OffhandRiposteFail + itembonuses.OffhandRiposteFail + spellbonuses.OffhandRiposteFail;
|
||||||
@ -1741,28 +1741,28 @@ bool NPC::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, bool
|
|||||||
FaceTarget(GetTarget());
|
FaceTarget(GetTarget());
|
||||||
|
|
||||||
SkillUseTypes skillinuse = SkillHandtoHand;
|
SkillUseTypes skillinuse = SkillHandtoHand;
|
||||||
if (Hand == 13) {
|
if (Hand == MainPrimary) {
|
||||||
skillinuse = static_cast<SkillUseTypes>(GetPrimSkill());
|
skillinuse = static_cast<SkillUseTypes>(GetPrimSkill());
|
||||||
OffHandAtk(false);
|
OffHandAtk(false);
|
||||||
}
|
}
|
||||||
if (Hand == 14) {
|
if (Hand == MainSecondary) {
|
||||||
skillinuse = static_cast<SkillUseTypes>(GetSecSkill());
|
skillinuse = static_cast<SkillUseTypes>(GetSecSkill());
|
||||||
OffHandAtk(true);
|
OffHandAtk(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//figure out what weapon they are using, if any
|
//figure out what weapon they are using, if any
|
||||||
const Item_Struct* weapon = nullptr;
|
const Item_Struct* weapon = nullptr;
|
||||||
if (Hand == 13 && equipment[SLOT_PRIMARY] > 0)
|
if (Hand == MainPrimary && equipment[MainPrimary] > 0)
|
||||||
weapon = database.GetItem(equipment[SLOT_PRIMARY]);
|
weapon = database.GetItem(equipment[MainPrimary]);
|
||||||
else if (equipment[SLOT_SECONDARY])
|
else if (equipment[MainSecondary])
|
||||||
weapon = database.GetItem(equipment[SLOT_SECONDARY]);
|
weapon = database.GetItem(equipment[MainSecondary]);
|
||||||
|
|
||||||
//We dont factor much from the weapon into the attack.
|
//We dont factor much from the weapon into the attack.
|
||||||
//Just the skill type so it doesn't look silly using punching animations and stuff while wielding weapons
|
//Just the skill type so it doesn't look silly using punching animations and stuff while wielding weapons
|
||||||
if(weapon) {
|
if(weapon) {
|
||||||
mlog(COMBAT__ATTACKS, "Attacking with weapon: %s (%d) (too bad im not using it for much)", weapon->Name, weapon->ID);
|
mlog(COMBAT__ATTACKS, "Attacking with weapon: %s (%d) (too bad im not using it for much)", weapon->Name, weapon->ID);
|
||||||
|
|
||||||
if(Hand == 14 && weapon->ItemType == ItemTypeShield){
|
if(Hand == MainSecondary && weapon->ItemType == ItemTypeShield){
|
||||||
mlog(COMBAT__ATTACKS, "Attack with shield canceled.");
|
mlog(COMBAT__ATTACKS, "Attack with shield canceled.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -4000,7 +4000,7 @@ void Mob::TryWeaponProc(const ItemInst *inst, const Item_Struct *weapon, Mob *on
|
|||||||
proced = false;
|
proced = false;
|
||||||
|
|
||||||
if (!proced && inst) {
|
if (!proced && inst) {
|
||||||
for (int r = 0; r < MAX_AUGMENT_SLOTS; r++) {
|
for (int r = 0; r < EmuConstants::ITEM_COMMON_SIZE; r++) {
|
||||||
const ItemInst *aug_i = inst->GetAugment(r);
|
const ItemInst *aug_i = inst->GetAugment(r);
|
||||||
if (!aug_i) // no aug, try next slot!
|
if (!aug_i) // no aug, try next slot!
|
||||||
continue;
|
continue;
|
||||||
@ -4041,11 +4041,11 @@ void Mob::TrySpellProc(const ItemInst *inst, const Item_Struct *weapon, Mob *on,
|
|||||||
float ProcChance = 0.0f;
|
float ProcChance = 0.0f;
|
||||||
ProcChance = GetProcChances(ProcBonus, hand);
|
ProcChance = GetProcChances(ProcBonus, hand);
|
||||||
|
|
||||||
if (hand != 13) //Is Archery intened to proc at 50% rate?
|
if (hand != MainPrimary) //Is Archery intened to proc at 50% rate?
|
||||||
ProcChance /= 2;
|
ProcChance /= 2;
|
||||||
|
|
||||||
bool rangedattk = false;
|
bool rangedattk = false;
|
||||||
if (weapon && hand == 11) {
|
if (weapon && hand == MainRange) {
|
||||||
if (weapon->ItemType == ItemTypeArrow ||
|
if (weapon->ItemType == ItemTypeArrow ||
|
||||||
weapon->ItemType == ItemTypeLargeThrowing ||
|
weapon->ItemType == ItemTypeLargeThrowing ||
|
||||||
weapon->ItemType == ItemTypeSmallThrowing ||
|
weapon->ItemType == ItemTypeSmallThrowing ||
|
||||||
@ -4057,7 +4057,7 @@ void Mob::TrySpellProc(const ItemInst *inst, const Item_Struct *weapon, Mob *on,
|
|||||||
rangedattk = true;
|
rangedattk = true;
|
||||||
|
|
||||||
for (uint32 i = 0; i < MAX_PROCS; i++) {
|
for (uint32 i = 0; i < MAX_PROCS; i++) {
|
||||||
if (IsPet() && hand != 13) //Pets can only proc spell procs from their primay hand (ie; beastlord pets)
|
if (IsPet() && hand != MainPrimary) //Pets can only proc spell procs from their primay hand (ie; beastlord pets)
|
||||||
continue; // If pets ever can proc from off hand, this will need to change
|
continue; // If pets ever can proc from off hand, this will need to change
|
||||||
|
|
||||||
// Not ranged
|
// Not ranged
|
||||||
@ -4110,7 +4110,7 @@ void Mob::TrySpellProc(const ItemInst *inst, const Item_Struct *weapon, Mob *on,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HasSkillProcs() && hand != 11){ //We check ranged skill procs within the attack functions.
|
if (HasSkillProcs() && hand != MainRange){ //We check ranged skill procs within the attack functions.
|
||||||
uint16 skillinuse = 28;
|
uint16 skillinuse = 28;
|
||||||
if (weapon)
|
if (weapon)
|
||||||
skillinuse = GetSkillByItemType(weapon->ItemType);
|
skillinuse = GetSkillByItemType(weapon->ItemType);
|
||||||
@ -4356,7 +4356,7 @@ void Mob::DoRiposte(Mob* defender) {
|
|||||||
if (!defender)
|
if (!defender)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
defender->Attack(this, SLOT_PRIMARY, true);
|
defender->Attack(this, MainPrimary, true);
|
||||||
if (HasDied()) return;
|
if (HasDied()) return;
|
||||||
|
|
||||||
int16 DoubleRipChance = defender->aabonuses.GiveDoubleRiposte[0] +
|
int16 DoubleRipChance = defender->aabonuses.GiveDoubleRiposte[0] +
|
||||||
@ -4370,7 +4370,7 @@ void Mob::DoRiposte(Mob* defender) {
|
|||||||
//Live AA - Double Riposte
|
//Live AA - Double Riposte
|
||||||
if(DoubleRipChance && (DoubleRipChance >= MakeRandomInt(0, 100))) {
|
if(DoubleRipChance && (DoubleRipChance >= MakeRandomInt(0, 100))) {
|
||||||
mlog(COMBAT__ATTACKS, "Preforming a double riposed (%d percent chance)", DoubleRipChance);
|
mlog(COMBAT__ATTACKS, "Preforming a double riposed (%d percent chance)", DoubleRipChance);
|
||||||
defender->Attack(this, SLOT_PRIMARY, true);
|
defender->Attack(this, MainPrimary, true);
|
||||||
if (HasDied()) return;
|
if (HasDied()) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -139,21 +139,21 @@ void Client::CalcItemBonuses(StatBonuses* newbon) {
|
|||||||
|
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
//should not include 21 (SLOT_AMMO)
|
//should not include 21 (SLOT_AMMO)
|
||||||
for (i=0; i<21; i++) {
|
for (i = MainCharm; i < MainAmmo; i++) {
|
||||||
const ItemInst* inst = m_inv[i];
|
const ItemInst* inst = m_inv[i];
|
||||||
if(inst == 0)
|
if(inst == 0)
|
||||||
continue;
|
continue;
|
||||||
AddItemBonuses(inst, newbon);
|
AddItemBonuses(inst, newbon);
|
||||||
|
|
||||||
//Check if item is secondary slot is a 'shield'. Required for multiple spelll effects.
|
//Check if item is secondary slot is a 'shield'. Required for multiple spelll effects.
|
||||||
if (i == 14 && (m_inv.GetItem(14)->GetItem()->ItemType == ItemTypeShield))
|
if (i == MainSecondary && (m_inv.GetItem(MainSecondary)->GetItem()->ItemType == ItemTypeShield))
|
||||||
ShieldEquiped(true);
|
ShieldEquiped(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Power Source Slot
|
//Power Source Slot
|
||||||
if (GetClientVersion() >= EQClientSoF)
|
if (GetClientVersion() >= EQClientSoF)
|
||||||
{
|
{
|
||||||
const ItemInst* inst = m_inv[9999];
|
const ItemInst* inst = m_inv[MainPowerSource];
|
||||||
if(inst)
|
if(inst)
|
||||||
AddItemBonuses(inst, newbon);
|
AddItemBonuses(inst, newbon);
|
||||||
}
|
}
|
||||||
@ -528,7 +528,7 @@ void Client::AddItemBonuses(const ItemInst *inst, StatBonuses* newbon, bool isAu
|
|||||||
if (!isAug)
|
if (!isAug)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i = 0; i < MAX_AUGMENT_SLOTS; i++) {
|
for (i = 0; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
|
||||||
AddItemBonuses(inst->GetAugment(i),newbon,true);
|
AddItemBonuses(inst->GetAugment(i),newbon,true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2972,7 +2972,7 @@ void NPC::CalcItemBonuses(StatBonuses *newbon)
|
|||||||
{
|
{
|
||||||
if(newbon){
|
if(newbon){
|
||||||
|
|
||||||
for(int i = 0; i < MAX_WORN_INVENTORY; i++){
|
for(int i = 0; i < EmuConstants::EQUIPMENT_SIZE; i++){
|
||||||
const Item_Struct *cur = database.GetItem(equipment[i]);
|
const Item_Struct *cur = database.GetItem(equipment[i]);
|
||||||
if(cur){
|
if(cur){
|
||||||
//basic stats
|
//basic stats
|
||||||
@ -3091,7 +3091,7 @@ bool Client::CalcItemScale(uint32 slot_x, uint32 slot_y)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//iterate all augments
|
//iterate all augments
|
||||||
for(int x = 0; x < MAX_AUGMENT_SLOTS; ++x)
|
for (int x = 0; x < EmuConstants::ITEM_COMMON_SIZE; ++x)
|
||||||
{
|
{
|
||||||
ItemInst * a_inst = inst->GetAugment(x);
|
ItemInst * a_inst = inst->GetAugment(x);
|
||||||
if(!a_inst)
|
if(!a_inst)
|
||||||
@ -3160,7 +3160,7 @@ bool Client::DoItemEnterZone(uint32 slot_x, uint32 slot_y) {
|
|||||||
uint16 oldexp = inst->GetExp();
|
uint16 oldexp = inst->GetExp();
|
||||||
|
|
||||||
parse->EventItem(EVENT_ITEM_ENTER_ZONE, this, inst, nullptr, "", 0);
|
parse->EventItem(EVENT_ITEM_ENTER_ZONE, this, inst, nullptr, "", 0);
|
||||||
if(i < 22 || i == 9999) {
|
if(i <= MainAmmo || i == MainPowerSource) {
|
||||||
parse->EventItem(EVENT_EQUIP_ITEM, this, inst, nullptr, "", i);
|
parse->EventItem(EVENT_EQUIP_ITEM, this, inst, nullptr, "", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3170,7 +3170,7 @@ bool Client::DoItemEnterZone(uint32 slot_x, uint32 slot_y) {
|
|||||||
update_slot = true;
|
update_slot = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(i < 22 || i == 9999) {
|
if(i <= MainAmmo || i == MainPowerSource) {
|
||||||
parse->EventItem(EVENT_EQUIP_ITEM, this, inst, nullptr, "", i);
|
parse->EventItem(EVENT_EQUIP_ITEM, this, inst, nullptr, "", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3178,7 +3178,7 @@ bool Client::DoItemEnterZone(uint32 slot_x, uint32 slot_y) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//iterate all augments
|
//iterate all augments
|
||||||
for(int x = 0; x < MAX_AUGMENT_SLOTS; ++x)
|
for (int x = 0; x < EmuConstants::ITEM_COMMON_SIZE; ++x)
|
||||||
{
|
{
|
||||||
ItemInst *a_inst = inst->GetAugment(x);
|
ItemInst *a_inst = inst->GetAugment(x);
|
||||||
if(!a_inst)
|
if(!a_inst)
|
||||||
|
|||||||
251
zone/bot.cpp
251
zone/bot.cpp
@ -237,7 +237,7 @@ void Bot::SetBotSpellID(uint32 newSpellID) {
|
|||||||
uint32 Bot::GetBotArcheryRange() {
|
uint32 Bot::GetBotArcheryRange() {
|
||||||
uint32 result = 0;
|
uint32 result = 0;
|
||||||
|
|
||||||
ItemInst* rangeItem = GetBotItem(SLOT_RANGE);
|
ItemInst* rangeItem = GetBotItem(MainRange);
|
||||||
|
|
||||||
if(!rangeItem)
|
if(!rangeItem)
|
||||||
return 0;
|
return 0;
|
||||||
@ -257,7 +257,7 @@ uint32 Bot::GetBotArcheryRange() {
|
|||||||
archeryColor = botweapon->Color;
|
archeryColor = botweapon->Color;
|
||||||
range =+ botweapon->Range;
|
range =+ botweapon->Range;
|
||||||
|
|
||||||
rangeItem = GetBotItem(SLOT_AMMO);
|
rangeItem = GetBotItem(MainAmmo);
|
||||||
if(rangeItem)
|
if(rangeItem)
|
||||||
botweapon = rangeItem->GetItem();
|
botweapon = rangeItem->GetItem();
|
||||||
|
|
||||||
@ -280,8 +280,8 @@ void Bot::ChangeBotArcherWeapons(bool isArcher) {
|
|||||||
|| (GetClass()==SHADOWKNIGHT) || (GetClass()==ROGUE))
|
|| (GetClass()==SHADOWKNIGHT) || (GetClass()==ROGUE))
|
||||||
{
|
{
|
||||||
if(!isArcher) {
|
if(!isArcher) {
|
||||||
BotAddEquipItem(SLOT_PRIMARY, GetBotItemBySlot(SLOT_PRIMARY));
|
BotAddEquipItem(MainPrimary, GetBotItemBySlot(MainPrimary));
|
||||||
BotAddEquipItem(SLOT_SECONDARY, GetBotItemBySlot(SLOT_SECONDARY));
|
BotAddEquipItem(MainSecondary, GetBotItemBySlot(MainSecondary));
|
||||||
//archerbot->SendWearChange(MATERIAL_PRIMARY);
|
//archerbot->SendWearChange(MATERIAL_PRIMARY);
|
||||||
//archerbot->SendWearChange(MATERIAL_SECONDARY);
|
//archerbot->SendWearChange(MATERIAL_SECONDARY);
|
||||||
SetAttackTimer();
|
SetAttackTimer();
|
||||||
@ -290,11 +290,11 @@ void Bot::ChangeBotArcherWeapons(bool isArcher) {
|
|||||||
else {
|
else {
|
||||||
//archerbot->SendWearChange(MATERIAL_PRIMARY);
|
//archerbot->SendWearChange(MATERIAL_PRIMARY);
|
||||||
//archerbot->SendWearChange(MATERIAL_SECONDARY);
|
//archerbot->SendWearChange(MATERIAL_SECONDARY);
|
||||||
BotRemoveEquipItem(SLOT_PRIMARY);
|
BotRemoveEquipItem(MainPrimary);
|
||||||
BotRemoveEquipItem(SLOT_SECONDARY);
|
BotRemoveEquipItem(MainSecondary);
|
||||||
//archerbot->SendBotArcheryWearChange(MATERIAL_PRIMARY, archeryMaterial, archeryColor);
|
//archerbot->SendBotArcheryWearChange(MATERIAL_PRIMARY, archeryMaterial, archeryColor);
|
||||||
BotAddEquipItem(SLOT_AMMO, GetBotItemBySlot(SLOT_AMMO));
|
BotAddEquipItem(MainAmmo, GetBotItemBySlot(MainAmmo));
|
||||||
BotAddEquipItem(SLOT_SECONDARY, GetBotItemBySlot(SLOT_RANGE));
|
BotAddEquipItem(MainSecondary, GetBotItemBySlot(MainRange));
|
||||||
SetAttackTimer();
|
SetAttackTimer();
|
||||||
Say("My bow is true and ready.");
|
Say("My bow is true and ready.");
|
||||||
}
|
}
|
||||||
@ -1291,7 +1291,7 @@ void Bot::GenerateArmorClass()
|
|||||||
uint16 Bot::GetPrimarySkillValue()
|
uint16 Bot::GetPrimarySkillValue()
|
||||||
{
|
{
|
||||||
SkillUseTypes skill = HIGHEST_SKILL; //because nullptr == 0, which is 1H Slashing, & we want it to return 0 from GetSkill
|
SkillUseTypes skill = HIGHEST_SKILL; //because nullptr == 0, which is 1H Slashing, & we want it to return 0 from GetSkill
|
||||||
bool equiped = m_inv.GetItem(SLOT_PRIMARY);
|
bool equiped = m_inv.GetItem(MainPrimary);
|
||||||
|
|
||||||
if(!equiped)
|
if(!equiped)
|
||||||
{
|
{
|
||||||
@ -1299,7 +1299,7 @@ uint16 Bot::GetPrimarySkillValue()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
uint8 type = m_inv.GetItem(SLOT_PRIMARY)->GetItem()->ItemType; //is this the best way to do this?
|
uint8 type = m_inv.GetItem(MainPrimary)->GetItem()->ItemType; //is this the best way to do this?
|
||||||
switch(type)
|
switch(type)
|
||||||
{
|
{
|
||||||
case ItemType1HSlash: // 1H Slashing
|
case ItemType1HSlash: // 1H Slashing
|
||||||
@ -2630,7 +2630,7 @@ void Bot::LoadPet() {
|
|||||||
NPC *pet = GetPet()->CastToNPC();
|
NPC *pet = GetPet()->CastToNPC();
|
||||||
SpellBuff_Struct petBuffs[BUFF_COUNT];
|
SpellBuff_Struct petBuffs[BUFF_COUNT];
|
||||||
memset(petBuffs, 0, sizeof(petBuffs));
|
memset(petBuffs, 0, sizeof(petBuffs));
|
||||||
uint32 petItems[MAX_WORN_INVENTORY];
|
uint32 petItems[EmuConstants::EQUIPMENT_SIZE];
|
||||||
|
|
||||||
LoadPetBuffs(petBuffs, PetSaveId);
|
LoadPetBuffs(petBuffs, PetSaveId);
|
||||||
LoadPetItems(petItems, PetSaveId);
|
LoadPetItems(petItems, PetSaveId);
|
||||||
@ -2747,7 +2747,7 @@ void Bot::LoadPetItems(uint32* petItems, uint32 botPetSaveId) {
|
|||||||
int ItemCount = 0;
|
int ItemCount = 0;
|
||||||
|
|
||||||
while(DataRow = mysql_fetch_row(DatasetResult)) {
|
while(DataRow = mysql_fetch_row(DatasetResult)) {
|
||||||
if(ItemCount == MAX_WORN_INVENTORY)
|
if(ItemCount == EmuConstants::EQUIPMENT_SIZE)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
petItems[ItemCount] = atoi(DataRow[0]);
|
petItems[ItemCount] = atoi(DataRow[0]);
|
||||||
@ -2785,7 +2785,7 @@ void Bot::SavePet() {
|
|||||||
uint32 botPetId = pet->CastToNPC()->GetPetSpellID();
|
uint32 botPetId = pet->CastToNPC()->GetPetSpellID();
|
||||||
char* tempPetName = new char[64];
|
char* tempPetName = new char[64];
|
||||||
SpellBuff_Struct petBuffs[BUFF_COUNT];
|
SpellBuff_Struct petBuffs[BUFF_COUNT];
|
||||||
uint32 petItems[MAX_WORN_INVENTORY];
|
uint32 petItems[EmuConstants::EQUIPMENT_SIZE];
|
||||||
|
|
||||||
pet->GetPetState(petBuffs, petItems, tempPetName);
|
pet->GetPetState(petBuffs, petItems, tempPetName);
|
||||||
|
|
||||||
@ -2867,7 +2867,7 @@ void Bot::SavePetItems(uint32* petItems, uint32 botPetSaveId) {
|
|||||||
char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE];
|
char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE];
|
||||||
int ItemCount = 0;
|
int ItemCount = 0;
|
||||||
|
|
||||||
while(ItemCount < MAX_WORN_INVENTORY) {
|
while (ItemCount < EmuConstants::EQUIPMENT_SIZE) {
|
||||||
if(petItems[ItemCount] > 0) {
|
if(petItems[ItemCount] > 0) {
|
||||||
if(!database.RunQuery(Query, MakeAnyLenString(&Query, "INSERT INTO botpetinventory (BotPetsId, ItemId) VALUES(%u, %u);", botPetSaveId, petItems[ItemCount]), TempErrorMessageBuffer)) {
|
if(!database.RunQuery(Query, MakeAnyLenString(&Query, "INSERT INTO botpetinventory (BotPetsId, ItemId) VALUES(%u, %u);", botPetSaveId, petItems[ItemCount]), TempErrorMessageBuffer)) {
|
||||||
errorMessage = std::string(TempErrorMessageBuffer);
|
errorMessage = std::string(TempErrorMessageBuffer);
|
||||||
@ -3189,12 +3189,12 @@ void Bot::BotRangedAttack(Mob* other) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemInst* rangedItem = GetBotItem(SLOT_RANGE);
|
ItemInst* rangedItem = GetBotItem(MainRange);
|
||||||
const Item_Struct* RangeWeapon = 0;
|
const Item_Struct* RangeWeapon = 0;
|
||||||
if(rangedItem)
|
if(rangedItem)
|
||||||
RangeWeapon = rangedItem->GetItem();
|
RangeWeapon = rangedItem->GetItem();
|
||||||
|
|
||||||
ItemInst* ammoItem = GetBotItem(SLOT_AMMO);
|
ItemInst* ammoItem = GetBotItem(MainAmmo);
|
||||||
const Item_Struct* Ammo = 0;
|
const Item_Struct* Ammo = 0;
|
||||||
if(ammoItem)
|
if(ammoItem)
|
||||||
Ammo = ammoItem->GetItem();
|
Ammo = ammoItem->GetItem();
|
||||||
@ -3363,7 +3363,7 @@ void Bot::DoMeleeSkillAttackDmg(Mob* other, uint16 weapon_damage, SkillUseTypes
|
|||||||
damage = -5;
|
damage = -5;
|
||||||
|
|
||||||
if(skillinuse == SkillBash){
|
if(skillinuse == SkillBash){
|
||||||
const ItemInst* inst = GetBotItem(SLOT_SECONDARY);
|
const ItemInst* inst = GetBotItem(MainSecondary);
|
||||||
const Item_Struct* botweapon = 0;
|
const Item_Struct* botweapon = 0;
|
||||||
if(inst)
|
if(inst)
|
||||||
botweapon = inst->GetItem();
|
botweapon = inst->GetItem();
|
||||||
@ -3413,17 +3413,17 @@ void Bot::ApplySpecialAttackMod(SkillUseTypes skill, int32 &dmg, int32 &mindmg)
|
|||||||
case SkillFlyingKick:
|
case SkillFlyingKick:
|
||||||
case SkillRoundKick:
|
case SkillRoundKick:
|
||||||
case SkillKick:
|
case SkillKick:
|
||||||
item_slot = SLOT_FEET;
|
item_slot = MainFeet;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SkillBash:
|
case SkillBash:
|
||||||
item_slot = SLOT_SECONDARY;
|
item_slot = MainSecondary;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SkillDragonPunch:
|
case SkillDragonPunch:
|
||||||
case SkillEagleStrike:
|
case SkillEagleStrike:
|
||||||
case SkillTigerClaw:
|
case SkillTigerClaw:
|
||||||
item_slot = SLOT_HANDS;
|
item_slot = MainHands;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3775,27 +3775,27 @@ void Bot::AI_Process() {
|
|||||||
|
|
||||||
//try main hand first
|
//try main hand first
|
||||||
if(attack_timer.Check()) {
|
if(attack_timer.Check()) {
|
||||||
Attack(GetTarget(), SLOT_PRIMARY);
|
Attack(GetTarget(), MainPrimary);
|
||||||
|
|
||||||
ItemInst *wpn = GetBotItem(SLOT_PRIMARY);
|
ItemInst *wpn = GetBotItem(MainPrimary);
|
||||||
TryWeaponProc(wpn, GetTarget(), SLOT_PRIMARY);
|
TryWeaponProc(wpn, GetTarget(), MainPrimary);
|
||||||
|
|
||||||
bool tripleSuccess = false;
|
bool tripleSuccess = false;
|
||||||
|
|
||||||
if(BotOwner && GetTarget() && CanThisClassDoubleAttack()) {
|
if(BotOwner && GetTarget() && CanThisClassDoubleAttack()) {
|
||||||
|
|
||||||
if(BotOwner && CheckBotDoubleAttack()) {
|
if(BotOwner && CheckBotDoubleAttack()) {
|
||||||
Attack(GetTarget(), SLOT_PRIMARY, true);
|
Attack(GetTarget(), MainPrimary, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(BotOwner && GetTarget() && GetSpecialAbility(SPECATK_TRIPLE) && CheckBotDoubleAttack(true)) {
|
if(BotOwner && GetTarget() && GetSpecialAbility(SPECATK_TRIPLE) && CheckBotDoubleAttack(true)) {
|
||||||
tripleSuccess = true;
|
tripleSuccess = true;
|
||||||
Attack(GetTarget(), SLOT_PRIMARY, true);
|
Attack(GetTarget(), MainPrimary, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//quad attack, does this belong here??
|
//quad attack, does this belong here??
|
||||||
if(BotOwner && GetTarget() && GetSpecialAbility(SPECATK_QUAD) && CheckBotDoubleAttack(true)) {
|
if(BotOwner && GetTarget() && GetSpecialAbility(SPECATK_QUAD) && CheckBotDoubleAttack(true)) {
|
||||||
Attack(GetTarget(), SLOT_PRIMARY, true);
|
Attack(GetTarget(), MainPrimary, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3807,15 +3807,15 @@ void Bot::AI_Process() {
|
|||||||
if(MakeRandomInt(0, 100) < flurrychance)
|
if(MakeRandomInt(0, 100) < flurrychance)
|
||||||
{
|
{
|
||||||
Message_StringID(MT_NPCFlurry, YOU_FLURRY);
|
Message_StringID(MT_NPCFlurry, YOU_FLURRY);
|
||||||
Attack(GetTarget(), SLOT_PRIMARY, false);
|
Attack(GetTarget(), MainPrimary, false);
|
||||||
Attack(GetTarget(), SLOT_PRIMARY, false);
|
Attack(GetTarget(), MainPrimary, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int16 ExtraAttackChanceBonus = spellbonuses.ExtraAttackChance + itembonuses.ExtraAttackChance + aabonuses.ExtraAttackChance;
|
int16 ExtraAttackChanceBonus = spellbonuses.ExtraAttackChance + itembonuses.ExtraAttackChance + aabonuses.ExtraAttackChance;
|
||||||
|
|
||||||
if (GetTarget() && ExtraAttackChanceBonus) {
|
if (GetTarget() && ExtraAttackChanceBonus) {
|
||||||
ItemInst *wpn = GetBotItem(SLOT_PRIMARY);
|
ItemInst *wpn = GetBotItem(MainPrimary);
|
||||||
if(wpn){
|
if(wpn){
|
||||||
if(wpn->GetItem()->ItemType == ItemType2HSlash ||
|
if(wpn->GetItem()->ItemType == ItemType2HSlash ||
|
||||||
wpn->GetItem()->ItemType == ItemType2HBlunt ||
|
wpn->GetItem()->ItemType == ItemType2HBlunt ||
|
||||||
@ -3823,7 +3823,7 @@ void Bot::AI_Process() {
|
|||||||
{
|
{
|
||||||
if(MakeRandomInt(0, 100) < ExtraAttackChanceBonus)
|
if(MakeRandomInt(0, 100) < ExtraAttackChanceBonus)
|
||||||
{
|
{
|
||||||
Attack(GetTarget(), SLOT_PRIMARY, false);
|
Attack(GetTarget(), MainPrimary, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3843,7 +3843,7 @@ void Bot::AI_Process() {
|
|||||||
|
|
||||||
//now off hand
|
//now off hand
|
||||||
if(GetTarget() && attack_dw_timer.Check() && CanThisClassDualWield()) {
|
if(GetTarget() && attack_dw_timer.Check() && CanThisClassDualWield()) {
|
||||||
const ItemInst* instweapon = GetBotItem(SLOT_SECONDARY);
|
const ItemInst* instweapon = GetBotItem(MainSecondary);
|
||||||
const Item_Struct* weapon = 0;
|
const Item_Struct* weapon = 0;
|
||||||
//can only dual wield without a weapon if you're a monk
|
//can only dual wield without a weapon if you're a monk
|
||||||
if(instweapon || (botClass == MONK)) {
|
if(instweapon || (botClass == MONK)) {
|
||||||
@ -3870,14 +3870,14 @@ void Bot::AI_Process() {
|
|||||||
|
|
||||||
if (random < DualWieldProbability){ // Max 78% of DW
|
if (random < DualWieldProbability){ // Max 78% of DW
|
||||||
|
|
||||||
Attack(GetTarget(), SLOT_SECONDARY); // Single attack with offhand
|
Attack(GetTarget(), MainSecondary); // Single attack with offhand
|
||||||
|
|
||||||
ItemInst *wpn = GetBotItem(SLOT_SECONDARY);
|
ItemInst *wpn = GetBotItem(MainSecondary);
|
||||||
TryWeaponProc(wpn, GetTarget(), SLOT_SECONDARY);
|
TryWeaponProc(wpn, GetTarget(), MainSecondary);
|
||||||
|
|
||||||
if( CanThisClassDoubleAttack() && CheckBotDoubleAttack()) {
|
if( CanThisClassDoubleAttack() && CheckBotDoubleAttack()) {
|
||||||
if(GetTarget() && GetTarget()->GetHP() > -10)
|
if(GetTarget() && GetTarget()->GetHP() > -10)
|
||||||
Attack(GetTarget(), SLOT_SECONDARY); // Single attack with offhand
|
Attack(GetTarget(), MainSecondary); // Single attack with offhand
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4096,7 +4096,7 @@ void Bot::PetAIProcess() {
|
|||||||
if(!botPet->BehindMob(botPet->GetTarget(), botPet->GetX(), botPet->GetY()) && botPet->GetTarget()->IsEnraged())
|
if(!botPet->BehindMob(botPet->GetTarget(), botPet->GetX(), botPet->GetY()) && botPet->GetTarget()->IsEnraged())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(botPet->Attack(GetTarget(), SLOT_PRIMARY)) // try the main hand
|
if(botPet->Attack(GetTarget(), MainPrimary)) // try the main hand
|
||||||
if (botPet->GetTarget()) // Do we still have a target?
|
if (botPet->GetTarget()) // Do we still have a target?
|
||||||
{
|
{
|
||||||
// We're a pet so we re able to dual attack
|
// We're a pet so we re able to dual attack
|
||||||
@ -4411,7 +4411,7 @@ void Bot::GetBotItems(std::string* errorMessage, Inventory &inv) {
|
|||||||
|
|
||||||
ItemInst* inst = database.CreateItem(item_id, charges, aug[0], aug[1], aug[2], aug[3], aug[4]);
|
ItemInst* inst = database.CreateItem(item_id, charges, aug[0], aug[1], aug[2], aug[3], aug[4]);
|
||||||
if(inst) {
|
if(inst) {
|
||||||
int16 put_slot_id = SLOT_INVALID;
|
int16 put_slot_id = INVALID_INDEX;
|
||||||
if(instnodrop || ((slot_id >= 0) && (slot_id <= 21) && inst->GetItem()->Attuneable))
|
if(instnodrop || ((slot_id >= 0) && (slot_id <= 21) && inst->GetItem()->Attuneable))
|
||||||
inst->SetInstNoDrop(true);
|
inst->SetInstNoDrop(true);
|
||||||
if(color > 0)
|
if(color > 0)
|
||||||
@ -4429,7 +4429,7 @@ void Bot::GetBotItems(std::string* errorMessage, Inventory &inv) {
|
|||||||
safe_delete(inst);
|
safe_delete(inst);
|
||||||
|
|
||||||
// Save ptr to item in inventory
|
// Save ptr to item in inventory
|
||||||
if (put_slot_id == SLOT_INVALID) {
|
if (put_slot_id == INVALID_INDEX) {
|
||||||
LogFile->write(EQEMuLog::Error,
|
LogFile->write(EQEMuLog::Error,
|
||||||
"Warning: Invalid slot_id for item in inventory: botid=%i, item_id=%i, slot_id=%i",
|
"Warning: Invalid slot_id for item in inventory: botid=%i, item_id=%i, slot_id=%i",
|
||||||
this->GetBotID(), item_id, slot_id);
|
this->GetBotID(), item_id, slot_id);
|
||||||
@ -4595,7 +4595,7 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) {
|
|||||||
uint32 spawnedbotid = 0;
|
uint32 spawnedbotid = 0;
|
||||||
spawnedbotid = this->GetBotID();
|
spawnedbotid = this->GetBotID();
|
||||||
|
|
||||||
inst = GetBotItem(SLOT_HANDS);
|
inst = GetBotItem(MainHands);
|
||||||
if(inst) {
|
if(inst) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
if(item) {
|
if(item) {
|
||||||
@ -4604,7 +4604,7 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inst = GetBotItem(SLOT_HEAD);
|
inst = GetBotItem(MainHead);
|
||||||
if(inst) {
|
if(inst) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
if(item) {
|
if(item) {
|
||||||
@ -4613,7 +4613,7 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inst = GetBotItem(SLOT_ARMS);
|
inst = GetBotItem(MainArms);
|
||||||
if(inst) {
|
if(inst) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
if(item) {
|
if(item) {
|
||||||
@ -4622,7 +4622,7 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inst = GetBotItem(SLOT_BRACER01);
|
inst = GetBotItem(MainWrist1);
|
||||||
if(inst) {
|
if(inst) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
if(item) {
|
if(item) {
|
||||||
@ -4631,7 +4631,9 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inst = GetBotItem(SLOT_BRACER02);
|
/*
|
||||||
|
// non-live behavior
|
||||||
|
inst = GetBotItem(MainWrist2);
|
||||||
if(inst) {
|
if(inst) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
if(item) {
|
if(item) {
|
||||||
@ -4639,8 +4641,9 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) {
|
|||||||
ns->spawn.colors[MaterialWrist].color = GetEquipmentColor(MaterialWrist);
|
ns->spawn.colors[MaterialWrist].color = GetEquipmentColor(MaterialWrist);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
inst = GetBotItem(SLOT_CHEST);
|
inst = GetBotItem(MainChest);
|
||||||
if(inst) {
|
if(inst) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
if(item) {
|
if(item) {
|
||||||
@ -4649,7 +4652,7 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inst = GetBotItem(SLOT_LEGS);
|
inst = GetBotItem(MainLegs);
|
||||||
if(inst) {
|
if(inst) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
if(item) {
|
if(item) {
|
||||||
@ -4658,7 +4661,7 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inst = GetBotItem(SLOT_FEET);
|
inst = GetBotItem(MainFeet);
|
||||||
if(inst) {
|
if(inst) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
if(item) {
|
if(item) {
|
||||||
@ -4667,7 +4670,7 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inst = GetBotItem(SLOT_PRIMARY);
|
inst = GetBotItem(MainPrimary);
|
||||||
if(inst) {
|
if(inst) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
if(item) {
|
if(item) {
|
||||||
@ -4677,7 +4680,7 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inst = GetBotItem(SLOT_SECONDARY);
|
inst = GetBotItem(MainSecondary);
|
||||||
if(inst) {
|
if(inst) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
if(item) {
|
if(item) {
|
||||||
@ -6009,7 +6012,7 @@ void Bot::FinishTrade(Client* client, BotTradeType tradeType) {
|
|||||||
else if(tradeType == BotTradeClientNoDropNoTrade) {
|
else if(tradeType == BotTradeClientNoDropNoTrade) {
|
||||||
// Items being traded are found on the Client's cursor slot, slot id 30. This item can be either a single item or it can be a bag.
|
// Items being traded are found on the Client's cursor slot, slot id 30. This item can be either a single item or it can be a bag.
|
||||||
// If it is a bag, then we have to search for items in slots 331 thru 340
|
// If it is a bag, then we have to search for items in slots 331 thru 340
|
||||||
PerformTradeWithClient(SLOT_CURSOR, SLOT_CURSOR, client);
|
PerformTradeWithClient(MainCursor, MainCursor, client);
|
||||||
|
|
||||||
// TODO: Add logic here to test if the item in SLOT_CURSOR is a container type, if it is then we need to call the following:
|
// TODO: Add logic here to test if the item in SLOT_CURSOR is a container type, if it is then we need to call the following:
|
||||||
// PerformTradeWithClient(331, 340, client);
|
// PerformTradeWithClient(331, 340, client);
|
||||||
@ -6038,7 +6041,7 @@ void Bot::PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* cli
|
|||||||
charges[i] = inst->GetCharges();
|
charges[i] = inst->GetCharges();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(i == SLOT_CURSOR)
|
if (i == MainCursor)
|
||||||
UpdateClient = true;
|
UpdateClient = true;
|
||||||
|
|
||||||
//EQoffline: will give the items to the bots and change the bot stats
|
//EQoffline: will give the items to the bots and change the bot stats
|
||||||
@ -6046,7 +6049,7 @@ void Bot::PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* cli
|
|||||||
std::string TempErrorMessage;
|
std::string TempErrorMessage;
|
||||||
const Item_Struct* mWeaponItem = inst->GetItem();
|
const Item_Struct* mWeaponItem = inst->GetItem();
|
||||||
bool failedLoreCheck = false;
|
bool failedLoreCheck = false;
|
||||||
for(int m=0; m<MAX_AUGMENT_SLOTS; ++m) {
|
for (int m = 0; m<EmuConstants::ITEM_COMMON_SIZE; ++m) {
|
||||||
ItemInst *itm = inst->GetAugment(m);
|
ItemInst *itm = inst->GetAugment(m);
|
||||||
if(itm)
|
if(itm)
|
||||||
{
|
{
|
||||||
@ -6075,17 +6078,17 @@ void Bot::PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* cli
|
|||||||
if((mWeaponItem->Slots & (1 << j))) {
|
if((mWeaponItem->Slots & (1 << j))) {
|
||||||
how_many_slots++;
|
how_many_slots++;
|
||||||
if(!GetBotItem(j)) {
|
if(!GetBotItem(j)) {
|
||||||
if(j == SLOT_PRIMARY) {
|
if(j == MainPrimary) {
|
||||||
if((mWeaponItem->ItemType == ItemType2HSlash) || (mWeaponItem->ItemType == ItemType2HBlunt) || (mWeaponItem->ItemType == ItemType2HPiercing)) {
|
if((mWeaponItem->ItemType == ItemType2HSlash) || (mWeaponItem->ItemType == ItemType2HBlunt) || (mWeaponItem->ItemType == ItemType2HPiercing)) {
|
||||||
if(GetBotItem(SLOT_SECONDARY)) {
|
if(GetBotItem(MainSecondary)) {
|
||||||
if(mWeaponItem && (mWeaponItem->ItemType == ItemType2HSlash) || (mWeaponItem->ItemType == ItemType2HBlunt) || (mWeaponItem->ItemType == ItemType2HPiercing)) {
|
if(mWeaponItem && (mWeaponItem->ItemType == ItemType2HSlash) || (mWeaponItem->ItemType == ItemType2HBlunt) || (mWeaponItem->ItemType == ItemType2HPiercing)) {
|
||||||
if(client->CheckLoreConflict(GetBotItem(SLOT_SECONDARY)->GetItem())) {
|
if(client->CheckLoreConflict(GetBotItem(MainSecondary)->GetItem())) {
|
||||||
failedLoreCheck = true;
|
failedLoreCheck = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ItemInst* remove_item = GetBotItem(SLOT_SECONDARY);
|
ItemInst* remove_item = GetBotItem(MainSecondary);
|
||||||
BotTradeSwapItem(client, SLOT_SECONDARY, 0, remove_item, remove_item->GetItem()->Slots, &TempErrorMessage, false);
|
BotTradeSwapItem(client, MainSecondary, 0, remove_item, remove_item->GetItem()->Slots, &TempErrorMessage, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6095,7 +6098,7 @@ void Bot::PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* cli
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if(j == SLOT_SECONDARY) {
|
else if(j == MainSecondary) {
|
||||||
if(inst->IsWeapon()) {
|
if(inst->IsWeapon()) {
|
||||||
if(CanThisClassDualWield()) {
|
if(CanThisClassDualWield()) {
|
||||||
BotTradeAddItem(mWeaponItem->ID, inst, inst->GetCharges(), mWeaponItem->Slots, j, &TempErrorMessage);
|
BotTradeAddItem(mWeaponItem->ID, inst, inst->GetCharges(), mWeaponItem->Slots, j, &TempErrorMessage);
|
||||||
@ -6111,10 +6114,10 @@ void Bot::PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* cli
|
|||||||
success = true;
|
success = true;
|
||||||
}
|
}
|
||||||
if(success) {
|
if(success) {
|
||||||
if(GetBotItem(SLOT_PRIMARY)) {
|
if(GetBotItem(MainPrimary)) {
|
||||||
ItemInst* remove_item = GetBotItem(SLOT_PRIMARY);
|
ItemInst* remove_item = GetBotItem(MainPrimary);
|
||||||
if((remove_item->GetItem()->ItemType == ItemType2HSlash) || (remove_item->GetItem()->ItemType == ItemType2HBlunt) || (remove_item->GetItem()->ItemType == ItemType2HPiercing)) {
|
if((remove_item->GetItem()->ItemType == ItemType2HSlash) || (remove_item->GetItem()->ItemType == ItemType2HBlunt) || (remove_item->GetItem()->ItemType == ItemType2HPiercing)) {
|
||||||
BotTradeSwapItem(client, SLOT_PRIMARY, 0, remove_item, remove_item->GetItem()->Slots, &TempErrorMessage, false);
|
BotTradeSwapItem(client, MainPrimary, 0, remove_item, remove_item->GetItem()->Slots, &TempErrorMessage, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -6133,7 +6136,7 @@ void Bot::PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* cli
|
|||||||
if((mWeaponItem->Slots & (1 << j))) {
|
if((mWeaponItem->Slots & (1 << j))) {
|
||||||
swap_item = GetBotItem(j);
|
swap_item = GetBotItem(j);
|
||||||
failedLoreCheck = false;
|
failedLoreCheck = false;
|
||||||
for(int k=0; k<MAX_AUGMENT_SLOTS; ++k) {
|
for (int k = 0; k<EmuConstants::ITEM_COMMON_SIZE; ++k) {
|
||||||
ItemInst *itm = swap_item->GetAugment(k);
|
ItemInst *itm = swap_item->GetAugment(k);
|
||||||
if(itm)
|
if(itm)
|
||||||
{
|
{
|
||||||
@ -6146,28 +6149,28 @@ void Bot::PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* cli
|
|||||||
failedLoreCheck = true;
|
failedLoreCheck = true;
|
||||||
}
|
}
|
||||||
if(!failedLoreCheck) {
|
if(!failedLoreCheck) {
|
||||||
if(j == SLOT_PRIMARY) {
|
if(j == MainPrimary) {
|
||||||
if((mWeaponItem->ItemType == ItemType2HSlash) || (mWeaponItem->ItemType == ItemType2HBlunt) || (mWeaponItem->ItemType == ItemType2HPiercing)) {
|
if((mWeaponItem->ItemType == ItemType2HSlash) || (mWeaponItem->ItemType == ItemType2HBlunt) || (mWeaponItem->ItemType == ItemType2HPiercing)) {
|
||||||
if(GetBotItem(SLOT_SECONDARY)) {
|
if(GetBotItem(MainSecondary)) {
|
||||||
if(client->CheckLoreConflict(GetBotItem(SLOT_SECONDARY)->GetItem())) {
|
if(client->CheckLoreConflict(GetBotItem(MainSecondary)->GetItem())) {
|
||||||
failedLoreCheck = true;
|
failedLoreCheck = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ItemInst* remove_item = GetBotItem(SLOT_SECONDARY);
|
ItemInst* remove_item = GetBotItem(MainSecondary);
|
||||||
BotTradeSwapItem(client, SLOT_SECONDARY, 0, remove_item, remove_item->GetItem()->Slots, &TempErrorMessage, false);
|
BotTradeSwapItem(client, MainSecondary, 0, remove_item, remove_item->GetItem()->Slots, &TempErrorMessage, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!failedLoreCheck) {
|
if(!failedLoreCheck) {
|
||||||
BotTradeSwapItem(client, SLOT_PRIMARY, inst, swap_item, mWeaponItem->Slots, &TempErrorMessage);
|
BotTradeSwapItem(client, MainPrimary, inst, swap_item, mWeaponItem->Slots, &TempErrorMessage);
|
||||||
success = true;
|
success = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if(j == SLOT_SECONDARY) {
|
else if(j == MainSecondary) {
|
||||||
if(inst->IsWeapon()) {
|
if(inst->IsWeapon()) {
|
||||||
if(CanThisClassDualWield()) {
|
if(CanThisClassDualWield()) {
|
||||||
BotTradeSwapItem(client, SLOT_SECONDARY, inst, swap_item, mWeaponItem->Slots, &TempErrorMessage);
|
BotTradeSwapItem(client, MainSecondary, inst, swap_item, mWeaponItem->Slots, &TempErrorMessage);
|
||||||
success = true;
|
success = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -6176,13 +6179,13 @@ void Bot::PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* cli
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
BotTradeSwapItem(client, SLOT_SECONDARY, inst, swap_item, mWeaponItem->Slots, &TempErrorMessage);
|
BotTradeSwapItem(client, MainSecondary, inst, swap_item, mWeaponItem->Slots, &TempErrorMessage);
|
||||||
success = true;
|
success = true;
|
||||||
}
|
}
|
||||||
if(success && GetBotItem(SLOT_PRIMARY)) {
|
if(success && GetBotItem(MainPrimary)) {
|
||||||
ItemInst* remove_item = GetBotItem(SLOT_PRIMARY);
|
ItemInst* remove_item = GetBotItem(MainPrimary);
|
||||||
if((remove_item->GetItem()->ItemType == ItemType2HSlash) || (remove_item->GetItem()->ItemType == ItemType2HBlunt) || (remove_item->GetItem()->ItemType == ItemType2HPiercing)) {
|
if((remove_item->GetItem()->ItemType == ItemType2HSlash) || (remove_item->GetItem()->ItemType == ItemType2HBlunt) || (remove_item->GetItem()->ItemType == ItemType2HPiercing)) {
|
||||||
BotTradeSwapItem(client, SLOT_PRIMARY, 0, remove_item, remove_item->GetItem()->Slots, &TempErrorMessage, false);
|
BotTradeSwapItem(client, MainPrimary, 0, remove_item, remove_item->GetItem()->Slots, &TempErrorMessage, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -6441,12 +6444,12 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b
|
|||||||
FaceTarget(GetTarget());
|
FaceTarget(GetTarget());
|
||||||
|
|
||||||
ItemInst* weapon = nullptr;
|
ItemInst* weapon = nullptr;
|
||||||
if(Hand == SLOT_PRIMARY) {
|
if(Hand == MainPrimary) {
|
||||||
weapon = GetBotItem(SLOT_PRIMARY);
|
weapon = GetBotItem(MainPrimary);
|
||||||
OffHandAtk(false);
|
OffHandAtk(false);
|
||||||
}
|
}
|
||||||
if(Hand == SLOT_SECONDARY) {
|
if(Hand == MainSecondary) {
|
||||||
weapon = GetBotItem(SLOT_SECONDARY);
|
weapon = GetBotItem(MainSecondary);
|
||||||
OffHandAtk(true);
|
OffHandAtk(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6513,7 +6516,7 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b
|
|||||||
|
|
||||||
int ucDamageBonus = 0;
|
int ucDamageBonus = 0;
|
||||||
|
|
||||||
if( Hand == SLOT_PRIMARY && GetLevel() >= 28 && IsWarriorClass() )
|
if( Hand == MainPrimary && GetLevel() >= 28 && IsWarriorClass() )
|
||||||
{
|
{
|
||||||
// Damage bonuses apply only to hits from the main hand (Hand == 13) by characters level 28 and above
|
// Damage bonuses apply only to hits from the main hand (Hand == 13) by characters level 28 and above
|
||||||
// who belong to a melee class. If we're here, then all of these conditions apply.
|
// who belong to a melee class. If we're here, then all of these conditions apply.
|
||||||
@ -6526,7 +6529,7 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
//Live AA - Sinister Strikes *Adds weapon damage bonus to offhand weapon.
|
//Live AA - Sinister Strikes *Adds weapon damage bonus to offhand weapon.
|
||||||
if (Hand==SLOT_SECONDARY) {
|
if (Hand==MainSecondary) {
|
||||||
if (aabonuses.SecondaryDmgInc || itembonuses.SecondaryDmgInc || spellbonuses.SecondaryDmgInc){
|
if (aabonuses.SecondaryDmgInc || itembonuses.SecondaryDmgInc || spellbonuses.SecondaryDmgInc){
|
||||||
|
|
||||||
ucDamageBonus = GetWeaponDamageBonus( weapon ? weapon->GetItem() : (const Item_Struct*) nullptr );
|
ucDamageBonus = GetWeaponDamageBonus( weapon ? weapon->GetItem() : (const Item_Struct*) nullptr );
|
||||||
@ -6583,7 +6586,7 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b
|
|||||||
if (damage == -3) {
|
if (damage == -3) {
|
||||||
if (FromRiposte) return false;
|
if (FromRiposte) return false;
|
||||||
else {
|
else {
|
||||||
if (Hand == SLOT_SECONDARY) {// Do we even have it & was attack with mainhand? If not, don't bother with other calculations
|
if (Hand == MainSecondary) {// Do we even have it & was attack with mainhand? If not, don't bother with other calculations
|
||||||
//Live AA - SlipperyAttacks
|
//Live AA - SlipperyAttacks
|
||||||
//This spell effect most likely directly modifies the actual riposte chance when using offhand attack.
|
//This spell effect most likely directly modifies the actual riposte chance when using offhand attack.
|
||||||
int16 OffhandRiposteFail = aabonuses.OffhandRiposteFail + itembonuses.OffhandRiposteFail + spellbonuses.OffhandRiposteFail;
|
int16 OffhandRiposteFail = aabonuses.OffhandRiposteFail + itembonuses.OffhandRiposteFail + spellbonuses.OffhandRiposteFail;
|
||||||
@ -7160,7 +7163,7 @@ int16 Bot::GetBotFocusEffect(BotfocusType bottype, uint16 spell_id) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int y = 0; y < MAX_AUGMENT_SLOTS; ++y)
|
for (int y = 0; y < EmuConstants::ITEM_COMMON_SIZE; ++y)
|
||||||
{
|
{
|
||||||
ItemInst *aug = nullptr;
|
ItemInst *aug = nullptr;
|
||||||
aug = ins->GetAugment(y);
|
aug = ins->GetAugment(y);
|
||||||
@ -7737,13 +7740,13 @@ float Bot::GetProcChances(float ProcBonus, uint16 hand) {
|
|||||||
float ProcChance = 0.0f;
|
float ProcChance = 0.0f;
|
||||||
uint16 weapon_speed = 0;
|
uint16 weapon_speed = 0;
|
||||||
switch (hand) {
|
switch (hand) {
|
||||||
case SLOT_PRIMARY:
|
case MainPrimary:
|
||||||
weapon_speed = attack_timer.GetDuration();
|
weapon_speed = attack_timer.GetDuration();
|
||||||
break;
|
break;
|
||||||
case SLOT_SECONDARY:
|
case MainSecondary:
|
||||||
weapon_speed = attack_dw_timer.GetDuration();
|
weapon_speed = attack_dw_timer.GetDuration();
|
||||||
break;
|
break;
|
||||||
case SLOT_RANGE:
|
case MainRange:
|
||||||
weapon_speed = ranged_timer.GetDuration();
|
weapon_speed = ranged_timer.GetDuration();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -7860,9 +7863,9 @@ bool Bot::AvoidDamage(Mob* other, int32 &damage, bool CanRiposte)
|
|||||||
|
|
||||||
if(damage > 0 && (aabonuses.ShieldBlock || spellbonuses.ShieldBlock || itembonuses.ShieldBlock)
|
if(damage > 0 && (aabonuses.ShieldBlock || spellbonuses.ShieldBlock || itembonuses.ShieldBlock)
|
||||||
&& (!other->BehindMob(this, other->GetX(), other->GetY()) || bShieldBlockFromRear)) {
|
&& (!other->BehindMob(this, other->GetX(), other->GetY()) || bShieldBlockFromRear)) {
|
||||||
bool equiped = GetBotItem(SLOT_SECONDARY);
|
bool equiped = GetBotItem(MainSecondary);
|
||||||
if(equiped) {
|
if(equiped) {
|
||||||
uint8 shield = GetBotItem(SLOT_SECONDARY)->GetItem()->ItemType;
|
uint8 shield = GetBotItem(MainSecondary)->GetItem()->ItemType;
|
||||||
float bonusShieldBlock = 0.0f;
|
float bonusShieldBlock = 0.0f;
|
||||||
if(shield == ItemTypeShield) {
|
if(shield == ItemTypeShield) {
|
||||||
|
|
||||||
@ -7875,9 +7878,9 @@ bool Bot::AvoidDamage(Mob* other, int32 &damage, bool CanRiposte)
|
|||||||
|
|
||||||
if(damage > 0 && (aabonuses.TwoHandBluntBlock || spellbonuses.TwoHandBluntBlock || itembonuses.TwoHandBluntBlock)
|
if(damage > 0 && (aabonuses.TwoHandBluntBlock || spellbonuses.TwoHandBluntBlock || itembonuses.TwoHandBluntBlock)
|
||||||
&& (!other->BehindMob(this, other->GetX(), other->GetY()) || bShieldBlockFromRear)) {
|
&& (!other->BehindMob(this, other->GetX(), other->GetY()) || bShieldBlockFromRear)) {
|
||||||
bool equiped2 = GetBotItem(SLOT_PRIMARY);
|
bool equiped2 = GetBotItem(MainPrimary);
|
||||||
if(equiped2) {
|
if(equiped2) {
|
||||||
uint8 TwoHandBlunt = GetBotItem(SLOT_PRIMARY)->GetItem()->ItemType;
|
uint8 TwoHandBlunt = GetBotItem(MainPrimary)->GetItem()->ItemType;
|
||||||
float bonusStaffBlock = 0.0f;
|
float bonusStaffBlock = 0.0f;
|
||||||
if(TwoHandBlunt == ItemType2HBlunt) {
|
if(TwoHandBlunt == ItemType2HBlunt) {
|
||||||
|
|
||||||
@ -8015,7 +8018,7 @@ void Bot::DoRiposte(Mob* defender) {
|
|||||||
if (!defender)
|
if (!defender)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
defender->Attack(this, SLOT_PRIMARY, true);
|
defender->Attack(this, MainPrimary, true);
|
||||||
|
|
||||||
//double riposte
|
//double riposte
|
||||||
int16 DoubleRipChance = defender->GetAABonuses().GiveDoubleRiposte[0] +
|
int16 DoubleRipChance = defender->GetAABonuses().GiveDoubleRiposte[0] +
|
||||||
@ -8025,7 +8028,7 @@ void Bot::DoRiposte(Mob* defender) {
|
|||||||
if(DoubleRipChance && (DoubleRipChance >= MakeRandomInt(0, 100))) {
|
if(DoubleRipChance && (DoubleRipChance >= MakeRandomInt(0, 100))) {
|
||||||
mlog(COMBAT__ATTACKS, "Preforming a double riposte (%d percent chance)", DoubleRipChance);
|
mlog(COMBAT__ATTACKS, "Preforming a double riposte (%d percent chance)", DoubleRipChance);
|
||||||
|
|
||||||
defender->Attack(this, SLOT_PRIMARY, true);
|
defender->Attack(this, MainPrimary, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Double Riposte effect, allows for a chance to do RIPOSTE with a skill specfic special attack (ie Return Kick).
|
//Double Riposte effect, allows for a chance to do RIPOSTE with a skill specfic special attack (ie Return Kick).
|
||||||
@ -8049,7 +8052,7 @@ void Bot::DoSpecialAttackDamage(Mob *who, SkillUseTypes skill, int32 max_damage,
|
|||||||
hate = hate_override;
|
hate = hate_override;
|
||||||
|
|
||||||
if(skill == SkillBash) {
|
if(skill == SkillBash) {
|
||||||
const ItemInst* inst = GetBotItem(SLOT_SECONDARY);
|
const ItemInst* inst = GetBotItem(MainSecondary);
|
||||||
const Item_Struct* botweapon = 0;
|
const Item_Struct* botweapon = 0;
|
||||||
if(inst)
|
if(inst)
|
||||||
botweapon = inst->GetItem();
|
botweapon = inst->GetItem();
|
||||||
@ -8063,7 +8066,7 @@ void Bot::DoSpecialAttackDamage(Mob *who, SkillUseTypes skill, int32 max_damage,
|
|||||||
|
|
||||||
min_damage += min_damage * GetMeleeMinDamageMod_SE(skill) / 100;
|
min_damage += min_damage * GetMeleeMinDamageMod_SE(skill) / 100;
|
||||||
|
|
||||||
if(HitChance && !who->CheckHitChance(this, skill, SLOT_PRIMARY))
|
if(HitChance && !who->CheckHitChance(this, skill, MainPrimary))
|
||||||
max_damage = 0;
|
max_damage = 0;
|
||||||
|
|
||||||
else{
|
else{
|
||||||
@ -8120,7 +8123,7 @@ void Bot::TryBackstab(Mob *other, int ReuseTime) {
|
|||||||
bool bIsBehind = false;
|
bool bIsBehind = false;
|
||||||
bool bCanFrontalBS = false;
|
bool bCanFrontalBS = false;
|
||||||
|
|
||||||
const ItemInst* inst = GetBotItem(SLOT_PRIMARY);
|
const ItemInst* inst = GetBotItem(MainPrimary);
|
||||||
const Item_Struct* botpiercer = nullptr;
|
const Item_Struct* botpiercer = nullptr;
|
||||||
if(inst)
|
if(inst)
|
||||||
botpiercer = inst->GetItem();
|
botpiercer = inst->GetItem();
|
||||||
@ -8206,11 +8209,11 @@ void Bot::RogueBackstab(Mob* other, bool min_damage, int ReuseTime)
|
|||||||
int32 primaryweapondamage = 0;
|
int32 primaryweapondamage = 0;
|
||||||
int32 backstab_dmg = 0;
|
int32 backstab_dmg = 0;
|
||||||
|
|
||||||
ItemInst* botweaponInst = GetBotItem(SLOT_PRIMARY);
|
ItemInst* botweaponInst = GetBotItem(MainPrimary);
|
||||||
if(botweaponInst) {
|
if(botweaponInst) {
|
||||||
primaryweapondamage = GetWeaponDamage(other, botweaponInst);
|
primaryweapondamage = GetWeaponDamage(other, botweaponInst);
|
||||||
backstab_dmg = botweaponInst->GetItem()->BackstabDmg;
|
backstab_dmg = botweaponInst->GetItem()->BackstabDmg;
|
||||||
for(int i = 0; i < MAX_AUGMENT_SLOTS; ++i)
|
for (int i = 0; i < EmuConstants::ITEM_COMMON_SIZE; ++i)
|
||||||
{
|
{
|
||||||
ItemInst *aug = botweaponInst->GetAugment(i);
|
ItemInst *aug = botweaponInst->GetAugment(i);
|
||||||
if(aug)
|
if(aug)
|
||||||
@ -8276,7 +8279,7 @@ void Bot::RogueBackstab(Mob* other, bool min_damage, int ReuseTime)
|
|||||||
|
|
||||||
void Bot::RogueAssassinate(Mob* other)
|
void Bot::RogueAssassinate(Mob* other)
|
||||||
{
|
{
|
||||||
ItemInst* botweaponInst = GetBotItem(SLOT_PRIMARY);
|
ItemInst* botweaponInst = GetBotItem(MainPrimary);
|
||||||
if(botweaponInst) {
|
if(botweaponInst) {
|
||||||
if(GetWeaponDamage(other, botweaponInst)) {
|
if(GetWeaponDamage(other, botweaponInst)) {
|
||||||
other->Damage(this, 32000, SPELL_UNKNOWN, SkillBackstab);
|
other->Damage(this, 32000, SPELL_UNKNOWN, SkillBackstab);
|
||||||
@ -8366,10 +8369,10 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) {
|
|||||||
if(level >= RuleI(Combat, NPCBashKickLevel)){
|
if(level >= RuleI(Combat, NPCBashKickLevel)){
|
||||||
bool canBash = false;
|
bool canBash = false;
|
||||||
if((GetRace() == OGRE || GetRace() == TROLL || GetRace() == BARBARIAN) // Racial Slam
|
if((GetRace() == OGRE || GetRace() == TROLL || GetRace() == BARBARIAN) // Racial Slam
|
||||||
|| (m_inv.GetItem(SLOT_SECONDARY) && m_inv.GetItem(SLOT_SECONDARY)->GetItem()->ItemType == ItemTypeShield) //Using Shield
|
|| (m_inv.GetItem(MainSecondary) && m_inv.GetItem(MainSecondary)->GetItem()->ItemType == ItemTypeShield) //Using Shield
|
||||||
|| (m_inv.GetItem(SLOT_PRIMARY) && (m_inv.GetItem(SLOT_PRIMARY)->GetItem()->ItemType == ItemType2HSlash
|
|| (m_inv.GetItem(MainPrimary) && (m_inv.GetItem(MainPrimary)->GetItem()->ItemType == ItemType2HSlash
|
||||||
|| m_inv.GetItem(SLOT_PRIMARY)->GetItem()->ItemType == ItemType2HBlunt
|
|| m_inv.GetItem(MainPrimary)->GetItem()->ItemType == ItemType2HBlunt
|
||||||
|| m_inv.GetItem(SLOT_PRIMARY)->GetItem()->ItemType == ItemType2HPiercing)
|
|| m_inv.GetItem(MainPrimary)->GetItem()->ItemType == ItemType2HPiercing)
|
||||||
&& GetAA(aa2HandBash) >= 1)) { //Using 2 hand weapon, but has AA 2 Hand Bash
|
&& GetAA(aa2HandBash) >= 1)) { //Using 2 hand weapon, but has AA 2 Hand Bash
|
||||||
canBash = true;
|
canBash = true;
|
||||||
}
|
}
|
||||||
@ -8393,10 +8396,10 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) {
|
|||||||
case PALADIN:
|
case PALADIN:
|
||||||
if(level >= RuleI(Combat, NPCBashKickLevel)){
|
if(level >= RuleI(Combat, NPCBashKickLevel)){
|
||||||
if((GetRace() == OGRE || GetRace() == TROLL || GetRace() == BARBARIAN) // Racial Slam
|
if((GetRace() == OGRE || GetRace() == TROLL || GetRace() == BARBARIAN) // Racial Slam
|
||||||
|| (m_inv.GetItem(SLOT_SECONDARY) && m_inv.GetItem(SLOT_SECONDARY)->GetItem()->ItemType == ItemTypeShield) //Using Shield
|
|| (m_inv.GetItem(MainSecondary) && m_inv.GetItem(MainSecondary)->GetItem()->ItemType == ItemTypeShield) //Using Shield
|
||||||
|| (m_inv.GetItem(SLOT_PRIMARY) && (m_inv.GetItem(SLOT_PRIMARY)->GetItem()->ItemType == ItemType2HSlash
|
|| (m_inv.GetItem(MainPrimary) && (m_inv.GetItem(MainPrimary)->GetItem()->ItemType == ItemType2HSlash
|
||||||
|| m_inv.GetItem(SLOT_PRIMARY)->GetItem()->ItemType == ItemType2HBlunt
|
|| m_inv.GetItem(MainPrimary)->GetItem()->ItemType == ItemType2HBlunt
|
||||||
|| m_inv.GetItem(SLOT_PRIMARY)->GetItem()->ItemType == ItemType2HPiercing)
|
|| m_inv.GetItem(MainPrimary)->GetItem()->ItemType == ItemType2HPiercing)
|
||||||
&& GetAA(aa2HandBash) >= 1)) { //Using 2 hand weapon, but has AA 2 Hand Bash
|
&& GetAA(aa2HandBash) >= 1)) { //Using 2 hand weapon, but has AA 2 Hand Bash
|
||||||
skill_to_use = SkillBash;
|
skill_to_use = SkillBash;
|
||||||
}
|
}
|
||||||
@ -8443,8 +8446,8 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) {
|
|||||||
{
|
{
|
||||||
DoAnim(animTailRake);
|
DoAnim(animTailRake);
|
||||||
|
|
||||||
if(GetWeaponDamage(target, GetBotItem(SLOT_SECONDARY)) <= 0 &&
|
if(GetWeaponDamage(target, GetBotItem(MainSecondary)) <= 0 &&
|
||||||
GetWeaponDamage(target, GetBotItem(SLOT_SHOULDER)) <= 0){
|
GetWeaponDamage(target, GetBotItem(MainShoulders)) <= 0){
|
||||||
dmg = -5;
|
dmg = -5;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@ -8519,7 +8522,7 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) {
|
|||||||
{
|
{
|
||||||
DoAnim(animKick);
|
DoAnim(animKick);
|
||||||
|
|
||||||
if(GetWeaponDamage(target, GetBotItem(SLOT_FEET)) <= 0){
|
if(GetWeaponDamage(target, GetBotItem(MainFeet)) <= 0){
|
||||||
dmg = -5;
|
dmg = -5;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@ -8991,14 +8994,14 @@ void Bot::SetAttackTimer() {
|
|||||||
Timer* TimerToUse = nullptr;
|
Timer* TimerToUse = nullptr;
|
||||||
const Item_Struct* PrimaryWeapon = nullptr;
|
const Item_Struct* PrimaryWeapon = nullptr;
|
||||||
|
|
||||||
for (int i=SLOT_RANGE; i<=SLOT_SECONDARY; i++) {
|
for (int i=MainRange; i<=MainSecondary; i++) {
|
||||||
|
|
||||||
//pick a timer
|
//pick a timer
|
||||||
if (i == SLOT_PRIMARY)
|
if (i == MainPrimary)
|
||||||
TimerToUse = &attack_timer;
|
TimerToUse = &attack_timer;
|
||||||
else if (i == SLOT_RANGE)
|
else if (i == MainRange)
|
||||||
TimerToUse = &ranged_timer;
|
TimerToUse = &ranged_timer;
|
||||||
else if(i == SLOT_SECONDARY)
|
else if(i == MainSecondary)
|
||||||
TimerToUse = &attack_dw_timer;
|
TimerToUse = &attack_dw_timer;
|
||||||
else //invalid slot (hands will always hit this)
|
else //invalid slot (hands will always hit this)
|
||||||
continue;
|
continue;
|
||||||
@ -9009,7 +9012,7 @@ void Bot::SetAttackTimer() {
|
|||||||
ItemToUse = ci->GetItem();
|
ItemToUse = ci->GetItem();
|
||||||
|
|
||||||
//special offhand stuff
|
//special offhand stuff
|
||||||
if(i == SLOT_SECONDARY) {
|
if(i == MainSecondary) {
|
||||||
//if we have a 2H weapon in our main hand, no dual
|
//if we have a 2H weapon in our main hand, no dual
|
||||||
if(PrimaryWeapon != nullptr) {
|
if(PrimaryWeapon != nullptr) {
|
||||||
if( PrimaryWeapon->ItemClass == ItemClassCommon
|
if( PrimaryWeapon->ItemClass == ItemClassCommon
|
||||||
@ -9103,7 +9106,7 @@ void Bot::SetAttackTimer() {
|
|||||||
TimerToUse->SetAtTrigger(speed, true);
|
TimerToUse->SetAtTrigger(speed, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(i == SLOT_PRIMARY)
|
if(i == MainPrimary)
|
||||||
PrimaryWeapon = ItemToUse;
|
PrimaryWeapon = ItemToUse;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -11551,10 +11554,10 @@ bool Bot::CheckLoreConflict(const Item_Struct* item) {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (item->LoreGroup == -1) // Standard lore items; look everywhere except the shared bank, return the result
|
if (item->LoreGroup == -1) // Standard lore items; look everywhere except the shared bank, return the result
|
||||||
return (m_inv.HasItem(item->ID, 0, invWhereWorn) != SLOT_INVALID);
|
return (m_inv.HasItem(item->ID, 0, invWhereWorn) != INVALID_INDEX);
|
||||||
|
|
||||||
//If the item has a lore group, we check for other items with the same group and return the result
|
//If the item has a lore group, we check for other items with the same group and return the result
|
||||||
return (m_inv.HasItemByLoreGroup(item->LoreGroup, invWhereWorn) != SLOT_INVALID);
|
return (m_inv.HasItemByLoreGroup(item->LoreGroup, invWhereWorn) != INVALID_INDEX);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Bot::GroupHasClass(Group* group, uint8 classId) {
|
bool Bot::GroupHasClass(Group* group, uint8 classId) {
|
||||||
@ -12160,7 +12163,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) {
|
|||||||
bool is2Hweapon = false;
|
bool is2Hweapon = false;
|
||||||
for(int i=0; i<22; ++i)
|
for(int i=0; i<22; ++i)
|
||||||
{
|
{
|
||||||
if((i == 14) && is2Hweapon) {
|
if((i == MainSecondary) && is2Hweapon) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12178,12 +12181,12 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) {
|
|||||||
c->Message(15, "I need something for my %s (Item %i)", equipped[i], i);
|
c->Message(15, "I need something for my %s (Item %i)", equipped[i], i);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if((i == 13) && ((item2->ItemType == ItemType2HSlash) || (item2->ItemType == ItemType2HBlunt) || (item2->ItemType == ItemType2HPiercing))) {
|
if((i == MainPrimary) && ((item2->ItemType == ItemType2HSlash) || (item2->ItemType == ItemType2HBlunt) || (item2->ItemType == ItemType2HPiercing))) {
|
||||||
is2Hweapon = true;
|
is2Hweapon = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* itemLink = 0;
|
char* itemLink = 0;
|
||||||
if((i == 0) || (i == 11) || (i == 13) || (i == 14) || (i == 21)) {
|
if((i == MainCharm) || (i == MainRange) || (i == MainPrimary) || (i == MainSecondary) || (i == MainAmmo)) {
|
||||||
if (c->GetClientVersion() >= EQClientSoF)
|
if (c->GetClientVersion() >= EQClientSoF)
|
||||||
{
|
{
|
||||||
MakeAnyLenString(&itemLink, "%1X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%1X" "%04X" "%1X" "%05X" "%08X",
|
MakeAnyLenString(&itemLink, "%1X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%1X" "%04X" "%1X" "%05X" "%08X",
|
||||||
@ -12300,7 +12303,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) {
|
|||||||
// Don't allow the player to remove a lore item they already possess and cause a crash
|
// Don't allow the player to remove a lore item they already possess and cause a crash
|
||||||
bool failedLoreCheck = false;
|
bool failedLoreCheck = false;
|
||||||
if(itminst) {
|
if(itminst) {
|
||||||
for(int m=0; m<MAX_AUGMENT_SLOTS; ++m) {
|
for (int m = 0; m<EmuConstants::ITEM_COMMON_SIZE; ++m) {
|
||||||
ItemInst *itma = itminst->GetAugment(m);
|
ItemInst *itma = itminst->GetAugment(m);
|
||||||
if(itma)
|
if(itma)
|
||||||
{
|
{
|
||||||
@ -12317,7 +12320,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) {
|
|||||||
if(itm) {
|
if(itm) {
|
||||||
c->PushItemOnCursor(*itminst, true);
|
c->PushItemOnCursor(*itminst, true);
|
||||||
Bot *gearbot = c->GetTarget()->CastToBot();
|
Bot *gearbot = c->GetTarget()->CastToBot();
|
||||||
if((slotId == SLOT_RANGE)||(slotId == SLOT_AMMO)||(slotId == SLOT_PRIMARY)||(slotId == SLOT_SECONDARY)) {
|
if((slotId == MainRange)||(slotId == MainAmmo)||(slotId == MainPrimary)||(slotId == MainSecondary)) {
|
||||||
gearbot->SetBotArcher(false);
|
gearbot->SetBotArcher(false);
|
||||||
}
|
}
|
||||||
gearbot->RemoveBotItemBySlot(slotId, &TempErrorMessage);
|
gearbot->RemoveBotItemBySlot(slotId, &TempErrorMessage);
|
||||||
@ -16270,8 +16273,8 @@ void EntityList::BotPickLock(Bot* rogue)
|
|||||||
curdist += (tmp * tmp);
|
curdist += (tmp * tmp);
|
||||||
if((zdiff < 10) && (curdist <= 130)) {
|
if((zdiff < 10) && (curdist <= 130)) {
|
||||||
// All rogue items with lock pick bonuses are hands or primary
|
// All rogue items with lock pick bonuses are hands or primary
|
||||||
const ItemInst* item1 = rogue->GetBotItem(SLOT_HANDS);
|
const ItemInst* item1 = rogue->GetBotItem(MainHands);
|
||||||
const ItemInst* item2 = rogue->GetBotItem(SLOT_PRIMARY);
|
const ItemInst* item2 = rogue->GetBotItem(MainPrimary);
|
||||||
|
|
||||||
float bonus1 = 0.0f;
|
float bonus1 = 0.0f;
|
||||||
float bonus2 = 0.0f;
|
float bonus2 = 0.0f;
|
||||||
@ -16500,14 +16503,14 @@ int Bot::GetRawACNoShield(int &shield_ac)
|
|||||||
{
|
{
|
||||||
int ac = itembonuses.AC + spellbonuses.AC;
|
int ac = itembonuses.AC + spellbonuses.AC;
|
||||||
shield_ac = 0;
|
shield_ac = 0;
|
||||||
ItemInst* inst = GetBotItem(SLOT_SECONDARY);
|
ItemInst* inst = GetBotItem(MainSecondary);
|
||||||
if(inst)
|
if(inst)
|
||||||
{
|
{
|
||||||
if(inst->GetItem()->ItemType == ItemTypeShield)
|
if(inst->GetItem()->ItemType == ItemTypeShield)
|
||||||
{
|
{
|
||||||
ac -= inst->GetItem()->AC;
|
ac -= inst->GetItem()->AC;
|
||||||
shield_ac = inst->GetItem()->AC;
|
shield_ac = inst->GetItem()->AC;
|
||||||
for(uint8 i = 0; i < MAX_AUGMENT_SLOTS; i++)
|
for (uint8 i = 0; i < EmuConstants::ITEM_COMMON_SIZE; i++)
|
||||||
{
|
{
|
||||||
if(inst->GetAugment(i))
|
if(inst->GetAugment(i))
|
||||||
{
|
{
|
||||||
|
|||||||
107
zone/client.cpp
107
zone/client.cpp
@ -1867,52 +1867,57 @@ void Client::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho)
|
|||||||
// (update: i think pp should do it, as this holds LoY dye - plus, this is ugly code with Inventory!)
|
// (update: i think pp should do it, as this holds LoY dye - plus, this is ugly code with Inventory!)
|
||||||
const Item_Struct* item = nullptr;
|
const Item_Struct* item = nullptr;
|
||||||
const ItemInst* inst = nullptr;
|
const ItemInst* inst = nullptr;
|
||||||
if ((inst = m_inv[SLOT_HANDS]) && inst->IsType(ItemClassCommon)) {
|
if ((inst = m_inv[MainHands]) && inst->IsType(ItemClassCommon)) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
ns->spawn.equipment[MaterialHands] = item->Material;
|
ns->spawn.equipment[MaterialHands] = item->Material;
|
||||||
ns->spawn.colors[MaterialHands].color = GetEquipmentColor(MaterialHands);
|
ns->spawn.colors[MaterialHands].color = GetEquipmentColor(MaterialHands);
|
||||||
}
|
}
|
||||||
if ((inst = m_inv[SLOT_HEAD]) && inst->IsType(ItemClassCommon)) {
|
if ((inst = m_inv[MainHead]) && inst->IsType(ItemClassCommon)) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
ns->spawn.equipment[MaterialHead] = item->Material;
|
ns->spawn.equipment[MaterialHead] = item->Material;
|
||||||
ns->spawn.colors[MaterialHead].color = GetEquipmentColor(MaterialHead);
|
ns->spawn.colors[MaterialHead].color = GetEquipmentColor(MaterialHead);
|
||||||
}
|
}
|
||||||
if ((inst = m_inv[SLOT_ARMS]) && inst->IsType(ItemClassCommon)) {
|
if ((inst = m_inv[MainArms]) && inst->IsType(ItemClassCommon)) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
ns->spawn.equipment[MaterialArms] = item->Material;
|
ns->spawn.equipment[MaterialArms] = item->Material;
|
||||||
ns->spawn.colors[MaterialArms].color = GetEquipmentColor(MaterialArms);
|
ns->spawn.colors[MaterialArms].color = GetEquipmentColor(MaterialArms);
|
||||||
}
|
}
|
||||||
if ((inst = m_inv[SLOT_BRACER01]) && inst->IsType(ItemClassCommon)) {
|
if ((inst = m_inv[MainWrist1]) && inst->IsType(ItemClassCommon)) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
ns->spawn.equipment[MaterialWrist]= item->Material;
|
ns->spawn.equipment[MaterialWrist]= item->Material;
|
||||||
ns->spawn.colors[MaterialWrist].color = GetEquipmentColor(MaterialWrist);
|
ns->spawn.colors[MaterialWrist].color = GetEquipmentColor(MaterialWrist);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// non-live behavior
|
||||||
if ((inst = m_inv[SLOT_BRACER02]) && inst->IsType(ItemClassCommon)) {
|
if ((inst = m_inv[SLOT_BRACER02]) && inst->IsType(ItemClassCommon)) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
ns->spawn.equipment[MaterialWrist]= item->Material;
|
ns->spawn.equipment[MaterialWrist]= item->Material;
|
||||||
ns->spawn.colors[MaterialWrist].color = GetEquipmentColor(MaterialWrist);
|
ns->spawn.colors[MaterialWrist].color = GetEquipmentColor(MaterialWrist);
|
||||||
}
|
}
|
||||||
if ((inst = m_inv[SLOT_CHEST]) && inst->IsType(ItemClassCommon)) {
|
*/
|
||||||
|
|
||||||
|
if ((inst = m_inv[MainChest]) && inst->IsType(ItemClassCommon)) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
ns->spawn.equipment[MaterialChest] = item->Material;
|
ns->spawn.equipment[MaterialChest] = item->Material;
|
||||||
ns->spawn.colors[MaterialChest].color = GetEquipmentColor(MaterialChest);
|
ns->spawn.colors[MaterialChest].color = GetEquipmentColor(MaterialChest);
|
||||||
}
|
}
|
||||||
if ((inst = m_inv[SLOT_LEGS]) && inst->IsType(ItemClassCommon)) {
|
if ((inst = m_inv[MainLegs]) && inst->IsType(ItemClassCommon)) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
ns->spawn.equipment[MaterialLegs] = item->Material;
|
ns->spawn.equipment[MaterialLegs] = item->Material;
|
||||||
ns->spawn.colors[MaterialLegs].color = GetEquipmentColor(MaterialLegs);
|
ns->spawn.colors[MaterialLegs].color = GetEquipmentColor(MaterialLegs);
|
||||||
}
|
}
|
||||||
if ((inst = m_inv[SLOT_FEET]) && inst->IsType(ItemClassCommon)) {
|
if ((inst = m_inv[MainFeet]) && inst->IsType(ItemClassCommon)) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
ns->spawn.equipment[MaterialFeet] = item->Material;
|
ns->spawn.equipment[MaterialFeet] = item->Material;
|
||||||
ns->spawn.colors[MaterialFeet].color = GetEquipmentColor(MaterialFeet);
|
ns->spawn.colors[MaterialFeet].color = GetEquipmentColor(MaterialFeet);
|
||||||
}
|
}
|
||||||
if ((inst = m_inv[SLOT_PRIMARY]) && inst->IsType(ItemClassCommon)) {
|
if ((inst = m_inv[MainPrimary]) && inst->IsType(ItemClassCommon)) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
if (strlen(item->IDFile) > 2)
|
if (strlen(item->IDFile) > 2)
|
||||||
ns->spawn.equipment[MaterialPrimary] = atoi(&item->IDFile[2]);
|
ns->spawn.equipment[MaterialPrimary] = atoi(&item->IDFile[2]);
|
||||||
}
|
}
|
||||||
if ((inst = m_inv[SLOT_SECONDARY]) && inst->IsType(ItemClassCommon)) {
|
if ((inst = m_inv[MainSecondary]) && inst->IsType(ItemClassCommon)) {
|
||||||
item = inst->GetItem();
|
item = inst->GetItem();
|
||||||
if (strlen(item->IDFile) > 2)
|
if (strlen(item->IDFile) > 2)
|
||||||
ns->spawn.equipment[MaterialSecondary] = atoi(&item->IDFile[2]);
|
ns->spawn.equipment[MaterialSecondary] = atoi(&item->IDFile[2]);
|
||||||
@ -2624,7 +2629,7 @@ bool Client::BindWound(Mob* bindmob, bool start, bool fail){
|
|||||||
if(!bindwound_timer.Enabled()) {
|
if(!bindwound_timer.Enabled()) {
|
||||||
//make sure we actually have a bandage... and consume it.
|
//make sure we actually have a bandage... and consume it.
|
||||||
int16 bslot = m_inv.HasItemByUse(ItemTypeBandage, 1, invWhereWorn|invWherePersonal);
|
int16 bslot = m_inv.HasItemByUse(ItemTypeBandage, 1, invWhereWorn|invWherePersonal);
|
||||||
if(bslot == SLOT_INVALID) {
|
if (bslot == INVALID_INDEX) {
|
||||||
bind_out->type = 3;
|
bind_out->type = 3;
|
||||||
QueuePacket(outapp);
|
QueuePacket(outapp);
|
||||||
bind_out->type = 7; //this is the wrong message, dont know the right one.
|
bind_out->type = 7; //this is the wrong message, dont know the right one.
|
||||||
@ -2778,25 +2783,28 @@ bool Client::BindWound(Mob* bindmob, bool start, bool fail){
|
|||||||
void Client::SetMaterial(int16 in_slot, uint32 item_id) {
|
void Client::SetMaterial(int16 in_slot, uint32 item_id) {
|
||||||
const Item_Struct* item = database.GetItem(item_id);
|
const Item_Struct* item = database.GetItem(item_id);
|
||||||
if (item && (item->ItemClass==ItemClassCommon)) {
|
if (item && (item->ItemClass==ItemClassCommon)) {
|
||||||
if (in_slot==SLOT_HEAD)
|
if (in_slot==MainHead)
|
||||||
m_pp.item_material[MaterialHead] = item->Material;
|
m_pp.item_material[MaterialHead] = item->Material;
|
||||||
else if (in_slot==SLOT_CHEST)
|
else if (in_slot==MainChest)
|
||||||
m_pp.item_material[MaterialChest] = item->Material;
|
m_pp.item_material[MaterialChest] = item->Material;
|
||||||
else if (in_slot==SLOT_ARMS)
|
else if (in_slot==MainArms)
|
||||||
m_pp.item_material[MaterialArms] = item->Material;
|
m_pp.item_material[MaterialArms] = item->Material;
|
||||||
else if (in_slot==SLOT_BRACER01)
|
else if (in_slot==MainWrist1)
|
||||||
m_pp.item_material[MaterialWrist] = item->Material;
|
m_pp.item_material[MaterialWrist] = item->Material;
|
||||||
|
/*
|
||||||
|
// non-live behavior
|
||||||
else if (in_slot==SLOT_BRACER02)
|
else if (in_slot==SLOT_BRACER02)
|
||||||
m_pp.item_material[MaterialWrist] = item->Material;
|
m_pp.item_material[MaterialWrist] = item->Material;
|
||||||
else if (in_slot==SLOT_HANDS)
|
*/
|
||||||
|
else if (in_slot==MainHands)
|
||||||
m_pp.item_material[MaterialHands] = item->Material;
|
m_pp.item_material[MaterialHands] = item->Material;
|
||||||
else if (in_slot==SLOT_LEGS)
|
else if (in_slot==MainLegs)
|
||||||
m_pp.item_material[MaterialLegs] = item->Material;
|
m_pp.item_material[MaterialLegs] = item->Material;
|
||||||
else if (in_slot==SLOT_FEET)
|
else if (in_slot==MainFeet)
|
||||||
m_pp.item_material[MaterialFeet] = item->Material;
|
m_pp.item_material[MaterialFeet] = item->Material;
|
||||||
else if (in_slot==SLOT_PRIMARY)
|
else if (in_slot==MainPrimary)
|
||||||
m_pp.item_material[MaterialPrimary] = atoi(item->IDFile+2);
|
m_pp.item_material[MaterialPrimary] = atoi(item->IDFile+2);
|
||||||
else if (in_slot==SLOT_SECONDARY)
|
else if (in_slot==MainSecondary)
|
||||||
m_pp.item_material[MaterialSecondary] = atoi(item->IDFile+2);
|
m_pp.item_material[MaterialSecondary] = atoi(item->IDFile+2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3118,25 +3126,28 @@ void Client::SetTint(int16 in_slot, uint32 color) {
|
|||||||
|
|
||||||
// Still need to reconcile bracer01 versus bracer02
|
// Still need to reconcile bracer01 versus bracer02
|
||||||
void Client::SetTint(int16 in_slot, Color_Struct& color) {
|
void Client::SetTint(int16 in_slot, Color_Struct& color) {
|
||||||
if (in_slot==SLOT_HEAD)
|
if (in_slot==MainHead)
|
||||||
m_pp.item_tint[MaterialHead].color=color.color;
|
m_pp.item_tint[MaterialHead].color=color.color;
|
||||||
else if (in_slot==SLOT_ARMS)
|
else if (in_slot==MainArms)
|
||||||
m_pp.item_tint[MaterialArms].color=color.color;
|
m_pp.item_tint[MaterialArms].color=color.color;
|
||||||
else if (in_slot==SLOT_BRACER01)
|
else if (in_slot==MainWrist1)
|
||||||
m_pp.item_tint[MaterialWrist].color=color.color;
|
m_pp.item_tint[MaterialWrist].color=color.color;
|
||||||
|
/*
|
||||||
|
// non-live behavior
|
||||||
else if (in_slot==SLOT_BRACER02)
|
else if (in_slot==SLOT_BRACER02)
|
||||||
m_pp.item_tint[MaterialWrist].color=color.color;
|
m_pp.item_tint[MaterialWrist].color=color.color;
|
||||||
else if (in_slot==SLOT_HANDS)
|
*/
|
||||||
|
else if (in_slot==MainHands)
|
||||||
m_pp.item_tint[MaterialHands].color=color.color;
|
m_pp.item_tint[MaterialHands].color=color.color;
|
||||||
else if (in_slot==SLOT_PRIMARY)
|
else if (in_slot==MainPrimary)
|
||||||
m_pp.item_tint[MaterialPrimary].color=color.color;
|
m_pp.item_tint[MaterialPrimary].color=color.color;
|
||||||
else if (in_slot==SLOT_SECONDARY)
|
else if (in_slot==MainSecondary)
|
||||||
m_pp.item_tint[MaterialSecondary].color=color.color;
|
m_pp.item_tint[MaterialSecondary].color=color.color;
|
||||||
else if (in_slot==SLOT_CHEST)
|
else if (in_slot==MainChest)
|
||||||
m_pp.item_tint[MaterialChest].color=color.color;
|
m_pp.item_tint[MaterialChest].color=color.color;
|
||||||
else if (in_slot==SLOT_LEGS)
|
else if (in_slot==MainLegs)
|
||||||
m_pp.item_tint[MaterialLegs].color=color.color;
|
m_pp.item_tint[MaterialLegs].color=color.color;
|
||||||
else if (in_slot==SLOT_FEET)
|
else if (in_slot==MainFeet)
|
||||||
m_pp.item_tint[MaterialFeet].color=color.color;
|
m_pp.item_tint[MaterialFeet].color=color.color;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3202,57 +3213,57 @@ void Client::LinkDead()
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8 Client::SlotConvert(uint8 slot,bool bracer){
|
uint8 Client::SlotConvert(uint8 slot,bool bracer){
|
||||||
uint8 slot2=0;
|
uint8 slot2=0; // why are we returning MainCharm instead of INVALID_INDEX? (must be a pre-charm segment...)
|
||||||
if(bracer)
|
if(bracer)
|
||||||
return SLOT_BRACER02;
|
return MainWrist2;
|
||||||
switch(slot){
|
switch(slot){
|
||||||
case MaterialHead:
|
case MaterialHead:
|
||||||
slot2=SLOT_HEAD;
|
slot2=MainHead;
|
||||||
break;
|
break;
|
||||||
case MaterialChest:
|
case MaterialChest:
|
||||||
slot2=SLOT_CHEST;
|
slot2=MainChest;
|
||||||
break;
|
break;
|
||||||
case MaterialArms:
|
case MaterialArms:
|
||||||
slot2=SLOT_ARMS;
|
slot2=MainArms;
|
||||||
break;
|
break;
|
||||||
case MaterialWrist:
|
case MaterialWrist:
|
||||||
slot2=SLOT_BRACER01;
|
slot2=MainWrist1;
|
||||||
break;
|
break;
|
||||||
case MaterialHands:
|
case MaterialHands:
|
||||||
slot2=SLOT_HANDS;
|
slot2=MainHands;
|
||||||
break;
|
break;
|
||||||
case MaterialLegs:
|
case MaterialLegs:
|
||||||
slot2=SLOT_LEGS;
|
slot2=MainLegs;
|
||||||
break;
|
break;
|
||||||
case MaterialFeet:
|
case MaterialFeet:
|
||||||
slot2=SLOT_FEET;
|
slot2=MainFeet;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return slot2;
|
return slot2;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8 Client::SlotConvert2(uint8 slot){
|
uint8 Client::SlotConvert2(uint8 slot){
|
||||||
uint8 slot2=0;
|
uint8 slot2=0; // same as above...
|
||||||
switch(slot){
|
switch(slot){
|
||||||
case SLOT_HEAD:
|
case MainHead:
|
||||||
slot2=MaterialHead;
|
slot2=MaterialHead;
|
||||||
break;
|
break;
|
||||||
case SLOT_CHEST:
|
case MainChest:
|
||||||
slot2=MaterialChest;
|
slot2=MaterialChest;
|
||||||
break;
|
break;
|
||||||
case SLOT_ARMS:
|
case MainArms:
|
||||||
slot2=MaterialArms;
|
slot2=MaterialArms;
|
||||||
break;
|
break;
|
||||||
case SLOT_BRACER01:
|
case MainWrist1:
|
||||||
slot2=MaterialWrist;
|
slot2=MaterialWrist;
|
||||||
break;
|
break;
|
||||||
case SLOT_HANDS:
|
case MainHands:
|
||||||
slot2=MaterialHands;
|
slot2=MaterialHands;
|
||||||
break;
|
break;
|
||||||
case SLOT_LEGS:
|
case MainLegs:
|
||||||
slot2=MaterialLegs;
|
slot2=MaterialLegs;
|
||||||
break;
|
break;
|
||||||
case SLOT_FEET:
|
case MainFeet:
|
||||||
slot2=MaterialFeet;
|
slot2=MaterialFeet;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -4900,7 +4911,7 @@ void Client::ShowSkillsWindow()
|
|||||||
if(GetSkill(it->second) > 0 || MaxSkill(it->second) > 0) {
|
if(GetSkill(it->second) > 0 || MaxSkill(it->second) > 0) {
|
||||||
WindowText += it->first;
|
WindowText += it->first;
|
||||||
// line up the values
|
// line up the values
|
||||||
for (int j = 0; j < MAX_AUGMENT_SLOTS; j++)
|
for (int j = 0; j < EmuConstants::ITEM_COMMON_SIZE; j++)
|
||||||
WindowText += " ";
|
WindowText += " ";
|
||||||
WindowText += itoa(this->GetSkill(it->second));
|
WindowText += itoa(this->GetSkill(it->second));
|
||||||
if (MaxSkill(it->second) > 0) {
|
if (MaxSkill(it->second) > 0) {
|
||||||
@ -7854,7 +7865,7 @@ void Client::TryItemTick(int slot)
|
|||||||
//Only look at augs in main inventory
|
//Only look at augs in main inventory
|
||||||
if(slot > 21) { return; }
|
if(slot > 21) { return; }
|
||||||
|
|
||||||
for(int x = 0; x < MAX_AUGMENT_SLOTS; ++x)
|
for (int x = 0; x < EmuConstants::ITEM_COMMON_SIZE; ++x)
|
||||||
{
|
{
|
||||||
ItemInst * a_inst = inst->GetAugment(x);
|
ItemInst * a_inst = inst->GetAugment(x);
|
||||||
if(!a_inst) { continue; }
|
if(!a_inst) { continue; }
|
||||||
@ -7911,7 +7922,7 @@ void Client::TryItemTimer(int slot)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int x = 0; x < MAX_AUGMENT_SLOTS; ++x)
|
for (int x = 0; x < EmuConstants::ITEM_COMMON_SIZE; ++x)
|
||||||
{
|
{
|
||||||
ItemInst * a_inst = inst->GetAugment(x);
|
ItemInst * a_inst = inst->GetAugment(x);
|
||||||
if(!a_inst) {
|
if(!a_inst) {
|
||||||
|
|||||||
@ -799,7 +799,7 @@ public:
|
|||||||
void QSSwapItemAuditor(MoveItem_Struct* move_in, bool postaction_call = false);
|
void QSSwapItemAuditor(MoveItem_Struct* move_in, bool postaction_call = false);
|
||||||
void PutLootInInventory(int16 slot_id, const ItemInst &inst, ServerLootItem_Struct** bag_item_data = 0);
|
void PutLootInInventory(int16 slot_id, const ItemInst &inst, ServerLootItem_Struct** bag_item_data = 0);
|
||||||
bool AutoPutLootInInventory(ItemInst& inst, bool try_worn = false, bool try_cursor = true, ServerLootItem_Struct** bag_item_data = 0);
|
bool AutoPutLootInInventory(ItemInst& inst, bool try_worn = false, bool try_cursor = true, ServerLootItem_Struct** bag_item_data = 0);
|
||||||
bool SummonItem(uint32 item_id, int16 charges = -1, uint32 aug1=0, uint32 aug2=0, uint32 aug3=0, uint32 aug4=0, uint32 aug5=0, bool attuned=false, uint16 to_slot=SLOT_CURSOR);
|
bool SummonItem(uint32 item_id, int16 charges = -1, uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, uint32 aug4 = 0, uint32 aug5 = 0, bool attuned = false, uint16 to_slot = MainCursor);
|
||||||
void SetStats(uint8 type,int16 set_val);
|
void SetStats(uint8 type,int16 set_val);
|
||||||
void IncStats(uint8 type,int16 increase_val);
|
void IncStats(uint8 type,int16 increase_val);
|
||||||
void DropItem(int16 slot_id);
|
void DropItem(int16 slot_id);
|
||||||
|
|||||||
@ -1969,14 +1969,14 @@ int Client::GetRawACNoShield(int &shield_ac) const
|
|||||||
{
|
{
|
||||||
int ac = itembonuses.AC + spellbonuses.AC;
|
int ac = itembonuses.AC + spellbonuses.AC;
|
||||||
shield_ac = 0;
|
shield_ac = 0;
|
||||||
const ItemInst *inst = m_inv.GetItem(SLOT_SECONDARY);
|
const ItemInst *inst = m_inv.GetItem(MainSecondary);
|
||||||
if(inst)
|
if(inst)
|
||||||
{
|
{
|
||||||
if(inst->GetItem()->ItemType == ItemTypeShield)
|
if(inst->GetItem()->ItemType == ItemTypeShield)
|
||||||
{
|
{
|
||||||
ac -= inst->GetItem()->AC;
|
ac -= inst->GetItem()->AC;
|
||||||
shield_ac = inst->GetItem()->AC;
|
shield_ac = inst->GetItem()->AC;
|
||||||
for(uint8 i = 0; i < MAX_AUGMENT_SLOTS; i++)
|
for (uint8 i = 0; i < EmuConstants::ITEM_COMMON_SIZE; i++)
|
||||||
{
|
{
|
||||||
if(inst->GetAugment(i))
|
if(inst->GetAugment(i))
|
||||||
{
|
{
|
||||||
|
|||||||
@ -2031,7 +2031,7 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app)
|
|||||||
|
|
||||||
LogFile->write(EQEMuLog::Debug, "OP ItemVerifyRequest: spell=%i, target=%i, inv=%i", spell_id, target_id, slot_id);
|
LogFile->write(EQEMuLog::Debug, "OP ItemVerifyRequest: spell=%i, target=%i, inv=%i", spell_id, target_id, slot_id);
|
||||||
|
|
||||||
if ((slot_id < 30) || (slot_id == 9999) || (slot_id > 250 && slot_id < 331 && ((item->ItemType == ItemTypePotion) || item->PotionBelt))) // sanity check
|
if ((slot_id < MainCursor) || (slot_id == MainPowerSource) || (slot_id > 250 && slot_id < 331 && ((item->ItemType == ItemTypePotion) || item->PotionBelt))) // sanity check
|
||||||
{
|
{
|
||||||
ItemInst* p_inst = (ItemInst*)inst;
|
ItemInst* p_inst = (ItemInst*)inst;
|
||||||
|
|
||||||
@ -2047,7 +2047,7 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app)
|
|||||||
ItemInst* clickaug = 0;
|
ItemInst* clickaug = 0;
|
||||||
Item_Struct* augitem = 0;
|
Item_Struct* augitem = 0;
|
||||||
|
|
||||||
for(r = 0; r < MAX_AUGMENT_SLOTS; r++) {
|
for (r = 0; r < EmuConstants::ITEM_COMMON_SIZE; r++) {
|
||||||
const ItemInst* aug_i = inst->GetAugment(r);
|
const ItemInst* aug_i = inst->GetAugment(r);
|
||||||
if(!aug_i)
|
if(!aug_i)
|
||||||
continue;
|
continue;
|
||||||
@ -2465,7 +2465,7 @@ void Client::Handle_OP_AdventureMerchantPurchase(const EQApplicationPacket *app)
|
|||||||
ItemInst *inst = database.CreateItem(item, charges);
|
ItemInst *inst = database.CreateItem(item, charges);
|
||||||
if(!AutoPutLootInInventory(*inst, true, true))
|
if(!AutoPutLootInInventory(*inst, true, true))
|
||||||
{
|
{
|
||||||
PutLootInInventory(SLOT_CURSOR, *inst);
|
PutLootInInventory(MainCursor, *inst);
|
||||||
}
|
}
|
||||||
Save(1);
|
Save(1);
|
||||||
}
|
}
|
||||||
@ -5631,8 +5631,8 @@ void Client::Handle_OP_ShopPlayerBuy(const EQApplicationPacket *app)
|
|||||||
freeslotid = m_inv.FindFreeSlot(false, true, item->Size);
|
freeslotid = m_inv.FindFreeSlot(false, true, item->Size);
|
||||||
|
|
||||||
//make sure we are not completely full...
|
//make sure we are not completely full...
|
||||||
if(freeslotid == SLOT_CURSOR) {
|
if (freeslotid == MainCursor) {
|
||||||
if(m_inv.GetItem(SLOT_CURSOR) != nullptr) {
|
if (m_inv.GetItem(MainCursor) != nullptr) {
|
||||||
Message(13, "You do not have room for any more items.");
|
Message(13, "You do not have room for any more items.");
|
||||||
safe_delete(outapp);
|
safe_delete(outapp);
|
||||||
safe_delete(inst);
|
safe_delete(inst);
|
||||||
@ -5640,7 +5640,7 @@ void Client::Handle_OP_ShopPlayerBuy(const EQApplicationPacket *app)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(freeslotid == SLOT_INVALID)
|
if (freeslotid == INVALID_INDEX)
|
||||||
{
|
{
|
||||||
Message(13, "You do not have room for any more items.");
|
Message(13, "You do not have room for any more items.");
|
||||||
safe_delete(outapp);
|
safe_delete(outapp);
|
||||||
@ -6227,7 +6227,7 @@ void Client::Handle_OP_ClickDoor(const EQApplicationPacket *app)
|
|||||||
|
|
||||||
void Client::Handle_OP_CreateObject(const EQApplicationPacket *app)
|
void Client::Handle_OP_CreateObject(const EQApplicationPacket *app)
|
||||||
{
|
{
|
||||||
DropItem(SLOT_CURSOR);
|
DropItem(MainCursor);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9232,7 +9232,7 @@ bool Client::FinishConnState2(DBAsyncWork* dbaw) {
|
|||||||
if (it==m_inv.cursor_begin())
|
if (it==m_inv.cursor_begin())
|
||||||
continue;
|
continue;
|
||||||
const ItemInst *inst=*it;
|
const ItemInst *inst=*it;
|
||||||
SendItemPacket(SLOT_CURSOR, inst, ItemPacketSummonItem);
|
SendItemPacket(MainCursor, inst, ItemPacketSummonItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11037,8 +11037,8 @@ void Client::Handle_OP_ApplyPoison(const EQApplicationPacket *app) {
|
|||||||
}
|
}
|
||||||
uint32 ApplyPoisonSuccessResult = 0;
|
uint32 ApplyPoisonSuccessResult = 0;
|
||||||
ApplyPoison_Struct* ApplyPoisonData = (ApplyPoison_Struct*)app->pBuffer;
|
ApplyPoison_Struct* ApplyPoisonData = (ApplyPoison_Struct*)app->pBuffer;
|
||||||
const ItemInst* PrimaryWeapon = GetInv().GetItem(SLOT_PRIMARY);
|
const ItemInst* PrimaryWeapon = GetInv().GetItem(MainPrimary);
|
||||||
const ItemInst* SecondaryWeapon = GetInv().GetItem(SLOT_SECONDARY);
|
const ItemInst* SecondaryWeapon = GetInv().GetItem(MainSecondary);
|
||||||
const ItemInst* PoisonItemInstance = GetInv()[ApplyPoisonData->inventorySlot];
|
const ItemInst* PoisonItemInstance = GetInv()[ApplyPoisonData->inventorySlot];
|
||||||
|
|
||||||
bool IsPoison = PoisonItemInstance && (PoisonItemInstance->GetItem()->ItemType == ItemTypePoison);
|
bool IsPoison = PoisonItemInstance && (PoisonItemInstance->GetItem()->ItemType == ItemTypePoison);
|
||||||
@ -11822,7 +11822,7 @@ void Client::Handle_OP_GuildBank(const EQApplicationPacket *app)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemInst *CursorItemInst = GetInv().GetItem(SLOT_CURSOR);
|
ItemInst *CursorItemInst = GetInv().GetItem(MainCursor);
|
||||||
|
|
||||||
bool Allowed = true;
|
bool Allowed = true;
|
||||||
|
|
||||||
@ -11879,7 +11879,7 @@ void Client::Handle_OP_GuildBank(const EQApplicationPacket *app)
|
|||||||
{
|
{
|
||||||
GuildBankDepositAck(false);
|
GuildBankDepositAck(false);
|
||||||
|
|
||||||
DeleteItemInInventory(SLOT_CURSOR, 0, false);
|
DeleteItemInInventory(MainCursor, 0, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -11900,7 +11900,7 @@ void Client::Handle_OP_GuildBank(const EQApplicationPacket *app)
|
|||||||
|
|
||||||
case GuildBankWithdraw:
|
case GuildBankWithdraw:
|
||||||
{
|
{
|
||||||
if(GetInv()[SLOT_CURSOR])
|
if (GetInv()[MainCursor])
|
||||||
{
|
{
|
||||||
Message_StringID(13, GUILD_BANK_EMPTY_HANDS);
|
Message_StringID(13, GUILD_BANK_EMPTY_HANDS);
|
||||||
|
|
||||||
@ -11946,7 +11946,7 @@ void Client::Handle_OP_GuildBank(const EQApplicationPacket *app)
|
|||||||
{
|
{
|
||||||
PushItemOnCursor(*inst);
|
PushItemOnCursor(*inst);
|
||||||
|
|
||||||
SendItemPacket(SLOT_CURSOR, inst, ItemPacketSummonItem);
|
SendItemPacket(MainCursor, inst, ItemPacketSummonItem);
|
||||||
|
|
||||||
GuildBanks->DeleteItem(GuildID(), gbwis->Area, gbwis->SlotID, gbwis->Quantity);
|
GuildBanks->DeleteItem(GuildID(), gbwis->Area, gbwis->SlotID, gbwis->Quantity);
|
||||||
}
|
}
|
||||||
@ -12752,7 +12752,7 @@ void Client::Handle_OP_AltCurrencyPurchase(const EQApplicationPacket *app) {
|
|||||||
ItemInst *inst = database.CreateItem(item, charges);
|
ItemInst *inst = database.CreateItem(item, charges);
|
||||||
if(!AutoPutLootInInventory(*inst, true, true))
|
if(!AutoPutLootInInventory(*inst, true, true))
|
||||||
{
|
{
|
||||||
PutLootInInventory(SLOT_CURSOR, *inst);
|
PutLootInInventory(MainCursor, *inst);
|
||||||
}
|
}
|
||||||
|
|
||||||
Save(1);
|
Save(1);
|
||||||
@ -12786,7 +12786,7 @@ void Client::Handle_OP_AltCurrencyReclaim(const EQApplicationPacket *app) {
|
|||||||
SummonItem(item_id, max_currency);
|
SummonItem(item_id, max_currency);
|
||||||
SetAlternateCurrencyValue(reclaim->currency_id, 0);
|
SetAlternateCurrencyValue(reclaim->currency_id, 0);
|
||||||
} else {
|
} else {
|
||||||
SummonItem(item_id, reclaim->count, 0, 0, 0, 0, 0, false, SLOT_CURSOR);
|
SummonItem(item_id, reclaim->count, 0, 0, 0, 0, 0, false, MainCursor);
|
||||||
AddAlternateCurrencyValue(reclaim->currency_id, -((int32)reclaim->count));
|
AddAlternateCurrencyValue(reclaim->currency_id, -((int32)reclaim->count));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -293,7 +293,7 @@ bool Client::Process() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(AutoFireEnabled()){
|
if(AutoFireEnabled()){
|
||||||
ItemInst *ranged = GetInv().GetItem(SLOT_RANGE);
|
ItemInst *ranged = GetInv().GetItem(MainRange);
|
||||||
if(ranged)
|
if(ranged)
|
||||||
{
|
{
|
||||||
if(ranged->GetItem() && ranged->GetItem()->ItemType == ItemTypeBow){
|
if(ranged->GetItem() && ranged->GetItem()->ItemType == ItemTypeBow){
|
||||||
@ -404,7 +404,7 @@ bool Client::Process() {
|
|||||||
} else {
|
} else {
|
||||||
Attack(auto_attack_target, 13); // Kaiyodo - added attacking hand to arguments
|
Attack(auto_attack_target, 13); // Kaiyodo - added attacking hand to arguments
|
||||||
}
|
}
|
||||||
ItemInst *wpn = GetInv().GetItem(SLOT_PRIMARY);
|
ItemInst *wpn = GetInv().GetItem(MainPrimary);
|
||||||
TryWeaponProc(wpn, auto_attack_target, 13);
|
TryWeaponProc(wpn, auto_attack_target, 13);
|
||||||
|
|
||||||
bool tripleAttackSuccess = false;
|
bool tripleAttackSuccess = false;
|
||||||
@ -452,7 +452,7 @@ bool Client::Process() {
|
|||||||
int16 ExtraAttackChanceBonus = spellbonuses.ExtraAttackChance + itembonuses.ExtraAttackChance + aabonuses.ExtraAttackChance;
|
int16 ExtraAttackChanceBonus = spellbonuses.ExtraAttackChance + itembonuses.ExtraAttackChance + aabonuses.ExtraAttackChance;
|
||||||
|
|
||||||
if (auto_attack_target && ExtraAttackChanceBonus) {
|
if (auto_attack_target && ExtraAttackChanceBonus) {
|
||||||
ItemInst *wpn = GetInv().GetItem(SLOT_PRIMARY);
|
ItemInst *wpn = GetInv().GetItem(MainPrimary);
|
||||||
if(wpn){
|
if(wpn){
|
||||||
if(wpn->GetItem()->ItemType == ItemType2HSlash ||
|
if(wpn->GetItem()->ItemType == ItemType2HSlash ||
|
||||||
wpn->GetItem()->ItemType == ItemType2HBlunt ||
|
wpn->GetItem()->ItemType == ItemType2HBlunt ||
|
||||||
@ -511,7 +511,7 @@ bool Client::Process() {
|
|||||||
} else {
|
} else {
|
||||||
Attack(auto_attack_target, 14); // Single attack with offhand
|
Attack(auto_attack_target, 14); // Single attack with offhand
|
||||||
}
|
}
|
||||||
ItemInst *wpn = GetInv().GetItem(SLOT_SECONDARY);
|
ItemInst *wpn = GetInv().GetItem(MainSecondary);
|
||||||
TryWeaponProc(wpn, auto_attack_target, 14);
|
TryWeaponProc(wpn, auto_attack_target, 14);
|
||||||
|
|
||||||
if( CanThisClassDoubleAttack() && CheckDoubleAttack()) {
|
if( CanThisClassDoubleAttack() && CheckDoubleAttack()) {
|
||||||
@ -1217,7 +1217,7 @@ void Client::OPMemorizeSpell(const EQApplicationPacket* app)
|
|||||||
switch(memspell->scribing)
|
switch(memspell->scribing)
|
||||||
{
|
{
|
||||||
case memSpellScribing: { // scribing spell to book
|
case memSpellScribing: { // scribing spell to book
|
||||||
const ItemInst* inst = m_inv[SLOT_CURSOR];
|
const ItemInst* inst = m_inv[MainCursor];
|
||||||
|
|
||||||
if(inst && inst->IsType(ItemClassCommon))
|
if(inst && inst->IsType(ItemClassCommon))
|
||||||
{
|
{
|
||||||
@ -1226,7 +1226,7 @@ void Client::OPMemorizeSpell(const EQApplicationPacket* app)
|
|||||||
if(item && item->Scroll.Effect == (int32)(memspell->spell_id))
|
if(item && item->Scroll.Effect == (int32)(memspell->spell_id))
|
||||||
{
|
{
|
||||||
ScribeSpell(memspell->spell_id, memspell->slot);
|
ScribeSpell(memspell->spell_id, memspell->slot);
|
||||||
DeleteItemInInventory(SLOT_CURSOR, 1, true);
|
DeleteItemInInventory(MainCursor, 1, true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Message(0,"Scribing spell: inst exists but item does not or spell ids do not match.");
|
Message(0,"Scribing spell: inst exists but item does not or spell ids do not match.");
|
||||||
|
|||||||
@ -2977,12 +2977,12 @@ void command_peekinv(Client *c, const Seperator *sep)
|
|||||||
if(client->GetInv().CursorEmpty()) { // Display 'front' cursor slot even if 'empty' (item(30[0]) == null)
|
if(client->GetInv().CursorEmpty()) { // Display 'front' cursor slot even if 'empty' (item(30[0]) == null)
|
||||||
if (c->GetClientVersion() >= EQClientSoF)
|
if (c->GetClientVersion() >= EQClientSoF)
|
||||||
{
|
{
|
||||||
c->Message((item==0), "CursorSlot: %i, Depth: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i", SLOT_CURSOR,i,
|
c->Message((item == 0), "CursorSlot: %i, Depth: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i", MainCursor, i,
|
||||||
0, 0x12, 0, "null", 0x12, 0);
|
0, 0x12, 0, "null", 0x12, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
c->Message((item==0), "CursorSlot: %i, Depth: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i", SLOT_CURSOR,i,
|
c->Message((item == 0), "CursorSlot: %i, Depth: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i", MainCursor, i,
|
||||||
0, 0x12, 0, "null", 0x12, 0);
|
0, 0x12, 0, "null", 0x12, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2992,14 +2992,14 @@ void command_peekinv(Client *c, const Seperator *sep)
|
|||||||
item = (inst) ? inst->GetItem() : nullptr;
|
item = (inst) ? inst->GetItem() : nullptr;
|
||||||
if (c->GetClientVersion() >= EQClientSoF)
|
if (c->GetClientVersion() >= EQClientSoF)
|
||||||
{
|
{
|
||||||
c->Message((item==0), "CursorSlot: %i, Depth: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i", SLOT_CURSOR,i,
|
c->Message((item == 0), "CursorSlot: %i, Depth: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i", MainCursor, i,
|
||||||
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
|
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
|
||||||
((item==0)?"null":item->Name), 0x12,
|
((item==0)?"null":item->Name), 0x12,
|
||||||
((item==0)?0:inst->GetCharges()));
|
((item==0)?0:inst->GetCharges()));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
c->Message((item==0), "CursorSlot: %i, Depth: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i", SLOT_CURSOR,i,
|
c->Message((item == 0), "CursorSlot: %i, Depth: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i", MainCursor, i,
|
||||||
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
|
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
|
||||||
((item==0)?"null":item->Name), 0x12,
|
((item==0)?"null":item->Name), 0x12,
|
||||||
((item==0)?0:inst->GetCharges()));
|
((item==0)?0:inst->GetCharges()));
|
||||||
@ -3007,21 +3007,21 @@ void command_peekinv(Client *c, const Seperator *sep)
|
|||||||
|
|
||||||
if (inst && inst->IsType(ItemClassContainer) && i==0) { // 'CSD 1' - only display contents of slot 30[0] container..higher ones don't exist
|
if (inst && inst->IsType(ItemClassContainer) && i==0) { // 'CSD 1' - only display contents of slot 30[0] container..higher ones don't exist
|
||||||
for (uint8 j=0; j<10; j++) {
|
for (uint8 j=0; j<10; j++) {
|
||||||
const ItemInst* instbag = client->GetInv().GetItem(SLOT_CURSOR, j);
|
const ItemInst* instbag = client->GetInv().GetItem(MainCursor, j);
|
||||||
item = (instbag) ? instbag->GetItem() : nullptr;
|
item = (instbag) ? instbag->GetItem() : nullptr;
|
||||||
if (c->GetClientVersion() >= EQClientSoF)
|
if (c->GetClientVersion() >= EQClientSoF)
|
||||||
{
|
{
|
||||||
c->Message((item==0), " CursorBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i",
|
c->Message((item==0), " CursorBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i",
|
||||||
Inventory::CalcSlotId(SLOT_CURSOR, j),
|
Inventory::CalcSlotId(MainCursor, j),
|
||||||
SLOT_CURSOR, j, ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
|
MainCursor, j, ((item == 0) ? 0 : item->ID), 0x12, ((item == 0) ? 0 : item->ID),
|
||||||
((item==0)?"null":item->Name), 0x12,
|
((item==0)?"null":item->Name), 0x12,
|
||||||
((item==0)?0:instbag->GetCharges()));
|
((item==0)?0:instbag->GetCharges()));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
c->Message((item==0), " CursorBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i",
|
c->Message((item==0), " CursorBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i",
|
||||||
Inventory::CalcSlotId(SLOT_CURSOR, j),
|
Inventory::CalcSlotId(MainCursor, j),
|
||||||
SLOT_CURSOR, j, ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
|
MainCursor, j, ((item == 0) ? 0 : item->ID), 0x12, ((item == 0) ? 0 : item->ID),
|
||||||
((item==0)?"null":item->Name), 0x12,
|
((item==0)?"null":item->Name), 0x12,
|
||||||
((item==0)?0:instbag->GetCharges()));
|
((item==0)?0:instbag->GetCharges()));
|
||||||
}
|
}
|
||||||
@ -3533,7 +3533,7 @@ void command_equipitem(Client *c, const Seperator *sep)
|
|||||||
{
|
{
|
||||||
uint32 slot_id = atoi(sep->arg[1]);
|
uint32 slot_id = atoi(sep->arg[1]);
|
||||||
if (sep->IsNumber(1) && (slot_id>=0) && (slot_id<=21)) {
|
if (sep->IsNumber(1) && (slot_id>=0) && (slot_id<=21)) {
|
||||||
const ItemInst* from_inst = c->GetInv().GetItem(SLOT_CURSOR);
|
const ItemInst* from_inst = c->GetInv().GetItem(MainCursor);
|
||||||
const ItemInst* to_inst = c->GetInv().GetItem(slot_id); // added (desync issue when forcing stack to stack)
|
const ItemInst* to_inst = c->GetInv().GetItem(slot_id); // added (desync issue when forcing stack to stack)
|
||||||
bool partialmove = false;
|
bool partialmove = false;
|
||||||
int16 movecount;
|
int16 movecount;
|
||||||
@ -3541,7 +3541,7 @@ void command_equipitem(Client *c, const Seperator *sep)
|
|||||||
if (from_inst && from_inst->IsType(ItemClassCommon)) {
|
if (from_inst && from_inst->IsType(ItemClassCommon)) {
|
||||||
EQApplicationPacket* outapp = new EQApplicationPacket(OP_MoveItem, sizeof(MoveItem_Struct));
|
EQApplicationPacket* outapp = new EQApplicationPacket(OP_MoveItem, sizeof(MoveItem_Struct));
|
||||||
MoveItem_Struct* mi = (MoveItem_Struct*)outapp->pBuffer;
|
MoveItem_Struct* mi = (MoveItem_Struct*)outapp->pBuffer;
|
||||||
mi->from_slot = SLOT_CURSOR;
|
mi->from_slot = MainCursor;
|
||||||
mi->to_slot = slot_id;
|
mi->to_slot = slot_id;
|
||||||
// mi->number_in_stack = from_inst->GetCharges(); // replaced with con check for stacking
|
// mi->number_in_stack = from_inst->GetCharges(); // replaced with con check for stacking
|
||||||
|
|
||||||
@ -4698,7 +4698,7 @@ void command_goto(Client *c, const Seperator *sep)
|
|||||||
|
|
||||||
void command_iteminfo(Client *c, const Seperator *sep)
|
void command_iteminfo(Client *c, const Seperator *sep)
|
||||||
{
|
{
|
||||||
const ItemInst* inst = c->GetInv()[SLOT_CURSOR];
|
const ItemInst* inst = c->GetInv()[MainCursor];
|
||||||
|
|
||||||
if (!inst)
|
if (!inst)
|
||||||
c->Message(13, "Error: You need an item on your cursor for this command");
|
c->Message(13, "Error: You need an item on your cursor for this command");
|
||||||
|
|||||||
@ -421,7 +421,7 @@ Corpse::Corpse(Client* client, int32 in_rezexp)
|
|||||||
|
|
||||||
if(cursor) { // all cursor items should be on corpse (client < SoF or RespawnFromHover = false)
|
if(cursor) { // all cursor items should be on corpse (client < SoF or RespawnFromHover = false)
|
||||||
while(!client->GetInv().CursorEmpty())
|
while(!client->GetInv().CursorEmpty())
|
||||||
client->DeleteItemInInventory(SLOT_CURSOR, 0, false, false);
|
client->DeleteItemInInventory(MainCursor, 0, false, false);
|
||||||
}
|
}
|
||||||
else { // only visible cursor made it to corpse (client >= Sof and RespawnFromHover = true)
|
else { // only visible cursor made it to corpse (client >= Sof and RespawnFromHover = true)
|
||||||
std::list<ItemInst*>::const_iterator start = client->GetInv().cursor_begin();
|
std::list<ItemInst*>::const_iterator start = client->GetInv().cursor_begin();
|
||||||
@ -1013,7 +1013,7 @@ void Corpse::MakeLootRequestPackets(Client* client, const EQApplicationPacket* a
|
|||||||
// Dont display the item if it's in a bag
|
// Dont display the item if it's in a bag
|
||||||
|
|
||||||
// Added cursor queue slots to corpse item visibility list. Nothing else should be making it to corpse.
|
// Added cursor queue slots to corpse item visibility list. Nothing else should be making it to corpse.
|
||||||
if(!IsPlayerCorpse() || item_data->equipSlot <= 30 || item_data->equipSlot == 9999 || tCanLoot>=3 ||
|
if(!IsPlayerCorpse() || item_data->equipSlot <= MainCursor || item_data->equipSlot == MainPowerSource || tCanLoot>=3 ||
|
||||||
(item_data->equipSlot >= 8000 && item_data->equipSlot <= 8999)) {
|
(item_data->equipSlot >= 8000 && item_data->equipSlot <= 8999)) {
|
||||||
if(i < corpselootlimit) {
|
if(i < corpselootlimit) {
|
||||||
item = database.GetItem(item_data->item_id);
|
item = database.GetItem(item_data->item_id);
|
||||||
@ -1145,7 +1145,7 @@ void Corpse::LootItem(Client* client, const EQApplicationPacket* app)
|
|||||||
|
|
||||||
if(inst->IsAugmented())
|
if(inst->IsAugmented())
|
||||||
{
|
{
|
||||||
for(int i=0; i<MAX_AUGMENT_SLOTS; i++)
|
for (int i = 0; i<EmuConstants::ITEM_COMMON_SIZE; i++)
|
||||||
{
|
{
|
||||||
ItemInst *itm = inst->GetAugment(i);
|
ItemInst *itm = inst->GetAugment(i);
|
||||||
if(itm)
|
if(itm)
|
||||||
@ -1227,11 +1227,11 @@ void Corpse::LootItem(Client* client, const EQApplicationPacket* app)
|
|||||||
if(lootitem->auto_loot)
|
if(lootitem->auto_loot)
|
||||||
{
|
{
|
||||||
if(!client->AutoPutLootInInventory(*inst, true, true, bag_item_data))
|
if(!client->AutoPutLootInInventory(*inst, true, true, bag_item_data))
|
||||||
client->PutLootInInventory(SLOT_CURSOR, *inst, bag_item_data);
|
client->PutLootInInventory(MainCursor, *inst, bag_item_data);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
client->PutLootInInventory(SLOT_CURSOR, *inst, bag_item_data);
|
client->PutLootInInventory(MainCursor, *inst, bag_item_data);
|
||||||
}
|
}
|
||||||
// Update any tasks that have an activity to loot this item.
|
// Update any tasks that have an activity to loot this item.
|
||||||
if(RuleB(TaskSystem, EnableTaskSystem))
|
if(RuleB(TaskSystem, EnableTaskSystem))
|
||||||
|
|||||||
@ -162,7 +162,7 @@ void Doors::HandleClick(Client* sender, uint8 trigger)
|
|||||||
{
|
{
|
||||||
if(!sender->KeyRingCheck(RuleI(Adventure, ItemIDToEnablePorts)))
|
if(!sender->KeyRingCheck(RuleI(Adventure, ItemIDToEnablePorts)))
|
||||||
{
|
{
|
||||||
if(sender->GetInv().HasItem(RuleI(Adventure, ItemIDToEnablePorts)) == SLOT_INVALID)
|
if (sender->GetInv().HasItem(RuleI(Adventure, ItemIDToEnablePorts)) == INVALID_INDEX)
|
||||||
{
|
{
|
||||||
sender->Message_StringID(13, DUNGEON_SEALED);
|
sender->Message_StringID(13, DUNGEON_SEALED);
|
||||||
safe_delete(outapp);
|
safe_delete(outapp);
|
||||||
@ -195,11 +195,11 @@ void Doors::HandleClick(Client* sender, uint8 trigger)
|
|||||||
uint8 keepoffkeyring = GetNoKeyring();
|
uint8 keepoffkeyring = GetNoKeyring();
|
||||||
uint32 haskey = 0;
|
uint32 haskey = 0;
|
||||||
uint32 playerkey = 0;
|
uint32 playerkey = 0;
|
||||||
const ItemInst *lockpicks = sender->GetInv().GetItem(SLOT_CURSOR);
|
const ItemInst *lockpicks = sender->GetInv().GetItem(MainCursor);
|
||||||
|
|
||||||
haskey = sender->GetInv().HasItem(keyneeded, 1);
|
haskey = sender->GetInv().HasItem(keyneeded, 1);
|
||||||
|
|
||||||
if(haskey != SLOT_INVALID)
|
if (haskey != INVALID_INDEX)
|
||||||
{
|
{
|
||||||
playerkey = keyneeded;
|
playerkey = keyneeded;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -206,10 +206,10 @@ uint32 ZoneDatabase::GetZoneFishing(uint32 ZoneID, uint8 skill, uint32 &npc_id,
|
|||||||
//we need this function to immediately determine, after we receive OP_Fishing, if we can even try to fish, otherwise we have to wait a while to get the failure
|
//we need this function to immediately determine, after we receive OP_Fishing, if we can even try to fish, otherwise we have to wait a while to get the failure
|
||||||
bool Client::CanFish() {
|
bool Client::CanFish() {
|
||||||
//make sure we still have a fishing pole on:
|
//make sure we still have a fishing pole on:
|
||||||
const ItemInst* Pole = m_inv[SLOT_PRIMARY];
|
const ItemInst* Pole = m_inv[MainPrimary];
|
||||||
int32 bslot = m_inv.HasItemByUse(ItemTypeFishingBait, 1, invWhereWorn|invWherePersonal);
|
int32 bslot = m_inv.HasItemByUse(ItemTypeFishingBait, 1, invWhereWorn|invWherePersonal);
|
||||||
const ItemInst* Bait = nullptr;
|
const ItemInst* Bait = nullptr;
|
||||||
if(bslot != SLOT_INVALID)
|
if (bslot != INVALID_INDEX)
|
||||||
Bait = m_inv.GetItem(bslot);
|
Bait = m_inv.GetItem(bslot);
|
||||||
|
|
||||||
if(!Pole || !Pole->IsType(ItemClassCommon) || Pole->GetItem()->ItemType != ItemTypeFishingPole) {
|
if(!Pole || !Pole->IsType(ItemClassCommon) || Pole->GetItem()->ItemType != ItemTypeFishingPole) {
|
||||||
@ -297,7 +297,7 @@ void Client::GoFish()
|
|||||||
//make sure we still have a fishing pole on:
|
//make sure we still have a fishing pole on:
|
||||||
int32 bslot = m_inv.HasItemByUse(ItemTypeFishingBait, 1, invWhereWorn|invWherePersonal);
|
int32 bslot = m_inv.HasItemByUse(ItemTypeFishingBait, 1, invWhereWorn|invWherePersonal);
|
||||||
const ItemInst* Bait = nullptr;
|
const ItemInst* Bait = nullptr;
|
||||||
if(bslot != SLOT_INVALID)
|
if (bslot != INVALID_INDEX)
|
||||||
Bait = m_inv.GetItem(bslot);
|
Bait = m_inv.GetItem(bslot);
|
||||||
|
|
||||||
//if the bait isnt equipped, need to add its skill bonus
|
//if the bait isnt equipped, need to add its skill bonus
|
||||||
@ -358,12 +358,12 @@ void Client::GoFish()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
PushItemOnCursor(*inst);
|
PushItemOnCursor(*inst);
|
||||||
SendItemPacket(SLOT_CURSOR,inst,ItemPacketSummonItem);
|
SendItemPacket(MainCursor, inst, ItemPacketSummonItem);
|
||||||
if(RuleB(TaskSystem, EnableTaskSystem))
|
if(RuleB(TaskSystem, EnableTaskSystem))
|
||||||
UpdateTasksForItem(ActivityFish, food_id);
|
UpdateTasksForItem(ActivityFish, food_id);
|
||||||
|
|
||||||
safe_delete(inst);
|
safe_delete(inst);
|
||||||
inst = m_inv.GetItem(SLOT_CURSOR);
|
inst = m_inv.GetItem(MainCursor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -472,12 +472,12 @@ void Client::ForageItem(bool guarantee) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PushItemOnCursor(*inst);
|
PushItemOnCursor(*inst);
|
||||||
SendItemPacket(SLOT_CURSOR, inst, ItemPacketSummonItem);
|
SendItemPacket(MainCursor, inst, ItemPacketSummonItem);
|
||||||
if(RuleB(TaskSystem, EnableTaskSystem))
|
if(RuleB(TaskSystem, EnableTaskSystem))
|
||||||
UpdateTasksForItem(ActivityForage, foragedfood);
|
UpdateTasksForItem(ActivityForage, foragedfood);
|
||||||
|
|
||||||
safe_delete(inst);
|
safe_delete(inst);
|
||||||
inst = m_inv.GetItem(SLOT_CURSOR);
|
inst = m_inv.GetItem(MainCursor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -194,10 +194,10 @@ bool Client::CheckLoreConflict(const Item_Struct* item) {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (item->LoreGroup == -1) // Standard lore items; look everywhere except the shared bank, return the result
|
if (item->LoreGroup == -1) // Standard lore items; look everywhere except the shared bank, return the result
|
||||||
return (m_inv.HasItem(item->ID, 0, ~invWhereSharedBank) != SLOT_INVALID);
|
return (m_inv.HasItem(item->ID, 0, ~invWhereSharedBank) != INVALID_INDEX);
|
||||||
|
|
||||||
//If the item has a lore group, we check for other items with the same group and return the result
|
//If the item has a lore group, we check for other items with the same group and return the result
|
||||||
return (m_inv.HasItemByLoreGroup(item->LoreGroup, ~invWhereSharedBank) != SLOT_INVALID);
|
return (m_inv.HasItemByLoreGroup(item->LoreGroup, ~invWhereSharedBank) != INVALID_INDEX);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, bool attuned, uint16 to_slot) {
|
bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, bool attuned, uint16 to_slot) {
|
||||||
@ -244,7 +244,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2,
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
uint32 augments[MAX_AUGMENT_SLOTS] = { aug1, aug2, aug3, aug4, aug5 };
|
uint32 augments[EmuConstants::ITEM_COMMON_SIZE] = { aug1, aug2, aug3, aug4, aug5 };
|
||||||
|
|
||||||
uint32 classes = item->Classes;
|
uint32 classes = item->Classes;
|
||||||
uint32 races = item->Races;
|
uint32 races = item->Races;
|
||||||
@ -254,7 +254,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2,
|
|||||||
bool enforcerestr = RuleB(Inventory, EnforceAugmentRestriction);
|
bool enforcerestr = RuleB(Inventory, EnforceAugmentRestriction);
|
||||||
bool enforceusable = RuleB(Inventory, EnforceAugmentUsability);
|
bool enforceusable = RuleB(Inventory, EnforceAugmentUsability);
|
||||||
|
|
||||||
for(int iter = 0; iter < MAX_AUGMENT_SLOTS; ++iter) {
|
for (int iter = 0; iter < EmuConstants::ITEM_COMMON_SIZE; ++iter) {
|
||||||
const Item_Struct* augtest = database.GetItem(augments[iter]);
|
const Item_Struct* augtest = database.GetItem(augments[iter]);
|
||||||
|
|
||||||
if(augtest == nullptr) {
|
if(augtest == nullptr) {
|
||||||
@ -548,7 +548,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// add any validated augments
|
// add any validated augments
|
||||||
for(int iter = 0; iter < MAX_AUGMENT_SLOTS; ++iter) {
|
for (int iter = 0; iter < EmuConstants::ITEM_COMMON_SIZE; ++iter) {
|
||||||
if(augments[iter])
|
if(augments[iter])
|
||||||
inst->PutAugment(&database, iter, augments[iter]);
|
inst->PutAugment(&database, iter, augments[iter]);
|
||||||
}
|
}
|
||||||
@ -558,22 +558,22 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2,
|
|||||||
inst->SetInstNoDrop(true);
|
inst->SetInstNoDrop(true);
|
||||||
|
|
||||||
// check to see if item is usable in requested slot
|
// check to see if item is usable in requested slot
|
||||||
if(enforceusable && (((to_slot >= 0) && (to_slot <= 21)) || (to_slot == 9999))) {
|
if(enforceusable && (((to_slot >= MainCharm) && (to_slot <= MainAmmo)) || (to_slot == MainPowerSource))) {
|
||||||
uint32 slottest = (to_slot == 9999) ? 22 : to_slot;
|
uint32 slottest = (to_slot == MainPowerSource) ? 22 : to_slot; // can't change '22' just yet...
|
||||||
|
|
||||||
if(!(slots & ((uint32)1 << slottest))) {
|
if(!(slots & ((uint32)1 << slottest))) {
|
||||||
Message(0, "This item is not equipable at slot %u - moving to cursor.", to_slot);
|
Message(0, "This item is not equipable at slot %u - moving to cursor.", to_slot);
|
||||||
mlog(INVENTORY__ERROR, "Player %s on account %s attempted to equip an item unusable in slot %u - moved to cursor.\n(Item: %u, Aug1: %u, Aug2: %u, Aug3: %u, Aug4: %u, Aug5: %u)\n",
|
mlog(INVENTORY__ERROR, "Player %s on account %s attempted to equip an item unusable in slot %u - moved to cursor.\n(Item: %u, Aug1: %u, Aug2: %u, Aug3: %u, Aug4: %u, Aug5: %u)\n",
|
||||||
GetName(), account_name, to_slot, item->ID, aug1, aug2, aug3, aug4, aug5);
|
GetName(), account_name, to_slot, item->ID, aug1, aug2, aug3, aug4, aug5);
|
||||||
|
|
||||||
to_slot = SLOT_CURSOR;
|
to_slot = MainCursor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// put item into inventory
|
// put item into inventory
|
||||||
if(to_slot == SLOT_CURSOR) {
|
if (to_slot == MainCursor) {
|
||||||
PushItemOnCursor(*inst);
|
PushItemOnCursor(*inst);
|
||||||
SendItemPacket(SLOT_CURSOR, inst, ItemPacketSummonItem);
|
SendItemPacket(MainCursor, inst, ItemPacketSummonItem);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PutItemInInventory(to_slot, *inst, true);
|
PutItemInInventory(to_slot, *inst, true);
|
||||||
@ -586,7 +586,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2,
|
|||||||
if(!IsDiscovered(item_id))
|
if(!IsDiscovered(item_id))
|
||||||
DiscoverItem(item_id);
|
DiscoverItem(item_id);
|
||||||
|
|
||||||
for(int iter = 0; iter < MAX_AUGMENT_SLOTS; ++iter) {
|
for (int iter = 0; iter < EmuConstants::ITEM_COMMON_SIZE; ++iter) {
|
||||||
if(augments[iter] && !IsDiscovered(augments[iter]))
|
if(augments[iter] && !IsDiscovered(augments[iter]))
|
||||||
DiscoverItem(augments[iter]);
|
DiscoverItem(augments[iter]);
|
||||||
}
|
}
|
||||||
@ -619,7 +619,7 @@ void Client::DropItem(int16 slot_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Save client inventory change to database
|
// Save client inventory change to database
|
||||||
if(slot_id == SLOT_CURSOR) {
|
if (slot_id == MainCursor) {
|
||||||
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
||||||
database.SaveCursor(CharacterID(), s, e);
|
database.SaveCursor(CharacterID(), s, e);
|
||||||
} else {
|
} else {
|
||||||
@ -755,7 +755,7 @@ void Client::DeleteItemInInventory(int16 slot_id, int8 quantity, bool client_upd
|
|||||||
bool isDeleted = m_inv.DeleteItem(slot_id, quantity);
|
bool isDeleted = m_inv.DeleteItem(slot_id, quantity);
|
||||||
|
|
||||||
const ItemInst* inst=nullptr;
|
const ItemInst* inst=nullptr;
|
||||||
if (slot_id==SLOT_CURSOR) {
|
if (slot_id == MainCursor) {
|
||||||
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
||||||
if(update_db)
|
if(update_db)
|
||||||
database.SaveCursor(character_id, s, e);
|
database.SaveCursor(character_id, s, e);
|
||||||
@ -807,7 +807,7 @@ bool Client::PushItemOnCursor(const ItemInst& inst, bool client_update)
|
|||||||
m_inv.PushCursor(inst);
|
m_inv.PushCursor(inst);
|
||||||
|
|
||||||
if (client_update) {
|
if (client_update) {
|
||||||
SendItemPacket(SLOT_CURSOR, &inst, ItemPacketSummonItem);
|
SendItemPacket(MainCursor, &inst, ItemPacketSummonItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
||||||
@ -817,7 +817,7 @@ bool Client::PushItemOnCursor(const ItemInst& inst, bool client_update)
|
|||||||
bool Client::PutItemInInventory(int16 slot_id, const ItemInst& inst, bool client_update)
|
bool Client::PutItemInInventory(int16 slot_id, const ItemInst& inst, bool client_update)
|
||||||
{
|
{
|
||||||
mlog(INVENTORY__SLOTS, "Putting item %s (%d) into slot %d", inst.GetItem()->Name, inst.GetItem()->ID, slot_id);
|
mlog(INVENTORY__SLOTS, "Putting item %s (%d) into slot %d", inst.GetItem()->Name, inst.GetItem()->ID, slot_id);
|
||||||
if (slot_id==SLOT_CURSOR)
|
if (slot_id == MainCursor)
|
||||||
{
|
{
|
||||||
return PushItemOnCursor(inst,client_update);
|
return PushItemOnCursor(inst,client_update);
|
||||||
}
|
}
|
||||||
@ -825,10 +825,10 @@ bool Client::PutItemInInventory(int16 slot_id, const ItemInst& inst, bool client
|
|||||||
m_inv.PutItem(slot_id, inst);
|
m_inv.PutItem(slot_id, inst);
|
||||||
|
|
||||||
if (client_update) {
|
if (client_update) {
|
||||||
SendItemPacket(slot_id, &inst, (slot_id==SLOT_CURSOR)?ItemPacketSummonItem:ItemPacketTrade);
|
SendItemPacket(slot_id, &inst, (slot_id == MainCursor) ? ItemPacketSummonItem : ItemPacketTrade);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (slot_id==SLOT_CURSOR) {
|
if (slot_id == MainCursor) {
|
||||||
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
||||||
return database.SaveCursor(this->CharacterID(), s, e);
|
return database.SaveCursor(this->CharacterID(), s, e);
|
||||||
} else
|
} else
|
||||||
@ -844,7 +844,7 @@ void Client::PutLootInInventory(int16 slot_id, const ItemInst &inst, ServerLootI
|
|||||||
|
|
||||||
SendLootItemInPacket(&inst, slot_id);
|
SendLootItemInPacket(&inst, slot_id);
|
||||||
|
|
||||||
if (slot_id==SLOT_CURSOR) {
|
if (slot_id == MainCursor) {
|
||||||
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
||||||
database.SaveCursor(this->CharacterID(), s, e);
|
database.SaveCursor(this->CharacterID(), s, e);
|
||||||
} else
|
} else
|
||||||
@ -919,25 +919,25 @@ bool Client::AutoPutLootInInventory(ItemInst& inst, bool try_worn, bool try_curs
|
|||||||
|
|
||||||
if (!m_inv[i])
|
if (!m_inv[i])
|
||||||
{
|
{
|
||||||
if( i == SLOT_PRIMARY && inst.IsWeapon() ) // If item is primary slot weapon
|
if( i == MainPrimary && inst.IsWeapon() ) // If item is primary slot weapon
|
||||||
{
|
{
|
||||||
if( (inst.GetItem()->ItemType == ItemType2HSlash) || (inst.GetItem()->ItemType == ItemType2HBlunt) || (inst.GetItem()->ItemType == ItemType2HPiercing) ) // and uses 2hs \ 2hb \ 2hp
|
if( (inst.GetItem()->ItemType == ItemType2HSlash) || (inst.GetItem()->ItemType == ItemType2HBlunt) || (inst.GetItem()->ItemType == ItemType2HPiercing) ) // and uses 2hs \ 2hb \ 2hp
|
||||||
{
|
{
|
||||||
if( m_inv[SLOT_SECONDARY] ) // and if secondary slot is not empty
|
if( m_inv[MainSecondary] ) // and if secondary slot is not empty
|
||||||
{
|
{
|
||||||
continue; // Can't auto-equip
|
continue; // Can't auto-equip
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( i== SLOT_SECONDARY && m_inv[SLOT_PRIMARY]) // check to see if primary slot is a two hander
|
if( i== MainSecondary && m_inv[MainPrimary]) // check to see if primary slot is a two hander
|
||||||
{
|
{
|
||||||
uint8 use = m_inv[SLOT_PRIMARY]->GetItem()->ItemType;
|
uint8 use = m_inv[MainPrimary]->GetItem()->ItemType;
|
||||||
if(use == ItemType2HSlash || use == ItemType2HBlunt || use == ItemType2HPiercing)
|
if(use == ItemType2HSlash || use == ItemType2HBlunt || use == ItemType2HPiercing)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
i == SLOT_SECONDARY &&
|
i == MainSecondary &&
|
||||||
inst.IsWeapon() &&
|
inst.IsWeapon() &&
|
||||||
!CanThisClassDualWield()
|
!CanThisClassDualWield()
|
||||||
)
|
)
|
||||||
@ -972,7 +972,7 @@ bool Client::AutoPutLootInInventory(ItemInst& inst, bool try_worn, bool try_curs
|
|||||||
// #3: put it in inventory
|
// #3: put it in inventory
|
||||||
bool is_arrow = (inst.GetItem()->ItemType == ItemTypeArrow) ? true : false;
|
bool is_arrow = (inst.GetItem()->ItemType == ItemTypeArrow) ? true : false;
|
||||||
int16 slot_id = m_inv.FindFreeSlot(inst.IsType(ItemClassContainer), try_cursor, inst.GetItem()->Size, is_arrow);
|
int16 slot_id = m_inv.FindFreeSlot(inst.IsType(ItemClassContainer), try_cursor, inst.GetItem()->Size, is_arrow);
|
||||||
if (slot_id != SLOT_INVALID)
|
if (slot_id != INVALID_INDEX)
|
||||||
{
|
{
|
||||||
PutLootInInventory(slot_id, inst, bag_item_data);
|
PutLootInInventory(slot_id, inst, bag_item_data);
|
||||||
return true;
|
return true;
|
||||||
@ -1000,7 +1000,7 @@ void Client::MoveItemCharges(ItemInst &from, int16 to_slot, uint8 type)
|
|||||||
tmp_inst->SetCharges(tmp_inst->GetCharges() + charges_to_move);
|
tmp_inst->SetCharges(tmp_inst->GetCharges() + charges_to_move);
|
||||||
from.SetCharges(from.GetCharges() - charges_to_move);
|
from.SetCharges(from.GetCharges() - charges_to_move);
|
||||||
SendLootItemInPacket(tmp_inst, to_slot);
|
SendLootItemInPacket(tmp_inst, to_slot);
|
||||||
if (to_slot==SLOT_CURSOR){
|
if (to_slot == MainCursor){
|
||||||
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
||||||
database.SaveCursor(this->CharacterID(), s, e);
|
database.SaveCursor(this->CharacterID(), s, e);
|
||||||
} else
|
} else
|
||||||
@ -1224,10 +1224,9 @@ void Client::SendLootItemInPacket(const ItemInst* inst, int16 slot_id)
|
|||||||
SendItemPacket(slot_id,inst, ItemPacketTrade);
|
SendItemPacket(slot_id,inst, ItemPacketTrade);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Client::IsValidSlot(uint32 slot)
|
bool Client::IsValidSlot(uint32 slot) {
|
||||||
{
|
if ((slot == (uint32)INVALID_INDEX) || // Destroying/Dropping item
|
||||||
if((slot == (uint32)SLOT_INVALID) || // Destroying/Dropping item
|
(slot >= MainCharm && slot <= MainCursor) || // Worn inventory, normal inventory, and cursor
|
||||||
(slot >= 0 && slot <= 30) || // Worn inventory, normal inventory, and cursor
|
|
||||||
(slot >= 251 && slot <= 340) || // Normal inventory bags and cursor bag
|
(slot >= 251 && slot <= 340) || // Normal inventory bags and cursor bag
|
||||||
(slot >= 400 && slot <= 404) || // Tribute
|
(slot >= 400 && slot <= 404) || // Tribute
|
||||||
(slot >= 2000 && slot <= 2023) || // Bank
|
(slot >= 2000 && slot <= 2023) || // Bank
|
||||||
@ -1236,14 +1235,11 @@ bool Client::IsValidSlot(uint32 slot)
|
|||||||
(slot >= 2531 && slot <= 2550) || // Shared bank bags
|
(slot >= 2531 && slot <= 2550) || // Shared bank bags
|
||||||
(slot >= 3000 && slot <= 3007) || // Trade window
|
(slot >= 3000 && slot <= 3007) || // Trade window
|
||||||
(slot >= 4000 && slot <= 4009) || // Tradeskill container
|
(slot >= 4000 && slot <= 4009) || // Tradeskill container
|
||||||
(slot == 9999)) // Power Source
|
(slot == MainPowerSource)) // Power Source
|
||||||
{
|
|
||||||
return true;
|
return true;
|
||||||
}
|
else
|
||||||
else {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
bool Client::IsBankSlot(uint32 slot)
|
bool Client::IsBankSlot(uint32 slot)
|
||||||
{
|
{
|
||||||
@ -1289,12 +1285,12 @@ bool Client::SwapItem(MoveItem_Struct* move_in) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (move_in->to_slot == (uint32)SLOT_INVALID) {
|
if (move_in->to_slot == (uint32)INVALID_INDEX) {
|
||||||
if(move_in->from_slot == (uint32)SLOT_CURSOR) {
|
if (move_in->from_slot == (uint32)MainCursor) {
|
||||||
mlog(INVENTORY__SLOTS, "Client destroyed item from cursor slot %d", move_in->from_slot);
|
mlog(INVENTORY__SLOTS, "Client destroyed item from cursor slot %d", move_in->from_slot);
|
||||||
if(RuleB(QueryServ, PlayerLogMoves)) { QSSwapItemAuditor(move_in); } // QS Audit
|
if(RuleB(QueryServ, PlayerLogMoves)) { QSSwapItemAuditor(move_in); } // QS Audit
|
||||||
|
|
||||||
ItemInst *inst = m_inv.GetItem(SLOT_CURSOR);
|
ItemInst *inst = m_inv.GetItem(MainCursor);
|
||||||
if(inst) {
|
if(inst) {
|
||||||
parse->EventItem(EVENT_DESTROY_ITEM, this, inst, nullptr, "", 0);
|
parse->EventItem(EVENT_DESTROY_ITEM, this, inst, nullptr, "", 0);
|
||||||
}
|
}
|
||||||
@ -1309,9 +1305,9 @@ bool Client::SwapItem(MoveItem_Struct* move_in) {
|
|||||||
return true; // Item deletetion
|
return true; // Item deletetion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(auto_attack && (move_in->from_slot == SLOT_PRIMARY || move_in->from_slot == SLOT_SECONDARY || move_in->from_slot == SLOT_RANGE))
|
if(auto_attack && (move_in->from_slot == MainPrimary || move_in->from_slot == MainSecondary || move_in->from_slot == MainRange))
|
||||||
SetAttackTimer();
|
SetAttackTimer();
|
||||||
else if(auto_attack && (move_in->to_slot == SLOT_PRIMARY || move_in->to_slot == SLOT_SECONDARY || move_in->to_slot == SLOT_RANGE))
|
else if(auto_attack && (move_in->to_slot == MainPrimary || move_in->to_slot == MainSecondary || move_in->to_slot == MainRange))
|
||||||
SetAttackTimer();
|
SetAttackTimer();
|
||||||
// Step 1: Variables
|
// Step 1: Variables
|
||||||
int16 src_slot_id = (int16)move_in->from_slot;
|
int16 src_slot_id = (int16)move_in->from_slot;
|
||||||
@ -1501,7 +1497,7 @@ bool Client::SwapItem(MoveItem_Struct* move_in) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
safe_delete(world_inst);
|
safe_delete(world_inst);
|
||||||
if (src_slot_id==SLOT_CURSOR) {
|
if (src_slot_id == MainCursor) {
|
||||||
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
||||||
database.SaveCursor(character_id, s, e);
|
database.SaveCursor(character_id, s, e);
|
||||||
} else
|
} else
|
||||||
@ -1515,14 +1511,14 @@ bool Client::SwapItem(MoveItem_Struct* move_in) {
|
|||||||
|
|
||||||
// Step 4: Check for entity trade
|
// Step 4: Check for entity trade
|
||||||
if (dst_slot_id>=3000 && dst_slot_id<=3007) {
|
if (dst_slot_id>=3000 && dst_slot_id<=3007) {
|
||||||
if (src_slot_id != SLOT_CURSOR) {
|
if (src_slot_id != MainCursor) {
|
||||||
Kick();
|
Kick();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (with) {
|
if (with) {
|
||||||
mlog(INVENTORY__SLOTS, "Trade item move from slot %d to slot %d (trade with %s)", src_slot_id, dst_slot_id, with->GetName());
|
mlog(INVENTORY__SLOTS, "Trade item move from slot %d to slot %d (trade with %s)", src_slot_id, dst_slot_id, with->GetName());
|
||||||
// Fill Trade list with items from cursor
|
// Fill Trade list with items from cursor
|
||||||
if (!m_inv[SLOT_CURSOR]) {
|
if (!m_inv[MainCursor]) {
|
||||||
Message(13, "Error: Cursor item not located on server!");
|
Message(13, "Error: Cursor item not located on server!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1538,7 +1534,7 @@ bool Client::SwapItem(MoveItem_Struct* move_in) {
|
|||||||
if(RuleB(QueryServ, PlayerLogMoves)) { QSSwapItemAuditor(move_in); } // QS Audit
|
if(RuleB(QueryServ, PlayerLogMoves)) { QSSwapItemAuditor(move_in); } // QS Audit
|
||||||
|
|
||||||
SummonItem(src_inst->GetID(), src_inst->GetCharges());
|
SummonItem(src_inst->GetID(), src_inst->GetCharges());
|
||||||
DeleteItemInInventory(SLOT_CURSOR);
|
DeleteItemInInventory(MainCursor);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1601,12 +1597,12 @@ bool Client::SwapItem(MoveItem_Struct* move_in) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Not dealing with charges - just do direct swap
|
// Not dealing with charges - just do direct swap
|
||||||
if(src_inst && (dst_slot_id < 22 || dst_slot_id == 9999) && dst_slot_id >= 0) {
|
if(src_inst && (dst_slot_id <= MainAmmo || dst_slot_id == MainPowerSource) && dst_slot_id >= MainCharm) {
|
||||||
if (src_inst->GetItem()->Attuneable) {
|
if (src_inst->GetItem()->Attuneable) {
|
||||||
src_inst->SetInstNoDrop(true);
|
src_inst->SetInstNoDrop(true);
|
||||||
}
|
}
|
||||||
if (src_inst->IsAugmented()) {
|
if (src_inst->IsAugmented()) {
|
||||||
for(int i = 0; i < MAX_AUGMENT_SLOTS; i++) {
|
for (int i = 0; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
|
||||||
if (src_inst->GetAugment(i)) {
|
if (src_inst->GetAugment(i)) {
|
||||||
if (src_inst->GetAugment(i)->GetItem()->Attuneable) {
|
if (src_inst->GetAugment(i)->GetItem()->Attuneable) {
|
||||||
src_inst->GetAugment(i)->SetInstNoDrop(true);
|
src_inst->GetAugment(i)->SetInstNoDrop(true);
|
||||||
@ -1619,7 +1615,7 @@ bool Client::SwapItem(MoveItem_Struct* move_in) {
|
|||||||
if(!m_inv.SwapItem(src_slot_id, dst_slot_id)) { return false; }
|
if(!m_inv.SwapItem(src_slot_id, dst_slot_id)) { return false; }
|
||||||
mlog(INVENTORY__SLOTS, "Moving entire item from slot %d to slot %d", src_slot_id, dst_slot_id);
|
mlog(INVENTORY__SLOTS, "Moving entire item from slot %d to slot %d", src_slot_id, dst_slot_id);
|
||||||
|
|
||||||
if(src_slot_id < 22 || src_slot_id == 9999) {
|
if(src_slot_id <= MainAmmo || src_slot_id == MainPowerSource) {
|
||||||
if(src_inst) {
|
if(src_inst) {
|
||||||
parse->EventItem(EVENT_UNEQUIP_ITEM, this, src_inst, nullptr, "", src_slot_id);
|
parse->EventItem(EVENT_UNEQUIP_ITEM, this, src_inst, nullptr, "", src_slot_id);
|
||||||
}
|
}
|
||||||
@ -1629,7 +1625,7 @@ bool Client::SwapItem(MoveItem_Struct* move_in) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(dst_slot_id < 22 || dst_slot_id == 9999) {
|
if(dst_slot_id <= MainAmmo || dst_slot_id == MainPowerSource) {
|
||||||
if(dst_inst) {
|
if(dst_inst) {
|
||||||
parse->EventItem(EVENT_UNEQUIP_ITEM, this, dst_inst, nullptr, "", dst_slot_id);
|
parse->EventItem(EVENT_UNEQUIP_ITEM, this, dst_inst, nullptr, "", dst_slot_id);
|
||||||
}
|
}
|
||||||
@ -1646,12 +1642,12 @@ bool Client::SwapItem(MoveItem_Struct* move_in) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Step 7: Save change to the database
|
// Step 7: Save change to the database
|
||||||
if (src_slot_id==SLOT_CURSOR){
|
if (src_slot_id == MainCursor){
|
||||||
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
||||||
database.SaveCursor(character_id, s, e);
|
database.SaveCursor(character_id, s, e);
|
||||||
} else
|
} else
|
||||||
database.SaveInventory(character_id, m_inv.GetItem(src_slot_id), src_slot_id);
|
database.SaveInventory(character_id, m_inv.GetItem(src_slot_id), src_slot_id);
|
||||||
if (dst_slot_id==SLOT_CURSOR) {
|
if (dst_slot_id == MainCursor) {
|
||||||
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
std::list<ItemInst*>::const_iterator s=m_inv.cursor_begin(),e=m_inv.cursor_end();
|
||||||
database.SaveCursor(character_id, s, e);
|
database.SaveCursor(character_id, s, e);
|
||||||
} else
|
} else
|
||||||
@ -1665,14 +1661,17 @@ bool Client::SwapItem(MoveItem_Struct* move_in) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Client::SwapItemResync(MoveItem_Struct* move_slots) {
|
void Client::SwapItemResync(MoveItem_Struct* move_slots) {
|
||||||
|
// wow..this thing created a helluva memory leak...
|
||||||
|
// with any luck..this won't be needed in the future
|
||||||
|
|
||||||
// resync the 'from' and 'to' slots on an as-needed basis
|
// resync the 'from' and 'to' slots on an as-needed basis
|
||||||
// Not as effective as the full process, but less intrusive to gameplay -U
|
// Not as effective as the full process, but less intrusive to gameplay -U
|
||||||
mlog(INVENTORY__ERROR, "Inventory desyncronization. (charname: %s, source: %i, destination: %i)", GetName(), move_slots->from_slot, move_slots->to_slot);
|
mlog(INVENTORY__ERROR, "Inventory desyncronization. (charname: %s, source: %i, destination: %i)", GetName(), move_slots->from_slot, move_slots->to_slot);
|
||||||
Message(15, "Inventory Desyncronization detected: Resending slot data...");
|
Message(15, "Inventory Desyncronization detected: Resending slot data...");
|
||||||
|
|
||||||
if((move_slots->from_slot >= 0 && move_slots->from_slot <= 340) || move_slots->from_slot == 9999) {
|
if((move_slots->from_slot >= MainCharm && move_slots->from_slot <= 340) || move_slots->from_slot == MainPowerSource) {
|
||||||
int16 resync_slot = (Inventory::CalcSlotId(move_slots->from_slot) == SLOT_INVALID) ? move_slots->from_slot : Inventory::CalcSlotId(move_slots->from_slot);
|
int16 resync_slot = (Inventory::CalcSlotId(move_slots->from_slot) == INVALID_INDEX) ? move_slots->from_slot : Inventory::CalcSlotId(move_slots->from_slot);
|
||||||
if(IsValidSlot(resync_slot) && resync_slot != SLOT_INVALID) {
|
if (IsValidSlot(resync_slot) && resync_slot != INVALID_INDEX) {
|
||||||
// This prevents the client from crashing when closing any 'phantom' bags -U
|
// This prevents the client from crashing when closing any 'phantom' bags -U
|
||||||
const Item_Struct* token_struct = database.GetItem(22292); // 'Copper Coin'
|
const Item_Struct* token_struct = database.GetItem(22292); // 'Copper Coin'
|
||||||
ItemInst* token_inst = database.CreateItem(token_struct, 1);
|
ItemInst* token_inst = database.CreateItem(token_struct, 1);
|
||||||
@ -1690,13 +1689,14 @@ void Client::SwapItemResync(MoveItem_Struct* move_slots) {
|
|||||||
QueuePacket(outapp);
|
QueuePacket(outapp);
|
||||||
safe_delete(outapp);
|
safe_delete(outapp);
|
||||||
}
|
}
|
||||||
|
safe_delete(token_inst);
|
||||||
Message(14, "Source slot %i resyncronized.", move_slots->from_slot);
|
Message(14, "Source slot %i resyncronized.", move_slots->from_slot);
|
||||||
}
|
}
|
||||||
else { Message(13, "Could not resyncronize source slot %i.", move_slots->from_slot); }
|
else { Message(13, "Could not resyncronize source slot %i.", move_slots->from_slot); }
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int16 resync_slot = (Inventory::CalcSlotId(move_slots->from_slot) == SLOT_INVALID) ? move_slots->from_slot : Inventory::CalcSlotId(move_slots->from_slot);
|
int16 resync_slot = (Inventory::CalcSlotId(move_slots->from_slot) == INVALID_INDEX) ? move_slots->from_slot : Inventory::CalcSlotId(move_slots->from_slot);
|
||||||
if(IsValidSlot(resync_slot) && resync_slot != SLOT_INVALID) {
|
if (IsValidSlot(resync_slot) && resync_slot != INVALID_INDEX) {
|
||||||
if(m_inv[resync_slot]) {
|
if(m_inv[resync_slot]) {
|
||||||
const Item_Struct* token_struct = database.GetItem(22292); // 'Copper Coin'
|
const Item_Struct* token_struct = database.GetItem(22292); // 'Copper Coin'
|
||||||
ItemInst* token_inst = database.CreateItem(token_struct, 1);
|
ItemInst* token_inst = database.CreateItem(token_struct, 1);
|
||||||
@ -1704,6 +1704,7 @@ void Client::SwapItemResync(MoveItem_Struct* move_slots) {
|
|||||||
SendItemPacket(resync_slot, token_inst, ItemPacketTrade);
|
SendItemPacket(resync_slot, token_inst, ItemPacketTrade);
|
||||||
SendItemPacket(resync_slot, m_inv[resync_slot], ItemPacketTrade);
|
SendItemPacket(resync_slot, m_inv[resync_slot], ItemPacketTrade);
|
||||||
|
|
||||||
|
safe_delete(token_inst);
|
||||||
Message(14, "Source slot %i resyncronized.", move_slots->from_slot);
|
Message(14, "Source slot %i resyncronized.", move_slots->from_slot);
|
||||||
}
|
}
|
||||||
else { Message(13, "Could not resyncronize source slot %i.", move_slots->from_slot); }
|
else { Message(13, "Could not resyncronize source slot %i.", move_slots->from_slot); }
|
||||||
@ -1711,9 +1712,9 @@ void Client::SwapItemResync(MoveItem_Struct* move_slots) {
|
|||||||
else { Message(13, "Could not resyncronize source slot %i.", move_slots->from_slot); }
|
else { Message(13, "Could not resyncronize source slot %i.", move_slots->from_slot); }
|
||||||
}
|
}
|
||||||
|
|
||||||
if((move_slots->to_slot >= 0 && move_slots->to_slot <= 340) || move_slots->to_slot == 9999) {
|
if((move_slots->to_slot >= MainCharm && move_slots->to_slot <= 340) || move_slots->to_slot == MainPowerSource) {
|
||||||
int16 resync_slot = (Inventory::CalcSlotId(move_slots->to_slot) == SLOT_INVALID) ? move_slots->to_slot : Inventory::CalcSlotId(move_slots->to_slot);
|
int16 resync_slot = (Inventory::CalcSlotId(move_slots->to_slot) == INVALID_INDEX) ? move_slots->to_slot : Inventory::CalcSlotId(move_slots->to_slot);
|
||||||
if(IsValidSlot(resync_slot) && resync_slot != SLOT_INVALID) {
|
if (IsValidSlot(resync_slot) && resync_slot != INVALID_INDEX) {
|
||||||
const Item_Struct* token_struct = database.GetItem(22292); // 'Copper Coin'
|
const Item_Struct* token_struct = database.GetItem(22292); // 'Copper Coin'
|
||||||
ItemInst* token_inst = database.CreateItem(token_struct, 1);
|
ItemInst* token_inst = database.CreateItem(token_struct, 1);
|
||||||
|
|
||||||
@ -1730,13 +1731,14 @@ void Client::SwapItemResync(MoveItem_Struct* move_slots) {
|
|||||||
QueuePacket(outapp);
|
QueuePacket(outapp);
|
||||||
safe_delete(outapp);
|
safe_delete(outapp);
|
||||||
}
|
}
|
||||||
|
safe_delete(token_inst);
|
||||||
Message(14, "Destination slot %i resyncronized.", move_slots->to_slot);
|
Message(14, "Destination slot %i resyncronized.", move_slots->to_slot);
|
||||||
}
|
}
|
||||||
else { Message(13, "Could not resyncronize destination slot %i.", move_slots->to_slot); }
|
else { Message(13, "Could not resyncronize destination slot %i.", move_slots->to_slot); }
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int16 resync_slot = (Inventory::CalcSlotId(move_slots->to_slot) == SLOT_INVALID) ? move_slots->to_slot : Inventory::CalcSlotId(move_slots->to_slot);
|
int16 resync_slot = (Inventory::CalcSlotId(move_slots->to_slot) == INVALID_INDEX) ? move_slots->to_slot : Inventory::CalcSlotId(move_slots->to_slot);
|
||||||
if(IsValidSlot(resync_slot) && resync_slot != SLOT_INVALID) {
|
if (IsValidSlot(resync_slot) && resync_slot != INVALID_INDEX) {
|
||||||
if(m_inv[resync_slot]) {
|
if(m_inv[resync_slot]) {
|
||||||
const Item_Struct* token_struct = database.GetItem(22292); // 'Copper Coin'
|
const Item_Struct* token_struct = database.GetItem(22292); // 'Copper Coin'
|
||||||
ItemInst* token_inst = database.CreateItem(token_struct, 1);
|
ItemInst* token_inst = database.CreateItem(token_struct, 1);
|
||||||
@ -1744,6 +1746,7 @@ void Client::SwapItemResync(MoveItem_Struct* move_slots) {
|
|||||||
SendItemPacket(resync_slot, token_inst, ItemPacketTrade);
|
SendItemPacket(resync_slot, token_inst, ItemPacketTrade);
|
||||||
SendItemPacket(resync_slot, m_inv[resync_slot], ItemPacketTrade);
|
SendItemPacket(resync_slot, m_inv[resync_slot], ItemPacketTrade);
|
||||||
|
|
||||||
|
safe_delete(token_inst);
|
||||||
Message(14, "Destination slot %i resyncronized.", move_slots->to_slot);
|
Message(14, "Destination slot %i resyncronized.", move_slots->to_slot);
|
||||||
}
|
}
|
||||||
else { Message(13, "Could not resyncronize destination slot %i.", move_slots->to_slot); }
|
else { Message(13, "Could not resyncronize destination slot %i.", move_slots->to_slot); }
|
||||||
@ -1857,7 +1860,7 @@ void Client::DyeArmor(DyeStruct* dye){
|
|||||||
m_pp.item_tint[i].rgb.red!=dye->dye[i].rgb.red ||
|
m_pp.item_tint[i].rgb.red!=dye->dye[i].rgb.red ||
|
||||||
m_pp.item_tint[i].rgb.green != dye->dye[i].rgb.green){
|
m_pp.item_tint[i].rgb.green != dye->dye[i].rgb.green){
|
||||||
slot = m_inv.HasItem(32557, 1, invWherePersonal);
|
slot = m_inv.HasItem(32557, 1, invWherePersonal);
|
||||||
if(slot != SLOT_INVALID){
|
if (slot != INVALID_INDEX){
|
||||||
DeleteItemInInventory(slot,1,true);
|
DeleteItemInInventory(slot,1,true);
|
||||||
uint8 slot2=SlotConvert(i);
|
uint8 slot2=SlotConvert(i);
|
||||||
ItemInst* inst = this->m_inv.GetItem(slot2);
|
ItemInst* inst = this->m_inv.GetItem(slot2);
|
||||||
@ -2003,7 +2006,7 @@ void Client::RemoveNoRent(bool client_update) {
|
|||||||
const ItemInst* inst = m_inv[9999];
|
const ItemInst* inst = m_inv[9999];
|
||||||
if(inst && !inst->GetItem()->NoRent) {
|
if(inst && !inst->GetItem()->NoRent) {
|
||||||
mlog(INVENTORY__SLOTS, "NoRent Timer Lapse: Deleting %s from slot %i", inst->GetItem()->Name, slot_id);
|
mlog(INVENTORY__SLOTS, "NoRent Timer Lapse: Deleting %s from slot %i", inst->GetItem()->Name, slot_id);
|
||||||
DeleteItemInInventory(9999, 0, (GetClientVersion() >= EQClientSoF) ? client_update : false); // Ti slot non-existent
|
DeleteItemInInventory(MainPowerSource, 0, (GetClientVersion() >= EQClientSoF) ? client_update : false); // Ti slot non-existent
|
||||||
}
|
}
|
||||||
|
|
||||||
// containers
|
// containers
|
||||||
@ -2283,13 +2286,13 @@ static int16 BandolierSlotToWeaponSlot(int BandolierSlot) {
|
|||||||
|
|
||||||
switch(BandolierSlot) {
|
switch(BandolierSlot) {
|
||||||
case bandolierMainHand:
|
case bandolierMainHand:
|
||||||
return SLOT_PRIMARY;
|
return MainPrimary;
|
||||||
case bandolierOffHand:
|
case bandolierOffHand:
|
||||||
return SLOT_SECONDARY;
|
return MainSecondary;
|
||||||
case bandolierRange:
|
case bandolierRange:
|
||||||
return SLOT_RANGE;
|
return MainRange;
|
||||||
default:
|
default:
|
||||||
return SLOT_AMMO;
|
return MainAmmo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2365,12 +2368,12 @@ void Client::SetBandolier(const EQApplicationPacket *app) {
|
|||||||
invWhereWorn|invWherePersonal);
|
invWhereWorn|invWherePersonal);
|
||||||
|
|
||||||
// removed 'invWhereCursor' argument from above and implemented slots 30, 331-340 checks here
|
// removed 'invWhereCursor' argument from above and implemented slots 30, 331-340 checks here
|
||||||
if (slot == SLOT_INVALID) {
|
if (slot == INVALID_INDEX) {
|
||||||
if (m_inv.GetItem(SLOT_CURSOR)) {
|
if (m_inv.GetItem(MainCursor)) {
|
||||||
if (m_inv.GetItem(SLOT_CURSOR)->GetItem()->ID == m_pp.bandoliers[bss->number].items[BandolierSlot].item_id &&
|
if (m_inv.GetItem(MainCursor)->GetItem()->ID == m_pp.bandoliers[bss->number].items[BandolierSlot].item_id &&
|
||||||
m_inv.GetItem(SLOT_CURSOR)->GetCharges() >= 1) // '> 0' the same, but this matches Inventory::_HasItem conditional check
|
m_inv.GetItem(MainCursor)->GetCharges() >= 1) // '> 0' the same, but this matches Inventory::_HasItem conditional check
|
||||||
slot = SLOT_CURSOR;
|
slot = MainCursor;
|
||||||
else if (m_inv.GetItem(SLOT_CURSOR)->GetItem()->ItemClass == 1) {
|
else if (m_inv.GetItem(MainCursor)->GetItem()->ItemClass == 1) {
|
||||||
for(int16 CursorBagSlot = 331; CursorBagSlot <= 340; CursorBagSlot++) {
|
for(int16 CursorBagSlot = 331; CursorBagSlot <= 340; CursorBagSlot++) {
|
||||||
if (m_inv.GetItem(CursorBagSlot)) {
|
if (m_inv.GetItem(CursorBagSlot)) {
|
||||||
if (m_inv.GetItem(CursorBagSlot)->GetItem()->ID == m_pp.bandoliers[bss->number].items[BandolierSlot].item_id &&
|
if (m_inv.GetItem(CursorBagSlot)->GetItem()->ID == m_pp.bandoliers[bss->number].items[BandolierSlot].item_id &&
|
||||||
@ -2385,7 +2388,7 @@ void Client::SetBandolier(const EQApplicationPacket *app) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// if the player has this item in their inventory,
|
// if the player has this item in their inventory,
|
||||||
if(slot != SLOT_INVALID) {
|
if (slot != INVALID_INDEX) {
|
||||||
// Pull the item out of the inventory
|
// Pull the item out of the inventory
|
||||||
BandolierItems[BandolierSlot] = m_inv.PopItem(slot);
|
BandolierItems[BandolierSlot] = m_inv.PopItem(slot);
|
||||||
// If ammo with charges, only take one charge out to put in the range slot, that is what
|
// If ammo with charges, only take one charge out to put in the range slot, that is what
|
||||||
@ -2410,7 +2413,7 @@ void Client::SetBandolier(const EQApplicationPacket *app) {
|
|||||||
}
|
}
|
||||||
else { // The player doesn't have the required weapon with them.
|
else { // The player doesn't have the required weapon with them.
|
||||||
BandolierItems[BandolierSlot] = 0;
|
BandolierItems[BandolierSlot] = 0;
|
||||||
if(slot == SLOT_INVALID) {
|
if (slot == INVALID_INDEX) {
|
||||||
_log(INVENTORY__BANDOLIER, "Character does not have required bandolier item for slot %i", WeaponSlot);
|
_log(INVENTORY__BANDOLIER, "Character does not have required bandolier item for slot %i", WeaponSlot);
|
||||||
ItemInst *InvItem = m_inv.PopItem(WeaponSlot);
|
ItemInst *InvItem = m_inv.PopItem(WeaponSlot);
|
||||||
if(InvItem) {
|
if(InvItem) {
|
||||||
|
|||||||
@ -219,7 +219,7 @@ void NPC::AddLootDrop(const Item_Struct *item2, ItemList* itemlist, int16 charge
|
|||||||
// it is an improvement.
|
// it is an improvement.
|
||||||
|
|
||||||
if (!item2->NoPet) {
|
if (!item2->NoPet) {
|
||||||
for (int i=0; !found && i<MAX_WORN_INVENTORY; i++) {
|
for (int i = 0; !found && i<EmuConstants::EQUIPMENT_SIZE; i++) {
|
||||||
uint32 slots = (1 << i);
|
uint32 slots = (1 << i);
|
||||||
if (item2->Slots & slots) {
|
if (item2->Slots & slots) {
|
||||||
if(equipment[i])
|
if(equipment[i])
|
||||||
@ -260,7 +260,7 @@ void NPC::AddLootDrop(const Item_Struct *item2, ItemList* itemlist, int16 charge
|
|||||||
// @merth: IDFile size has been increased, this needs to change
|
// @merth: IDFile size has been increased, this needs to change
|
||||||
uint16 emat;
|
uint16 emat;
|
||||||
if(item2->Material <= 0
|
if(item2->Material <= 0
|
||||||
|| item2->Slots & (1 << SLOT_PRIMARY | 1 << SLOT_SECONDARY)) {
|
|| item2->Slots & (1 << MainPrimary | 1 << MainSecondary)) {
|
||||||
memset(newid, 0, sizeof(newid));
|
memset(newid, 0, sizeof(newid));
|
||||||
for(int i=0;i<7;i++){
|
for(int i=0;i<7;i++){
|
||||||
if (!isalpha(item2->IDFile[i])){
|
if (!isalpha(item2->IDFile[i])){
|
||||||
@ -274,13 +274,13 @@ void NPC::AddLootDrop(const Item_Struct *item2, ItemList* itemlist, int16 charge
|
|||||||
emat = item2->Material;
|
emat = item2->Material;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (foundslot == SLOT_PRIMARY) {
|
if (foundslot == MainPrimary) {
|
||||||
if (item2->Proc.Effect != 0)
|
if (item2->Proc.Effect != 0)
|
||||||
CastToMob()->AddProcToWeapon(item2->Proc.Effect, true);
|
CastToMob()->AddProcToWeapon(item2->Proc.Effect, true);
|
||||||
|
|
||||||
eslot = MaterialPrimary;
|
eslot = MaterialPrimary;
|
||||||
}
|
}
|
||||||
else if (foundslot == SLOT_SECONDARY
|
else if (foundslot == MainSecondary
|
||||||
&& (GetOwner() != nullptr || (GetLevel() >= 13 && MakeRandomInt(0,99) < NPC_DW_CHANCE) || (item2->Damage==0)) &&
|
&& (GetOwner() != nullptr || (GetLevel() >= 13 && MakeRandomInt(0,99) < NPC_DW_CHANCE) || (item2->Damage==0)) &&
|
||||||
(item2->ItemType == ItemType1HSlash || item2->ItemType == ItemType1HBlunt || item2->ItemType == ItemTypeShield ||
|
(item2->ItemType == ItemType1HSlash || item2->ItemType == ItemType1HBlunt || item2->ItemType == ItemTypeShield ||
|
||||||
item2->ItemType == ItemType1HPiercing))
|
item2->ItemType == ItemType1HPiercing))
|
||||||
@ -290,25 +290,25 @@ void NPC::AddLootDrop(const Item_Struct *item2, ItemList* itemlist, int16 charge
|
|||||||
|
|
||||||
eslot = MaterialSecondary;
|
eslot = MaterialSecondary;
|
||||||
}
|
}
|
||||||
else if (foundslot == SLOT_HEAD) {
|
else if (foundslot == MainHead) {
|
||||||
eslot = MaterialHead;
|
eslot = MaterialHead;
|
||||||
}
|
}
|
||||||
else if (foundslot == SLOT_CHEST) {
|
else if (foundslot == MainChest) {
|
||||||
eslot = MaterialChest;
|
eslot = MaterialChest;
|
||||||
}
|
}
|
||||||
else if (foundslot == SLOT_ARMS) {
|
else if (foundslot == MainArms) {
|
||||||
eslot = MaterialArms;
|
eslot = MaterialArms;
|
||||||
}
|
}
|
||||||
else if (foundslot == SLOT_BRACER01 || foundslot == SLOT_BRACER02) {
|
else if (foundslot == MainWrist1 || foundslot == MainWrist2) {
|
||||||
eslot = MaterialWrist;
|
eslot = MaterialWrist;
|
||||||
}
|
}
|
||||||
else if (foundslot == SLOT_HANDS) {
|
else if (foundslot == MainHands) {
|
||||||
eslot = MaterialHands;
|
eslot = MaterialHands;
|
||||||
}
|
}
|
||||||
else if (foundslot == SLOT_LEGS) {
|
else if (foundslot == MainLegs) {
|
||||||
eslot = MaterialLegs;
|
eslot = MaterialLegs;
|
||||||
}
|
}
|
||||||
else if (foundslot == SLOT_FEET) {
|
else if (foundslot == MainFeet) {
|
||||||
eslot = MaterialFeet;
|
eslot = MaterialFeet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1415,36 +1415,55 @@ luabind::scope lua_register_slot() {
|
|||||||
return luabind::class_<Slots>("Slot")
|
return luabind::class_<Slots>("Slot")
|
||||||
.enum_("constants")
|
.enum_("constants")
|
||||||
[
|
[
|
||||||
luabind::value("Charm", static_cast<int>(SLOT_CHARM)),
|
luabind::value("Charm", static_cast<int>(MainCharm)),
|
||||||
luabind::value("Ear1", static_cast<int>(SLOT_EAR01)),
|
luabind::value("Ear1", static_cast<int>(MainEar1)),
|
||||||
luabind::value("Head", static_cast<int>(SLOT_HEAD)),
|
luabind::value("Head", static_cast<int>(MainHead)),
|
||||||
luabind::value("Face", static_cast<int>(SLOT_FACE)),
|
luabind::value("Face", static_cast<int>(MainFace)),
|
||||||
luabind::value("Ear2", static_cast<int>(SLOT_EAR02)),
|
luabind::value("Ear2", static_cast<int>(MainEar2)),
|
||||||
luabind::value("Neck", static_cast<int>(SLOT_NECK)),
|
luabind::value("Neck", static_cast<int>(MainNeck)),
|
||||||
luabind::value("Shoulder", static_cast<int>(SLOT_SHOULDER)),
|
luabind::value("Shoulder", static_cast<int>(MainShoulders)), // deprecated
|
||||||
luabind::value("Arms", static_cast<int>(SLOT_ARMS)),
|
luabind::value("Shoulders", static_cast<int>(MainShoulders)),
|
||||||
luabind::value("Back", static_cast<int>(SLOT_BACK)),
|
luabind::value("Arms", static_cast<int>(MainArms)),
|
||||||
luabind::value("Bracer1", static_cast<int>(SLOT_BRACER01)),
|
luabind::value("Back", static_cast<int>(MainBack)),
|
||||||
luabind::value("Bracer2", static_cast<int>(SLOT_BRACER02)),
|
luabind::value("Bracer1", static_cast<int>(MainWrist1)), // deprecated
|
||||||
luabind::value("Range", static_cast<int>(SLOT_RANGE)),
|
luabind::value("Wrist1", static_cast<int>(MainWrist1)),
|
||||||
luabind::value("Hands", static_cast<int>(SLOT_HANDS)),
|
luabind::value("Bracer2", static_cast<int>(MainWrist2)), // deprecated
|
||||||
luabind::value("Primary", static_cast<int>(SLOT_PRIMARY)),
|
luabind::value("Wrist2", static_cast<int>(MainWrist2)),
|
||||||
luabind::value("Secondary", static_cast<int>(SLOT_SECONDARY)),
|
luabind::value("Range", static_cast<int>(MainRange)),
|
||||||
luabind::value("Ring1", static_cast<int>(SLOT_RING01)),
|
luabind::value("Hands", static_cast<int>(MainHands)),
|
||||||
luabind::value("Ring2", static_cast<int>(SLOT_RING02)),
|
luabind::value("Primary", static_cast<int>(MainPrimary)),
|
||||||
luabind::value("Chest", static_cast<int>(SLOT_CHEST)),
|
luabind::value("Secondary", static_cast<int>(MainSecondary)),
|
||||||
luabind::value("Legs", static_cast<int>(SLOT_LEGS)),
|
luabind::value("Ring1", static_cast<int>(MainFinger1)), // deprecated
|
||||||
luabind::value("Feet", static_cast<int>(SLOT_FEET)),
|
luabind::value("Finger1", static_cast<int>(MainFinger1)),
|
||||||
luabind::value("Waist", static_cast<int>(SLOT_WAIST)),
|
luabind::value("Ring2", static_cast<int>(MainFinger2)), // deprecated
|
||||||
luabind::value("Ammo", static_cast<int>(SLOT_AMMO)),
|
luabind::value("Finger2", static_cast<int>(MainFinger2)),
|
||||||
luabind::value("PersonalBegin", static_cast<int>(SLOT_PERSONAL_BEGIN)),
|
luabind::value("Chest", static_cast<int>(MainChest)),
|
||||||
luabind::value("PersonalEnd", static_cast<int>(SLOT_PERSONAL_END)),
|
luabind::value("Legs", static_cast<int>(MainLegs)),
|
||||||
luabind::value("Cursor", static_cast<int>(SLOT_CURSOR)),
|
luabind::value("Feet", static_cast<int>(MainFeet)),
|
||||||
luabind::value("CursorEnd", 0xFFFE),
|
luabind::value("Waist", static_cast<int>(MainWaist)),
|
||||||
luabind::value("Tradeskill", static_cast<int>(SLOT_TRADESKILL)),
|
luabind::value("PowerSource", static_cast<int>(MainPowerSource)),
|
||||||
luabind::value("Augment", static_cast<int>(SLOT_AUGMENT)),
|
luabind::value("Ammo", static_cast<int>(MainAmmo)),
|
||||||
luabind::value("PowerSource", static_cast<int>(SLOT_POWER_SOURCE)),
|
luabind::value("General1", static_cast<int>(MainGeneral1)),
|
||||||
luabind::value("Invalid", 0xFFFF)
|
luabind::value("General2", static_cast<int>(MainGeneral2)),
|
||||||
|
luabind::value("General3", static_cast<int>(MainGeneral3)),
|
||||||
|
luabind::value("General4", static_cast<int>(MainGeneral4)),
|
||||||
|
luabind::value("General5", static_cast<int>(MainGeneral5)),
|
||||||
|
luabind::value("General6", static_cast<int>(MainGeneral6)),
|
||||||
|
luabind::value("General7", static_cast<int>(MainGeneral7)),
|
||||||
|
luabind::value("General8", static_cast<int>(MainGeneral8)),
|
||||||
|
//luabind::value("General9", static_cast<int>(MainGeneral9)),
|
||||||
|
//luabind::value("General10", static_cast<int>(MainGeneral10)),
|
||||||
|
//luabind::value("EquipmentBegin", static_cast<int>(EmuConstants::EQUIPMENT_BEGIN)),
|
||||||
|
//luabind::value("EquipmentEnd", static_cast<int>(EmuConstants::EQUIPMENT_END)),
|
||||||
|
luabind::value("PersonalBegin", static_cast<int>(EmuConstants::GENERAL_BEGIN)), // deprecated
|
||||||
|
luabind::value("GeneralBegin", static_cast<int>(EmuConstants::GENERAL_BEGIN)),
|
||||||
|
luabind::value("PersonalEnd", static_cast<int>(EmuConstants::GENERAL_END)), // deprecated
|
||||||
|
luabind::value("GeneralEnd", static_cast<int>(EmuConstants::GENERAL_END)),
|
||||||
|
luabind::value("Cursor", static_cast<int>(MainCursor)),
|
||||||
|
luabind::value("CursorEnd", 0xFFFE), // deprecated
|
||||||
|
luabind::value("Tradeskill", static_cast<int>(SLOT_TRADESKILL)), // deprecated
|
||||||
|
luabind::value("Augment", static_cast<int>(SLOT_AUGMENT)), // deprecated
|
||||||
|
luabind::value("Invalid", INVALID_INDEX)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -266,7 +266,7 @@ void Merc::CalcItemBonuses(StatBonuses* newbon) {
|
|||||||
|
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
//should not include 21 (SLOT_AMMO)
|
//should not include 21 (SLOT_AMMO)
|
||||||
for (i=0; i<SLOT_AMMO; i++) {
|
for (i=0; i<MainAmmo; i++) {
|
||||||
if(equipment[i] == 0)
|
if(equipment[i] == 0)
|
||||||
continue;
|
continue;
|
||||||
const Item_Struct * itm = database.GetItem(equipment[i]);
|
const Item_Struct * itm = database.GetItem(equipment[i]);
|
||||||
@ -1653,24 +1653,24 @@ void Merc::AI_Process() {
|
|||||||
|
|
||||||
//try main hand first
|
//try main hand first
|
||||||
if(attack_timer.Check()) {
|
if(attack_timer.Check()) {
|
||||||
Attack(GetTarget(), SLOT_PRIMARY);
|
Attack(GetTarget(), MainPrimary);
|
||||||
|
|
||||||
bool tripleSuccess = false;
|
bool tripleSuccess = false;
|
||||||
|
|
||||||
if(GetOwner() && GetTarget() && CanThisClassDoubleAttack()) {
|
if(GetOwner() && GetTarget() && CanThisClassDoubleAttack()) {
|
||||||
|
|
||||||
if(GetOwner()) {
|
if(GetOwner()) {
|
||||||
Attack(GetTarget(), SLOT_PRIMARY, true);
|
Attack(GetTarget(), MainPrimary, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(GetOwner() && GetTarget() && GetSpecialAbility(SPECATK_TRIPLE)) {
|
if(GetOwner() && GetTarget() && GetSpecialAbility(SPECATK_TRIPLE)) {
|
||||||
tripleSuccess = true;
|
tripleSuccess = true;
|
||||||
Attack(GetTarget(), SLOT_PRIMARY, true);
|
Attack(GetTarget(), MainPrimary, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//quad attack, does this belong here??
|
//quad attack, does this belong here??
|
||||||
if(GetOwner() && GetTarget() && GetSpecialAbility(SPECATK_QUAD)) {
|
if(GetOwner() && GetTarget() && GetSpecialAbility(SPECATK_QUAD)) {
|
||||||
Attack(GetTarget(), SLOT_PRIMARY, true);
|
Attack(GetTarget(), MainPrimary, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1682,8 +1682,8 @@ void Merc::AI_Process() {
|
|||||||
if(MakeRandomInt(0, 100) < flurrychance)
|
if(MakeRandomInt(0, 100) < flurrychance)
|
||||||
{
|
{
|
||||||
Message_StringID(MT_NPCFlurry, YOU_FLURRY);
|
Message_StringID(MT_NPCFlurry, YOU_FLURRY);
|
||||||
Attack(GetTarget(), SLOT_PRIMARY, false);
|
Attack(GetTarget(), MainPrimary, false);
|
||||||
Attack(GetTarget(), SLOT_PRIMARY, false);
|
Attack(GetTarget(), MainPrimary, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1692,7 +1692,7 @@ void Merc::AI_Process() {
|
|||||||
if (GetTarget() && ExtraAttackChanceBonus) {
|
if (GetTarget() && ExtraAttackChanceBonus) {
|
||||||
if(MakeRandomInt(0, 100) < ExtraAttackChanceBonus)
|
if(MakeRandomInt(0, 100) < ExtraAttackChanceBonus)
|
||||||
{
|
{
|
||||||
Attack(GetTarget(), SLOT_PRIMARY, false);
|
Attack(GetTarget(), MainPrimary, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1727,11 +1727,11 @@ void Merc::AI_Process() {
|
|||||||
|
|
||||||
if (random < DualWieldProbability){ // Max 78% of DW
|
if (random < DualWieldProbability){ // Max 78% of DW
|
||||||
|
|
||||||
Attack(GetTarget(), SLOT_SECONDARY); // Single attack with offhand
|
Attack(GetTarget(), MainSecondary); // Single attack with offhand
|
||||||
|
|
||||||
if( CanThisClassDoubleAttack()) {
|
if( CanThisClassDoubleAttack()) {
|
||||||
if(GetTarget() && GetTarget()->GetHP() > -10)
|
if(GetTarget() && GetTarget()->GetHP() > -10)
|
||||||
Attack(GetTarget(), SLOT_SECONDARY); // Single attack with offhand
|
Attack(GetTarget(), MainSecondary); // Single attack with offhand
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2640,7 +2640,7 @@ int16 Merc::GetFocusEffect(focusType type, uint16 spell_id) {
|
|||||||
int16 focus_max_real = 0;
|
int16 focus_max_real = 0;
|
||||||
|
|
||||||
//item focus
|
//item focus
|
||||||
for(int x =0; x < MAX_WORN_INVENTORY; ++x)
|
for (int x = 0; x < EmuConstants::EQUIPMENT_SIZE; ++x)
|
||||||
{
|
{
|
||||||
TempItem = nullptr;
|
TempItem = nullptr;
|
||||||
if (equipment[x] == 0)
|
if (equipment[x] == 0)
|
||||||
|
|||||||
@ -48,7 +48,7 @@ public:
|
|||||||
//abstract virtual function implementations requird by base abstract class
|
//abstract virtual function implementations requird by base abstract class
|
||||||
virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillUseTypes attack_skill);
|
virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillUseTypes attack_skill);
|
||||||
virtual void Damage(Mob* from, int32 damage, uint16 spell_id, SkillUseTypes attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false);
|
virtual void Damage(Mob* from, int32 damage, uint16 spell_id, SkillUseTypes attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false);
|
||||||
virtual bool Attack(Mob* other, int Hand = SLOT_PRIMARY, bool FromRiposte = false, bool IsStrikethrough = false,
|
virtual bool Attack(Mob* other, int Hand = MainPrimary, bool FromRiposte = false, bool IsStrikethrough = false,
|
||||||
bool IsFromSpell = false, ExtraAttackOptions *opts = nullptr);
|
bool IsFromSpell = false, ExtraAttackOptions *opts = nullptr);
|
||||||
virtual bool HasRaid() { return false; }
|
virtual bool HasRaid() { return false; }
|
||||||
virtual bool HasGroup() { return (GetGroup() ? true : false); }
|
virtual bool HasGroup() { return (GetGroup() ? true : false); }
|
||||||
@ -273,7 +273,7 @@ protected:
|
|||||||
std::map<uint32,MercTimer> timers;
|
std::map<uint32,MercTimer> timers;
|
||||||
|
|
||||||
uint16 skills[HIGHEST_SKILL+1];
|
uint16 skills[HIGHEST_SKILL+1];
|
||||||
uint32 equipment[MAX_WORN_INVENTORY]; //this is an array of item IDs
|
uint32 equipment[EmuConstants::EQUIPMENT_SIZE]; //this is an array of item IDs
|
||||||
uint16 d_meele_texture1; //this is an item Material value
|
uint16 d_meele_texture1; //this is an item Material value
|
||||||
uint16 d_meele_texture2; //this is an item Material value (offhand)
|
uint16 d_meele_texture2; //this is an item Material value (offhand)
|
||||||
uint8 prim_melee_type; //Sets the Primary Weapon attack message and animation
|
uint8 prim_melee_type; //Sets the Primary Weapon attack message and animation
|
||||||
|
|||||||
18
zone/mob.cpp
18
zone/mob.cpp
@ -1952,14 +1952,14 @@ void Mob::SetAttackTimer() {
|
|||||||
Timer* TimerToUse = nullptr;
|
Timer* TimerToUse = nullptr;
|
||||||
const Item_Struct* PrimaryWeapon = nullptr;
|
const Item_Struct* PrimaryWeapon = nullptr;
|
||||||
|
|
||||||
for (int i=SLOT_RANGE; i<=SLOT_SECONDARY; i++) {
|
for (int i=MainRange; i<=MainSecondary; i++) {
|
||||||
|
|
||||||
//pick a timer
|
//pick a timer
|
||||||
if (i == SLOT_PRIMARY)
|
if (i == MainPrimary)
|
||||||
TimerToUse = &attack_timer;
|
TimerToUse = &attack_timer;
|
||||||
else if (i == SLOT_RANGE)
|
else if (i == MainRange)
|
||||||
TimerToUse = &ranged_timer;
|
TimerToUse = &ranged_timer;
|
||||||
else if(i == SLOT_SECONDARY)
|
else if(i == MainSecondary)
|
||||||
TimerToUse = &attack_dw_timer;
|
TimerToUse = &attack_dw_timer;
|
||||||
else //invalid slot (hands will always hit this)
|
else //invalid slot (hands will always hit this)
|
||||||
continue;
|
continue;
|
||||||
@ -1980,7 +1980,7 @@ void Mob::SetAttackTimer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//special offhand stuff
|
//special offhand stuff
|
||||||
if(i == SLOT_SECONDARY) {
|
if(i == MainSecondary) {
|
||||||
//if we have a 2H weapon in our main hand, no dual
|
//if we have a 2H weapon in our main hand, no dual
|
||||||
if(PrimaryWeapon != nullptr) {
|
if(PrimaryWeapon != nullptr) {
|
||||||
if( PrimaryWeapon->ItemClass == ItemClassCommon
|
if( PrimaryWeapon->ItemClass == ItemClassCommon
|
||||||
@ -2059,7 +2059,7 @@ void Mob::SetAttackTimer() {
|
|||||||
if(IsClient())
|
if(IsClient())
|
||||||
{
|
{
|
||||||
float max_quiver = 0;
|
float max_quiver = 0;
|
||||||
for(int r = SLOT_PERSONAL_BEGIN; r <= SLOT_PERSONAL_END; r++)
|
for(int r = EmuConstants::GENERAL_BEGIN; r <= EmuConstants::GENERAL_END; r++)
|
||||||
{
|
{
|
||||||
const ItemInst *pi = CastToClient()->GetInv().GetItem(r);
|
const ItemInst *pi = CastToClient()->GetInv().GetItem(r);
|
||||||
if(!pi)
|
if(!pi)
|
||||||
@ -2083,7 +2083,7 @@ void Mob::SetAttackTimer() {
|
|||||||
TimerToUse->SetAtTrigger(speed, true);
|
TimerToUse->SetAtTrigger(speed, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(i == SLOT_PRIMARY)
|
if(i == MainPrimary)
|
||||||
PrimaryWeapon = ItemToUse;
|
PrimaryWeapon = ItemToUse;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2094,8 +2094,8 @@ bool Mob::CanThisClassDualWield(void) const {
|
|||||||
return(GetSkill(SkillDualWield) > 0);
|
return(GetSkill(SkillDualWield) > 0);
|
||||||
}
|
}
|
||||||
else if(CastToClient()->HasSkill(SkillDualWield)) {
|
else if(CastToClient()->HasSkill(SkillDualWield)) {
|
||||||
const ItemInst* pinst = CastToClient()->GetInv().GetItem(SLOT_PRIMARY);
|
const ItemInst* pinst = CastToClient()->GetInv().GetItem(MainPrimary);
|
||||||
const ItemInst* sinst = CastToClient()->GetInv().GetItem(SLOT_SECONDARY);
|
const ItemInst* sinst = CastToClient()->GetInv().GetItem(MainSecondary);
|
||||||
|
|
||||||
// 2HS, 2HB, or 2HP
|
// 2HS, 2HB, or 2HP
|
||||||
if(pinst && pinst->IsWeapon()) {
|
if(pinst && pinst->IsWeapon()) {
|
||||||
|
|||||||
@ -1298,7 +1298,7 @@ void NPC::PickPocket(Client* thief) {
|
|||||||
bool is_arrow = (item->ItemType == ItemTypeArrow) ? true : false;
|
bool is_arrow = (item->ItemType == ItemTypeArrow) ? true : false;
|
||||||
int slot_id = thief->GetInv().FindFreeSlot(false, true, inst->GetItem()->Size, is_arrow);
|
int slot_id = thief->GetInv().FindFreeSlot(false, true, inst->GetItem()->Size, is_arrow);
|
||||||
if (/*!Equipped(item->ID) &&*/
|
if (/*!Equipped(item->ID) &&*/
|
||||||
!item->Magic && item->NoDrop != 0 && !inst->IsType(ItemClassContainer) && slot_id != SLOT_INVALID
|
!item->Magic && item->NoDrop != 0 && !inst->IsType(ItemClassContainer) && slot_id != INVALID_INDEX
|
||||||
/*&& steal_skill > item->StealSkill*/ )
|
/*&& steal_skill > item->StealSkill*/ )
|
||||||
{
|
{
|
||||||
slot[x] = slot_id;
|
slot[x] = slot_id;
|
||||||
|
|||||||
@ -474,13 +474,15 @@ protected:
|
|||||||
uint32 roambox_min_delay;
|
uint32 roambox_min_delay;
|
||||||
|
|
||||||
uint16 skills[HIGHEST_SKILL+1];
|
uint16 skills[HIGHEST_SKILL+1];
|
||||||
uint32 equipment[MAX_WORN_INVENTORY]; //this is an array of item IDs
|
|
||||||
|
uint32 equipment[EmuConstants::EQUIPMENT_SIZE]; //this is an array of item IDs
|
||||||
uint16 d_meele_texture1; //this is an item Material value
|
uint16 d_meele_texture1; //this is an item Material value
|
||||||
uint16 d_meele_texture2; //this is an item Material value (offhand)
|
uint16 d_meele_texture2; //this is an item Material value (offhand)
|
||||||
const char* ammo_idfile; //this determines projectile graphic "IT###" (see item field 'idfile')
|
const char* ammo_idfile; //this determines projectile graphic "IT###" (see item field 'idfile')
|
||||||
uint8 prim_melee_type; //Sets the Primary Weapon attack message and animation
|
uint8 prim_melee_type; //Sets the Primary Weapon attack message and animation
|
||||||
uint8 sec_melee_type; //Sets the Secondary Weapon attack message and animation
|
uint8 sec_melee_type; //Sets the Secondary Weapon attack message and animation
|
||||||
uint8 ranged_type; //Sets the Ranged Weapon attack message and animation
|
uint8 ranged_type; //Sets the Ranged Weapon attack message and animation
|
||||||
|
|
||||||
AA_SwarmPetInfo *swarmInfoPtr;
|
AA_SwarmPetInfo *swarmInfoPtr;
|
||||||
|
|
||||||
bool ldon_trapped;
|
bool ldon_trapped;
|
||||||
|
|||||||
@ -411,12 +411,12 @@ void Mob::MakePoweredPet(uint16 spell_id, const char* pettype, int16 petpower,
|
|||||||
// the base items for the pet. These are always loaded
|
// the base items for the pet. These are always loaded
|
||||||
// so that a rank 1 suspend minion does not kill things
|
// so that a rank 1 suspend minion does not kill things
|
||||||
// like the special back items some focused pets may receive.
|
// like the special back items some focused pets may receive.
|
||||||
uint32 petinv[MAX_WORN_INVENTORY];
|
uint32 petinv[EmuConstants::EQUIPMENT_SIZE];
|
||||||
memset(petinv, 0, sizeof(petinv));
|
memset(petinv, 0, sizeof(petinv));
|
||||||
const Item_Struct *item = 0;
|
const Item_Struct *item = 0;
|
||||||
|
|
||||||
if (database.GetBasePetItems(record.equipmentset, petinv)) {
|
if (database.GetBasePetItems(record.equipmentset, petinv)) {
|
||||||
for (int i=0; i<MAX_WORN_INVENTORY; i++)
|
for (int i = 0; i<EmuConstants::EQUIPMENT_SIZE; i++)
|
||||||
if (petinv[i]) {
|
if (petinv[i]) {
|
||||||
item = database.GetItem(petinv[i]);
|
item = database.GetItem(petinv[i]);
|
||||||
npc->AddLootDrop(item, &npc->itemlist, 0, 1, 127, true, true);
|
npc->AddLootDrop(item, &npc->itemlist, 0, 1, 127, true, true);
|
||||||
@ -543,7 +543,7 @@ void NPC::GetPetState(SpellBuff_Struct *pet_buffs, uint32 *items, char *name) {
|
|||||||
strn0cpy(name, GetName(), 64);
|
strn0cpy(name, GetName(), 64);
|
||||||
|
|
||||||
//save their items, we only care about what they are actually wearing
|
//save their items, we only care about what they are actually wearing
|
||||||
memcpy(items, equipment, sizeof(uint32)*MAX_WORN_INVENTORY);
|
memcpy(items, equipment, sizeof(uint32)*EmuConstants::EQUIPMENT_SIZE);
|
||||||
|
|
||||||
//save their buffs.
|
//save their buffs.
|
||||||
for (int i=0; i < GetPetMaxTotalSlots(); i++) {
|
for (int i=0; i < GetPetMaxTotalSlots(); i++) {
|
||||||
@ -629,7 +629,7 @@ void NPC::SetPetState(SpellBuff_Struct *pet_buffs, uint32 *items) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//restore their equipment...
|
//restore their equipment...
|
||||||
for(i = 0; i < MAX_WORN_INVENTORY; i++) {
|
for (i = 0; i < EmuConstants::EQUIPMENT_SIZE; i++) {
|
||||||
if(items[i] == 0)
|
if(items[i] == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -693,7 +693,7 @@ bool ZoneDatabase::GetBasePetItems(int32 equipmentset, uint32 *items) {
|
|||||||
while ((row = mysql_fetch_row(result)))
|
while ((row = mysql_fetch_row(result)))
|
||||||
{
|
{
|
||||||
slot = atoi(row[0]);
|
slot = atoi(row[0]);
|
||||||
if (slot >= MAX_WORN_INVENTORY)
|
if (slot >= EmuConstants::EQUIPMENT_SIZE)
|
||||||
continue;
|
continue;
|
||||||
if (items[slot] == 0)
|
if (items[slot] == 0)
|
||||||
items[slot] = atoi(row[1]);
|
items[slot] = atoi(row[1]);
|
||||||
|
|||||||
@ -74,17 +74,17 @@ void Mob::ApplySpecialAttackMod(SkillUseTypes skill, int32 &dmg, int32 &mindmg)
|
|||||||
case SkillFlyingKick:
|
case SkillFlyingKick:
|
||||||
case SkillRoundKick:
|
case SkillRoundKick:
|
||||||
case SkillKick:
|
case SkillKick:
|
||||||
item_slot = SLOT_FEET;
|
item_slot = MainFeet;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SkillBash:
|
case SkillBash:
|
||||||
item_slot = SLOT_SECONDARY;
|
item_slot = MainSecondary;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SkillDragonPunch:
|
case SkillDragonPunch:
|
||||||
case SkillEagleStrike:
|
case SkillEagleStrike:
|
||||||
case SkillTigerClaw:
|
case SkillTigerClaw:
|
||||||
item_slot = SLOT_HANDS;
|
item_slot = MainHands;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -116,7 +116,7 @@ void Mob::DoSpecialAttackDamage(Mob *who, SkillUseTypes skill, int32 max_damage,
|
|||||||
{
|
{
|
||||||
if(IsClient())
|
if(IsClient())
|
||||||
{
|
{
|
||||||
ItemInst *item = CastToClient()->GetInv().GetItem(SLOT_SECONDARY);
|
ItemInst *item = CastToClient()->GetInv().GetItem(MainSecondary);
|
||||||
if(item)
|
if(item)
|
||||||
{
|
{
|
||||||
if(item->GetItem()->ItemType == ItemTypeShield)
|
if(item->GetItem()->ItemType == ItemTypeShield)
|
||||||
@ -195,7 +195,7 @@ void Client::OPCombatAbility(const EQApplicationPacket *app) {
|
|||||||
//These two are not subject to the combat ability timer, as they
|
//These two are not subject to the combat ability timer, as they
|
||||||
//allready do their checking in conjunction with the attack timer
|
//allready do their checking in conjunction with the attack timer
|
||||||
//throwing weapons
|
//throwing weapons
|
||||||
if(ca_atk->m_atk == 11) {
|
if(ca_atk->m_atk == MainRange) {
|
||||||
if (ca_atk->m_skill == SkillThrowing) {
|
if (ca_atk->m_skill == SkillThrowing) {
|
||||||
SetAttackTimer();
|
SetAttackTimer();
|
||||||
ThrowingAttack(GetTarget());
|
ThrowingAttack(GetTarget());
|
||||||
@ -237,6 +237,7 @@ void Client::OPCombatAbility(const EQApplicationPacket *app) {
|
|||||||
|
|
||||||
int32 skill_reduction = this->GetSkillReuseTime(ca_atk->m_skill);
|
int32 skill_reduction = this->GetSkillReuseTime(ca_atk->m_skill);
|
||||||
|
|
||||||
|
// not sure what the '100' indicates..if ->m_atk is not used as 'slot' reference, then change MainRange above back to '11'
|
||||||
if ((ca_atk->m_atk == 100) && (ca_atk->m_skill == SkillBash)) { // SLAM - Bash without a shield equipped
|
if ((ca_atk->m_atk == 100) && (ca_atk->m_skill == SkillBash)) { // SLAM - Bash without a shield equipped
|
||||||
if (GetTarget() != this) {
|
if (GetTarget() != this) {
|
||||||
|
|
||||||
@ -244,8 +245,8 @@ void Client::OPCombatAbility(const EQApplicationPacket *app) {
|
|||||||
DoAnim(animTailRake);
|
DoAnim(animTailRake);
|
||||||
|
|
||||||
int32 ht = 0;
|
int32 ht = 0;
|
||||||
if(GetWeaponDamage(GetTarget(), GetInv().GetItem(SLOT_SECONDARY)) <= 0 &&
|
if(GetWeaponDamage(GetTarget(), GetInv().GetItem(MainSecondary)) <= 0 &&
|
||||||
GetWeaponDamage(GetTarget(), GetInv().GetItem(SLOT_SHOULDER)) <= 0){
|
GetWeaponDamage(GetTarget(), GetInv().GetItem(MainShoulders)) <= 0){
|
||||||
dmg = -5;
|
dmg = -5;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@ -324,7 +325,7 @@ void Client::OPCombatAbility(const EQApplicationPacket *app) {
|
|||||||
DoAnim(animKick);
|
DoAnim(animKick);
|
||||||
|
|
||||||
int32 ht = 0;
|
int32 ht = 0;
|
||||||
if(GetWeaponDamage(GetTarget(), GetInv().GetItem(SLOT_FEET)) <= 0){
|
if(GetWeaponDamage(GetTarget(), GetInv().GetItem(MainFeet)) <= 0){
|
||||||
dmg = -5;
|
dmg = -5;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@ -400,7 +401,7 @@ int Mob::MonkSpecialAttack(Mob* other, uint8 unchecked_type)
|
|||||||
int32 min_dmg = 1;
|
int32 min_dmg = 1;
|
||||||
int reuse = 0;
|
int reuse = 0;
|
||||||
SkillUseTypes skill_type; //to avoid casting... even though it "would work"
|
SkillUseTypes skill_type; //to avoid casting... even though it "would work"
|
||||||
uint8 itemslot = SLOT_FEET;
|
uint8 itemslot = MainFeet;
|
||||||
|
|
||||||
switch(unchecked_type)
|
switch(unchecked_type)
|
||||||
{
|
{
|
||||||
@ -416,7 +417,7 @@ int Mob::MonkSpecialAttack(Mob* other, uint8 unchecked_type)
|
|||||||
case SkillDragonPunch:{
|
case SkillDragonPunch:{
|
||||||
skill_type = SkillDragonPunch;
|
skill_type = SkillDragonPunch;
|
||||||
max_dmg = ((GetSTR()+GetSkill(skill_type)) * RuleI(Combat, DragonPunchBonus) / 100) + 26;
|
max_dmg = ((GetSTR()+GetSkill(skill_type)) * RuleI(Combat, DragonPunchBonus) / 100) + 26;
|
||||||
itemslot = SLOT_HANDS;
|
itemslot = MainHands;
|
||||||
ApplySpecialAttackMod(skill_type, max_dmg, min_dmg);
|
ApplySpecialAttackMod(skill_type, max_dmg, min_dmg);
|
||||||
DoAnim(animTailRake);
|
DoAnim(animTailRake);
|
||||||
reuse = TailRakeReuseTime;
|
reuse = TailRakeReuseTime;
|
||||||
@ -426,7 +427,7 @@ int Mob::MonkSpecialAttack(Mob* other, uint8 unchecked_type)
|
|||||||
case SkillEagleStrike:{
|
case SkillEagleStrike:{
|
||||||
skill_type = SkillEagleStrike;
|
skill_type = SkillEagleStrike;
|
||||||
max_dmg = ((GetSTR()+GetSkill(skill_type)) * RuleI(Combat, EagleStrikeBonus) / 100) + 19;
|
max_dmg = ((GetSTR()+GetSkill(skill_type)) * RuleI(Combat, EagleStrikeBonus) / 100) + 19;
|
||||||
itemslot = SLOT_HANDS;
|
itemslot = MainHands;
|
||||||
ApplySpecialAttackMod(skill_type, max_dmg, min_dmg);
|
ApplySpecialAttackMod(skill_type, max_dmg, min_dmg);
|
||||||
DoAnim(animEagleStrike);
|
DoAnim(animEagleStrike);
|
||||||
reuse = EagleStrikeReuseTime;
|
reuse = EagleStrikeReuseTime;
|
||||||
@ -436,7 +437,7 @@ int Mob::MonkSpecialAttack(Mob* other, uint8 unchecked_type)
|
|||||||
case SkillTigerClaw:{
|
case SkillTigerClaw:{
|
||||||
skill_type = SkillTigerClaw;
|
skill_type = SkillTigerClaw;
|
||||||
max_dmg = ((GetSTR()+GetSkill(skill_type)) * RuleI(Combat, TigerClawBonus) / 100) + 12;
|
max_dmg = ((GetSTR()+GetSkill(skill_type)) * RuleI(Combat, TigerClawBonus) / 100) + 12;
|
||||||
itemslot = SLOT_HANDS;
|
itemslot = MainHands;
|
||||||
ApplySpecialAttackMod(skill_type, max_dmg, min_dmg);
|
ApplySpecialAttackMod(skill_type, max_dmg, min_dmg);
|
||||||
DoAnim(animTigerClaw);
|
DoAnim(animTigerClaw);
|
||||||
reuse = TigerClawReuseTime;
|
reuse = TigerClawReuseTime;
|
||||||
@ -506,7 +507,7 @@ void Mob::TryBackstab(Mob *other, int ReuseTime) {
|
|||||||
|
|
||||||
//make sure we have a proper weapon if we are a client.
|
//make sure we have a proper weapon if we are a client.
|
||||||
if(IsClient()) {
|
if(IsClient()) {
|
||||||
const ItemInst *wpn = CastToClient()->GetInv().GetItem(SLOT_PRIMARY);
|
const ItemInst *wpn = CastToClient()->GetInv().GetItem(MainPrimary);
|
||||||
if(!wpn || (wpn->GetItem()->ItemType != ItemType1HPiercing)){
|
if(!wpn || (wpn->GetItem()->ItemType != ItemType1HPiercing)){
|
||||||
Message_StringID(13, BACKSTAB_WEAPON);
|
Message_StringID(13, BACKSTAB_WEAPON);
|
||||||
return;
|
return;
|
||||||
@ -588,11 +589,11 @@ void Mob::RogueBackstab(Mob* other, bool min_damage, int ReuseTime)
|
|||||||
|
|
||||||
if(IsClient()){
|
if(IsClient()){
|
||||||
const ItemInst *wpn = nullptr;
|
const ItemInst *wpn = nullptr;
|
||||||
wpn = CastToClient()->GetInv().GetItem(SLOT_PRIMARY);
|
wpn = CastToClient()->GetInv().GetItem(MainPrimary);
|
||||||
if(wpn) {
|
if(wpn) {
|
||||||
primaryweapondamage = GetWeaponDamage(other, wpn);
|
primaryweapondamage = GetWeaponDamage(other, wpn);
|
||||||
backstab_dmg = wpn->GetItem()->BackstabDmg;
|
backstab_dmg = wpn->GetItem()->BackstabDmg;
|
||||||
for(int i = 0; i < MAX_AUGMENT_SLOTS; ++i)
|
for (int i = 0; i < EmuConstants::ITEM_COMMON_SIZE; ++i)
|
||||||
{
|
{
|
||||||
ItemInst *aug = wpn->GetAugment(i);
|
ItemInst *aug = wpn->GetAugment(i);
|
||||||
if(aug)
|
if(aug)
|
||||||
@ -671,7 +672,7 @@ void Mob::RogueAssassinate(Mob* other)
|
|||||||
{
|
{
|
||||||
//can you dodge, parry, etc.. an assassinate??
|
//can you dodge, parry, etc.. an assassinate??
|
||||||
//if so, use DoSpecialAttackDamage(other, BACKSTAB, 32000); instead
|
//if so, use DoSpecialAttackDamage(other, BACKSTAB, 32000); instead
|
||||||
if(GetWeaponDamage(other, IsClient()?CastToClient()->GetInv().GetItem(SLOT_PRIMARY):(const ItemInst*)nullptr) > 0){
|
if(GetWeaponDamage(other, IsClient()?CastToClient()->GetInv().GetItem(MainPrimary):(const ItemInst*)nullptr) > 0){
|
||||||
other->Damage(this, 32000, SPELL_UNKNOWN, SkillBackstab);
|
other->Damage(this, 32000, SPELL_UNKNOWN, SkillBackstab);
|
||||||
}else{
|
}else{
|
||||||
other->Damage(this, -5, SPELL_UNKNOWN, SkillBackstab);
|
other->Damage(this, -5, SPELL_UNKNOWN, SkillBackstab);
|
||||||
@ -690,20 +691,20 @@ void Client::RangedAttack(Mob* other, bool CanDoubleAttack) {
|
|||||||
//Message(0, "Error: Timer not up. Attack %d, ranged %d", attack_timer.GetRemainingTime(), ranged_timer.GetRemainingTime());
|
//Message(0, "Error: Timer not up. Attack %d, ranged %d", attack_timer.GetRemainingTime(), ranged_timer.GetRemainingTime());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const ItemInst* RangeWeapon = m_inv[SLOT_RANGE];
|
const ItemInst* RangeWeapon = m_inv[MainRange];
|
||||||
|
|
||||||
//locate ammo
|
//locate ammo
|
||||||
int ammo_slot = SLOT_AMMO;
|
int ammo_slot = MainAmmo;
|
||||||
const ItemInst* Ammo = m_inv[SLOT_AMMO];
|
const ItemInst* Ammo = m_inv[MainAmmo];
|
||||||
|
|
||||||
if (!RangeWeapon || !RangeWeapon->IsType(ItemClassCommon)) {
|
if (!RangeWeapon || !RangeWeapon->IsType(ItemClassCommon)) {
|
||||||
mlog(COMBAT__RANGED, "Ranged attack canceled. Missing or invalid ranged weapon (%d) in slot %d", GetItemIDAt(SLOT_RANGE), SLOT_RANGE);
|
mlog(COMBAT__RANGED, "Ranged attack canceled. Missing or invalid ranged weapon (%d) in slot %d", GetItemIDAt(MainRange), MainRange);
|
||||||
Message(0, "Error: Rangeweapon: GetItem(%i)==0, you have no bow!", GetItemIDAt(SLOT_RANGE));
|
Message(0, "Error: Rangeweapon: GetItem(%i)==0, you have no bow!", GetItemIDAt(MainRange));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!Ammo || !Ammo->IsType(ItemClassCommon)) {
|
if (!Ammo || !Ammo->IsType(ItemClassCommon)) {
|
||||||
mlog(COMBAT__RANGED, "Ranged attack canceled. Missing or invalid ammo item (%d) in slot %d", GetItemIDAt(SLOT_AMMO), SLOT_AMMO);
|
mlog(COMBAT__RANGED, "Ranged attack canceled. Missing or invalid ammo item (%d) in slot %d", GetItemIDAt(MainAmmo), MainAmmo);
|
||||||
Message(0, "Error: Ammo: GetItem(%i)==0, you have no ammo!", GetItemIDAt(SLOT_AMMO));
|
Message(0, "Error: Ammo: GetItem(%i)==0, you have no ammo!", GetItemIDAt(MainAmmo));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -728,7 +729,7 @@ void Client::RangedAttack(Mob* other, bool CanDoubleAttack) {
|
|||||||
//first look for quivers
|
//first look for quivers
|
||||||
int r;
|
int r;
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for(r = SLOT_PERSONAL_BEGIN; r <= SLOT_PERSONAL_END; r++) {
|
for(r = EmuConstants::GENERAL_BEGIN; r <= EmuConstants::GENERAL_END; r++) {
|
||||||
const ItemInst *pi = m_inv[r];
|
const ItemInst *pi = m_inv[r];
|
||||||
if(pi == nullptr || !pi->IsType(ItemClassContainer))
|
if(pi == nullptr || !pi->IsType(ItemClassContainer))
|
||||||
continue;
|
continue;
|
||||||
@ -760,7 +761,7 @@ void Client::RangedAttack(Mob* other, bool CanDoubleAttack) {
|
|||||||
//if we dont find a quiver, look through our inventory again
|
//if we dont find a quiver, look through our inventory again
|
||||||
//not caring if the thing is a quiver.
|
//not caring if the thing is a quiver.
|
||||||
int32 aslot = m_inv.HasItem(AmmoItem->ID, 1, invWherePersonal);
|
int32 aslot = m_inv.HasItem(AmmoItem->ID, 1, invWherePersonal);
|
||||||
if(aslot != SLOT_INVALID) {
|
if (aslot != INVALID_INDEX) {
|
||||||
ammo_slot = aslot;
|
ammo_slot = aslot;
|
||||||
Ammo = m_inv[aslot];
|
Ammo = m_inv[aslot];
|
||||||
mlog(COMBAT__RANGED, "Using ammo from inventory stack at slot %d. %d in stack.", ammo_slot, Ammo->GetCharges());
|
mlog(COMBAT__RANGED, "Using ammo from inventory stack at slot %d. %d in stack.", ammo_slot, Ammo->GetCharges());
|
||||||
@ -1122,19 +1123,19 @@ void Client::ThrowingAttack(Mob* other, bool CanDoubleAttack) { //old was 51
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ammo_slot = SLOT_RANGE;
|
int ammo_slot = MainRange;
|
||||||
const ItemInst* RangeWeapon = m_inv[SLOT_RANGE];
|
const ItemInst* RangeWeapon = m_inv[MainRange];
|
||||||
|
|
||||||
if (!RangeWeapon || !RangeWeapon->IsType(ItemClassCommon)) {
|
if (!RangeWeapon || !RangeWeapon->IsType(ItemClassCommon)) {
|
||||||
mlog(COMBAT__RANGED, "Ranged attack canceled. Missing or invalid ranged weapon (%d) in slot %d", GetItemIDAt(SLOT_RANGE), SLOT_RANGE);
|
mlog(COMBAT__RANGED, "Ranged attack canceled. Missing or invalid ranged weapon (%d) in slot %d", GetItemIDAt(MainRange), MainRange);
|
||||||
Message(0, "Error: Rangeweapon: GetItem(%i)==0, you have nothing to throw!", GetItemIDAt(SLOT_RANGE));
|
Message(0, "Error: Rangeweapon: GetItem(%i)==0, you have nothing to throw!", GetItemIDAt(MainRange));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Item_Struct* item = RangeWeapon->GetItem();
|
const Item_Struct* item = RangeWeapon->GetItem();
|
||||||
if(item->ItemType != ItemTypeLargeThrowing && item->ItemType != ItemTypeSmallThrowing) {
|
if(item->ItemType != ItemTypeLargeThrowing && item->ItemType != ItemTypeSmallThrowing) {
|
||||||
mlog(COMBAT__RANGED, "Ranged attack canceled. Ranged item %d is not a throwing weapon. type %d.", item->ItemType);
|
mlog(COMBAT__RANGED, "Ranged attack canceled. Ranged item %d is not a throwing weapon. type %d.", item->ItemType);
|
||||||
Message(0, "Error: Rangeweapon: GetItem(%i)==0, you have nothing useful to throw!", GetItemIDAt(SLOT_RANGE));
|
Message(0, "Error: Rangeweapon: GetItem(%i)==0, you have nothing useful to throw!", GetItemIDAt(MainRange));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1142,16 +1143,16 @@ void Client::ThrowingAttack(Mob* other, bool CanDoubleAttack) { //old was 51
|
|||||||
|
|
||||||
if(RangeWeapon->GetCharges() == 1) {
|
if(RangeWeapon->GetCharges() == 1) {
|
||||||
//first check ammo
|
//first check ammo
|
||||||
const ItemInst* AmmoItem = m_inv[SLOT_AMMO];
|
const ItemInst* AmmoItem = m_inv[MainAmmo];
|
||||||
if(AmmoItem != nullptr && AmmoItem->GetID() == RangeWeapon->GetID()) {
|
if(AmmoItem != nullptr && AmmoItem->GetID() == RangeWeapon->GetID()) {
|
||||||
//more in the ammo slot, use it
|
//more in the ammo slot, use it
|
||||||
RangeWeapon = AmmoItem;
|
RangeWeapon = AmmoItem;
|
||||||
ammo_slot = SLOT_AMMO;
|
ammo_slot = MainAmmo;
|
||||||
mlog(COMBAT__RANGED, "Using ammo from ammo slot, stack at slot %d. %d in stack.", ammo_slot, RangeWeapon->GetCharges());
|
mlog(COMBAT__RANGED, "Using ammo from ammo slot, stack at slot %d. %d in stack.", ammo_slot, RangeWeapon->GetCharges());
|
||||||
} else {
|
} else {
|
||||||
//look through our inventory for more
|
//look through our inventory for more
|
||||||
int32 aslot = m_inv.HasItem(item->ID, 1, invWherePersonal);
|
int32 aslot = m_inv.HasItem(item->ID, 1, invWherePersonal);
|
||||||
if(aslot != SLOT_INVALID) {
|
if (aslot != INVALID_INDEX) {
|
||||||
//the item wont change, but the instance does, not that it matters
|
//the item wont change, but the instance does, not that it matters
|
||||||
ammo_slot = aslot;
|
ammo_slot = aslot;
|
||||||
RangeWeapon = m_inv[aslot];
|
RangeWeapon = m_inv[aslot];
|
||||||
@ -1692,8 +1693,8 @@ void Client::DoClassAttacks(Mob *ca_target, uint16 skill, bool IsRiposte)
|
|||||||
{
|
{
|
||||||
DoAnim(animTailRake);
|
DoAnim(animTailRake);
|
||||||
|
|
||||||
if(GetWeaponDamage(ca_target, GetInv().GetItem(SLOT_SECONDARY)) <= 0 &&
|
if(GetWeaponDamage(ca_target, GetInv().GetItem(MainSecondary)) <= 0 &&
|
||||||
GetWeaponDamage(ca_target, GetInv().GetItem(SLOT_SHOULDER)) <= 0){
|
GetWeaponDamage(ca_target, GetInv().GetItem(MainShoulders)) <= 0){
|
||||||
dmg = -5;
|
dmg = -5;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@ -1763,7 +1764,7 @@ void Client::DoClassAttacks(Mob *ca_target, uint16 skill, bool IsRiposte)
|
|||||||
{
|
{
|
||||||
DoAnim(animKick);
|
DoAnim(animKick);
|
||||||
|
|
||||||
if(GetWeaponDamage(ca_target, GetInv().GetItem(SLOT_FEET)) <= 0){
|
if(GetWeaponDamage(ca_target, GetInv().GetItem(MainFeet)) <= 0){
|
||||||
dmg = -5;
|
dmg = -5;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@ -2125,7 +2126,7 @@ void Mob::DoMeleeSkillAttackDmg(Mob* other, uint16 weapon_damage, SkillUseTypes
|
|||||||
|
|
||||||
if(skillinuse == SkillBash){
|
if(skillinuse == SkillBash){
|
||||||
if(IsClient()){
|
if(IsClient()){
|
||||||
ItemInst *item = CastToClient()->GetInv().GetItem(SLOT_SECONDARY);
|
ItemInst *item = CastToClient()->GetInv().GetItem(MainSecondary);
|
||||||
if(item){
|
if(item){
|
||||||
if(item->GetItem()->ItemType == ItemTypeShield) {
|
if(item->GetItem()->ItemType == ItemTypeShield) {
|
||||||
hate += item->GetItem()->AC;
|
hate += item->GetItem()->AC;
|
||||||
@ -2167,6 +2168,8 @@ void Mob::DoMeleeSkillAttackDmg(Mob* other, uint16 weapon_damage, SkillUseTypes
|
|||||||
else
|
else
|
||||||
damage = -5;
|
damage = -5;
|
||||||
|
|
||||||
|
other->AddToHateList(this, hate);
|
||||||
|
|
||||||
bool CanSkillProc = true;
|
bool CanSkillProc = true;
|
||||||
if (skillinuse == SkillOffense){ //Hack to allow damage to display.
|
if (skillinuse == SkillOffense){ //Hack to allow damage to display.
|
||||||
skillinuse = SkillTigerClaw; //'strike' your opponent - Arbitrary choice for message.
|
skillinuse = SkillTigerClaw; //'strike' your opponent - Arbitrary choice for message.
|
||||||
|
|||||||
@ -599,7 +599,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial)
|
|||||||
snprintf(effect_desc, _EDLEN, "Flesh To Bone");
|
snprintf(effect_desc, _EDLEN, "Flesh To Bone");
|
||||||
#endif
|
#endif
|
||||||
if(IsClient()){
|
if(IsClient()){
|
||||||
ItemInst* transI = CastToClient()->GetInv().GetItem(SLOT_CURSOR);
|
ItemInst* transI = CastToClient()->GetInv().GetItem(MainCursor);
|
||||||
if(transI && transI->IsType(ItemClassCommon) && transI->IsStackable()){
|
if(transI && transI->IsType(ItemClassCommon) && transI->IsStackable()){
|
||||||
uint32 fcharges = transI->GetCharges();
|
uint32 fcharges = transI->GetCharges();
|
||||||
//Does it sound like meat... maybe should check if it looks like meat too...
|
//Does it sound like meat... maybe should check if it looks like meat too...
|
||||||
@ -609,7 +609,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial)
|
|||||||
strstr(transI->GetItem()->Name, "Flesh") ||
|
strstr(transI->GetItem()->Name, "Flesh") ||
|
||||||
strstr(transI->GetItem()->Name, "parts") ||
|
strstr(transI->GetItem()->Name, "parts") ||
|
||||||
strstr(transI->GetItem()->Name, "Parts")){
|
strstr(transI->GetItem()->Name, "Parts")){
|
||||||
CastToClient()->DeleteItemInInventory(SLOT_CURSOR, fcharges, true);
|
CastToClient()->DeleteItemInInventory(MainCursor, fcharges, true);
|
||||||
CastToClient()->SummonItem(13073, fcharges);
|
CastToClient()->SummonItem(13073, fcharges);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@ -1159,7 +1159,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial)
|
|||||||
|
|
||||||
if (SummonedItem) {
|
if (SummonedItem) {
|
||||||
c->PushItemOnCursor(*SummonedItem);
|
c->PushItemOnCursor(*SummonedItem);
|
||||||
c->SendItemPacket(SLOT_CURSOR, SummonedItem, ItemPacketSummonItem);
|
c->SendItemPacket(MainCursor, SummonedItem, ItemPacketSummonItem);
|
||||||
safe_delete(SummonedItem);
|
safe_delete(SummonedItem);
|
||||||
}
|
}
|
||||||
SummonedItem = database.CreateItem(spell.base[i], charges);
|
SummonedItem = database.CreateItem(spell.base[i], charges);
|
||||||
@ -2983,7 +2983,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial)
|
|||||||
if (SummonedItem) {
|
if (SummonedItem) {
|
||||||
Client *c=CastToClient();
|
Client *c=CastToClient();
|
||||||
c->PushItemOnCursor(*SummonedItem);
|
c->PushItemOnCursor(*SummonedItem);
|
||||||
c->SendItemPacket(SLOT_CURSOR, SummonedItem, ItemPacketSummonItem);
|
c->SendItemPacket(MainCursor, SummonedItem, ItemPacketSummonItem);
|
||||||
safe_delete(SummonedItem);
|
safe_delete(SummonedItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5070,7 +5070,7 @@ int16 Client::GetSympatheticFocusEffect(focusType type, uint16 spell_id) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int y = 0; y < MAX_AUGMENT_SLOTS; ++y)
|
for (int y = 0; y < EmuConstants::ITEM_COMMON_SIZE; ++y)
|
||||||
{
|
{
|
||||||
if (SympatheticProcList.size() > MAX_SYMPATHETIC)
|
if (SympatheticProcList.size() > MAX_SYMPATHETIC)
|
||||||
continue;
|
continue;
|
||||||
@ -5226,7 +5226,7 @@ int16 Client::GetFocusEffect(focusType type, uint16 spell_id) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int y = 0; y < MAX_AUGMENT_SLOTS; ++y)
|
for (int y = 0; y < EmuConstants::ITEM_COMMON_SIZE; ++y)
|
||||||
{
|
{
|
||||||
ItemInst *aug = nullptr;
|
ItemInst *aug = nullptr;
|
||||||
aug = ins->GetAugment(y);
|
aug = ins->GetAugment(y);
|
||||||
|
|||||||
@ -285,7 +285,7 @@ bool Mob::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot,
|
|||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( itm && (itm->GetItem()->Click.Type == ET_EquipClick) && !(item_slot < 22 || item_slot == 9999) ){
|
if( itm && (itm->GetItem()->Click.Type == ET_EquipClick) && !(item_slot <= MainAmmo || item_slot == MainPowerSource) ){
|
||||||
if (CastToClient()->GetClientVersion() < EQClientSoF) {
|
if (CastToClient()->GetClientVersion() < EQClientSoF) {
|
||||||
// They are attempting to cast a must equip clicky without having it equipped
|
// They are attempting to cast a must equip clicky without having it equipped
|
||||||
LogFile->write(EQEMuLog::Error, "HACKER: %s (account: %s) attempted to click an equip-only effect on item %s (id: %d) without equiping it!", CastToClient()->GetCleanName(), CastToClient()->AccountName(), itm->GetItem()->Name, itm->GetItem()->ID);
|
LogFile->write(EQEMuLog::Error, "HACKER: %s (account: %s) attempted to click an equip-only effect on item %s (id: %d) without equiping it!", CastToClient()->GetCleanName(), CastToClient()->AccountName(), itm->GetItem()->Name, itm->GetItem()->ID);
|
||||||
@ -1195,7 +1195,7 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, uint16 slot,
|
|||||||
uint32 recastdelay = 0;
|
uint32 recastdelay = 0;
|
||||||
uint32 recasttype = 0;
|
uint32 recasttype = 0;
|
||||||
|
|
||||||
for(int r = 0; r < MAX_AUGMENT_SLOTS; r++) {
|
for (int r = 0; r < EmuConstants::ITEM_COMMON_SIZE; r++) {
|
||||||
const ItemInst* aug_i = inst->GetAugment(r);
|
const ItemInst* aug_i = inst->GetAugment(r);
|
||||||
|
|
||||||
if(!aug_i)
|
if(!aug_i)
|
||||||
|
|||||||
@ -201,7 +201,7 @@ bool TitleManager::IsClientEligibleForTitle(Client *c, std::vector<TitleEntry>::
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if((Title->ItemID >= 1) && (c->GetInv().HasItem(Title->ItemID, 0, 0xFF) == SLOT_INVALID))
|
if ((Title->ItemID >= 1) && (c->GetInv().HasItem(Title->ItemID, 0, 0xFF) == INVALID_INDEX))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if((Title->TitleSet > 0) && (!c->CheckTitle(Title->TitleSet)))
|
if((Title->TitleSet > 0) && (!c->CheckTitle(Title->TitleSet)))
|
||||||
|
|||||||
@ -482,7 +482,7 @@ void Object::HandleAutoCombine(Client* user, const RecipeAutoCombine_Struct* rac
|
|||||||
//because a HasItem on items with num > 1 only returns the
|
//because a HasItem on items with num > 1 only returns the
|
||||||
//last-most slot... the results of this are useless to us
|
//last-most slot... the results of this are useless to us
|
||||||
//when we go to delete them because we cannot assume it is in a single stack.
|
//when we go to delete them because we cannot assume it is in a single stack.
|
||||||
if(user_inv.HasItem(item, num, invWherePersonal) != SLOT_INVALID)
|
if (user_inv.HasItem(item, num, invWherePersonal) != INVALID_INDEX)
|
||||||
count += num;
|
count += num;
|
||||||
else
|
else
|
||||||
MissingItems.push_back(item);
|
MissingItems.push_back(item);
|
||||||
@ -524,7 +524,7 @@ void Object::HandleAutoCombine(Client* user, const RecipeAutoCombine_Struct* rac
|
|||||||
//we have to loop here to delete 1 at a time in case its in multiple stacks.
|
//we have to loop here to delete 1 at a time in case its in multiple stacks.
|
||||||
for(k = 0; k < counts[r]; k++) {
|
for(k = 0; k < counts[r]; k++) {
|
||||||
slot = user_inv.HasItem(items[r], 1, invWherePersonal);
|
slot = user_inv.HasItem(items[r], 1, invWherePersonal);
|
||||||
if(slot == SLOT_INVALID) {
|
if (slot == INVALID_INDEX) {
|
||||||
//WTF... I just checked this above, but just to be sure...
|
//WTF... I just checked this above, but just to be sure...
|
||||||
//we cant undo the previous deletes without a lot of work.
|
//we cant undo the previous deletes without a lot of work.
|
||||||
//so just call it quits, this shouldent ever happen anyways.
|
//so just call it quits, this shouldent ever happen anyways.
|
||||||
|
|||||||
@ -87,7 +87,7 @@ void Trade::AddEntity(uint16 from_slot_id, uint16 trade_slot_id)
|
|||||||
|
|
||||||
// Item always goes into trade bucket from cursor
|
// Item always goes into trade bucket from cursor
|
||||||
Client* client = owner->CastToClient();
|
Client* client = owner->CastToClient();
|
||||||
const ItemInst* inst = client->GetInv().GetItem(SLOT_CURSOR);
|
const ItemInst* inst = client->GetInv().GetItem(MainCursor);
|
||||||
if (!inst) {
|
if (!inst) {
|
||||||
client->Message(13, "Error: Could not find item on your cursor!");
|
client->Message(13, "Error: Could not find item on your cursor!");
|
||||||
return;
|
return;
|
||||||
@ -105,7 +105,7 @@ void Trade::AddEntity(uint16 from_slot_id, uint16 trade_slot_id)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (client->GetInv().GetItem(SLOT_CURSOR)->GetID() != client->GetInv().GetItem(trade_slot_id)->GetID()) {
|
if (client->GetInv().GetItem(MainCursor)->GetID() != client->GetInv().GetItem(trade_slot_id)->GetID()) {
|
||||||
client->Kick();
|
client->Kick();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -318,7 +318,7 @@ void Client::ResetTrade() {
|
|||||||
{
|
{
|
||||||
bool is_arrow = (TempItem->ItemType == ItemTypeArrow) ? true : false;
|
bool is_arrow = (TempItem->ItemType == ItemTypeArrow) ? true : false;
|
||||||
int freeslotid = GetInv().FindFreeSlot(ins->IsType(ItemClassContainer), true, TempItem->Size, is_arrow);
|
int freeslotid = GetInv().FindFreeSlot(ins->IsType(ItemClassContainer), true, TempItem->Size, is_arrow);
|
||||||
if (freeslotid == SLOT_INVALID)
|
if (freeslotid == INVALID_INDEX)
|
||||||
{
|
{
|
||||||
DropInst(ins);
|
DropInst(ins);
|
||||||
}
|
}
|
||||||
@ -441,14 +441,14 @@ void Client::FinishTrade(Mob* tradingWith, ServerPacket* qspack, bool finalizer)
|
|||||||
|
|
||||||
if(QSPLT) {
|
if(QSPLT) {
|
||||||
qsaudit->items[parent_offset].to_id = this->character_id;
|
qsaudit->items[parent_offset].to_id = this->character_id;
|
||||||
qsaudit->items[parent_offset].to_slot = SLOT_CURSOR;
|
qsaudit->items[parent_offset].to_slot = MainCursor;
|
||||||
|
|
||||||
if(inst->IsType(ItemClassContainer)) {
|
if(inst->IsType(ItemClassContainer)) {
|
||||||
for(uint8 bagslot_idx = 0; bagslot_idx < inst->GetItem()->BagSlots; bagslot_idx++) {
|
for(uint8 bagslot_idx = 0; bagslot_idx < inst->GetItem()->BagSlots; bagslot_idx++) {
|
||||||
const ItemInst* bag_inst = inst->GetItem(bagslot_idx);
|
const ItemInst* bag_inst = inst->GetItem(bagslot_idx);
|
||||||
|
|
||||||
if(bag_inst == nullptr) { continue; }
|
if(bag_inst == nullptr) { continue; }
|
||||||
int16 to_bagslot_id = Inventory::CalcSlotId(SLOT_CURSOR, bagslot_idx);
|
int16 to_bagslot_id = Inventory::CalcSlotId(MainCursor, bagslot_idx);
|
||||||
|
|
||||||
qsaudit->items[++parent_offset].to_id = this->character_id;
|
qsaudit->items[++parent_offset].to_id = this->character_id;
|
||||||
qsaudit->items[parent_offset].to_slot = to_bagslot_id;
|
qsaudit->items[parent_offset].to_slot = to_bagslot_id;
|
||||||
@ -465,14 +465,14 @@ void Client::FinishTrade(Mob* tradingWith, ServerPacket* qspack, bool finalizer)
|
|||||||
|
|
||||||
if(QSPLT) {
|
if(QSPLT) {
|
||||||
qsaudit->items[parent_offset].to_id = this->character_id;
|
qsaudit->items[parent_offset].to_id = this->character_id;
|
||||||
qsaudit->items[parent_offset].to_slot = SLOT_CURSOR;
|
qsaudit->items[parent_offset].to_slot = MainCursor;
|
||||||
|
|
||||||
if(inst->IsType(ItemClassContainer)) {
|
if(inst->IsType(ItemClassContainer)) {
|
||||||
for(uint8 bagslot_idx = 0; bagslot_idx < inst->GetItem()->BagSlots; bagslot_idx++) {
|
for(uint8 bagslot_idx = 0; bagslot_idx < inst->GetItem()->BagSlots; bagslot_idx++) {
|
||||||
const ItemInst* bag_inst = inst->GetItem(bagslot_idx);
|
const ItemInst* bag_inst = inst->GetItem(bagslot_idx);
|
||||||
|
|
||||||
if(bag_inst == nullptr) { continue; }
|
if(bag_inst == nullptr) { continue; }
|
||||||
int16 to_bagslot_id = Inventory::CalcSlotId(SLOT_CURSOR, bagslot_idx);
|
int16 to_bagslot_id = Inventory::CalcSlotId(MainCursor, bagslot_idx);
|
||||||
|
|
||||||
qsaudit->items[++parent_offset].to_id = this->character_id;
|
qsaudit->items[++parent_offset].to_id = this->character_id;
|
||||||
qsaudit->items[parent_offset].to_slot = to_bagslot_id;
|
qsaudit->items[parent_offset].to_slot = to_bagslot_id;
|
||||||
@ -2214,7 +2214,7 @@ void Client::SellToBuyer(const EQApplicationPacket *app) {
|
|||||||
|
|
||||||
if(!item || !Quantity || !Price || !QtyBuyerWants) return;
|
if(!item || !Quantity || !Price || !QtyBuyerWants) return;
|
||||||
|
|
||||||
if(m_inv.HasItem(ItemID, Quantity, invWhereWorn|invWherePersonal|invWhereCursor) == SLOT_INVALID) {
|
if (m_inv.HasItem(ItemID, Quantity, invWhereWorn | invWherePersonal | invWhereCursor) == INVALID_INDEX) {
|
||||||
Message(13, "You do not have %i %s on you.", Quantity, item->Name);
|
Message(13, "You do not have %i %s on you.", Quantity, item->Name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2264,7 +2264,7 @@ void Client::SellToBuyer(const EQApplicationPacket *app) {
|
|||||||
int16 SellerSlot = m_inv.HasItem(ItemID, 1, invWhereWorn|invWherePersonal|invWhereCursor);
|
int16 SellerSlot = m_inv.HasItem(ItemID, 1, invWhereWorn|invWherePersonal|invWhereCursor);
|
||||||
|
|
||||||
// This shouldn't happen, as we already checked there was space in the Buyer's inventory
|
// This shouldn't happen, as we already checked there was space in the Buyer's inventory
|
||||||
if(SellerSlot == SLOT_INVALID) {
|
if (SellerSlot == INVALID_INDEX) {
|
||||||
|
|
||||||
if(i > 0) {
|
if(i > 0) {
|
||||||
// Set the Quantity to the actual number we successfully transferred.
|
// Set the Quantity to the actual number we successfully transferred.
|
||||||
@ -2316,7 +2316,7 @@ void Client::SellToBuyer(const EQApplicationPacket *app) {
|
|||||||
// Find the slot on the seller that has a stack of at least 1 of the item
|
// Find the slot on the seller that has a stack of at least 1 of the item
|
||||||
int16 SellerSlot = m_inv.HasItem(ItemID, 1, invWhereWorn|invWherePersonal|invWhereCursor);
|
int16 SellerSlot = m_inv.HasItem(ItemID, 1, invWhereWorn|invWherePersonal|invWhereCursor);
|
||||||
|
|
||||||
if(SellerSlot == SLOT_INVALID) {
|
if (SellerSlot == INVALID_INDEX) {
|
||||||
_log(TRADING__BARTER, "Unexpected error while moving item from seller to buyer.");
|
_log(TRADING__BARTER, "Unexpected error while moving item from seller to buyer.");
|
||||||
Message(13, "Internal error while processing transaction.");
|
Message(13, "Internal error while processing transaction.");
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -1996,7 +1996,7 @@ void ZoneDatabase::LoadMercEquipment(Merc *merc) {
|
|||||||
int itemCount = 0;
|
int itemCount = 0;
|
||||||
|
|
||||||
while(DataRow = mysql_fetch_row(DatasetResult)) {
|
while(DataRow = mysql_fetch_row(DatasetResult)) {
|
||||||
if(itemCount == MAX_WORN_INVENTORY)
|
if (itemCount == EmuConstants::EQUIPMENT_SIZE)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if(atoi(DataRow[0]) > 0) {
|
if(atoi(DataRow[0]) > 0) {
|
||||||
@ -2772,7 +2772,7 @@ void ZoneDatabase::SavePetInfo(Client *c) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i=0; i<MAX_WORN_INVENTORY; i++) {
|
for (i = 0; i<EmuConstants::EQUIPMENT_SIZE; i++) {
|
||||||
if(petinfo->Items[i]) {
|
if(petinfo->Items[i]) {
|
||||||
database.RunQuery(query, MakeAnyLenString(&query,
|
database.RunQuery(query, MakeAnyLenString(&query,
|
||||||
"INSERT INTO `character_pet_inventory` (`char_id`, `pet`, `slot`, `item_id`) values (%u, 0, %u, %u)",
|
"INSERT INTO `character_pet_inventory` (`char_id`, `pet`, `slot`, `item_id`) values (%u, 0, %u, %u)",
|
||||||
@ -2796,7 +2796,7 @@ void ZoneDatabase::SavePetInfo(Client *c) {
|
|||||||
}
|
}
|
||||||
safe_delete_array(query);
|
safe_delete_array(query);
|
||||||
|
|
||||||
for(i=0; i<MAX_WORN_INVENTORY; i++) {
|
for (i = 0; i<EmuConstants::EQUIPMENT_SIZE; i++) {
|
||||||
if(suspended->Items[i]) {
|
if(suspended->Items[i]) {
|
||||||
database.RunQuery(query, MakeAnyLenString(&query,
|
database.RunQuery(query, MakeAnyLenString(&query,
|
||||||
"INSERT INTO `character_pet_inventory` (`char_id`, `pet`, `slot`, `item_id`) values (%u, 1, %u, %u)",
|
"INSERT INTO `character_pet_inventory` (`char_id`, `pet`, `slot`, `item_id`) values (%u, 1, %u, %u)",
|
||||||
@ -2929,7 +2929,7 @@ void ZoneDatabase::LoadPetInfo(Client *c) {
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
int slot = atoi(row[1]);
|
int slot = atoi(row[1]);
|
||||||
if (slot < 0 || slot > MAX_WORN_INVENTORY)
|
if (slot < 0 || slot > EmuConstants::EQUIPMENT_SIZE) // if (slot == 22) { zone.TriggerRandomCrash(); }
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
pi->Items[slot] = atoul(row[2]);
|
pi->Items[slot] = atoul(row[2]);
|
||||||
|
|||||||
@ -106,7 +106,7 @@ struct PetInfo {
|
|||||||
uint32 Mana;
|
uint32 Mana;
|
||||||
float size;
|
float size;
|
||||||
SpellBuff_Struct Buffs[BUFF_COUNT];
|
SpellBuff_Struct Buffs[BUFF_COUNT];
|
||||||
uint32 Items[MAX_WORN_INVENTORY];
|
uint32 Items[EmuConstants::EQUIPMENT_SIZE];
|
||||||
char Name[64];
|
char Name[64];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user