📄 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"#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 "交易取消!"enum{ TRADE_ITEM=0, TRADE_PET, TRADE_GOLD,};#define MAX_TRADELISTNUM 100typedef 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];BOOL TRADE_CheckTradeList( int meindex, STradeList *temp1, int toindex, STradeList *temp2);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 't': // 显示交易的物品、金钱、宠物 TRADE_ShowItem(fd, index, message); break; case 'w': // 关闭交易 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; 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); for (i = 0; i < CONNECT_WINDOWBUFSIZE; i++) CONNECT_setTradecharaindex(fd, i, -1); 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; } CONNECT_setTradecharaindex(fd, cnt, index); 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){ int toindex; toindex = CONNECT_getCharaindex(tofd); if( !CHAR_CHECKINDEX(toindex)) return FALSE; 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; char token[256]; if (!CHAR_CHECKINDEX(meindex)) return; if (*message == 0) return; strcpy(mycharaname, CHAR_getChar(meindex, CHAR_NAME)); 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); 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 ); }}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)); if (getStringFromIndexWithDelim(message, "|", 2, token, sizeof(token)) == FALSE) return; tofd = atoi(token); toindex = CONNECT_getCharaindex(tofd); 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; 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{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -