Converted ZC_REQ_EXCHANGE_ITEM&ZC_ACK_EXCHANGE_ITEM to struct (#8581)
--------- Co-authored-by: Lemongrass3110 <lemongrass@kstp.at> Co-authored-by: Atemo <Atemo@users.noreply.github.com> Co-authored-by: Aleos <aleos89@users.noreply.github.com>
This commit is contained in:
parent
00c88167ce
commit
ae0bb4929c
@ -56,7 +56,6 @@
|
|||||||
#include "skill.hpp"
|
#include "skill.hpp"
|
||||||
#include "status.hpp"
|
#include "status.hpp"
|
||||||
#include "storage.hpp"
|
#include "storage.hpp"
|
||||||
#include "trade.hpp"
|
|
||||||
#include "unit.hpp"
|
#include "unit.hpp"
|
||||||
#include "vending.hpp"
|
#include "vending.hpp"
|
||||||
|
|
||||||
@ -4646,33 +4645,27 @@ void clif_leavechat(struct chat_data* cd, map_session_data* sd, bool flag)
|
|||||||
|
|
||||||
/// Opens a trade request window from char 'name'.
|
/// Opens a trade request window from char 'name'.
|
||||||
/// 00e5 <nick>.24B (ZC_REQ_EXCHANGE_ITEM)
|
/// 00e5 <nick>.24B (ZC_REQ_EXCHANGE_ITEM)
|
||||||
/// 01f4 <nick>.24B <charid>.L <baselvl>.W (ZC_REQ_EXCHANGE_ITEM2)
|
/// 01f4 <nick>.24B <targetid>.L <baselvl>.W (ZC_REQ_EXCHANGE_ITEM2)
|
||||||
void clif_traderequest(map_session_data* sd, const char* name)
|
void clif_traderequest(map_session_data& sd, const char* name){
|
||||||
{
|
|
||||||
int fd = sd->fd;
|
|
||||||
|
|
||||||
#if PACKETVER < 6
|
PACKET_ZC_REQ_EXCHANGE_ITEM p{};
|
||||||
WFIFOHEAD(fd,packet_len(0xe5));
|
|
||||||
WFIFOW(fd,0) = 0xe5;
|
|
||||||
safestrncpy(WFIFOCP(fd,2), name, NAME_LENGTH);
|
|
||||||
WFIFOSET(fd,packet_len(0xe5));
|
|
||||||
#else
|
|
||||||
map_session_data* tsd = map_id2sd(sd->trade_partner);
|
|
||||||
if( !tsd ) return;
|
|
||||||
|
|
||||||
WFIFOHEAD(fd,packet_len(0x1f4));
|
p.packetType = HEADER_ZC_REQ_EXCHANGE_ITEM;
|
||||||
WFIFOW(fd,0) = 0x1f4;
|
safestrncpy(p.requesterName, name, sizeof(p.requesterName));
|
||||||
safestrncpy(WFIFOCP(fd,2), name, NAME_LENGTH);
|
|
||||||
WFIFOL(fd,26) = tsd->status.char_id;
|
#if PACKETVER > 6
|
||||||
WFIFOW(fd,30) = tsd->status.base_level;
|
p.targetId = sd.trade_partner.id; // Client generates a random char[5] with this info
|
||||||
WFIFOSET(fd,packet_len(0x1f4));
|
p.targetLv = sd.trade_partner.lv;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
clif_send(&p,sizeof(p),&sd.bl,SELF);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Reply to a trade-request.
|
/// Reply to a trade-request.
|
||||||
/// 00e7 <result>.B (ZC_ACK_EXCHANGE_ITEM)
|
/// 00e7 <result>.B (ZC_ACK_EXCHANGE_ITEM)
|
||||||
/// 01f5 <result>.B <charid>.L <baselvl>.W (ZC_ACK_EXCHANGE_ITEM2)
|
/// 01f5 <result>.B <targetid>.L <baselvl>.W (ZC_ACK_EXCHANGE_ITEM2)
|
||||||
/// result:
|
/// result:
|
||||||
/// 0 = Char is too far
|
/// 0 = Char is too far
|
||||||
/// 1 = Character does not exist
|
/// 1 = Character does not exist
|
||||||
@ -4680,23 +4673,19 @@ void clif_traderequest(map_session_data* sd, const char* name)
|
|||||||
/// 3 = Accept
|
/// 3 = Accept
|
||||||
/// 4 = Cancel
|
/// 4 = Cancel
|
||||||
/// 5 = Busy
|
/// 5 = Busy
|
||||||
void clif_tradestart(map_session_data* sd, uint8 type)
|
void clif_traderesponse( map_session_data& sd, e_ack_trade_response result ){
|
||||||
{
|
|
||||||
int fd = sd->fd;
|
PACKET_ZC_ACK_EXCHANGE_ITEM p{};
|
||||||
map_session_data* tsd = map_id2sd(sd->trade_partner);
|
|
||||||
if( PACKETVER < 6 || !tsd ) {
|
p.packetType = HEADER_ZC_ACK_EXCHANGE_ITEM;
|
||||||
WFIFOHEAD(fd,packet_len(0xe7));
|
p.result = static_cast<decltype(p.result)>( result );
|
||||||
WFIFOW(fd,0) = 0xe7;
|
|
||||||
WFIFOB(fd,2) = type;
|
#if PACKETVER > 6
|
||||||
WFIFOSET(fd,packet_len(0xe7));
|
p.targetId = sd.trade_partner.id; // Client generates a random char[5] with this info
|
||||||
} else {
|
p.targetLv = sd.trade_partner.lv;
|
||||||
WFIFOHEAD(fd,packet_len(0x1f5));
|
#endif
|
||||||
WFIFOW(fd,0) = 0x1f5;
|
|
||||||
WFIFOB(fd,2) = type;
|
clif_send(&p,sizeof(p),&sd.bl,SELF);
|
||||||
WFIFOL(fd,3) = tsd->status.char_id;
|
|
||||||
WFIFOW(fd,7) = tsd->status.base_level;
|
|
||||||
WFIFOSET(fd,packet_len(0x1f5));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -12338,13 +12327,8 @@ void clif_parse_TradeRequest(int fd,map_session_data *sd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (t_sd->state.mail_writing) {
|
if (t_sd->state.mail_writing) {
|
||||||
int old = sd->trade_partner;
|
|
||||||
|
|
||||||
// Fake trading
|
// Fake trading
|
||||||
sd->trade_partner = t_sd->status.account_id;
|
clif_traderesponse(*sd,TRADE_ACK_BUSY);
|
||||||
clif_tradestart(sd, 5);
|
|
||||||
// Restore old state
|
|
||||||
sd->trade_partner = old;
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -16191,7 +16175,7 @@ void clif_parse_Mail_beginwrite( int fd, map_session_data *sd ){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( sd->state.storage_flag || sd->state.mail_writing || sd->trade_partner ){
|
if( sd->state.storage_flag || sd->state.mail_writing || sd->state.trading ){
|
||||||
clif_send_Mail_beginwrite_ack(sd, name, false);
|
clif_send_Mail_beginwrite_ack(sd, name, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
#include "packets.hpp"
|
#include "packets.hpp"
|
||||||
#include "script.hpp"
|
#include "script.hpp"
|
||||||
|
#include "trade.hpp"
|
||||||
|
|
||||||
struct Channel;
|
struct Channel;
|
||||||
struct clan;
|
struct clan;
|
||||||
@ -905,8 +906,8 @@ void clif_parse_LoadEndAck(int fd,map_session_data *sd);
|
|||||||
void clif_hotkeys_send(map_session_data *sd, int tab);
|
void clif_hotkeys_send(map_session_data *sd, int tab);
|
||||||
|
|
||||||
// trade
|
// trade
|
||||||
void clif_traderequest(map_session_data* sd, const char* name);
|
void clif_traderequest(map_session_data& sd, const char* name);
|
||||||
void clif_tradestart(map_session_data* sd, uint8 type);
|
void clif_traderesponse( map_session_data& sd, e_ack_trade_response result );
|
||||||
void clif_tradeadditem(map_session_data* sd, map_session_data* tsd, int index, int amount);
|
void clif_tradeadditem(map_session_data* sd, map_session_data* tsd, int index, int amount);
|
||||||
void clif_tradeitemok(map_session_data& sd, int index, e_exitem_add_result result);
|
void clif_tradeitemok(map_session_data& sd, int index, e_exitem_add_result result);
|
||||||
void clif_tradedeal_lock( map_session_data& sd, bool who );
|
void clif_tradedeal_lock( map_session_data& sd, bool who );
|
||||||
|
|||||||
@ -46,7 +46,6 @@
|
|||||||
parseable_packet(0x0094,6,clif_parse_GetCharNameRequest,2);
|
parseable_packet(0x0094,6,clif_parse_GetCharNameRequest,2);
|
||||||
parseable_packet(0x0096,-1,clif_parse_WisMessage,2,4,28);
|
parseable_packet(0x0096,-1,clif_parse_WisMessage,2,4,28);
|
||||||
parseable_packet(0x0099,-1,clif_parse_Broadcast,2,4);
|
parseable_packet(0x0099,-1,clif_parse_Broadcast,2,4);
|
||||||
packet(0x009a,-1);
|
|
||||||
parseable_packet(0x009b,5,clif_parse_ChangeDir,2,4);
|
parseable_packet(0x009b,5,clif_parse_ChangeDir,2,4);
|
||||||
packet( HEADER_ZC_ITEM_ENTRY, sizeof( struct PACKET_ZC_ITEM_ENTRY ) );
|
packet( HEADER_ZC_ITEM_ENTRY, sizeof( struct PACKET_ZC_ITEM_ENTRY ) );
|
||||||
packet(0x009e,17);
|
packet(0x009e,17);
|
||||||
@ -100,7 +99,6 @@
|
|||||||
parseable_packet(0x00e4,6,clif_parse_TradeRequest,2);
|
parseable_packet(0x00e4,6,clif_parse_TradeRequest,2);
|
||||||
packet(0x00e5,26);
|
packet(0x00e5,26);
|
||||||
parseable_packet(0x00e6,3,clif_parse_TradeAck,2);
|
parseable_packet(0x00e6,3,clif_parse_TradeAck,2);
|
||||||
packet(0x00e7,3);
|
|
||||||
parseable_packet(0x00e8,8,clif_parse_TradeAddItem,2,4);
|
parseable_packet(0x00e8,8,clif_parse_TradeAddItem,2,4);
|
||||||
packet(0x00ea,5);
|
packet(0x00ea,5);
|
||||||
parseable_packet(0x00eb,2,clif_parse_TradeOk,0);
|
parseable_packet(0x00eb,2,clif_parse_TradeOk,0);
|
||||||
@ -300,8 +298,6 @@
|
|||||||
packet(0x01f1,-1);
|
packet(0x01f1,-1);
|
||||||
packet(0x01f2,20);
|
packet(0x01f2,20);
|
||||||
packet(0x01f3,10);
|
packet(0x01f3,10);
|
||||||
packet(0x01f4,32);
|
|
||||||
packet(0x01f5,9);
|
|
||||||
packet(0x01f6,34);
|
packet(0x01f6,34);
|
||||||
parseable_packet(0x01f7,14,clif_parse_Adopt_reply,2,6,10);
|
parseable_packet(0x01f7,14,clif_parse_Adopt_reply,2,6,10);
|
||||||
packet(0x01f8,2);
|
packet(0x01f8,2);
|
||||||
|
|||||||
@ -963,7 +963,7 @@ bool guild_invite( map_session_data& sd, map_session_data* tsd ){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Checking if there no other invitation pending
|
// Checking if there no other invitation pending
|
||||||
if( !battle_config.invite_request_check && ( tsd->party_invite > 0 || tsd->trade_partner || tsd->adopt_invite ) ){
|
if( !battle_config.invite_request_check && ( tsd->party_invite > 0 || tsd->state.trading || tsd->adopt_invite ) ){
|
||||||
clif_guild_inviteack( sd, 0 );
|
clif_guild_inviteack( sd, 0 );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -362,6 +362,38 @@ struct PACKET_ZC_ACK_OPEN_BANKING{
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_ACK_OPEN_BANKING, 0x9b7)
|
DEFINE_PACKET_HEADER(ZC_ACK_OPEN_BANKING, 0x9b7)
|
||||||
|
|
||||||
|
#if PACKETVER > 6
|
||||||
|
struct PACKET_ZC_REQ_EXCHANGE_ITEM{
|
||||||
|
uint16 packetType;
|
||||||
|
char requesterName[NAME_LENGTH];
|
||||||
|
uint32 targetId;
|
||||||
|
uint16 targetLv;
|
||||||
|
} __attribute__((packed));
|
||||||
|
DEFINE_PACKET_HEADER(ZC_REQ_EXCHANGE_ITEM, 0x1f4)
|
||||||
|
#else
|
||||||
|
struct PACKET_ZC_REQ_EXCHANGE_ITEM{
|
||||||
|
uint16 packetType;
|
||||||
|
char requesterName[NAME_LENGTH];
|
||||||
|
} __attribute__((packed));
|
||||||
|
DEFINE_PACKET_HEADER(ZC_REQ_EXCHANGE_ITEM, 0x9a)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if PACKETVER > 6
|
||||||
|
struct PACKET_ZC_ACK_EXCHANGE_ITEM{
|
||||||
|
uint16 packetType;
|
||||||
|
uint8 result;
|
||||||
|
uint32 targetId;
|
||||||
|
uint16 targetLv;
|
||||||
|
} __attribute__((packed));
|
||||||
|
DEFINE_PACKET_HEADER(ZC_ACK_EXCHANGE_ITEM, 0x1f5)
|
||||||
|
#else
|
||||||
|
struct PACKET_ZC_ACK_EXCHANGE_ITEM{
|
||||||
|
uint16 packetType;
|
||||||
|
uint8 result;
|
||||||
|
} __attribute__((packed));
|
||||||
|
DEFINE_PACKET_HEADER(ZC_ACK_EXCHANGE_ITEM, 0xe7)
|
||||||
|
#endif
|
||||||
|
|
||||||
struct PACKET_ZC_ACK_ADD_EXCHANGE_ITEM {
|
struct PACKET_ZC_ACK_ADD_EXCHANGE_ITEM {
|
||||||
int16 packetType;
|
int16 packetType;
|
||||||
uint16 index;
|
uint16 index;
|
||||||
|
|||||||
@ -446,7 +446,7 @@ bool party_invite( map_session_data& sd, map_session_data *tsd ){
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !battle_config.invite_request_check && ( tsd->guild_invite > 0 || tsd->trade_partner || tsd->adopt_invite ) ){
|
if( !battle_config.invite_request_check && ( tsd->guild_invite > 0 || tsd->state.trading || tsd->adopt_invite ) ){
|
||||||
clif_party_invite_reply( sd, tsd->status.name, PARTY_REPLY_JOIN_OTHER_PARTY );
|
clif_party_invite_reply( sd, tsd->status.name, PARTY_REPLY_JOIN_OTHER_PARTY );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -706,7 +706,11 @@ public:
|
|||||||
int united_soul[MAX_UNITED_SOULS]; // Stores the account ID's of character's who's soul is united.
|
int united_soul[MAX_UNITED_SOULS]; // Stores the account ID's of character's who's soul is united.
|
||||||
int servant_sign[MAX_SERVANT_SIGN]; // Stores the account ID's of character's with a servant sign.
|
int servant_sign[MAX_SERVANT_SIGN]; // Stores the account ID's of character's with a servant sign.
|
||||||
|
|
||||||
int trade_partner;
|
struct{
|
||||||
|
uint32 id;
|
||||||
|
unsigned int lv;
|
||||||
|
}trade_partner;
|
||||||
|
|
||||||
struct s_deal {
|
struct s_deal {
|
||||||
struct s_item {
|
struct s_item {
|
||||||
short index, amount;
|
short index, amount;
|
||||||
|
|||||||
@ -1192,7 +1192,7 @@ int pet_select_egg(map_session_data *sd,short egg_index)
|
|||||||
if(egg_index < 0 || egg_index >= MAX_INVENTORY)
|
if(egg_index < 0 || egg_index >= MAX_INVENTORY)
|
||||||
return 0; //Forged packet!
|
return 0; //Forged packet!
|
||||||
|
|
||||||
if(sd->trade_partner) //The player have trade in progress.
|
if(sd->state.trading) //The player have trade in progress.
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
std::shared_ptr<s_pet_db> pet = pet_db_search(sd->inventory.u.items_inventory[egg_index].nameid, PET_EGG);
|
std::shared_ptr<s_pet_db> pet = pet_db_search(sd->inventory.u.items_inventory[egg_index].nameid, PET_EGG);
|
||||||
|
|||||||
@ -38,54 +38,58 @@ void trade_traderequest(map_session_data *sd, map_session_data *target_sd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (target_sd == nullptr || sd == target_sd) {
|
if (target_sd == nullptr || sd == target_sd) {
|
||||||
clif_tradestart(sd, 1); // character does not exist
|
clif_traderesponse(*sd, TRADE_ACK_CHARNOTEXIST);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target_sd->npc_id) { // Trade fails if you are using an NPC.
|
if (target_sd->npc_id) { // Trade fails if you are using an NPC.
|
||||||
clif_tradestart(sd, 2);
|
clif_traderesponse(*sd, TRADE_ACK_FAILED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!battle_config.invite_request_check) {
|
if (!battle_config.invite_request_check) {
|
||||||
if (target_sd->guild_invite > 0 || target_sd->party_invite > 0 || target_sd->adopt_invite) {
|
if (target_sd->guild_invite > 0 || target_sd->party_invite > 0 || target_sd->adopt_invite) {
|
||||||
clif_tradestart(sd, 2);
|
clif_traderesponse(*sd, TRADE_ACK_FAILED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( sd->trade_partner != 0 ) { // If a character tries to trade to another one then cancel the previous one
|
if ( sd->trade_partner.id != 0 ) { // If a character tries to trade to another one then cancel the previous one
|
||||||
map_session_data *previous_sd = map_id2sd(sd->trade_partner);
|
map_session_data *previous_sd = map_id2sd(sd->trade_partner.id);
|
||||||
|
|
||||||
if( previous_sd != nullptr ){
|
if( previous_sd != nullptr ){
|
||||||
previous_sd->trade_partner = 0;
|
previous_sd->trade_partner = {0,0};
|
||||||
clif_tradecancelled( *previous_sd );
|
clif_tradecancelled( *previous_sd );
|
||||||
} // Once cancelled then continue to the new one.
|
} // Once cancelled then continue to the new one.
|
||||||
sd->trade_partner = 0;
|
sd->trade_partner = {0,0};
|
||||||
clif_tradecancelled( *sd );
|
clif_tradecancelled( *sd );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target_sd->trade_partner != 0) {
|
if (target_sd->trade_partner.id != 0) {
|
||||||
clif_tradestart(sd, 2); // person is in another trade
|
clif_traderesponse(*sd, TRADE_ACK_FAILED); // person is in another trade
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pc_can_give_items(sd) || !pc_can_give_items(target_sd)) { // check if both GMs are allowed to trade
|
if (!pc_can_give_items(sd) || !pc_can_give_items(target_sd)) { // check if both GMs are allowed to trade
|
||||||
clif_displaymessage(sd->fd, msg_txt(sd,246));
|
clif_displaymessage(sd->fd, msg_txt(sd,246));
|
||||||
clif_tradestart(sd, 2); // GM is not allowed to trade
|
clif_traderesponse(*sd, TRADE_ACK_FAILED); // GM is not allowed to trade
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Players can not request trade from far away, unless they are allowed to use @trade.
|
// Players can not request trade from far away, unless they are allowed to use @trade.
|
||||||
if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) &&
|
if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) &&
|
||||||
(sd->bl.m != target_sd->bl.m || !check_distance_bl(&sd->bl, &target_sd->bl, TRADE_DISTANCE))) {
|
(sd->bl.m != target_sd->bl.m || !check_distance_bl(&sd->bl, &target_sd->bl, TRADE_DISTANCE))) {
|
||||||
clif_tradestart(sd, 0); // too far
|
clif_traderesponse(*sd, TRADE_ACK_TOOFAR);
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
target_sd->trade_partner = sd->status.account_id;
|
target_sd->trade_partner.id = sd->status.account_id;
|
||||||
sd->trade_partner = target_sd->status.account_id;
|
target_sd->trade_partner.lv = sd->status.base_level;
|
||||||
clif_traderequest(target_sd, sd->status.name);
|
|
||||||
|
sd->trade_partner.id = target_sd->status.account_id;
|
||||||
|
sd->trade_partner.lv = target_sd->status.base_level;
|
||||||
|
|
||||||
|
clif_traderequest(*target_sd, sd->status.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -107,28 +111,28 @@ void trade_tradeack(map_session_data *sd, int type)
|
|||||||
|
|
||||||
nullpo_retv(sd);
|
nullpo_retv(sd);
|
||||||
|
|
||||||
if (sd->state.trading || !sd->trade_partner)
|
if (sd->state.trading || !sd->trade_partner.id)
|
||||||
return; // Already trading or no partner set.
|
return; // Already trading or no partner set.
|
||||||
|
|
||||||
if ((tsd = map_id2sd(sd->trade_partner)) == nullptr) {
|
if ((tsd = map_id2sd(sd->trade_partner.id)) == nullptr) {
|
||||||
clif_tradestart(sd, 1); // Character does not exist
|
clif_traderesponse(*sd, TRADE_ACK_CHARNOTEXIST);
|
||||||
sd->trade_partner=0;
|
sd->trade_partner = {0,0};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsd->state.trading || tsd->trade_partner != sd->bl.id) {
|
if (tsd->state.trading || tsd->trade_partner.id != sd->bl.id) {
|
||||||
clif_tradestart(sd, 2);
|
clif_traderesponse(*sd, TRADE_ACK_FAILED);
|
||||||
sd->trade_partner=0;
|
sd->trade_partner = {0,0};
|
||||||
return; // Already trading or wrong partner.
|
return; // Already trading or wrong partner.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == 4) { // Cancel
|
if (type == 4) { // Cancel
|
||||||
clif_tradestart(tsd, type);
|
clif_traderesponse(*tsd, TRADE_ACK_CANCEL);
|
||||||
clif_tradestart(sd, type);
|
clif_traderesponse(*sd, TRADE_ACK_CANCEL);
|
||||||
sd->state.deal_locked = 0;
|
sd->state.deal_locked = 0;
|
||||||
sd->trade_partner = 0;
|
sd->trade_partner = {0,0};
|
||||||
tsd->state.deal_locked = 0;
|
tsd->state.deal_locked = 0;
|
||||||
tsd->trade_partner = 0;
|
tsd->trade_partner = {0,0};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,21 +143,21 @@ void trade_tradeack(map_session_data *sd, int type)
|
|||||||
// Check here as well since the original character could had warped.
|
// Check here as well since the original character could had warped.
|
||||||
if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) &&
|
if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) &&
|
||||||
(sd->bl.m != tsd->bl.m || !check_distance_bl(&sd->bl, &tsd->bl, TRADE_DISTANCE))) {
|
(sd->bl.m != tsd->bl.m || !check_distance_bl(&sd->bl, &tsd->bl, TRADE_DISTANCE))) {
|
||||||
clif_tradestart(sd, 0); // too far
|
clif_traderesponse(*sd, TRADE_ACK_TOOFAR);
|
||||||
sd->trade_partner=0;
|
sd->trade_partner = {0,0};
|
||||||
tsd->trade_partner = 0;
|
tsd->trade_partner = {0,0};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if you can start trade.
|
// Check if you can start trade.
|
||||||
if (sd->npc_id || sd->state.vending || sd->state.buyingstore || sd->state.storage_flag ||
|
if (sd->npc_id || sd->state.vending || sd->state.buyingstore || sd->state.storage_flag ||
|
||||||
tsd->npc_id || tsd->state.vending || tsd->state.buyingstore || tsd->state.storage_flag) { // Fail
|
tsd->npc_id || tsd->state.vending || tsd->state.buyingstore || tsd->state.storage_flag) { // Fail
|
||||||
clif_tradestart(sd, 2);
|
clif_traderesponse(*sd, TRADE_ACK_FAILED);
|
||||||
clif_tradestart(tsd, 2);
|
clif_traderesponse(*tsd, TRADE_ACK_FAILED);
|
||||||
sd->state.deal_locked = 0;
|
sd->state.deal_locked = 0;
|
||||||
sd->trade_partner = 0;
|
sd->trade_partner = {0,0};
|
||||||
tsd->state.deal_locked = 0;
|
tsd->state.deal_locked = 0;
|
||||||
tsd->trade_partner = 0;
|
tsd->trade_partner = {0,0};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,8 +166,8 @@ void trade_tradeack(map_session_data *sd, int type)
|
|||||||
tsd->state.trading = 1;
|
tsd->state.trading = 1;
|
||||||
memset(&sd->deal, 0, sizeof(sd->deal));
|
memset(&sd->deal, 0, sizeof(sd->deal));
|
||||||
memset(&tsd->deal, 0, sizeof(tsd->deal));
|
memset(&tsd->deal, 0, sizeof(tsd->deal));
|
||||||
clif_tradestart(tsd, type);
|
clif_traderesponse(*tsd, static_cast<e_ack_trade_response>( type ));
|
||||||
clif_tradestart(sd, type);
|
clif_traderesponse(*sd, static_cast<e_ack_trade_response>( type ));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -356,7 +360,7 @@ void trade_tradeadditem(map_session_data *sd, short index, short amount)
|
|||||||
if( !sd->state.trading || sd->state.deal_locked > 0 )
|
if( !sd->state.trading || sd->state.deal_locked > 0 )
|
||||||
return; // Can't add stuff.
|
return; // Can't add stuff.
|
||||||
|
|
||||||
if( (target_sd = map_id2sd(sd->trade_partner)) == nullptr ) {
|
if( (target_sd = map_id2sd(sd->trade_partner.id)) == nullptr ) {
|
||||||
trade_tradecancel(sd);
|
trade_tradecancel(sd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -453,7 +457,7 @@ void trade_tradeaddzeny(map_session_data* sd, int amount)
|
|||||||
if( !sd->state.trading || sd->state.deal_locked > 0 )
|
if( !sd->state.trading || sd->state.deal_locked > 0 )
|
||||||
return; //Can't add stuff.
|
return; //Can't add stuff.
|
||||||
|
|
||||||
if( (target_sd = map_id2sd(sd->trade_partner)) == nullptr ) {
|
if( (target_sd = map_id2sd(sd->trade_partner.id)) == nullptr ) {
|
||||||
trade_tradecancel(sd);
|
trade_tradecancel(sd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -478,7 +482,7 @@ void trade_tradeok(map_session_data *sd)
|
|||||||
if(sd->state.deal_locked || !sd->state.trading)
|
if(sd->state.deal_locked || !sd->state.trading)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((target_sd = map_id2sd(sd->trade_partner)) == nullptr) {
|
if ((target_sd = map_id2sd(sd->trade_partner.id)) == nullptr) {
|
||||||
trade_tradecancel(sd);
|
trade_tradecancel(sd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -500,15 +504,15 @@ void trade_tradecancel(map_session_data *sd)
|
|||||||
|
|
||||||
nullpo_retv(sd);
|
nullpo_retv(sd);
|
||||||
|
|
||||||
target_sd = map_id2sd(sd->trade_partner);
|
target_sd = map_id2sd(sd->trade_partner.id);
|
||||||
sd->state.isBoundTrading = 0;
|
sd->state.isBoundTrading = 0;
|
||||||
|
|
||||||
if(!sd->state.trading) { // Not trade accepted
|
if(!sd->state.trading) { // Not trade accepted
|
||||||
if( target_sd != nullptr ) {
|
if( target_sd != nullptr ) {
|
||||||
target_sd->trade_partner = 0;
|
target_sd->trade_partner = {0,0};
|
||||||
clif_tradecancelled( *target_sd );
|
clif_tradecancelled( *target_sd );
|
||||||
}
|
}
|
||||||
sd->trade_partner = 0;
|
sd->trade_partner = {0,0};
|
||||||
clif_tradecancelled( *sd );
|
clif_tradecancelled( *sd );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -529,7 +533,7 @@ void trade_tradecancel(map_session_data *sd)
|
|||||||
|
|
||||||
sd->state.deal_locked = 0;
|
sd->state.deal_locked = 0;
|
||||||
sd->state.trading = 0;
|
sd->state.trading = 0;
|
||||||
sd->trade_partner = 0;
|
sd->trade_partner = {0,0};
|
||||||
clif_tradecancelled( *sd );
|
clif_tradecancelled( *sd );
|
||||||
|
|
||||||
if (!target_sd)
|
if (!target_sd)
|
||||||
@ -549,7 +553,7 @@ void trade_tradecancel(map_session_data *sd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
target_sd->state.deal_locked = 0;
|
target_sd->state.deal_locked = 0;
|
||||||
target_sd->trade_partner = 0;
|
target_sd->trade_partner = {0,0};
|
||||||
target_sd->state.trading = 0;
|
target_sd->state.trading = 0;
|
||||||
clif_tradecancelled( *target_sd );
|
clif_tradecancelled( *target_sd );
|
||||||
}
|
}
|
||||||
@ -569,7 +573,7 @@ void trade_tradecommit(map_session_data *sd)
|
|||||||
if (!sd->state.trading || !sd->state.deal_locked) //Locked should be 1 (pressed ok) before you can press trade.
|
if (!sd->state.trading || !sd->state.deal_locked) //Locked should be 1 (pressed ok) before you can press trade.
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((tsd = map_id2sd(sd->trade_partner)) == nullptr) {
|
if ((tsd = map_id2sd(sd->trade_partner.id)) == nullptr) {
|
||||||
trade_tradecancel(sd);
|
trade_tradecancel(sd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -642,12 +646,12 @@ void trade_tradecommit(map_session_data *sd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sd->state.deal_locked = 0;
|
sd->state.deal_locked = 0;
|
||||||
sd->trade_partner = 0;
|
sd->trade_partner = {0,0};
|
||||||
sd->state.trading = 0;
|
sd->state.trading = 0;
|
||||||
sd->state.isBoundTrading = 0;
|
sd->state.isBoundTrading = 0;
|
||||||
|
|
||||||
tsd->state.deal_locked = 0;
|
tsd->state.deal_locked = 0;
|
||||||
tsd->trade_partner = 0;
|
tsd->trade_partner = {0,0};
|
||||||
tsd->state.trading = 0;
|
tsd->state.trading = 0;
|
||||||
tsd->state.isBoundTrading = 0;
|
tsd->state.isBoundTrading = 0;
|
||||||
|
|
||||||
|
|||||||
@ -4,8 +4,19 @@
|
|||||||
#ifndef TRADE_HPP
|
#ifndef TRADE_HPP
|
||||||
#define TRADE_HPP
|
#define TRADE_HPP
|
||||||
|
|
||||||
|
#include <common/cbasetypes.hpp>
|
||||||
|
|
||||||
class map_session_data;
|
class map_session_data;
|
||||||
|
|
||||||
|
enum e_ack_trade_response : uint8 {
|
||||||
|
TRADE_ACK_TOOFAR = 0,
|
||||||
|
TRADE_ACK_CHARNOTEXIST,
|
||||||
|
TRADE_ACK_FAILED,
|
||||||
|
TRADE_ACK_ACCEPT,
|
||||||
|
TRADE_ACK_CANCEL,
|
||||||
|
TRADE_ACK_BUSY
|
||||||
|
};
|
||||||
|
|
||||||
void trade_traderequest(map_session_data *sd, map_session_data *target_sd);
|
void trade_traderequest(map_session_data *sd, map_session_data *target_sd);
|
||||||
void trade_tradeack(map_session_data *sd,int type);
|
void trade_tradeack(map_session_data *sd,int type);
|
||||||
void trade_tradeadditem(map_session_data *sd,short index,short amount);
|
void trade_tradeadditem(map_session_data *sd,short index,short amount);
|
||||||
|
|||||||
@ -3239,7 +3239,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
|
|||||||
if(sd->chatID)
|
if(sd->chatID)
|
||||||
chat_leavechat(sd,0);
|
chat_leavechat(sd,0);
|
||||||
|
|
||||||
if(sd->trade_partner)
|
if(sd->trade_partner.id > 0)
|
||||||
trade_tradecancel(sd);
|
trade_tradecancel(sd);
|
||||||
|
|
||||||
searchstore_close(*sd);
|
searchstore_close(*sd);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user