1134 lines
32 KiB
C
1134 lines
32 KiB
C
#include "version.h"
|
||
#include <string.h>
|
||
#include "char.h"
|
||
#include "object.h"
|
||
#include "char_base.h"
|
||
#include "npcutil.h"
|
||
#include "lssproto_serv.h"
|
||
#include "saacproto_cli.h"
|
||
#include "npc_warpman.h"
|
||
#include "map_deal.h"
|
||
#include "readmap.h"
|
||
#include "battle.h"
|
||
#include "npc_exchangeman.h"
|
||
#include "log.h"
|
||
#include "enemy.h"
|
||
#include "handletime.h"
|
||
#include "npc_eventaction.h"
|
||
|
||
static void NPC_WarpMan_selectWindow( int meindex, int toindex, int num,int select);
|
||
//ANDY_END
|
||
BOOL NPC_GetDuelPointCheck(int meindex,int talker);
|
||
BOOL NPC_PARTY_CHAECK( int meindex, int talkerindex);
|
||
void NPC_ERR_DiSP(int meindex,int talker,int errNO);
|
||
|
||
BOOL NPC_BigSmallLastCheck(int point1,int mypoint,int flg);
|
||
|
||
//BOOL NPC_ItemCheck(int meindex,int talker,int itemNo,int flg);
|
||
int NPC_FloorUse(int talker,int floor);
|
||
BOOL NPC_WarpMsg(int meindex,int talker,char *buf);
|
||
BOOL NPC_NpcWarpMsg(int meindex,int talker,char *arg);
|
||
int NPC_FloorUseOtherFloor(int charaindex, char *buf);
|
||
|
||
|
||
#ifdef _NPC_ADDLEVELUP
|
||
void NPC_LevelAndTransUp( int meindex, int charindex, int level, int skillpoint, int exp, int ridepet);
|
||
#endif
|
||
|
||
#define WARPMAN_STANDBY 3000
|
||
#define WARPMAN_WAIT 150
|
||
//ANDY_ADD
|
||
int CheckWarpMsg( int meindex, int talkerindex,char *npcarg ,char *TalkStr);
|
||
|
||
#ifdef _TREASURE_BOX
|
||
BOOL NPC_TreasureEventRunMsg( int meindex);
|
||
#endif
|
||
|
||
BOOL NPC_TreasureRandItemGet(int meidex,int talker,int rand_j,char *buf);
|
||
|
||
enum {
|
||
NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT1,
|
||
NPC_TIME_BORN = CHAR_NPCWORKINT2,
|
||
NPC_TIME_DEAD = CHAR_NPCWORKINT3,
|
||
NPC_TIME_MODE = CHAR_NPCWORKINT4,
|
||
|
||
NPC_TIME_EVENTMODE = CHAR_NPCWORKINT6,// 1
|
||
NPC_TIME_EVENTTIME = CHAR_NPCWORKINT7,
|
||
NPC_TIME_EVENONBBI = CHAR_NPCWORKINT8,
|
||
NPC_TIME_EVENOFFDBBI = CHAR_NPCWORKINT9,
|
||
NPC_TIME_EVENTNUM = CHAR_NPCWORKINT10,
|
||
};
|
||
|
||
enum{
|
||
NPC_EVENTMODE_NONE,
|
||
NPC_EVENTMODE_OPEN,
|
||
NPC_EVENTMODE_EVENT,
|
||
};
|
||
|
||
#ifdef _NEW_WARPMAN
|
||
static void NPC_NewWarpMan_selectWindow( int meindex, int toindex, int num,int select,char *TalkStr);
|
||
|
||
enum {
|
||
WARP_MAN=0,
|
||
NEW_WARPMAN,
|
||
NEW_WARPMAN_END
|
||
};
|
||
#endif
|
||
#define TIMECHECKLOOP 20
|
||
// Robin 0518
|
||
//BOOL checkend = FALSE;
|
||
|
||
|
||
BOOL NPC_WarpManInit( int meindex )
|
||
{
|
||
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE - 1024 * 20];
|
||
char buff2[256];
|
||
char buf[1024];
|
||
int fl,x,y;
|
||
|
||
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
|
||
print("WarpMan:GetArgStrErr");
|
||
return FALSE;
|
||
}
|
||
CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPEWARPMAN );
|
||
#ifdef _NEW_WARPMAN
|
||
if( strstr( npcarg,"NEWWARPMAN") ) {
|
||
//timeman 功能
|
||
CHAR_setWorkInt( meindex, NPC_TIME_MODE, 1);
|
||
if(NPC_Util_GetStrFromStrWithDelim( npcarg, "NEWTIME", buff2, sizeof( buff2)) != NULL ){
|
||
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, 60*1000);
|
||
}
|
||
#ifdef _TREASURE_BOX
|
||
CHAR_setWorkInt( meindex, NPC_TIME_EVENTMODE, NPC_EVENTMODE_NONE);
|
||
if(NPC_Util_GetStrFromStrWithDelim( npcarg, "TREASURE_BOX", buff2, sizeof( buff2)) != NULL ){
|
||
if( strstr( buff2, "ON") != NULL ){
|
||
CHAR_setWorkInt( meindex, NPC_TIME_EVENTMODE, NPC_EVENTMODE_EVENT);
|
||
CHAR_setWorkInt( meindex, NPC_TIME_EVENTTIME, NowTime.tv_sec);
|
||
if(NPC_Util_GetStrFromStrWithDelim( npcarg, "TREASURE_ONBBI", buff2, sizeof( buff2)) != NULL )
|
||
CHAR_setWorkInt( meindex, NPC_TIME_EVENONBBI, atoi( buff2));
|
||
if(NPC_Util_GetStrFromStrWithDelim( npcarg, "TREASURE_OFFDBBI", buff2, sizeof( buff2)) != NULL )
|
||
CHAR_setWorkInt( meindex, NPC_TIME_EVENOFFDBBI, atoi( buff2));
|
||
CHAR_setWorkInt( meindex, NPC_TIME_EVENTNUM, 0 );
|
||
}
|
||
}
|
||
|
||
#endif
|
||
return TRUE;
|
||
}else{
|
||
#endif
|
||
if(NPC_Util_GetStrFromStrWithDelim( npcarg, "WARP", buf, sizeof( buf))==NULL){
|
||
char filename[256];
|
||
if( NPC_Util_CheckAssignArgFile( meindex, filename) != NULL )
|
||
print("\n Warpman Err -> file:%s", filename);
|
||
return FALSE;
|
||
}
|
||
getStringFromIndexWithDelim(buf,",",1,buff2,sizeof(buff2));
|
||
fl=atoi(buff2);
|
||
getStringFromIndexWithDelim(buf,",",2,buff2,sizeof(buff2));
|
||
x=atoi(buff2);
|
||
getStringFromIndexWithDelim(buf,",",3,buff2,sizeof(buff2));
|
||
y=atoi(buff2);
|
||
if( MAP_IsValidCoordinate( fl,x,y )== FALSE ){
|
||
char filename[256];
|
||
NPC_Util_CheckAssignArgFile( meindex, filename);
|
||
print( "\nWarp NPC: filename:%s\n 3.Invalid warpman ERR %d %d %d" , filename, fl , x , y );
|
||
return FALSE;
|
||
}
|
||
#ifdef _NEW_WARPMAN
|
||
}
|
||
#endif
|
||
return TRUE;
|
||
}
|
||
|
||
void NPC_WarpManTalked( int meindex , int talkerindex , char *szMes ,int color )
|
||
{
|
||
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE - 1024 * 20];
|
||
char token[256];
|
||
int RunType=-1;
|
||
|
||
CHAR_setWorkInt( talkerindex, CHAR_WORKWARPCHECK, FALSE );
|
||
if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) {
|
||
return;
|
||
}
|
||
if(NPC_Util_isFaceToFace( meindex ,talkerindex ,2)==FALSE){
|
||
if(NPC_Util_isFaceToChara(talkerindex,meindex,1 )==FALSE) return;
|
||
}
|
||
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
|
||
print("GetArgStrErr");
|
||
return ;
|
||
}
|
||
|
||
#ifdef _NEW_WARPMAN
|
||
if( strstr( npcarg,"NEWWARPMAN") ) {
|
||
#ifdef _TREASURE_BOX
|
||
if( CHAR_getWorkInt( meindex, NPC_TIME_EVENTMODE) == NPC_EVENTMODE_OPEN )
|
||
return;
|
||
#endif
|
||
NPC_NewWarpMan_selectWindow( meindex ,talkerindex, 0, -1, szMes);
|
||
return;
|
||
}else {
|
||
if(NPC_PARTY_CHAECK( meindex, talkerindex) == FALSE) {//有组队
|
||
NPC_ERR_DiSP( meindex, talkerindex, 1);
|
||
return;
|
||
}
|
||
|
||
|
||
RunType = CheckWarpMsg( meindex, talkerindex, npcarg , szMes);
|
||
if( RunType !=0 ) {
|
||
if( RunType == 1 ) {
|
||
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "nomal_msg", token, sizeof(token)) != NULL) {
|
||
CHAR_talkToCli( talkerindex, meindex,token,CHAR_COLORWHITE);
|
||
}
|
||
}
|
||
return;
|
||
}
|
||
}
|
||
#else
|
||
|
||
|
||
if(NPC_PARTY_CHAECK( meindex, talkerindex) == FALSE) {//有组队
|
||
NPC_ERR_DiSP( meindex, talkerindex, 1);
|
||
return;
|
||
}
|
||
RunType = CheckWarpMsg( meindex, talkerindex, npcarg , szMes);
|
||
if( RunType !=0 ) {
|
||
if( RunType == 1 ) {
|
||
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "nomal_msg", token, sizeof(token)) != NULL) {
|
||
CHAR_talkToCli( talkerindex, meindex,token,CHAR_COLORWHITE);
|
||
}
|
||
}
|
||
return;
|
||
}
|
||
#endif
|
||
|
||
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
|
||
CHAR_setWorkInt( talkerindex , CHAR_WORKSHOPRELEVANTTRD , 0 );
|
||
if(strstr(npcarg,"DR")!=NULL) {
|
||
CHAR_setWorkInt( talkerindex , CHAR_WORKSHOPRELEVANTSEC , -1 );
|
||
if(NPC_GetDuelPointCheck(meindex,talkerindex)==FALSE) return;
|
||
}else{
|
||
NPC_WarpMan_selectWindow( meindex, talkerindex,0,-1);
|
||
}
|
||
}
|
||
|
||
static void NPC_WarpMan_selectWindow( int meindex, int toindex, int num,int select)
|
||
{
|
||
|
||
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE - 1024 * 20];
|
||
char token[1024];
|
||
char buf[256];
|
||
char buf2[1024];
|
||
char buf3[256];
|
||
int fl=0 ;
|
||
int money=100 ;
|
||
int fd = getfdFromCharaIndex( toindex);
|
||
char tmp[64];
|
||
|
||
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
|
||
print("GetArgStrErr");
|
||
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);
|
||
return ;
|
||
}
|
||
|
||
if(NPC_PARTY_CHAECK( meindex, toindex) == FALSE) {
|
||
NPC_ERR_DiSP( meindex, toindex, 1);
|
||
return;
|
||
}
|
||
|
||
|
||
if( CHAR_getWorkInt( toindex, CHAR_WORKSHOPRELEVANT) != 0 ) {
|
||
return;
|
||
}else {
|
||
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 1);
|
||
}
|
||
|
||
if(strstr(npcarg,"%4d")!=NULL){
|
||
int flwork = 0;
|
||
int work;
|
||
NPC_Util_GetStrFromStrWithDelim( npcarg, "WARP", buf, sizeof( buf));
|
||
getStringFromIndexWithDelim(buf,",",1,buf3,sizeof(buf3));
|
||
work = atoi( buf3);
|
||
fl = NPC_FloorUse( toindex, atoi(buf3));
|
||
|
||
if(NPC_Util_GetStrFromStrWithDelim( npcarg, "Floor", buf3, sizeof( buf3)) != NULL){
|
||
flwork = NPC_FloorUseOtherFloor(work, buf3);
|
||
}
|
||
fl = fl +flwork;
|
||
}
|
||
|
||
NPC_Util_GetStrFromStrWithDelim( npcarg, "FREE", buf, sizeof( buf));
|
||
|
||
if( (NPC_ActionPassCheck(meindex,toindex,buf)==TRUE) || (strstr(buf,"ALLFREE")!=NULL) ){
|
||
if(NPC_Util_GetStrFromStrWithDelim( npcarg, "FreeMsg", buf2, sizeof( buf2))==NULL) return;
|
||
CONNECT_set_pass(fd,TRUE);
|
||
CONNECT_set_first_warp(fd,TRUE);
|
||
if(strstr(buf2,"%4d") != NULL){
|
||
sprintf(token,buf2,fl);
|
||
}else{
|
||
strcpy(token,buf2);
|
||
}
|
||
CHAR_setWorkInt( toindex , CHAR_WORKSHOPRELEVANTTRD , -1 );
|
||
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 2);
|
||
}else {
|
||
if(NPC_Util_GetStrFromStrWithDelim( npcarg, "PayMsg", buf2, sizeof( buf2)) != NULL){
|
||
CONNECT_set_pass(fd,FALSE);
|
||
CONNECT_set_first_warp(fd,FALSE);
|
||
if(strstr(buf2,"%8d") != NULL){
|
||
NPC_Util_GetStrFromStrWithDelim( npcarg, "MONEY", tmp, sizeof( tmp));
|
||
if(strstr(tmp,"LV")!=NULL){
|
||
int level;
|
||
char buff2[32];
|
||
|
||
level = CHAR_getInt(toindex,CHAR_LV);
|
||
getStringFromIndexWithDelim(tmp,"*",2,buff2,sizeof(buff2));
|
||
money = level*atoi(buff2);
|
||
}else{
|
||
money=atoi(tmp);
|
||
}
|
||
if(strstr(buf2,"%4d") != NULL){
|
||
sprintf(token,buf2,fl,money);
|
||
}else{
|
||
sprintf(token,buf2,money);
|
||
}
|
||
}else if(strstr(buf2,"%4d") != NULL){
|
||
sprintf(token,buf2,fl);
|
||
NPC_Util_GetStrFromStrWithDelim( npcarg, "MONEY", tmp, sizeof( tmp));
|
||
if( strstr( tmp,"-" ) != NULL){
|
||
money=10000001;
|
||
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
|
||
WINDOW_BUTTONTYPE_OK,
|
||
CHAR_WINDOWTYPE_WINDOWWARPMAN_MAIN,
|
||
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
|
||
token);
|
||
return ;
|
||
}
|
||
}else{
|
||
strcpy(token,buf2);
|
||
NPC_Util_GetStrFromStrWithDelim( npcarg, "MONEY", tmp, sizeof( tmp));
|
||
if( strstr( tmp,"-" ) != NULL){
|
||
money=10000001;
|
||
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
|
||
WINDOW_BUTTONTYPE_OK,
|
||
CHAR_WINDOWTYPE_WINDOWWARPMAN_MAIN,
|
||
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
|
||
token);
|
||
return ;
|
||
}else{
|
||
money = atoi(tmp);
|
||
}
|
||
}
|
||
if(CHAR_getInt(toindex,CHAR_FLOOR)==117){
|
||
money=CHAR_getInt(toindex,CHAR_GOLD);
|
||
if (money>=10) money*=0.9;
|
||
else if( money == 0 ) {
|
||
CHAR_warpToSpecificPoint(toindex,117,225,13);
|
||
return;
|
||
}
|
||
}
|
||
CHAR_setWorkInt( toindex , CHAR_WORKSHOPRELEVANTTRD , money );
|
||
CONNECT_set_pass(fd,TRUE);
|
||
CONNECT_set_first_warp(fd,TRUE);
|
||
|
||
}else if(NPC_Util_GetStrFromStrWithDelim( npcarg, "NomalMsg", token,sizeof(token)) !=NULL){
|
||
CHAR_setWorkInt( toindex , CHAR_WORKSHOPRELEVANTTRD , -2 );
|
||
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, -1);
|
||
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
|
||
WINDOW_BUTTONTYPE_OK,
|
||
CHAR_WINDOWTYPE_WINDOWWARPMAN_MAIN,
|
||
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
|
||
token);
|
||
}
|
||
}
|
||
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
|
||
WINDOW_BUTTONTYPE_YESNO,
|
||
CHAR_WINDOWTYPE_WINDOWWARPMAN_MAIN,
|
||
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
|
||
token);
|
||
}
|
||
|
||
void NPC_WarpManWindowTalked( int meindex, int talkerindex,
|
||
int seqno, int select, char *data)
|
||
{
|
||
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE - 1024 * 20];
|
||
char buf[NPC_UTIL_GETARGSTR_BUFSIZE - 1024 * 20];
|
||
#ifdef _NEW_WARPMAN
|
||
BOOL checkp=TRUE;
|
||
char buf1[1024];
|
||
int talkNo = 1;
|
||
BOOL tenflg=FALSE;
|
||
#else
|
||
int fl,x,y;
|
||
#endif
|
||
char buff2[256];
|
||
int fd = getfdFromCharaIndex( talkerindex );
|
||
if( NPC_Util_CharDistance( talkerindex, meindex ) > 2)
|
||
return;
|
||
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
|
||
print("GetArgStrErr");
|
||
return ;
|
||
}
|
||
if( CHAR_getWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT) < 1 ) {
|
||
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, -1);
|
||
return;
|
||
}
|
||
|
||
#ifdef _NEW_WARPMAN
|
||
if( seqno == NEW_WARPMAN ) {
|
||
int eqnum=0;
|
||
eqnum = CHAR_getWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT);
|
||
sprintf(buf1,"%s", "NOFREE");
|
||
if( eqnum >= 0 ) {
|
||
sprintf(buf1,"TALKEVENT%d", eqnum);
|
||
}
|
||
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
|
||
while( getStringFromIndexWithDelim( npcarg,"OVER",talkNo,buf,sizeof( buf)) != FALSE){
|
||
if( strstr(buf, buf1) != NULL) {
|
||
strcpy( npcarg , buf);
|
||
tenflg = TRUE;
|
||
break;
|
||
}
|
||
talkNo++;
|
||
}
|
||
if( tenflg == FALSE ) {
|
||
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, -1);
|
||
return;
|
||
}
|
||
}else {
|
||
#endif
|
||
if( select != WINDOW_BUTTONTYPE_YES ) {
|
||
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, -1);
|
||
return;
|
||
}
|
||
if(NPC_PARTY_CHAECK( meindex, talkerindex) == FALSE){
|
||
NPC_ERR_DiSP( meindex, talkerindex, 1);
|
||
return;
|
||
}
|
||
#ifdef _NEW_WARPMAN
|
||
}
|
||
#else
|
||
NPC_Util_GetStrFromStrWithDelim( npcarg, "WARP", buf, sizeof( buf));
|
||
GetRand_WarpPoint( buf, &fl, &x, &y );
|
||
#endif
|
||
|
||
#ifdef _NEW_WARPMAN
|
||
switch( seqno) {
|
||
case WARP_MAN:
|
||
if( select != WINDOW_BUTTONTYPE_YES )
|
||
return;
|
||
if( NPC_PARTY_CHAECK( meindex, talkerindex) == FALSE ){
|
||
NPC_ERR_DiSP( meindex, talkerindex, 1);
|
||
return;
|
||
}
|
||
#else
|
||
if( select != WINDOW_BUTTONTYPE_YES) return;
|
||
if( NPC_PARTY_CHAECK( meindex, talkerindex) == FALSE)
|
||
return;
|
||
#endif
|
||
|
||
#ifdef _NEW_WARPMAN
|
||
break;
|
||
case NEW_WARPMAN:
|
||
if( select != WINDOW_BUTTONTYPE_YES ){
|
||
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, -1);
|
||
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "CancelMsg", buff2, sizeof( buff2) ) != NULL) {
|
||
CHAR_talkToCli( talkerindex, meindex, buff2, CHAR_COLORYELLOW);
|
||
}
|
||
return;
|
||
}
|
||
checkp=TRUE;
|
||
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "CHECKPARTY", buff2, sizeof( buff2) ) != NULL) {
|
||
if( strstr( buff2, "FALSE") != NULL ) {
|
||
checkp = FALSE;
|
||
}
|
||
}
|
||
if( checkp==TRUE && NPC_PARTY_CHAECK( meindex, talkerindex) == FALSE ) {
|
||
NPC_ERR_DiSP( meindex, talkerindex, 1);
|
||
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, -1);
|
||
return;
|
||
}
|
||
break;
|
||
case NEW_WARPMAN_END:
|
||
return;
|
||
break;
|
||
}
|
||
#endif
|
||
|
||
if( Action_RunDoEventAction( meindex, talkerindex, npcarg) == FALSE ){
|
||
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, -1);
|
||
return;
|
||
}
|
||
|
||
CHAR_complianceParameter( talkerindex );
|
||
CHAR_send_P_StatusString( talkerindex ,
|
||
CHAR_P_STRING_ATK|CHAR_P_STRING_DEF|
|
||
CHAR_P_STRING_CHARM|CHAR_P_STRING_QUICK|
|
||
CHAR_P_STRING_WATER|CHAR_P_STRING_FIRE|
|
||
CHAR_P_STRING_WIND|CHAR_P_STRING_EARTH
|
||
);
|
||
if( CHAR_getWorkInt( CONNECT_getCharaindex(fd), CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE){
|
||
return ;
|
||
}
|
||
if(CHAR_getWorkInt( talkerindex , CHAR_WORKSHOPRELEVANTTRD) <= 0){
|
||
CHAR_setWorkInt( talkerindex, CHAR_WORKWARPCHECK, FALSE );
|
||
#ifdef _NEW_WARPMAN
|
||
NPC_WarpMsg( meindex, talkerindex, npcarg);
|
||
#else
|
||
if( fl == 0 && x == 0 && y == 0 ) {
|
||
}else {
|
||
CHAR_warpToSpecificPoint(talkerindex, fl, x,y);
|
||
}
|
||
#endif
|
||
}else {
|
||
if(CHAR_getInt(talkerindex,CHAR_GOLD) <
|
||
CHAR_getWorkInt(talkerindex,CHAR_WORKSHOPRELEVANTTRD)){
|
||
NPC_ERR_DiSP( meindex, talkerindex, 2);
|
||
return ;
|
||
}
|
||
CHAR_DelGold( talkerindex, CHAR_getWorkInt(talkerindex,CHAR_WORKSHOPRELEVANTTRD ));
|
||
|
||
CHAR_setWorkInt( talkerindex, CHAR_WORKWARPCHECK, FALSE );
|
||
#ifdef _NEW_WARPMAN
|
||
NPC_WarpMsg( meindex, talkerindex, npcarg);
|
||
#else
|
||
if( fl == 0 && x == 0 && y == 0 ) {
|
||
}else {
|
||
CHAR_warpToSpecificPoint(talkerindex, fl, x,y);
|
||
}
|
||
#endif
|
||
|
||
}
|
||
#ifdef _NEW_WARPMAN
|
||
NPC_NpcWarpMsg( meindex, talkerindex, npcarg);
|
||
#else
|
||
}
|
||
#endif
|
||
}
|
||
|
||
BOOL NPC_BigSmallLastCheck(int point1,int mypoint,int flg)
|
||
{
|
||
if(flg==0){
|
||
if(point1==mypoint) {
|
||
return TRUE;
|
||
}
|
||
|
||
}else if(flg==1){
|
||
if(mypoint < point1) {
|
||
return TRUE;
|
||
}
|
||
|
||
}else if(flg==2){
|
||
if(mypoint > point1) {
|
||
return TRUE;
|
||
}
|
||
}
|
||
|
||
return FALSE;
|
||
|
||
}
|
||
|
||
BOOL NPC_GetDuelPointCheck(int meindex,int talker)
|
||
{
|
||
|
||
int fdid = getFdidFromCharaIndex( talker);
|
||
char dbkey[256];
|
||
|
||
if( fdid == -1 ) return FALSE;
|
||
|
||
CHAR_makeDBKey( talker, dbkey, sizeof( dbkey));
|
||
saacproto_DBGetEntryRank_send( acfd, DB_DUELPOINT, dbkey, fdid,
|
||
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX));
|
||
|
||
return TRUE;
|
||
|
||
}
|
||
|
||
void NPC_GetDuelRank(int rank,int fdid,int objindex)
|
||
{
|
||
|
||
int talker;
|
||
int meindex;
|
||
|
||
|
||
rank++;
|
||
talker = getCharindexFromFdid( fdid);
|
||
if( talker == -1 ) return;
|
||
|
||
meindex= OBJECT_getIndex( objindex);
|
||
if( !CHAR_CHECKINDEX( meindex)) return;
|
||
|
||
CHAR_setWorkInt(talker,CHAR_WORKSHOPRELEVANTSEC,rank);
|
||
|
||
NPC_WarpMan_selectWindow( meindex, talker,0,-1);
|
||
|
||
}
|
||
|
||
BOOL NPC_PARTY_CHAECK(int meindex,int talker)
|
||
{
|
||
if(CHAR_getWorkInt(talker,CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE){
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
void NPC_ERR_DiSP(int meindex,int talker,int errNO)
|
||
{
|
||
char token[1024];
|
||
int i=0;
|
||
int otherindex;
|
||
int fd = getfdFromCharaIndex( talker);
|
||
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE - 1024 * 20];
|
||
|
||
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
|
||
print("GetArgStrErr");
|
||
return ;
|
||
}
|
||
if(errNO==1){
|
||
if(NPC_Util_GetStrFromStrWithDelim( npcarg, "PartyMsg",token, sizeof( token))==NULL) {
|
||
sprintf(token,"\n\n 无法加入团队。 "
|
||
"\n\n 请解散团队 。 ");
|
||
}
|
||
if(CHAR_getWorkInt(talker,CHAR_WORKPARTYMODE)==CHAR_PARTY_CLIENT){
|
||
}else{
|
||
|
||
for( i=0 ; i < CHAR_PARTYMAX ;i++){
|
||
otherindex=CHAR_getWorkInt(talker,CHAR_WORKPARTYINDEX1+i);
|
||
if(otherindex != -1){
|
||
fd = getfdFromCharaIndex( otherindex);
|
||
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
|
||
WINDOW_BUTTONTYPE_OK,
|
||
CHAR_WINDOWTYPE_WINDOWWARPMAN_ERR,
|
||
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
|
||
token);
|
||
}
|
||
}
|
||
return ;
|
||
}
|
||
}else if (errNO==2){
|
||
if(NPC_Util_GetStrFromStrWithDelim( npcarg, "MoneyMsg", token, sizeof( token))==NULL){
|
||
sprintf(token,"\n\n 似乎金钱不足唷。 "
|
||
"\n\n 请存好钱後,再过来。");
|
||
}
|
||
}
|
||
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
|
||
WINDOW_BUTTONTYPE_OK,
|
||
CHAR_WINDOWTYPE_WINDOWWARPMAN_ERR,
|
||
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
|
||
token);
|
||
}
|
||
|
||
int NPC_FloorUse(int charaindex,int floor)
|
||
{
|
||
int i;
|
||
int players=0;
|
||
int playernum = CHAR_getPlayerMaxNum();
|
||
for( i=0 ; i< playernum ; i++ ){
|
||
if( CHAR_getCharUse(i) == FALSE )continue;
|
||
if(CHAR_getInt(i,CHAR_FLOOR)==floor){
|
||
players++;
|
||
}
|
||
}
|
||
return players;
|
||
}
|
||
|
||
int NPC_FloorUseOtherFloor(int warp, char *buf)
|
||
{
|
||
int i,j=1;
|
||
int players=0;
|
||
int playernum = CHAR_getPlayerMaxNum();
|
||
char buf2[32];
|
||
int floor;
|
||
|
||
for( i=0 ; i< playernum ; i++ ){
|
||
if( CHAR_getCharUse(i) == FALSE )continue;
|
||
j=1;
|
||
while(getStringFromIndexWithDelim(buf,",",j,buf2,sizeof(buf2))!= FALSE){
|
||
j++;
|
||
floor = atoi(buf2);
|
||
if(CHAR_getInt(i,CHAR_FLOOR) == floor && warp != floor) {
|
||
players++;
|
||
}
|
||
}
|
||
}
|
||
return players;
|
||
}
|
||
|
||
BOOL NPC_WarpMsg(int meindex,int talker,char *arg)
|
||
{
|
||
char buf[256];
|
||
int fl=0,x=0,y=0;
|
||
int parent=-1;
|
||
int pmode;
|
||
int subindex;
|
||
int i;
|
||
|
||
if( NPC_Util_GetStrFromStrWithDelim( arg, "WARP", buf, sizeof( buf)) == NULL )
|
||
return FALSE;
|
||
GetRand_WarpPoint( buf, &fl, &x, &y );
|
||
if( fl == 0 && x == 0 && y == 0 ) {
|
||
return TRUE;
|
||
}else {
|
||
if( MAP_IsValidCoordinate( fl,x,y )== FALSE ){
|
||
print( "Warp NPC:1.Invalid warpman ERR" );
|
||
return FALSE;
|
||
}
|
||
}
|
||
#ifdef _TIME_TICKET
|
||
if( check_TimeTicketMap( fl) ) {
|
||
int havei, itemi;
|
||
CHAR_setWorkInt( talker, CHAR_WORKTICKETTIME, 0);
|
||
CHAR_setWorkInt( talker, CHAR_WORKTICKETTIMESTART, 0);
|
||
for( havei = CHAR_STARTITEMARRAY ; havei < CHAR_MAXITEMHAVE ; havei++ ){
|
||
itemi = CHAR_getItemIndex( talker, havei);
|
||
if( !ITEM_CHECKINDEX( itemi) ) continue;
|
||
if( strcmp( ITEM_getChar( itemi, ITEM_USEFUNC), "ITEM_timeticket") ) continue;
|
||
//if( ITEM_getInt( itemi ,ITEM_ID) != 20646 ) continue;
|
||
CHAR_talkToCli( talker, -1, "自动使用门票。", CHAR_COLORYELLOW);
|
||
ITEM_timeticketEx( talker, talker, havei, 1);
|
||
break;
|
||
}
|
||
if( havei == CHAR_MAXITEMHAVE ) {
|
||
CHAR_talkToCli( talker, -1, "请先准备专用门票才可进入。", CHAR_COLORYELLOW);
|
||
return FALSE;
|
||
}
|
||
}
|
||
#endif
|
||
pmode = CHAR_getWorkInt( talker, CHAR_WORKPARTYMODE );
|
||
switch( pmode ){
|
||
case 1:
|
||
parent = talker;
|
||
break;
|
||
case 2:
|
||
parent = CHAR_getWorkInt( talker, CHAR_WORKPARTYINDEX1 );
|
||
break;
|
||
default:
|
||
CHAR_warpToSpecificPoint(talker, fl, x,y);
|
||
return TRUE;
|
||
}
|
||
if( parent < 0 )
|
||
return TRUE;
|
||
for( i = 0; i < CHAR_PARTYMAX; i ++ ){
|
||
subindex = CHAR_getWorkInt( parent, CHAR_WORKPARTYINDEX1+i );
|
||
if( CHAR_CHECKINDEX( subindex ) == FALSE )continue;
|
||
if( fl==0 && x==0 && y==0 ) {
|
||
}else {
|
||
CHAR_warpToSpecificPoint( subindex, fl, x, y );
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
#ifdef _NEW_WARPMAN
|
||
static void NPC_NewWarpMan_selectWindow( int meindex, int toindex, int num,int select,char *TalkStr)
|
||
{
|
||
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE - 1024 * 20];
|
||
char token[1024];
|
||
int buttontype = 0, windowtype = 0, windowno = 0;
|
||
char buf[NPC_UTIL_GETARGSTR_BUFSIZE - 1024 * 20],buf1[256];
|
||
int fd = getfdFromCharaIndex( toindex);
|
||
BOOL tenflg =FALSE;
|
||
int talkNo=1,RunType=-1;
|
||
|
||
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
|
||
print("GetArgStrErr");
|
||
return ;
|
||
}
|
||
|
||
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "NEWTIME", buf1, sizeof( buf1)) != NULL ){
|
||
if( CHAR_getWorkInt( meindex, NPC_TIME_MODE) <= 0 ) {
|
||
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "Time_Msg", token, sizeof( token) ) != NULL) {
|
||
CHAR_talkToCli( toindex, meindex, token, CHAR_COLORYELLOW);
|
||
}
|
||
return;
|
||
}
|
||
}
|
||
|
||
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
|
||
sprintf( buf1,"TALKEVENT");
|
||
//寻找多种条件 FREE
|
||
while(getStringFromIndexWithDelim( npcarg,"OVER",talkNo,buf,sizeof( buf)) != FALSE) {
|
||
if(strstr(buf, buf1) != NULL) {
|
||
//检查对话 暗语
|
||
RunType = CheckWarpMsg( meindex, toindex, buf , TalkStr);
|
||
if( RunType > 1 ) {
|
||
return;
|
||
}else if( RunType != 0 ) {
|
||
talkNo++;
|
||
continue;
|
||
}
|
||
if( NPC_Util_GetStrFromStrWithDelim( buf, "FREE", token, sizeof( token) ) == NULL) {
|
||
print("msgErr");
|
||
return;
|
||
}
|
||
|
||
//检查玩家是否附合条件
|
||
if((NPC_ActionPassCheck(meindex,toindex,token)==TRUE) || (strstr( token, "ALLFREE")!=NULL) ) {
|
||
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, talkNo-1);
|
||
|
||
//若附合条件 取出 FreeMsg 字串
|
||
if(NPC_Util_GetStrFromStrWithDelim( buf, "FreeMsg", token, sizeof( token))==NULL)
|
||
return;
|
||
CONNECT_set_pass(fd,TRUE);
|
||
CONNECT_set_first_warp(fd,TRUE);
|
||
buttontype = WINDOW_BUTTONTYPE_YESNO;
|
||
windowno = NEW_WARPMAN;
|
||
tenflg = TRUE;
|
||
CHAR_setWorkInt( toindex , CHAR_WORKSHOPRELEVANTTRD , -1 );
|
||
break;
|
||
}
|
||
}
|
||
talkNo++;
|
||
}
|
||
|
||
//无任何条件成立
|
||
if( tenflg == FALSE ) {
|
||
if( getStringFromIndexWithDelim( npcarg,"OVER",1,buf,sizeof( buf)) == FALSE )
|
||
return;
|
||
if( strstr( buf, "NOFREE") == NULL ) {
|
||
return;
|
||
}else {
|
||
strcpy( npcarg, buf);
|
||
}
|
||
if(NPC_Util_GetStrFromStrWithDelim( npcarg, "NomalMsg", token,sizeof(token)) != NULL) {
|
||
CHAR_talkToCli( toindex, meindex, token,CHAR_COLORWHITE);
|
||
return;
|
||
}
|
||
}
|
||
|
||
//送讯息给 CLI
|
||
lssproto_WN_send( fd, windowtype, buttontype, windowno,
|
||
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token );
|
||
}
|
||
|
||
#endif
|
||
//ANDY_RE
|
||
int CheckWarpMsg( int meindex, int talkerindex,char *npcarg ,char *TalkStr)
|
||
{
|
||
char buf[1024];
|
||
|
||
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "warp_msg", buf, sizeof( buf) ) == NULL)
|
||
return 0;
|
||
if( strcmp( buf, TalkStr) )
|
||
return 1;
|
||
|
||
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "CHECKPARTY", buf, sizeof( buf) ) != NULL) {
|
||
if( strstr( buf, "FALSE") != NULL ) {
|
||
}else {
|
||
if( NPC_PARTY_CHAECK( meindex, talkerindex) == FALSE ) {
|
||
NPC_ERR_DiSP( meindex, talkerindex, 1);
|
||
return 2;
|
||
}
|
||
}
|
||
}
|
||
|
||
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "FREE", buf, sizeof( buf)) == NULL )
|
||
return 2;
|
||
if( ( NPC_ActionPassCheck( meindex, talkerindex, buf ) == FALSE) ) {
|
||
if(NPC_Util_GetStrFromStrWithDelim( npcarg, "NomalMsg", buf,sizeof(buf)) != NULL) {
|
||
CHAR_talkToCli( talkerindex, meindex,buf,CHAR_COLORWHITE);
|
||
}
|
||
return 2;
|
||
}else {
|
||
if( Action_RunDoEventAction( meindex, talkerindex, npcarg) == FALSE ){
|
||
|
||
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, -1);
|
||
return 3;
|
||
}
|
||
CHAR_complianceParameter( talkerindex );
|
||
CHAR_send_P_StatusString( talkerindex ,
|
||
CHAR_P_STRING_ATK|CHAR_P_STRING_DEF|
|
||
CHAR_P_STRING_CHARM|CHAR_P_STRING_QUICK|
|
||
CHAR_P_STRING_WATER|CHAR_P_STRING_FIRE|
|
||
CHAR_P_STRING_WIND|CHAR_P_STRING_EARTH );
|
||
|
||
if(NPC_Util_GetStrFromStrWithDelim( npcarg, "FreeMsg", buf, sizeof( buf)) != NULL ){
|
||
CHAR_talkToCli( talkerindex, meindex, buf, CHAR_COLORWHITE);
|
||
}
|
||
|
||
NPC_WarpMsg( meindex, talkerindex, npcarg);
|
||
NPC_NpcWarpMsg( meindex, talkerindex, npcarg);
|
||
return 4;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
BOOL NPC_NpcWarpMsg(int meindex,int talker,char *arg)
|
||
{
|
||
char buf[256];
|
||
int fl=0,x=0,y=0;
|
||
|
||
if( CHAR_CHECKINDEX( meindex ) == FALSE )
|
||
return FALSE;
|
||
|
||
if( NPC_Util_GetStrFromStrWithDelim( arg, "NPCPOINT", buf, sizeof( buf)) == NULL )
|
||
return FALSE;
|
||
GetRand_WarpPoint( buf, &fl, &x, &y );
|
||
|
||
if( MAP_IsValidCoordinate( fl,x,y )== FALSE ){
|
||
print( "Warp NPC:2.Invalid warpman ERR" );
|
||
return FALSE;
|
||
}
|
||
|
||
CHAR_warpToSpecificPoint( meindex, fl, x, y );
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
void NPC_WarpManLoop( int meindex)
|
||
{
|
||
int born, dead;
|
||
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE - 1024 * 20];
|
||
if( !CHAR_CHECKINDEX( meindex) ) return;
|
||
|
||
if( NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg)) == NULL ){
|
||
print("WarpMan:GetArgStrErr");
|
||
return;
|
||
}
|
||
if( !strstr( npcarg,"NEWWARPMAN") )
|
||
return;
|
||
|
||
if( NPC_getTimeData( meindex, npcarg, &born, &dead, 200) != FALSE ){
|
||
NPC_TimeDefineDo( meindex, born, dead, NPC_TIME_MODE);
|
||
CHAR_sendCToArroundCharacter( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX ) );
|
||
}
|
||
}
|
||
|
||
void NPC_WarpManWatch( int meobjindex, int objindex, CHAR_ACTION act,
|
||
int x,int y,int dir, int* opt,int optlen )
|
||
{
|
||
int born, dead;
|
||
int meindex, index;
|
||
|
||
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE - 1024 * 20];
|
||
|
||
if( OBJECT_getType( objindex) != OBJTYPE_CHARA) return;
|
||
index = OBJECT_getIndex( objindex);
|
||
if( !CHAR_CHECKINDEX( index) ) return;
|
||
if( CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER) return;
|
||
meindex = OBJECT_getIndex( meobjindex);
|
||
if( !CHAR_CHECKINDEX( meindex) ) return;
|
||
|
||
if( NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg)) == NULL ){
|
||
print("WarpMan:GetArgStrErr");
|
||
return;
|
||
}
|
||
if( !strstr( npcarg,"NEWWARPMAN") )
|
||
return;
|
||
#ifdef _TREASURE_BOX
|
||
if( CHAR_getWorkInt( meindex, NPC_TIME_EVENTMODE) == NPC_EVENTMODE_OPEN ){
|
||
if( CHAR_getWorkInt( meindex, NPC_TIME_EVENTTIME) < NowTime.tv_sec ){
|
||
//变回宝箱
|
||
CHAR_setWorkInt( meindex, NPC_TIME_EVENTMODE, NPC_EVENTMODE_EVENT);
|
||
//变图
|
||
CHAR_setInt( meindex, CHAR_BASEBASEIMAGENUMBER,
|
||
CHAR_getWorkInt( meindex, NPC_TIME_EVENOFFDBBI));
|
||
CHAR_setInt( meindex, CHAR_BASEIMAGENUMBER,
|
||
CHAR_getWorkInt( meindex, NPC_TIME_EVENOFFDBBI));
|
||
NPC_TreasureEventRunMsg( meindex); //是否warp
|
||
CHAR_sendCToArroundCharacter( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX ) );
|
||
}
|
||
}
|
||
#endif
|
||
if( NPC_getTimeData( meindex, npcarg, &born, &dead, 200) != FALSE ){
|
||
NPC_TimeDefineDo( meindex, born, dead, NPC_TIME_MODE);
|
||
CHAR_sendCToArroundCharacter( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX ) );
|
||
}
|
||
}
|
||
|
||
#ifdef _TREASURE_BOX
|
||
BOOL NPC_TreasureEventRunMsg( int meindex)
|
||
{
|
||
char buf[256];
|
||
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE - 1024 * 20];
|
||
|
||
int fl,x,y;
|
||
|
||
if( !CHAR_CHECKINDEX( meindex ))
|
||
return FALSE;
|
||
|
||
|
||
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
|
||
print("WarpMan:GetArgStrErr");
|
||
return FALSE;
|
||
}
|
||
|
||
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "TREASURE_NUM", buf, sizeof( buf)) == NULL )
|
||
return FALSE;
|
||
|
||
if( CHAR_getWorkInt( meindex, NPC_TIME_EVENTNUM) < atoi( buf) ) return FALSE;
|
||
CHAR_setWorkInt( meindex, NPC_TIME_EVENTNUM, 0);
|
||
|
||
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "TREASURE_POINT", buf, sizeof( buf)) == NULL )
|
||
return FALSE;
|
||
GetRand_WarpPoint( buf, &fl, &x, &y );
|
||
|
||
if( MAP_IsValidCoordinate( fl,x,y )== FALSE ){
|
||
print( "Warp NPC:2.Invalid warpman ERR" );
|
||
return FALSE;
|
||
}
|
||
|
||
CHAR_warpToSpecificPoint( meindex, fl, x, y );
|
||
return TRUE;
|
||
}
|
||
|
||
#endif
|
||
|
||
BOOL NPC_TreasureRandItemGet(int meidex,int talker,int rand_j,char *buf)
|
||
{
|
||
char buff2[64];
|
||
int randitem;
|
||
int ret;
|
||
int itemindex;
|
||
char token[128];
|
||
|
||
if(rand_j == 0) {
|
||
print("Event:由於0的介入,出现错误。");
|
||
return FALSE;
|
||
}
|
||
|
||
randitem = rand()%rand_j;
|
||
if(randitem == 0) randitem = rand_j;
|
||
|
||
getStringFromIndexWithDelim(buf , "," , randitem, buff2, sizeof(buff2)) ;
|
||
|
||
itemindex = ITEM_makeItemAndRegist( atoi( buff2));
|
||
|
||
if(itemindex == -1) return FALSE;
|
||
|
||
/*失奶 丞及馨笛( 涛失奶 丞 卞中木化仄引丹 */
|
||
ret = CHAR_addItemSpecificItemIndex( talker, itemindex);
|
||
if( !CHAR_CHECKITEMINDEX( talker, ret) ){
|
||
print( "npc_exchangeman.c: additem error itemindex[%d]\n", itemindex);
|
||
ITEM_endExistItemsOne( itemindex);
|
||
return FALSE;
|
||
}
|
||
|
||
if(itemindex != -1) {
|
||
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
|
||
"EventAddItem(任务需求所得到的道具)",
|
||
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)
|
||
);
|
||
}
|
||
|
||
sprintf(token,"收下了%s",ITEM_getChar( itemindex, ITEM_NAME));
|
||
CHAR_talkToCli( talker, -1, token, CHAR_COLORWHITE);
|
||
|
||
CHAR_sendItemDataOne( talker, ret);
|
||
return TRUE;
|
||
|
||
}
|
||
|
||
#ifdef _NPC_ADDLEVELUP // (不可开) ANDY 外部测试机用来增加玩家等级
|
||
extern tagRidePetTable ridePetTable[296];
|
||
void NPC_LevelAndTransUp( int meindex, int charindex, int level, int skillpoint, int exp, int ridepet)
|
||
{
|
||
char szBuffer[256]="";
|
||
if( !CHAR_CHECKINDEX( charindex) )
|
||
return;
|
||
//int CHAR_LevelUpCheck( int charaindex , int toindex)
|
||
if( exp > 0 ){
|
||
int LevelUp=0;
|
||
int myexp = CHAR_getInt( charindex, CHAR_EXP);
|
||
myexp += exp;
|
||
if( myexp > 300000000 ) myexp = 300000000;
|
||
CHAR_setInt( charindex, CHAR_EXP, myexp);
|
||
snprintf( szBuffer, sizeof(szBuffer),
|
||
"(%s) 得到 EXP %d", CHAR_getUseName( charindex ), exp);
|
||
CHAR_talkToCli( charindex, -1, szBuffer, CHAR_COLORYELLOW);
|
||
LevelUp = CHAR_LevelUpCheck( charindex , -1);
|
||
if( LevelUp > 0 ){
|
||
snprintf( szBuffer, sizeof(szBuffer),
|
||
"(%s) 升级至 %d",
|
||
CHAR_getUseName( charindex ),
|
||
CHAR_getInt( charindex, CHAR_LV )
|
||
);
|
||
CHAR_talkToCli( charindex, -1, szBuffer, CHAR_COLORYELLOW);
|
||
CHAR_setInt( charindex, CHAR_SKILLUPPOINT,
|
||
CHAR_getInt( charindex, CHAR_SKILLUPPOINT) + LevelUp*3 );
|
||
CHAR_complianceParameter( charindex );
|
||
}
|
||
}
|
||
|
||
if( level > 0 ){
|
||
CHAR_setInt( charindex, CHAR_LV, level);
|
||
snprintf( szBuffer, sizeof(szBuffer),
|
||
"(%s) 等级设定为 %d",
|
||
CHAR_getUseName( charindex ), CHAR_getInt( charindex, CHAR_LV )
|
||
);
|
||
CHAR_talkToCli( charindex, -1, szBuffer, CHAR_COLORYELLOW);
|
||
}
|
||
|
||
if( skillpoint > 0 ){
|
||
int MySp = CHAR_getInt( charindex, CHAR_SKILLUPPOINT);
|
||
MySp += skillpoint;
|
||
CHAR_setInt( charindex, CHAR_SKILLUPPOINT, MySp);
|
||
}
|
||
if( ridepet >= 0 ){
|
||
int basepet[2][4]={ {2066,2067,2068,2069},
|
||
{2072,2073,2074,2075}};
|
||
int petTemp[]={-1,-1,-1,-1,-1};
|
||
char msgbuf[256];
|
||
int petNum=0;
|
||
int i,j=0;
|
||
int k=0, petindex,enemyarray;
|
||
petTemp[j++] = basepet[0][rand()%4];
|
||
petTemp[j++] = basepet[1][rand()%4];
|
||
|
||
for( i=0; i< arraysizeof(ridePetTable) ; i++ ){
|
||
if( CHAR_getInt( charindex, CHAR_BASEBASEIMAGENUMBER) == ridePetTable[i].charNo ){
|
||
petTemp[j]= ridePetTable[i].petId;
|
||
j++;
|
||
if( j >= arraysizeof( petTemp) )
|
||
break;
|
||
}
|
||
}
|
||
j=0;
|
||
for( petNum=0; petNum<arraysizeof( petTemp); petNum++) {
|
||
enemyarray = ENEMY_getEnemyArrayFromId( petTemp[ petNum]); //白虎
|
||
petindex = ENEMY_createPetFromEnemyIndex( charindex, enemyarray);
|
||
if( petindex == -1 ) {
|
||
continue;
|
||
}
|
||
j++;
|
||
for( k = 1; k < 120; k ++ ){ //升级
|
||
CHAR_PetLevelUp( petindex );
|
||
CHAR_PetAddVariableAi( petindex, AI_FIX_PETLEVELUP );
|
||
CHAR_setInt( petindex, CHAR_LV, CHAR_getInt( petindex, CHAR_LV) +1 );
|
||
}
|
||
CHAR_complianceParameter( petindex );
|
||
CHAR_setInt( petindex , CHAR_HP , CHAR_getWorkInt( petindex , CHAR_WORKMAXHP ) );
|
||
snprintf( szBuffer, sizeof(szBuffer), "得到%s", CHAR_getUseName( petindex) );
|
||
CHAR_talkToCli( charindex, -1, szBuffer, CHAR_COLORYELLOW);
|
||
}
|
||
for(j = 0; j < CHAR_MAXPETHAVE; j++){
|
||
petindex = CHAR_getCharPet(charindex, j);
|
||
if( !CHAR_CHECKINDEX( petindex) )
|
||
continue;
|
||
CHAR_complianceParameter( petindex );
|
||
snprintf( msgbuf, sizeof( msgbuf ), "K%d", j );
|
||
CHAR_sendStatusString( charindex, msgbuf );
|
||
snprintf( msgbuf, sizeof( msgbuf ), "W%d", j );
|
||
CHAR_sendStatusString( charindex, msgbuf );
|
||
}
|
||
CHAR_setInt( charindex, CHAR_LEARNRIDE, ridepet);
|
||
}
|
||
CHAR_send_P_StatusString( charindex, CHAR_P_STRING_DUELPOINT|
|
||
CHAR_P_STRING_TRANSMIGRATION| CHAR_P_STRING_RIDEPET|
|
||
CHAR_P_STRING_BASEBASEIMAGENUMBER| CHAR_P_STRING_GOLD|
|
||
CHAR_P_STRING_EXP| CHAR_P_STRING_LV| CHAR_P_STRING_HP|CHAR_P_STRING_LEARNRIDE);
|
||
CHAR_Skillupsend( charindex);
|
||
}
|
||
#endif
|
||
//ANDY_END
|