StoneAge/gmsv/char/char_item.c
2018-08-07 00:51:35 -07:00

2356 lines
71 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "version.h"
#include <stdio.h>
#include "readmap.h"
#include "map_deal.h"
#include "object.h"
#include "char.h"
#include "char_base.h"
#include "item.h"
#include "lssproto_serv.h"
#include "handletime.h"
#include "log.h"
#include "item_event.h"
#include "battle.h"
#include "petmail.h"
#ifdef _MARKET_TRADE
#include "item_trade.h"
#endif
#ifdef _DROPSTAKENEW
#define CASINOTOKENID 20121 // 游乐场彩券代号
#define MAXCASINOMAPNUM 150 // 游乐场地图上限
#define MAXACCUMULATION 1000000 // 积分上限
typedef struct tagCasinoMapTable
{
int casinofl; // 游乐场图层
int casinox; // 游乐场X座标
int casinoy; // 游乐场Y座标
int casinotype; // 赌注类型
int dropflag; // 是否可下注 flag
char casinoinfo[64]; // 赌注类型说明
int accumulation; // 积分
int stakenum; // 彩券数量
}CasinoMapTable;
CasinoMapTable casinomap[MAXCASINOMAPNUM] =
{
{ 7008, 13, 13, DICE_BIG, 1, "骰子-大", 1, 0},
{ 7008, 14, 13, DICE_BIG, 1, "骰子-大", 1, 0},
{ 7008, 15, 13, DICE_BIG, 1, "骰子-大", 1, 0},
{ 7008, 16, 13, DICE_BIG, 1, "骰子-大", 1, 0},
{ 7008, 17, 13, DICE_BIG, 1, "骰子-大", 1, 0},
{ 7008, 13, 14, DICE_BIG, 1, "骰子-大", 1, 0},
{ 7008, 14, 14, DICE_BIG, 1, "骰子-大", 1, 0},
{ 7008, 15, 14, DICE_BIG, 1, "骰子-大", 1, 0},
{ 7008, 16, 14, DICE_BIG, 1, "骰子-大", 1, 0},
{ 7008, 17, 14, DICE_BIG, 1, "骰子-大", 1, 0},
{ 7008, 13, 15, DICE_BIG, 1, "骰子-大", 1, 0},
{ 7008, 14, 15, DICE_BIG, 1, "骰子-大", 1, 0},
{ 7008, 15, 15, DICE_BIG, 1, "骰子-大", 1, 0},
{ 7008, 16, 15, DICE_BIG, 1, "骰子-大", 1, 0},
{ 7008, 17, 15, DICE_BIG, 1, "骰子-大", 1, 0},
{ 7008, 8, 13, DICE_SMALL, 1, "骰子-小", 1, 0},
{ 7008, 9, 13, DICE_SMALL, 1, "骰子-小", 1, 0},
{ 7008, 10, 13, DICE_SMALL, 1, "骰子-小", 1, 0},
{ 7008, 11, 13, DICE_SMALL, 1, "骰子-小", 1, 0},
{ 7008, 12, 13, DICE_SMALL, 1, "骰子-小", 1, 0},
{ 7008, 8, 14, DICE_SMALL, 1, "骰子-小", 1, 0},
{ 7008, 9, 14, DICE_SMALL, 1, "骰子-小", 1, 0},
{ 7008, 10, 14, DICE_SMALL, 1, "骰子-小", 1, 0},
{ 7008, 11, 14, DICE_SMALL, 1, "骰子-小", 1, 0},
{ 7008, 12, 14, DICE_SMALL, 1, "骰子-小", 1, 0},
{ 7008, 8, 15, DICE_SMALL, 1, "骰子-小", 1, 0},
{ 7008, 9, 15, DICE_SMALL, 1, "骰子-小", 1, 0},
{ 7008, 10, 15, DICE_SMALL, 1, "骰子-小", 1, 0},
{ 7008, 11, 15, DICE_SMALL, 1, "骰子-小", 1, 0},
{ 7008, 12, 15, DICE_SMALL, 1, "骰子-小", 1, 0},
{ 7005, 22, 21, PET_RACE1, 1, "竞速场-宠物1", 2, 0},
{ 7005, 23, 21, PET_RACE1, 1, "竞速场-宠物1", 2, 0},
{ 7005, 24, 21, PET_RACE1, 1, "竞速场-宠物1", 2, 0},
{ 7005, 25, 21, PET_RACE1, 1, "竞速场-宠物1", 2, 0},
{ 7005, 26, 21, PET_RACE1, 1, "竞速场-宠物1", 2, 0},
{ 7005, 27, 21, PET_RACE1, 1, "竞速场-宠物1", 2, 0},
{ 7005, 28, 21, PET_RACE1, 1, "竞速场-宠物1", 2, 0},
{ 7005, 22, 24, PET_RACE2, 1, "竞速场-宠物2", 2, 0},
{ 7005, 23, 24, PET_RACE2, 1, "竞速场-宠物2", 2, 0},
{ 7005, 24, 24, PET_RACE2, 1, "竞速场-宠物2", 2, 0},
{ 7005, 25, 24, PET_RACE2, 1, "竞速场-宠物2", 2, 0},
{ 7005, 26, 24, PET_RACE2, 1, "竞速场-宠物2", 2, 0},
{ 7005, 27, 24, PET_RACE2, 1, "竞速场-宠物2", 2, 0},
{ 7005, 28, 24, PET_RACE2, 1, "竞速场-宠物2", 2, 0},
{ 7005, 22, 27, PET_RACE3, 1, "竞速场-宠物3", 2, 0},
{ 7005, 23, 27, PET_RACE3, 1, "竞速场-宠物3", 2, 0},
{ 7005, 24, 27, PET_RACE3, 1, "竞速场-宠物3", 2, 0},
{ 7005, 25, 27, PET_RACE3, 1, "竞速场-宠物3", 2, 0},
{ 7005, 26, 27, PET_RACE3, 1, "竞速场-宠物3", 2, 0},
{ 7005, 27, 27, PET_RACE3, 1, "竞速场-宠物3", 2, 0},
{ 7005, 28, 27, PET_RACE3, 1, "竞速场-宠物3", 2, 0},
{ 7003, 21, 15, ROULETTE1, 1, "轮盘红1", 1, 0}, { 7003, 17, 15, ROULETTE3, 1, "轮盘红3", 1, 0},
{ 7003, 13, 15, ROULETTE5, 1, "轮盘红5", 1, 0}, { 7003, 21, 21, ROULETTE6, 1, "轮盘红6", 1, 0},
{ 7003, 17, 21, ROULETTE8, 1, "轮盘红8", 1, 0}, { 7003, 15, 21, ROULETTE9, 1, "轮盘红9", 1, 0},
{ 7003, 13, 21, ROULETTE10, 1, "轮盘红10", 1, 0}, { 7003, 13, 18, ROULETTE13, 1, "轮盘红13", 1, 0},
{ 7003, 9, 21, ROULETTE17, 1, "轮盘红17", 1, 0}, { 7003, 21, 18, ROULETTE18, 1, "轮盘红18", 1, 0},
{ 7003, 19, 15, ROULETTE22, 1, "轮盘绿2", 1, 0}, { 7003, 15, 15, ROULETTE24, 1, "轮盘绿4", 1, 0},
{ 7003, 19, 21, ROULETTE27, 1, "轮盘绿7", 1, 0}, { 7003, 11, 15, ROULETTE31, 1, "轮盘绿11", 1, 0},
{ 7003, 9, 15, ROULETTE32, 1, "轮盘绿12", 1, 0}, { 7003, 11, 18, ROULETTE34, 1, "轮盘绿14", 1, 0},
{ 7003, 9, 18, ROULETTE35, 1, "轮盘绿15", 1, 0}, { 7003, 11, 21, ROULETTE36, 1, "轮盘绿16", 1, 0},
{ 7003, 19, 18, ROULETTE39, 1, "轮盘绿19", 1, 0}, { 7003, 17, 18, ROULETTE40, 1, "轮盘绿20", 1, 0},
{ 7003, 17, 24, ROULETTE41, 1, "轮盘红", 1, 0}, { 7003, 16, 24, ROULETTE41, 1, "轮盘红", 1, 0},
{ 7003, 17, 25, ROULETTE41, 1, "轮盘红", 1, 0}, { 7003, 16, 25, ROULETTE41, 1, "轮盘红", 1, 0},
{ 7003, 14, 24, ROULETTE42, 1, "轮盘绿", 1, 0}, { 7003, 13, 24, ROULETTE42, 1, "轮盘绿", 1, 0},
{ 7003, 14, 25, ROULETTE42, 1, "轮盘绿", 1, 0}, { 7003, 13, 25, ROULETTE42, 1, "轮盘绿", 1, 0},
// WON ADD 修正地图上单双的错误
{ 7003, 11, 24, ROULETTE43, 1, "轮盘单", 1, 0}, { 7003, 10, 24, ROULETTE43, 1, "轮盘单", 1, 0},
{ 7003, 11, 25, ROULETTE43, 1, "轮盘单", 1, 0}, { 7003, 10, 25, ROULETTE43, 1, "轮盘单", 1, 0},
{ 7003, 20, 24, ROULETTE44, 1, "轮盘双", 1, 0}, { 7003, 19, 24, ROULETTE44, 1, "轮盘双", 1, 0},
{ 7003, 20, 25, ROULETTE44, 1, "轮盘双", 1, 0}, { 7003, 19, 25, ROULETTE44, 1, "轮盘双", 1, 0},
{ 7003, 20, 15, (ROULETTE1<<16)+ROULETTE22, 1, "双号红1绿2", 1, 0},
{ 7003, 18, 15, (ROULETTE3<<16)+ROULETTE22, 1, "双号红3绿2", 1, 0},
{ 7003, 16, 15, (ROULETTE3<<16)+ROULETTE24, 1, "双号红3绿4", 1, 0},
{ 7003, 14, 15, (ROULETTE5<<16)+ROULETTE24, 1, "双号红5绿4", 1, 0},
{ 7003, 12, 15, (ROULETTE5<<16)+ROULETTE31, 1, "双号红5绿11", 1, 0},
{ 7003, 10, 15, (ROULETTE32<<16)+ROULETTE31, 1, "双号绿12绿11", 1, 0},
{ 7003, 20, 18, (ROULETTE18<<16)+ROULETTE39, 1, "双号红18绿19", 1, 0},
{ 7003, 18, 18, (ROULETTE40<<16)+ROULETTE39, 1, "双号绿20绿19", 1, 0},
{ 7003, 16, 18, (ROULETTE40<<16)+ROULETTE45, 1, "双号绿20黑00", 1, 0},
{ 7003, 14, 18, (ROULETTE13<<16)+ROULETTE45, 1, "双号红13黑00", 1, 0},
{ 7003, 12, 18, (ROULETTE13<<16)+ROULETTE34, 1, "双号红13绿14", 1, 0},
{ 7003, 10, 18, (ROULETTE35<<16)+ROULETTE34, 1, "双号绿15绿14", 1, 0},
{ 7003, 20, 21, (ROULETTE6<<16) +ROULETTE27, 1, "双号红6绿7", 1, 0},
{ 7003, 18, 21, (ROULETTE8<<16) +ROULETTE27, 1, "双号红8绿7", 1, 0},
{ 7003, 16, 21, (ROULETTE8<<16) + ROULETTE9, 1, "双号红8红9", 1, 0},
{ 7003, 14, 21, (ROULETTE10<<16)+ ROULETTE9, 1, "双号红10红9", 1, 0},
{ 7003, 12, 21, (ROULETTE10<<16)+ROULETTE36, 1, "双号红10绿16", 1, 0},
{ 7003, 10, 21, (ROULETTE17<<16)+ROULETTE36, 1, "双号红17绿16", 1, 0},
{ 7003, 8, 15, ROULETTE51, 1, "横列1", 1, 0}, //横列
{ 7003, 8, 18, ROULETTE52, 1, "横列2", 1, 0},
{ 7003, 8, 21, ROULETTE53, 1, "横列3", 1, 0},
{ 7003, 6, 15, ROULETTE61, 1, "号码1-10", 1, 0}, //1到10
{ 7003, 5, 15, ROULETTE61, 1, "号码1-10", 1, 0},
{ 7003, 6, 16, ROULETTE61, 1, "号码1-10", 1, 0},
{ 7003, 5, 16, ROULETTE61, 1, "号码1-10", 1, 0},
{ 7003, 24, 15, ROULETTE62, 1, "号码11-20", 1, 0}, //10到11
{ 7003, 23, 15, ROULETTE62, 1, "号码11-20", 1, 0},
{ 7003, 24, 16, ROULETTE62, 1, "号码11-20", 1, 0},
{ 7003, 23, 16, ROULETTE62, 1, "号码11-20", 1, 0},
{ 7003, 15, 18, ROULETTE45, 1, "轮盘()", 1, 0},
};
#endif
static char CHAR_sendItemBuffer[STRINGBUFSIZ];
BOOL CHAR_sendItemDataOne( int charaindex, int haveitemindex)
{
int itemgrp[1];
itemgrp[0] = haveitemindex;
return CHAR_sendItemData( charaindex, itemgrp, 1);
}
BOOL CHAR_sendItemData( int charaindex, int *itemgroup, int num)
{
int i;
int strlength = 0;
int fd;
if( num <= 0 || num > CHAR_MAXITEMHAVE) return FALSE;
if( CHAR_getInt(charaindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ) {
return FALSE;
}
for( i = 0; i < num; i ++ ) {
char token[512];
int itemindex;
DebugPoint = 200;
if( !CHAR_CHECKITEMINDEX( charaindex, itemgroup[i])) {
continue;
}
itemindex = CHAR_getItemIndex( charaindex, itemgroup[i] );
if( itemindex >= 0 ) {
snprintf( token ,sizeof(token),"%s|" ,
ITEM_makeItemStatusString( itemgroup[i],itemindex ) );
}else {
snprintf( token ,sizeof(token),"%s|" ,
ITEM_makeItemFalseStringWithNum( itemgroup[i]) );
}
strcpysafe( CHAR_sendItemBuffer + strlength,
sizeof(CHAR_sendItemBuffer) - strlength, token );
strlength += strlen( token );
if( strlength >= arraysizeof(CHAR_sendItemBuffer) ) {
break;
}
}
dchop( CHAR_sendItemBuffer , "|" );
fd = getfdFromCharaIndex( charaindex );
if( fd != -1 ){
lssproto_I_send( fd, CHAR_sendItemBuffer );
return TRUE;
}
return FALSE;
}
static void CHAR_sendItemDetachEvent( int charaindex,int itemid )
{
char mesg[256];
snprintf( mesg, sizeof( mesg), "卸下%s ", ITEM_getAppropriateName(itemid) );
CHAR_talkToCli(charaindex,-1,mesg,CHAR_COLORWHITE);
#ifdef _ITEM_METAMO
if( ITEM_getEquipPlace( charaindex, itemid) == CHAR_BODY
&& CHAR_getWorkInt( charaindex, CHAR_WORKITEMMETAMO) != 0 ) {
CHAR_setWorkInt( charaindex, CHAR_WORKITEMMETAMO, 0);
CHAR_setWorkInt( charaindex, CHAR_WORKNPCMETAMO, 0 ); //与npc对话後的变身也要变回来
CHAR_complianceParameter( charaindex);
CHAR_sendCToArroundCharacter( CHAR_getWorkInt( charaindex , CHAR_WORKOBJINDEX ));
CHAR_send_P_StatusString( charaindex , CHAR_P_STRING_BASEBASEIMAGENUMBER);
CHAR_talkToCli( charaindex, -1, "变身失效了!", CHAR_COLORWHITE);
}
#endif
{
typedef void (*DETACHFUNC)(int,int);
DETACHFUNC def;
def=(DETACHFUNC)ITEM_getFunctionPointer(itemid,ITEM_DETACHFUNC);
if( def ) {
def( charaindex,itemid );
}
}
}
static void CHAR_sendItemAttachEvent( int charaindex,int itemid )
{
char mesg[256];
snprintf( mesg, sizeof( mesg), "装备%s ",
ITEM_getAppropriateName(itemid) );
CHAR_talkToCli(charaindex,-1,mesg,CHAR_COLORWHITE);
{
typedef void (*ATTACHFUNC)(int,int);
ATTACHFUNC atf;
atf=(ATTACHFUNC)ITEM_getFunctionPointer(itemid,ITEM_ATTACHFUNC);
if( atf )
atf( charaindex,itemid );
}
}
int CHAR_findSurplusItemBox( int charaindex )
{
int i, remnants=0, itemindex;
for(i=CHAR_STARTITEMARRAY; i< CHAR_MAXITEMHAVE; i++){
itemindex = CHAR_getItemIndex( charaindex , i );
if( itemindex == -1 ) remnants++;
}
return remnants;
}
static int CHAR_findEmptyItemBoxFromChar( Char* ch )
{
int i;
for( i = CHAR_STARTITEMARRAY ; i < CHAR_MAXITEMHAVE ; i ++ ){
int itemindex;
itemindex = ch->indexOfExistItems[i];
if( itemindex == -1 )return i;
}
return -1;
}
static int CHAR_findEmptyPoolItemBoxFromChar( Char* ch )
{
int i;
for( i=0; i<CHAR_MAXPOOLITEMHAVE; i++ ){
int itemindex;
itemindex = ch->indexOfExistPoolItems[i];
if( itemindex == -1 ) return i;
}
return -1;
}
int CHAR_findEmptyPoolItemBox( int index )
{
Char* ch;
if( !CHAR_CHECKINDEX( index ) )return -1;
ch = CHAR_getCharPointer(index);
if( ch != NULL )
return CHAR_findEmptyPoolItemBoxFromChar( ch );
else
return -1;
}
int CHAR_findEmptyItemBox( int index )
{
Char* ch;
if( !CHAR_CHECKINDEX( index ) )return -1;
ch = CHAR_getCharPointer(index);
if( ch != NULL )
return CHAR_findEmptyItemBoxFromChar( ch );
else
return -1;
}
#define LACKOFCLASS {CHAR_talkToCli(index,-1,"能力不足无法装备。",CHAR_COLORWHITE);}
#define CANNOTEQUIP {CHAR_talkToCli(index,-1,"无法装备该项物品。",CHAR_COLORWHITE);}
#define CANNOTEQUIP2 {CHAR_talkToCli(index,-1,"无法同时装备两项同种类的物品。",CHAR_COLORWHITE);}
#define CANNOTEXCHANGE {CHAR_talkToCli(index,-1,"无法交换此两项物品。",CHAR_COLORWHITE);}
#define CANNOTMOVE {CHAR_talkToCli(index,-1,"无法移动该项物品。",CHAR_COLORWHITE);}
static BOOL CHAR_sendSIToCli( int charindex , int from , int to )
{
int fd = getfdFromCharaIndex( charindex );
if( fd != -1 ){
lssproto_SI_send( fd , from, to );
return TRUE;
}
return FALSE;
}
static BOOL CHAR_moveItemFromItemBoxToEquip( int index, int fromindex,
int toindex )
{
int fromid,toid;
int fromeqplace;
BOOL flg = FALSE;
if( !CHAR_CHECKINDEX( index ) )return FALSE;
fromid = CHAR_getItemIndex(index,fromindex);
toid = CHAR_getItemIndex(index,toindex);
if( !ITEM_CHECKINDEX( fromid) )
return FALSE;
if( CHAR_getInt( index, CHAR_TRANSMIGRATION ) <= 0 ){
if( ITEM_getInt(fromid,ITEM_LEVEL) > CHAR_getInt(index,CHAR_LV) ){
LACKOFCLASS;
return FALSE;
}
}
#ifdef _ITEMSET4_TXT
if( CHAR_getInt( index, CHAR_STR) < ITEM_getInt( fromid, ITEM_NEEDSTR) ) return FALSE;
if( CHAR_getInt( index, CHAR_DEX) < ITEM_getInt( fromid, ITEM_NEEDDEX) ) return FALSE;
if( CHAR_getInt( index, CHAR_TRANSMIGRATION) < ITEM_getInt( fromid, ITEM_NEEDTRANS) ) return FALSE;
#ifdef _CHAR_PROFESSION // WON ADD 人物职业
if( ITEM_getInt( fromid, ITEM_NEEDPROFESSION) != 0 ){
if( CHAR_getInt( index, PROFESSION_CLASS ) != ITEM_getInt( fromid, ITEM_NEEDPROFESSION) )
return FALSE;
}
#endif
#endif
#ifdef _FIXBUG_ATTACKBOW
{
if( CHAR_getWorkInt( index, CHAR_WORKITEMMETAMO) > 0 ||
CHAR_getWorkInt( index, CHAR_WORKNPCMETAMO) > 0
|| CHAR_getWorkInt( index, CHAR_WORKFOXROUND ) != -1){ //若是变成小狐狸
int armtype = ITEM_getInt( fromid, ITEM_TYPE );
if( armtype == ITEM_BOW || armtype == ITEM_BOUNDTHROW ||
armtype == ITEM_BREAKTHROW || armtype == ITEM_BOOMERANG) {
CHAR_talkToCli( index, -1, "变身无法使用远距离武器!", CHAR_COLORYELLOW );
return FALSE;
}
}
}
#endif
#ifdef _ANGEL_SUMMON
//if( !strcmp( ITEM_getChar( fromid, ITEM_USEFUNC), "ITEM_AngelToken") ) {
if( ITEM_getInt( fromid, ITEM_ID) == ANGELITEM ) {
int mindex;
char nameinfo[64];
mindex = checkIfAngel( index);
getMissionNameInfo( index, nameinfo);
if( mindex < 0 ||
strcmp( ITEM_getChar( fromid, ITEM_ANGELINFO), missiontable[mindex].angelinfo) ||
strcmp( ITEM_getChar( fromid, ITEM_HEROINFO), missiontable[mindex].heroinfo) ||
strcmp( ITEM_getChar( fromid, ITEM_ANGELINFO), nameinfo) ) {
CHAR_talkToCli( index, -1, "这并不是属於你的信物,无法装备。", CHAR_COLORYELLOW );
return FALSE;
}
}
#endif
fromeqplace = ITEM_getEquipPlace( index, fromid );
if( fromeqplace == -1 ){
CANNOTEQUIP;
return FALSE;
}
//if( BATTLE_GetWepon( charaindex ) != ITEM_BOW )
if( fromeqplace == CHAR_DECORATION1 ) {
int checkplace = ( toindex == CHAR_DECORATION1)
? CHAR_DECORATION2:CHAR_DECORATION1;
int otheritemindex;
if( toindex == CHAR_DECORATION1 || toindex == CHAR_DECORATION2 ) {
otheritemindex = CHAR_getItemIndex( index, checkplace);
if( ITEM_CHECKINDEX( otheritemindex )) {
int otheritemtype = ITEM_getInt( otheritemindex, ITEM_TYPE);
int myitemtype = ITEM_getInt( CHAR_getItemIndex( index, fromindex) , ITEM_TYPE);
if( otheritemtype == myitemtype) {
if( toid < 0 ) {
CANNOTEQUIP2;
}else {
CANNOTEXCHANGE;
}
return FALSE;
}
}
flg = TRUE;
}
}else {
if( toindex == fromeqplace) flg = TRUE;
}
if( flg ){
CHAR_setItemIndex(index,toindex,fromid);
CHAR_setItemIndex(index,fromindex,toid);
if( toid != -1 ) {
CHAR_sendItemDetachEvent( index, toid );
}
#ifdef _CHECK_ITEM_MODIFY
ITEM_checkItemModify( index, fromid);
#endif
CHAR_sendItemAttachEvent( index, fromid );
CHAR_sendSIToCli( index, fromindex,toindex );
}else {
CANNOTEQUIP;
return FALSE;
}
#if 0 //#ifdef _ANGEL_SUMMON
//if( !strcmp( ITEM_getChar( fromid, ITEM_USEFUNC), "ITEM_AngelToken") ) {
if( ITEM_getInt( fromid, ITEM_ID) == ANGELITEM ) {
print(" 装备使者信物 ");
CHAR_talkToCli( index, -1, "你受到了精灵保护,不会被敌人攻击。", CHAR_COLORYELLOW );
//CHAR_setWorkInt( index, CHAR_WORKANGELMODE, TRUE);
CHAR_sendAngelMark( CHAR_getWorkInt( index, CHAR_WORKOBJINDEX), 1);
}
#endif
return TRUE;
}
static BOOL CHAR_moveItemFromEquipToItemBox(int index, int fromindex,
int toindex)
{
int fromid,toid;
if( !CHAR_CHECKINDEX( index )) return FALSE;
fromid = CHAR_getItemIndex(index,fromindex);
toid = CHAR_getItemIndex(index,toindex);
if( fromid < 0 )
return FALSE;
else if( toid < 0 ){
CHAR_setItemIndex(index,toindex,fromid);
CHAR_setItemIndex(index,fromindex,-1);
CHAR_sendItemDetachEvent( index,fromid );
CHAR_sendSIToCli( index,fromindex,toindex);
#if 0 //#ifdef _ANGEL_SUMMON
//if( !strcmp( ITEM_getChar( fromid, ITEM_USEFUNC), "ITEM_AngelToken") ) {
if( ITEM_getInt( fromid, ITEM_ID) == ANGELITEM ) {
print(" 卸下使者信物 ");
CHAR_setWorkInt( index, CHAR_WORKANGELMODE, FALSE);
CHAR_sendAngelMark( CHAR_getWorkInt( index, CHAR_WORKOBJINDEX), 0);
}
#endif
return TRUE;
}
return CHAR_moveItemFromItemBoxToEquip(index, toindex,fromindex);
}
#ifdef _ITEM_PILENUMS
int CHAR_getMyMaxPilenum( int charaindex)
{
int maxpile;
maxpile = CHAR_getInt( charaindex, CHAR_TRANSMIGRATION)
+ (CHAR_getInt( charaindex, CHAR_TRANSMIGRATION)/5) * 2 + 3;
/*
#ifdef _PROFESSION_SKILL // WON ADD 人物职业技能
maxpile += CHAR_getInt( charaindex, ATTACHPILE );
#endif
*/
#ifdef _EQUIT_ADDPILE
maxpile += CHAR_getWorkInt( charaindex, CHAR_WORKATTACHPILE);
maxpile = (maxpile<0)?0:maxpile;
#endif
return maxpile;
}
BOOL CHAR_PileItemFromItemBoxToItemBox( int charaindex, int fromindex, int toindex)
{
int maxpile, fromid, toid;
if( !CHAR_CHECKINDEX( charaindex) ) return FALSE;
fromid = CHAR_getItemIndex( charaindex, fromindex);
toid = CHAR_getItemIndex( charaindex, toindex);
maxpile = CHAR_getMyMaxPilenum( charaindex);
if( ITEM_CHECKINDEX( toid) && ITEM_CHECKINDEX( fromid) &&
(ITEM_getInt( toid, ITEM_ID) == ITEM_getInt( fromid, ITEM_ID)) &&
(ITEM_getInt( toid, ITEM_CANBEPILE) == 1) &&
(ITEM_getInt( toid, ITEM_USEPILENUMS) < maxpile) &&
(ITEM_getInt( fromid, ITEM_USEPILENUMS) < maxpile) ){
int formpilenum , pilenum, defpilenum;
pilenum = ITEM_getInt( toid, ITEM_USEPILENUMS);
formpilenum = ITEM_getInt( fromid, ITEM_USEPILENUMS);
defpilenum = ((maxpile-pilenum)>formpilenum)? formpilenum:(maxpile-pilenum);
formpilenum = formpilenum - defpilenum;
pilenum = pilenum + defpilenum;
ITEM_setInt( toid, ITEM_USEPILENUMS, pilenum);
ITEM_setInt( fromid, ITEM_USEPILENUMS, formpilenum);
if( formpilenum <= 0 ){
CHAR_setItemIndex( charaindex, fromindex ,-1);
ITEM_endExistItemsOne( fromid);
}
return TRUE;
}
return FALSE;
}
#endif
static BOOL CHAR_moveItemFromItemBoxToItemBox( int index, int fromindex, int toindex)
{
int fromid, toid;
if( !CHAR_CHECKINDEX( index ) ) return FALSE;
#ifdef _ITEM_PILENUMS
if( CHAR_PileItemFromItemBoxToItemBox( index, fromindex, toindex) == TRUE ){
CHAR_sendItemDataOne( index, toindex);
CHAR_sendItemDataOne( index, fromindex);
return TRUE;
}
#endif
fromid = CHAR_getItemIndex( index, fromindex);
toid = CHAR_getItemIndex( index, toindex);
CHAR_setItemIndex(index,toindex, CHAR_setItemIndex( index, fromindex, toid));
CHAR_sendSIToCli( index,fromindex,toindex);
return TRUE;
}
void CHAR_moveEquipItem( int index, int fromindex, int toindex )
{
#define MOVEITEM_NONE 0
#define MOVEITEM_EQUIPTOITEM 1 << 0
#define MOVEITEM_ITEMTOEQUIP 1 << 1
#define MOVEITEM_ITEMTOITEM 1 << 2
int fromid; /* item 匹及奶件犯永弁旦 */
unsigned int moved_any = 0;
while( 1) {
if( !CHAR_CHECKINDEX( index ) )break;
if( CHAR_getFlg( index,CHAR_ISDIE ) )break;
if( fromindex < 0 || fromindex >= CHAR_MAXITEMHAVE ||
toindex < 0 || toindex >= CHAR_MAXITEMHAVE )
break;
fromid = CHAR_getItemIndex(index,fromindex);
if( fromid == -1 || fromid == -2 )break;
if( fromindex == toindex )break;
if( fromindex < CHAR_EQUIPPLACENUM ){
if( toindex < CHAR_EQUIPPLACENUM ){
if( CHAR_getItemIndex(index,toindex) < 0 ){
CANNOTMOVE;
}else{
CANNOTEXCHANGE;
}
}else {
moved_any |= CHAR_moveItemFromEquipToItemBox(
index, fromindex, toindex )
? MOVEITEM_EQUIPTOITEM : MOVEITEM_NONE;
if( moved_any & MOVEITEM_EQUIPTOITEM) {
char category[3];
snprintf( category,sizeof( category),"J%d", fromindex);
CHAR_sendStatusString( index , category);
}
}
}else{
if( toindex < CHAR_EQUIPPLACENUM ) {
moved_any |= CHAR_moveItemFromItemBoxToEquip(
index, fromindex , toindex )
? MOVEITEM_ITEMTOEQUIP : MOVEITEM_NONE;
if( moved_any & MOVEITEM_ITEMTOEQUIP) {
char category[3];
snprintf( category,sizeof( category),"J%d", toindex);
CHAR_sendStatusString( index , category);
}
}else {
moved_any |= CHAR_moveItemFromItemBoxToItemBox( index,fromindex,toindex )
? MOVEITEM_ITEMTOITEM : MOVEITEM_NONE;
}
}
CHAR_complianceParameter( index );
CHAR_sendCToArroundCharacter(CHAR_getWorkInt(index, CHAR_WORKOBJINDEX));
break;
}
if( (moved_any & MOVEITEM_EQUIPTOITEM) || (moved_any & MOVEITEM_ITEMTOEQUIP)){
int i;
CHAR_send_P_StatusString( index,
CHAR_P_STRING_HP|CHAR_P_STRING_MAXHP|
CHAR_P_STRING_MP|CHAR_P_STRING_MAXMP|
CHAR_P_STRING_ATK|CHAR_P_STRING_DEF|
CHAR_P_STRING_QUICK|CHAR_P_STRING_CHARM|
CHAR_P_STRING_LUCK|CHAR_P_STRING_EARTH|
CHAR_P_STRING_WATER|CHAR_P_STRING_FIRE|
CHAR_P_STRING_WIND
);
if( CHAR_getWorkInt( index,CHAR_WORKBATTLEMODE ) == BATTLE_CHARMODE_NONE ){
for( i = 0; i < CHAR_MAXPETHAVE; i ++ ) {
int petindex = CHAR_getCharPet( index, i);
if( CHAR_CHECKINDEX( petindex) ) {
char category[3];
CHAR_complianceParameter( petindex );
snprintf( category, sizeof( category), "K%d",i);
CHAR_sendStatusString( index, category );
}
}
}
}
if( !moved_any ) {
CHAR_sendSIToCli( index,-1,-1);
}
}
int CHAR_addItemToChar( Char* ch, int itemid )
{
int itembox;
itembox = CHAR_findEmptyItemBoxFromChar( ch );
if( itembox == -1 )return -1;
return ch->indexOfExistItems[itembox]=ITEM_makeItemAndRegist(itemid);
}
int CHAR_addItem( int charaindex, int itemid )
{
Char* ch;
ch = CHAR_getCharPointer(charaindex);
if( ch != NULL ){
int ret = CHAR_addItemToChar( ch,itemid );
if( ret == -1 )return ret;
ITEM_setWorkInt(ret,ITEM_WORKCHARAINDEX,charaindex);
ITEM_setWorkInt(ret,ITEM_WORKOBJINDEX,-1);
return ret;
}else
return -1;
}
void CHAR_ItemUse( int charaindex, int to_charaindex, int haveitemindex )
{
void (*usefunc)(int,int,int)=NULL;
int itemindex;
if( !CHAR_CHECKINDEX( charaindex ) ){
print( "ANDY charaindex=%d err\n", charaindex);
return;
}
if( CHAR_CHECKITEMINDEX( charaindex, haveitemindex) == FALSE ){
print( "ANDY haveitemindex=%d err\n", haveitemindex);
return;
}
itemindex = CHAR_getItemIndex( charaindex, haveitemindex);
if( CHAR_getFlg( charaindex, CHAR_ISDIE ) ){
print( "ANDY charaindex=%d is CHAR_ISDIE err\n", charaindex);
return;
}
#ifdef _STREET_VENDOR
// 摆摊中不可使用道具
if(CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR) > -1){
print("StreetVendor use item charaindex=%d,name=%s\n",charaindex,CHAR_getChar(charaindex,CHAR_NAME));
return;
}
#endif
if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE ) {
if( CHAR_getInt( to_charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) {
int action = ITEM_getInt( itemindex, ITEM_USEACTION);
if( action != -1 ) {
CHAR_sendAction( to_charaindex, action, TRUE);
}
}
}
//不等於料理 和 其他
if( ITEM_getInt( itemindex,ITEM_TYPE) != ITEM_OTHER &&
ITEM_getInt( itemindex,ITEM_TYPE) != ITEM_DISH ) {
CHAR_EquipPlace ep;
ep = ITEM_getEquipPlace( charaindex, itemindex );
if( ep == -1 )return;
if( ep == CHAR_DECORATION1 ) {
int flg = FALSE;
int toitemindex1 = CHAR_getItemIndex( charaindex, ep);
int toitemindex2 = CHAR_getItemIndex( charaindex, CHAR_DECORATION2);
int searchindex = -1;
int fromitemtype = ITEM_getInt( itemindex, ITEM_TYPE);
if( !ITEM_CHECKINDEX( toitemindex1)) searchindex = toitemindex2;
else if(!ITEM_CHECKINDEX( toitemindex2)) searchindex = toitemindex1;
if( searchindex != -1 ) {
if( fromitemtype != ITEM_getInt( searchindex, ITEM_TYPE)) {
flg = TRUE;
ep = ( searchindex == toitemindex1)
? CHAR_DECORATION2:CHAR_DECORATION1;
}
}
if( !flg) {
if( fromitemtype != ITEM_getInt( toitemindex2, ITEM_TYPE)) {
ep = CHAR_DECORATION1;
}else if( fromitemtype != ITEM_getInt( toitemindex1, ITEM_TYPE)) {
ep = CHAR_DECORATION2;
}else {
ep = CHAR_DECORATION1;
}
}
}
CHAR_moveEquipItem( charaindex, haveitemindex,ep );
return;
}
usefunc = (void(*)(int,int,int))
ITEM_getFunctionPointer( itemindex,ITEM_USEFUNC );
if( usefunc ){
{
LogItem(
CHAR_getChar( charaindex, CHAR_NAME ), /* 平乓仿 */
CHAR_getChar( charaindex, CHAR_CDKEY ),
#ifdef _add_item_log_name // WON ADD 在item的log中增加item名称
itemindex,
#else
ITEM_getInt( itemindex, ITEM_ID ), /* 失奶 丞 寞 */
#endif
"Use(使用道具)",
CHAR_getInt( charaindex,CHAR_FLOOR),
CHAR_getInt( charaindex,CHAR_X ),
CHAR_getInt( charaindex,CHAR_Y ),
ITEM_getChar( itemindex, ITEM_UNIQUECODE),
ITEM_getChar( itemindex, ITEM_NAME),
ITEM_getInt( itemindex, ITEM_ID)
);
}
usefunc(charaindex, to_charaindex, haveitemindex);
}else{
char ansmsg[256];
strcpysafe( ansmsg, sizeof(ansmsg),
"什麽也没有发生。");
CHAR_talkToCli( charaindex, -1, ansmsg, CHAR_COLORWHITE );
}
}
BOOL CHAR_DropItemFXY( int charaindex, int itemcharaindex, int fl,
int x, int y, int* objindex )
{
int itemindex;
itemindex = CHAR_getItemIndex(charaindex,itemcharaindex);
if( ITEM_CHECKINDEX(itemindex) == FALSE )return -3;
if( MAP_walkAbleFromPoint( fl,x,y, FALSE ) == FALSE ){
return -2;
}
{
OBJECT object;
for( object=MAP_getTopObj(fl,x,y) ; object; object = NEXT_OBJECT(object ) ){
int objindex = GET_OBJINDEX(object);
switch( OBJECT_getType(objindex) ){
case OBJTYPE_NOUSE:
break;
case OBJTYPE_ITEM:
#ifdef _DROPSTAKENEW
if(ITEM_getInt(itemindex, ITEM_ID) == CASINOTOKENID)
{
int i = 0;
int dropflag = 0;
ITEM_Item *itm;
for(i = 0; i < arraysizeof(casinomap); i++){
if(CHAR_getInt(charaindex, CHAR_FLOOR) == casinomap[i].casinofl){
if(x == casinomap[i].casinox && y == casinomap[i].casinoy){
dropflag = 1;
break;
}
}
}
if(dropflag == 1){
if( (itm = ITEM_getItemPointer( itemindex)) == NULL ) return -1;
strcpysafe( itm->string[ITEM_WATCHFUNC].string,
sizeof(itm->string[ITEM_WATCHFUNC].string), "ITEM_DeleteTimeWatched" );
break;
}else{
return -1;
}
}
#endif
case OBJTYPE_GOLD:
{
return -1;
}
case OBJTYPE_CHARA:
{
typedef BOOL (*ITEMPUTFUNC)(int,int);
ITEMPUTFUNC ipfunc;
ipfunc = (ITEMPUTFUNC)CHAR_getFunctionPointer(
OBJECT_getIndex(objindex),CHAR_ITEMPUTFUNC) ;
if( ipfunc && ipfunc(OBJECT_getIndex(objindex),
itemindex) == TRUE)
return -3;
break;
}
default:
break;
}
}
*objindex = CHAR_DropItemAbsolute( itemindex,fl,x,y, FALSE );
if( *objindex == -1 )
return -3;
{
LogItem(
CHAR_getChar( charaindex, CHAR_NAME ), /* 平乓仿 */
CHAR_getChar( charaindex, CHAR_CDKEY ),
#ifdef _add_item_log_name // WON ADD 在item的log中增加item名称
itemindex,
#else
ITEM_getInt( itemindex, ITEM_ID ), /* 失奶 丞 寞 */
#endif
"Drop(丢出道具)",
CHAR_getInt( charaindex,CHAR_FLOOR),
CHAR_getInt( charaindex,CHAR_X ),
CHAR_getInt( charaindex,CHAR_Y ),
ITEM_getChar( itemindex, ITEM_UNIQUECODE),
ITEM_getChar( itemindex, ITEM_NAME),
ITEM_getInt( itemindex, ITEM_ID)
);
}
return 0;
}
}
#ifdef _ITEM_PILENUMS //andy_edit 2003/04/01
void CHAR_SendDropItem_Stats( int charaindex, int itemindex, int itemcharaindex, int flg)
{
if( flg == 1 ){
CHAR_setItemIndex( charaindex, itemcharaindex , -1);
}
CHAR_sendItemDataOne( charaindex, itemcharaindex);
if( CHAR_complianceParameter( charaindex ) ){
CHAR_sendCToArroundCharacter( CHAR_getWorkInt( charaindex, CHAR_WORKOBJINDEX));
}
if( 0 <= itemcharaindex && itemcharaindex < CHAR_STARTITEMARRAY &&
CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ){ //如果丢弃物为装备
if( ITEM_CHECKINDEX( itemindex) )
CHAR_sendItemDetachEvent( charaindex, itemindex );
CHAR_send_P_StatusString( charaindex,
CHAR_P_STRING_HP|CHAR_P_STRING_MAXHP|
CHAR_P_STRING_MP|CHAR_P_STRING_MAXMP|
CHAR_P_STRING_ATK|CHAR_P_STRING_DEF|
CHAR_P_STRING_QUICK|CHAR_P_STRING_CHARM|
CHAR_P_STRING_LUCK|CHAR_P_STRING_EARTH|
CHAR_P_STRING_WATER|CHAR_P_STRING_FIRE|
CHAR_P_STRING_WIND );
#if 0 //#ifdef _ANGEL_SUMMON
if( ITEM_getInt( itemindex, ITEM_ID) == ANGELITEM ) {
print(" 卸下使者信物 ");
CHAR_setWorkInt( index, CHAR_WORKANGELMODE, FALSE);
CHAR_sendAngelMark( CHAR_getWorkInt( charaindex, CHAR_WORKOBJINDEX), 0);
}
#endif
}
}
#ifdef _DROPSTAKENEW
void CHAR_DropStakeByDropItem( int charaindex, int itemcharaindex, int itemindex, int fl, int x, int y)
{
int j, k, casinoflag = 0, dropflag;
char tmpbuf[256];
dropflag = CHAR_getWorkInt( charaindex, CHAR_WORKSTAKEFLAG);
if( dropflag >= MAXSTAKENUM){
snprintf( tmpbuf, sizeof( tmpbuf), "你已经下注五次了,无法再下注!");
CHAR_talkToCli(charaindex, -1, tmpbuf, CHAR_COLORYELLOW);
return;
}
for (j = 0; j < arraysizeof( casinomap); j++){
if( CHAR_getInt( charaindex, CHAR_FLOOR) != casinomap[j].casinofl ) continue;
if( x != casinomap[j].casinox || y != casinomap[j].casinoy ) continue;
if( casinomap[j].dropflag == 0 ){
CHAR_talkToCli( charaindex, -1, "现在无法下注!", CHAR_COLORYELLOW);
return;
}else{
int objindex;
objindex = CHAR_DropItemAbsolute( itemindex, fl, x, y, FALSE );
if( objindex == -1 ) return;
ITEM_setInt( itemindex, ITEM_PUTTIME, NowTime.tv_sec+30*60);
CHAR_sendWatchEvent( objindex, CHAR_ACTSTAND, NULL, 0, TRUE);
casinoflag = 1;
snprintf(tmpbuf, sizeof(tmpbuf), "你在 %s 下注了一张彩券", casinomap[j].casinoinfo);
for(k = 0; k < MAXSTAKENUM; k++){//下注设定
if(CHAR_getWorkInt(charaindex, CHAR_WORKSTAKETYPE1 + k) != 0) continue;
CHAR_setWorkInt(charaindex, CHAR_WORKSTAKETYPE1 + k, casinomap[j].casinotype);
dropflag++;
break;
}
CHAR_talkToCli(charaindex, -1, tmpbuf, CHAR_COLORYELLOW);
#ifdef _FIX_GAMBLENUM
if (dropflag <= MAXSTAKENUM){ //做扣点的动作
int nAcc = CHAR_getInt(charaindex, CHAR_GAMBLENUM);
nAcc -= casinomap[j].accumulation;
CHAR_setInt(charaindex, CHAR_GAMBLENUM, nAcc);
}
#endif
dropflag = ( dropflag >= MAXSTAKENUM )?MAXSTAKENUM:dropflag;
CHAR_setWorkInt(charaindex, CHAR_WORKSTAKEFLAG, dropflag);
break;
}
}
if( casinoflag == 0) return;
LogItem(CHAR_getChar(charaindex, CHAR_NAME),
CHAR_getChar(charaindex, CHAR_CDKEY),
#ifdef _add_item_log_name // WON ADD 在item的log中增加item名称
itemindex,
#else
ITEM_getInt(itemindex, ITEM_ID),
#endif
"StakeDrop(丢出彩券)",
CHAR_getInt(charaindex,CHAR_FLOOR),
CHAR_getInt(charaindex,CHAR_X),
CHAR_getInt(charaindex,CHAR_Y),
ITEM_getChar(itemindex, ITEM_UNIQUECODE),
ITEM_getChar( itemindex, ITEM_NAME),
ITEM_getInt( itemindex, ITEM_ID)
);
CHAR_SendDropItem_Stats( charaindex, itemindex, itemcharaindex, 1);
}
#endif
BOOL CHAR_FindAroundUsabilitySpace( int charaindex, int itemindex, int *fl, int *x, int *y)
{
int dropx, dropy, i;
BOOL Find = FALSE;
int myfl = CHAR_getInt( charaindex, CHAR_FLOOR);
for( i = 0 ; i < 8 ; i ++ ){
OBJECT object;
Find = FALSE;
dropx = CHAR_getInt( charaindex, CHAR_X) + CHAR_getDX( CHAR_getInt( charaindex, CHAR_DIR) + i);
dropy = CHAR_getInt( charaindex, CHAR_Y) + CHAR_getDY( CHAR_getInt( charaindex, CHAR_DIR) + i);
if( MAP_walkAbleFromPoint( myfl, dropx, dropy, FALSE ) == FALSE ) continue;
for( object = MAP_getTopObj( myfl, dropx, dropy) ; object ; object = NEXT_OBJECT(object ) ){
int objindex = GET_OBJINDEX(object);
if( !CHECKOBJECTUSE( objindex)) continue;
if( OBJECT_getType( objindex) == OBJTYPE_CHARA ){
typedef BOOL (*ITEMPUTFUNC)(int,int);
ITEMPUTFUNC ipfunc;
ipfunc = (ITEMPUTFUNC)CHAR_getFunctionPointer( OBJECT_getIndex(objindex),CHAR_ITEMPUTFUNC) ;
if( ipfunc && ipfunc( OBJECT_getIndex( objindex), itemindex) == TRUE)
return FALSE;
}else{
Find = TRUE;
break;
}
}
if( Find == FALSE ){
*fl = myfl;
*x = dropx;
*y = dropy;
return TRUE;
}
}
return FALSE;
}
void CHAR_DropItem( int charaindex, int itemcharaindex )
{
int itemindex, fl, x, y, ret, objindex, beDropOne = 1;
if( !CHAR_CHECKINDEX( charaindex ) ) return;
if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE ) != BATTLE_CHARMODE_NONE ){
CHAR_talkToCli( charaindex, -1, "战斗状态中无法丢道具装备。", CHAR_COLORYELLOW );
return;
}
#ifdef _AVID_TRADETRYBUG //丢道具装备
if( CHAR_getWorkInt(charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE){
CHAR_talkToCli( charaindex, -1, "交易状态中无法丢道具装备。", CHAR_COLORYELLOW );
return;
}
#endif
itemindex = CHAR_getItemIndex( charaindex, itemcharaindex);
if( !ITEM_CHECKINDEX( itemindex)) return;
if( ITEM_getInt( itemindex, ITEM_ID) == CASINOTOKENID &&
( CHAR_getInt( charaindex, CHAR_FLOOR ) == 7008 ||
CHAR_getInt( charaindex, CHAR_FLOOR ) == 7005 ||
CHAR_getInt( charaindex, CHAR_FLOOR ) == 7003 ) ){
int dropx, dropy, dropfl;
dropfl = CHAR_getInt( charaindex, CHAR_FLOOR);
dropx = CHAR_getInt( charaindex, CHAR_X) + CHAR_getDX( CHAR_getInt( charaindex, CHAR_DIR));
dropy = CHAR_getInt( charaindex, CHAR_Y) + CHAR_getDY( CHAR_getInt( charaindex, CHAR_DIR));
CHAR_DropStakeByDropItem( charaindex, itemcharaindex, itemindex, dropfl, dropx, dropy);
return;
}
//找出周围空间
if( CHAR_FindAroundUsabilitySpace( charaindex, itemindex, &fl, &x, &y) == FALSE ){
CHAR_talkToCli( charaindex, -1, "周围的地面已经满了。", CHAR_COLORYELLOW );
return;
}
#ifdef _ITEM_PILENUMS
if( ITEM_getInt( itemindex, ITEM_CANBEPILE) == 1 &&
ITEM_getInt( itemindex, ITEM_USEPILENUMS) > 1 ){
int ret;
int nums = ITEM_getInt( itemindex, ITEM_USEPILENUMS);
ret = ITEM_makeItemAndRegist( ITEM_getInt( itemindex, ITEM_ID) );
if( !ITEM_CHECKINDEX( ret)) return;
ITEM_setInt( itemindex, ITEM_USEPILENUMS, nums -1 );
itemindex = ret;
beDropOne = 0;
}
#endif
//找到空间
ret = ITEM_eventDrop( itemindex, charaindex, itemcharaindex );
if( ret == 1 ){ //-1 物品不存在 1 消失 0 一般物品
CHAR_SendDropItem_Stats( charaindex, itemindex, itemcharaindex, beDropOne);
return;
}else {
objindex = CHAR_DropItemAbsolute( itemindex, fl, x, y, FALSE );
if( objindex == -1 ) return;
ITEM_setInt( itemindex, ITEM_PUTTIME, NowTime.tv_sec);
{
LogItem(
CHAR_getChar( charaindex, CHAR_NAME ), /* 平乓仿 */
CHAR_getChar( charaindex, CHAR_CDKEY ),
#ifdef _add_item_log_name // WON ADD 在item的log中增加item名称
itemindex,
#else
ITEM_getInt( itemindex, ITEM_ID ), /* 失奶 丞 寞 */
#endif
"Drop(丢出道具)",
CHAR_getInt( charaindex,CHAR_FLOOR),
CHAR_getInt( charaindex,CHAR_X ),
CHAR_getInt( charaindex,CHAR_Y ),
ITEM_getChar( itemindex, ITEM_UNIQUECODE),
ITEM_getChar( itemindex, ITEM_NAME),
ITEM_getInt( itemindex, ITEM_ID)
);
}
CHAR_sendWatchEvent( objindex, CHAR_ACTSTAND, NULL, 0, TRUE);
}
CHAR_SendDropItem_Stats( charaindex, itemindex, itemcharaindex, beDropOne);
}
#else
void CHAR_DropItem( int charaindex, int itemcharaindex )
{
int dirx[9],diry[9];
int i, j;
int floor, objindex=-1;
int droped =0;
int count_item =0, count_chara =0;
int fl, x, y;
int itemindex = CHAR_getItemIndex(charaindex,itemcharaindex);
if( !CHAR_CHECKINDEX( charaindex ) ) return;
if( !ITEM_CHECKINDEX( itemindex) ) return;
#ifdef _AVID_TRADETRYBUG //丢道具装备
if( CHAR_getWorkInt(charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE){
CHAR_talkToCli( charaindex, -1, "交易状态中无法丢道具装备。", CHAR_COLORYELLOW );
return;
}
#endif
#ifdef _DROPCHECK2
fl = CHAR_getInt( charaindex, CHAR_FLOOR);
x = CHAR_getInt( charaindex, CHAR_X);
y = CHAR_getInt( charaindex, CHAR_Y);
for( i = x-CHAR_DEFAULTSEESIZ/2 ; i <= x+CHAR_DEFAULTSEESIZ/2 ; i++ ){
for( j = y-CHAR_DEFAULTSEESIZ/2 ; j <= y+CHAR_DEFAULTSEESIZ/2 ; j ++ ){
OBJECT object;
for( object = MAP_getTopObj(fl,i,j); object ; object = NEXT_OBJECT(object ) ) {
int objindex = GET_OBJINDEX(object);
if( OBJECT_getType(objindex) == OBJTYPE_NOUSE ) continue;
if( OBJECT_getType(objindex) == OBJTYPE_ITEM || OBJECT_getType(objindex) == OBJTYPE_GOLD ) {
count_item++;
}
if( OBJECT_getType(objindex) == OBJTYPE_CHARA ) {
count_chara++;
}
}
}
#ifdef _DROPSTAKENEW
if(ITEM_getInt(itemindex, ITEM_ID) == CASINOTOKENID){
int k = 0;
int casinodropflag = 0;
for(k = 0; k < arraysizeof(casinomap); k++){
if(fl == casinomap[k].casinofl){
if(x >= casinomap[k].casinox - 1 && x <= casinomap[k].casinox + 1){
if(y >= casinomap[k].casinoy - 1 && y <= casinomap[k].casinoy + 1){
casinodropflag = 1;
break;
}
}
}
}
if(casinodropflag == 0){
#endif
if( count_item > 80 || count_chara > 80 ) {
CHAR_talkToCli( charaindex, -1, "这里的物品已经太多了,不能再丢了。", CHAR_COLORYELLOW );
return;
}
#ifdef _DROPSTAKENEW
}
}
#endif
}
#endif
for( i = 1 ; i < 8 ; i ++ ){
dirx[i] = CHAR_getDX(CHAR_getInt(charaindex,CHAR_DIR) + i);
diry[i] = CHAR_getDY(CHAR_getInt(charaindex,CHAR_DIR) + i);
}
dirx[0] = CHAR_getDX(CHAR_getInt(charaindex,CHAR_DIR));
diry[0] = CHAR_getDY(CHAR_getInt(charaindex,CHAR_DIR));
dirx[8] = 0;
diry[8] = 0;
floor = CHAR_getInt( charaindex,CHAR_FLOOR );
{
int ret;
if( 0 <= itemcharaindex && itemcharaindex < CHAR_STARTITEMARRAY ){ //如果丢弃物为装备
CHAR_sendItemDetachEvent( charaindex, itemindex );
}
ret = ITEM_eventDrop( itemindex, charaindex, itemcharaindex );
if( ret == 1 ){ //-1 物品不存在 1 消失 0 一般物品
itemindex = -1;
goto END;
}else if( ret == -1 ){
print( "%s:%d err\n", __FILE__,__LINE__);
return;
}else{
;
}
}
#ifdef _MARKET_TRADE
{
int user_floor = CHAR_getInt( charaindex, CHAR_FLOOR);
int item_x = CHAR_getInt( charaindex, CHAR_X)+dirx[0];
int item_y = CHAR_getInt( charaindex, CHAR_Y)+diry[0];
if( MAP_TRADEDROP( charaindex, itemindex, user_floor, item_x, item_y) == TRUE ) {
return;
}
}
#endif
droped = 0;
for( i = 0 ; i < 9 ; i ++ ){
int x=CHAR_getInt(charaindex,CHAR_X)+dirx[i];
int y=CHAR_getInt(charaindex,CHAR_Y)+diry[i];
#ifdef _DROPSTAKENEW
// 判断物品是否为彩券
if(ITEM_getInt(itemindex, ITEM_ID) == CASINOTOKENID){
int j = 0, k = 0;
int bdropstake = 0;
int casinoflag = 0;
for (j = 0; j < arraysizeof(casinomap); j++){
if (CHAR_getInt(charaindex, CHAR_FLOOR) == casinomap[j].casinofl){
if (x == casinomap[j].casinox && y == casinomap[j].casinoy){
char tmpbuf[256];
int dropflag = CHAR_getWorkInt(charaindex, CHAR_WORKSTAKEFLAG);
casinoflag = 1;
if(casinomap[j].dropflag == 0){
CHAR_talkToCli(charaindex, -1, "现在无法下注!", CHAR_COLORYELLOW);
return;
}else{
snprintf(tmpbuf, sizeof(tmpbuf), "你在 %s 下注了一张彩券", casinomap[j].casinoinfo);
if(dropflag >= MAXSTAKENUM){
snprintf(tmpbuf, sizeof(tmpbuf), "你已经下注五次了,无法再下注!");
CHAR_talkToCli(charaindex, -1, tmpbuf, CHAR_COLORYELLOW);
return;
}
for(k = 0; k < MAXSTAKENUM; k++){
if(CHAR_getWorkInt(charaindex, CHAR_WORKSTAKETYPE1 + k) == 0){
CHAR_setWorkInt(charaindex, CHAR_WORKSTAKETYPE1 + k, casinomap[j].casinotype);
casinomap[j].stakenum = casinomap[j].stakenum + 1;
if(casinomap[j].stakenum >= 100000000)
casinomap[j].stakenum = 100000000;
dropflag++;
if(casinomap[j].stakenum <= 1)
bdropstake = 1;
break;
}
}
}
CHAR_talkToCli(charaindex, -1, tmpbuf, CHAR_COLORYELLOW);
#ifdef _FIX_GAMBLENUM
//做扣点的动作
if (dropflag <= MAXSTAKENUM){
int nAcc = CHAR_getInt(charaindex, CHAR_GAMBLENUM);
nAcc -= casinomap[j].accumulation;
CHAR_setInt(charaindex, CHAR_GAMBLENUM, nAcc);
}
#endif
if (dropflag >= MAXSTAKENUM){
dropflag = 0;
for (k = 0; k < MAXSTAKENUM ; k++){
if (CHAR_getWorkInt(charaindex, CHAR_WORKSTAKETYPE1 + k) > 0)
dropflag++;
}
CHAR_setWorkInt(charaindex, CHAR_WORKSTAKEFLAG, dropflag);
}else{
CHAR_setWorkInt(charaindex, CHAR_WORKSTAKEFLAG, dropflag);
}
continue;
}
}
}
// 此地方的彩券数量超过一张以上
if(bdropstake == 0 && casinoflag != 0){
CHAR_setItemIndex(charaindex, itemcharaindex ,-1);
CHAR_sendItemDataOne(charaindex, itemcharaindex);
LogItem(CHAR_getChar(charaindex, CHAR_NAME),
CHAR_getChar(charaindex, CHAR_CDKEY),
#ifdef _add_item_log_name // WON ADD 在item的log中增加item名称
itemindex,
#else
ITEM_getInt(itemindex, ITEM_ID),
#endif
"StakeDrop(丢出彩券)",
CHAR_getInt(charaindex,CHAR_FLOOR),
CHAR_getInt(charaindex,CHAR_X),
CHAR_getInt(charaindex,CHAR_Y),
ITEM_getChar(itemindex, ITEM_UNIQUECODE),
ITEM_getChar( itemindex, ITEM_NAME),
ITEM_getInt( itemindex, ITEM_ID)
);
return;
}
}
#endif
{
int ret = CHAR_DropItemFXY( charaindex,itemcharaindex,
CHAR_getInt(charaindex,CHAR_FLOOR), x, y, &objindex );
switch( ret ){
case 0:
droped = 1;
#ifdef _ITEM_ORNAMENTS // WON FIX
if( ITEM_getWorkInt( itemindex, ITEM_CANPICKUP) > 0 ){
ITEM_setInt( itemindex, ITEM_PUTTIME, NowTime.tv_sec + 60*5);
}else{
ITEM_setInt( itemindex, ITEM_PUTTIME, NowTime.tv_sec);
}
#else
ITEM_setInt( itemindex, ITEM_PUTTIME, NowTime.tv_sec);
#endif
goto END;
break;
case -1:
case -2:
break;
case -3:
default:
return;
break;
}
#ifdef _DROPSTAKENEW
}
#endif
}
#ifdef _DROPCHECK
if( droped != 1 ) {
CHAR_talkToCli( charaindex, -1, "周围的地面已经满了。", CHAR_COLORYELLOW );
return;
}
#endif
END:
CHAR_sendWatchEvent( objindex, CHAR_ACTSTAND, NULL, 0, TRUE);
CHAR_setItemIndex( charaindex, itemcharaindex ,-1);
{
char category[3];
snprintf( category,sizeof( category),"J%d", itemcharaindex);
CHAR_sendStatusString( charaindex , category);
}
if( CHAR_complianceParameter( charaindex ) ){
CHAR_sendCToArroundCharacter( CHAR_getWorkInt( charaindex, CHAR_WORKOBJINDEX) );
}
if( CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) {
CHAR_send_P_StatusString( charaindex,
CHAR_P_STRING_HP|CHAR_P_STRING_MAXHP|
CHAR_P_STRING_MP|CHAR_P_STRING_MAXMP|
CHAR_P_STRING_ATK|CHAR_P_STRING_DEF|
CHAR_P_STRING_QUICK|CHAR_P_STRING_CHARM|
CHAR_P_STRING_LUCK|CHAR_P_STRING_EARTH|
CHAR_P_STRING_WATER|CHAR_P_STRING_FIRE|
CHAR_P_STRING_WIND
);
CHAR_sendItemDataOne( charaindex, itemcharaindex);
}
return;
}
#endif
int CHAR_DropItemAbsolute( int itemindex, int floor, int x, int y,
BOOL net)
{
Object object;
int objindex;
if( !ITEM_CHECKINDEX( itemindex) )return FALSE;
object.type = OBJTYPE_ITEM;
object.index = itemindex;
object.x = x;
object.y = y;
object.floor = floor;
objindex = initObjectOne( &object );
ITEM_setWorkInt( itemindex,ITEM_WORKOBJINDEX, objindex );
ITEM_setWorkInt( itemindex,ITEM_WORKCHARAINDEX, -1 );
if( net )
CHAR_sendWatchEvent( objindex,CHAR_ACTSTAND,NULL,0,TRUE);
return objindex;
}
int CHAR_addItemSpecificItemIndex( int charaindex, int itemindex )
{
int emptyindex;
if( CHAR_CHECKINDEX( charaindex) == FALSE) return -1;
if( ITEM_CHECKINDEX( itemindex) == FALSE) return -1;
emptyindex = CHAR_findEmptyItemBox( charaindex );
if( emptyindex == -1 ){
return CHAR_MAXITEMHAVE;
}else{
CHAR_setItemIndex(charaindex,emptyindex,itemindex);
ITEM_setWorkInt(itemindex,ITEM_WORKCHARAINDEX,charaindex);
ITEM_setWorkInt(itemindex,ITEM_WORKOBJINDEX,-1);
}
return emptyindex;
}
static int CHAR_PickUpItemFXY( int charaindex, int fl ,int x , int y ,
int* contents,int* objindex )
{
OBJECT object;
for( object=MAP_getTopObj(fl,x,y) ; object ; object = NEXT_OBJECT(object ) ){
int index = GET_OBJINDEX(object);
int objtype = OBJECT_getType(index);
if( objtype == OBJTYPE_NOUSE )continue;
else if( objtype == OBJTYPE_ITEM ){
int ret;
int itemindex = OBJECT_getIndex( index);
#ifdef _MARKET_TRADE //买
if( ITEM_getWorkInt( itemindex, ITEM_WORKTRADETYPE) == TRADETYPE_SELL ) {
MAP_TRADEPICKUP( charaindex, itemindex, fl, x, y, TRADEITEMTYPE);
return -1;
}
#endif
#ifdef _ITEM_ORNAMENTS
if( ITEM_getWorkInt( itemindex, ITEM_CANPICKUP) > 0 ){
return -1;
}
#endif
#ifdef _DROPSTAKENEW
// 判断物品是否为彩券
if(ITEM_getInt(itemindex, ITEM_ID) == CASINOTOKENID){
int i = 0;
int bdropstake = 0, casinoflag = 0, emptyitemindexinchara = -1;
for(i = 0; i < arraysizeof(casinomap); i++){
if(fl == casinomap[i].casinofl){
if(x == casinomap[i].casinox && y == casinomap[i].casinoy){
int j = 0, stakeflag = 0;
int pickupflag = 0;
casinoflag = 1;
if(casinomap[i].dropflag == 0){
CHAR_talkToCli(charaindex, -1, "现在已经无法取回下注彩券了!", CHAR_COLORYELLOW);
return -1;
}
stakeflag = CHAR_getWorkInt(charaindex, CHAR_WORKSTAKEFLAG);
if(stakeflag == 0){
CHAR_talkToCli(charaindex, -1, "您并没有下注,所以无法取回彩券!", CHAR_COLORYELLOW);
return -1;
}
for(j = 0; j < MAXSTAKENUM; j++){
if(CHAR_getWorkInt(charaindex, CHAR_WORKSTAKETYPE1 + j) == casinomap[i].casinotype){
emptyitemindexinchara = CHAR_findEmptyItemBox(charaindex);
if(emptyitemindexinchara < 0) return -2;
CHAR_setWorkInt(charaindex, CHAR_WORKSTAKETYPE1 + j, 0);
casinomap[i].stakenum = casinomap[i].stakenum - 1;
stakeflag--;
pickupflag = 1;
#ifdef _FIX_GAMBLENUM
//做加点的动作
{
int nAcc = CHAR_getInt(charaindex, CHAR_GAMBLENUM);
nAcc += casinomap[i].accumulation;
CHAR_setInt(charaindex, CHAR_GAMBLENUM, nAcc);
}
#endif
if(casinomap[i].stakenum <= 0){
bdropstake = 1;
casinomap[i].stakenum = 0;
}
break;
}
}
if(stakeflag < 0){
stakeflag = 0;
for(j = 0; j < MAXSTAKENUM; j++){
if(CHAR_getWorkInt(charaindex, CHAR_WORKSTAKETYPE1 + j) > 0)
stakeflag++;
}
CHAR_setWorkInt(charaindex, CHAR_WORKSTAKEFLAG, stakeflag);
}else
CHAR_setWorkInt(charaindex, CHAR_WORKSTAKEFLAG, stakeflag);
if(pickupflag == 0){
CHAR_talkToCli(charaindex, -1, "您没有在此下注,所以无法取回彩券!", CHAR_COLORYELLOW);
return -1;
}
}
}
}
if(bdropstake == 0 && casinoflag != 0){// 此地方的彩券数量超过一张以上
char tmpbuf[256];
if(emptyitemindexinchara != -1){
int itemid=-1, ret=-1;
itemid = ITEM_makeItemAndRegist(CASINOTOKENID);
if(itemid == -1) return -1;
ret = CHAR_addItemSpecificItemIndex( charaindex, itemid);
if( ret < 0 || ret >= CHAR_MAXITEMHAVE ) {
ITEM_endExistItemsOne( itemid );
return -1;
}
}
CHAR_sendItemDataOne(charaindex, emptyitemindexinchara);
snprintf(tmpbuf, sizeof(tmpbuf), "拾回%s已将下注取消",
ITEM_getChar(itemindex, ITEM_NAME));
CHAR_talkToCli(charaindex, -1, tmpbuf, CHAR_COLORWHITE);
// 记录捡回记录
LogItem(CHAR_getChar(charaindex, CHAR_NAME),
CHAR_getChar(charaindex, CHAR_CDKEY),
#ifdef _add_item_log_name // WON ADD 在item的log中增加item名称
itemindex,
#else
ITEM_getInt(itemindex, ITEM_ID),
#endif
"StakePickUp(捡起彩券)",
CHAR_getInt(charaindex,CHAR_FLOOR),
CHAR_getInt(charaindex,CHAR_X),
CHAR_getInt(charaindex,CHAR_Y),
ITEM_getChar(itemindex, ITEM_UNIQUECODE),
ITEM_getChar( itemindex, ITEM_NAME),
ITEM_getInt( itemindex, ITEM_ID)
);
return -1;
}
}
#endif
ret = CHAR_addItemSpecificItemIndex( charaindex, itemindex );
if(ret == CHAR_MAXITEMHAVE ){
return -2;
}else if( ret != -1 ) {
typedef void (*PICKUPFUNC)( int, int);
PICKUPFUNC pickupfunc = NULL;
pickupfunc = (PICKUPFUNC)ITEM_getFunctionPointer(
itemindex, ITEM_PICKUPFUNC);
if( pickupfunc) pickupfunc( charaindex, itemindex);
*contents = OBJECT_getIndex(index);
*objindex = index;
CHAR_sendItemDataOne( charaindex, ret);
return 0;
}
}else if( objtype == OBJTYPE_GOLD ){
int MaxGold;
long dropgoldamount = 0, newamountgold = 0, Minus = 0, newgold = 0;
long mygold = (long) CHAR_getInt( charaindex, CHAR_GOLD );
MaxGold = CHAR_getMaxHaveGold( charaindex);
if ((mygold <0) || (mygold > MaxGold))return -2;
dropgoldamount = OBJECT_getIndex(index);
newamountgold = (unsigned int) CHAR_getInt( charaindex,CHAR_GOLD ) + dropgoldamount;
Minus = newamountgold - MaxGold;
if( Minus > 0 ) {
newgold = Minus;
*contents = dropgoldamount - Minus;
}else {
newgold = 0;
*contents = dropgoldamount;
}
OBJECT_setIndex( index, newgold);
CHAR_setInt( charaindex, CHAR_GOLD, min( newamountgold, MaxGold ) );
*objindex = index;
return 1;
}else if( objtype == OBJTYPE_CHARA ) {
int pindex = OBJECT_getIndex( index);
if( !CHAR_CHECKINDEX( pindex) ) continue;
if( CHAR_getInt( pindex, CHAR_WHICHTYPE) == CHAR_TYPEPET ) {
int havepetindex = CHAR_getCharPetElement( charaindex);
if( havepetindex == -1 ) {
if( CHAR_getWorkInt( pindex, CHAR_WORKPETFOLLOWMODE) != CHAR_PETFOLLOW_NOW )
return -3;
}
if( CHAR_getWorkInt( charaindex, CHAR_PickAllPet) != TRUE ) {
if( (CHAR_getInt( pindex, CHAR_LV) - CHAR_getInt( charaindex, CHAR_LV) > 5 )
&& (CHAR_getInt( charaindex, CHAR_TRANSMIGRATION ) <= 0 )) {
return -4;
}
}
/*if( !strcmp( CHAR_getChar( pindex, CHAR_OWNERCDKEY), "SYSTEM_WAYI" ) &&
!strcmp( CHAR_getChar( pindex, CHAR_OWNERCHARANAME), "SYSTEM_WAYI" ) ){
}else{
if( strcmp( CHAR_getChar( pindex, CHAR_OWNERCDKEY), CHAR_getChar( charaindex, CHAR_CDKEY) ) ||
strcmp( CHAR_getChar( pindex, CHAR_OWNERCHARANAME), CHAR_getChar( charaindex, CHAR_NAME) )){
return -5;
}
}*/
#ifdef _MARKET_TRADE
if( CHAR_getWorkInt( pindex, CHAR_WORKTRADETYP) == TRADETYPE_SELL ) { //买宠
MAP_TRADEPICKUP( charaindex, pindex, fl, x, y, TRADEPETTYPE );
return -1;
}
#endif
if( CHAR_getWorkInt( pindex, CHAR_WORKPETFOLLOWMODE) == CHAR_PETFOLLOW_NOW ){
CHAR_pickupFollowPet( charaindex, pindex );
return -1;
}
if( CHAR_getInt( pindex, CHAR_MAILMODE) != CHAR_PETMAIL_NONE){
if( strcmp( CHAR_getChar( pindex, CHAR_OWNERCDKEY),
CHAR_getChar( charaindex, CHAR_CDKEY)) != 0 ||
strcmp( CHAR_getChar( pindex, CHAR_OWNERCHARANAME),
CHAR_getChar( charaindex, CHAR_NAME))!= 0 ){
return -5;
}else if( CHAR_getInt( pindex, CHAR_MAILMODE) != CHAR_PETMAIL_IDLE5){
return -5;
}
}
if( CHAR_getInt( pindex, CHAR_MAILMODE) != CHAR_PETMAIL_NONE){
Char *ch;
CHAR_setInt( pindex, CHAR_MAILMODE, CHAR_PETMAIL_NONE);
CHAR_setInt( pindex, CHAR_PETMAILIDLETIME, 0);
PETMAIL_delPetMailTotalnums( 1); //手动捡起mail PET
ch = CHAR_getCharPointer( pindex);
if( ch != NULL ) {
strcpysafe( ch->charfunctable[CHAR_LOOPFUNC].string,
sizeof( ch->charfunctable[CHAR_LOOPFUNC]), "");
CHAR_constructFunctable( pindex);
}
}
CHAR_setWorkInt( pindex, CHAR_WORKPLAYERINDEX, charaindex);
CHAR_setCharPet( charaindex, havepetindex, pindex);
#ifdef _PET_TALK
if( CHAR_getInt( pindex, CHAR_PETID) != 718 ) {
#endif
CHAR_setChar( pindex, CHAR_OWNERCDKEY,
CHAR_getChar( charaindex, CHAR_CDKEY));
CHAR_setChar( pindex, CHAR_OWNERCHARANAME,
CHAR_getChar( charaindex, CHAR_NAME));
#ifdef _PET_TALK
}
#endif
CHAR_complianceParameter( pindex);
{
char category[3];
snprintf( category,sizeof( category),"K%d",havepetindex);
CHAR_sendStatusString( charaindex, category);
snprintf( category,sizeof( category),"W%d",havepetindex);
CHAR_sendStatusString( charaindex, category);
}
CHAR_setInt( pindex, CHAR_PUTPETTIME, 0);
*contents = pindex;
*objindex = index;
return 2;
}
}
}
return -1;
}
void CHAR_PickUpItem( int charaindex, int dir )
{
int i;
int dirx[2],diry[2];
int searchloopcount=0;
if( !CHAR_CHECKINDEX(charaindex) )return;
if( CHAR_getFlg( charaindex,CHAR_ISDIE ) )return;
if( CHAR_getWorkInt( charaindex,CHAR_WORKBATTLEMODE ) )return;
if( dir < 0 ){
searchloopcount = 1;
dirx[0] = 0;
diry[0] = 0;
}else{
if( dir != CHAR_getInt( charaindex, CHAR_DIR)) {
VALIDATEDIR(dir);
CHAR_setInt(charaindex,CHAR_DIR,dir);
CHAR_sendWatchEvent(CHAR_getWorkInt(charaindex,CHAR_WORKOBJINDEX),
CHAR_ACTSTAND,NULL,0,FALSE);
}
dirx[0] = CHAR_getDX(CHAR_getInt(charaindex,CHAR_DIR));
diry[0] = CHAR_getDY(CHAR_getInt(charaindex,CHAR_DIR));
dirx[1] = 0;
diry[1] = 0;
searchloopcount=2;
}
for( i = 0 ; i < searchloopcount ; i ++ ){
int contents,objindex;
int fl = CHAR_getInt(charaindex,CHAR_FLOOR);
int y = CHAR_getInt(charaindex,CHAR_Y)+diry[i];
int x = CHAR_getInt(charaindex,CHAR_X)+dirx[i];
int ret = CHAR_PickUpItemFXY( charaindex,fl,x,y,&contents,
&objindex);
switch( ret ){
case 0:
CHAR_ObjectDelete(objindex);
{
char mesg[256];
#ifdef _DROPSTAKENEW
int j = 0;
int dropflag = 0;
for(j = 0; j < arraysizeof(casinomap); j++)
{
if(CHAR_getInt(charaindex, CHAR_FLOOR) == casinomap[j].casinofl)
{
if(x == casinomap[j].casinox && y == casinomap[j].casinoy)
{
dropflag = 1;
break;
}
}
}
if(ITEM_getInt(contents, ITEM_ID) == CASINOTOKENID && dropflag == 1)
snprintf( mesg,sizeof(mesg), "拾回%s已将下注取消",
ITEM_getAppropriateName(contents));
else
#endif
snprintf( mesg,sizeof(mesg), "拾获 %s",
ITEM_getAppropriateName(contents) );
CHAR_talkToCli(charaindex,-1,mesg,CHAR_COLORWHITE);
}
{
LogItem(
CHAR_getChar( charaindex, CHAR_NAME ),
CHAR_getChar( charaindex, CHAR_CDKEY ),
#ifdef _add_item_log_name // WON ADD 在item的log中增加item名称
contents,
#else
ITEM_getInt(contents, ITEM_ID),
#endif
"PickUp(捡起道具)",
CHAR_getInt( charaindex,CHAR_FLOOR),
CHAR_getInt( charaindex,CHAR_X ),
CHAR_getInt( charaindex,CHAR_Y ),
ITEM_getChar( contents, ITEM_UNIQUECODE),
ITEM_getChar( contents, ITEM_NAME),
ITEM_getInt( contents, ITEM_ID)
);
}
return;
break;
case 1:
CHAR_send_P_StatusString( charaindex, CHAR_P_STRING_GOLD);
if( OBJECT_getIndex( objindex) == 0 ) {
CHAR_ObjectDelete(objindex);
}else {
CHAR_sendWatchEvent(objindex,CHAR_ACTSTAND,NULL,0,TRUE);
}
{
char mesg[256];
if( contents == 0 ) {
snprintf( mesg,sizeof(mesg), "无法再拾获Stone了。" );
}else {
snprintf( mesg,sizeof(mesg), "拾获 %d Stone",contents );
}
CHAR_talkToCli(charaindex,-1,mesg,CHAR_COLORWHITE);
}
if( contents != 0 ){
LogStone(
-1,
CHAR_getChar( charaindex, CHAR_NAME ),
CHAR_getChar( charaindex, CHAR_CDKEY ),
contents,
CHAR_getInt( charaindex, CHAR_GOLD ),
"PickUp(拾获金钱)",
CHAR_getInt( charaindex,CHAR_FLOOR),
CHAR_getInt( charaindex,CHAR_X ),
CHAR_getInt( charaindex,CHAR_Y )
);
}
return;
break;
case 2: //宠物
CHAR_ObjectDelete(objindex);
CHAR_setWorkInt( contents, CHAR_WORKOBJINDEX, -1);
{
char mesg[256];
char *p = NULL;
p = CHAR_getChar( contents, CHAR_USERPETNAME);
if( strlen( p) == 0 ) {
p = CHAR_getChar( contents, CHAR_NAME);
}
snprintf( mesg,sizeof(mesg), "拾获 %s", p);
CHAR_talkToCli(charaindex,-1,mesg,CHAR_COLORWHITE);
}
// 矢永玄毛胶匀凶夫弘
LogPet(
CHAR_getChar( charaindex, CHAR_NAME ), /* 平乓仿 */
CHAR_getChar( charaindex, CHAR_CDKEY ),
CHAR_getChar( contents, CHAR_NAME),
CHAR_getInt( contents, CHAR_LV),
"PickUp(捡宠)",
CHAR_getInt( charaindex,CHAR_FLOOR),
CHAR_getInt( charaindex,CHAR_X ),
CHAR_getInt( charaindex,CHAR_Y ),
CHAR_getChar( contents, CHAR_UNIQUECODE) // shan 2001/12/14
);
return;
break;
// Robin 0701 petFollow
case 3:
/* 引歹曰卞仇木毛壅六午中丹 */
CHAR_ObjectDelete(objindex);
CHAR_setWorkInt( contents, CHAR_WORKOBJINDEX, -1);
{
char mesg[256];
char *p = NULL;
p = CHAR_getChar( contents, CHAR_USERPETNAME);
if( strlen( p) == 0 ) {
p = CHAR_getChar( contents, CHAR_NAME);
}
snprintf( mesg,sizeof(mesg), "拾回 %s", p);
CHAR_talkToCli(charaindex,-1,mesg,CHAR_COLORWHITE);
}
// 矢永玄毛胶匀凶夫弘
LogPet(
CHAR_getChar( charaindex, CHAR_NAME ), /* 平乓仿 */
CHAR_getChar( charaindex, CHAR_CDKEY ),
CHAR_getChar( contents, CHAR_NAME),
CHAR_getInt( contents, CHAR_LV),
"FollowPickUp(收回溜宠)",
CHAR_getInt( charaindex,CHAR_FLOOR),
CHAR_getInt( charaindex,CHAR_X ),
CHAR_getInt( charaindex,CHAR_Y ),
CHAR_getChar( contents, CHAR_UNIQUECODE) // shan 2001/12/14
);
return;
break;
case -1:
break;
case -2:
CHAR_talkToCli( charaindex,-1,"道具栏已满。", CHAR_COLORYELLOW);
break;
case -3:
CHAR_talkToCli( charaindex,-1,"宠物数已满。", CHAR_COLORYELLOW);
break;
case -4:
CHAR_talkToCli( charaindex,-1,"无法照顾该宠物。", CHAR_COLORYELLOW);
break;
case -5:
CHAR_talkToCli( charaindex,-1,"无法拾获该宠物。", CHAR_COLORYELLOW);
break;
case -6:
CHAR_talkToCli( charaindex,-1,"无法拾获该道具。", CHAR_COLORYELLOW);
break;
default:
return;
}
}
return;
}
/*------------------------------------------------------------
* 云嗯毛甄 隙烂匹 公丹午允月CHAR_DropMoney井日及心匹银丹仪
* 娄醒
* charaindex int 平乓仿奶件犯永弁旦
* itemindex int 失奶 丞奶件犯永弁旦(平乓仿犯□正及 匹及)
* fl int 白夫失
* x int x
* y int y
* force BOOL 仇及袄互恳分午 泫 允
* objindex int* 中凶失奶 丞及 Object 匹及奶件犯弁永旦
* 忒曰袄
* 撩 (公氏卅卞云嗯毛 匀化中卅中) -1
* 撩 (哗溥读卞分户) -2
* 公木动陆及撩 -3
* 撩 (公仇卞反公及汹及云嗯反聂允亢月) -4
* 允匹卞职及失奶 丞互 切化中月 -5
* 汹互 匹 -6
* 岳 0
------------------------------------------------------------*/
static BOOL CHAR_DropMoneyFXY( int charaindex, int amount, int fl , int x,
int y, BOOL force, int* objindex )
{
OBJECT object;
int MaxGold;
int mygold = CHAR_getInt( charaindex, CHAR_GOLD );
if( amount <= 0 )return -6;
if( amount > mygold )
return -1;
MaxGold = CHAR_getMaxHaveGold( charaindex);
if ((mygold <0) || (mygold > MaxGold)) return -1;
if( MAP_walkAbleFromPoint( fl,x,y,FALSE ) == FALSE )return -2;
for( object=MAP_getTopObj(fl,x,y) ; object;
object = NEXT_OBJECT(object) ){
int index = GET_OBJINDEX(object);
int objtype = OBJECT_getType(index);
if( objtype == OBJTYPE_NOUSE ) continue;
else if( objtype == OBJTYPE_GOLD ){
long tmpamount = OBJECT_getIndex(index) + amount;
if( tmpamount > MaxGold )
return -4;
OBJECT_setIndex(index,tmpamount);
CHAR_setInt(charaindex,CHAR_GOLD,
(unsigned int)CHAR_getInt(charaindex,
CHAR_GOLD )
- amount );
*objindex = index;
#ifdef _DEL_DROP_GOLD
OBJECT_setTime( index, NowTime.tv_sec);
#endif
if( amount >= 100 ){ /* 云嗯毛 中凶夫弘 */
LogStone(-1,CHAR_getChar( charaindex, CHAR_NAME ), /* 平乓仿 */
CHAR_getChar( charaindex, CHAR_CDKEY ), /* 交□扒□ID */
amount, /* 嗯喊 */
CHAR_getInt( charaindex, CHAR_GOLD ),
"Drop(放置金钱)",
CHAR_getInt( charaindex,CHAR_FLOOR),
CHAR_getInt( charaindex,CHAR_X ),
CHAR_getInt( charaindex,CHAR_Y )
);
}
return 0;
}else if( objtype == OBJTYPE_ITEM ){
if( force==TRUE )
continue;
else
/* 允匹卞失奶 丞互丐月及匹分户 */
return -5;
}
}
/* 仇仇引匹谗琼允月午中丹仪反蕙筋瓒 允月 */
{
Object one;
one.type = OBJTYPE_GOLD;
one.x = x;
one.y = y;
one.floor = fl;
if( amount > MaxGold )
return -4;
one.index = amount;
*objindex = initObjectOne( &one );
/* 左皮斥尼弁玄瓒 允月 */
if( *objindex == -1 )
/* 瓒 撩 */
return -3;
/*云嗯毛蛹日允*/
CHAR_setInt(charaindex,CHAR_GOLD,
(unsigned int)CHAR_getInt(charaindex,CHAR_GOLD )
- amount );
#ifdef _DEL_DROP_GOLD
OBJECT_setTime( *objindex, NowTime.tv_sec);
#endif
if( amount >= 100 ){ /* 云嗯毛 中凶夫弘 */
LogStone(-1,CHAR_getChar( charaindex, CHAR_NAME ), /* 平乓仿 */
CHAR_getChar( charaindex, CHAR_CDKEY ), /* 交□扒□ID */
amount, /* 嗯喊 */
CHAR_getInt( charaindex, CHAR_GOLD ),
"Drop(放置金钱)",
CHAR_getInt( charaindex,CHAR_FLOOR),
CHAR_getInt( charaindex,CHAR_X ),
CHAR_getInt( charaindex,CHAR_Y )
);
}
return 0;
}
}
/*------------------------------------------------------------
* 云嗯毛 允楮醒[ 及蟆井日 允[
* 娄醒
* charaindex int 平乓仿奶件犯永弁旦
* amount int 云嗯及汹
*
* 忒曰袄
* 卅仄
------------------------------------------------------------*/
void CHAR_DropMoney( int charaindex, int amount )
{
int dirx[9],diry[9];
int ret;
int i;
int objindex, MaxGold;
if( !CHAR_CHECKINDEX( charaindex ) )return;
#ifdef _AVID_TRADETRYBUG //丢出石币
if( CHAR_getWorkInt( charaindex, CHAR_WORKTRADEMODE) == CHAR_TRADE_TRADING ){
CHAR_talkToCli( charaindex, -1, "交易状态中无法丢出石币。", CHAR_COLORYELLOW );
return;
}
#endif
MaxGold = CHAR_getMaxHaveGold( charaindex);
if( CHAR_getFlg( charaindex,CHAR_ISDIE ) )return;
//ANDY_ADD 12/28
{
int money=0;
money = CHAR_getInt( charaindex, CHAR_GOLD );
if( money < 0 ) {
CHAR_setInt( charaindex, CHAR_GOLD, 0);
return;
}
if( (amount > money) || (money > MaxGold)) {
if( money > MaxGold ) {
CHAR_setInt( charaindex, CHAR_GOLD, 0 );
print("\n ERR: %s(stone%d) dropMoney%d > CHAR_MAXGOLDHAVE !!",
CHAR_getChar(charaindex, CHAR_CDKEY), money, amount);
}else {
print("\n ERR: %s dropMoney > CHAR_GOLD !!", CHAR_getChar(charaindex, CHAR_CDKEY));
}
CHAR_send_P_StatusString( charaindex, CHAR_P_STRING_GOLD);
return;
}
}
//ANDY_END
for( i = 0 ; i < 7 ; i ++ ){
dirx[i+2] = CHAR_getDX( CHAR_getInt(charaindex,CHAR_DIR) + i+1 );
diry[i+2] = CHAR_getDY( CHAR_getInt(charaindex,CHAR_DIR) + i+1 );
}
dirx[0] = CHAR_getDX(CHAR_getInt(charaindex,CHAR_DIR));
diry[0] = CHAR_getDY(CHAR_getInt(charaindex,CHAR_DIR));
dirx[1] = 0;
diry[1] = 0;
for( i = 0 ; i < 9 ; i ++ ){
int x = CHAR_getInt(charaindex,CHAR_X) + dirx[i];
int y = CHAR_getInt(charaindex,CHAR_Y) + diry[i];
// CoolFish 2002/04/06 下注处不可丢置石币
#ifdef _DROPSTAKENEW
{
int j = 0;
for(j = 0; j < arraysizeof(casinomap); j++)
{
if(CHAR_getInt(charaindex, CHAR_FLOOR) == casinomap[j].casinofl)
{
if (x == casinomap[j].casinox && y == casinomap[j].casinoy)
{
CHAR_talkToCli(charaindex, -1, "这里不能放置石币!", CHAR_COLORYELLOW);
return;
}
}
}
}
#endif
ret = CHAR_DropMoneyFXY( charaindex,amount,
CHAR_getInt(charaindex,CHAR_FLOOR),
x,y, FALSE, &objindex );
switch( ret ){
case 0:
goto END;
break;
case -1:
return;
break;
case -3:
return;
break;
case -2:
case -4:
case -5:
case -6:
break;
default:
break;
}
}
{
int x = CHAR_getInt(charaindex,CHAR_X) + dirx[1];
int y = CHAR_getInt(charaindex,CHAR_Y) + diry[1];
ret = CHAR_DropMoneyFXY( charaindex,amount,
CHAR_getInt(charaindex,CHAR_FLOOR),
x,y, TRUE, &objindex );
switch( ret ){
case 0:
goto END;
break;
case -1:
break;
case -3:
return;
break;
case -2:
case -4:
case -5:
break;
default:
break;
}
return;
}
END:
CHAR_sendWatchEvent(objindex,CHAR_ACTSTAND,NULL,0,TRUE );
CHAR_send_P_StatusString( charaindex, CHAR_P_STRING_GOLD);
return;
}
static int CHAR_findEmptyItemBoxNoFromChar( Char* ch )
{
int i, j=0;;
for( i = CHAR_STARTITEMARRAY ; i < CHAR_MAXITEMHAVE ; i ++ ){
int itemindex;
itemindex = ch->indexOfExistItems[i];
if( itemindex == -1 ) j++;
}
return j;
}
int CHAR_findEmptyItemBoxNo( int index )
{
Char* ch;
if( !CHAR_CHECKINDEX( index ) )return -1;
ch = CHAR_getCharPointer(index);
if( ch != NULL )
return CHAR_findEmptyItemBoxNoFromChar( ch );
else
return -1;
}
// CoolFish: Trade 2001/4/4
int CHAR_findTotalEmptyItem( int index )
{
int i, totaleptitem = 0;
Char* ch;
if( !CHAR_CHECKINDEX( index ) )return -1;
ch = CHAR_getCharPointer(index);
if( ch != NULL ){
for (i = CHAR_STARTITEMARRAY; i < CHAR_MAXITEMHAVE; i++){
int itemindex = 0;
itemindex = ch->indexOfExistItems[i];
if (itemindex == -1) totaleptitem++;
}
return totaleptitem;
}
return -1;
}
// Robin 0707 petFollow
int CHAR_pickupFollowPet( int charaindex, int pickupindex )
{
int petindex;
int objindex;
int havepetindex;
char category[3];
if( !CHAR_CHECKINDEX( charaindex ) ) return FALSE;
if( pickupindex != -1 )
petindex = pickupindex;
else
petindex = CHAR_getWorkInt( charaindex, CHAR_WORKPETFOLLOW );
if( !CHAR_CHECKINDEX( petindex ) )
{
CHAR_setWorkInt( charaindex, CHAR_WORKPETFOLLOW, -1 );
return FALSE;
}
havepetindex = CHAR_getCharPetElement( charaindex);
if( havepetindex == -1 ) {
CHAR_talkToCli(charaindex,-1,"宠物栏已满!无法拾回!",CHAR_COLORYELLOW);
return FALSE;
}
objindex = CHAR_getWorkInt( petindex, CHAR_WORKOBJINDEX );
print(" objindex02:%d ", objindex);
if( (pickupindex == -1) || (pickupindex == CHAR_getWorkInt( charaindex, CHAR_WORKPETFOLLOW ) ) )
CHAR_setWorkInt( charaindex, CHAR_WORKPETFOLLOW, -1 );
/* CDKEY 午平乓仿 互域谯仄卅中午五反胶尹卅中 */
if( strcmp( CHAR_getChar( petindex, CHAR_OWNERCDKEY), CHAR_getChar( charaindex, CHAR_CDKEY)) != 0 ||
strcmp( CHAR_getChar( petindex, CHAR_OWNERCHARANAME), CHAR_getChar( charaindex, CHAR_NAME)) != 0 )
{
//CHAR_setWorkInt( charaindex, CHAR_WORKPETFOLLOW, -1 );
return FALSE;
}
//CHAR_setWorkInt( charaindex, CHAR_WORKPETFOLLOW, -1 );
CHAR_ObjectDelete(objindex);
CHAR_setWorkInt( petindex, CHAR_WORKPETFOLLOWMODE, CHAR_PETFOLLOW_NONE );
CHAR_setWorkInt( petindex, CHAR_WORKPLAYERINDEX, charaindex);
CHAR_setCharPet( charaindex, havepetindex, petindex);
#ifdef _PET_TALK
if( CHAR_getInt( petindex, CHAR_PETID) != 718 ) {
#endif
CHAR_setChar( petindex, CHAR_OWNERCDKEY, CHAR_getChar( charaindex, CHAR_CDKEY));
CHAR_setChar( petindex, CHAR_OWNERCHARANAME, CHAR_getChar( charaindex, CHAR_NAME));
#ifdef _PET_TALK
}
#endif
snprintf( category,sizeof( category),"K%d",havepetindex);
CHAR_sendStatusString( charaindex, category);
snprintf( category,sizeof( category),"W%d",havepetindex);
CHAR_sendStatusString( charaindex, category);
CHAR_setInt( petindex, CHAR_PUTPETTIME, 0);
CHAR_setWorkInt( petindex, CHAR_WORKPETFOLLOWCOUNT, 0);
CHAR_setWorkInt( petindex, CHAR_WORKOBJINDEX, -1);
{
char mesg[256];
char *p = NULL;
p = CHAR_getChar( petindex, CHAR_USERPETNAME);
if( strlen( p) == 0 ) {
p = CHAR_getChar( petindex, CHAR_NAME);
}
snprintf( mesg,sizeof(mesg), "拾回 %s", p);
CHAR_talkToCli(charaindex,-1,mesg,CHAR_COLORYELLOW);
}
// 矢永玄毛胶匀凶夫弘
LogPet(
CHAR_getChar( charaindex, CHAR_NAME ), /* 平乓仿 */
CHAR_getChar( charaindex, CHAR_CDKEY ),
CHAR_getChar( petindex, CHAR_NAME),
CHAR_getInt( petindex, CHAR_LV),
"FollowPickUp(收回溜宠)",
CHAR_getInt( charaindex,CHAR_FLOOR),
CHAR_getInt( charaindex,CHAR_X ),
CHAR_getInt( charaindex,CHAR_Y ),
CHAR_getChar( petindex, CHAR_UNIQUECODE) // shan 2001/12/14
);
return TRUE;
}
#ifdef _GAMBLE_ROULETTE
int NPC_MAPCLEANGOLD( int meindex , int floor)
{
OBJECT object;
int x,y,fl;
int End_type;
fl = floor;
for( End_type = 0; End_type < arraysizeof(casinomap) ; End_type++ ) {
if( floor != casinomap[ End_type].casinofl )
continue;
x = casinomap[ End_type].casinox;
y = casinomap[ End_type].casinoy;
for( object=MAP_getTopObj(fl,x,y) ; object ; object = NEXT_OBJECT(object ) ) {
int index = GET_OBJINDEX(object);
int objtype = OBJECT_getType(index);
int itemindex = OBJECT_getIndex( index);
if( objtype == OBJTYPE_NOUSE )continue;
if( objtype == OBJTYPE_ITEM ){
if(ITEM_getInt(itemindex, ITEM_ID) == CASINOTOKENID) {
ITEM_endExistItemsOne( itemindex);
OBJECT_setIndex( index, 0);
CHAR_ObjectDelete(index); //清除
print(" clean( %d )", index );
}
break;
}
}
casinomap[End_type].stakenum = 0;
}
return 1;
}
#endif
#ifdef _DROPSTAKENEW
// casinotype : flg = 0 不分type针对整层type做设定扩充参数
// mapdropflag : TRUE = 可以下注;
int SetCasinoMap(int npcindex, int casinotype, int mapdropflag)
{
int npcfloor = CHAR_getInt(npcindex, CHAR_FLOOR);
int i = 0;
if (casinotype < 0 || mapdropflag < 0)
return -1;
for (i = 0; i < arraysizeof(casinomap); i++)
{
if (npcfloor == casinomap[i].casinofl)
{
if (casinotype != 0)
{
if (casinomap[i].casinotype == casinotype)
casinomap[i].dropflag = mapdropflag;
}
else
casinomap[i].dropflag = mapdropflag;
}
}
return 1;
}
// 计算积分
int CasinoAccumulation(int charindex, int npcindex, int floor, int wincasinotype)
{
int i = 0;
int accumulation = CHAR_getInt(charindex, CHAR_GAMBLENUM);
char tmpbuf[256];
for (i = 0; i < MAXSTAKENUM; i++)
{
if (CHAR_getWorkInt(charindex, CHAR_WORKSTAKETYPE1 + i) == wincasinotype)
{
int j = 0;
for (j = 0; j < arraysizeof(casinomap); j++)
{
if (casinomap[j].casinotype == wincasinotype)
{
#ifdef _FIX_GAMBLENUM
// 加 原本积分及WIN积分
accumulation = accumulation + casinomap[j].accumulation * 2;
#else
accumulation += casinomap[j].accumulation;
#endif
CHAR_setWorkInt(charindex, CHAR_WORKSTAKETYPE1 + i, 0);
break;
}
}
}
else if (CHAR_getWorkInt(charindex, CHAR_WORKSTAKETYPE1 + i) != 0)
{
int j = 0;
for (j = 0; j < arraysizeof(casinomap); j++)
{
if (casinomap[j].casinotype == CHAR_getWorkInt(charindex, CHAR_WORKSTAKETYPE1 + i))
{
#ifndef _FIX_GAMBLENUM
accumulation -= casinomap[j].accumulation;
#endif
CHAR_setWorkInt(charindex, CHAR_WORKSTAKETYPE1 + i, 0);
break;
}
}
}
}
CHAR_setWorkInt(charindex, CHAR_WORKSTAKEFLAG, 0);
if (accumulation < 0)
accumulation = 0;
else if (accumulation > MAXACCUMULATION)
accumulation = MAXACCUMULATION;
CHAR_setInt(charindex, CHAR_GAMBLENUM, accumulation);
snprintf(tmpbuf, sizeof(tmpbuf), "您现在总共有%4d点游乐场积分", accumulation);
CHAR_talkToCli(charindex, npcindex, tmpbuf, CHAR_COLORWHITE);
return 1;
}
int CasinoPay(int npcindex, int wincasinotype)
{
int npcfloor = CHAR_getInt(npcindex, CHAR_FLOOR);
int i = 0;
int playernum = CHAR_getPlayerMaxNum();
if (wincasinotype < 0) return FALSE;
for (i = 0; i < playernum; i++)
{
if (CHAR_getCharUse(i) == FALSE) continue;
if (!CHAR_CHECKINDEX(i)) continue;
if (CHAR_getInt(i, CHAR_FLOOR) == npcfloor)
{
// 查询玩家是否有下注
if (CHAR_getWorkInt(i, CHAR_WORKSTAKEFLAG) == 0)
continue;
// 计算积分
CasinoAccumulation(i, npcindex, npcfloor, wincasinotype);
}
}
// 清除此层地面彩券
for (i = 0; i < arraysizeof(casinomap); i++)
{
OBJECT object;
if (casinomap[i].casinofl != npcfloor) continue;
for (object = MAP_getTopObj(casinomap[i].casinofl, casinomap[i].casinox,
casinomap[i].casinoy); object; object = NEXT_OBJECT(object))
{
int index = GET_OBJINDEX(object);
int objtype = OBJECT_getType(index);
int itemindex = OBJECT_getIndex( index);
if (objtype == OBJTYPE_NOUSE) continue;
else if (objtype == OBJTYPE_ITEM)
{
if(ITEM_getInt(itemindex, ITEM_ID) == CASINOTOKENID)
{
OBJECT_setIndex(index, 0);
CHAR_ObjectDelete(index);
}
}
}
casinomap[i].stakenum = 0;
}
return TRUE;
}
#endif