⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trade.c

📁 石器时代2.0完整版源代码.已经加入新功能. 在REDHAT9下GCC3.4编译成功.
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -