?? trade.c
字號:
// 若玩家狀態為組隊或戰斗中則不予處理
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);
else if (result == 1)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -