chuyiwen_gmsv/npc/npc_savepoint.c
2017-01-14 00:37:03 +09:00

587 lines
14 KiB
C
Raw Permalink 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 <string.h>
#include "object.h"
#include "char_base.h"
#include "char.h"
#include "util.h"
#include "npcutil.h"
#include "npc_oldman.h"
#include "title.h"
#include "char_data.h"
#include "readmap.h"
#include "lssproto_serv.h"
#include "log.h"
#define RANGE 2
void NPC_SetFlg(int talker,int shiftbit);
BOOL NPC_CheckFlg(int point,int shiftbit);
BOOL NPC_SavePointItemCheck(int meindex,int talker,int itemno,int kosuu);
void NPC_MessageDisp(int meindex,int talker,int MseNo);
BOOL NPC_UsedCheck(int meindex,int talker,int flg);
BOOL NPC_SavePointItemDelete(int meindex,int talker,int itemNo,int kosuu);
extern time_t initTime;
int playeronlinenum=0;
BOOL NPC_SavePointInit( int meindex )
{
int oldmanid=0, bornfl=0, bornx=0 ,borny=0;
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char token[32];
char buf2[512];
if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){
print("NPC_Savepoint.c Init: GetArgStrErr");
return FALSE;
}
if(NPC_Util_GetStrFromStrWithDelim(argstr,"ID",buf2,sizeof( buf2) )==NULL){
print("SavePoint:ID尚未设定 ");
return FALSE;
}
oldmanid=atoi(buf2);
NPC_Util_GetStrFromStrWithDelim(argstr,"Born",buf2,sizeof( buf2) );
getStringFromIndexWithDelim( buf2,",",1,token,sizeof(token));
bornfl = atoi( token );
getStringFromIndexWithDelim( buf2,",",2,token,sizeof(token));
bornx = atoi( token );
getStringFromIndexWithDelim( buf2,",",3,token,sizeof(token));
borny = atoi( token );
CHAR_setWorkInt( meindex , CHAR_WORKOLDMANID ,oldmanid );
CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPESAVEPOINT );
CHAR_setFlg( meindex , CHAR_ISATTACKED , 1 );
if( MAP_IsValidCoordinate( bornfl,bornx,borny )== TRUE
&& CHAR_ElderSetPosition( oldmanid ,bornfl,bornx, borny ) == TRUE ){
return TRUE;
}else{
printf( "Invalid elder npcarg=%s\n", argstr );
return FALSE;
}
}
void NPC_SavePointTalked( int meindex , int talkerindex , char *msg ,
int color )
{
int fd;
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char token[512];
char buf2[1024];
char timeMsg[1024];
int oldmanid;
if( ! NPC_Util_charIsInFrontOfChar(talkerindex,meindex,RANGE)
|| CHAR_getFlg( talkerindex,CHAR_ISDIE )){
if( (CHAR_getInt(talkerindex,CHAR_X) == CHAR_getInt(meindex,CHAR_X))
&& (CHAR_getInt(talkerindex,CHAR_Y) == CHAR_getInt(meindex,CHAR_Y))
&& (CHAR_getInt(talkerindex,CHAR_FLOOR) ==CHAR_getInt(meindex,CHAR_FLOOR)) ){
}else{
return;
}
}
if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){
print("NPC_Savepoint.c TypeCheck: GetArgStrErr\n");
return ;
}
if(NPC_Util_GetStrFromStrWithDelim(argstr,"ID",buf2,sizeof( buf2) )==NULL) return ;
oldmanid=atoi(buf2);
if(strstr(argstr,"NOITEM")!=NULL) {
NPC_SetFlg(talkerindex,oldmanid);
}
#ifndef _FREE_SAVE
if(NPC_CheckFlg(CHAR_getInt(talkerindex,CHAR_SAVEPOINT),oldmanid)==FALSE){
if(NPC_UsedCheck(meindex,talkerindex,0)==TRUE){
NPC_MessageDisp(meindex,talkerindex,2);
}else{
NPC_MessageDisp(meindex,talkerindex,0);
}
}else
#endif
{
CHAR_setInt( talkerindex, CHAR_LASTTALKELDER ,CHAR_getWorkInt( meindex, CHAR_WORKOLDMANID ) );
fd = getfdFromCharaIndex( talkerindex);
if( fd != -1 ) {
#ifndef _NPC_NOSAVEPOINT
Char *chwk;
chwk = CHAR_getCharPointer( talkerindex);
// CoolFish: +1 2001/11/05
if (!chwk) return;
CHAR_charSaveFromConnectAndChar( fd, chwk ,FALSE );
// Nuke 0907: For acsv test
{
CHAR_charSaveFromConnectAndChar( fd, chwk ,FALSE );
}
#endif
}
NPC_Util_GetStrFromStrWithDelim(argstr,"NomalMsg",token,sizeof( token) );
sprintf(buf2,token,CHAR_getChar(talkerindex,CHAR_NAME));
// Robin 0619 display time
{
time_t new_t;
int dd,hh,mm,ss;
time(&new_t);
new_t-=initTime;
dd=(int) new_t / 86400; new_t=new_t % 86400;
hh=(int) new_t / 3600; new_t=new_t % 3600;
mm=(int) new_t / 60; new_t=new_t % 60;
ss=(int) new_t;
#ifdef _SAVE_GAME_ID
if (dd>0) {
snprintf( timeMsg, sizeof( timeMsg ) ,
"本星球%s已经启动了 %d 日 %d 小时 %d 分 %d 秒。",getGameserverID(),dd,hh,mm,ss);
} else if (hh>0) {
snprintf( timeMsg, sizeof( timeMsg ) ,
"本星球%s已经启动了 %d 小时 %d 分 %d 秒。",getGameserverID(),hh,mm,ss);
} else {
snprintf( timeMsg, sizeof( timeMsg ) ,
"本星球%s已经启动了 %d 分 %d 秒。",getGameserverID(),mm,ss);
}
strcat(buf2,timeMsg);
#else
if (dd>0) {
snprintf( timeMsg, sizeof( timeMsg ) ,
"本星球已经启动了 %d 日 %d 小时 %d 分 %d 秒。",dd,hh,mm,ss);
} else if (hh>0) {
snprintf( timeMsg, sizeof( timeMsg ) ,
"本星球已经启动了 %d 小时 %d 分 %d 秒。",hh,mm,ss);
} else {
snprintf( timeMsg, sizeof( timeMsg ) ,
"本星球已经启动了 %d 分 %d 秒。",mm,ss);
}
strcat(buf2,timeMsg);
#endif
}
{
char temp[1024];
//char *answer;// CoolFish: Rem 2001/4/18
extern unsigned int StateTable[];
// Robin 03/20 万能的天神,请赐给我灌水的力量!!!!
#ifdef _PLAYER_NUM
if(getPlayerNum()>0){
int playernum = abs(StateTable[LOGIN])+getPlayerNum()+playeronlinenum;
if(atof(getPlayerBase())>1.0) playernum = playernum * atof(getPlayerBase()) + 0.5;
sprintf(temp,"目前线上人数为 %d 人。",playernum);
}else{
int playernum = abs(StateTable[LOGIN])+playeronlinenum;
if(atof(getPlayerBase())>1.0) playernum = playernum * atof(getPlayerBase()) + 0.5;
sprintf(temp,"目前线上人数为 %d 人。",playernum);
}
#else
sprintf(temp,"目前线上人数为 %d 人。",abs(StateTable[LOGIN]));
#endif
strcat(buf2,temp);
}
{
char savetemp[1024];
sprintf(savetemp,"系统自动为你存档!");
strcat(buf2,savetemp);
}
//fd = getfdFromCharaIndex( talkerindex);
CHAR_charSaveFromConnect(talkerindex, FALSE);
CHAR_talkToCli( talkerindex , meindex , buf2 , CHAR_COLORWHITE );
}
}
/*-----------------------------------------
*
-------------------------------------------*/
void NPC_SavePointWindowTalked( int meindex, int talkerindex,
int seqno, int select, char *data)
{
if( NPC_Util_CharDistance( talkerindex, meindex ) > 2) {
return;
}
if(seqno==CHAR_WINDOWTYPE_WINDOWSAVEPOINT_START){
if(select==WINDOW_BUTTONTYPE_YES){
if(NPC_UsedCheck(meindex,talkerindex,1)==TRUE){
NPC_MessageDisp(meindex,talkerindex,1);
}
}
}
}
/*
*/
BOOL NPC_AndReduce(int meindex,int talker,char *buf,int flg)
{
char buf2[512];
char buf3[256];
int itemNo=0;
int kosuu;
int j=1;
if(flg==0){
while(getStringFromIndexWithDelim(buf,"&",j,buf2,sizeof(buf2))!=FALSE)
{
j++;
if(strstr( buf2, "*") != NULL){
getStringFromIndexWithDelim(buf2,"*",1,buf3,sizeof(buf3));
itemNo = atoi(buf3);
getStringFromIndexWithDelim(buf2,"*",2,buf3,sizeof(buf3));
kosuu = atoi(buf3);
/*--民尼永弁乒□玉--*/
if(NPC_SavePointItemCheck(meindex,talker,itemNo,kosuu)==FALSE){
return FALSE;
}
}else{
itemNo = atoi(buf2);
/*--民尼永弁乒□玉--*/
if(NPC_SavePointItemCheck(meindex,talker,itemNo,1)==FALSE){
return FALSE;
}
}
}
}else{
if(strstr( buf, "*") != NULL){
getStringFromIndexWithDelim(buf,"*",1,buf3,sizeof(buf3));
itemNo = atoi(buf3);
getStringFromIndexWithDelim(buf,"*",2,buf3,sizeof(buf3));
kosuu = atoi(buf3);
/*--民尼永弁乒□玉--*/
if(NPC_SavePointItemCheck(meindex,talker,itemNo,kosuu)==FALSE){
return FALSE;
}
}else{
itemNo = atoi(buf);
/*--民尼永弁乒□玉--*/
if(NPC_SavePointItemCheck(meindex,talker,itemNo,1)==FALSE){
return FALSE;
}
}
}
return TRUE;
}
BOOL NPC_AndReduceDelete(int meindex,int talker,char *buf,int flg)
{
char buf2[512];
char buf3[256];
int itemNo=0;
int kosuu;
int j=1;
if(flg==0){
while(getStringFromIndexWithDelim(buf,"&",j,buf2,sizeof(buf2))!=FALSE)
{
j++;
if(strstr( buf2, "*") != NULL){
getStringFromIndexWithDelim(buf2,"*",1,buf3,sizeof(buf3));
itemNo = atoi(buf3);
getStringFromIndexWithDelim(buf2,"*",2,buf3,sizeof(buf3));
kosuu = atoi(buf3);
/*--绰轮乒□玉--*/
if(NPC_SavePointItemDelete(meindex,talker,itemNo,kosuu)==FALSE){
return FALSE;
}
}else{
itemNo = atoi(buf2);
/*--绰轮乒□玉--*/
if(NPC_SavePointItemDelete(meindex,talker,itemNo,1)==FALSE){
return FALSE;
}
}
}
}else{
if(strstr( buf, "*") != NULL){
getStringFromIndexWithDelim(buf,"*",1,buf3,sizeof(buf3));
itemNo = atoi(buf3);
getStringFromIndexWithDelim(buf,"*",2,buf3,sizeof(buf3));
kosuu = atoi(buf3);
/*--绰轮乒□玉--*/
if(NPC_SavePointItemDelete(meindex,talker,itemNo,kosuu)==FALSE){
return FALSE;
}
}else{
itemNo = atoi(buf);
/*--绰轮乒□玉--*/
if(NPC_SavePointItemDelete(meindex,talker,itemNo,1)==FALSE){
return FALSE;
}
}
}
return TRUE;
}
/*
* 椭瘀毛苇凶仄凶井及民尼永弁
*/
BOOL NPC_UsedCheck(int meindex,int talker,int flg)
{
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char buf[128];
char buf2[512];
int i=1;
int checkflg=0;
if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){
print("NPC_savePoint.c UseCheck: GetArgStrErr");
return FALSE;
}
if(NPC_Util_GetStrFromStrWithDelim(argstr,"GetItem",buf,sizeof( buf) )!=NULL)
{
i=1;
while( getStringFromIndexWithDelim(buf,",",i,buf2,sizeof(buf2)) !=FALSE )
{
i++;
if(strstr( buf2, "&") != NULL){
if(NPC_AndReduce( meindex, talker, buf2,0)==TRUE)
{
checkflg=1;
break;
}
}else{
if(NPC_AndReduce( meindex, talker, buf2,1)==TRUE)
{
checkflg=2;
break;
}
}
}
if(checkflg==0) return FALSE;
} else return TRUE; // Arminius 2.5 如果没有设 GetItem 则一律储存
if(flg==1){
if(checkflg==1){
if(NPC_AndReduceDelete(meindex,talker,buf2,0)==FALSE){
return FALSE;
}
}else{
if(NPC_AndReduceDelete(meindex,talker,buf2,1)==FALSE){
return FALSE;
}
}
}
return TRUE;
}
void NPC_MessageDisp(int meindex,int talker,int MesNo)
{
int fd = getfdFromCharaIndex( talker);
int buttontype=WINDOW_BUTTONTYPE_OK;
int windowtype=WINDOW_MESSAGETYPE_MESSAGE;
int windowno=CHAR_WINDOWTYPE_WINDOWSAVEPOINT_START;
char token[1024];
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char buf[32];
if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){
print("NPC_savePoint.c UseCheck: GetArgStrErr");
return ;
}
switch(MesNo){
case 0:/*-- 邰卅失奶 丞毛手匀化中月井及民尼永弁-*/
NPC_Util_GetStrFromStrWithDelim(argstr,"RequestMsg",token,sizeof( token) );
break;
case 1:/*-- 邰卅失奶 丞毛手匀化中月井及民尼永弁-*/
NPC_Util_GetStrFromStrWithDelim(argstr,"OkMsg",token,sizeof( token) );
NPC_Util_GetStrFromStrWithDelim(argstr,"ID",buf,sizeof( buf) );
NPC_SetFlg(talker,atoi(buf));
/*--本□皮今六化丐仆月--*/
/* 反卅仄井仃凶蛊卞愤坌及ID毛筏盛今六月 */
CHAR_setInt( talker, CHAR_LASTTALKELDER ,CHAR_getWorkInt( meindex, CHAR_WORKOLDMANID ) );
/* 本□皮允月 */
/* 夫永弁仄化中月反内互卅中及匹失件夫永弁仄卅中 */
fd = getfdFromCharaIndex( talker);
if( fd != -1 ) {
#ifndef _NPC_NOSAVEPOINT
Char *chwk;
chwk = CHAR_getCharPointer( talker);
// CoolFish: +1 2001/11/05
if (!chwk) return;
CHAR_charSaveFromConnectAndChar( fd, chwk ,FALSE );
#endif
}
break;
case 2:/*-- 邰卅失奶 丞毛手匀化中月井及民尼永弁-*/
NPC_Util_GetStrFromStrWithDelim(argstr,"RealyMsg",token,sizeof( token) );
buttontype=WINDOW_BUTTONTYPE_YESNO;
break;
}
lssproto_WN_send( fd, windowtype,
buttontype,
windowno,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
token);
}
BOOL NPC_SavePointItemDelete(int meindex,int talker,int itemNo,int kosuu)
{
int i;
int itemindex;
int id;
int cnt=0;
for( i=CHAR_STARTITEMARRAY;i<CHAR_MAXITEMHAVE;i++ ){
itemindex=CHAR_getItemIndex( talker , i );
if( ITEM_CHECKINDEX(itemindex) ){
id=ITEM_getInt(itemindex ,ITEM_ID );
if(itemNo==id){
cnt++;
{
LogItem(
CHAR_getChar( talker, CHAR_NAME ),
CHAR_getChar( talker, CHAR_CDKEY ),
#ifdef _add_item_log_name // WON ADD 在item的log中增加item名称
itemindex,
#else
ITEM_getInt( itemindex, ITEM_ID ),
#endif
"SP_DelItem(交给记录点记录的道具)",
CHAR_getInt( talker,CHAR_FLOOR),
CHAR_getInt( talker,CHAR_X ),
CHAR_getInt( talker,CHAR_Y ),
ITEM_getChar( itemindex, ITEM_UNIQUECODE),
ITEM_getChar( itemindex, ITEM_NAME),
ITEM_getInt( itemindex, ITEM_ID)
);
}
CHAR_DelItem( talker, i) ;
if(cnt==kosuu){
return TRUE;
}
}
}
}
return FALSE;
}
BOOL NPC_SavePointItemCheck(int meindex,int talker,int itemno,int kosuu)
{
int i;
int itemindex;
int id;
int cnt=0;
for( i=CHAR_STARTITEMARRAY;i<CHAR_MAXITEMHAVE;i++ ){
itemindex=CHAR_getItemIndex( talker , i );
if( ITEM_CHECKINDEX(itemindex) ){
id=ITEM_getInt(itemindex ,ITEM_ID );
if(itemno==id){
cnt++;
if(cnt==kosuu){
return TRUE;
}
}
}
}
return FALSE;
}
/*
*/
void NPC_SetFlg(int talker,int shiftbit)
{
int point;
point = CHAR_getInt(talker,CHAR_SAVEPOINT);
point = point | (1<<shiftbit);
CHAR_setInt(talker,CHAR_SAVEPOINT,point);
}
/*
*/
BOOL NPC_CheckFlg(int point,int shiftbit)
{
// int anser;
// anser = point & (1<<shiftbit);
if( (point & (1<<shiftbit)) == (1<<shiftbit)){
return TRUE;
}
return FALSE;
}