chuyiwen_gmsv/char/trade.c

2323 lines
78 KiB
C
Raw Permalink Normal View History

2016-12-24 08:45:52 +08:00
#include "version.h"
#include "correct_bug.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "readmap.h"
#include "object.h"
#include "char.h"
#include "char_base.h"
#include "lssproto_serv.h"
#include "npcutil.h"
#include "trade.h"
#include "log.h"
#include "handletime.h"
#include "buf.h"
#include "net.h"
#include "char_base.h"
#include "battle.h"
#include "npc_bus.h"
#include "char_talk.h"
#include "magic_base.h"
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
2016-12-24 08:45:52 +08:00
#include "pet_skill.h"
#endif
#ifdef _PET_AMOI__E
#include "pet.h"
#endif
#define TRADE_WAIT "请稍候,连络%s中···"
#define TRADE_NONE "前方什麽人也没有!"
#define TRADE_OVERPLAYER "前方不只一位玩家喔!"
#define TRADE_NOWILL "真是抱歉,对方不愿意跟你交易!"
#define TRADE_TRADING "%s正在与其他人交易···"
#define TRADE_VANISHITEM "丢在地上会消失的物品无法交易!"
#define TRADE_PETFULL "%s宠物栏已满交易取消"
#define TRADE_ITEMFULL "%s物品栏已满请整理後再交易"
#define TRADE_CANCEL "%s将交易取消了"
#define TRADE_POOR "%s钱不够无法交易"
#define TRADE_RICH "%s金钱交易请勿超过一百万"
#define TRADE_TOORICH "%s金钱将会超过一百万"
#define TRADE_POORLV "%s等级不够无法照顾交易後的宠物"
#define TRADE_LOCK "交易锁定···"
#define TRADE_SUCCESS "交易OK!"
#define TRADE_FAILED "交易失败!"
#define TRADE_FMPET "家族守护兽无法交易!"
#define TRADE_RDCANCEL "交易取消!"
2016-12-24 08:45:52 +08:00
#ifdef _TRADE_PK
#define TRADE_PK_START "开始交易PK"
2016-12-24 08:45:52 +08:00
#endif
#ifdef _LOCK_PET_ITEM
#define TRADE_LOCKPET "绑定的宠物无法交易!"
#define TRADE_LOCKITEM "绑定的道具无法交易!"
2016-12-24 08:45:52 +08:00
#endif
#ifdef _ITEM_PILEFORTRADE
enum{
TRADE_ITEM=0,
TRADE_PET,
TRADE_GOLD,
};
#define MAX_TRADELISTNUM 100
typedef struct _tagTradeList{
int charaindex;
int fd;
int PetTi[5];
int ItemTi[15];
int ItemNum[15];
int Golds;
int use;
}STradeList;
STradeList TradeList[MAX_TRADELISTNUM][2];
STradeList TradeListPk[2];
int meindexpk,toindexpk;
void TRADE_ResetTradeList( int ti);
int TRADE_getTradeListIndex( void);
int TRADE_getMyTarget( int meindex );
BOOL TRADE_setTradeListIndex( int ti, int meindex, int toindex);
BOOL TRADE_addSomeTradeList( int meindex, int usTi, int *num, int type);
BOOL TRADE_getSomeTradeList( int meindex, STradeList *temp);
void TRADE_InitTradeList( void)
{
int i;
print("初始化交易系统...");
2016-12-24 08:45:52 +08:00
for( i=0; i<MAX_TRADELISTNUM; i++){
TRADE_ResetTradeList( i);
}
print("完成\n");
2016-12-24 08:45:52 +08:00
}
void TRADE_ResetTradeList( int ti)
{
int i, fd;
if( ti<0 || ti >= MAX_TRADELISTNUM )return;
for( i=0; i<5; i++){
TradeList[ti][0].PetTi[i] = -1;
TradeList[ti][1].PetTi[i] = -1;
}
for( i=0; i<15; i++){
TradeList[ti][0].ItemTi[i] = -1;
TradeList[ti][0].ItemNum[i] = -1;
TradeList[ti][1].ItemTi[i] = -1;
TradeList[ti][1].ItemNum[i] = -1;
}
TradeList[ti][0].Golds = 0;
TradeList[ti][1].Golds = 0;
if( CHAR_CHECKINDEX(TradeList[ti][0].charaindex)){
fd = getfdFromCharaIndex( TradeList[ti][0].charaindex);
CONNECT_setTradeList( fd, -1);
}
if( CHAR_CHECKINDEX(TradeList[ti][1].charaindex)){
fd = getfdFromCharaIndex( TradeList[ti][1].charaindex);
CONNECT_setTradeList( fd, -1);
}
TradeList[ti][0].charaindex = -1;
TradeList[ti][1].charaindex = -1;
TradeList[ti][0].fd = -1;
TradeList[ti][1].fd = -1;
TradeList[ti][0].use = 0;
TradeList[ti][1].use = 0;
}
int TRADE_getTradeListIndex( void)
{
int i;
static int tradeTi=0;
if( tradeTi < 0 ) tradeTi = 0;
for( i=0; i<MAX_TRADELISTNUM; i++){
if( TradeList[tradeTi][0].use == 0 && TradeList[tradeTi][1].use == 0 ){
return tradeTi;
}
tradeTi++;
if( tradeTi >= MAX_TRADELISTNUM ) tradeTi = 0;
}
return -1;
}
BOOL TRADE_setTradeListIndex( int ti, int meindex, int toindex)
{
int fd;
if( ti<0 || ti >= MAX_TRADELISTNUM ) return FALSE;
if( TradeList[ti][0].use == 1 || TradeList[ti][1].use == 1 ) return FALSE;
TRADE_ResetTradeList( ti);
TradeList[ti][0].charaindex = meindex;
TradeList[ti][1].charaindex = toindex;
TradeList[ti][0].use = 1;
TradeList[ti][1].use = 1;
fd = getfdFromCharaIndex( meindex);
TradeList[ti][0].fd = fd;
CONNECT_setTradeList( fd, ti);
fd = getfdFromCharaIndex( toindex);
TradeList[ti][1].fd = fd;
CONNECT_setTradeList( fd, ti);
return TRUE;
}
void TRADE_CheckTradeListUser( void)
{
int i, usenum=0, replace=0, freenum=0;
for( i=0; i<MAX_TRADELISTNUM; i++){
if( TradeList[i][0].use == 0 && TradeList[i][1].use == 0 ){
freenum++;
continue;
}
if( CHAR_CHECKINDEX( TradeList[i][0].charaindex ) &&
CHAR_getWorkInt( TradeList[i][0].charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE &&
CHAR_CHECKINDEX( TradeList[i][1].charaindex ) &&
CHAR_getWorkInt( TradeList[i][1].charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE ){
usenum++;
continue;
}else{
TRADE_ResetTradeList( i);
replace ++;
}
}
}
int TRADE_getMyTarget( int meindex )
{
int i, fd, ti, side=-1;
fd = getfdFromCharaIndex( meindex);
ti = CONNECT_getTradeList( fd);
if( ti<0 || ti >= MAX_TRADELISTNUM ) return -1;
if( TradeList[ti][0].use == 0 || TradeList[ti][1].use == 0 ) return -1;
for( i=0; i<2; i++){
if( TradeList[ti][i].charaindex == meindex &&
TradeList[ti][i].fd == fd ){
side = (i+1)%2;
if( !CHAR_CHECKINDEX( TradeList[ti][side].charaindex) ) return -1;
if( TradeList[ti][side].charaindex == meindex ) return -1;
if( TradeList[ti][side].fd != getfdFromCharaIndex( TradeList[ti][side].charaindex) ) return -1;
return TradeList[ti][side].charaindex;
}
}
return -1;
}
BOOL TRADE_addSomeTradeList( int meindex, int usTi, int *num, int type)
{
int i, fd, ti, side=-1, toindex=-1;
fd = getfdFromCharaIndex( meindex);
ti = CONNECT_getTradeList( fd);
if( ti <0 || ti >= MAX_TRADELISTNUM ) return FALSE;
toindex =-1;
if( TradeList[ti][0].use != 1 || TradeList[ti][1].use != 1 ) return FALSE;
for( i=0; i<2; i++){
if( TradeList[ti][i].charaindex != meindex ){
continue;
}
side = i;
toindex = TradeList[ti][((side+1)%2)].charaindex;
if( !CHAR_CHECKINDEX( toindex) ) return FALSE;
break;
}
if( side == -1 ) return FALSE;
switch( type){
case TRADE_ITEM:
{
int itemindex, MeMaxPile;
MeMaxPile = CHAR_getMyMaxPilenum( meindex);//最大堆叠数
2016-12-24 08:45:52 +08:00
if( usTi < CHAR_STARTITEMARRAY || usTi >= CHAR_MAXITEMHAVE ) return FALSE;
itemindex = CHAR_getItemIndex( meindex, usTi );
//如果是绑定的道具则不可以用于交易
2016-12-24 08:45:52 +08:00
#ifdef _PETITEM__AMOI_E
if(ITEM_NOT_TRADE & ITEM_getInt(itemindex, ITEM_TYPEOFITEM)){
char buf[256];
sprintf( buf, "%s无法交易。", ITEM_getChar( itemindex, ITEM_NAME) );
2016-12-24 08:45:52 +08:00
CHAR_talkToCli( meindex, -1, buf, CHAR_COLORRED);
return FALSE;
}
#endif
if( !ITEM_CHECKINDEX( itemindex)) return FALSE;
if( ITEM_getInt( itemindex, ITEM_VANISHATDROP) == 1 || ITEM_getInt( itemindex, ITEM_TIME) > 0){
char buf[256];
sprintf( buf, "%s无法交易。", ITEM_getChar( itemindex, ITEM_NAME) );
2016-12-24 08:45:52 +08:00
CHAR_talkToCli( meindex, -1, buf, CHAR_COLORYELLOW);
return FALSE;
}
#ifdef _ZHIPIAO_SYSTEM
if( strstr(ITEM_getChar(itemindex,ITEM_NAME),"支票")!=NULL && strstr(ITEM_getChar(itemindex,ITEM_NAME),"DP支票")==NULL ){
2016-12-24 08:45:52 +08:00
int zhipiaoindex=atoi(ITEM_getChar(itemindex,ITEM_ARGUMENT));
if(zhipiaoindex>0){
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
timep = mktime(p);
if(timep>zhipiaoindex){
CHAR_talkToCli(meindex, -1, "该支票已经过期,无法交易,请尽快使用!", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return FALSE;
}
}
}
#endif
#ifdef _LOCK_PET_ITEM
char *arg = ITEM_getChar(itemindex, ITEM_NAME);
if(arg[0] == '*'){
char buf[256];
sprintf( buf, "%s无法交易。", ITEM_getChar( itemindex, ITEM_NAME) );
2016-12-24 08:45:52 +08:00
CHAR_talkToCli( meindex, -1, buf, CHAR_COLORYELLOW);
return FALSE;
}
#endif
if( ITEM_getInt( itemindex, ITEM_CANBEPILE) == 1 ){//可堆叠
2016-12-24 08:45:52 +08:00
int itemMaxPile = ITEM_getInt( itemindex, ITEM_USEPILENUMS);
if( itemMaxPile < 0 ) return FALSE;
//ITEM_USEPILENUMS
for( i=0; i<15; i++){
if( TradeList[ti][side].ItemTi[i] != usTi ) continue;
if( TradeList[ti][side].ItemNum[i] >= MeMaxPile ||
TradeList[ti][side].ItemNum[i] >= itemMaxPile ) return FALSE;
TradeList[ti][side].ItemNum[i] += 1;
if( num != NULL ) *num = TradeList[ti][side].ItemNum[i];
return TRUE;
}
}
for( i=0; i<15; i++){
if( TradeList[ti][side].ItemTi[i] != -1 ) continue;
TradeList[ti][side].ItemTi[i] = usTi;
TradeList[ti][side].ItemNum[i] = 1;
if( num != NULL ) *num = TradeList[ti][side].ItemNum[i];
return TRUE;
}
}
break;
case TRADE_PET:
{
int petindex;
if( usTi < 0 || usTi >= CHAR_MAXPETHAVE ) return FALSE;
petindex = CHAR_getCharPet( meindex, usTi );
if( !CHAR_CHECKINDEX(petindex)) return FALSE;
if( CHAR_getInt( petindex, CHAR_PETFAMILY) == 1 ){
CHAR_talkToCli( meindex, -1, "家族守护兽无法交易。", CHAR_COLORYELLOW);
return FALSE;//家族守护兽
2016-12-24 08:45:52 +08:00
}
if( CHAR_getWorkInt( toindex, CHAR_PickAllPet) != TRUE ){
if( CHAR_getInt( petindex, CHAR_LV) > (CHAR_getInt( toindex, CHAR_LV)+5) &&
(CHAR_getInt( toindex, CHAR_TRANSMIGRATION ) <= 0 ) ){
CHAR_talkToCli( meindex, -1, "对方无法照顾该宠物。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return FALSE;
}
}
//如果是绑定的宠物则不可交易
2016-12-24 08:45:52 +08:00
#ifdef _PET_AMOI__E
//if( PET_NOT_DropTradeStreetVandor== EVOLUTION_getPetENABLETRADE( CHAR_getInt( petindex, CHAR_PETID)) ||
// PET_NOT_Trade == EVOLUTION_getPetENABLETRADE( CHAR_getInt( petindex, CHAR_PETID))||
// PET_NOT_TradeAndStreetVandor == EVOLUTION_getPetENABLETRADE( CHAR_getInt( petindex, CHAR_PETID))){
if( ( PET_NOT_TRADE) & EVOLUTION_getPetENABLETRADE( CHAR_getInt( petindex, CHAR_PETID))){
CHAR_talkToCli(meindex,-1,"该宠物无法交易!~",CHAR_COLORRED);
2016-12-24 08:45:52 +08:00
return FALSE;
}
#endif
#ifdef _PET_BUG
if( CHAR_getInt( petindex, CHAR_VITAL)>=getPetPoint(0)*20 || CHAR_getInt(petindex,CHAR_STR)>=getPetPoint(1)*80 || CHAR_getInt(petindex,CHAR_TOUGH)>=getPetPoint(2)*80 || CHAR_getInt(petindex,CHAR_DEX)>=getPetPoint(3)*100){
CHAR_talkToCli( meindex, -1, "宠物属性过高无法交易。", CHAR_COLORYELLOW);
return FALSE;//属性过高
2016-12-24 08:45:52 +08:00
}
#endif
if(strlen(CHAR_getChar(petindex,CHAR_USERPETNAME))>0 && strstr(CHAR_getChar(petindex,CHAR_USERPETNAME),"*")!=NULL){
CHAR_talkToCli(meindex, -1, "宠物自定义名称中含有(*),无法丢弃、卖店、交易、摆摊,请修改后操作。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return FALSE;
}
#ifdef _PETSKILL_BINDING
int pi,skillid=-1,skillarray;
for(pi=0;pi<7;pi++){
skillid=CHAR_getPetSkill(petindex,pi);
skillarray = PETSKILL_getPetskillArray( skillid);
if( PETSKILL_CHECKINDEX( skillarray) == FALSE ) continue;
if(strstr(PETSKILL_getChar( skillarray, PETSKILL_NAME),"")){
CHAR_talkToCli(meindex, -1, "此宠物为绑定宠物,无法交易", CHAR_COLORRED);
2016-12-24 08:45:52 +08:00
return FALSE;
}
}
#endif
#ifdef _PET_BINDING
if(strstr(CHAR_getChar(petindex,CHAR_NAME),"*") || strstr(CHAR_getChar(petindex,CHAR_NAME),"+")){
CHAR_talkToCli(meindex, -1, "此宠物为绑定宠物,无法交易", CHAR_COLORRED);
2016-12-24 08:45:52 +08:00
return FALSE;
}
#endif
for( i=0; i<5; i++){
if( TradeList[ti][side].PetTi[i] == usTi ) return FALSE;
}
for( i=0; i<5; i++){
if( TradeList[ti][side].PetTi[i] != -1 ) continue;
TradeList[ti][side].PetTi[i] = usTi;
return TRUE;
}
}
break;
case TRADE_GOLD:
TradeList[ti][side].Golds = usTi;
return TRUE;
break;
}
return FALSE;
}
BOOL TRADE_getSomeTradeList( int meindex, STradeList *temp)
{
int i, fd, ti, side=-1;
fd = getfdFromCharaIndex( meindex);
ti = CONNECT_getTradeList( fd);
if( ti <0 || ti >= MAX_TRADELISTNUM ) return FALSE;
if( TradeList[ti][0].use != 1 || TradeList[ti][1].use != 1 ) return FALSE;
for( i=0; i<2; i++){
if( TradeList[ti][i].charaindex != meindex ) continue;
side = i;
break;
}
if( side == -1 ) return FALSE;
memcpy( temp, &TradeList[ti][side], sizeof( STradeList) );
return TRUE;
}
BOOL TRADE_CheckTradeList( int meindex, STradeList *temp1, int toindex, STradeList *temp2);
#endif
void TRADE_Will(int fd, int meindex, char* message);
void TRADE_ShowItem(int fd, int meindex, char* message);
void TRADE_Close(int fd, int meindex, char* message);
void TRADE_SwapItem(int meindex, int toindex, char* message, int fd, char* mycharaname, int tofd, char* tocharaname);
int TRADE_CheckItembuf(int fd, int meindex, int toindex, int tofd, char* mycharaname, char* tocharaname);
//BOOL TRADE_ChangeItem(int meindex, int toindex, char *a, char *b, int item1, int item2, int itemindex1, int itemindex2);
BOOL TRADE_HandleItem( int meindex, int showindex, char *message, char *outmess);
BOOL TRADE_HandleGold( int meindex, int showindex, char *message, char *outmess);
BOOL TRADE_HandlePet( int meindex, int showindex, char *message, char *outmess);
void CHAR_Trade(int fd, int index, char* message)
{
char firstToken[64];
// shan 以下注掉是不必要的动作 2002/03/05
2016-12-24 08:45:52 +08:00
//char messageeraseescape[512];
char* messagebody;
{
if (*message == 0) return;
if (!CHAR_CHECKINDEX(index)) return;
if (CHAR_getWorkInt( index, CHAR_WORKSAFEMODE)==0)
{
CHAR_SafePassword(index);
return;
}
CHAR_getMessageBody( message, firstToken, sizeof(firstToken), &messagebody);
switch( tolower( firstToken[0]) ){
case 'd': // 寻找前方玩家
2016-12-24 08:45:52 +08:00
TRADE_Search(fd, index, message);
break;
/* case 'c':
TRADE_Will(fd, index, message);
break;
*/ case 't': // 显示交易的物品、金钱、宠物
2016-12-24 08:45:52 +08:00
TRADE_ShowItem(fd, index, message);
break;
case 'w': // 关闭交易
2016-12-24 08:45:52 +08:00
print(" TRADE_Close:%d ", index);
TRADE_Close(fd, index, message);
break;
default:
break;
}
}
}
BOOL TRADE_Search(int fd, int meindex, char* message)
{
int objbuf[16];
int front_x, front_y, i, found_count;
BOOL found = FALSE, searchflg = FALSE;
int cnt = 0, tofd = -1, checkfd = -1;
char msgbuf[1024], mycharaname[256], tocharaname[256];
char token[256];
if (!CHAR_CHECKINDEX(meindex)) return FALSE;
// 若玩家状态为交易中或交易锁定中则不予处理
2016-12-24 08:45:52 +08:00
if (CHAR_getWorkInt(meindex, CHAR_WORKTRADEMODE) == CHAR_TRADE_TRADING
|| CHAR_getWorkInt(meindex, CHAR_WORKTRADEMODE) == CHAR_TRADE_LOCK)
return FALSE;
// 若玩家状态为组队或战斗中则不予处理
2016-12-24 08:45:52 +08:00
if ((CHAR_getWorkInt(meindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE)
|| (CHAR_getWorkInt(meindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE))
return FALSE;
#ifdef _STREET_VENDOR
// 若玩家在摆摊中不处理交易
2016-12-24 08:45:52 +08:00
if(CHAR_getWorkInt(meindex,CHAR_WORKSTREETVENDOR) > -1) return FALSE;
#endif
strcpy(mycharaname, CHAR_getChar(meindex, CHAR_NAME));
if (getStringFromIndexWithDelim(message, "|", 2, token,
sizeof(token)) == FALSE) return FALSE;
// 设定状态交易请求中
2016-12-24 08:45:52 +08:00
// CHAR_setWorkInt(meindex, CHAR_WORKTRADEMODE, CHAR_TRADE_SENDING);
#ifndef _ITEM_PILEFORTRADE
for (i = 0; i < CONNECT_WINDOWBUFSIZE; i++)
CONNECT_setTradecharaindex(fd, i, -1);
#endif
CHAR_getCoordinationDir(CHAR_getInt(meindex, CHAR_DIR),
CHAR_getInt(meindex, CHAR_X),
CHAR_getInt(meindex, CHAR_Y),
1, &front_x, &front_y);
found_count = CHAR_getSameCoordinateObjects( objbuf, arraysizeof(objbuf),
CHAR_getInt(meindex, CHAR_FLOOR),front_x, front_y);
// 前方没有玩家或对方关闭交易选项
2016-12-24 08:45:52 +08:00
if (found_count == 0){
CHAR_talkToCli(meindex, -1, TRADE_NONE, CHAR_COLORYELLOW);
CHAR_setWorkInt(meindex, CHAR_WORKTRADEMODE, CHAR_TRADE_FREE);
return FALSE;
}
for (i = 0; i < found_count; i++){
int objindex = objbuf[i];
int index = OBJECT_getIndex(objindex);
if (OBJECT_getType(objindex) != OBJTYPE_CHARA) continue;
if (CHAR_getInt(index, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER) continue;
if (index == meindex) continue;
found = TRUE;
if (CHAR_getWorkInt(index, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) continue;
if (CHAR_getWorkInt(index, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE) continue;
if (CHAR_getFlg(index, CHAR_ISTRADE) == FALSE) continue;
if (CHAR_getWorkInt(index, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) continue;
strcpy(tocharaname, CHAR_getChar(index, CHAR_NAME));
tofd = getfdFromCharaIndex(index);
if (tofd == -1){
CHAR_setWorkInt(meindex, CHAR_WORKTRADEMODE, CHAR_TRADE_FREE);
return FALSE;
}
if (searchflg){
if (tofd != checkfd) continue;
if (strcmp(token, tocharaname) != 0) continue;
}
#ifndef _ITEM_PILEFORTRADE
CONNECT_setTradecharaindex(fd, cnt, index);
#endif
cnt ++;
if (cnt == CONNECT_WINDOWBUFSIZE) break;
}
if (cnt == 0){
// 前方没有玩家或对方关闭交易选项
2016-12-24 08:45:52 +08:00
if (found){
CHAR_talkToCli(meindex, -1, TRADE_NOWILL, CHAR_COLORYELLOW);
}else
CHAR_talkToCli(meindex, -1, TRADE_NONE, CHAR_COLORYELLOW);
sprintf(msgbuf, "C|%d|%s|0", tofd, tocharaname);
CHAR_setWorkInt(meindex, CHAR_WORKTRADEMODE, CHAR_TRADE_FREE);
return FALSE;
}
// 前方有一位玩家
2016-12-24 08:45:52 +08:00
if (cnt == 1){
#ifdef _ITEM_PILEFORTRADE
int ti;
#endif
int toindex;
toindex = CONNECT_getCharaindex(tofd);
if( !CHAR_CHECKINDEX(toindex)) return FALSE;
#ifdef _ITEM_PILEFORTRADE
if( (ti = TRADE_getTradeListIndex()) < 0 ||
TRADE_setTradeListIndex( ti, meindex, toindex) == FALSE ){
CHAR_talkToCli( meindex, -1, "系统忙碌中。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
CHAR_setWorkInt( meindex, CHAR_WORKTRADEMODE, CHAR_TRADE_FREE);
TRADE_CheckTradeListUser();
return FALSE;
}
TRADE_setTradeListIndex( ti, meindex, toindex);
#endif
snprintf(msgbuf, sizeof(msgbuf), TRADE_WAIT, tocharaname);
CHAR_talkToCli(meindex, -1, msgbuf, CHAR_COLORYELLOW);
sprintf(msgbuf, "C|%d|%s|1", fd, mycharaname);
lssproto_TD_send( tofd, -1, msgbuf);
sprintf(msgbuf, "C|%d|%s|1", tofd, tocharaname);
lssproto_TD_send(fd, -1, msgbuf);
CHAR_setWorkInt(meindex, CHAR_WORKTRADEMODE, CHAR_TRADE_TRADING);
CHAR_setWorkInt(toindex, CHAR_WORKTRADEMODE, CHAR_TRADE_TRADING);
CONNECT_set_confirm(fd, FALSE);
CONNECT_set_confirm(tofd, FALSE);
CHAR_sendTradeEffect(meindex, 1);
CHAR_sendTradeEffect(toindex, 1);
return TRUE;
}else if (cnt > 1){ // 前方不只一位玩家
2016-12-24 08:45:52 +08:00
CHAR_talkToCli(meindex, -1, TRADE_OVERPLAYER, CHAR_COLORYELLOW);
// sprintf(msgbuf, "C|%d|%s|0", tofd, tocharaname);
CHAR_setWorkInt(meindex, CHAR_WORKTRADEMODE, CHAR_TRADE_FREE);
return FALSE;
}
CHAR_setWorkInt(meindex, CHAR_WORKTRADEMODE, CHAR_TRADE_FREE);
return FALSE;
}
void TRADE_Close(int fd, int meindex, char* message)
{
char msg[128], mycharaname[256];
int tofd=-1, toindex=-1;
int j;
#ifndef _ITEM_PILEFORTRADE
char token[256];
#endif
if (!CHAR_CHECKINDEX(meindex)) return;
if (*message == 0) return;
strcpy(mycharaname, CHAR_getChar(meindex, CHAR_NAME));
#ifdef _ITEM_PILEFORTRADE
toindex = TRADE_getMyTarget( meindex);
if( CHAR_CHECKINDEX( toindex) ){
tofd = getfdFromCharaIndex( toindex);
snprintf( msg, sizeof(msg), TRADE_CANCEL, mycharaname);
CHAR_talkToCli(toindex, -1, msg, CHAR_COLORYELLOW);
snprintf( msg, sizeof(msg), "W|%d|%s", fd, mycharaname);
lssproto_TD_send( tofd, -1, msg);
CHAR_setWorkInt( toindex, CHAR_WORKTRADEMODE, CHAR_TRADE_FREE);
CONNECT_setTradeTmp( tofd, "");
CHAR_sendStatusString( toindex, "i");
CHAR_sendStatusString( toindex, "P");
CHAR_sendTradeEffect( toindex, 0);
CONNECT_set_confirm( tofd, FALSE);
for(j = 0; j < CHAR_MAXPETHAVE; j++){
char msgbuf[256];
int petindex = CHAR_getCharPet( toindex, j);
if( !CHAR_CHECKINDEX( petindex) ) continue;
CHAR_complianceParameter( petindex );
snprintf( msgbuf, sizeof( msgbuf ), "K%d", j );
CHAR_sendStatusString( toindex, msgbuf );
snprintf( msgbuf, sizeof( msgbuf ), "W%d", j );
CHAR_sendStatusString( toindex, msgbuf );
}
}
#else
if (getStringFromIndexWithDelim(message, "|", 2, token, sizeof(token)) == FALSE) return;
tofd = atoi(token);
toindex = CONNECT_getCharaindex(tofd);
if (!CHAR_CHECKINDEX(toindex)) return;
if (getStringFromIndexWithDelim(message, "|", 3, token, sizeof(token)) == FALSE) return;
snprintf(msg, sizeof(msg), TRADE_CANCEL, mycharaname);
CHAR_talkToCli(toindex, -1, msg, CHAR_COLORYELLOW);
snprintf( msg, sizeof(msg), "W|%d|%s", fd, mycharaname);
lssproto_TD_send( tofd, -1, msg);
CHAR_setWorkInt(toindex, CHAR_WORKTRADEMODE, CHAR_TRADE_FREE);
CONNECT_setTradeTmp(tofd, "");
CHAR_sendStatusString( CONNECT_getCharaindex(tofd), "i");
CHAR_sendStatusString( CONNECT_getCharaindex(tofd), "P");
CHAR_sendTradeEffect( toindex, 0);
CONNECT_set_confirm(tofd, FALSE);
#endif
if( !CHAR_CHECKINDEX( toindex) ){
char buf[256];
if( getStringFromIndexWithDelim( message, "|", 2, buf, sizeof(buf)) == FALSE) return;
tofd = atoi( buf);
toindex = CONNECT_getCharaindex( tofd);
if (!CHAR_CHECKINDEX(toindex) )return;
}
snprintf( msg, sizeof(msg), TRADE_RDCANCEL);
CHAR_talkToCli(meindex, -1, msg, CHAR_COLORYELLOW);
snprintf( msg, sizeof(msg), "W|%d|%s", tofd, CHAR_getChar( toindex, CHAR_NAME) );
lssproto_TD_send( fd, -1, msg);
CHAR_setWorkInt( meindex, CHAR_WORKTRADEMODE, CHAR_TRADE_FREE);
CONNECT_setTradeTmp(fd, "");
CHAR_sendStatusString(meindex, "i");
CHAR_sendStatusString(meindex, "P");
CHAR_sendTradeEffect( meindex, 0);
CONNECT_set_confirm(fd, FALSE);
// end
for(j = 0; j < CHAR_MAXPETHAVE; j++){
char msgbuf[256];
int petindex = CHAR_getCharPet( meindex, j);
if( !CHAR_CHECKINDEX( petindex) ) continue;
CHAR_complianceParameter( petindex );
snprintf( msgbuf, sizeof( msgbuf ), "K%d", j );
CHAR_sendStatusString( meindex, msgbuf );
snprintf( msgbuf, sizeof( msgbuf ), "W%d", j );
CHAR_sendStatusString( meindex, msgbuf );
}
#ifdef _ITEM_PILEFORTRADE
{
int ti=0;
ti = CONNECT_getTradeList( fd);
if( ti <0 || ti >= MAX_TRADELISTNUM ) return;
TRADE_ResetTradeList( ti);
}
#endif
}
void TRADE_ShowItem(int fd, int meindex, char* message)
{
char token[128], mycharaname[256], tocharaname[256], msg[2048];
int tofd, showindex, toindex;// itemindex, gold, tmpgold, item;
int MaxGold;
MaxGold = CHAR_getMaxHaveGold( meindex);
strcpy( mycharaname, CHAR_getChar(meindex, CHAR_NAME));
#ifdef _ITEM_PILEFORTRADE
toindex = TRADE_getMyTarget( meindex);
if( !CHAR_CHECKINDEX( toindex) ){
print(" TRADE_Close_Err1:%d ", toindex);
TRADE_Close(fd, meindex, message);
return;
}
if( meindex != TRADE_getMyTarget( toindex) ){
print(" TRADE_Close_Err2:%d->%d ", meindex, toindex);
TRADE_Close(fd, meindex, message);
return;
}
tofd = getfdFromCharaIndex(toindex);
#else
if (getStringFromIndexWithDelim(message, "|", 2, token, sizeof(token)) == FALSE) return;
tofd = atoi(token);
toindex = CONNECT_getCharaindex(tofd);
#endif
if (!CHAR_CHECKINDEX(toindex)) return;
// 若玩家状态为组队或战斗中则不予处理
2016-12-24 08:45:52 +08:00
if ((CHAR_getWorkInt(meindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE)
|| (CHAR_getWorkInt(meindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE))
return;
if ((CHAR_getWorkInt(toindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE)
|| (CHAR_getWorkInt(toindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE))
return;
if (getStringFromIndexWithDelim(message, "|", 3, tocharaname, sizeof(tocharaname)) == FALSE) return;
if (getStringFromIndexWithDelim(message, "|", 5, token, sizeof(token)) == FALSE) return;
showindex = atoi(token);
if (getStringFromIndexWithDelim(message, "|", 4, token, sizeof(token)) == FALSE) return;
showindex = toindex;
strcpy( tocharaname, CHAR_getChar(toindex, CHAR_NAME));
switch(tolower(token[0])){
case 'i':
{
char buf1[2048];
if( TRADE_HandleItem( meindex, showindex, message, buf1) == FALSE ){
print(" TRADE_Close_Err3:%d,%d,%s,%s ", meindex, showindex, message, buf1);
TRADE_Close(fd, meindex, message);
return;
}else{
snprintf(msg, sizeof(msg), "T|%d|%s|I|%d|%s", fd, mycharaname, showindex, buf1 );
lssproto_TD_send(tofd, -1, msg);
}
}
break;
case 'g':
{
char buf1[2048];
if( TRADE_HandleGold( meindex, showindex, message, buf1) == FALSE ){
print(" TRADE_Close_Err4:%d,%d,%s,%s ", meindex, showindex, message, buf1);
TRADE_Close(fd, meindex, message);
return;
}else{// 将欲交易之金钱传给对方
2016-12-24 08:45:52 +08:00
snprintf(msg, sizeof(msg), "T|%d|%s|G|%d|%s", fd, mycharaname, showindex, buf1);
lssproto_TD_send( tofd, -1, msg);
}
}
break;
case 'p':
{
char buf1[2048];
if( TRADE_HandlePet( meindex, showindex, message, buf1) == FALSE ){
print(" TRADE_Close_Err5:%d,%d,%s,%s ", meindex, showindex, message, buf1);
TRADE_Close(fd, meindex, message);
return;
}else{
snprintf(msg, sizeof(msg), "T|%d|%s|P|%d|%s",
fd, mycharaname, showindex, buf1);
lssproto_TD_send(tofd, -1, msg);
}
}
break;
case 'k':
if((CONNECT_get_confirm(fd)==TRUE) &&
(CONNECT_get_confirm(tofd)==TRUE) ){//当双方都按下 lock
2016-12-24 08:45:52 +08:00
if( CHAR_getWorkInt(meindex, CHAR_WORKTRADEMODE) == CHAR_TRADE_LOCK ){
//andy_log
print("ANDY err 防止第二次进入!!\n");
return;//防止第二次进入
2016-12-24 08:45:52 +08:00
}
CHAR_setWorkInt(meindex, CHAR_WORKTRADEMODE, CHAR_TRADE_LOCK);
//检查对方是否按下 ok
2016-12-24 08:45:52 +08:00
if( CHAR_getWorkInt( toindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_LOCK )return;
snprintf(msg, sizeof(msg), "T|%d|%s|A", fd, mycharaname);
lssproto_TD_send( tofd, -1, msg);
TRADE_SwapItem(meindex, toindex, message, fd, mycharaname, tofd, tocharaname);
}
break;
case 'c':
if( CONNECT_get_confirm( fd) == TRUE ) return;
CONNECT_set_confirm(fd, TRUE);
snprintf( msg, sizeof(msg), "T|%d|%s|C", fd, mycharaname);
lssproto_TD_send( tofd, -1, msg);
break;
}
return;
}
void TRADE_SwapItem( int meindex, int toindex, char* message, int fd, char* mycharaname, int tofd, char* tocharaname)
{
int result;
char msg[128], tmpmsg[128];
#ifndef _ITEM_PILEFORTRADE
CONNECT_setTradeTmp(fd, message);
#endif
result = TRADE_CheckItembuf(fd, meindex, toindex, tofd, mycharaname, tocharaname);
#ifndef _ITEM_PILEFORTRADE
toindex = CONNECT_getCharaindex(tofd);
#endif
if (!CHAR_CHECKINDEX(toindex)) return;
if (result == -1)
strcpy(msg, TRADE_FAILED);
else if (result == -2)
sprintf(msg, TRADE_ITEMFULL, mycharaname);
else if (result == -3)
sprintf(msg, TRADE_ITEMFULL, tocharaname);
else if (result == -4)
sprintf(msg, TRADE_RICH, mycharaname);
else if (result == -5)
sprintf(msg, TRADE_POOR, mycharaname);
else if (result == -6)
sprintf(msg, TRADE_RICH, tocharaname);
else if (result == -7)
sprintf(msg, TRADE_POOR, tocharaname);
else if (result == -8)
sprintf(msg, TRADE_TOORICH, mycharaname);
else if (result == -9)
sprintf(msg, TRADE_TOORICH, tocharaname);
else if (result == -10)
sprintf(msg, TRADE_PETFULL, mycharaname);
else if (result == -11)
sprintf(msg, TRADE_PETFULL, tocharaname);
else if (result == -12)
strcpy(msg, TRADE_VANISHITEM);
else if (result == -13)
sprintf(msg, TRADE_POORLV, mycharaname);
else if (result == -14)
sprintf(msg, TRADE_POORLV, tocharaname);
else if (result == -15)
strcpy(msg, TRADE_FMPET);
#ifdef _LOCK_PET_ITEM
else if (result == -16)
strcpy(msg, TRADE_LOCKPET);
else if (result == -17)
strcpy(msg, TRADE_LOCKITEM);
#endif
else if (result == 1)
strcpy(msg, TRADE_SUCCESS);
else if (result == 2)
strcpy(msg, TRADE_LOCK);
else if (result == 3)
strcpy(msg, TRADE_PK_START);
if (result != 2){
snprintf(tmpmsg, sizeof(tmpmsg), "W|%d|%s", fd, mycharaname);
lssproto_TD_send(tofd, -1, tmpmsg);
snprintf(tmpmsg, sizeof(tmpmsg), "W|%d|%s", tofd, tocharaname);
lssproto_TD_send(fd, -1, tmpmsg);
CHAR_setWorkInt(meindex, CHAR_WORKTRADEMODE, CHAR_TRADE_FREE);
CHAR_setWorkInt(toindex, CHAR_WORKTRADEMODE, CHAR_TRADE_FREE);
CONNECT_setTradeTmp(fd, "");
CONNECT_setTradeTmp(tofd, "");
CHAR_sendTradeEffect( meindex, 0);
CHAR_sendTradeEffect( toindex, 0);
}
CHAR_sendStatusString(meindex, "i");
CHAR_sendStatusString(toindex, "i");
CHAR_sendStatusString(meindex, "P");
CHAR_sendStatusString(toindex, "P");
{
int j, petindex;
char msgbuf[256];
for(j = 0; j < CHAR_MAXPETHAVE; j++){
petindex = CHAR_getCharPet( meindex, j);
if( !CHAR_CHECKINDEX( petindex) ) continue;
CHAR_complianceParameter( petindex );
snprintf( msgbuf, sizeof( msgbuf ), "K%d", j );
CHAR_sendStatusString( meindex, msgbuf );
snprintf( msgbuf, sizeof( msgbuf ), "W%d", j );
CHAR_sendStatusString( meindex, msgbuf );
}
for(j = 0; j < CHAR_MAXPETHAVE; j++){
petindex = CHAR_getCharPet( toindex, j);
if( !CHAR_CHECKINDEX( petindex) ) continue;
CHAR_complianceParameter( petindex );
snprintf( msgbuf, sizeof( msgbuf ), "K%d", j );
CHAR_sendStatusString( toindex, msgbuf );
snprintf( msgbuf, sizeof( msgbuf ), "W%d", j );
CHAR_sendStatusString( toindex, msgbuf );
}
}
CHAR_talkToCli(meindex, -1, msg, CHAR_COLORYELLOW);
CHAR_talkToCli(toindex, -1, msg, CHAR_COLORYELLOW);
#ifdef _FIX_TRADE_COPYPET
int m,n,petindex1,petindex2;
for( m = 0; m < CHAR_MAXPETHAVE; m ++ ) {
petindex1=CHAR_getCharPet( meindex,m);
if( petindex1 == -1 ) continue;
for( n = 0; n < CHAR_MAXPETHAVE; n ++ ) {
petindex2=CHAR_getCharPet( toindex,n);
if( petindex2 == -1 ) continue;
printf("\nowner=%s pet1=%s owner=%s pet2=%s",
CHAR_getChar( meindex, CHAR_NAME),
CHAR_getChar( petindex1, CHAR_NAME),
CHAR_getChar( toindex, CHAR_NAME),
CHAR_getChar( petindex2, CHAR_NAME));
if(strcmp( CHAR_getChar( petindex1, CHAR_UNIQUECODE), CHAR_getChar( petindex2, CHAR_UNIQUECODE))== 0){
CHAR_talkToCli(meindex, -1, "检测到非法宠物交易,系统自动清除!", CHAR_COLORRED);
CHAR_talkToCli(toindex, -1, "检测到非法宠物交易,系统自动清除!", CHAR_COLORRED);
2016-12-24 08:45:52 +08:00
NPC_DelPet(toindex,n);
}
}
}
#endif
if(CHAR_getInt(meindex,CHAR_FLOOR)!=50000 && CHAR_getInt(toindex,CHAR_FLOOR)!=50000)
{
CHAR_charSaveFromConnect(meindex, FALSE);
CHAR_charSaveFromConnect(toindex, FALSE);
CHAR_talkToCli(meindex, -1, "系统为你自动存档!", CHAR_COLORRED);
CHAR_talkToCli(toindex, -1, "系统为你自动存档!", CHAR_COLORRED);
2016-12-24 08:45:52 +08:00
}
}
#ifdef _ITEM_PILEFORTRADE
int TRADE_HandleTrade_DelItem( int charaindex, int MyMaxPile, int MaxPile, int *Item, int *nums, int *indexlist)
{
int i, k;
for( i=0; i<50; i++){
indexlist[i] = -1;
}
k=0;
for( i=0; i<15; i++ ){
int pilenum, itemindex, totalnums, newindex;
if( Item[i] == -1 ) continue;
itemindex = CHAR_getItemIndex( charaindex, Item[i] );
if( !ITEM_CHECKINDEX( itemindex)) return -1;
if(ITEM_getInt( itemindex, ITEM_CANBEPILE)!=1 && ITEM_getInt( itemindex, ITEM_USEPILENUMS)>1){
CHAR_setItemIndex( charaindex , Item[i], -1);
CHAR_sendItemDataOne(charaindex,Item[i]);
CHAR_talkToCli(charaindex,-1,"非法道具自动删除",CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return -1;
}
pilenum = ITEM_getInt( itemindex, ITEM_USEPILENUMS);
pilenum -= nums[i];
if( pilenum < 0 ) return -1;
if( pilenum == 0 ){
CHAR_setItemIndex( charaindex, Item[i], -1);
indexlist[k] = itemindex;
k++;
totalnums = ITEM_getInt( itemindex, ITEM_USEPILENUMS);
newindex = itemindex;
}else{
ITEM_setInt( itemindex, ITEM_USEPILENUMS, pilenum);
newindex = ITEM_makeItemAndRegist( ITEM_getInt( itemindex, ITEM_ID));
if( !ITEM_CHECKINDEX( newindex) ) return -1;
indexlist[k] = newindex;
k++;
totalnums = nums[i];
}
if( totalnums > MaxPile ){
totalnums -= MaxPile;
ITEM_setInt( newindex, ITEM_USEPILENUMS, MaxPile);
}else{
ITEM_setInt( newindex, ITEM_USEPILENUMS, totalnums);
totalnums = 0;
}
while( totalnums > 0 ){
newindex = ITEM_makeItemAndRegist( ITEM_getInt( itemindex, ITEM_ID));
if( !ITEM_CHECKINDEX( newindex) ) return -1;
indexlist[k] = newindex;
k++;
if( totalnums > MaxPile ){
totalnums -= MaxPile;
ITEM_setInt( newindex, ITEM_USEPILENUMS, MaxPile);
}else{
ITEM_setInt( newindex, ITEM_USEPILENUMS, totalnums);
totalnums = 0;
}
}
}
return k;
}
int TRADE_HandleTrade_DelPet( int charaindex, int *Pet, int *indexlist)
{
int i, k, petindex;
k=0;
for( i=0; i<5; i++){
indexlist[i] = -1;
}
for( i=0; i<5; i++ ){
if( Pet[i] == -1 ) continue;
petindex = CHAR_getCharPet( charaindex, Pet[i] );
//print("\npetindex=%d",petindex);
if( !CHAR_CHECKINDEX( petindex)) return -1;
CHAR_setCharPet( charaindex, Pet[i], -1);
if( Pet[i] == CHAR_getInt( charaindex, CHAR_DEFAULTPET)) {
int sellfd;
CHAR_setInt( charaindex, CHAR_DEFAULTPET, -1);
sellfd = getfdFromCharaIndex( charaindex);
lssproto_KS_send( sellfd, Pet[i], 0);
}
indexlist[k] = petindex;
k++;
}
return k;
}
BOOL TRADE_HandleTrade_DelGold( int charaindex, int sGold, int *Gold)
{
int MyGold, MyMaxGold;
MyGold = CHAR_getInt( charaindex, CHAR_GOLD);
MyMaxGold = CHAR_getMaxHaveGold( charaindex);
MyGold -= sGold;
if( MyGold < 0 || MyGold > MyMaxGold ){
MyGold = (MyGold<0)?0:MyGold;
MyGold = (MyGold>MyMaxGold)?MyMaxGold:MyGold;
CHAR_setInt( charaindex, CHAR_GOLD, MyGold);
return FALSE;
}
CHAR_setInt( charaindex, CHAR_GOLD, MyGold);
*Gold = sGold;
return TRUE;
}
BOOL TRADE_HandleTrade_AddItem( int charaindex, int *Item)
{
int ret, i,itemindex;
for( i=0; i<50; i++){
if( Item[i] == -1 )break;
itemindex = CHAR_getItemIndex( charaindex, Item[i] );
if(ITEM_getInt( itemindex, ITEM_CANBEPILE)!=1 && ITEM_getInt( itemindex, ITEM_USEPILENUMS)>1){
return FALSE;
}
ret = CHAR_addItemSpecificItemIndex( charaindex, Item[i]);
if( ret < 0 || ret >= CHAR_MAXITEMHAVE ) {
int j;
for( j=i; j< 50; j++)
ITEM_endExistItemsOne( Item[j]);
return FALSE;
}
}
return TRUE;
}
BOOL TRADE_HandleTrade_AddPet( int charaindex, int *Pet)
{
int havepetelement, i;
for( i=0; i<5; i++){
havepetelement = CHAR_getCharPetElement( charaindex);
if( Pet[i] == -1 ) break;
if( havepetelement < 0 ){
int j;
for( j=i; j<5; j++){
CHAR_endCharOneArray( Pet[j] );
}
return FALSE;
}
CHAR_setCharPet( charaindex, havepetelement, Pet[i]);
CHAR_setWorkInt( Pet[i], CHAR_WORKPLAYERINDEX, charaindex);
CHAR_setChar( Pet[i], CHAR_OWNERCDKEY, CHAR_getChar( charaindex, CHAR_CDKEY));
CHAR_setChar( Pet[i], CHAR_OWNERCHARANAME, CHAR_getChar( charaindex, CHAR_NAME));
CHAR_complianceParameter( Pet[i]);
}
return TRUE;
}
BOOL TRADE_HandleTrade_AddGold( int charaindex, int sGold)
{
int MyGold, MyMaxGold;
MyGold = CHAR_getInt( charaindex, CHAR_GOLD);
MyMaxGold = CHAR_getMaxHaveGold( charaindex);
MyGold += sGold;
MyGold = (MyGold<0)?0:MyGold;
MyGold = (MyGold>MyMaxGold)?MyMaxGold:MyGold;
CHAR_setInt( charaindex, CHAR_GOLD, MyGold);
return TRUE;
}
#ifdef _TRADE_PK
void BATTLE_Trade(void)
{
char msg[128], tmpmsg[128], mycharaname[256], tocharaname[256];
TRADE_HandleTrade(meindexpk, &TradeListPk[0], toindexpk, &TradeListPk[1]);
int fd,tofd;
fd = getfdFromCharaIndex(meindexpk);
tofd = getfdFromCharaIndex(toindexpk);
strcpy( mycharaname, CHAR_getChar(meindexpk, CHAR_NAME));
strcpy( tocharaname, CHAR_getChar(toindexpk, CHAR_NAME));
snprintf(tmpmsg, sizeof(tmpmsg), "W|%d|%s", fd, mycharaname);
lssproto_TD_send(tofd, -1, tmpmsg);
snprintf(tmpmsg, sizeof(tmpmsg), "W|%d|%s", tofd, tocharaname);
lssproto_TD_send(fd, -1, tmpmsg);
CHAR_setWorkInt(meindexpk, CHAR_WORKTRADEMODE, CHAR_TRADE_FREE);
CHAR_setWorkInt(toindexpk, CHAR_WORKTRADEMODE, CHAR_TRADE_FREE);
CONNECT_setTradeTmp(fd, "");
CONNECT_setTradeTmp(tofd, "");
CHAR_sendTradeEffect( meindexpk, 0);
CHAR_sendTradeEffect( toindexpk, 0);
CHAR_sendStatusString(meindexpk, "i");
CHAR_sendStatusString(toindexpk, "i");
CHAR_sendStatusString(meindexpk, "P");
CHAR_sendStatusString(toindexpk, "P");
{
int j, petindex;
char msgbuf[256];
for(j = 0; j < CHAR_MAXPETHAVE; j++){
petindex = CHAR_getCharPet( meindexpk, j);
if( !CHAR_CHECKINDEX( petindex) ) continue;
CHAR_complianceParameter( petindex );
snprintf( msgbuf, sizeof( msgbuf ), "K%d", j );
CHAR_sendStatusString( meindexpk, msgbuf );
snprintf( msgbuf, sizeof( msgbuf ), "W%d", j );
CHAR_sendStatusString( meindexpk, msgbuf );
}
for(j = 0; j < CHAR_MAXPETHAVE; j++){
petindex = CHAR_getCharPet( toindexpk, j);
if( !CHAR_CHECKINDEX( petindex) ) continue;
CHAR_complianceParameter( petindex );
snprintf( msgbuf, sizeof( msgbuf ), "K%d", j );
CHAR_sendStatusString( toindexpk, msgbuf );
snprintf( msgbuf, sizeof( msgbuf ), "W%d", j );
CHAR_sendStatusString( toindexpk, msgbuf );
}
}
CHAR_charSaveFromConnect(meindexpk, FALSE);
CHAR_charSaveFromConnect(toindexpk, FALSE);
CHAR_talkToCli(meindexpk, -1, "系统为你自动存档!", CHAR_COLORRED);
CHAR_talkToCli(toindexpk, -1, "系统为你自动存档!", CHAR_COLORRED);
2016-12-24 08:45:52 +08:00
}
#endif
BOOL TRADE_HandleTrade( int meindex, STradeList *temp1, int toindex, STradeList *temp2 )
{
int MeMaxPile, ToMaxPile, ret;
int MeItem[50], ToItem[50];
int MePet[5], ToPet[5];
int MeGold=0, ToGold=0;
int LostPet[5]={-1,-1,-1,-1,-1};
MeMaxPile = CHAR_getMyMaxPilenum( meindex);//最大堆叠数
2016-12-24 08:45:52 +08:00
ToMaxPile = CHAR_getMyMaxPilenum( toindex);
//移除meindex
//移除toindex
2016-12-24 08:45:52 +08:00
{
char buf[256];
memset( buf, 0, sizeof( buf));
sprintf( buf, "A.%s[%s] trade B.%s[%s] FXY[%d,%d,%d]",
CHAR_getChar( meindex, CHAR_NAME), CHAR_getChar(meindex, CHAR_CDKEY),
CHAR_getChar( toindex, CHAR_NAME), CHAR_getChar(toindex, CHAR_CDKEY),
CHAR_getInt( meindex, CHAR_FLOOR), CHAR_getInt( meindex, CHAR_X), CHAR_getInt( meindex, CHAR_Y) );
LogTrade(buf);
}
//移除
2016-12-24 08:45:52 +08:00
if( CHAR_getInt( meindex, CHAR_FLOOR)==50000 && CHAR_getInt( toindex, CHAR_FLOOR)==50000)
{
if( CHAR_getWorkInt( meindex, CHAR_WORKTRADEPK)==1 && CHAR_getWorkInt( toindex, CHAR_WORKTRADEPK)==2)
{
if( (ret=TRADE_HandleTrade_DelItem( meindex, MeMaxPile, ToMaxPile, temp1->ItemTi, temp1->ItemNum, ToItem ))== -1 ) return FALSE;
if( (ret=TRADE_HandleTrade_DelItem( toindex, ToMaxPile, MeMaxPile, temp2->ItemTi, temp2->ItemNum, MeItem ))== -1 ) return FALSE;
if( (ret=TRADE_HandleTrade_DelPet( meindex, temp1->PetTi, ToPet)) == -1 ) return FALSE;
if( (ret=TRADE_HandleTrade_DelPet( toindex, temp2->PetTi, MePet)) == -1 ) return FALSE;
if( TRADE_HandleTrade_DelGold( meindex, temp1->Golds, &ToGold) == FALSE ) return FALSE;
if( TRADE_HandleTrade_DelGold( toindex, temp2->Golds, &MeGold) == FALSE ) return FALSE;
//加入
2016-12-24 08:45:52 +08:00
if( TRADE_HandleTrade_AddItem( meindex, MeItem) == FALSE ) return FALSE;
if( TRADE_HandleTrade_AddItem( meindex, ToItem) == FALSE ) return FALSE;
if( TRADE_HandleTrade_AddPet( meindex, MePet) == FALSE) return FALSE;
if( TRADE_HandleTrade_AddPet( meindex, ToPet) == FALSE) return FALSE;
TRADE_HandleTrade_AddGold( meindex, MeGold);
TRADE_HandleTrade_AddGold( meindex, ToGold);
CHAR_setWorkInt( meindex, CHAR_WORKTRADEPK, 0);
CHAR_setWorkInt( toindex, CHAR_WORKTRADEPK, 0);
}
else if( CHAR_getWorkInt( meindex, CHAR_WORKTRADEPK)==2 && CHAR_getWorkInt( toindex, CHAR_WORKTRADEPK)==1)
{
if( (ret=TRADE_HandleTrade_DelItem( meindex, MeMaxPile, ToMaxPile, temp1->ItemTi, temp1->ItemNum, ToItem ))== -1 ) return FALSE;
if( (ret=TRADE_HandleTrade_DelItem( toindex, ToMaxPile, MeMaxPile, temp2->ItemTi, temp2->ItemNum, MeItem ))== -1 ) return FALSE;
if( (ret=TRADE_HandleTrade_DelPet( meindex, temp1->PetTi, ToPet)) == -1 ) return FALSE;
if( (ret=TRADE_HandleTrade_DelPet( toindex, temp2->PetTi, MePet)) == -1 ) return FALSE;
if( TRADE_HandleTrade_DelGold( meindex, temp1->Golds, &ToGold) == FALSE ) return FALSE;
if( TRADE_HandleTrade_DelGold( toindex, temp2->Golds, &MeGold) == FALSE ) return FALSE;
//加入
2016-12-24 08:45:52 +08:00
if( TRADE_HandleTrade_AddItem( toindex, MeItem) == FALSE ) return FALSE;
if( TRADE_HandleTrade_AddItem( toindex, ToItem) == FALSE ) return FALSE;
if( TRADE_HandleTrade_AddPet( toindex, MePet) == FALSE) return FALSE;
if( TRADE_HandleTrade_AddPet( toindex, ToPet) == FALSE) return FALSE;
TRADE_HandleTrade_AddGold( toindex, MeGold);
TRADE_HandleTrade_AddGold( toindex, ToGold);
CHAR_setWorkInt( meindex, CHAR_WORKTRADEPK, 0);
CHAR_setWorkInt( toindex, CHAR_WORKTRADEPK, 0);
}
}
else
{
if( (ret=TRADE_HandleTrade_DelItem( meindex, MeMaxPile, ToMaxPile, temp1->ItemTi, temp1->ItemNum, ToItem ))== -1 ) return FALSE;
if( (ret=TRADE_HandleTrade_DelItem( toindex, ToMaxPile, MeMaxPile, temp2->ItemTi, temp2->ItemNum, MeItem ))== -1 ) return FALSE;
if( (ret=TRADE_HandleTrade_DelPet( meindex, temp1->PetTi, ToPet)) == -1 ) return FALSE;
if( (ret=TRADE_HandleTrade_DelPet( toindex, temp2->PetTi, MePet)) == -1 ) return FALSE;
if( TRADE_HandleTrade_DelGold( meindex, temp1->Golds, &ToGold) == FALSE ) return FALSE;
if( TRADE_HandleTrade_DelGold( toindex, temp2->Golds, &MeGold) == FALSE ) return FALSE;
//加入
2016-12-24 08:45:52 +08:00
if( TRADE_HandleTrade_AddItem( meindex, MeItem) == FALSE ) return FALSE;
if( TRADE_HandleTrade_AddItem( toindex, ToItem) == FALSE ) return FALSE;
if( TRADE_HandleTrade_AddPet( meindex, MePet) == FALSE) return FALSE;
if( TRADE_HandleTrade_AddPet( toindex, ToPet) == FALSE) return FALSE;
TRADE_HandleTrade_AddGold( meindex, MeGold);
TRADE_HandleTrade_AddGold( toindex, ToGold);
}
{
char buf1[4096], buf2[4096], buf[256];
int i;
sprintf( buf1, "A.ITEM.");
sprintf( buf2, "B.ITEM.");
for( i=0; i<50; i++){
if( ITEM_CHECKINDEX( ToItem[i]) ){
sprintf( buf, "%s[%s]*%d,",
ITEM_getChar( ToItem[i], ITEM_NAME), ITEM_getChar( ToItem[i], ITEM_UNIQUECODE),
ITEM_getInt( ToItem[i], ITEM_USEPILENUMS) );
strcat( buf1, buf);
}
if( ITEM_CHECKINDEX( MeItem[i]) ){
sprintf( buf, "%s[%s]*%d,",
ITEM_getChar( MeItem[i], ITEM_NAME), ITEM_getChar( MeItem[i], ITEM_UNIQUECODE),
ITEM_getInt( MeItem[i], ITEM_USEPILENUMS) );
strcat( buf2, buf);
}
}
strcat( buf1, "PET.");
strcat( buf2, "PET.");
for( i=0; i<5; i++){
if( CHAR_CHECKINDEX( ToPet[i]) ){
sprintf( buf, "%s[%s]%s-%d",
CHAR_getUseName( ToPet[i]), CHAR_getChar( ToPet[i], CHAR_UNIQUECODE),
CHAR_getChar( ToPet[i], CHAR_NAME), CHAR_getInt( ToPet[i], CHAR_LV) );
strcat( buf1, buf);
}
if( CHAR_CHECKINDEX( MePet[i]) ){
sprintf( buf, "%s[%s]%s-%d",
CHAR_getUseName( MePet[i]), CHAR_getChar( MePet[i], CHAR_UNIQUECODE),
CHAR_getChar( MePet[i], CHAR_NAME), CHAR_getInt( MePet[i], CHAR_LV) );
strcat( buf2, buf);
}
}
sprintf( buf, "GOLD:%d", ToGold);
strcat( buf1, buf);
sprintf( buf, "GOLD:%d", MeGold);
strcat( buf2, buf);
LogTrade( buf1);
LogTrade( buf2);
}
return TRUE;
}
int TRADE_CheckItembuf(int fd, int meindex, int toindex, int tofd, char* mycharaname, char* tocharaname)
{
int Tradeti;
STradeList TradeListTemp[2];
if( TRADE_getMyTarget( meindex) != toindex ) return -1;
Tradeti = CONNECT_getTradeList( fd);
if( Tradeti <0 || Tradeti >= MAX_TRADELISTNUM ) return -1;
if( TradeList[Tradeti][0].use != 1 || TradeList[Tradeti][1].use != 1 ) return -1;
if( TRADE_getSomeTradeList( meindex, &TradeListTemp[0]) == FALSE ) return -1;
if( TRADE_getSomeTradeList( toindex, &TradeListTemp[1]) == FALSE ) return -1;
//确定空位
2016-12-24 08:45:52 +08:00
if( TRADE_CheckTradeList( meindex, &TradeListTemp[0], toindex, &TradeListTemp[1]) == FALSE ) return -1;
//移除人物身上
//加入人物身上
2016-12-24 08:45:52 +08:00
#ifdef _TRADE_PK
if(CHAR_getInt( meindex, CHAR_FLOOR)==50000 && CHAR_getInt( toindex, CHAR_FLOOR)==50000)
{
// TradeListPk[0].charaindex = TradeListTemp[0].charaindex;
// TradeListPk[1].charaindex = TradeListTemp[1].charaindex;
// TradeListPk[0].fd = TradeListTemp[0].fd;
// TradeListPk[1].fd = TradeListTemp[1].fd;
// int i;
// for(i=0;i<5;i++)
// {
// TradeListPk[0].PetTi[i] = TradeListTemp[0].PetTi[i];
// TradeListPk[1].PetTi[i] = TradeListTemp[1].PetTi[i];
// }
// for(i=0;i<15;i++)
// {
// TradeListPk[0].ItemTi[i] = TradeListTemp[0].ItemTi[i];
// TradeListPk[1].ItemTi[i] = TradeListTemp[1].ItemTi[i];
// TradeListPk[0].ItemNum[i] = TradeListTemp[0].ItemNum[i];
// TradeListPk[1].ItemNum[i] = TradeListTemp[1].ItemNum[i];
// }
// TradeListPk[0].Golds = TradeListTemp[0].Golds;
// TradeListPk[1].Golds = TradeListTemp[1].Golds;
// TradeListPk[0].use = TradeListTemp[0].use;
// TradeListPk[1].use = TradeListTemp[1].use;
TradeListPk[0] = TradeListTemp[0];
TradeListPk[1] = TradeListTemp[1];
meindexpk = meindex;
toindexpk = toindex;
BATTLE_CreateVsPlayer( meindex, toindex);
return 3;
}
else
{
#endif
if( TRADE_HandleTrade( meindex, &TradeListTemp[0], toindex, &TradeListTemp[1] ) == FALSE ) return -1;
//交易结束动作
2016-12-24 08:45:52 +08:00
return 1;
#ifdef _TRADE_PK
}
#endif
}
#else
/*
int TRADE_CheckItembuf(int fd, int meindex, int toindex, int tofd, char* mycharaname, char* tocharaname)
{
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
int myItem[42] = { -1 } ; //我方所有的交易内容编号
int oppItem[42] = { -1 }; //对方所有的交易内容编号
2016-12-24 08:45:52 +08:00
int ii , jj;
int Iitem1[15] = { 0 } ; //我方道具的index
int Iitem2[15] = { 0 } ; //对方道具的index
int ppet1[5] = { 0 } ; //我方宠物的index
int ppet2[5] = { 0 } ; //对方宠物的index
2016-12-24 08:45:52 +08:00
BOOL tradeflag = TRUE ;
int count = 0 ;
#endif
char a[16], b[16], c[16], d[16], e[16], f[16];
char g[16], h[16], i[16], j[16], k[16], l[16], token[16];
int itemindex1 = 0, itemindex2 = 0, itemindex3 = 0;
int itemindex4 = 0, itemindex5 = 0, itemindex6 = 0;
int toitemindex1 = 0, toitemindex2 = 0, toitemindex3 = 0;
int toitemindex4 = 0, toitemindex5 = 0, toitemindex6 = 0;
int item1 = 0, item2 = 0, item4 = 0, item5 = 0, pet3 = 0, pet6 = 0;
int pet1 = 0, pet2 = 0;
int swapitem1 = 0, swapitem2 = 0, gold1 = 0, gold2 = 0;
char itembuf[256], toitembuf[256], buf[4048];
CONNECT_getTradeTmp(fd, itembuf, sizeof(itembuf));
CONNECT_getTradeTmp(tofd, toitembuf, sizeof(toitembuf));
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
//取得我方所有交易内容编号
2016-12-24 08:45:52 +08:00
for ( ii = 0 ; ii < 42 ; ii ++ ) {
if (getStringFromIndexWithDelim(itembuf, "|", 6 + ii * 2 , token, sizeof(token)) == TRUE)
myItem[ii] = atoi(token);
}
//取得对方所有交易内容编号
2016-12-24 08:45:52 +08:00
for ( ii = 0 ; ii < 42 ; ii ++ ) {
if (getStringFromIndexWithDelim(toitembuf, "|", 6 + ii * 2 , token, sizeof(token)) == TRUE)
oppItem[ii] = atoi(token);
}
#else
// 比对双方之最後交易协定
2016-12-24 08:45:52 +08:00
if (getStringFromIndexWithDelim(itembuf, "|", 5, token, sizeof(token)) == TRUE)
strcpy(a, token);
if (getStringFromIndexWithDelim(itembuf, "|", 6, token, sizeof(token)) == TRUE)
itemindex1 = atoi(token);
if (getStringFromIndexWithDelim(itembuf, "|", 7, token, sizeof(token)) == TRUE)
strcpy(b, token);
if (getStringFromIndexWithDelim(itembuf, "|", 8, token, sizeof(token)) == TRUE)
itemindex2 = atoi(token);
if (getStringFromIndexWithDelim(itembuf, "|", 9, token, sizeof(token)) == TRUE)
strcpy(c, token);
if (getStringFromIndexWithDelim(itembuf, "|", 10, token, sizeof(token)) == TRUE)
itemindex3 = atoi(token);
if (getStringFromIndexWithDelim(itembuf, "|", 11, token, sizeof(token)) == TRUE)
strcpy(d, token);
if (getStringFromIndexWithDelim(itembuf, "|", 12, token, sizeof(token)) == TRUE)
itemindex4 = atoi(token);
if (getStringFromIndexWithDelim(itembuf, "|", 13, token, sizeof(token)) == TRUE)
strcpy(e, token);
if (getStringFromIndexWithDelim(itembuf, "|", 14, token, sizeof(token)) == TRUE)
itemindex5 = atoi(token);
if (getStringFromIndexWithDelim(itembuf, "|", 15, token, sizeof(token)) == TRUE)
strcpy(f, token);
if (getStringFromIndexWithDelim(itembuf, "|", 16, token, sizeof(token)) == TRUE)
itemindex6 = atoi(token);
if (getStringFromIndexWithDelim(toitembuf, "|", 5, token, sizeof(token)) == TRUE)
strcpy(g, token);
if (getStringFromIndexWithDelim(toitembuf, "|", 6, token, sizeof(token)) == TRUE)
toitemindex1 = atoi(token);
if (getStringFromIndexWithDelim(toitembuf, "|", 7, token, sizeof(token)) == TRUE)
strcpy(h, token);
if (getStringFromIndexWithDelim(toitembuf, "|", 8, token, sizeof(token)) == TRUE)
toitemindex2 = atoi(token);
if (getStringFromIndexWithDelim(toitembuf, "|", 9, token, sizeof(token)) == TRUE)
strcpy(i, token);
if (getStringFromIndexWithDelim(toitembuf, "|", 10, token, sizeof(token)) == TRUE)
toitemindex3 = atoi(token);
if (getStringFromIndexWithDelim(toitembuf, "|", 11, token, sizeof(token)) == TRUE)
strcpy(j, token);
if (getStringFromIndexWithDelim(toitembuf, "|", 12, token, sizeof(token)) == TRUE)
toitemindex4 = atoi(token);
if (getStringFromIndexWithDelim(toitembuf, "|", 13, token, sizeof(token)) == TRUE)
strcpy(k, token);
if (getStringFromIndexWithDelim(toitembuf, "|", 14, token, sizeof(token)) == TRUE)
toitemindex5 = atoi(token);
if (getStringFromIndexWithDelim(toitembuf, "|", 15, token, sizeof(token)) == TRUE)
strcpy(l, token);
if (getStringFromIndexWithDelim(toitembuf, "|", 16, token, sizeof(token)) == TRUE)
toitemindex6 = atoi(token);
#endif
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
//检查有无重复交易的道具
2016-12-24 08:45:52 +08:00
for ( ii = 0 ; ii < 15 ; ii ++ ) {
for ( jj = ii + 1 ; jj < 15 ; jj ++ ) {
if ( myItem[ii] == myItem[jj] )
if ( myItem[ii] != -1 )
return -1 ;
}
}
for ( ii = 21 ; ii < 36 ; ii ++ ) {
for ( jj = ii + 1 ; jj < 36 ; jj++ ) {
if ( myItem[ii] == myItem[jj] )
if ( myItem[ii] != -1 )
return -1 ;
}
}
#else
// shan hjj add 洗道具
2016-12-24 08:45:52 +08:00
if (itemindex1==itemindex2){
if (itemindex1!=-1){
return -1;
}
}
if (itemindex4==itemindex5){
if (itemindex4!=-1){
return -1;
}
}
// End
#endif
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
//比对双方交易的物品是否都正确
2016-12-24 08:45:52 +08:00
for ( ii = 0 ; ii < 21 ; ii ++ ) {
if ( myItem[ii] != oppItem[ii+21] ) {
tradeflag = FALSE ;
break;
}
}
for ( ii = 21 ; ii < 42 ; ii ++ ){
if ( myItem[ii] != oppItem[ii-21]) {
tradeflag = FALSE;
break;
}
}
//双方内容正确开始进行处理
2016-12-24 08:45:52 +08:00
if ( tradeflag == TRUE ) {
//计算双方道具的加减
2016-12-24 08:45:52 +08:00
for ( ii = 0 ; ii < 15 ; ii ++ ) {
if ( myItem[ii] != -1 ) {
swapitem1--;
swapitem2++;
}
}
for ( ii = 21 ; ii < 36 ; ii ++ ) {
if ( myItem[ii] != -1 ) {
swapitem1++;
swapitem2--;
}
}
#else
if ((strcmp(a, j) == 0) && (strcmp(b, k) == 0) && (strcmp(c,l) == 0)
&& (strcmp(d, g) == 0) && (strcmp(e, h) == 0) && (strcmp(f, i) == 0)
&& (itemindex1 == toitemindex4) && (itemindex2 == toitemindex5)
&& (itemindex3 == toitemindex6) && (itemindex4 == toitemindex1)
&& (itemindex5 == toitemindex2) && (itemindex6 == toitemindex3))
{
// 检验双方物品栏是否有空位
2016-12-24 08:45:52 +08:00
if ((strcmp(a, "I") == 0) && (itemindex1 != -1)){
swapitem1--;
swapitem2++;
}
if ((strcmp(b, "I") == 0) && (itemindex2 != -1)){
swapitem1--;
swapitem2++;
}
if ((strcmp(d, "I") == 0) && (itemindex4 != -1)){
swapitem1++;
swapitem2--;
}
if ((strcmp(e, "I") == 0) && (itemindex5 != -1)){
swapitem1++;
swapitem2--;
}
#endif
if (swapitem1 > CHAR_findTotalEmptyItem(meindex))
return -2;
toindex = CONNECT_getCharaindex(tofd);
if (!CHAR_CHECKINDEX(toindex)) return -1;
if (swapitem2 > CHAR_findTotalEmptyItem(toindex))
return -3;
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
//取得交换的金钱
2016-12-24 08:45:52 +08:00
if ( myItem[20] != -1 ) gold1 += myItem[20] ;
if ( myItem[41] != -1 ) gold2 += myItem[41] ;
#else
// 检查双方金钱
2016-12-24 08:45:52 +08:00
if ((strcmp(a, "G") == 0) && (itemindex1 != -1)) gold1 += itemindex1;
if ((strcmp(b, "G") == 0) && (itemindex2 != -1)) gold1 += itemindex2;
if ((strcmp(d, "G") == 0) && (itemindex4 != -1)) gold2 += itemindex4;
if ((strcmp(e, "G") == 0) && (itemindex5 != -1)) gold2 += itemindex5;
#endif
if (gold1 > CHAR_getMaxHaveGold( meindex) ) return -4;
if (gold1 > CHAR_getInt(meindex, CHAR_GOLD)) return -5;
if (gold2 > CHAR_getMaxHaveGold( toindex)) return -6;
if (gold2 > CHAR_getInt(toindex, CHAR_GOLD)) return -7;
if ((gold2 + CHAR_getInt(meindex, CHAR_GOLD) - gold1) > CHAR_getMaxHaveGold( meindex) ) return -8;
if ((gold1 + CHAR_getInt(toindex, CHAR_GOLD) - gold2) > CHAR_getMaxHaveGold( toindex)) return -9;
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
//计算双方宠物的加减
2016-12-24 08:45:52 +08:00
for ( ii = 15 ; ii < 20 ; ii ++ ) {
if ( myItem[ii] != -1 ) {
pet1--;
pet2++;
}
}
for ( ii = 36 ; ii < 41 ; ii ++ ) {
if ( myItem[ii] != -1 ) {
pet1++;
pet2--;
}
}
#else
// 检查双方宠物
2016-12-24 08:45:52 +08:00
if ((strcmp(c, "P") == 0) && (itemindex3 != -1))
{
pet1--; pet2++;
}
if ((strcmp(f, "P") == 0) && (itemindex6 != -1))
{
pet1++; pet2--;
}
#endif
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
2016-12-24 08:45:52 +08:00
if ((pet1 > 5) || (pet2 > 5)) return -10;
//取得双方身上能放的宠物数量
2016-12-24 08:45:52 +08:00
for( ii = 0; ii < CHAR_MAXPETHAVE; ii ++ ) {
if( CHAR_getCharPet( meindex , ii ) == -1 ) count ++ ;
}
if ( pet1 > count ) return -10;
count = 0 ;
for( ii = 0; ii < CHAR_MAXPETHAVE; ii ++ ) {
if( CHAR_getCharPet( toindex , ii ) == -1 ) count ++ ;
}
if ( pet2 > count ) return -11;
#else
if ((pet1 > 1) || (pet2 > 1)) return -10;
if ((pet1 == 1) && (CHAR_getCharPetElement( meindex) == -1)) return -10;
if ((pet2 == 1) && (CHAR_getCharPetElement( toindex) == -1)) return -11;
#endif
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
//取得所有欲交易的道具index
2016-12-24 08:45:52 +08:00
for ( ii = 0 ; ii < 15 ; ii ++ ) {
if ( myItem[ii] != -1 )
Iitem1[ii] = CHAR_getItemIndex(meindex, myItem[ii]);
else
Iitem1[ii] = -1 ;
if ( myItem[ii + 21 ] != -1 )
Iitem2[ii] = CHAR_getItemIndex(toindex, myItem[ii + 21]);
else
Iitem2[ii] = -1 ;
}
#else
if ((strcmp(a, "I") == 0) && (itemindex1 != -1))
item1 = CHAR_getItemIndex(meindex, itemindex1);
else item1 = -1;
if ((strcmp(b, "I") == 0) && (itemindex2 != -1))
item2 = CHAR_getItemIndex(meindex, itemindex2);
else item2 = -1;
if ((strcmp(d, "I") == 0) && (itemindex4 != -1))
item4 = CHAR_getItemIndex(toindex, itemindex4);
else item4 = -1;
if ((strcmp(e, "I") == 0) && (itemindex5 != -1))
item5 = CHAR_getItemIndex(toindex, itemindex5);
else item5 = -1;
#endif
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
//取得欲交易宠物的index
2016-12-24 08:45:52 +08:00
for ( ii = 15 ; ii < 20 ; ii ++ ) {
if ( myItem[ii] != -1 ) {
if ( CHAR_getInt( meindex , CHAR_RIDEPET) == myItem[ii] )
return -1 ;
ppet1[ii - 15 ] = CHAR_getCharPet( meindex , myItem[ii] ) ;
}
else
ppet1[ii - 15 ] = -1 ;
}
for ( ii = 36 ; ii < 41 ; ii ++ ) {
if ( myItem[ii] != -1 ) {
if ( CHAR_getInt( toindex , CHAR_RIDEPET) == myItem[ii] )
return -1 ;
ppet2[ ii - 36 ] = CHAR_getCharPet( toindex , myItem[ii] ) ;
}
else
ppet2[ ii - 36 ] = -1 ;
}
#else
if (itemindex3 != -1)
{
if( CHAR_getInt( meindex, CHAR_RIDEPET) == itemindex3 )
return -1;
pet3 = CHAR_getCharPet(meindex, itemindex3);
}
else pet3 = -1;
if (itemindex6 != -1)
{
if( CHAR_getInt( toindex, CHAR_RIDEPET) == itemindex6 )
return -1;
pet6 = CHAR_getCharPet(toindex, itemindex6);
}
else pet6 = -1;
#endif
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
2016-12-24 08:45:52 +08:00
for ( ii = 0 ; ii < 15 ; ii ++ ) {
if ( ITEM_getInt( Iitem1[ii] , ITEM_VANISHATDROP ) == 1 )
return -12 ;
if ( ITEM_getInt( Iitem2[ii] , ITEM_VANISHATDROP ) == 1 )
return -12 ;
}
#else
if ((ITEM_getInt(item1, ITEM_VANISHATDROP) == 1)||
(ITEM_getInt(item2, ITEM_VANISHATDROP) == 1)||
(ITEM_getInt(item4, ITEM_VANISHATDROP) == 1)||
(ITEM_getInt(item5, ITEM_VANISHATDROP) ==1))
return -12;
#endif
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
//宠物等级能否交易判断
2016-12-24 08:45:52 +08:00
if( CHAR_getWorkInt( meindex, CHAR_PickAllPet) != TRUE ) {
for ( ii = 0 ; ii < 5 ; ii ++ ) {
if ( (ppet2[ii] != -1 ) && ( CHAR_getInt( ppet2[ii] , CHAR_LV )
- CHAR_getInt(meindex, CHAR_LV) > 5)
&& (CHAR_getInt(meindex,CHAR_TRANSMIGRATION) <= 0))
return -13 ;
}
}
if( CHAR_getWorkInt( toindex, CHAR_PickAllPet) != TRUE ) {
for ( ii = 0 ; ii < 5 ; ii ++ ) {
if ( (ppet1[ii] != -1 ) && ( CHAR_getInt( ppet1[ii] , CHAR_LV )
- CHAR_getInt(toindex, CHAR_LV) > 5)
&& (CHAR_getInt(toindex,CHAR_TRANSMIGRATION) <= 0))
return -13 ;
}
}
#else
if( CHAR_getWorkInt( meindex, CHAR_PickAllPet) != TRUE ) {
if ((pet6 != -1) && (CHAR_getInt(pet6, CHAR_LV)
- CHAR_getInt(meindex, CHAR_LV) > 5)
&& (CHAR_getInt(meindex,CHAR_TRANSMIGRATION) <= 0))
return -13;
}
if( CHAR_getWorkInt( toindex, CHAR_PickAllPet) != TRUE ) {
if ((pet3 != -1) && (CHAR_getInt(pet3, CHAR_LV)
- CHAR_getInt(toindex, CHAR_LV) > 5)
&& (CHAR_getInt(toindex,CHAR_TRANSMIGRATION) <= 0))
return -14;
}
#endif
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
//是否为家族守护兽
2016-12-24 08:45:52 +08:00
for ( ii = 0 ; ii < 5 ; ii ++ ) {
if ( ( ppet1[ii] != -1 ) && (CHAR_getInt(ppet1[ii], CHAR_PETFAMILY) == 1))
return -15;
if ( ( ppet2[ii] != -1 ) && (CHAR_getInt(ppet2[ii], CHAR_PETFAMILY) == 1))
return -15;
}
#else
if ((pet6 != -1) && (CHAR_getInt(pet6, CHAR_PETFAMILY) == 1))
return -15;
if ((pet3 != -1) && (CHAR_getInt(pet3, CHAR_PETFAMILY) == 1))
return -15;
#endif
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
// 交换玩家道具、金钱、宠物
2016-12-24 08:45:52 +08:00
for ( ii = 0 ; ii < 15 ; ii ++ ) {
TRADE_ChangeItem(meindex, toindex, "I", "I", Iitem1[ii], Iitem2[ii],
myItem[ii], oppItem[ii]);
}
for ( ii = 15 ; ii < 20 ; ii ++ ) {
TRADE_ChangeItem(meindex, toindex, "P", "P", ppet1[ii - 15 ], ppet2[ii-15],
myItem[ii], oppItem[ii]);
}
TRADE_ChangeItem(meindex, toindex, "G", "G", Iitem1[20], Iitem2[41],
myItem[20], oppItem[20]);
#else
TRADE_ChangeItem(meindex, toindex, a, d, item1, item4,
itemindex1, itemindex4);
TRADE_ChangeItem(meindex, toindex, b, e, item2, item5,
itemindex2, itemindex5);
TRADE_ChangeItem(meindex, toindex, c, f, pet3, pet6,
itemindex3, itemindex6);
#endif
// 写入 trade.log
2016-12-24 08:45:52 +08:00
{
char petname1[256], petname2[256];
int pet1lv, pet2lv;
int logitem1 = 0, logitem2 = 0, logitem4 = 0, logitem5 = 0;
if ((strcmp(a, "I") == 0) && (item1 != -1)) logitem1 = ITEM_getInt(item1, ITEM_ID);
if ((strcmp(b, "I") == 0) && (item2 != -1)) logitem2 = ITEM_getInt(item2, ITEM_ID);
if ((strcmp(a, "G") == 0) && (item1 == -1)) logitem1 = itemindex1;
if ((strcmp(b, "G") == 0) && (item2 == -1)) logitem2 = itemindex2;
if ((strcmp(c, "P") == 0) && (pet3 == -1))
{
sprintf(petname1, "NONE");
pet1lv = 0;
}
else
{
sprintf(petname1, "%s", CHAR_getChar(pet3, CHAR_NAME));
pet1lv = CHAR_getInt(pet3, CHAR_LV);
}
if ((strcmp(f, "P") == 0) && (pet6 == -1))
{
sprintf(petname2, "NONE");
pet2lv = 0;
}
else
{
sprintf(petname2, "%s", CHAR_getChar(pet6, CHAR_NAME));
pet2lv = CHAR_getInt(pet6, CHAR_LV);
}
if ((strcmp(d, "I") == 0) && (item4 != -1)) logitem4 = ITEM_getInt(item4, ITEM_ID);
if ((strcmp(e, "I") == 0) && (item5 != -1)) logitem5 = ITEM_getInt(item5, ITEM_ID);
if ((strcmp(d, "G") == 0) && (item4 == -1)) logitem4 = itemindex4;
if ((strcmp(e, "G") == 0) && (item5 == -1)) logitem5 = itemindex5;
sprintf(buf, "%s\t%s\t(%s[%d,%s],%s[%d,%s],%s[%s,%d,%s]) <-> %s\t%s\t(%s[%d,%s],%s[%d,%s],%s[%s,%d,%s])",
CHAR_getChar(meindex, CHAR_CDKEY), mycharaname,
a, logitem1, ITEM_getChar( item1, ITEM_UNIQUECODE), b, logitem2, ITEM_getChar( item2, ITEM_UNIQUECODE),
c, petname1, pet1lv, CHAR_getChar( pet3, CHAR_UNIQUECODE),
CHAR_getChar(toindex, CHAR_CDKEY), tocharaname,
d, logitem4, ITEM_getChar( item4, ITEM_UNIQUECODE), e, logitem5, ITEM_getChar( item5, ITEM_UNIQUECODE),
f, petname2, pet2lv, CHAR_getChar( pet6, CHAR_UNIQUECODE));
LogTrade(buf);
}
return 1;
}// if
else
return 2;
}
*/
#endif
/*
BOOL TRADE_ChangeItem(int meindex, int toindex, char *a, char *b,
int item1, int item2, int itemindex1, int itemindex2)
{
int gold1 = 0, gold2 = 0, eptitem = -1;
if (CHAR_CHECKINDEX(meindex) == FALSE) return FALSE;
if (CHAR_CHECKINDEX(toindex) == FALSE) return FALSE;
// 道具 <-> 道具
2016-12-24 08:45:52 +08:00
if ((strcmp(a, "I") == 0) && (strcmp(b, "I") == 0))
{
// 无 <-> 道具
2016-12-24 08:45:52 +08:00
if ((itemindex1 == -1) && (itemindex2 > 0))
{
if (ITEM_CHECKINDEX(item2) == FALSE) return FALSE;
eptitem = CHAR_findEmptyItemBox(meindex);
if (eptitem < 0) return FALSE;
CHAR_setItemIndex(meindex, eptitem, item2);
ITEM_setWorkInt(item2, ITEM_WORKCHARAINDEX, meindex);
ITEM_setWorkInt(item2, ITEM_WORKOBJINDEX, -1);
CHAR_setItemIndex(toindex, itemindex2, -1);
}
// 道具 <-> 无
2016-12-24 08:45:52 +08:00
else if ((itemindex1 > 0) && (itemindex2 == -1))
{
if (ITEM_CHECKINDEX(item1) == FALSE) return FALSE;
eptitem = CHAR_findEmptyItemBox(toindex);
if (eptitem < 0) return FALSE;
CHAR_setItemIndex(toindex, eptitem, item1);
ITEM_setWorkInt(item1, ITEM_WORKCHARAINDEX, toindex);
ITEM_setWorkInt(item1, ITEM_WORKOBJINDEX, -1);
CHAR_setItemIndex(meindex, itemindex1, -1);
}
// 道具 <-> 道具
2016-12-24 08:45:52 +08:00
else if (itemindex1 > 0 && itemindex2 > 0)
{
if (ITEM_CHECKINDEX(item1) == FALSE) return FALSE;
if (ITEM_CHECKINDEX(item2) == FALSE) return FALSE;
ITEM_setWorkInt(item1, ITEM_WORKCHARAINDEX, toindex);
ITEM_setWorkInt(item1, ITEM_WORKOBJINDEX, -1);
ITEM_setWorkInt(item2, ITEM_WORKCHARAINDEX, meindex);
ITEM_setWorkInt(item2, ITEM_WORKOBJINDEX, -1);
CHAR_setItemIndex(toindex, itemindex2, item1);
CHAR_setItemIndex(meindex, itemindex1, item2);
}
}
// 道具 <-> 金钱
2016-12-24 08:45:52 +08:00
else if ((strcmp(a, "I") == 0) && (strcmp(b, "G") == 0))
{
if (itemindex1 > 0)
{
if (ITEM_CHECKINDEX(item1) == FALSE) return FALSE;
eptitem = CHAR_findEmptyItemBox(toindex);
if (eptitem < 0) return FALSE;
ITEM_setWorkInt(item1, ITEM_WORKCHARAINDEX, toindex);
ITEM_setWorkInt(item1, ITEM_WORKOBJINDEX, -1);
CHAR_setItemIndex(toindex, eptitem, item1);
CHAR_setItemIndex(meindex, itemindex1, -1);
}
if (itemindex2 < 0) itemindex2 = 0;
gold1 = CHAR_getInt(meindex, CHAR_GOLD);
gold1 += itemindex2;
CHAR_setInt(meindex, CHAR_GOLD, gold1);
gold2 = CHAR_getInt(toindex, CHAR_GOLD);
gold2 -= itemindex2;
CHAR_setInt(toindex, CHAR_GOLD, gold2);
}
// 金钱 <-> 道具
2016-12-24 08:45:52 +08:00
else if ((strcmp(a, "G") == 0) && (strcmp(b, "I") == 0))
{
if (itemindex2 > 0)
{
if (ITEM_CHECKINDEX(item2) == FALSE) return FALSE;
eptitem = CHAR_findEmptyItemBox(meindex);
if (eptitem < 0) return FALSE;
ITEM_setWorkInt(item2, ITEM_WORKCHARAINDEX, meindex);
ITEM_setWorkInt(item2, ITEM_WORKOBJINDEX, -1);
CHAR_setItemIndex(meindex, eptitem, item2);
CHAR_setItemIndex(toindex, itemindex2, -1);
}
if (itemindex1 < 0) itemindex1 = 0;
gold1 = CHAR_getInt(meindex, CHAR_GOLD);
gold1 -= itemindex1;
CHAR_setInt(meindex, CHAR_GOLD, gold1);
gold2 = CHAR_getInt(toindex, CHAR_GOLD);
gold2 += itemindex1;
CHAR_setInt(toindex, CHAR_GOLD, gold2);
}
// 金钱 <-> 金钱
2016-12-24 08:45:52 +08:00
else if ((strcmp(a, "G") == 0) && (strcmp(b, "G") == 0))
{
if (itemindex1 < 0) itemindex1 = 0;
if (itemindex2 < 0) itemindex2 = 0;
gold1 = CHAR_getInt(toindex, CHAR_GOLD);
gold1 = gold1 + itemindex1 - itemindex2;
CHAR_setInt(toindex, CHAR_GOLD, gold1);
gold2 = CHAR_getInt(meindex, CHAR_GOLD);
gold2 = gold2 + itemindex2 - itemindex1;
CHAR_setInt(meindex, CHAR_GOLD, gold2);
}
// 宠物 <-> 宠物
2016-12-24 08:45:52 +08:00
else if ((strcmp(a, "P") == 0) && (strcmp(b, "P") == 0))
{
char category[8];
if ((item1 != -1) && (CHAR_CHECKINDEX(item1) == FALSE)) return FALSE;
if ((item2 != -1) && (CHAR_CHECKINDEX(item2) == FALSE)) return FALSE;
if ((itemindex1 != -1) && (itemindex1 == CHAR_getInt(meindex, CHAR_DEFAULTPET)))
{
int fd;
CHAR_setInt(meindex, CHAR_DEFAULTPET, -1);
fd = getfdFromCharaIndex(meindex);
if (fd != -1){
CHAR_setWorkInt( meindex, CHAR_WORK_PET0_STAT+itemindex1-1, 0);
lssproto_KS_send(fd, itemindex1, 0);
}
}
if ((itemindex2 != -1)&& (itemindex2 == CHAR_getInt(toindex, CHAR_DEFAULTPET)))
{
int tofd;
CHAR_setInt(toindex, CHAR_DEFAULTPET, -1);
tofd = getfdFromCharaIndex(toindex);
if (tofd != -1){
CHAR_setWorkInt( toindex, CHAR_WORK_PET0_STAT+itemindex1-1, 0);
lssproto_KS_send(tofd, itemindex2, 0);
}
}
if (item1 != -1)
CHAR_setWorkInt(item1, CHAR_WORKPLAYERINDEX, toindex);
if (item2 != -1)
CHAR_setWorkInt(item2, CHAR_WORKPLAYERINDEX, meindex);
if (itemindex1 == -1)
itemindex1 = CHAR_getCharPetElement( meindex);
if (itemindex2 == -1)
itemindex2 = CHAR_getCharPetElement( toindex);
CHAR_setCharPet(meindex, itemindex1, item2);
CHAR_setCharPet(toindex, itemindex2, item1);
if ((itemindex1 != -1) && (item1 != -1)) {
CHAR_setChar(item1, CHAR_OWNERCDKEY,
CHAR_getChar(toindex, CHAR_CDKEY));
CHAR_setChar(item1, CHAR_OWNERCHARANAME,
CHAR_getChar(toindex, CHAR_NAME));
CHAR_complianceParameter(item1);
CHAR_setInt(item1, CHAR_PUTPETTIME, 0);
}
if ((itemindex2 != -1) && (item2 != -1)) {
CHAR_setChar(item2, CHAR_OWNERCDKEY,
CHAR_getChar(meindex, CHAR_CDKEY));
CHAR_setChar(item2, CHAR_OWNERCHARANAME,
CHAR_getChar(meindex, CHAR_NAME));
CHAR_complianceParameter(item2);
CHAR_setInt(item2, CHAR_PUTPETTIME, 0);
}
snprintf(category, sizeof(category), "K%d", itemindex1);
CHAR_sendStatusString(meindex, category);
snprintf(category, sizeof(category), "W%d", itemindex1);
CHAR_sendStatusString(meindex, category);
snprintf(category, sizeof(category), "K%d", itemindex2);
CHAR_sendStatusString(toindex, category);
snprintf(category, sizeof(category), "W%d", itemindex2);
CHAR_sendStatusString(toindex, category);
}
return TRUE;
}
*/
BOOL TRADE_HandleItem( int meindex, int showindex, char *message, char *outmess)
{
char token[256];
int item, itemindex;
int fd = getfdFromCharaIndex( meindex );
if( CONNECT_get_confirm( fd) == TRUE ) return FALSE;
if( CHAR_getWorkInt( meindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_TRADING
|| CHAR_getWorkInt( meindex, CHAR_WORKTRADEMODE) == CHAR_TRADE_LOCK )
return FALSE;
if( getStringFromIndexWithDelim( message, "|", 6, token, sizeof( token)) == FALSE) return FALSE;
item = atoi( token);
if( item < CHAR_STARTITEMARRAY || item > CHAR_MAXITEMHAVE ){
return FALSE;
}
itemindex = CHAR_getItemIndex(meindex, item);
if( !ITEM_CHECKINDEX( itemindex)) return FALSE;
{
char itemname[256], tmpbuf[256], tmpbuf1[256];
int crushe;
#ifdef _ITEM_PILEFORTRADE
int nums = 0;
if( TRADE_addSomeTradeList( meindex, item, &nums, TRADE_ITEM) == FALSE ){
return FALSE;
}
#endif
strcpy( itemname, ITEM_getChar(itemindex, ITEM_SECRETNAME));//ITEM_NAME
crushe = ITEM_getItemDamageCrusheED( itemindex);
sprintf( token, "不会损坏"); //不会损坏
2016-12-24 08:45:52 +08:00
if( crushe >= 0 ) snprintf( token, sizeof(token), "%d%%", crushe );
char szTemp1[256];
sprintf(szTemp1," ");
#ifdef _TRADE_ITEM_FIX
if(getTradeItemFix()==1 && ( ITEM_getInt(itemindex,ITEM_MERGEFLG)==TRUE || strstr(ITEM_getChar(itemindex,ITEM_NAME),"合成")!=NULL ) ){
2016-12-24 08:45:52 +08:00
char attnum[16];
sprintf(attnum,"");
if(ITEM_getInt(itemindex,ITEM_MODIFYATTACK)!=0){
if(ITEM_getInt(itemindex,ITEM_ATTACKNUM_MAX)>1){
if(ITEM_getInt(itemindex,ITEM_ATTACKNUM_MIN)==ITEM_getInt(itemindex,ITEM_ATTACKNUM_MAX)){
sprintf(attnum," (x%d)",ITEM_getInt(itemindex,ITEM_ATTACKNUM_MAX));
}else{
sprintf(attnum," (%d-%d)",ITEM_getInt(itemindex,ITEM_ATTACKNUM_MIN),ITEM_getInt(itemindex,ITEM_ATTACKNUM_MAX));
}
}
if(strcmp(szTemp1," ")==0){
sprintf(szTemp1,"攻%s%d%s ",(ITEM_getInt(itemindex,ITEM_MODIFYATTACK)>=0)?"+":"",ITEM_getInt(itemindex,ITEM_MODIFYATTACK),attnum);
2016-12-24 08:45:52 +08:00
}else{
sprintf(szTemp1,"%s攻%s%d%s ",szTemp1,(ITEM_getInt(itemindex,ITEM_MODIFYATTACK)>=0)?"+":"",ITEM_getInt(itemindex,ITEM_MODIFYATTACK),attnum);
2016-12-24 08:45:52 +08:00
}
}
if(ITEM_getInt(itemindex,ITEM_MODIFYDEFENCE)!=0){
if(strcmp(szTemp1," ")==0){
sprintf(szTemp1,"防%s%d ",(ITEM_getInt(itemindex,ITEM_MODIFYDEFENCE)>=0)?"+":"",ITEM_getInt(itemindex,ITEM_MODIFYDEFENCE));
2016-12-24 08:45:52 +08:00
}else{
sprintf(szTemp1,"%s防%s%d ",szTemp1,(ITEM_getInt(itemindex,ITEM_MODIFYDEFENCE)>=0)?"+":"",ITEM_getInt(itemindex,ITEM_MODIFYDEFENCE));
2016-12-24 08:45:52 +08:00
}
}
if(ITEM_getInt(itemindex,ITEM_MODIFYQUICK)!=0){
if(strcmp(szTemp1," ")==0){
sprintf(szTemp1,"敏%s%d ",(ITEM_getInt(itemindex,ITEM_MODIFYQUICK)>=0)?"+":"",ITEM_getInt(itemindex,ITEM_MODIFYQUICK));
2016-12-24 08:45:52 +08:00
}else{
sprintf(szTemp1,"%s敏%s%d ",szTemp1,(ITEM_getInt(itemindex,ITEM_MODIFYQUICK)>=0)?"+":"",ITEM_getInt(itemindex,ITEM_MODIFYQUICK));
2016-12-24 08:45:52 +08:00
}
}
if(ITEM_getInt(itemindex,ITEM_MAGICID)>0){
int marray = MAGIC_getMagicArray( ITEM_getInt( itemindex, ITEM_MAGICID));
if( marray != -1 ){
if( MAGIC_getChar( marray, MAGIC_NAME) != NULL ){
if(strcmp(szTemp1," ")==0){
sprintf(szTemp1,"%s ",MAGIC_getChar( marray, MAGIC_NAME));
}else{
sprintf(szTemp1,"%s%s ",szTemp1,MAGIC_getChar( marray, MAGIC_NAME));
}
}
}
}
}
#endif
if(strcmp(szTemp1," ")==0)
sprintf(szTemp1,"%s",ITEM_getChar(itemindex,ITEM_EFFECTSTRING));
char newitemname[128];
memset(newitemname,0,sizeof(newitemname));
if(strstr(ITEM_getChar( itemindex, ITEM_NAME),"经验搜集丹")!=NULL)
2016-12-24 08:45:52 +08:00
strcpy(newitemname, ITEM_getChar( itemindex, ITEM_SECRETNAME));
else
strcpy(newitemname , ITEM_getChar( itemindex, ITEM_NAME));
#ifdef _ITEM_PILENUMS
sprintf( outmess, "%d|%s|%s|%s|%d|%s|%d",
#else
sprintf( outmess, "%d|%s|%s|%d|%s",
#endif
ITEM_getInt( itemindex, ITEM_BASEIMAGENUMBER),
makeEscapeString( newitemname, tmpbuf1, sizeof(tmpbuf1)),
makeEscapeString( itemname, tmpbuf, sizeof(tmpbuf)),
szTemp1, item, token
#ifdef _ITEM_PILEFORTRADE
,nums
#endif
);
}
return TRUE;
}
BOOL TRADE_HandleGold( int meindex, int showindex, char *message, char *outmess)
{
int gold, tmpgold;
char token[256];
int fd = getfdFromCharaIndex( meindex );
if(CONNECT_get_confirm( fd)==TRUE)return FALSE;
if (CHAR_getWorkInt(meindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_TRADING
|| CHAR_getWorkInt(meindex, CHAR_WORKTRADEMODE) == CHAR_TRADE_LOCK)
return FALSE;
tmpgold = CHAR_getInt(meindex, CHAR_GOLD);
if (getStringFromIndexWithDelim(message, "|", 6, token, sizeof(token)) == FALSE) return FALSE;
if( (gold = atoi(token)) < 0 ) return FALSE;
if( gold > tmpgold )return FALSE;
#ifdef _ITEM_PILEFORTRADE
if( TRADE_addSomeTradeList( meindex, gold, NULL, TRADE_GOLD) == FALSE ) return FALSE;
#endif
sprintf( outmess, "%d", gold);
return TRUE;
}
BOOL TRADE_HandlePet( int meindex, int showindex, char *message, char *outmess)
{
int havepetindex, petindex;
char token[256], buf[256];
int fd = getfdFromCharaIndex( meindex );
if(CONNECT_get_confirm( fd)==TRUE)return FALSE;
if (CHAR_getWorkInt(meindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_TRADING
|| CHAR_getWorkInt(meindex, CHAR_WORKTRADEMODE) == CHAR_TRADE_LOCK)
return FALSE;
if (getStringFromIndexWithDelim(message, "|", 6, token, sizeof(token)) == FALSE) return FALSE;
if( (havepetindex = atoi(token)) < 0 ) return FALSE;
petindex = CHAR_getCharPet(meindex, havepetindex);
if( !CHAR_CHECKINDEX(petindex)) return FALSE;
#ifdef _ITEM_PILEFORTRADE
if( TRADE_addSomeTradeList( meindex, havepetindex, NULL, TRADE_PET) == FALSE ) return FALSE;
#endif
sprintf( token, "%d|%s|%d|%d|%d|%d|%d|%d",
CHAR_getInt( petindex, CHAR_BASEIMAGENUMBER),
makeEscapeString( CHAR_getUseName(petindex), buf, sizeof(buf)),
CHAR_getInt( petindex, CHAR_LV),
CHAR_getWorkInt( petindex, CHAR_WORKATTACKPOWER),
CHAR_getWorkInt( petindex, CHAR_WORKDEFENCEPOWER),
CHAR_getWorkInt( petindex, CHAR_WORKQUICK),
havepetindex,
CHAR_getInt( petindex , CHAR_TRANSMIGRATION));
#ifdef _TRADESYSTEM2
{
int i;
char skillname[7][256];
char buf1[256],buf2[256];
for( i=0; i<7; i++){
int skillarray, skillID;
memset( skillname[i], 0, sizeof(skillname[i]));
skillID = CHAR_getPetSkill( petindex, i);
skillarray = PETSKILL_getPetskillArray( skillID);
if( !PETSKILL_CHECKINDEX( skillarray)) continue;
sprintf( skillname[i], "%s", PETSKILL_getChar( skillarray, PETSKILL_NAME) );
}
#ifdef _SHOW_FUSION
sprintf( outmess , "%s|%d|%d|%s|%s|%s|%s|%s|%s|%s|%s|%s|%d|",
#else
sprintf( outmess , "%s|%d|%d|%s|%s|%s|%s|%s|%s|%s|%s|%s",
#endif
token , CHAR_getWorkInt(petindex , CHAR_WORKMAXHP) , CHAR_getInt(petindex , CHAR_SLOT),
skillname[0] , skillname[1] , skillname[2] , skillname[3] ,
skillname[4] , skillname[5] , skillname[6] ,
makeEscapeString( CHAR_getChar( petindex, CHAR_NAME ), buf1, sizeof(buf1)),
makeEscapeString( CHAR_getUseName( petindex), buf2, sizeof(buf2))
#ifdef _SHOW_FUSION
,CHAR_getInt ( petindex, CHAR_FUSIONBEIT) ) ;
#else
);
#endif
#ifdef _PET_ITEM
char token[512]="";
int j;
for( j = 0 ; j < CHAR_MAXPETITEMHAVE ; j ++ )
strcat(token,ITEM_petmakeItemStatusString(petindex, j));
strcat(outmess,token);
#endif
}
#else
sprintf( outmess , "%s|%d", token , CHAR_getWorkInt(petindex , CHAR_WORKMAXHP) );
#endif //_TRADESYSTEM2
return TRUE;
}
#ifdef _ITEM_PILEFORTRADE
BOOL TRADE_CheckTradeList( int meindex, STradeList *temp1, int toindex, STradeList *temp2)
{
int i;
int MeSurplus=0, MeNeeds=0, MeMaxPile;
int ToSurplus=0, ToNeeds=0, ToMaxPile;
MeMaxPile = CHAR_getMyMaxPilenum( meindex);//最大堆叠数
2016-12-24 08:45:52 +08:00
ToMaxPile = CHAR_getMyMaxPilenum( toindex);
MeSurplus = CHAR_findSurplusItemBox( meindex);
ToSurplus = CHAR_findSurplusItemBox( toindex);
//道具
2016-12-24 08:45:52 +08:00
ToNeeds=0; MeNeeds=0;
for( i=0; i<15; i++ ){
int pilenum, itemindex;
if( temp1->ItemTi[i] == -1 ) continue;
itemindex = CHAR_getItemIndex( meindex, temp1->ItemTi[i] );
if( !ITEM_CHECKINDEX( itemindex)) return FALSE;
pilenum = ITEM_getInt( itemindex, ITEM_USEPILENUMS);
if( temp1->ItemNum[i] == pilenum ){
MeSurplus++;
}
if( temp1->ItemNum[i] > ToMaxPile ){
ToNeeds += (temp1->ItemNum[i]/ToMaxPile) + 1;
}else{
ToNeeds++;
}
}
for( i=0; i<15; i++ ){
int pilenum, itemindex;
if( temp2->ItemTi[i] == -1 ) continue;
itemindex = CHAR_getItemIndex( toindex, temp2->ItemTi[i] );
if( !ITEM_CHECKINDEX( itemindex)) return FALSE;
pilenum = ITEM_getInt( itemindex, ITEM_USEPILENUMS);
if( temp2->ItemNum[i] == pilenum){
ToSurplus++;
}
if( temp2->ItemNum[i] > MeMaxPile ){
MeNeeds += (temp2->ItemNum[i]/MeMaxPile) + 1;
}else {
MeNeeds++;
}
}
if(CHAR_getInt(meindex,CHAR_FLOOR)==50000 && CHAR_getInt(toindex,CHAR_FLOOR)==50000 )
{
if( MeSurplus < (MeNeeds+ToNeeds) ){
CHAR_talkToCli( meindex, -1, "交易後物品栏位不足。", CHAR_COLORYELLOW);
CHAR_talkToCli( toindex, -1, "对方交易後物品栏位不足。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return FALSE;
}
if( ToSurplus < (ToNeeds+MeNeeds) ){
CHAR_talkToCli( toindex, -1, "交易後物品栏位不足。", CHAR_COLORYELLOW);
CHAR_talkToCli( meindex, -1, "对方交易後物品栏位不足。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return FALSE;
}
}
else
{
if( MeSurplus < MeNeeds ){
CHAR_talkToCli( meindex, -1, "交易後物品栏位不足。", CHAR_COLORYELLOW);
CHAR_talkToCli( toindex, -1, "对方交易後物品栏位不足。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return FALSE;
}
if( ToSurplus < ToNeeds ){
CHAR_talkToCli( toindex, -1, "交易後物品栏位不足。", CHAR_COLORYELLOW);
CHAR_talkToCli( meindex, -1, "对方交易後物品栏位不足。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return FALSE;
}
}
//宠物
2016-12-24 08:45:52 +08:00
MeSurplus = CHAR_findSurplusPetBox( meindex);
ToSurplus = CHAR_findSurplusPetBox( toindex);
ToNeeds=0; MeNeeds=0;
for( i=0; i<5; i++ ){
int petindex;
if( temp1->PetTi[i] == -1 ) continue;
petindex = CHAR_getCharPet( meindex, temp1->PetTi[i] );
if( !CHAR_CHECKINDEX( petindex)) return FALSE;
MeSurplus++;
ToNeeds++;
}
for( i=0; i<5; i++ ){
int petindex;
if( temp2->PetTi[i] == -1 ) continue;
petindex = CHAR_getCharPet( toindex, temp2->PetTi[i] );
if( !CHAR_CHECKINDEX( petindex)) return FALSE;
ToSurplus++;
MeNeeds++;
}
if(CHAR_getInt(meindex,CHAR_FLOOR)==50000 && CHAR_getInt(toindex,CHAR_FLOOR)==50000 )
{
if( MeSurplus < (MeNeeds+ToNeeds) ){
CHAR_talkToCli( meindex, -1, "交易後宠物栏位不足。", CHAR_COLORYELLOW);
CHAR_talkToCli( toindex, -1, "对方交易後宠物栏位不足。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return FALSE;
}
if( ToSurplus < (ToNeeds+MeNeeds) ){
CHAR_talkToCli( meindex, -1, "对方交易後宠物栏位不足。", CHAR_COLORYELLOW);
CHAR_talkToCli( toindex, -1, "交易後宠物栏位不足。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return FALSE;
}
}
else
{
if( MeSurplus < MeNeeds ){
CHAR_talkToCli( meindex, -1, "交易後宠物栏位不足。", CHAR_COLORYELLOW);
CHAR_talkToCli( toindex, -1, "对方交易後宠物栏位不足。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return FALSE;
}
if( ToSurplus < ToNeeds ){
CHAR_talkToCli( meindex, -1, "对方交易後宠物栏位不足。", CHAR_COLORYELLOW);
CHAR_talkToCli( toindex, -1, "交易後宠物栏位不足。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return FALSE;
}
}
//金钱
2016-12-24 08:45:52 +08:00
MeMaxPile = CHAR_getMaxHaveGold( meindex);
ToMaxPile = CHAR_getMaxHaveGold( toindex);
MeSurplus = MeMaxPile - CHAR_getInt( meindex, CHAR_GOLD);
ToSurplus = ToMaxPile - CHAR_getInt( toindex, CHAR_GOLD);
ToNeeds=0; MeNeeds=0;
MeSurplus += temp1->Golds;
ToSurplus += temp2->Golds;
ToNeeds = temp1->Golds;
MeNeeds = temp2->Golds;
if(CHAR_getInt(meindex,CHAR_FLOOR)==50000 && CHAR_getInt(toindex,CHAR_FLOOR)==50000 )
{
if( MeSurplus < (MeNeeds+ToNeeds) ){
CHAR_talkToCli( meindex, -1, "交易後石币超过上限。", CHAR_COLORYELLOW);
CHAR_talkToCli( toindex, -1, "对方交易後石币超过上限。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return FALSE;
}
if( ToSurplus < (ToNeeds+MeNeeds) ){
CHAR_talkToCli( meindex, -1, "对方交易後石币超过上限。", CHAR_COLORYELLOW);
CHAR_talkToCli( toindex, -1, "交易後石币超过上限。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return FALSE;
}
}
else
{
if( MeSurplus < MeNeeds ){
CHAR_talkToCli( meindex, -1, "交易後石币超过上限。", CHAR_COLORYELLOW);
CHAR_talkToCli( toindex, -1, "对方交易後石币超过上限。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return FALSE;
}
if( ToSurplus < ToNeeds ){
CHAR_talkToCli( meindex, -1, "对方交易後石币超过上限。", CHAR_COLORYELLOW);
CHAR_talkToCli( toindex, -1, "交易後石币超过上限。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return FALSE;
}
}
return TRUE;
}
#endif