?? trade.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"
#ifdef _TRADESYSTEM2 // (不可開) Syu ADD 新交易系統
#include "pet_skill.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 _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];
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 );
if( !ITEM_CHECKINDEX( itemindex)) return FALSE;
if( ITEM_getInt( itemindex, ITEM_VANISHATDROP) == 1 ){
char buf[256];
sprintf( buf, "%s無法交易。", ITEM_getChar( itemindex, ITEM_NAME) );
CHAR_talkToCli( meindex, -1, buf, CHAR_COLORYELLOW);
return FALSE;
}
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;
}
}
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;
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 0 // Robin fix
//#ifdef _DEATH_FAMILY_GM_COMMAND // WON ADD 家族戰GM指令
{
char msgbuf[512];
snprintf( msgbuf, sizeof( msgbuf), "跨星系家族PK,無法交易");
CHAR_talkToCli( meindex, -1, msgbuf, CHAR_COLORWHITE);
return FALSE;
}
#endif
// 若玩家狀態為交易中或交易鎖定中則不予處理
if (CHAR_getWorkInt(meindex, CHAR_WORKTRADEMODE) == CHAR_TRADE_TRADING
|| CHAR_getWorkInt(meindex, CHAR_WORKTRADEMODE) == CHAR_TRADE_LOCK)
return FALSE;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -