📄 npc_poolitemshop.c
字号:
#include "version.h"
#include "char.h"
#include "lssproto_serv.h"
#include "npcutil.h"
#include "npc_poolitemshop.h"
#include "log.h"
#include "handletime.h"
#define NPC_POOLITEMSHOP_DEFAULT_COST 200
enum {
NPC_WORK_COST = CHAR_NPCWORKINT1,
NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT9,
};
enum {
NPC_POOLITEMSHOP_MSG_MAIN=0,
NPC_POOLITEMSHOP_MSG_POOL,
NPC_POOLITEMSHOP_MSG_DRAW,
NPC_POOLITEMSHOP_MSG_REALY,
NPC_POOLITEMSHOP_MSG_STONE,
NPC_POOLITEMSHOP_MSG_POOLFULL,
NPC_POOLITEMSHOP_MSG_ITEMFULL,
CHAR_WINDOWTYPE_POOLITEMSHOP_START = 290,
CHAR_WINDOWTYPE_POOLITEMSHOP_POOL_MSG,
CHAR_WINDOWTYPE_POOLITEMSHOP_DRAW_MSG,
CHAR_WINDOWTYPE_POOLITEMSHOP_FULL_MSG,
CHAR_WINDOWTYPE_POOLITEMSHOP_HAVEITEMFULL_MSG,
CHAR_WINDOWTYPE_POOLITEMSHOP_END,
#ifdef _NPC_DEPOTITEM
CHAR_WINDOWTYPE_DEPOTITEMSHOP_MENU = 310,
CHAR_WINDOWTYPE_DEPOTITEMSHOP_HANDLE,
CHAR_WINDOWTYPE_DEPOTITEMSHOP_ADD,
CHAR_WINDOWTYPE_DEPOTITEMSHOP_GET,
#endif
};
typedef struct {
char option[32];
char defaultmsg[128];
}NPC_POOLITEMSHOP_MSG;
NPC_POOLITEMSHOP_MSG poolshopmsg[] = {
{ "main_msg", "欢迎"},
{ "pool_main", "要寄放什麽呢"},
{ "draw_main", "要领养什麽呢"},
{ "realy_msg", "真的要那个吗"},
{ "stone_msg", "钱不够喔!"},
{ "poolfull_msg", "超过的无法处理喔"},
{ "itemfull_msg", "项目有很多"}
};
static BOOL NPC_PoolItemShop_DrawItem( int meindex, int talkerindex, int num);
static BOOL NPC_PoolItemShop_PoolItem( int meindex, int talkerindex, int num);
static void NPC_PoolItemShop_MakeItemString_Draw( int meindex, int talkerindex,
char *retstring,int retstringlen);
static void NPC_PoolItemShop_MakeItemString_Pool( int meindex, int talkerindex,
char *retstring,int retstringlen);
static char *NPC_PoolItemShop_getMsg_noarg( int tablenum,
char *argstr, char *retstring, int retstringlen);
static void NPC_PoolItemShop_printWindow_Draw( int meindex, int talkerindex);
static void NPC_PoolItemShop_printWindow_Pool( int meindex, int talkerindex);
static void NPC_PoolItemShop_printWindow_Full( int meindex, int talkerindex);
void NPC_PoolItemShop_printWindow_Start( int meindex, int talkerindex);
static void NPC_PoolItemShop_printWindow_HaveItemFull( int meindex, int talkerindex);
#ifdef _NPC_DEPOTITEM
void NPC_PoolItemShop_DepotItem_Menu( int meindex, int talkerindex);
void NPC_DepotItem_Item_printWindow( int meindex, int talkerindex);
void NPC_DepotItem_Depot_printWindow( int meindex, int talkerindex);
BOOL NPC_DepotItem_InsertItem( int meindex, int talkerindex, int num);
BOOL NPC_DepotItem_gettItem( int meindex, int talkerindex, int num);
#endif
#define NPCPOOLITEMLOOP 1000*20
int othertime=0;
BOOL NPC_PoolItemShopInit( int meindex)
{
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
int cost;
NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr));
cost = NPC_Util_GetNumFromStrWithDelim( argstr, "cost");
if( cost == -1 ) cost = NPC_POOLITEMSHOP_DEFAULT_COST;
CHAR_setWorkInt( meindex, NPC_WORK_COST, cost);
return TRUE;
}
void NPC_PoolItemShopLoop( int meindex)
{
}
void NPC_PoolItemShopTalked( int meindex , int talkerindex ,
char *szMes ,int color )
{
if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) {
return;
}
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
if( !NPC_Util_isFaceToFace( meindex, talkerindex, 2)) {
if( NPC_Util_CharDistance( talkerindex, meindex ) > 1) return;
}
NPC_PoolItemShop_printWindow_Start( meindex, talkerindex);
}
void NPC_PoolItemShopWindowTalked( int meindex, int talkerindex,
int seqno, int select, char *data)
{
if( NPC_Util_CharDistance( talkerindex, meindex ) > 2) return;
//print("\n NPC_PoolItemShopWindowTalked: seq:%d sel:%d data:%s", seqno, select, data);
switch( seqno ) {
case CHAR_WINDOWTYPE_POOLITEMSHOP_START:
switch( atoi( data)) {
case 1:
if( CHAR_getCharPoolItemIndexElement( talkerindex) != -1 ) {
NPC_PoolItemShop_printWindow_Pool( meindex, talkerindex);
}else {
NPC_PoolItemShop_printWindow_Full( meindex, talkerindex);
}
break;
case 2:
if( CHAR_findEmptyItemBox( talkerindex) != -1 ) {
NPC_PoolItemShop_printWindow_Draw( meindex, talkerindex);
}else {
NPC_PoolItemShop_printWindow_HaveItemFull( meindex, talkerindex);
}
break;
#ifdef _NPC_DEPOTITEM
case 3:
if( !CHAR_CheckDepotItem( talkerindex) ){
CHAR_GetDepotItem( meindex, talkerindex);
CHAR_talkToCli( talkerindex, -1, "取得道具,请稍後!", CHAR_COLORYELLOW);
}else{
NPC_PoolItemShop_DepotItem_Menu( meindex, talkerindex);
}
break;
#endif
}
break;
case CHAR_WINDOWTYPE_POOLITEMSHOP_POOL_MSG:
if( atoi( data) == 0){
NPC_PoolItemShop_printWindow_Start( meindex, talkerindex);
}else {
NPC_PoolItemShop_PoolItem( meindex, talkerindex, atoi(data)-1);
}
break;
case CHAR_WINDOWTYPE_POOLITEMSHOP_DRAW_MSG:
if( atoi( data) == 0){
NPC_PoolItemShop_printWindow_Start( meindex, talkerindex);
}else {
NPC_PoolItemShop_DrawItem( meindex, talkerindex, atoi(data)-1);
}
break;
case CHAR_WINDOWTYPE_POOLITEMSHOP_FULL_MSG:
NPC_PoolItemShop_printWindow_Start( meindex, talkerindex);
break;
case CHAR_WINDOWTYPE_POOLITEMSHOP_HAVEITEMFULL_MSG:
NPC_PoolItemShop_printWindow_Start( meindex, talkerindex);
break;
#ifdef _NPC_DEPOTITEM
case CHAR_WINDOWTYPE_DEPOTITEMSHOP_MENU:
if( !CHAR_CheckDepotItem( talkerindex) ){
CHAR_GetDepotItem( meindex, talkerindex);
return;
}else{
NPC_PoolItemShop_DepotItem_Menu( meindex, talkerindex);
}
break;
case CHAR_WINDOWTYPE_DEPOTITEMSHOP_HANDLE:
if( !CHAR_CheckDepotItem( talkerindex) ) return ;
switch( atoi( data)) {
case 1://放入
if( CHAR_findEmptyDepotItem( talkerindex) == -1 ){
CHAR_talkToCli( talkerindex, -1, "仓库已满!", CHAR_COLORYELLOW);
return;
}
NPC_DepotItem_Item_printWindow( meindex, talkerindex);
break;
case 2:
if( CHAR_findEmptyItemBox( talkerindex) == -1 ) {
CHAR_talkToCli( talkerindex, -1, "身上道具栏位已满!", CHAR_COLORYELLOW);
return;
}
NPC_DepotItem_Depot_printWindow( meindex, talkerindex);
break;
}
break;
case CHAR_WINDOWTYPE_DEPOTITEMSHOP_ADD://放入
if( !CHAR_CheckDepotItem( talkerindex) ) return ;
if( atoi( data) == 0){
NPC_PoolItemShop_DepotItem_Menu( meindex, talkerindex);
}else {
if( NPC_DepotItem_InsertItem( meindex, talkerindex, atoi( data)-1) == FALSE ){
NPC_PoolItemShop_DepotItem_Menu( meindex, talkerindex);
CHAR_talkToCli( talkerindex, -1, "存放道具失败,请稍後再试!", CHAR_COLORYELLOW);
}
}
break;
case CHAR_WINDOWTYPE_DEPOTITEMSHOP_GET:
if( !CHAR_CheckDepotItem( talkerindex) ) return ;
if( atoi( data) == 0){
NPC_PoolItemShop_DepotItem_Menu( meindex, talkerindex);
}else {
if( NPC_DepotItem_gettItem( meindex, talkerindex, atoi( data)-1) == FALSE ){
NPC_PoolItemShop_DepotItem_Menu( meindex, talkerindex);
CHAR_talkToCli( talkerindex, -1, "取出道具失败,请稍後再试!", CHAR_COLORYELLOW);
}
}
break;
#endif
default:
break;
}
}
void NPC_PoolItemShop_printWindow_Start( int meindex, int talkerindex)
{
int fd;
fd = getfdFromCharaIndex( talkerindex);
if( fd != -1 ) {
char message[1024];
char buf[2048];
#ifdef _NPC_DEPOTITEM
strcpy( message,
"3\n\n"
" 欢迎光临\n\n"
" <寄放道具>\n"
" <取回道具>\n"
" <使用仓库>\n\n"
" < 离开 >"
);
#else
strcpy( message,
"3\n\n"
" 欢迎光临\n\n"
" <寄放道具>\n"
" <取回道具>\n\n\n"
" < 离开 >"
);
#endif
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT,
WINDOW_BUTTONTYPE_NONE,
CHAR_WINDOWTYPE_POOLITEMSHOP_START,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
makeEscapeString( message, buf, sizeof(buf)));
}
}
#ifdef _NPC_DEPOTITEM
void NPC_PoolItemShop_DepotItem_Menu( int meindex, int talkerindex)
{
int fd;
fd = getfdFromCharaIndex( talkerindex);
if( fd != -1 ) {
char message[1024];
char buf[2048];
strcpy( message,
"3\n\n"
" 使用道具仓库\n\n"
" <存放道具>\n"
" <取回道具>\n"
);
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT,
WINDOW_BUTTONTYPE_CANCEL,
CHAR_WINDOWTYPE_DEPOTITEMSHOP_HANDLE,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
makeEscapeString( message, buf, sizeof(buf)));
}
}
void NPC_DepotItem_MakeItemString( int meindex, int talkerindex, char *retstring,int retstringlen)
{
int i;
int itemindex;
int pos = 0;
char buff[1024];
retstring[0] = '\0';
for( i = CHAR_STARTITEMARRAY; i < CHAR_MAXITEMHAVE; i ++ ) {
int poolflg = FALSE;
itemindex = CHAR_getItemIndex( talkerindex, i);
if( !ITEM_CHECKINDEX( itemindex) ) continue;
if( ITEM_getInt( itemindex, ITEM_DROPATLOGOUT) || ITEM_getInt( itemindex, ITEM_VANISHATDROP) ||
!ITEM_getInt( itemindex, ITEM_CANPETMAIL) ) {
poolflg = TRUE;
}
snprintf( buff, sizeof( buff),
#ifdef _ITEM_PILENUMS
"%s|%d|%d|%d|%s|%d|%d|",
#else
"%s|%d|%d|%d|%s|%d|",
#endif
ITEM_getChar( itemindex, ITEM_SECRETNAME),
poolflg,CHAR_getWorkInt( meindex, NPC_WORK_COST),
ITEM_getInt( itemindex, ITEM_BASEIMAGENUMBER),
ITEM_getChar( itemindex, ITEM_EFFECTSTRING),
#ifdef _ITEM_PILENUMS
ITEM_getInt( itemindex, ITEM_USEPILENUMS),
#endif
i + 1 );
if( pos +strlen( buff)>= retstringlen) {
fprint( "buffer over err\n");
break;
}
strcpy( &retstring[pos], buff);
pos += strlen( buff);
}
}
void NPC_DepotItem_Item_printWindow( int meindex, int talkerindex)
{
char itemstring[65536-1024];
char sendstring[65536];
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char buff2[1024];
char buff3[1024];
char buff4[1024];
int fd;
if( (fd = getfdFromCharaIndex( talkerindex)) == -1 ){
fprint( "err\n");
return;
}
NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr));
snprintf( sendstring, sizeof( sendstring), "0|%d|%s|%s|%s|%s|",
CHAR_getfindEmptyDepotItem( talkerindex),
CHAR_getChar( meindex, CHAR_NAME),
NPC_PoolItemShop_getMsg_noarg( NPC_POOLITEMSHOP_MSG_POOL, argstr, buff2, sizeof( buff2)),
NPC_PoolItemShop_getMsg_noarg( NPC_POOLITEMSHOP_MSG_POOLFULL, argstr, buff3, sizeof( buff3)),
NPC_PoolItemShop_getMsg_noarg( NPC_POOLITEMSHOP_MSG_REALY, argstr, buff4, sizeof( buff4))
);
NPC_DepotItem_MakeItemString( meindex, talkerindex, itemstring, sizeof( itemstring));
strcat( sendstring, itemstring);
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_POOLITEMSHOPMAIN,
WINDOW_BUTTONTYPE_NONE,
CHAR_WINDOWTYPE_DEPOTITEMSHOP_ADD,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), sendstring);
}
void NPC_DepotItem_MakeDepotString( int meindex, int talkerindex, char *retstring,int retstringlen)
{
int i;
int itemindex;
int pos = 0;
char buff[1024];
retstring[0] = '\0';
for( i = 0; i < /*60*/CHAR_MAXDEPOTITEMHAVE; i ++ ) {
int poolflg = FALSE;
itemindex = CHAR_getDepotItemIndex( talkerindex, i);
if( !ITEM_CHECKINDEX( itemindex)) continue;
snprintf( buff, sizeof( buff),
#ifdef _ITEM_PILENUMS
"%s|%d|%d|%d|%d|%s|%d|",
#else
"%s|%d|%d|%d|%d|%s|",
#endif
ITEM_getChar( itemindex, ITEM_SECRETNAME),
poolflg,
ITEM_getInt( itemindex, ITEM_LEVEL),
ITEM_getInt( itemindex, ITEM_COST),
ITEM_getInt( itemindex, ITEM_BASEIMAGENUMBER),
ITEM_getChar( itemindex, ITEM_EFFECTSTRING)
#ifdef _ITEM_PILENUMS
,ITEM_getInt( itemindex, ITEM_USEPILENUMS)
#endif
);
if( pos +strlen( buff)>= retstringlen) {
fprint( "buffer over err\n");
break;
}
strcpy( &retstring[pos], buff);
pos += strlen( buff);
}
}
void NPC_DepotItem_Depot_printWindow( int meindex, int talkerindex)
{
char itemstring[65536-1024];
char sendstring[65536];
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char buff[1024];
char buff2[1024];
char buff3[1024];
int fd;
if( (fd = getfdFromCharaIndex( talkerindex)) == -1 )return;
NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr));
snprintf( sendstring, sizeof( sendstring), "1|%s|%s|%s|%s|",
CHAR_getChar( meindex, CHAR_NAME),
NPC_PoolItemShop_getMsg_noarg( NPC_POOLITEMSHOP_MSG_DRAW, argstr, buff2, sizeof( buff2)),
NPC_PoolItemShop_getMsg_noarg( NPC_POOLITEMSHOP_MSG_ITEMFULL, argstr, buff, sizeof( buff)),
NPC_PoolItemShop_getMsg_noarg( NPC_POOLITEMSHOP_MSG_REALY, argstr, buff3, sizeof( buff3))
);
NPC_DepotItem_MakeDepotString( meindex, talkerindex, itemstring, sizeof( itemstring));
strcat( sendstring, itemstring);
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_POOLITEMSHOPMAIN,
WINDOW_BUTTONTYPE_NONE,
CHAR_WINDOWTYPE_DEPOTITEMSHOP_GET,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
sendstring);
//print("\n NPC_DepotItem_Depot_printWindow:%s size:%d ", sendstring, strlen(sendstring));
}
void NPC_DepotItem_CheckRepeat_Del( int charaindex, int ti, int itemindex)
{
char token[256];
sprintf( token, "仓库道具%s,编码重复!(系统清除)",
ITEM_getChar( itemindex, ITEM_NAME));
CHAR_talkToCli( charaindex, -1, token, CHAR_COLORYELLOW);
LogItem(
CHAR_getChar( charaindex, CHAR_NAME ),
CHAR_getChar( charaindex, CHAR_CDKEY ),
#ifdef _add_item_log_name
itemindex,
#else
ITEM_getInt( itemindex, ITEM_ID),
#endif
"repeat(仓库道具重复)",
0, 0, 0,
ITEM_getChar( itemindex, ITEM_UNIQUECODE),
ITEM_getChar( itemindex, ITEM_NAME),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -