2323 lines
78 KiB
C
2323 lines
78 KiB
C
#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 新交易系统
|
||
#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 "交易取消!"
|
||
#ifdef _TRADE_PK
|
||
#define TRADE_PK_START "开始交易PK!"
|
||
#endif
|
||
#ifdef _LOCK_PET_ITEM
|
||
#define TRADE_LOCKPET "绑定的宠物无法交易!"
|
||
#define TRADE_LOCKITEM "绑定的道具无法交易!"
|
||
#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("初始化交易系统...");
|
||
for( i=0; i<MAX_TRADELISTNUM; i++){
|
||
TRADE_ResetTradeList( i);
|
||
}
|
||
print("完成\n");
|
||
}
|
||
|
||
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);//最大堆叠数
|
||
if( usTi < CHAR_STARTITEMARRAY || usTi >= CHAR_MAXITEMHAVE ) return FALSE;
|
||
itemindex = CHAR_getItemIndex( meindex, usTi );
|
||
//如果是绑定的道具则不可以用于交易
|
||
#ifdef _PETITEM__AMOI_E
|
||
if(ITEM_NOT_TRADE & ITEM_getInt(itemindex, ITEM_TYPEOFITEM)){
|
||
char buf[256];
|
||
sprintf( buf, "%s无法交易。", ITEM_getChar( itemindex, ITEM_NAME) );
|
||
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) );
|
||
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 ){
|
||
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);
|
||
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) );
|
||
CHAR_talkToCli( meindex, -1, buf, CHAR_COLORYELLOW);
|
||
return FALSE;
|
||
}
|
||
#endif
|
||
if( ITEM_getInt( itemindex, ITEM_CANBEPILE) == 1 ){//可堆叠
|
||
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;//家族守护兽
|
||
}
|
||
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);
|
||
return FALSE;
|
||
}
|
||
}
|
||
//如果是绑定的宠物则不可交易
|
||
#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);
|
||
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;//属性过高
|
||
}
|
||
#endif
|
||
if(strlen(CHAR_getChar(petindex,CHAR_USERPETNAME))>0 && strstr(CHAR_getChar(petindex,CHAR_USERPETNAME),"*")!=NULL){
|
||
CHAR_talkToCli(meindex, -1, "宠物自定义名称中含有(*),无法丢弃、卖店、交易、摆摊,请修改后操作。", CHAR_COLORYELLOW);
|
||
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);
|
||
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);
|
||
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
|
||
//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': // 寻找前方玩家
|
||
|
||
TRADE_Search(fd, index, message);
|
||
break;
|
||
/* case 'c':
|
||
TRADE_Will(fd, index, message);
|
||
break;
|
||
*/ case 't': // 显示交易的物品、金钱、宠物
|
||
TRADE_ShowItem(fd, index, message);
|
||
break;
|
||
case 'w': // 关闭交易
|
||
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;
|
||
|
||
// 若玩家状态为交易中或交易锁定中则不予处理
|
||
if (CHAR_getWorkInt(meindex, CHAR_WORKTRADEMODE) == CHAR_TRADE_TRADING
|
||
|| CHAR_getWorkInt(meindex, CHAR_WORKTRADEMODE) == CHAR_TRADE_LOCK)
|
||
return FALSE;
|
||
|
||
// 若玩家状态为组队或战斗中则不予处理
|
||
if ((CHAR_getWorkInt(meindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE)
|
||
|| (CHAR_getWorkInt(meindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE))
|
||
return FALSE;
|
||
|
||
#ifdef _STREET_VENDOR
|
||
// 若玩家在摆摊中不处理交易
|
||
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;
|
||
// 设定状态交易请求中
|
||
// 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);
|
||
// 前方没有玩家或对方关闭交易选项
|
||
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){
|
||
// 前方没有玩家或对方关闭交易选项
|
||
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;
|
||
}
|
||
// 前方有一位玩家
|
||
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);
|
||
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){ // 前方不只一位玩家
|
||
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;
|
||
// 若玩家状态为组队或战斗中则不予处理
|
||
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{// 将欲交易之金钱传给对方
|
||
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
|
||
if( CHAR_getWorkInt(meindex, CHAR_WORKTRADEMODE) == CHAR_TRADE_LOCK ){
|
||
//andy_log
|
||
print("ANDY err 防止第二次进入!!\n");
|
||
return;//防止第二次进入
|
||
}
|
||
CHAR_setWorkInt(meindex, CHAR_WORKTRADEMODE, CHAR_TRADE_LOCK);
|
||
//检查对方是否按下 ok
|
||
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);
|
||
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);
|
||
}
|
||
}
|
||
|
||
#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);
|
||
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);
|
||
}
|
||
#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);//最大堆叠数
|
||
ToMaxPile = CHAR_getMyMaxPilenum( toindex);
|
||
//移除meindex
|
||
//移除toindex
|
||
{
|
||
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);
|
||
}
|
||
//移除
|
||
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;
|
||
//加入
|
||
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;
|
||
//加入
|
||
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;
|
||
//加入
|
||
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;
|
||
//确定空位
|
||
if( TRADE_CheckTradeList( meindex, &TradeListTemp[0], toindex, &TradeListTemp[1]) == FALSE ) return -1;
|
||
//移除人物身上
|
||
//加入人物身上
|
||
#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;
|
||
//交易结束动作
|
||
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 }; //对方所有的交易内容编号
|
||
int ii , jj;
|
||
int Iitem1[15] = { 0 } ; //我方道具的index
|
||
int Iitem2[15] = { 0 } ; //对方道具的index
|
||
int ppet1[5] = { 0 } ; //我方宠物的index
|
||
int ppet2[5] = { 0 } ; //对方宠物的index
|
||
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 新交易系统
|
||
//取得我方所有交易内容编号
|
||
for ( ii = 0 ; ii < 42 ; ii ++ ) {
|
||
if (getStringFromIndexWithDelim(itembuf, "|", 6 + ii * 2 , token, sizeof(token)) == TRUE)
|
||
myItem[ii] = atoi(token);
|
||
}
|
||
//取得对方所有交易内容编号
|
||
for ( ii = 0 ; ii < 42 ; ii ++ ) {
|
||
if (getStringFromIndexWithDelim(toitembuf, "|", 6 + ii * 2 , token, sizeof(token)) == TRUE)
|
||
oppItem[ii] = atoi(token);
|
||
}
|
||
#else
|
||
// 比对双方之最後交易协定
|
||
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 新交易系统
|
||
//检查有无重复交易的道具
|
||
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 洗道具
|
||
if (itemindex1==itemindex2){
|
||
if (itemindex1!=-1){
|
||
return -1;
|
||
}
|
||
}
|
||
if (itemindex4==itemindex5){
|
||
if (itemindex4!=-1){
|
||
return -1;
|
||
}
|
||
}
|
||
// End
|
||
#endif
|
||
|
||
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
|
||
//比对双方交易的物品是否都正确
|
||
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;
|
||
}
|
||
}
|
||
//双方内容正确开始进行处理
|
||
if ( tradeflag == TRUE ) {
|
||
//计算双方道具的加减
|
||
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))
|
||
{
|
||
// 检验双方物品栏是否有空位
|
||
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 新交易系统
|
||
//取得交换的金钱
|
||
if ( myItem[20] != -1 ) gold1 += myItem[20] ;
|
||
if ( myItem[41] != -1 ) gold2 += myItem[41] ;
|
||
#else
|
||
// 检查双方金钱
|
||
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 新交易系统
|
||
//计算双方宠物的加减
|
||
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
|
||
// 检查双方宠物
|
||
if ((strcmp(c, "P") == 0) && (itemindex3 != -1))
|
||
{
|
||
pet1--; pet2++;
|
||
}
|
||
if ((strcmp(f, "P") == 0) && (itemindex6 != -1))
|
||
{
|
||
pet1++; pet2--;
|
||
}
|
||
#endif
|
||
|
||
#ifdef _TRADESYSTEM2 // (不可开) Syu ADD 新交易系统
|
||
if ((pet1 > 5) || (pet2 > 5)) return -10;
|
||
//取得双方身上能放的宠物数量
|
||
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
|
||
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
|
||
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 新交易系统
|
||
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 新交易系统
|
||
//宠物等级能否交易判断
|
||
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 新交易系统
|
||
//是否为家族守护兽
|
||
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 新交易系统
|
||
// 交换玩家道具、金钱、宠物
|
||
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
|
||
{
|
||
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;
|
||
// 道具 <-> 道具
|
||
if ((strcmp(a, "I") == 0) && (strcmp(b, "I") == 0))
|
||
{
|
||
// 无 <-> 道具
|
||
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);
|
||
}
|
||
// 道具 <-> 无
|
||
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);
|
||
}
|
||
// 道具 <-> 道具
|
||
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);
|
||
}
|
||
}
|
||
// 道具 <-> 金钱
|
||
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);
|
||
}
|
||
// 金钱 <-> 道具
|
||
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);
|
||
}
|
||
// 金钱 <-> 金钱
|
||
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);
|
||
}
|
||
// 宠物 <-> 宠物
|
||
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, "不会损坏"); //不会损坏
|
||
|
||
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 ) ){
|
||
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);
|
||
}else{
|
||
sprintf(szTemp1,"%s攻%s%d%s ",szTemp1,(ITEM_getInt(itemindex,ITEM_MODIFYATTACK)>=0)?"+":"",ITEM_getInt(itemindex,ITEM_MODIFYATTACK),attnum);
|
||
}
|
||
}
|
||
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));
|
||
}else{
|
||
sprintf(szTemp1,"%s防%s%d ",szTemp1,(ITEM_getInt(itemindex,ITEM_MODIFYDEFENCE)>=0)?"+":"",ITEM_getInt(itemindex,ITEM_MODIFYDEFENCE));
|
||
}
|
||
}
|
||
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));
|
||
}else{
|
||
sprintf(szTemp1,"%s敏%s%d ",szTemp1,(ITEM_getInt(itemindex,ITEM_MODIFYQUICK)>=0)?"+":"",ITEM_getInt(itemindex,ITEM_MODIFYQUICK));
|
||
}
|
||
}
|
||
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)
|
||
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);//最大堆叠数
|
||
ToMaxPile = CHAR_getMyMaxPilenum( toindex);
|
||
|
||
MeSurplus = CHAR_findSurplusItemBox( meindex);
|
||
ToSurplus = CHAR_findSurplusItemBox( toindex);
|
||
//道具
|
||
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);
|
||
return FALSE;
|
||
}
|
||
if( ToSurplus < (ToNeeds+MeNeeds) ){
|
||
CHAR_talkToCli( toindex, -1, "交易後物品栏位不足。", CHAR_COLORYELLOW);
|
||
CHAR_talkToCli( meindex, -1, "对方交易後物品栏位不足。", CHAR_COLORYELLOW);
|
||
return FALSE;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if( MeSurplus < MeNeeds ){
|
||
CHAR_talkToCli( meindex, -1, "交易後物品栏位不足。", CHAR_COLORYELLOW);
|
||
CHAR_talkToCli( toindex, -1, "对方交易後物品栏位不足。", CHAR_COLORYELLOW);
|
||
return FALSE;
|
||
}
|
||
if( ToSurplus < ToNeeds ){
|
||
CHAR_talkToCli( toindex, -1, "交易後物品栏位不足。", CHAR_COLORYELLOW);
|
||
CHAR_talkToCli( meindex, -1, "对方交易後物品栏位不足。", CHAR_COLORYELLOW);
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
//宠物
|
||
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);
|
||
return FALSE;
|
||
}
|
||
if( ToSurplus < (ToNeeds+MeNeeds) ){
|
||
CHAR_talkToCli( meindex, -1, "对方交易後宠物栏位不足。", CHAR_COLORYELLOW);
|
||
CHAR_talkToCli( toindex, -1, "交易後宠物栏位不足。", CHAR_COLORYELLOW);
|
||
return FALSE;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if( MeSurplus < MeNeeds ){
|
||
CHAR_talkToCli( meindex, -1, "交易後宠物栏位不足。", CHAR_COLORYELLOW);
|
||
CHAR_talkToCli( toindex, -1, "对方交易後宠物栏位不足。", CHAR_COLORYELLOW);
|
||
return FALSE;
|
||
}
|
||
if( ToSurplus < ToNeeds ){
|
||
CHAR_talkToCli( meindex, -1, "对方交易後宠物栏位不足。", CHAR_COLORYELLOW);
|
||
CHAR_talkToCli( toindex, -1, "交易後宠物栏位不足。", CHAR_COLORYELLOW);
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
|
||
//金钱
|
||
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);
|
||
return FALSE;
|
||
}
|
||
if( ToSurplus < (ToNeeds+MeNeeds) ){
|
||
CHAR_talkToCli( meindex, -1, "对方交易後石币超过上限。", CHAR_COLORYELLOW);
|
||
CHAR_talkToCli( toindex, -1, "交易後石币超过上限。", CHAR_COLORYELLOW);
|
||
return FALSE;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if( MeSurplus < MeNeeds ){
|
||
CHAR_talkToCli( meindex, -1, "交易後石币超过上限。", CHAR_COLORYELLOW);
|
||
CHAR_talkToCli( toindex, -1, "对方交易後石币超过上限。", CHAR_COLORYELLOW);
|
||
return FALSE;
|
||
}
|
||
if( ToSurplus < ToNeeds ){
|
||
CHAR_talkToCli( meindex, -1, "对方交易後石币超过上限。", CHAR_COLORYELLOW);
|
||
CHAR_talkToCli( toindex, -1, "交易後石币超过上限。", CHAR_COLORYELLOW);
|
||
return FALSE;
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
#endif
|