chuyiwen_gmsv/char/char.c
chuyiwen 5adca5545f 2017/1/15添加日语注释
添加日语注释
2017-01-15 06:21:15 +09:00

11089 lines
351 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> // shan
#include <ctype.h>
#include <time.h>
#include <sys/time.h>
#include <errno.h>
#include "net.h"
#include "common.h"
#include "char_base.h"
#include "char_data.h"
#include "char.h"
#include "lssproto_serv.h"
#include "item.h"
#include "item_event.h"
#include "buf.h"
#include "object.h"
#include "map_deal.h"
#include "saacproto_cli.h"
#include "readmap.h"
#include "handletime.h"
#include "char_event.h"
#include "npccreate.h"
#include "addressbook.h"
#include "item_event.h"
#include "magic_base.h"
#include "magic.h"
#include "chatmagic.h"
#include "configfile.h"
#include "log.h"
#include "anim_tbl.h"
#include "encount.h"
#include "battle.h"
#include "pet_skill.h"
#include "util.h"
#include "enemy.h"
#include "npcutil.h"
#include "pet.h"
#include "family.h"
#include "defend.h"
#include "correct_bug.h"
#ifdef _JOBDAILY
#include "npc_checkman.h"
#endif
#ifdef _CHAR_PROFESSION // WON ADD 人物职业栏位
#include "profession_skill.h"
#endif
#ifdef _CHATROOMPROTOCOL // (不可开) Syu ADD 聊天室频道
#include "chatroom.h"
#endif
#ifdef _ALLBLUES_LUA
#include "mylua/function.h"
#endif
extern int channelMember[FAMILY_MAXNUM][FAMILY_MAXCHANNEL][FAMILY_MAXMEMBER];
extern int familyMemberIndex[FAMILY_MAXNUM][FAMILY_MAXMEMBER];
extern tagRidePetTable ridePetTable[296];
extern int BATTLE_getRidePet( int charaindex );
#ifdef _CHANNEL_MODIFY
extern int InitOccChannel(void);
#endif
#ifdef _ANGEL_SUMMON
extern int checkIfAngelByName( char* nameinfo);
extern char* getMissionNameInfo( int charaindex, char* nameinfo);
extern void CHAR_sendAngelMark( int objindex, int flag);
extern int checkIfOnlyAngel( int charaindex);
extern void selectAngel( int charaindex, int heroindex, int mission, int gm_cmd);
#endif
int CharaData( int sockfd, Char* ch );
extern void GOLD_DeleteTimeCheckOne( int objindex);
extern int autopkstart;
extern int playeronlinenum;
extern int autopkcnt;
// WON ADD 修正道具的设定问题
void fix_item_bug(int charaindex, int i);
/*====================キャラの作成に関する関数====================*/
/*------------------------------------------------------------
* 作成する時のオプションの値を設定しようとする。
* 引数
* ch Char* 設定先のキャラのデータ
* option char* クライアントからくるデータ
* 返り値
* 成功 TRUE
* 失敗 FALSE
------------------------------------------------------------*/
static BOOL CHAR_makeCharFromOptionAtCreate( Char* ch ,
int vital, int str, int tgh, int dex,
int earth, int water, int fire, int wind)
{
/* 有効性の検証を行う */
int para[4];
int attr[4];
int i;
int parasum,attrsum;
int cnt;
para[0] = vital;
para[1] = str;
para[2] = tgh;
para[3] = dex;
attr[0] = earth;
attr[1] = water;
attr[2] = fire;
attr[3] = wind;
#define MAXPARAMETER 20
#define PKMAXPARAMETER 300
parasum = 0;
/*
* すべてのデータの中に - はあってはならないし
* 桁あふれの事を考えておいて最大の値も超えない
*/
for( i = 0; i < arraysizeof( para); i ++ ) {
if( para[i] < 0 || para[i] > MAXPARAMETER )return FALSE;
parasum += para[i];
}
#ifdef _NEW_PLAYER_CF //新手出生配置
if( parasum > MAXPARAMETER ) return FALSE;
#else
if( parasum != MAXPARAMETER ) return FALSE;
#endif
#undef MAXPARAMETER
#define MAXATTRIBUTE 10
cnt = 0;
attrsum = 0;
/* 属性のチェックをする */
for( i = 0; i < arraysizeof( para); i ++ ) {
if( attr[i] < 0 || attr[i] > MAXATTRIBUTE )return FALSE;
attrsum += attr[i];
if( attr[i] > 0 ) cnt ++;
}
/* 合計値は10 */
if( attrsum != MAXATTRIBUTE ) return FALSE;
/* 2つより多く割り当てられていたら駄目 */
if( cnt > 2 ) return FALSE;
/* 逆属性は割り当てられない */
if( attr[0] > 0 && attr[2] > 0 ) return FALSE;
if( attr[1] > 0 && attr[3] > 0 ) return FALSE;
#undef MAXATTRIBUTE
/* コピー */
ch->data[CHAR_VITAL] = vital*100;
ch->data[CHAR_STR] = str*100;
ch->data[CHAR_TOUGH] = tgh*100;
ch->data[CHAR_DEX] = dex*100;
ch->data[CHAR_EARTHAT] = attr[0] * 10;
ch->data[CHAR_WATERAT] = attr[1] * 10;
ch->data[CHAR_FIREAT] = attr[2] * 10;
ch->data[CHAR_WINDAT] = attr[3] * 10;
#ifdef _NEWOPEN_MAXEXP
ch->data[CHAR_OLDEXP] = 0;
#endif
ch->data[CHAR_EXP] = 0;
#ifdef _NEW_PLAYER_CF //新手出生配置
ch->data[CHAR_TRANSMIGRATION] = getNewplayertrans();
ch->data[CHAR_GOLD] = getNewplayergivegold();;
ch->data[CHAR_LV] = getNewplayerlv();
#ifdef _VIP_SERVER
ch->data[CHAR_AMPOINT] = getNewplayergivevip();
#endif
// ch->data[CHAR_LEARNRIDE] = 200;
// ch->data[CHAR_LASTTALKELDER] = (rand()%10)>5?35:36;//34;
// ch->data[CHAR_SKILLUPPOINT] = 616;//600;
#ifdef _NEW_RIDEPETS
//ch->data[CHAR_LOWRIDEPETS] = 0xffffffff;
#endif
#endif
#ifdef _PETSKILL_BECOMEPIG
ch->data[CHAR_BECOMEPIG] = -1;
ch->data[CHAR_BECOMEPIG_BBI] = 100250;
#endif
ch->data[CHAR_LASTLEAVETIME] = 0;
return TRUE;
}
#ifdef _HELP_NEWHAND
void CHAR_loginAddItemForNew( int charindex )
{
int emptyitemindexinchara, itemindex;
int i;
char msgbuf[128];
for( i = 0; i < 15; i ++ ) {
emptyitemindexinchara = CHAR_findEmptyItemBox( charindex );
if( emptyitemindexinchara < 0 ){
sprintf( msgbuf, "空间栏位不足。" );
CHAR_talkToCli( charindex, -1, msgbuf, CHAR_COLORYELLOW);
return;
}
#ifdef _NEW_PLAYER_CF
if(getNewplayergiveitem(i)==-1)continue;
itemindex = ITEM_makeItemAndRegist( getNewplayergiveitem(i) );
#endif
if( itemindex != -1 ){
CHAR_setItemIndex( charindex, emptyitemindexinchara, itemindex );
ITEM_setWorkInt(itemindex, ITEM_WORKOBJINDEX,-1);
ITEM_setWorkInt(itemindex, ITEM_WORKCHARAINDEX,charindex);
CHAR_sendItemDataOne( charindex, emptyitemindexinchara);
}
}
print("Get New Hand Item");
}
#endif
void CHAR_createNewChar( int clifd, int dataplacenum, char* charname ,
int imgno,int faceimgno,
int vital,int str,int tgh,int dex,
int earth,int water,int fire,int wind,
int hometown , char *cdkey )
{
Char ch, *chwk;
int charaindex, petindex;
int enemyarray;
char szKey[256];
#ifdef _NEW_PLAYER_CF //新手出生配置
int add_pet[]={0,0,0,0,0};
#endif
memset(&ch,0,sizeof(Char));
if( !CHAR_checkPlayerImageNumber( imgno)) {
lssproto_CreateNewChar_send( clifd ,FAILED, "" );
CONNECT_setState( clifd, NOTLOGIN );
return;
}
if( !CHAR_checkFaceImageNumber( imgno, faceimgno)) {
lssproto_CreateNewChar_send( clifd ,FAILED, "" );
CONNECT_setState( clifd, NOTLOGIN );
return;
}
CHAR_getDefaultChar(&ch,imgno);
ch.data[CHAR_WALKINTERVAL] = getWalksendinterval();
if( CHAR_getInitElderPosition( &ch ,hometown) == FALSE ){
lssproto_CreateNewChar_send( clifd ,FAILED, "" );
CONNECT_setState( clifd, NOTLOGIN );
return;
}else if( MAP_checkCoordinates( ch.data[CHAR_FLOOR], ch.data[CHAR_X],
ch.data[CHAR_Y] ) == FALSE ){
lssproto_CreateNewChar_send( clifd ,FAILED, "");
CONNECT_setState( clifd, NOTLOGIN );
return;
}
strcpysafe( ch.string[CHAR_NAME].string ,
sizeof(ch.string[CHAR_NAME].string),
charname);
if( CHAR_getNewImagenumberFromEquip( imgno,0) == -1 ){
lssproto_CreateNewChar_send( clifd ,FAILED, "");
CONNECT_setState( clifd, NOTLOGIN );
return;
}
ch.data[CHAR_BASEIMAGENUMBER] = imgno;
ch.data[CHAR_BASEBASEIMAGENUMBER] = imgno;
ch.data[CHAR_FACEIMAGENUMBER] = faceimgno;
ch.data[CHAR_DATAPLACENUMBER] = dataplacenum;
#ifdef _FM_JOINLIMIT
ch.data[CHAR_FMTIMELIMIT] = 0;
#endif
#ifdef _NEWSAVE
ch.data[CHAR_SAVEINDEXNUMBER] = -1;
#endif
ch.data[CHAR_HP] = 0x7fffffff;
ch.data[CHAR_CHARM] = 60;
ch.data[CHAR_MAXMP] = ch.data[CHAR_MP] = 100;
strcpysafe( ch.string[CHAR_CDKEY].string,
sizeof( ch.string[CHAR_CDKEY].string), cdkey );
// Robin 0724
ch.data[CHAR_RIDEPET] = -1;
#ifdef _NEW_PLAYER_CF
ch.data[CHAR_LEARNRIDE] = getRidePetLevel();
#endif
#ifdef _NEW_RIDEPETS
ch.data[CHAR_LOWRIDEPETS] = 0;
#endif
#ifdef _PERSONAL_FAME // Arminius: 家族个人声望
ch.data[CHAR_FAME] = 0;
#endif
#ifdef _NEW_MANOR_LAW
ch.data[CHAR_MOMENTUM] = 0; // 个人气势
#endif
#ifdef _TEACHER_SYSTEM
ch.data[CHAR_TEACHER_FAME] = 0; // 导师领导声望
#endif
#ifdef _CHAR_PROFESSION // WON ADD 人物职业
ch.data[PROFESSION_CLASS] = 0;
ch.data[PROFESSION_LEVEL] = 0;
// ch.data[PROFESSION_EXP] = 0;
ch.data[PROFESSION_SKILL_POINT] = 0;
ch.data[ATTACHPILE] = 0;
#endif
#ifdef _TEACHER_SYSTEM
memset(ch.string[CHAR_TEACHER_ID].string,0,sizeof(STRING128));
memset(ch.string[CHAR_TEACHER_NAME].string,0,sizeof(STRING128));
#endif
#ifdef _ITEM_SETLOVER
memset(ch.string[CHAR_LOVERID].string,0,sizeof(STRING128));
memset(ch.string[CHAR_LOVERNAME].string,0,sizeof(STRING128));
#endif
#ifdef _PETSKILL_BECOMEPIG
ch.data[CHAR_BECOMEPIG] = -1;
ch.data[CHAR_BECOMEPIG_BBI] = 100250;
#endif
strcpysafe( ch.string[CHAR_FMNAME].string,
sizeof( ch.string[CHAR_FMNAME].string), "\0" );
ch.data[CHAR_FMINDEX] = -1;
#ifdef _OFFLINE_SYSTEM
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep); /*取得当地时间*/
int mon=1+p->tm_mon;
int date=p->tm_mday;
char offbuf[64];
sprintf(offbuf,"%d-%d-%d",mon,date,0);
strcpysafe( ch.string[CHAR_OFFBUF].string,
sizeof( ch.string[CHAR_OFFBUF].string), offbuf );
//ch.data[CHAR_OFFTIME] = 18000;
ch.data[CHAR_OFFTIME] = 1;
#endif
if( CHAR_makeCharFromOptionAtCreate( &ch,
vital,str,tgh,dex,
earth,water,fire,wind ) == FALSE )
{
lssproto_CreateNewChar_send( clifd ,FAILED,
"option data is invalid\n");
CONNECT_setState( clifd, NOTLOGIN );
return;
}
{
int mp=ch.data[CHAR_MAXMP];
int str=ch.data[CHAR_STR];
int tough=ch.data[CHAR_TOUGH];
ch.data[CHAR_INITDATA] = 2*100*100*100*100 /*+ hp*100*100*100*/
+ mp*100*100 + str* 100 + tough;
}
charaindex = CHAR_initCharOneArray( &ch );
if( charaindex == -1 ) {
lssproto_CreateNewChar_send( clifd ,FAILED, "在线人数已满,无法建立人物");
CONNECT_setState( clifd, NOTLOGIN );
return;
}
#ifdef _ALLBLUES_LUA_1_5
FreeCharCreate(charaindex);
#endif
#ifdef _NEW_PLAYER_CF //新手出生配置
int petNum=0;
int k=0;
int mylevel,level;
if(getNewplayergivepet(0)==-1){
if( CHAR_getInt( charaindex, CHAR_LASTTALKELDER) == 1 )//玛丽娜丝
setNewplayergivepet(0,2);
else if( CHAR_getInt( charaindex, CHAR_LASTTALKELDER) == 2 )//加加
setNewplayergivepet(0,3);
else if( CHAR_getInt( charaindex, CHAR_LASTTALKELDER) == 3 )//卡鲁它那
setNewplayergivepet(0,4);
else
setNewplayergivepet(0,1);
}
#ifdef _NEW_PLAYER_RIDE
if(!strstr( getPlayerRide(), "不送配套骑宠"))
CHAR_PlayerRide(charaindex);
#endif
for( petNum=0; petNum<5; petNum++) {
if(getNewplayergivepet(petNum)==0)continue;
enemyarray = ENEMY_getEnemyArrayFromId( getNewplayergivepet(petNum)); //白虎
petindex = ENEMY_createPetFromEnemyIndex( charaindex, enemyarray);
if( petindex == -1 ) {
continue;
}
add_pet[petNum]=petindex;
mylevel = CHAR_getInt( petindex, CHAR_LV);
level = getNewplayerpetlv()-mylevel;
if(level<1)level=1;
for( k = 1; k < level; k ++ ){ //升级
CHAR_PetLevelUp( petindex );
CHAR_PetAddVariableAi( petindex, AI_FIX_PETLEVELUP );
CHAR_setInt( petindex, CHAR_LV, CHAR_getInt( petindex, CHAR_LV) +1 );
}
CHAR_setInt( petindex , CHAR_VARIABLEAI , 10000 );
CHAR_complianceParameter( petindex );
CHAR_setInt( petindex , CHAR_HP , CHAR_getWorkInt( petindex , CHAR_WORKMAXHP ) );
}
setNewplayergivepet(0,-1);
#endif
#ifdef _HELP_NEWHAND
CHAR_loginAddItemForNew(charaindex);
#endif
#if 1
if( CHAR_makeDBKey( charaindex, szKey, sizeof( szKey ) ) != FALSE ){
int dp;
char info[512];
snprintf( info, sizeof( info),
"%d,%d,%d,%d,%d,%d",
CHAR_getInt( charaindex, CHAR_LV),
CHAR_getInt( charaindex, CHAR_DUELBATTLECOUNT),
CHAR_getInt( charaindex, CHAR_DUELWINCOUNT),
CHAR_getInt( charaindex, CHAR_DUELLOSECOUNT),
CHAR_getInt( charaindex, CHAR_DUELSTWINCOUNT),
CHAR_getInt( charaindex, CHAR_DUELMAXSTWINCOUNT));
dp = CHAR_getInt( charaindex, CHAR_DUELPOINT );
saacproto_DBUpdateEntryInt_send(
acfd,
DB_DUELPOINT,
szKey,
(max(dp,0)),
info,
CONNECT_getFdid(clifd ),0 );
}
#endif
chwk = CHAR_getCharPointer( charaindex);
CHAR_charSaveFromConnectAndChar( clifd,chwk ,FALSE );
CHAR_endCharData(&ch);
CHAR_endCharOneArray( charaindex);
#ifdef _NEW_PLAYER_CF //新手出生配置
{
int k=0;
for( k=0;k<arraysizeof( add_pet); k++) {
CHAR_endCharOneArray( add_pet[k]);
}
}
#endif
CONNECT_setState( clifd, WHILECREATE );
}
static void CHAR_setCharFuncTable( Char *ch)
{
int i;
char *tmp[CHAR_FUNCTABLENUM] = {
"", /* CHAR_INITFUNC */
"core_PreWalk", /* CHAR_WALKPREFUNC */
"core_PostWalk", /* CHAR_WALKPOSTFUNC */
"", /* CHAR_PREOVERFUNC */
"", /* CHAR_PREOVERFUNC */
"core_PlayerWatch", /* CHAR_WATCHFUNC */
#ifdef _FIX_CORE_LOOP
"", /* CHAR_LOOPFUNC */
#else
"core_Loop", /* CHAR_LOOPFUNC */
#endif
"core_Dying", /* CHAR_DYINGFUNC */
"core_PlayerTalked",/* CHAR_TALKEDFUNC */
"", /* CHAR_PREATTACKEDFUNC */
"", /* CHAR_POSTATTACKEDFUNC */
"", /* CHAR_OFFFUNC */
"", /* CHAR_LOOKEDFUNC */
"", /* CHAR_ITEMPUTFUNC */
"", /* CHAR_SPECIALTALKEDFUNC */
"", /* CHAR_WINDOWTALKEDFUNC */
#ifdef _USER_CHARLOOPS
"", // CHAR_LOOPFUNCTEMP1,
"", // CHAR_LOOPFUNCTEMP2,
"", //CHAR_BATTLEPROPERTY,
#endif
};
for( i = 0; i < CHAR_FUNCTABLENUM; i ++ ) {
strcpysafe( ch->charfunctable[i].string,
sizeof( ch->charfunctable[i]),
tmp[i]);
}
}
void CHAR_loginAddItem( int charaindex )
{
/*
int emptyindex, itemindex, id;
int itemID[10]={ 20128, 20130, 20171, 20176, 20296,
20287, 20288, 20289, 20290, 20291};
{
int trn_num=0;
trn_num=CHAR_getInt(charaindex,CHAR_TRANSMIGRATION);
CHAR_setInt( charaindex, CHAR_MAXPOOLITEMHAVELIMIT, 10 + (trn_num * 4) ) ;
CHAR_setInt( charaindex, CHAR_MAXPOOLPETHAVELIMIT , 5 + (trn_num * 2) );
}
while( 1){
emptyindex = CHAR_findEmptyItemBox( charaindex );
if( emptyindex == -1 ) break;
id = rand()%10;
itemindex = ITEM_makeItemAndRegist( itemID[id] );
if( !ITEM_CHECKINDEX( itemindex) ) break;
CHAR_setItemIndex( charaindex, emptyindex, itemindex);
ITEM_setWorkInt( itemindex, ITEM_WORKCHARAINDEX, charaindex);
ITEM_setWorkInt( itemindex, ITEM_WORKOBJINDEX, -1);
//andy_log
print("@:%d.", emptyindex);
}
while( 1){
emptyindex = CHAR_findEmptyPoolItemBox( charaindex );
if( emptyindex == -1 ) break;
id = rand()%10;
itemindex = ITEM_makeItemAndRegist( itemID[id] );
if( !ITEM_CHECKINDEX( itemindex) ) break;
CHAR_setPoolItemIndex( charaindex, emptyindex, itemindex);
ITEM_setWorkInt( itemindex, ITEM_WORKCHARAINDEX, charaindex);
ITEM_setWorkInt( itemindex, ITEM_WORKOBJINDEX, -1);
//andy_log
print("&:%d.", emptyindex);
}
*/
}
void CHAR_loginCheckUserItem( int charaindex)
{
typedef void (*ATTACHFUNC)(int,int);
int i, j, itemindex;
int ID1,ID2;
char* delbuf;
char delitembuf[10];
delbuf = getDelItem();
int myviptype = CHAR_getInt(charaindex,CHAR_VIPRIDE);
for( i=0; i<CHAR_STARTITEMARRAY; i++){ //检查装备中道具
int ti;
itemindex = CHAR_getItemIndex( charaindex , i );
if( !ITEM_CHECKINDEX( itemindex)){
continue;
}
ITEM_reChangeItemName( itemindex);
#ifdef _ITEM_PILENUMS
ITEM_reChangeItemToPile( itemindex);
#endif
ITEM_setItemUniCode( itemindex);
ID1 = ITEM_getInt( itemindex, ITEM_ID);
#ifdef _YUANGUSA
if(ID1>=23228 && ID1<=23307){
if(strstr(ITEM_getChar(itemindex,ITEM_EFFECTSTRING),"需更换")==NULL){
ITEM_setChar(itemindex,ITEM_EFFECTSTRING,"[无属性,需更换]请到渔村村长家(13.5)找更换大师");
}
}
if(((ID1>=3000 && ID1<=11719) || (ID1>=14001 && ID1<=18530)) && ITEM_getInt( itemindex, ITEM_MAXDAMAGECRUSHE)<1){
int maxcrushe = ITEMTBL_getInt(ID1,ITEM_MAXDAMAGECRUSHE);
ITEM_setInt(itemindex,ITEM_MAXDAMAGECRUSHE,maxcrushe);
ITEM_setInt(itemindex,ITEM_DAMAGECRUSHE,maxcrushe);
}
#endif
if(myviptype==0){
if(strstr(ITEM_getChar(itemindex,ITEM_NAME),"[VIP")!=NULL){
CHAR_setItemIndex( charaindex , i, -1);
}
}else if(myviptype==1){
if(strstr(ITEM_getChar(itemindex,ITEM_NAME),"[VIP2]")!=NULL || strstr(ITEM_getChar(itemindex,ITEM_NAME),"[VIP3]")!=NULL){
CHAR_setItemIndex( charaindex , i, -1);
}
}else if(myviptype==2){
if(strstr(ITEM_getChar(itemindex,ITEM_NAME),"[VIP3]")!=NULL ){
CHAR_setItemIndex( charaindex , i, -1);
}
}
#ifdef _JK_CF_DELPETITEM //删除CF指定物品
for( j=1;j<=30;j++ ) {
if(getStringFromIndexWithDelim(delbuf,",", j, delitembuf, sizeof(delitembuf)) == FALSE)
break;
ID2 = atoi(delitembuf);
if(ID2 == -1)break;
if( ID1 == ID2){
CHAR_setItemIndex( charaindex , i, -1);
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
"CF设置清除物品",
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_talkToCli( charaindex, -1, "系统清除你身上的道具", CHAR_COLORWHITE );
}
}
#endif
#ifdef _ANGEL_SUMMON
if( ITEM_getInt( itemindex, ITEM_ID) == ANGELITEM
|| ITEM_getInt( itemindex, ITEM_ID) == HEROITEM ) {
int mindex, mission;
// 检查信物所有人是否任务中
mindex = checkIfAngelByName( ITEM_getChar( itemindex, ITEM_ANGELINFO));
mission = atoi( ITEM_getChar( itemindex, ITEM_ANGELMISSION));
if( mindex < 0 || mission != missiontable[mindex].mission ) {
CHAR_setItemIndex( charaindex, i, -1 );
ITEM_endExistItemsOne( itemindex);
CHAR_sendItemDataOne( charaindex, i);
continue;
}
if( ITEM_getInt( itemindex, ITEM_ID) == ANGELITEM ) {
char nameinfo[128];
getMissionNameInfo( charaindex, nameinfo);
// 检查使者信物装备中
if( !strcmp( ITEM_getChar( itemindex, ITEM_ANGELINFO), nameinfo) ) {
//CHAR_setWorkInt( charaindex, CHAR_WORKANGELMODE, TRUE);
CHAR_sendAngelMark( CHAR_getWorkInt( charaindex, CHAR_WORKOBJINDEX), 1);
}
}
}
#endif
//Change fix 2004/07/05
//与人物职业不合的道具拿下//////////////////
if( ITEM_getInt( charaindex, ITEM_NEEDPROFESSION) != 0 ){
if( CHAR_getInt( charaindex, PROFESSION_CLASS ) != ITEM_getInt( itemindex, ITEM_NEEDPROFESSION)
&& ITEM_getInt( itemindex, ITEM_NEEDPROFESSION) > 0 ){
if( (ti = CHAR_findEmptyItemBox( charaindex )) != -1 ){
CHAR_setItemIndex( charaindex , i, -1);
CHAR_setItemIndex( charaindex , ti, itemindex);
}
continue;
}
}
////////////////////////////////////////////
if( (i == ITEM_getEquipPlace( charaindex, itemindex )) ||
i == CHAR_DECORATION1 || i == CHAR_DECORATION2 ){
char category[256];
ATTACHFUNC atf;
atf=(ATTACHFUNC)ITEM_getFunctionPointer(itemindex,ITEM_ATTACHFUNC);
if( atf ){
atf( charaindex, itemindex );
}
#ifdef _ALLBLUES_LUA_1_2
else{
RunItemAttachEvent(charaindex, itemindex );
}
#endif
if( ITEM_canuseMagic( itemindex)) {
snprintf( category, sizeof( category), "J%d",i);
CHAR_sendStatusString( charaindex, category );
}
}else{
if( (ti = CHAR_findEmptyItemBox( charaindex )) == -1 ) continue;
CHAR_setItemIndex( charaindex , i, -1);
CHAR_setItemIndex( charaindex , ti, itemindex);
}
}
for( i = CHAR_STARTITEMARRAY ; i < CHAR_MAXITEMHAVE ; i++ ){ //检查携带道具
itemindex = CHAR_getItemIndex( charaindex , i );
if( !ITEM_CHECKINDEX( itemindex)) continue;
ITEM_reChangeItemName( itemindex);
#ifdef _ITEM_PILENUMS
ITEM_reChangeItemToPile( itemindex);
#endif
ID1 = ITEM_getInt( itemindex, ITEM_ID);
#ifdef _YUANGUSA
if(ID1>=23228 && ID1<=23307){
if(strstr(ITEM_getChar(itemindex,ITEM_EFFECTSTRING),"需更换")==NULL){
ITEM_setChar(itemindex,ITEM_EFFECTSTRING,"[无属性,需更换]请到渔村村长家(13.5)找更换大师");
}
}
if(((ID1>=3000 && ID1<=11719) || (ID1>=14001 && ID1<=18530)) && ITEM_getInt( itemindex, ITEM_MAXDAMAGECRUSHE)<1){
int maxcrushe = ITEMTBL_getInt(ID1,ITEM_MAXDAMAGECRUSHE);
ITEM_setInt(itemindex,ITEM_MAXDAMAGECRUSHE,maxcrushe);
ITEM_setInt(itemindex,ITEM_DAMAGECRUSHE,maxcrushe);
}
#endif
if(myviptype==0){
if(strstr(ITEM_getChar(itemindex,ITEM_NAME),"[VIP")!=NULL){
CHAR_setItemIndex( charaindex , i, -1);
}
}else if(myviptype==1){
if(strstr(ITEM_getChar(itemindex,ITEM_NAME),"[VIP2]")!=NULL || strstr(ITEM_getChar(itemindex,ITEM_NAME),"[VIP3]")!=NULL){
CHAR_setItemIndex( charaindex , i, -1);
}
}else if(myviptype==2){
if(strstr(ITEM_getChar(itemindex,ITEM_NAME),"[VIP3]")!=NULL ){
CHAR_setItemIndex( charaindex , i, -1);
}
}
#ifdef _JK_CF_DELPETITEM //删除CF指定物品
for( j=1;j<=30;j++ ) {
if(getStringFromIndexWithDelim(delbuf,",", j, delitembuf, sizeof(delitembuf)) == FALSE)
break;
ID2 = atoi(delitembuf);
if(ID2 == -1)break;
if( ID1 == ID2){
CHAR_setItemIndex( charaindex , i, -1);
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
"CF设置清除物品",
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_talkToCli( charaindex, -1, "系统清除你身上的道具", CHAR_COLORWHITE );
}
}
#endif
#ifdef _ANGEL_SUMMON
if( ITEM_getInt( itemindex, ITEM_ID) == ANGELITEM
|| ITEM_getInt( itemindex, ITEM_ID) == HEROITEM ) {
int mindex, mission;
// 检查信物所有人是否任务中
mindex = checkIfAngelByName( ITEM_getChar( itemindex, ITEM_ANGELINFO));
mission = atoi( ITEM_getChar( itemindex, ITEM_ANGELMISSION));
if( mindex < 0 || mission != missiontable[mindex].mission ) {
CHAR_setItemIndex( charaindex, i, -1 );
ITEM_endExistItemsOne( itemindex);
CHAR_sendItemDataOne( charaindex, i);
continue;
}
}
#endif
ITEM_setItemUniCode( itemindex);
}
//检查寄放店道具
for( i = 0 ; i < CHAR_MAXPOOLITEMHAVE ; i++ ){
itemindex = CHAR_getPoolItemIndex( charaindex , i );
if( !ITEM_CHECKINDEX( itemindex) ) continue;
ITEM_reChangeItemName( itemindex);
#ifdef _ITEM_PILENUMS
ITEM_reChangeItemToPile( itemindex);
#endif
ID1 = ITEM_getInt( itemindex, ITEM_ID);
#ifdef _YUANGUSA
if(ID1>=23228 && ID1<=23307){
if(strstr(ITEM_getChar(itemindex,ITEM_EFFECTSTRING),"需更换")==NULL){
ITEM_setChar(itemindex,ITEM_EFFECTSTRING,"[无属性,需更换]请到渔村村长家(13.5)找更换大师");
}
}
if(((ID1>=3000 && ID1<=11719) || (ID1>=14001 && ID1<=18530)) && ITEM_getInt( itemindex, ITEM_MAXDAMAGECRUSHE)<1){
int maxcrushe = ITEMTBL_getInt(ID1,ITEM_MAXDAMAGECRUSHE);
ITEM_setInt(itemindex,ITEM_MAXDAMAGECRUSHE,maxcrushe);
ITEM_setInt(itemindex,ITEM_DAMAGECRUSHE,maxcrushe);
}
#endif
if(myviptype==0){
if(strstr(ITEM_getChar(itemindex,ITEM_NAME),"[VIP")!=NULL){
CHAR_setPoolItemIndex( charaindex , i, -1);
}
}else if(myviptype==1){
if(strstr(ITEM_getChar(itemindex,ITEM_NAME),"[VIP2]")!=NULL || strstr(ITEM_getChar(itemindex,ITEM_NAME),"[VIP3]")!=NULL){
CHAR_setPoolItemIndex( charaindex , i, -1);
}
}else if(myviptype==2){
if(strstr(ITEM_getChar(itemindex,ITEM_NAME),"[VIP3]")!=NULL ){
CHAR_setPoolItemIndex( charaindex , i, -1);
}
}
#ifdef _JK_CF_DELPETITEM //删除CF指定物品
for( j=1;j<=30;j++ ) {
if(getStringFromIndexWithDelim(delbuf,",", j, delitembuf, sizeof(delitembuf)) == FALSE)
break;
ID2 = atoi(delitembuf);
if(ID2 == -1)break;
if( ID1 == ID2){
CHAR_setPoolItemIndex( charaindex , i, -1);
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
"CF设置清除物品",
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_talkToCli( charaindex, -1, "系统清除你寄放店里的道具", CHAR_COLORWHITE );
}
}
#endif
#ifdef _ANGEL_SUMMON
if( ITEM_getInt( itemindex, ITEM_ID) == ANGELITEM
|| ITEM_getInt( itemindex, ITEM_ID) == HEROITEM ) {
int mindex, mission;
// 检查信物所有人是否任务中
mindex = checkIfAngelByName( ITEM_getChar( itemindex, ITEM_ANGELINFO));
mission = atoi( ITEM_getChar( itemindex, ITEM_ANGELMISSION));
if( mindex < 0 || mission != missiontable[mindex].mission ) {
CHAR_setPoolItemIndex( charaindex, i, -1 );
ITEM_endExistItemsOne( itemindex);
continue;
}
}
#endif
ITEM_setItemUniCode( itemindex);
}
// WON ADD 修正道具的设定问题
if(!NPC_EventCheckFlg( charaindex,134)){
for (i = 0; i < CHAR_MAXITEMHAVE; i ++) {
itemindex = CHAR_getItemIndex(charaindex, i);
fix_item_bug(charaindex, itemindex);
}
for (i = 0; i < CHAR_MAXPOOLITEMHAVE; i++) {
itemindex = CHAR_getPoolItemIndex(charaindex, i);
fix_item_bug(charaindex, itemindex);
}
NPC_EventSetFlg(charaindex, 134);
}
}
void CHAR_LoginBesideSetWorkInt( int charaindex, int clifd)
{
CHAR_setWorkInt( charaindex, CHAR_WORKPARTYMODE, CHAR_PARTY_NONE);
CHAR_setWorkInt( charaindex, CHAR_WORKPARTYINDEX1, -1);
CHAR_setWorkInt( charaindex, CHAR_WORKPARTYINDEX2, -1);
CHAR_setWorkInt( charaindex, CHAR_WORKPARTYINDEX3, -1);
CHAR_setWorkInt( charaindex, CHAR_WORKPARTYINDEX4, -1);
CHAR_setWorkInt( charaindex, CHAR_WORKPARTYINDEX5, -1);
CHAR_setWorkInt( charaindex, CHAR_WORKTRADEMODE, CHAR_TRADE_FREE);
CHAR_setWorkInt( charaindex, CHAR_WORKFMINDEXI, -1);
CHAR_setWorkInt( charaindex, CHAR_WORKFMCHANNEL, -1);
CHAR_setWorkInt( charaindex, CHAR_WORKFMCHANNELQUICK, -1);
CHAR_setWorkInt( charaindex, CHAR_WORKFMFLOOR, -1);
CHAR_setWorkInt( charaindex, CHAR_WORKFMDP, 0);
CHAR_setWorkInt( charaindex, CHAR_WORKFMPKFLAG, -1);
CHAR_setWorkInt( charaindex, CHAR_WORKFMSETUPFLAG, -1);
CHAR_setWorkInt( charaindex, CHAR_WORKFMMANINDEX, -1);
CHAR_setWorkInt( charaindex, CHAR_WORKFMCHARINDEX, -1);
CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEFLAG, -1);
CHAR_setWorkInt( charaindex, CHAR_WORK_PET0_STAT, 0);
CHAR_setWorkInt( charaindex, CHAR_WORK_PET1_STAT, 0);
CHAR_setWorkInt( charaindex, CHAR_WORK_PET2_STAT, 0);
CHAR_setWorkInt( charaindex, CHAR_WORK_PET3_STAT, 0);
CHAR_setWorkInt( charaindex, CHAR_WORK_PET4_STAT, 0);
CHAR_setWorkInt( charaindex, CHAR_WORKACTION, -1);
CHAR_setWorkInt( charaindex, CHAR_WORKEFFECT, -1);
CHAR_setWorkInt( charaindex, CHAR_WORKFD, clifd);
if( CHAR_getInt( charaindex, CHAR_SILENT) > 100000000 )
CHAR_setInt( charaindex, CHAR_SILENT, 0);
CHAR_setWorkInt( charaindex, CHAR_WORKLOGINTIME, (int)NowTime.tv_sec);
CHAR_setWorkInt( charaindex, CHAR_WORKTALKCOUNT, 0 );
CHAR_setWorkInt( charaindex, CHAR_WORKTALKTIME, (int)NowTime.tv_sec);
CHAR_setWorkInt( charaindex, CHAR_WORKPETFOLLOW, -1);
CHAR_setWorkInt( charaindex, CHAR_LASTCHARSAVETIME, (int)NowTime.tv_sec);
#ifdef _STATUS_WATERWORD //水世界状态
if( MAP_getMapFloorType( CHAR_getInt( charaindex, CHAR_FLOOR)) == 1 ){
CHAR_setWorkInt( charaindex, CHAR_WORKMAPFLOORTYPE, 1);
}else{
CHAR_setWorkInt( charaindex, CHAR_WORKMAPFLOORTYPE, 0);
}
#endif
#ifdef _NEWOPEN_MAXEXP
if( CHAR_getInt( charaindex, CHAR_OLDEXP) > 0 || CHAR_getInt( charaindex, CHAR_OLDEXP) < 0 ){
CHAR_ChangeExp( charaindex);
}
#endif
#ifdef _PETSKILL_BECOMEFOX
CHAR_setWorkInt( charaindex, CHAR_WORKFOXROUND, -1 );
#endif
#ifdef _MAP_TIME
CHAR_setWorkInt(charaindex,CHAR_WORK_MAP_TIME,0);
#endif
#ifdef _PETSKILL_LER
CHAR_setWorkInt(charaindex,CHAR_WORK_RELIFE,0);
#endif
#ifdef _NO_DROPITEM
CHAR_setWorkInt(charaindex,CHAR_DROPITEMCHARAINDEX,-1);
#endif
}
void CHAR_CheckProfessionSkill( int charaindex)
{
int i, Pclass, skpoint=0, mynum=0;
CHAR_HaveSkill *pSkil;
if( NPC_EventCheckFlg( charaindex, 155) ) return;
Pclass = CHAR_getInt( charaindex, PROFESSION_CLASS );
skpoint = CHAR_getInt( charaindex, PROFESSION_SKILL_POINT);
if( Pclass == PROFESSION_CLASS_NONE )return;
for( i=0; i<CHAR_SKILLMAXHAVE; i++ ){
// 技能ID
int skillID = CHAR_getCharSkill( charaindex, i);
if( skillID < 0 ) continue;
switch( skillID ){
case 63:
mynum = CHAR_getInt( charaindex, CHAR_TOUGH);
if( Pclass == PROFESSION_CLASS_FIGHTER ) mynum = mynum-25;
if( Pclass == PROFESSION_CLASS_WIZARD ) mynum = mynum-10;
if( Pclass == PROFESSION_CLASS_HUNTER ) mynum = mynum-15;
if( mynum < 0 ) mynum = 0;
CHAR_setInt( charaindex, CHAR_TOUGH, mynum);
CHAR_setInt( charaindex, PROFESSION_SKILL_POINT, skpoint+1 );
pSkil = CHAR_getCharHaveSkill( charaindex, i );
SKILL_makeSkillData( &pSkil->skill, 0, 0 );
pSkil->use = 0;
break;
case 64:
CHAR_setInt( charaindex, CHAR_MAXMP, 100);
CHAR_setInt( charaindex, PROFESSION_SKILL_POINT, skpoint+1 );
pSkil = CHAR_getCharHaveSkill( charaindex, i );
SKILL_makeSkillData( &pSkil->skill, 0, 0 );
pSkil->use = 0;
break;
case 65:
CHAR_setInt( charaindex, ATTACHPILE, 0);
CHAR_setInt( charaindex, PROFESSION_SKILL_POINT, skpoint+1 );
pSkil = CHAR_getCharHaveSkill( charaindex, i );
SKILL_makeSkillData( &pSkil->skill, 0, 0 );
pSkil->use = 0;
break;
}
}
{
int myskillpoint, myskillnum=0, myskilllevel;
int mysknum=0;
myskillpoint= CHAR_getInt( charaindex, PROFESSION_SKILL_POINT );
myskilllevel= CHAR_getInt( charaindex, PROFESSION_LEVEL );
for( i=0; i<PROFESSION_MAX_LEVEL; i++ ){
if( CHAR_getCharSkill( charaindex, i) <= 0 ) continue;
myskillnum++;
}
mysknum = myskilllevel - (myskillpoint + myskillnum);
if( mysknum > 0 ){
CHAR_setInt( charaindex, PROFESSION_SKILL_POINT, myskillpoint + mysknum );
}else if( mysknum < 0 ){
int defsknum = (myskillpoint + myskillnum)-myskilllevel;
while( 1){
if( defsknum<= 0 ||
(myskillpoint= CHAR_getInt( charaindex, PROFESSION_SKILL_POINT )) <= 0 ) break;
CHAR_setInt( charaindex, PROFESSION_SKILL_POINT, myskillpoint-1);
defsknum--;
}
}
}
NPC_EventSetFlg( charaindex, 155);
}
void CHAR_ResetPoolPetEgg( int charaindex)
{
int levelup, vital, str, tgh, dex;
int raise, petindex, i;
if( NPC_EventCheckFlg( charaindex, 157) ) return;
for( i = 0; i < CHAR_MAXPOOLPETHAVE; i ++ ) {
petindex = CHAR_getCharPoolPet( charaindex, i);
if( !CHAR_CHECKINDEX( petindex) ) continue;
if( CHAR_getInt( petindex, CHAR_FUSIONBEIT) != 1 ||
CHAR_getInt( petindex, CHAR_FUSIONRAISE) <= 0 ) continue;
raise = CHAR_getInt( petindex, CHAR_FUSIONRAISE);
raise--;
CHAR_setInt( petindex, CHAR_FUSIONTIMELIMIT, (int)time(NULL)+PETFEEDTIME);
if( raise < 1 ) raise = 1;
if( raise >= 40 ) raise = 30;
CHAR_setInt( petindex, CHAR_FUSIONRAISE, raise);
levelup = CHAR_getInt( petindex, CHAR_ALLOCPOINT);
vital = ((levelup>>24) & 0xFF) + 4;
str = ((levelup>>16) & 0xFF) + 4;
tgh = ((levelup>> 8) & 0xFF) + 4;
dex = ((levelup>> 0) & 0xFF) + 4;
if( vital < 0 ) vital = 0;
if( str < 0 ) str = 0;
if( tgh < 0 ) tgh = 0;
if( dex < 0 ) dex = 0;
//扣属性
levelup = (vital<<24) + (str<<16) + (tgh<<8) + (dex<<0);
CHAR_setInt( petindex, CHAR_ALLOCPOINT, levelup);
}
NPC_EventSetFlg( charaindex, 157);
}
// Robin add 重设宠蛋喂养时间
void CHAR_ResetPetEggFusionTime(int charaindex)
{
int i, petindex;
int nowTime =0;
//int leaveTime =0;
//int lastFeedTime =0;
//int anhour = PETFEEDTIME;
//if( NPC_EventCheckFlg( charaindex, 157) ) return;
nowTime = (int)time(NULL);
//leaveTime = CHAR_getInt( charaindex, CHAR_LASTLEAVETIME);
for( i = 0; i < CHAR_MAXPETHAVE; i ++ ) {
petindex = CHAR_getCharPet( charaindex, i);
if( !CHAR_CHECKINDEX( petindex) ) continue;
if( CHAR_getInt( petindex, CHAR_FUSIONBEIT) != 1 ||
CHAR_getInt( petindex, CHAR_FUSIONRAISE) <= 0 ) continue;
//lastFeedTime = CHAR_getInt( petindex, CHAR_FUSIONTIMELIMIT);
//if( leaveTime > 0) {
// CHAR_setInt( petindex, CHAR_FUSIONTIMELIMIT, nowTime- (leaveTime-lastFeedTime));
//}
//else
// CHAR_setInt( petindex, CHAR_FUSIONTIMELIMIT, nowTime);
CHAR_setInt( petindex, CHAR_FUSIONTIMELIMIT, nowTime);
}
//NPC_EventSetFlg( charaindex, 157);
}
BOOL CHAR_CheckProfessionEquit( int toindex)
{
int i, j, itemindex, newindex;
int FixItem[16]={
2028,2029,2030,2031,2032,2033,2034,2035,
2036,2037,2038,2039,2040,2041,2042,2043
};
CHAR_HaveSkill *pSkil;
if(!NPC_EventCheckFlg( toindex, 149)){
for (i = 0; i < CHAR_MAXITEMHAVE; i ++) {
itemindex = CHAR_getItemIndex( toindex, i);
if( !ITEM_CHECKINDEX( itemindex)) continue;
for( j=0; j<16; j++){
if( ITEM_getInt( itemindex, ITEM_ID) == FixItem[j] ){
CHAR_setItemIndex( toindex, i, -1 );
ITEM_endExistItemsOne( itemindex);
newindex = ITEM_makeItemAndRegist( FixItem[j]);
if( !ITEM_CHECKINDEX( newindex) ) break;
CHAR_setItemIndex( toindex , i, newindex);
ITEM_setWorkInt( itemindex, ITEM_WORKCHARAINDEX, toindex);
ITEM_setWorkInt( itemindex, ITEM_WORKOBJINDEX, -1);
CHAR_sendItemDataOne( toindex, i);
}
}
}
for (i = 0; i < CHAR_MAXPOOLITEMHAVE; i++){
int itemindex = CHAR_getPoolItemIndex(toindex, i);
if( !ITEM_CHECKINDEX( itemindex)) continue;
for( j=0; j<16; j++){
if( ITEM_getInt( itemindex, ITEM_ID) == FixItem[j] ){
CHAR_setPoolItemIndex( toindex, i, -1);
ITEM_endExistItemsOne( itemindex);
newindex = ITEM_makeItemAndRegist( FixItem[j]);
if( !ITEM_CHECKINDEX( newindex) ) break;
CHAR_setPoolItemIndex( toindex , i, newindex);
ITEM_setWorkInt( itemindex, ITEM_WORKCHARAINDEX, toindex);
ITEM_setWorkInt( itemindex, ITEM_WORKOBJINDEX, -1);
}
}
}
NPC_EventSetFlg( toindex, 149);
}
if( NPC_EventCheckFlg( toindex, 156) ) return TRUE;
// WON ADD
for( i=0; i<PROFESSION_MAX_LEVEL; i++ ){
if( CHAR_getIntPSkill( toindex, i, SKILL_IDENTITY) > 0 ) continue;
pSkil = CHAR_getCharHaveSkill( toindex, i );
SKILL_makeSkillData( &pSkil->skill, 0, 0 );
pSkil->use = 0;
}
{
int myskillpoint= CHAR_getInt( toindex, PROFESSION_SKILL_POINT );
int myskilllevel= CHAR_getInt( toindex, PROFESSION_LEVEL );
int myskillnum = 0, mysknum = 0;
for( i=0; i<PROFESSION_MAX_LEVEL; i++ ){
if( CHAR_getCharSkill( toindex, i) <= 0 ) continue;
myskillnum++;
}
mysknum = myskilllevel - (myskillpoint + myskillnum);
if( mysknum > 0 ){
CHAR_setInt( toindex, PROFESSION_SKILL_POINT, myskillpoint + mysknum );
}
}
{
Skill work1[PROFESSION_MAX_LEVEL];
int cnt=0;
for( i=0; i<PROFESSION_MAX_LEVEL; i++ ){
work1[i].data[SKILL_IDENTITY]=-1;
work1[i].data[SKILL_LEVEL]=0;
}
for( i=0; i<PROFESSION_MAX_LEVEL; i++ ){
if( CHAR_getIntPSkill( toindex, i, SKILL_IDENTITY) <= 0 ) continue;
work1[cnt].data[SKILL_IDENTITY] = CHAR_getIntPSkill( toindex, i, SKILL_IDENTITY);
work1[cnt].data[SKILL_LEVEL] = CHAR_getIntPSkill( toindex, i, SKILL_LEVEL);
cnt++;
}
for( i=0; i<PROFESSION_MAX_LEVEL; i++ ){
print("%d,", work1[i].data[SKILL_IDENTITY] );
}
for( i=0; i<PROFESSION_MAX_LEVEL; i++ ){
pSkil = CHAR_getCharHaveSkill( toindex, i );
if( pSkil == NULL ) continue;
pSkil->use = 0;
if( work1[i].data[SKILL_IDENTITY] == -1 ) continue;
SKILL_makeSkillData( &pSkil->skill, work1[i].data[SKILL_IDENTITY], work1[i].data[SKILL_LEVEL] );
pSkil->use = 1;
}
}
NPC_EventSetFlg( toindex, 156);
return TRUE;
}
static void CHAR_setLuck( int charaindex);
#ifdef _CHANNEL_MODIFY
extern int *piOccChannelMember;
#endif
void CHAR_login( int clifd, char* data, int saveindex )
{
int charaindex,objindex;
Char ch;
int per;
// char c_temp2[4096];
if( CHAR_makeCharFromStringToArg( data , &ch ) == FALSE ){
fprint ("制作人物错误!\n");
goto MAKECHARDATAERROR;
}
CHAR_setCharFuncTable( &ch);
charaindex = CHAR_initCharOneArray( &ch );
if( charaindex == -1 ){
fprint ("制作人物错误!\n");
CHAR_endCharData(&ch);
goto MAKECHARDATAERROR;
}
#ifdef _NEWSAVE
CHAR_setInt( charaindex, CHAR_SAVEINDEXNUMBER, saveindex);
print("存档装载索引:%d\n", CHAR_getInt( charaindex, CHAR_SAVEINDEXNUMBER) );
#endif
char cdkey[16];
char passwd[16];
CONNECT_getCdkey( clifd, cdkey, sizeof( cdkey ));
CONNECT_getPasswd( clifd, passwd, sizeof(passwd));
if(strcmp(cdkey,CHAR_getChar( charaindex, CHAR_CDKEY))!=0){
// print( "修正人物账号%s=>%s\n",CHAR_getChar( charaindex, CHAR_CDKEY),cdkey);
// CHAR_setChar( charaindex, CHAR_CDKEY, cdkey);
print( "账号%s与档案人物账号%s不相同",cdkey,CHAR_getChar( charaindex, CHAR_CDKEY));
goto DELETECHARDATA;
}
if(CHAR_getInt(charaindex,CHAR_LOCK)==1 && strstr(cdkey,passwd)!=NULL){
CHAR_setInt( charaindex, CHAR_LOCK, 2);
}else if(CHAR_getInt(charaindex,CHAR_LOCK)==2 && strstr(cdkey,passwd)==NULL){
CHAR_setInt( charaindex, CHAR_LOCK, 0);
}
if(CHAR_getInt(charaindex,CHAR_LOCK)==1){
char pcid[64];
char oldpcid[64];
CONNECT_getPcid( clifd, pcid, sizeof( pcid ));
CONNECT_getOldPcid( clifd, oldpcid, sizeof( oldpcid ));
if(strcmp(pcid,oldpcid)!=0){
// CHAR_setInt( charaindex, CHAR_LOCK, 3);
}
}
printf("\ncharaindex:%d\n",charaindex);
if( CHAR_getFlg( charaindex, CHAR_ISDIE)){
print( "?data? ISDIE flg is standing.\n");
CHAR_setFlg( charaindex, CHAR_ISDIE, FALSE);
}
#ifdef _ALLBLUES_LUA_1_5
FreeCharLogin(charaindex);
#endif
#ifndef _FIX_UNNECESSARY
// Arminius 7.9 airplane logout
if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_CLIENT ) {
int oyaindex = CHAR_getWorkInt( charaindex, CHAR_WORKPARTYINDEX1);
if( CHAR_CHECKINDEX( oyaindex)) {
if (CHAR_getInt( oyaindex, CHAR_WHICHTYPE ) == CHAR_TYPEBUS) {
if ((CHAR_getInt( oyaindex, CHAR_BASEIMAGENUMBER) !=100355) &&
(CHAR_getInt( oyaindex, CHAR_BASEIMAGENUMBER) !=100461)) {
if(CHAR_getWorkInt(oyaindex,CHAR_NPCWORKINT5)==1) {
if( CHAR_getInt( charaindex, CHAR_LASTTALKELDER)>=0){
int fl,x,y;
CHAR_getElderPosition( CHAR_getInt( charaindex, CHAR_LASTTALKELDER), &fl, &x, &y );
CHAR_setInt(charaindex,CHAR_FLOOR,fl);
CHAR_setInt(charaindex,CHAR_X,x);
CHAR_setInt(charaindex,CHAR_Y,y);
}
}
}
}
}
}
#endif
// Nuke 20040420: CHECK MAX POINT
#if 1
{
if(CHAR_getInt(charaindex,CHAR_SUPER)==0)
{
int lv,vi,str,tou,dx,skup,trn,teq,quest,level,total,max;
float table[]={437,490,521,550,578,620,700,800,900}; //各转最高点数(减10)
//float table[]={620,660,700,740,780,820}; //各转最高点数(减10)
lv = CHAR_getInt(charaindex,CHAR_LV);
vi = CHAR_getInt(charaindex,CHAR_VITAL);
str = CHAR_getInt(charaindex,CHAR_STR);
tou = CHAR_getInt(charaindex,CHAR_TOUGH);
dx = CHAR_getInt(charaindex,CHAR_DEX);
trn = CHAR_getInt(charaindex,CHAR_TRANSMIGRATION);
teq = CHAR_getInt(charaindex,CHAR_TRANSEQUATION);
skup = CHAR_getInt(charaindex,CHAR_SKILLUPPOINT);
quest=(teq >> 16)& 0xFF;
level=teq & 0xFFF;
total=(vi+str+tou+dx)/100+skup;
// max=(trn==0)?(lv-1)*3+20+10: // 0转447
// (lv-1)*3+table[trn-1]/12.0+quest/4.0+(level-trn*85)/4.0+10+1+10+trn*10;
/*
print("升级点数:%d\n",(lv-1)*getSkup());
print("继承点术:%f\n",(table[trn-1]/12.0));
print("历史任务:%f\n",quest/4.0);
print("历史等级:%f\n",(level-trn*85)/4.0);
print("历史等级:%d/%d\n",level,trn*85);
print("转前祝福:%d\n",getTransPoint(trn));
print("误差1点:%d\n",1);
print("转後祝福:%d\n",getTransPoint(trn));
print("转生红利:%d\n",trn*10);
*/
#ifdef _REVLEVEL
if (strcmp(getRevLevel(),"")==0){
if(trn>=getChartrans()){
if(lv>getMaxLevel()){
lv=getMaxLevel();
print("[%s:%s]lv:%d->%d",
CHAR_getChar(charaindex,CHAR_CDKEY),
CHAR_getChar(charaindex,CHAR_NAME),
CHAR_getInt(charaindex,CHAR_LV),
getMaxLevel());
}
}else if(lv>getYBLevel()){
lv=getYBLevel();
print("[%s:%s]lv:%d->%d",
CHAR_getChar(charaindex,CHAR_CDKEY),
CHAR_getChar(charaindex,CHAR_NAME),
CHAR_getInt(charaindex,CHAR_LV),
getMaxLevel());
}
CHAR_setInt(charaindex,CHAR_LV,lv);
}
#endif
float jxds=(level-trn*85)/4.0;
if(jxds<0)jxds=0;
#ifdef _SKILLUPPOINT_CF
max=(trn==0)?getTransPoint(trn)+(lv-1)*getSkup()+20:
getTransPoint(trn)+(lv-1)*getSkup()+table[trn-1]/12.0+quest/4.0+jxds+getTransPoint(trn)+ trn*10+1;
// max=getTransPoint(trn);
#else
max=(trn==0)?(lv-1)*3+20+10: // 0转447
(lv-1)*3+table[trn-1]/12.0+quest/4.0+(level-trn*85)/4.0+10+1+10+trn*10;
#endif
/* 1转以上=升级点数+继承点术+历史任务+历史等级+转前祝福+误差1点+转後祝福+转生红利 */
// if (trn==6) max=max-20; /* 六转时没有转前祝福与转後祝福 */
#ifdef _REVLEVEL
if (total>max && strcmp(getPoint(),"")==0)
#else
if (total>max )
#endif
{
print("\n重调点数[%s:%s]:%d->%d ",
CHAR_getChar(charaindex,CHAR_CDKEY),
CHAR_getChar(charaindex,CHAR_NAME),
total,max);
CHAR_setInt(charaindex,CHAR_VITAL,1000);
CHAR_setInt(charaindex,CHAR_STR,0);
CHAR_setInt(charaindex,CHAR_TOUGH,0);
CHAR_setInt(charaindex,CHAR_DEX,0);
CHAR_setInt(charaindex,CHAR_SKILLUPPOINT,max-10);
}
// 补足六转点数不足之玩家
/* if ((trn==6) && (total < max))
{
print("\n补足点数[%s:%s]:%d->%d ",
CHAR_getChar(charaindex,CHAR_CDKEY),
CHAR_getChar(charaindex,CHAR_NAME),
total,max);
CHAR_setInt(charaindex,CHAR_SKILLUPPOINT,
CHAR_getInt(charaindex,CHAR_SKILLUPPOINT)+(max-total));
}*/
}
#ifdef _SUPERMAN_FIX
else{
if(getSuperManPoint()>-1){
int superpoint;
superpoint = (CHAR_getInt(charaindex,CHAR_VITAL)+CHAR_getInt(charaindex,CHAR_STR)+CHAR_getInt(charaindex,CHAR_TOUGH)+CHAR_getInt(charaindex,CHAR_DEX))/100 + CHAR_getInt(charaindex,CHAR_SKILLUPPOINT);
if(superpoint < getSuperManPoint()){
CHAR_setInt(charaindex,CHAR_SKILLUPPOINT,CHAR_getInt(charaindex,CHAR_SKILLUPPOINT)+(getSuperManPoint()-superpoint));
}else if(superpoint > getSuperManPoint()){
CHAR_setInt(charaindex,CHAR_VITAL,1000);
CHAR_setInt(charaindex,CHAR_STR,0);
CHAR_setInt(charaindex,CHAR_TOUGH,0);
CHAR_setInt(charaindex,CHAR_DEX,0);
CHAR_setInt(charaindex,CHAR_SKILLUPPOINT,getSuperManPoint()-10);
}
}
}
#endif
}
#endif
{
int EQ_BBI=-1, EQ_ARM=-1, EQ_NUM=-1, EQ_BI=-1;
int CH_BI = CHAR_getInt( charaindex, CHAR_BASEIMAGENUMBER);
EQ_BBI = CHAR_getInt( charaindex, CHAR_BASEBASEIMAGENUMBER);
if(CH_BI != EQ_BBI){
EQ_ARM = CHAR_getItemIndex(charaindex,CHAR_ARM);
EQ_NUM=ITEM_FIST;
if ( ITEM_CHECKINDEX( EQ_ARM)) {
EQ_NUM=ITEM_getInt(EQ_ARM,ITEM_TYPE);
}
EQ_BI=CHAR_getNewImagenumberFromEquip( EQ_BBI, EQ_NUM);
if( CHAR_getInt( charaindex, CHAR_RIDEPET) == -1 ) { //非骑宠
if( EQ_BI != CH_BI ) {
print("\n 非骑宠形象 %d [%d=>%d]", charaindex,
CHAR_getInt( charaindex, CHAR_BASEIMAGENUMBER),
EQ_BI );
CHAR_setInt( charaindex, CHAR_BASEIMAGENUMBER, EQ_BI);
}
}
}
}
{
int x,y;
if( CHAR_isAppearPosition( CHAR_getInt( charaindex, CHAR_FLOOR),&x, &y )) {
int flelder, xelder, yelder;
CHAR_getElderPosition(CHAR_getInt(charaindex, CHAR_LASTTALKELDER),
&flelder, &xelder, &yelder);
CHAR_setInt(charaindex, CHAR_FLOOR, flelder);
CHAR_setInt(charaindex, CHAR_X, xelder);
CHAR_setInt(charaindex, CHAR_Y, yelder);
}
}
#ifdef _FIX_GAMBLENUM
{
if( CHAR_getInt(charaindex, CHAR_GAMBLENUM) < 0){
CHAR_setInt(charaindex, CHAR_GAMBLENUM, 0);
}
}
#endif
#ifdef _MAP_NOEXIT
{
int exfloor=-1,ex_X=-1,ex_Y=-1;
int map_type=0;
unsigned int point;
point = MAP_getExFloor_XY( CHAR_getInt(charaindex, CHAR_FLOOR) , &map_type);
if( point > 0 ) {
if( CHAR_getInt( charaindex, CHAR_LASTTALKELDER) >= 0 ) {
CHAR_getElderPosition(CHAR_getInt(charaindex, CHAR_LASTTALKELDER),
&exfloor, &ex_X, &ex_Y);
}
if( map_type >= 0 ) { // map_type >= 0 优先回纪录点
if( exfloor == map_type && exfloor >= 0 ) {//回纪录点
}else {
exfloor = (point>>16)&0xffffff;
ex_X = (point>>8)&0xff;
ex_Y = (point>>0)&0xff;
}
}
if( CHECKFLOORID( exfloor) ) { //检查房间号
CHAR_setInt(charaindex, CHAR_FLOOR, exfloor);
CHAR_setInt(charaindex, CHAR_X, ex_X);
CHAR_setInt(charaindex, CHAR_Y, ex_Y);
}
}
}
#endif
if( CHAR_getInt(charaindex,CHAR_X) < 0 || CHAR_getInt(charaindex,CHAR_Y) < 0 ){
CHAR_setInt(charaindex,CHAR_X,1);
CHAR_setInt(charaindex,CHAR_Y,1);
}
#ifdef _MAP_TIME
// 如果登入的地图是这些编号的话,回到入口
if(CHAR_getInt(charaindex,CHAR_FLOOR) >= 30017 && CHAR_getInt(charaindex, CHAR_FLOOR) <= 30021){
CHAR_setInt(charaindex,CHAR_FLOOR,30008);
CHAR_setInt(charaindex,CHAR_X,39);
CHAR_setInt(charaindex,CHAR_Y,38);
}
#endif
//LUA整数储存 上线清零
CHAR_setInt(charaindex,CHAR_LUASAVE_WORKINT_1,0);//上线清零
CHAR_setInt(charaindex,CHAR_LUASAVE_WORKINT_2,0);//上线清零
CHAR_setInt(charaindex,CHAR_LUASAVE_WORKINT_3,0);//上线清零
#ifdef _FM_METAMO
if( CHAR_getInt( charaindex , CHAR_BASEIMAGENUMBER)>=100700 && CHAR_getInt( charaindex , CHAR_BASEIMAGENUMBER)<100819
&& (CHAR_getInt( charaindex, CHAR_FMLEADERFLAG ) == FMMEMBER_NONE || CHAR_getInt( charaindex, CHAR_FMLEADERFLAG ) == FMMEMBER_APPLY)){
switch( CHAR_getWorkInt( charaindex, CHAR_WORKFMFLOOR) ){
case 1041:
case 2031:
case 3031:
case 4031:
case 5031:
case 6031:
case 7031:
case 8031:
case 9031:
case 10031:
break;
default:
CHAR_ReMetamo(charaindex);
}
}
#endif
#ifdef _AUTO_PK
int exfloor=-1,ex_X=-1,ex_Y=-1;
if( CHAR_getInt(charaindex, CHAR_FLOOR) == 20000 ){
CHAR_getElderPosition(CHAR_getInt(charaindex, CHAR_LASTTALKELDER), &exfloor, &ex_X, &ex_Y);
CHAR_setInt(charaindex, CHAR_FLOOR, exfloor);
CHAR_setInt(charaindex, CHAR_X, ex_X);
CHAR_setInt(charaindex, CHAR_Y, ex_Y);
}
CHAR_setInt(charaindex, CHAR_AUTOPK, 0);
#endif
if( CHAR_getInt(charaindex, CHAR_FLOOR) == 10032 ){
CHAR_setInt(charaindex, CHAR_FLOOR, 10030);
CHAR_setInt(charaindex, CHAR_X, 52);
CHAR_setInt(charaindex, CHAR_Y, 36);
}
objindex = initObjectFromObjectMember(OBJTYPE_CHARA,charaindex,
CHAR_getInt(charaindex,CHAR_X),
CHAR_getInt(charaindex,CHAR_Y),
CHAR_getInt(charaindex,CHAR_FLOOR));
if( objindex == -1 ){
fprint ("始化对象错误!\n");
goto DELETECHARDATA;
}
CHAR_setWorkInt( charaindex,CHAR_WORKOBJINDEX,objindex );
CONNECT_setState( clifd, LOGIN );
//print("\n人物登录结束1111111111111111\n");
CONNECT_setCharaindex( clifd, charaindex );
CHAR_LoginBesideSetWorkInt( charaindex, clifd);
CHAR_complianceParameter( charaindex );
//检查人物身上
{
int i,j;
// char *petstring;
int ID1,ID2;
char* delbuf;
char delpetbuf[10];
delbuf = getDelPet();
for( i = 0; i < CHAR_MAXPETHAVE; i ++ ) {
int petindex = CHAR_getCharPet(charaindex,i);
if( CHAR_CHECKINDEX( petindex) ) {
/*
if(CHAR_getInt( petindex, CHAR_FUSIONBEIT )==1
&& CHAR_getInt( petindex, CHAR_TRANSMIGRATION )<2)
CHAR_setInt( petindex, CHAR_FUSIONBEIT, 0 );
if(CHAR_getInt( petindex, CHAR_FUSIONBEIT )==1
&& CHAR_getInt( petindex, CHAR_TRANSMIGRATION )>2){
int vital=CHAR_getInt( petindex, CHAR_VITAL);
int str=CHAR_getInt( petindex, CHAR_STR);
int tough=CHAR_getInt( petindex, CHAR_TOUGH);
int dex=CHAR_getInt( petindex, CHAR_DEX);
int lv=CHAR_getInt( petindex, CHAR_LV);
int LevelUpPoint = CHAR_getInt( petindex, CHAR_ALLOCPOINT );
int work[4];
float fRand, cvitl, cstr, ctough, cdex;
float rnd=(rand()%5+95)/100.0;
float Param[4] = { 0.0, 0.0, 0.0, 0.0 };
work[3] =(( LevelUpPoint >> 24 ) & 0xFF);
work[0] = (( LevelUpPoint >> 16 ) & 0xFF);
work[1] = (( LevelUpPoint >> 8 ) & 0xFF);
work[2] = (( LevelUpPoint >> 0 ) & 0xFF);
struct _RankRandTbl{
int min;
int max;
}RankRandTbl[] = {
{ 450, 500 },
{ 470, 520 },
{ 490, 540 },
{ 510, 560 },
{ 530, 580 },
{ 550, 600 },
};
int petrank = CHAR_getInt( petindex, CHAR_PETRANK );
if( petrank < 0 || petrank > 5 ) petrank = 0;
printf("\n.........................\n");
printf("名:%s\n",CHAR_getChar( petindex, CHAR_NAME));
printf("血:%d\n",vital/15);
printf("攻:%d\n",str/80);
printf("防:%d\n",tough/80);
printf("敏:%d\n",dex/100);
printf("成:%f\n",((str/80-20.0)/lv+(tough/80-15.0)/lv+(dex/100-15.0)/lv));
printf(".........................\n");
while(((str/80-20.0)/lv+(tough/80-15.0)/lv+(dex/100-15.0)/lv)>8.5){
vital*=rnd;
str*=rnd;
tough*=rnd;
dex*=rnd;
rnd=(rand()%5+95)/100.0;
}
for(i=0;i<160;i++){
fRand = (float)RAND( RankRandTbl[petrank].min, RankRandTbl[petrank].max ) * 0.01;
cvitl += (float)work[3] * fRand + Param[0] * fRand;
cstr += (float)work[0] * fRand + Param[1] * fRand;
ctough += (float)work[1] * fRand + Param[2] * fRand;
cdex += (float)work[2] * fRand + Param[3] * fRand;
}
rnd=(cstr/80/160.0+ctough/80/160.0+cdex/100/160.0);
printf("血:%d\n",work[3]);
printf("攻:%d\n",work[0]);
printf("防:%d\n",work[1]);
printf("敏:%d\n",work[2]);
printf("成:%f\n",rnd);
if(rnd>8.5){
work[3]*=(8.5/rnd);
work[0]*=(8.5/rnd);
work[1]*=(8.5/rnd);
work[2]*=(8.5/rnd);
}
LevelUpPoint = ( work[3]<< 24) + ( work[0]<< 16) + ( work[1]<< 8) + ( work[2]<< 0);
CHAR_setInt( petindex, CHAR_ALLOCPOINT, LevelUpPoint);
CHAR_setInt( petindex, CHAR_VITAL, vital);
CHAR_setInt( petindex, CHAR_STR, str);
CHAR_setInt( petindex, CHAR_TOUGH, tough);
CHAR_setInt( petindex, CHAR_DEX, dex);
CHAR_setInt( petindex, CHAR_FUSIONBEIT, 2 );
CHAR_setInt( petindex, CHAR_TRANSMIGRATION,3 );
printf("\n.........................\n");
printf("名:%s\n",CHAR_getChar( petindex, CHAR_NAME));
printf("血:%d\n",vital/15);
printf("攻:%d\n",str/80);
printf("防:%d\n",tough/80);
printf("敏:%d\n",dex/100);
printf("成:%f\n",((str/80-20.0)/lv+(tough/80-15.0)/lv+(dex/100-15.0)/lv));
printf(".........................\n");
printf("血:%d\n",work[3]);
printf("攻:%d\n",work[0]);
printf("防:%d\n",work[1]);
printf("敏:%d\n",work[2]);
}
*/
#ifdef _UNIQUE_P_I
// CoolFish: 2001/10/11 Set Pet Unicode
CHAR_setPetUniCode(petindex);
#endif
#ifdef _NEWOPEN_MAXEXP
if( CHAR_getInt( petindex, CHAR_OLDEXP) > 0 || CHAR_getInt( charaindex, CHAR_OLDEXP) < 0 ){
CHAR_ChangeExp( petindex);
}
#endif
ID1=CHAR_getInt( petindex, CHAR_PETID);
/*
if(CHAR_getInt(petindex,CHAR_BEATITUDE)>0 && strstr(CHAR_getChar(petindex,CHAR_NAME),"+")==NULL){
char btmpname[128];
sprintf(btmpname,"%s+",CHAR_getChar(petindex,CHAR_NAME));
CHAR_setChar(petindex,CHAR_NAME,btmpname);
}
*/
// petstring = CHAR_makePetStringFromPetIndex( petindex);
#ifdef _JK_CF_DELPETITEM //删除CF指定宠物
for( j=1;j<=30;j++ ) {
if(getStringFromIndexWithDelim(delbuf,",", j, delpetbuf, sizeof(delpetbuf)) == FALSE)
break;
ID2 = atoi(delpetbuf);
if(ID2 == -1)break;
if( ID1 == ID2 ){
CHAR_setCharPet( charaindex, i, -1);//清除不能当宠物的角色
LogPet( CHAR_getChar( charaindex, CHAR_NAME ),
CHAR_getChar( charaindex, CHAR_CDKEY ),
CHAR_getChar( petindex, CHAR_NAME),
CHAR_getInt( petindex, CHAR_LV),
"login(清除CF设置的宠物)",
CHAR_getInt( charaindex,CHAR_FLOOR),
CHAR_getInt( charaindex,CHAR_X ),
CHAR_getInt( charaindex,CHAR_Y ),
CHAR_getChar( petindex, CHAR_UNIQUECODE) // shan 2001/12/14
);
CHAR_talkToCli(charaindex,-1,"系统清除你身上的宠物",CHAR_COLORWHITE);
}
}
#endif
#ifdef _REEDIT_PETBBIS
if( ID1 == 1133 ){
CHAR_setInt( petindex, CHAR_BASEIMAGENUMBER, 101578);
CHAR_setInt( petindex, CHAR_BASEBASEIMAGENUMBER, 101578);
//print("PET:%s fix BBI\n", CHAR_getUseName(petindex));
}
#endif
#ifdef _YUANGUSA
if( ID1 == 10247 ){
CHAR_setInt( petindex, CHAR_BASEIMAGENUMBER, 130088);
CHAR_setInt( petindex, CHAR_BASEBASEIMAGENUMBER, 130088);
CHAR_setChar( petindex, CHAR_NAME, "至尊-红龙");
//print("PET:%s fix BBI\n", CHAR_getUseName(petindex));
}
#endif
// WON ADD 修正白虎七技
if( ID1 == 777 )CHAR_setInt( petindex, CHAR_SLOT, 7);
CHAR_setWorkInt( petindex, CHAR_WORKPLAYERINDEX, charaindex);
// 修正宠技最大值变-1 Robin 20040803
if( CHAR_getInt( petindex, CHAR_SLOT) < 0 ) {
int j;
for( j=0; j<CHAR_MAXPETSKILLHAVE; j++) {
if( CHAR_getPetSkill( petindex, j) >= 0)
CHAR_setInt( petindex, CHAR_SLOT, j+1);
}
//print(" 宠技MAX变-1改6 ");
}
CHAR_complianceParameter( petindex );
#ifdef _FIX_GP_PET_SKILL // WON ADD 修正gp宠会落马术
if( ID1 == 1133){
int j;
for( j=0; j<CHAR_MAXPETSKILLHAVE; j++){
if( CHAR_getPetSkill( petindex, j) == 210 ){ // 落马术
CHAR_setPetSkill( petindex, j, -1);
}
}
}
#endif
}
}
}
{
int i,j;
// char *petstring;//ttom
// char *c_ptr_index;
// char c_temp[4096];
// char c_temp1[4096];
int ID1,ID2;
char* delbuf;
char delpetbuf[10];
delbuf = getDelPet();
// int tran_no;
BOOL b_find=FALSE;
//ttom
for( i = 0; i < CHAR_MAXPOOLPETHAVE; i ++ ) {
int petindex = CHAR_getCharPoolPet(charaindex,i);
if( CHAR_CHECKINDEX( petindex) ) {
#ifdef _UNIQUE_P_I
// CoolFish: 2001/10/11 Set Pet Unicode
CHAR_setPetUniCode(petindex);
#endif
#ifdef _NEWOPEN_MAXEXP
if( CHAR_getInt( petindex, CHAR_OLDEXP) > 0 ||
CHAR_getInt( charaindex, CHAR_OLDEXP) < 0 ){
CHAR_ChangeExp( petindex);
}
#endif
b_find=FALSE;
ID1=CHAR_getInt( petindex, CHAR_PETID);
/*
if(CHAR_getInt(petindex,CHAR_BEATITUDE)>0 && strstr(CHAR_getChar(petindex,CHAR_NAME),"+")==NULL){
char btmpname[128];
sprintf(btmpname,"%s+",CHAR_getChar(petindex,CHAR_NAME));
CHAR_setChar(petindex,CHAR_NAME,btmpname);
}
*/
#ifdef _JK_CF_DELPETITEM //删除CF指定宠物
for( j=1;j<=30;j++ ) {
if(getStringFromIndexWithDelim(delbuf,",", j, delpetbuf, sizeof(delpetbuf)) == FALSE)
break;
ID2 = atoi(delpetbuf);
if(ID2 == -1)break;
if( ID1 == ID2 ){
CHAR_setCharPoolPet( charaindex, i, -1);//清除不能当宠物的角色
LogPet( CHAR_getChar( charaindex, CHAR_NAME ),
CHAR_getChar( charaindex, CHAR_CDKEY ),
CHAR_getChar( petindex, CHAR_NAME),
CHAR_getInt( petindex, CHAR_LV),
"login(清除CF设置的宠物)",
CHAR_getInt( charaindex,CHAR_FLOOR),
CHAR_getInt( charaindex,CHAR_X ),
CHAR_getInt( charaindex,CHAR_Y ),
CHAR_getChar( petindex, CHAR_UNIQUECODE) // shan 2001/12/14
);
CHAR_talkToCli(charaindex,-1,"系统清除你宠物店里的宠物",CHAR_COLORWHITE);
}
}
#endif
#ifdef _REEDIT_PETBBIS
if( ID1 == 1133 ){
CHAR_setInt( petindex, CHAR_BASEIMAGENUMBER, 101578);
CHAR_setInt( petindex, CHAR_BASEBASEIMAGENUMBER, 101578);
}
#endif
#ifdef _YUANGUSA
if( ID1 == 10247 ){
CHAR_setInt( petindex, CHAR_BASEIMAGENUMBER, 130088);
CHAR_setInt( petindex, CHAR_BASEBASEIMAGENUMBER, 130088);
CHAR_setChar( petindex, CHAR_NAME, "至尊-红龙");
//print("PET:%s fix BBI\n", CHAR_getUseName(petindex));
}
#endif
/*
tran_no=CHAR_getInt( charaindex, CHAR_TRANSMIGRATION);
petstring = CHAR_makePetStringFromPetIndex( petindex);
c_ptr_index=strstr(petstring,"name:");
getStringFromIndexWithDelim(c_ptr_index,":",2,c_temp,sizeof(c_temp));
c_ptr_index=c_temp;
getStringFromIndexWithDelim(c_ptr_index,"|",1,c_temp1,sizeof(c_temp1));
if(b_find){//ttom
CHAR_setCharPoolPet( charaindex, i, -1);
print("\nKill pool pet ID=%d name=%s",ID1,c_temp1);
sprintf(c_temp2,"Kill pool pet ID=%d name=%s",ID1,c_temp1);
LogKill(CHAR_getChar( charaindex, CHAR_NAME ),
CHAR_getChar( charaindex, CHAR_CDKEY ),
c_temp2);
}else{//ttom
*/
CHAR_setWorkInt( petindex, CHAR_WORKPLAYERINDEX, charaindex);
CHAR_complianceParameter( petindex );
// }//ttom
}
}
}
// CHAR_ResetPoolPetEgg( charaindex);
// CHAR_CheckProfessionEquit( charaindex);
CHAR_CheckProfessionSkill( charaindex);
/*{
int i=0;
int skidx[]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,3,3,3,3,3,3,3};
//20040702 Change fix
//检查是否有职业不该有的技能并删除
for( i = CHAR_SKILLMAXHAVE-1; i >= 0; i -- ){
CHAR_HaveSkill *pSkil;
Skill* skill;
pSkil = CHAR_getCharHaveSkill( charaindex, i );
skill = &pSkil->skill;
if( pSkil == NULL )continue;
if( pSkil->use == 0 )continue;
if( skidx[skill->data[SKILL_IDENTITY]] != CHAR_getInt( charaindex, PROFESSION_CLASS )
&& skidx[skill->data[SKILL_IDENTITY]] != 4 ){//共通技不删
SKILL_makeSkillData( &pSkil->skill, 0, 0 );
pSkil->use = 0;
}
}
}*/
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
timep = mktime(p);
#ifdef _VIP_ANNOUNCE //VIP上线系统自动广告
if(CHAR_getInt( charaindex,CHAR_VIPRIDE )>0)
{
//#ifdef _YUANGUSA
// if(CHAR_getInt(charaindex,CHAR_VIPRIDE)==1 && CHAR_getInt(charaindex,CHAR_VIPTIME)==0){
// CHAR_setInt(charaindex,CHAR_VIPTIME,timep+60*60*24*30);
// }
//#endif
int viptype,viptime;
viptime = CHAR_getInt( charaindex,CHAR_VIPTIME );
viptype = CHAR_getInt( charaindex,CHAR_VIPRIDE );
int vipmsgtype = getVipMsgType();
if(viptime > 0)
{
viptime = viptime - timep;
}
if(viptime < 0)
{
CHAR_setInt( charaindex,CHAR_VIPRIDE,0 );
CHAR_setInt( charaindex,CHAR_VIPTIME,0 );
viptype = CHAR_getInt( charaindex,CHAR_VIPRIDE );
}
if(viptype>0 && vipmsgtype>0 && viptype>=vipmsgtype)
{
int i;
int playernum = CHAR_getPlayerMaxNum();
char VipMsg[256];
char *MyName = CHAR_getChar( charaindex,CHAR_NAME );
if(vipmsgtype == 1)
{
#ifdef _TEST_SERVER
if(viptype == 1)
sprintf( VipMsg, "『%s』尊贵的会员【%s】上线了大家热烈欢迎", "一起石器服务端", MyName );
else if(viptype == 2)
sprintf( VipMsg, "『%s』尊贵的黄金会员【%s】上线了大家热烈欢迎", "一起石器服务端", MyName );
else if(viptype == 3)
sprintf( VipMsg, "『%s』尊贵的钻石会员【%s】上线了大家热烈欢迎", "一起石器服务端", MyName );
#else
if(viptype == 1)
sprintf( VipMsg, "『%s』尊贵的会员【%s】上线了大家热烈欢迎", getGameservername(), MyName );
else if(viptype == 2)
sprintf( VipMsg, "『%s』尊贵的黄金会员【%s】上线了大家热烈欢迎", getGameservername(), MyName );
else if(viptype == 3)
sprintf( VipMsg, "『%s』尊贵的钻石会员【%s】上线了大家热烈欢迎", getGameservername(), MyName );
#endif
}
else if(vipmsgtype == 2)
{
#ifdef _TEST_SERVER
if(viptype == 2)
sprintf( VipMsg, "『%s』尊贵的黄金会员【%s】上线了大家热烈欢迎", "一起石器服务端", MyName );
else if(viptype == 3)
sprintf( VipMsg, "『%s』尊贵的钻石会员【%s】上线了大家热烈欢迎", "一起石器服务端", MyName );
#else
if(viptype == 2)
sprintf( VipMsg, "『%s』尊贵的黄金会员【%s】上线了大家热烈欢迎", getGameservername(), MyName );
else if(viptype == 3)
sprintf( VipMsg, "『%s』尊贵的钻石会员【%s】上线了大家热烈欢迎", getGameservername(), MyName );
#endif
}
else if(vipmsgtype == 3)
{
#ifdef _TEST_SERVER
if(viptype == 3)
sprintf( VipMsg, "『%s』尊贵的钻石会员【%s】上线了大家热烈欢迎", "一起石器服务端", MyName );
#else
if(viptype == 3)
sprintf( VipMsg, "『%s』尊贵的钻石会员【%s】上线了大家热烈欢迎", getGameservername(), MyName );
#endif
}
for( i = 0 ; i < playernum ; i++)
{
CHAR_talkToCli( i, -1, VipMsg, CHAR_COLORPURPLE);
}
}
}
#endif
#ifdef _OFFLINE_SYSTEM
if(strlen(CHAR_getChar(charaindex,CHAR_OFFBUF))<1){
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep); /*取得当地时间*/
int mon=1+p->tm_mon;
int date=p->tm_mday;
char offbuf[64];
sprintf(offbuf,"%d-%d-%d",mon,date,0);
CHAR_setChar(charaindex,CHAR_OFFBUF,offbuf);
CHAR_setInt(charaindex,CHAR_OFFTIME,172800);
}
#endif
//22222222222222222222222222222222
CHAR_loginCheckUserItem( charaindex);
CHAR_complianceParameter( charaindex );
// Robin add 重设宠蛋 养时间
CHAR_ResetPetEggFusionTime( charaindex);
#ifdef _PROFESSION_FIX_LEVEL // WON ADD 修正职业经验值
{
int i=0;
for( i = 0 ; i < CHAR_SKILLMAXHAVE ; i ++ ){
CHAR_HaveSkill* hskill;
hskill = CHAR_getCharHaveSkill( charaindex, i );
if( hskill != NULL && hskill->use == TRUE ){
int skill_level = SKILL_getInt( &hskill->skill, SKILL_LEVEL);
if( skill_level < 10 ){
SKILL_setInt( &hskill->skill, SKILL_LEVEL, 10* 100 );
}
}
}
}
#endif
#ifdef _CHANNEL_MODIFY
if(CHAR_getInt(charaindex,PROFESSION_CLASS) > 0){
int i,pclass = CHAR_getInt(charaindex,PROFESSION_CLASS) - 1,Empty = -1;
// 若旧的职业频道记录有记录在就留着,若没有加入频道
for(i=0;i<getFdnum();i++){
if(*(piOccChannelMember + (pclass * getFdnum()) + i) == charaindex) break;
else if(*(piOccChannelMember + (pclass * getFdnum()) + i) == -1 && Empty == -1) Empty = i;
}
// 找不到旧记录
if(i == getFdnum()){
if(Empty != -1) *(piOccChannelMember + (pclass * getFdnum()) + Empty) = charaindex;
}
}
#endif
#ifdef _STREET_VENDOR
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO,-1);
{
int i;
for(i=0;i<MAX_SELL_ITEM;i++) CHAR_clearStreetVendor(charaindex,i);
}
#endif
#ifdef _NEW_MANOR_LAW
if(CHAR_getInt(charaindex,CHAR_MOMENTUM) < 0) CHAR_setInt(charaindex,CHAR_MOMENTUM,0);
if(CHAR_getInt(charaindex,CHAR_MOMENTUM) > MAX_PERSONAL_MOMENTUM) CHAR_setInt(charaindex,CHAR_MOMENTUM,MAX_PERSONAL_MOMENTUM);
#endif
#ifdef _PETSKILL_BECOMEPIG
if( CHAR_getInt( charaindex, CHAR_BECOMEPIG) > -1 ){
CHAR_setInt( charaindex, CHAR_BASEIMAGENUMBER, CHAR_getInt( charaindex, CHAR_BECOMEPIG_BBI ) );
}
//change fix 处理负很大的乌力时间
else{
CHAR_setInt( charaindex, CHAR_BECOMEPIG, -1 );
}
#endif
lssproto_CharLogin_send( clifd, SUCCESSFUL,"" );
per = ENCOUNT_getEncountPercentMin( charaindex,
CHAR_getInt( charaindex, CHAR_FLOOR),
CHAR_getInt( charaindex, CHAR_X),
CHAR_getInt( charaindex, CHAR_Y));
if( per != -1) {
CHAR_setWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MIN, per);
}
per = ENCOUNT_getEncountPercentMax( charaindex,
CHAR_getInt( charaindex, CHAR_FLOOR),
CHAR_getInt( charaindex, CHAR_X),
CHAR_getInt( charaindex, CHAR_Y));
if( per != -1) {
CHAR_setWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MAX, per);
}
CHAR_setLuck( charaindex);
{
int i;
char* statuscat[]={"C","P","I","S","D","E","F"};
for( i=0 ; i<arraysizeof(statuscat) ; i++ )
CHAR_sendStatusString( charaindex, statuscat[i] );
}
{
int i;
char category[3];
for( i = 0; i < CHAR_MAXPETHAVE; i ++ ) {
snprintf( category, sizeof( category), "K%d",i);
CHAR_sendStatusString( charaindex, category );
snprintf( category, sizeof( category), "W%d",i);
CHAR_sendStatusString( charaindex, category );
}
}
{
int petarray = CHAR_getInt( charaindex, CHAR_DEFAULTPET);
if( CHAR_CHECKPETINDEX( petarray)) {
if( !CHAR_CHECKINDEX( CHAR_getCharPet( charaindex, petarray))) {
petarray = -1;
}
}else {
petarray = -1;
}
lssproto_KS_send( clifd, petarray, TRUE);
}
{
int flg = 0;
CHAR_setFlg( charaindex, CHAR_ISSHOWBATTLEMSG, 0);
CHAR_setFlg( charaindex, CHAR_ISDUEL, 0);
CHAR_setFlg( charaindex, CHAR_ISTRADECARD, 0);
if( CHAR_getFlg( charaindex, CHAR_ISPARTY)) flg |= CHAR_FS_PARTY;
if( CHAR_getFlg( charaindex, CHAR_ISDUEL)) flg |= CHAR_FS_DUEL;
if( CHAR_getFlg( charaindex, CHAR_ISPARTYCHAT)) flg |= CHAR_FS_PARTYCHAT;
if( CHAR_getFlg( charaindex, CHAR_ISTRADECARD)) flg |= CHAR_FS_TRADECARD;
#ifdef _CHANNEL_MODIFY
CHAR_setFlg(charaindex,CHAR_ISTELL,0);
CHAR_setFlg(charaindex,CHAR_ISFM,0);
CHAR_setFlg(charaindex,CHAR_ISOCC,0);
CHAR_setFlg(charaindex,CHAR_ISCHAT,0);
CHAR_setFlg(charaindex,CHAR_ISSAVE,0);
if(getSaType()==95){
CHAR_setFlg(charaindex,CHAR_ISWORLD,TRUE);
flg |= CHAR_FS_WORLD;
}
#endif
// CoolFish: 2001/4/18
CHAR_setFlg( charaindex, CHAR_ISTRADE, 0);
lssproto_FS_send( clifd, flg);
}
MAP_sendArroundCharNeedFD( clifd, charaindex );
CHAR_setInt( charaindex, CHAR_LOGINCOUNT, CHAR_getInt( charaindex, CHAR_LOGINCOUNT) + 1 );
CHAR_sendCToArroundCharacter( objindex );
CHAR_sendArroundCharaData( charaindex );
CHAR_sendWatchEvent(objindex,CHAR_ACTSTAND,NULL,0,TRUE);
ADDRESSBOOK_notifyLoginLogout(charaindex,1);
CHAR_setWorkInt(charaindex,CHAR_WORKLASTATTACKCHARAINDEX,-1);
if(CHAR_getInt(charaindex,CHAR_HP) <= 0 ){
typedef int (*DYINGFUNC)(int);
DYINGFUNC dyingfunc=NULL;
dyingfunc = (DYINGFUNC)CHAR_getFunctionPointer(charaindex, CHAR_DYINGFUNC );
CHAR_setInt(charaindex,CHAR_HP,1); // HP 设为 1
//logHack( CHAR_getWorkInt(charaindex,CHAR_WORKFD), HACK_HP);
}
if( CHAR_getInt( charaindex,CHAR_SKILLUPPOINT ) >=1 )
CHAR_Skillupsend(charaindex);
CHAR_checkEffect( charaindex);
// CoolFish: Family 2001/5/30
if ((CHAR_getChar(charaindex, CHAR_FMNAME)!=NULL) &&
(CHAR_getInt(charaindex, CHAR_FMINDEX) >= 0) &&
(strcmp(CHAR_getChar(charaindex, CHAR_FMNAME), "") != 0))
{
#ifdef _FMVER21
int eventflag = 0;
// 是否符合族长得资格
if (CheckLeaderQ(charaindex) >= 0)
eventflag = 1;
if (CHAR_getInt(charaindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER)
SetFMPetVarInit(charaindex);
saacproto_ACFMCharLogin_send(
acfd,
CHAR_getChar(charaindex, CHAR_FMNAME),
CHAR_getInt(charaindex, CHAR_FMINDEX),
CHAR_getChar(charaindex, CHAR_NAME),
CHAR_getChar(charaindex, CHAR_CDKEY),
CHAR_getInt(charaindex, CHAR_LV), eventflag,
CONNECT_getFdid(clifd)
#ifdef _FM_MODIFY
,getServernumber()
#endif
);
}
#ifdef _FMVER21
else
SetFMVarInit(charaindex);
#endif
#endif
AnnounceToPlayerWN( clifd );
#ifdef _ANGEL_SUMMON
{
int mindex;
mindex = checkIfOnlyAngel( charaindex);
if( mindex != -1 ) {
if( missiontable[mindex].flag == MISSION_WAIT_ANSWER ) {
lssproto_WN_send( clifd, WINDOW_MESSAGETYPE_ANGELMESSAGE,
WINDOW_BUTTONTYPE_YESNO,
CHAR_WINDOWTYPE_ANGEL_ASK,
-1,
"目前魔族肆虐,精灵们需要你的帮忙,前往寻找勇者来消灭这些魔族,你是否愿意帮忙?" );
}
}
}
#endif
print("\n登陆人物名称:%s ", CHAR_getChar(charaindex, CHAR_NAME ) );
unsigned long ip;
char ipstr[512];
ip=CONNECT_get_userip(clifd);
sprintf(ipstr,"%d.%d.%d.%d",
((unsigned char *)&ip)[0],
((unsigned char *)&ip)[1],
((unsigned char *)&ip)[2],
((unsigned char *)&ip)[3]);
#ifdef _RECORD_IP
CHAR_setWorkInt(charaindex, CHAR_WORK_RECORD_IP, CONNECT_get_userip(clifd));
#endif
// CHAR_setChar(charaindex,CHAR_CHARPLAYIP,ipstr);
char pcid[64];
memset( pcid, 0 , sizeof( pcid ) );
CONNECT_getPcid( clifd, pcid, sizeof( pcid ));
LogLogin(
CHAR_getChar( charaindex, CHAR_CDKEY),
CHAR_getChar( charaindex, CHAR_NAME),
saveindex, ipstr,pcid
);
#ifdef _VIGOR_SYS
CHAR_setWorkInt(charaindex,CHAR_WORKVIGORTIME,timep);
#endif
#ifdef _TEACHER_SYSTEM
// 学生上线通知导师
if(strlen(CHAR_getChar(charaindex,CHAR_TEACHER_ID)) > 0 && strlen(CHAR_getChar(charaindex,CHAR_TEACHER_NAME)) > 0){
int iPlayernum = CHAR_getPlayerMaxNum(),i;
char szMsg[128];
for(i=0;i<iPlayernum;i++){
if(CHAR_getCharUse(i) == FALSE) continue;
if(strcmp(CHAR_getChar(charaindex,CHAR_TEACHER_ID),CHAR_getChar(i,CHAR_CDKEY)) == 0 &&
strcmp(CHAR_getChar(charaindex,CHAR_TEACHER_NAME),CHAR_getChar(i,CHAR_NAME)) == 0){
sprintf(szMsg,"学生 %s 已上线",CHAR_getChar(charaindex,CHAR_NAME));
CHAR_talkToCli(i,-1,szMsg,CHAR_COLORYELLOW);
break;
}
}
}
#endif
#ifdef _ITEM_SETLOVER
// 夫妻上线通知对方
if(strlen( CHAR_getChar( charaindex, CHAR_LOVE)) > 0 &&
strlen(CHAR_getChar(charaindex,CHAR_LOVERID))>0 &&
strlen(CHAR_getChar(charaindex,CHAR_LOVERNAME))>0){
int iPlayernum = CHAR_getPlayerMaxNum(),i;
char szMsg[128];
for(i=0;i<iPlayernum;i++){
if(CHAR_getCharUse(i) == FALSE) continue;
if(!strcmp( CHAR_getChar( i, CHAR_LOVE), "YES") &&
!strcmp(CHAR_getChar(charaindex,CHAR_LOVERID),CHAR_getChar(i,CHAR_CDKEY)) &&
!strcmp(CHAR_getChar(charaindex,CHAR_LOVERNAME),CHAR_getChar(i,CHAR_NAME))){
sprintf(szMsg,"你的爱人 %s 上线了",CHAR_getChar(charaindex,CHAR_NAME));
CHAR_talkToCli(i,-1,szMsg,CHAR_COLORYELLOW);
break;
}
}
}
#endif
#ifdef _SAFE_PASSWORD
if(getSafeMode()==1 || CHAR_getInt(charaindex,CHAR_LOCK)==1)
{
CHAR_setWorkInt(charaindex,CHAR_WORKSAFEMODE,1);
}
#endif
#ifdef _JOB_AUTOPK
if(CHAR_getInt(charaindex,CHAR_JOBPKMODE)>0){
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
timep = mktime(p);
if(CHAR_getInt(charaindex,CHAR_JOBPKTIME)-timep<=0){
CHAR_setInt(charaindex,CHAR_JOBPKTIME,0);
CHAR_setInt(charaindex,CHAR_JOBPKMODE,0);
}else{
char jobbuf[256];
if(CHAR_getInt(charaindex,CHAR_JOBPKMODE)==1){
sprintf(jobbuf,"热烈欢迎远古白狼勇士『首席弟子』【%s】上线",CHAR_getChar(charaindex,CHAR_NAME));
}else if(CHAR_getInt(charaindex,CHAR_JOBPKMODE)==2){
sprintf(jobbuf,"热烈欢迎远古闇灵法师『首席弟子』【%s】上线",CHAR_getChar(charaindex,CHAR_NAME));
}else{
sprintf(jobbuf,"热烈欢迎远古追猎者『首席弟子』【%s】上线",CHAR_getChar(charaindex,CHAR_NAME));
}
int i;
int playernum = CHAR_getPlayerMaxNum();
for( i = 0 ; i < playernum ; i++)
{
CHAR_talkToCli( i, -1, jobbuf, CHAR_COLORRED);
}
}
}
#endif
{
sasql_online(cdkey,CHAR_getChar(charaindex,CHAR_NAME),ipstr,CHAR_getInt(charaindex,CHAR_FAME),CHAR_getInt(charaindex,CHAR_VIGOR),1);
}
{
if(CHAR_getInt(charaindex,CHAR_WALKINTERVAL) != getWalksendinterval())
CHAR_setInt(charaindex,CHAR_WALKINTERVAL,getWalksendinterval());
}
#ifdef _PET_ITEM
if( CHAR_CHECKINDEX( CHAR_getCharPet( charaindex, 0) ) ){
CHAR_sendPetItemData(charaindex,0);
}
if( CHAR_CHECKINDEX( CHAR_getCharPet( charaindex, 1) ) ){
CHAR_sendPetItemData(charaindex,1);
}
if( CHAR_CHECKINDEX( CHAR_getCharPet( charaindex, 2) ) ){
CHAR_sendPetItemData(charaindex,2);
}
if( CHAR_CHECKINDEX( CHAR_getCharPet( charaindex, 3) ) ){
CHAR_sendPetItemData(charaindex,3);
}
if( CHAR_CHECKINDEX( CHAR_getCharPet( charaindex, 4) ) ){
CHAR_sendPetItemData(charaindex,4);
}
#endif
if(CHAR_getInt(charaindex,CHAR_LV)>10 || CHAR_getInt(charaindex,CHAR_TRANSMIGRATION)>0){
sasql_online_ip(cdkey,ipstr);
}
CHAR_setWorkInt(charaindex,CHAR_WORKALLTALKTYPE,0);
return;
DELETECHARDATA:
CHAR_endCharOneArray( charaindex );
MAKECHARDATAERROR:
{
int i;
char cdkey[CDKEYLEN];
for( i = 0; i < CHAR_MAXPETHAVE; i ++ ) {
if( CHAR_CHECKINDEX(ch.unionTable.indexOfPet[i] ) ) {
CHAR_endCharOneArray( ch.unionTable.indexOfPet[i] );
}
}
CONNECT_getCdkey( clifd, cdkey, sizeof(cdkey ));
saacproto_ACLock_send( acfd, cdkey, UNLOCK, CONNECT_getFdid(clifd) );
}
CONNECT_setState(clifd, WHILECANNOTLOGIN );
CONNECT_setCharaindex( clifd, -1 );
lssproto_CharLogin_send( clifd, FAILED, "在线人数已满,请尝试登陆其他线路,或稍后重试。");
}
BOOL CHAR_charSaveFromConnectAndChar( int fd, Char* ch, BOOL unlock )
{
char* chardata;
char cdkey[CDKEYLEN];
chardata = CHAR_makeStringFromCharData( ch );
if( chardata == "\0" )return FALSE;
// CONNECT_getCdkey( fd, cdkey, sizeof(cdkey));
//
// if(strcmp(cdkey,ch->string[CHAR_CDKEY].string)!=0){
// printf("连接:%s与账号:%s不符合不给予存档",cdkey,ch->string[CHAR_CDKEY].string);
// return FALSE;
// }
#ifdef _DBSAVE_CHAR
else{
if(ch->data[CHAR_SAVEINDEXNUMBER]!=-1)
CharaData( fd, ch );
}
#endif
#ifdef _NEWSAVE
// print("saveindex_save:%d\n",ch->data[CHAR_SAVEINDEXNUMBER]);
saacproto_ACCharSave_send( acfd, ch->string[CHAR_CDKEY].string,
ch->string[CHAR_NAME].string,
CHAR_makeOptionString( ch ), chardata,
unlock, CONNECT_getFdid(fd), ch->data[CHAR_SAVEINDEXNUMBER] );
#else
saacproto_ACCharSave_send( acfd, cdkey,
ch->string[CHAR_NAME].string,
CHAR_makeOptionString( ch ), chardata,
unlock, CONNECT_getFdid(fd) );
#endif
if(unlock) sasql_online(ch->string[CHAR_CDKEY].string,NULL,NULL,NULL,NULL,0);
return TRUE;
}
BOOL CHAR_charSaveFromConnect( int charaindex , BOOL unlock)
{
Char* ch;
int fd = getfdFromCharaIndex(charaindex);
if( CHAR_CHECKINDEX( charaindex ) == FALSE)return FALSE;
ch = CHAR_getCharPointer( charaindex );
if( !ch )return FALSE;
#ifdef _CHAR_POOLITEM
if( CHAR_SaveDepotItem( charaindex) == TRUE ){
print("saveDepotItem:%d \n", charaindex);
}
#endif
#ifdef _CHAR_POOLPET
if( CHAR_SaveDepotPet( charaindex) == TRUE ){
print("saveDepotPet:%d \n", charaindex);
}
#endif
return CHAR_charSaveFromConnectAndChar( fd, ch, unlock );
}
/*------------------------------------------------------------
* ログアウトする時に持ったままログアウトできないアイテムを
* 落す
* 引数
* charaindex int キャラクターのインデックス
* 返り値
* なし
------------------------------------------------------------*/
static void CHAR_dropItemAtLogout( int charaindex )
{
int i;
for( i=0 ; i<CHAR_MAXITEMHAVE ; i++ ){
int itemindex;
itemindex = CHAR_getItemIndex(charaindex,i);
if( ITEM_CHECKINDEX(itemindex) == FALSE )continue;
if( ITEM_getInt(itemindex,ITEM_DROPATLOGOUT ) == TRUE ) {
{
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
"LogoutDel(登出後消失的道具)",
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_setItemIndex( charaindex, i ,-1);
CHAR_sendItemDataOne( charaindex, i);
ITEM_endExistItemsOne(itemindex);
}
}
}
BOOL _CHAR_logout( char *file, int line, int charindex, BOOL save )
{
int clifd,battleindex;
#ifdef _STREET_VENDOR
int toindex;
#endif
BOOL ret = TRUE;
int fmindexi, channel, i;
clifd = getfdFromCharaIndex(charindex);
if( !CHAR_CHECKINDEX( charindex)) {
// print( "logout err : clifd[%d] charaindex[%d] %s:%d from %s:%d \n",
// clifd, charindex, __FILE__, __LINE__, file, line);
ret = FALSE;
}
battleindex = CHAR_getWorkInt( charindex, CHAR_WORKBATTLEINDEX );
if( battleindex >= 0 ){
BATTLE_EscapeDpSend( battleindex, charindex );
CHAR_setInt( charindex, CHAR_DUELPOINT,
CHAR_getInt( charindex, CHAR_DUELPOINT )
+ CHAR_getWorkInt( charindex, CHAR_WORKGETEXP ) );
CHAR_setWorkInt( charindex, CHAR_WORKDBATTLEESCAPE, 1);
BATTLE_Exit( charindex, battleindex );
}
CHAR_dropItemAtLogout( charindex );
CHAR_DischargeParty( charindex, 0);
if(CHAR_getChar(charindex, CHAR_FMNAME) != NULL ) {
if(strlen(CHAR_getChar(charindex, CHAR_FMNAME)) > 0 &&
strlen(CHAR_getChar(charindex, CHAR_FMNAME)) < sizeof( STRING32) )
if( (CHAR_getInt(charindex, CHAR_FMINDEX) >= 0) &&
(strcmp(CHAR_getChar(charindex, CHAR_FMNAME), "") != 0) ) {
saacproto_ACFMCharLogout_send(acfd,
CHAR_getChar(charindex, CHAR_FMNAME),
CHAR_getInt(charindex, CHAR_FMINDEX),
CHAR_getChar(charindex, CHAR_NAME),
CHAR_getChar(charindex, CHAR_CDKEY),
CHAR_getInt(charindex, CHAR_LV),
CHAR_getWorkInt(charindex, CHAR_WORKFMINDEXI),
CONNECT_getFdid(clifd));
}
}
#ifdef _CHATROOMPROTOCOL // (不可开) Syu ADD 聊天室频道
if ( CHAR_getWorkInt ( charindex , CHAR_WORKCHATROOMTYPE ) != 0 ) {
ChatRoom_Leave ( charindex ) ;
}
#endif
#ifdef _STREET_VENDOR
// 若玩家是卖方且正在交易中
if(CHAR_getWorkInt(charindex,CHAR_WORKSTREETVENDOR) == 2){
// 取出和他交易的人
toindex = CHAR_getWorkInt(charindex,CHAR_WORKSTREETVENDOR_WHO);
if(toindex > -1 && CHAR_CHECKINDEX(toindex)){
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR_WHO,-1);
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR,-1);
lssproto_STREET_VENDOR_send(getfdFromCharaIndex(toindex),"C|");
CHAR_talkToCli(toindex,-1,"店家取消交易",CHAR_COLORYELLOW);
}
}
// 玩家是买方
else if(CHAR_getWorkInt(charindex,CHAR_WORKSTREETVENDOR) == 3){
// 取出卖方
toindex = CHAR_getWorkInt(charindex,CHAR_WORKSTREETVENDOR_WHO);
if(toindex > -1 && CHAR_CHECKINDEX(toindex)){
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR_WHO,-1);
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR,1);
}
}
#endif
// Robin 0606 channel
fmindexi = CHAR_getWorkInt(charindex, CHAR_WORKFMINDEXI);
channel = CHAR_getWorkInt(charindex, CHAR_WORKFMCHANNEL);
i = 0;
if( (fmindexi > 0) && (channel >= 0) && (fmindexi < FAMILY_MAXNUM) && (channel < FAMILY_MAXCHANNEL)) {
while( i < FAMILY_MAXMEMBER ) {
if( channelMember[fmindexi][channel][i] == charindex ) {
channelMember[fmindexi][channel][i] = -1;
break;
}
i++;
}
}
#ifdef _CHANNEL_MODIFY
if(CHAR_getInt(charindex,PROFESSION_CLASS) > 0){
int i,pclass = CHAR_getInt(charindex,PROFESSION_CLASS) - 1;
for(i=0;i<getFdnum();i++){
if(*(piOccChannelMember + (pclass * getFdnum()) + i) == charindex){
*(piOccChannelMember + (pclass * getFdnum()) + i) = -1;
break;
}
}
}
#endif
// Robin 0707 petFollow
CHAR_pickupFollowPet( charindex, -1 );
for( i=0; i<FAMILY_MAXMEMBER; i++ ){
if ((fmindexi > 0) && (fmindexi < FAMILY_MAXNUM)){
if( familyMemberIndex[fmindexi][i] == charindex )
familyMemberIndex[fmindexi][i] = -1;
}
}
// Robin 0629 silent
if( CHAR_getInt( charindex, CHAR_SILENT) > 0 ){
int silent_t, login_t;
login_t = CHAR_getWorkInt(charindex, CHAR_WORKLOGINTIME);
silent_t = CHAR_getInt( charindex, CHAR_SILENT);
silent_t = silent_t - ( (int)NowTime.tv_sec-login_t);
if( silent_t<0 ) silent_t = 0;
CHAR_setInt( charindex, CHAR_SILENT, silent_t);
}
#ifdef _ITEM_ADDEXP2
if( CHAR_getInt( charindex, CHAR_ADDEXPPOWER) > 0 ) {
// 登入时智果效果自动减90秒
CHAR_setInt( charindex, CHAR_ADDEXPTIME,
CHAR_getInt( charindex, CHAR_ADDEXPTIME) - 90 );
if( CHAR_getInt( charindex, CHAR_ADDEXPTIME) <= 0 ) {
CHAR_setInt( charindex, CHAR_ADDEXPTIME, 0);
CHAR_setInt( charindex, CHAR_ADDEXPPOWER, 0);
}
}
#endif
#ifdef _VIP_BATTLE_EXP
if( CHAR_getInt( charindex, CHAR_NVIPTIME) <= 0 ) {
CHAR_setInt( charindex, CHAR_NVIPTIME, 0);
CHAR_setInt( charindex, CHAR_NVIPEXP, 0);
}
#endif
#ifdef _TIME_TICKET
if( check_TimeTicketMap( CHAR_getInt( charindex, CHAR_FLOOR)) ) {
CHAR_warpToSpecificPoint( charindex, 2006, 20, 17);
}
#endif
#ifdef _AUTO_PK
if(CHAR_getInt(charindex,CHAR_FLOOR)==20000 && CHAR_getInt(charindex,CHAR_AUTOPK)!=-1 && autopkstart == 1){
char buf[64];
int i,num=0,winindex;
int playernum = CHAR_getPlayerMaxNum();
#ifndef _YUANGUSA
sprintf(buf, "胆小鬼%s退出当前比赛",CHAR_getChar(charindex,CHAR_NAME));
AutoPk_PKSystemTalk( buf, buf );
#endif
if(CHAR_getWorkInt( charindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE){
if(AutoPk_PKTimeGet()<=0){
for(i=0;i<playernum;i++){
if(CHAR_CHECKINDEX(i) == FALSE ) continue;
if(CHAR_getInt(i, CHAR_FLOOR) == 20000 ){
if(CHAR_getInt(i,CHAR_AUTOPK)!=-1){
if(i!=charindex)
winindex=i;
num++;
}
}
}
#ifdef _NONUM_AUTOPK
if(num==5){
AutoPk_ChampionShipSet( CHAR_getChar(charindex,CHAR_CDKEY),
CHAR_getChar(charindex,CHAR_NAME), CHAR_getInt(charindex,CHAR_AUTOPK),4);
}else if(num==4){
AutoPk_ChampionShipSet( CHAR_getChar(charindex,CHAR_CDKEY),
CHAR_getChar(charindex,CHAR_NAME), CHAR_getInt(charindex,CHAR_AUTOPK),3);
}else if(num==3){
AutoPk_ChampionShipSet( CHAR_getChar(charindex,CHAR_CDKEY),
CHAR_getChar(charindex,CHAR_NAME), CHAR_getInt(charindex,CHAR_AUTOPK),2);
}else if(num==2){
int fl = 0, x = 0, y = 0;
CHAR_getElderPosition(CHAR_getInt(winindex, CHAR_LASTTALKELDER), &fl, &x, &y);
CHAR_warpToSpecificPoint(winindex, fl, x, y);
AutoPk_ChampionShipSet( CHAR_getChar(winindex,CHAR_CDKEY),
CHAR_getChar(winindex,CHAR_NAME), CHAR_getInt(winindex,CHAR_AUTOPK),0);
AutoPk_ChampionShipSet( CHAR_getChar(charindex,CHAR_CDKEY),
CHAR_getChar(charindex,CHAR_NAME), CHAR_getInt(charindex,CHAR_AUTOPK),1);
AutoPk_GetChampionShip();
}
#else
if(num==2){
int fl = 0, x = 0, y = 0;
char pktoken1[256],pktoken2[256];
CHAR_getElderPosition(CHAR_getInt(winindex, CHAR_LASTTALKELDER), &fl, &x, &y);
CHAR_warpToSpecificPoint(winindex, fl, x, y);
autopkcnt++;
int autopkvigor = getAutoPkVigorPkNum()*CHAR_getInt(charindex,CHAR_AUTOPK)+getAutoPkVigorPkCnt()*autopkcnt;
CHAR_setInt(charindex,CHAR_VIGOR,CHAR_getInt(charindex,CHAR_VIGOR)+autopkvigor);
sprintf(pktoken1,"[比赛战果]:「%s」击杀点数 %d 生存点数 %d 获得活力%d",CHAR_getChar(charindex,CHAR_NAME),CHAR_getInt(charindex,CHAR_AUTOPK),autopkcnt,autopkvigor);
autopkcnt++;
CHAR_setInt(winindex,CHAR_AUTOPK,CHAR_getInt(winindex,CHAR_AUTOPK)+2);
autopkvigor = getAutoPkVigorPkNum()*CHAR_getInt(winindex,CHAR_AUTOPK)+getAutoPkVigorPkCnt()*autopkcnt;
CHAR_setInt(winindex,CHAR_VIGOR,CHAR_getInt(winindex,CHAR_VIGOR)+autopkvigor);
sprintf(pktoken2,"[比赛战果]:「%s」击杀点数 %d 生存点数 %d 获得活力%d",CHAR_getChar(winindex,CHAR_NAME),CHAR_getInt(winindex,CHAR_AUTOPK),autopkcnt,autopkvigor);
i=0;
for(i=0;i<playernum;i++){
if(CHAR_CHECKINDEX(i) == FALSE) continue;
CHAR_talkToCli( i, -1, pktoken1, CHAR_COLORCYAN );
CHAR_talkToCli( i, -1, pktoken2, CHAR_COLORCYAN );
}
AutoPk_ChampionShipSet( CHAR_getChar(winindex,CHAR_CDKEY),
CHAR_getChar(winindex,CHAR_NAME), CHAR_getInt(winindex,CHAR_AUTOPK),0);
AutoPk_ChampionShipSet( CHAR_getChar(winindex,CHAR_CDKEY),
CHAR_getChar(winindex,CHAR_NAME), CHAR_getInt(winindex,CHAR_AUTOPK),1);
AutoPk_ChampionShipSet( CHAR_getChar(charindex,CHAR_CDKEY),
CHAR_getChar(charindex,CHAR_NAME),
CHAR_getInt(charindex,CHAR_AUTOPK),2);
AutoPk_GetChampionShip();
}
#endif
}
}
}
#endif
// Robin add
CHAR_setInt( charindex, CHAR_LASTLEAVETIME, (int)time(NULL));
#ifdef _VIGOR_SYS
#ifdef _OFFLINE_SYSTEM
if(CHAR_getWorkInt( charindex, CHAR_WORK_OFFLINE ) == 0)
#endif
{
if(CHAR_getInt(charindex,CHAR_VIPRIDE)>0 && getVigorTime(CHAR_getInt(charindex,CHAR_TRANSMIGRATION))>0){
if(CHAR_getInt(charindex,CHAR_VIGOR)<getVigorMax()){ //小于活力最大值
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
timep = mktime(p);
int curtime = timep-CHAR_getWorkInt(charindex,CHAR_WORKVIGORTIME);
if(curtime>=getVigorTime(CHAR_getInt(charindex,CHAR_TRANSMIGRATION)) && getVigorTime(CHAR_getInt(charindex,CHAR_TRANSMIGRATION))>0 && CHAR_getWorkInt(charindex,CHAR_WORKVIGORTIME)>0 ){
CHAR_setInt(charindex,CHAR_VIGOR,min(CHAR_getInt(charindex,CHAR_VIGOR)+(int)(curtime/getVigorTime(CHAR_getInt(charindex,CHAR_TRANSMIGRATION))*2),getVigorMax()));
//CHAR_setWorkInt(charindex,CHAR_WORKVIGORTIME,CHAR_getWorkInt(charindex,CHAR_WORKVIGORTIME)+(int)(curtime/getVigorTime(1))*getVigorTime(1));
CHAR_setWorkInt(charindex,CHAR_WORKVIGORTIME,timep);
}
}
}else if(CHAR_getInt(charindex,CHAR_VIPRIDE)<=0 && getVigorTime(CHAR_getInt(charindex,CHAR_TRANSMIGRATION))>0){
if(CHAR_getInt(charindex,CHAR_VIGOR)<getVigorMax()){ //小于活力最大值
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
timep = mktime(p);
int curtime = timep-CHAR_getWorkInt(charindex,CHAR_WORKVIGORTIME);
if(curtime>=getVigorTime(CHAR_getInt(charindex,CHAR_TRANSMIGRATION)) && getVigorTime(CHAR_getInt(charindex,CHAR_TRANSMIGRATION))>0 && CHAR_getWorkInt(charindex,CHAR_WORKVIGORTIME)>0){
CHAR_setInt(charindex,CHAR_VIGOR,min(CHAR_getInt(charindex,CHAR_VIGOR)+(int)(curtime/getVigorTime(CHAR_getInt(charindex,CHAR_TRANSMIGRATION))),getVigorMax()));
//CHAR_setWorkInt(charindex,CHAR_WORKVIGORTIME,CHAR_getWorkInt(charindex,CHAR_WORKVIGORTIME)+(int)(curtime/getVigorTime(CHAR_getInt(charindex,CHAR_TRANSMIGRATION)))*getVigorTime(CHAR_getInt(charindex,CHAR_TRANSMIGRATION)));
CHAR_setWorkInt(charindex,CHAR_WORKVIGORTIME,timep);
}
}
}
#ifdef _ONLINE_TIME
if (CHAR_getInt(charindex,CHAR_TRANSMIGRATION)>=0)
{
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
timep = mktime(p);
int curtime = timep-CHAR_getWorkInt(charindex,CHAR_WORKVIGORTIME);
CHAR_setInt(charindex,CHAR_ONLINE_TIME,CHAR_getInt(charindex,CHAR_ONLINE_TIME)+curtime);
#ifdef _REGISTRATION_TIME
// CHAR_setInt(charindex,CHAR_REGISTRATION_ONLINE_TIME,CHAR_getInt(charindex,CHAR_REGISTRATION_ONLINE_TIME)+curtime);
#endif
}
#endif
}
#endif
//1111111111111111111111111111111111111
if(CHAR_getInt(charindex,CHAR_FMINDEX) != -1 && (strcmp(CHAR_getChar(charindex,CHAR_FMNAME),""))){
char tempbuf[256];
sprintf(tempbuf,"%d",CHAR_getInt(charindex,CHAR_FAME));
saacproto_ACFixFMData_send(acfd,
CHAR_getChar(charindex,CHAR_FMNAME),
CHAR_getInt(charindex,CHAR_FMINDEX),
CHAR_getWorkInt(charindex,CHAR_WORKFMINDEXI),
FM_FIX_FAME,tempbuf,"",
CHAR_getWorkInt(charindex,CHAR_WORKFMCHARINDEX),
CONNECT_getFdid(clifd));
}
#ifdef _ALLBLUES_LUA_1_4
RunCharLogOutEvent(charindex);
#endif
if( save ){
CHAR_charSaveFromConnect( charindex ,TRUE);
}
#ifdef _OFFLINE_SYSTEM
if(CHAR_getWorkInt( charindex, CHAR_WORK_OFFLINE )!=0)
playeronlinenum--;
#endif
ADDRESSBOOK_notifyLoginLogout(charindex,0);
CHAR_CharaDeleteHavePet( charindex);
CHAR_CharaDelete( charindex );
return ret;
}
/*------------------------------------------------------------
* watchイベントを送るかどうかチェックする
* 引数
* objindex int イベントをおこしたキャラのオブジェクト
* インデックス
* index int イベントをおこしたキャラのインデックス
* recvindex int イベントを受けとるキャラのindex
* chac int アクションの種類
* 返り値 TRUE: 送っていいよ
* FALSE: 駄目
------------------------------------------------------------*/
static BOOL CHAR_sendWatchEvent_sendCheck( int objindex, int index,
int recvindex, int chac)
{
/* 自分がNPCで相手もNPCの時抜ける */
if( OBJECT_getType( objindex) == OBJTYPE_CHARA &&
CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER &&
CHAR_getInt(recvindex, CHAR_WHICHTYPE )
!= CHAR_TYPEPLAYER )
{
return FALSE;
}
/* キャラ以外のwatch はチェック無しに真 */
if( OBJECT_getType( objindex) != OBJTYPE_CHARA) {
return TRUE;
}
/*
* 自分への歩きのCAは無しにする
*/
if( index == recvindex && chac == CHAR_ACTWALK ) {
return FALSE;
}
if( CHAR_getInt( recvindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) {
/* 戦闘中の人には無駄だから送信しない */
if( CHAR_getWorkInt( recvindex,CHAR_WORKBATTLEMODE)
!= BATTLE_CHARMODE_NONE)
{
return FALSE;
}
/* アクションじゃ無い時 */
if( CHAR_getWorkInt( index, CHAR_WORKACTION) == -1 ) {
if( OBJECT_getType(objindex) == OBJTYPE_CHARA) {
/* 同じパーティだったら
* 親以外は他のメンバーに歩きを送信しない
*/
if( CHAR_getWorkInt( index, CHAR_WORKPARTYMODE )
== CHAR_PARTY_CLIENT &&
CHAR_getWorkInt( recvindex, CHAR_WORKPARTYMODE)
!= CHAR_PARTY_NONE &&
chac == CHAR_ACTWALK )
{
int found = FALSE;
int loop;
/* 子を調べる */
for( loop = 1; loop < CHAR_PARTYMAX; loop ++ ) {
int partycharaindex = CHAR_getPartyIndex( recvindex, loop);
/* 動いたキャラが自分のパーティの子だった */
if( partycharaindex == index ) {
found = TRUE;
break;
}
}
if( found ) return FALSE;
}
/* 親は子のSTANDを送信しない */
if( CHAR_getWorkInt( index, CHAR_WORKPARTYMODE)
== CHAR_PARTY_CLIENT &&
CHAR_getWorkInt( recvindex, CHAR_WORKPARTYMODE)
== CHAR_PARTY_LEADER &&
chac == CHAR_ACTSTAND)
{
int found = FALSE;
int loop;
/* 子を調べる */
for( loop = 1; loop < CHAR_PARTYMAX; loop ++ ) {
int partycharaindex
= CHAR_getWorkInt( recvindex,
CHAR_WORKPARTYINDEX1+loop);
/* STANDしたキャラが自分のパーティの子だった */
if( partycharaindex == index ) {
found = TRUE;
break;
}
}
if( found ) return FALSE;
}
}
}
}
return TRUE;
}
void CHAR_sendWatchEvent( int objindex, int chac, int* opt,
int optlen,BOOL myflg )
{
int i;
int j;
int x=0,y=0,dir=0;
int floor;
int watchopt[32];
int watchoptlen=0;
typedef void (*WATCHF)(int,int,CHAR_ACTION,int,int,int,int*,int);
int index;
if( !CHECKOBJECTUSE(objindex) )return;
index = OBJECT_getIndex( objindex);
switch( OBJECT_getType(objindex) ){
case OBJTYPE_CHARA:
for( i=0; i<optlen ; i++ ) {
watchopt[i] = opt[i];
}
watchoptlen = optlen;
dir = CHAR_getInt(index,CHAR_DIR);
break;
case OBJTYPE_ITEM:
for( i=0; i<optlen ; i++ ) {
watchopt[i] = opt[i];
}
watchoptlen = optlen;
dir = 0;
break;
case OBJTYPE_GOLD:
watchopt[0] = index;
watchoptlen = 1;
dir = 0;
break;
default:
return;
}
x = OBJECT_getX(objindex);
y = OBJECT_getY(objindex);
floor = OBJECT_getFloor(objindex);
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(floor,i,j) ; object ;
object = NEXT_OBJECT(object) )
{
int receiveobjindex = GET_OBJINDEX(object);
int recvindex = OBJECT_getIndex( receiveobjindex);
WATCHF watchfunc=NULL;
switch( OBJECT_getType(receiveobjindex) ){
case OBJTYPE_CHARA:
/* 自分あてでは送信しないフラグが立っている時抜ける */
if( index == recvindex && myflg == FALSE ) {
break;
}
/* watch イベントを起こすかどうか他にチェックする */
if( !CHAR_sendWatchEvent_sendCheck( objindex,
index, recvindex ,
chac
))
{
break;
}
watchfunc =(WATCHF)CHAR_getFunctionPointer(
OBJECT_getIndex(receiveobjindex),
CHAR_WATCHFUNC);
break;
case OBJTYPE_ITEM:
watchfunc = (WATCHF)ITEM_getFunctionPointer(
OBJECT_getIndex(receiveobjindex),
ITEM_WATCHFUNC);
break;
case OBJTYPE_NOUSE:
case OBJTYPE_GOLD:
#ifdef _DEL_DROP_GOLD
GOLD_DeleteTimeCheckOne( receiveobjindex);
#endif
default:
break;
}
if( watchfunc == NULL )continue;
watchfunc( receiveobjindex, objindex, chac, x, y, dir,
watchopt, watchoptlen );
}
}
}
}
/*====================スキル====================*/
/*------------------------------------------------------------
* スキルアップできるよプロトコルをしゃべる。
* 引数
* charaindex int キャラインデックス
* 返り値
* 成功 TRUE(1)
* 失敗(実際に送らなかったらエラーも含まれる) FALSE(0)
------------------------------------------------------------*/
BOOL CHAR_Skillupsend(int charaindex )
{
#if 1
// ストーンエイジ用に変更したもの
int point;
int fd;
if( !CHAR_CHECKINDEX(charaindex) )return FALSE;
// いくつポイントアップできるか
point = CHAR_getInt( charaindex, CHAR_SKILLUPPOINT );
fd = getfdFromCharaIndex(charaindex);
lssproto_SKUP_send(fd, point );
return TRUE;
#else
char sendbuf[128];
// こちらはLS2時のもの
if(SKILL_getUpableSkillID(charaindex,sendbuf,sizeof(sendbuf))){
int fd;
fd = getfdFromCharaIndex(charaindex);
if( fd != -1 && sendbuf[0] != '\0' ){
lssproto_SKUP_send(fd,sendbuf);
return TRUE;
}
}
#endif
return FALSE;
}
/*------------------------------------------------------------
* スキルアップする
* 引数
* charaindex int キャラインデックス
* skillid int スキルID
* 返り値
* なし
------------------------------------------------------------*/
void CHAR_SkillUp( int charaindex, int skillid )
{
if( !CHAR_CHECKINDEX(charaindex) )return;
/*死んでいたらできない */
if( CHAR_getFlg(charaindex,CHAR_ISDIE) )return;
{
int SkUpTbl[] = { CHAR_VITAL, CHAR_STR, CHAR_TOUGH, CHAR_DEX };
int SendTbl[] = { CHAR_P_STRING_VITAL|CHAR_P_STRING_MAXHP|CHAR_P_STRING_DEF,
CHAR_P_STRING_STR|CHAR_P_STRING_MAXHP|CHAR_P_STRING_ATK,
CHAR_P_STRING_TOUGH|CHAR_P_STRING_MAXHP|CHAR_P_STRING_DEF,
CHAR_P_STRING_DEX|CHAR_P_STRING_MAXHP|CHAR_P_STRING_ATK|CHAR_P_STRING_QUICK
};
int cnt;
// 範囲チェック
if( skillid < 0 || skillid >= 4 ){
return;
}
// まだパラメータアップできるか?
cnt = CHAR_getInt(charaindex,CHAR_SKILLUPPOINT);
if( cnt <= 0 )return;
#ifdef _CHAR_PROFESSION // WON ADD 人物职业栏位
{
int p_class = CHAR_getInt( charaindex, PROFESSION_CLASS );
int fd=-1;
switch( p_class ){
case PROFESSION_CLASS_FIGHTER:
// 勇士锁敏200
if( SkUpTbl[skillid] == CHAR_DEX ){
if( CHAR_getInt( charaindex, SkUpTbl[skillid] ) >= 200 * 100 ){
CHAR_talkToCli(charaindex, -1, "你的能力值已达上限", CHAR_COLORYELLOW );
fd = getfdFromCharaIndex(charaindex);
if( fd != -1 ) lssproto_SKUP_send( fd, cnt );
return;
}
}
break;
case PROFESSION_CLASS_WIZARD:
// 巫师锁攻200
if( SkUpTbl[skillid] == CHAR_STR ){
if( CHAR_getInt( charaindex, SkUpTbl[skillid] ) >= 200 * 100 ){
CHAR_talkToCli(charaindex, -1, "你的能力值已达上限", CHAR_COLORYELLOW );
fd = getfdFromCharaIndex(charaindex);
if( fd != -1 ) lssproto_SKUP_send( fd, cnt );
return;
}
}
// 巫师锁防200
if( SkUpTbl[skillid] == CHAR_TOUGH ){
if( CHAR_getInt( charaindex, SkUpTbl[skillid] ) >= 200 * 100 ){
CHAR_talkToCli(charaindex, -1, "你的能力值已达上限", CHAR_COLORYELLOW );
fd = getfdFromCharaIndex(charaindex);
if( fd != -1 ) lssproto_SKUP_send( fd, cnt );
return;
}
}
break;
case PROFESSION_CLASS_HUNTER:
// 猎人锁攻200
if( SkUpTbl[skillid] == CHAR_STR ){
if( CHAR_getInt( charaindex, SkUpTbl[skillid] ) >= 200 * 100 ){
CHAR_talkToCli(charaindex, -1, "你的能力值已达上限", CHAR_COLORYELLOW );
fd = getfdFromCharaIndex(charaindex);
if( fd != -1 ) lssproto_SKUP_send( fd, cnt );
return;
}
}
// 猎人锁防200
if( SkUpTbl[skillid] == CHAR_TOUGH ){
if( CHAR_getInt( charaindex, SkUpTbl[skillid] ) >= 200 * 100 ){
CHAR_talkToCli(charaindex, -1, "你的能力值已达上限", CHAR_COLORYELLOW );
fd = getfdFromCharaIndex(charaindex);
if( fd != -1 ) lssproto_SKUP_send( fd, cnt );
return;
}
}
// 猎人锁敏400
if( SkUpTbl[skillid] == CHAR_DEX ){
if( CHAR_getInt( charaindex, SkUpTbl[skillid] ) >= 400 * 100 ){
CHAR_talkToCli(charaindex, -1, "你的能力值已达上限", CHAR_COLORYELLOW );
fd = getfdFromCharaIndex(charaindex);
if( fd != -1 ) lssproto_SKUP_send( fd, cnt );
return;
}
}
break;
default: break;
}
fd = getfdFromCharaIndex(charaindex);
if( fd != -1 ) lssproto_SKUP_send( fd, cnt-1 );
}
#endif
CHAR_setInt( charaindex,CHAR_SKILLUPPOINT,cnt-1);
CHAR_setInt( charaindex, SkUpTbl[skillid], CHAR_getInt( charaindex, SkUpTbl[skillid] ) + 1*100 );
CHAR_complianceParameter(charaindex);
CHAR_send_P_StatusString( charaindex, SendTbl[skillid]);
#ifdef _ANGEL_SUMMON // 加点时检查资格
if( cnt-1 == 0 )
//selectAngel( charaindex);
selectAngel( charaindex, -1, -1 , FALSE);
#endif
}
CHAR_PartyUpdate( charaindex, CHAR_N_STRING_MAXHP );
}
INLINE void CHAR_getDXDY( int dir , int* dx, int* dy )
{
static POINT CHAR_dxdy[8]=
{
{ 0,-1}, /* */
{ 1,-1}, /* */
{ 1, 0}, /* */
{ 1, 1}, /* */
{ 0, 1}, /* */
{-1, 1}, /* */
{-1, 0}, /* */
{-1,-1}, /* */
};
VALIDATEDIR(dir);
if( dx )*dx = CHAR_dxdy[dir].x;
if( dy )*dy = CHAR_dxdy[dir].y;
}
INLINE int CHAR_getDX( int dir )
{
int tmp;
CHAR_getDXDY( dir,&tmp,NULL);
return tmp;
}
INLINE int CHAR_getDY( int dir )
{
int tmp;
CHAR_getDXDY( dir,NULL,&tmp);
return tmp;
}
/*------------------------------------------------------------
* 同じマスのキャラクターを得る。
* 引数
* objbuf int* object 配列での index を代入する
* バッファ
* siz int objbuf の サイズ
* ff int フロア
* fx int x
* fy int y
* 返り値
* 何個キャラがいるか。
------------------------------------------------------------*/
int CHAR_getSameCoordinateObjects(int* objbuf, int siz,int ff, int fx, int fy)
{
OBJECT object;
int findobjnum=0;
for( object = MAP_getTopObj(ff,fx,fy) ; object ;
object = NEXT_OBJECT(object ) ){
int objindex = GET_OBJINDEX(object);
if( siz <= findobjnum )break;
if( OBJECT_getType(objindex) != OBJTYPE_NOUSE )
objbuf[findobjnum++] = objindex;
}
return findobjnum;
}
/*====================キャラの情報を得る系の関数====================*/
/*オプションデータの文字列を保存する関数*/
static char CHAR_optiondataString[STRINGBUFSIZ];
/*------------------------------------------------------------
* オプション用の文字列を作る。
* level, showstring , 魂の数 , 画像番号、 何回ログインしたか。
* クラス。
* 引数
* ch Char* キャラデータ
* 返り値
* char* static な領域を返すので次回の呼び出しの時には内容が
* 変更されている。引数をそのまま保存しない事。
------------------------------------------------------------*/
char* CHAR_makeOptionString( Char* ch )
{
char escapeshowstring[256];
char *showstr = MAP_getfloorShowstring(ch->data[CHAR_FLOOR]);
if( ! showstr ){
CHAR_optiondataString[0] = '\0';
return CHAR_optiondataString;
} else {
#if 0 /* 以下はLS2仕様である */
snprintf( CHAR_optiondataString,
sizeof( CHAR_optiondataString ),
"%d|%s|1|%d|%d",
ch->data[CHAR_LV],
makeEscapeString( showstr ,
escapeshowstring,sizeof(escapeshowstring) ),
ch->data[CHAR_BASEIMAGENUMBER],
ch->data[CHAR_LOGINCOUNT]);
#endif
/* 以下はStoneAge 仕様である。
dataplace|faceimg|level|hp|str|def|dex|charm|dp|earth|water|fire|wind|login|Name|Place
となる。
*/
{
snprintf( CHAR_optiondataString,
sizeof( CHAR_optiondataString ),
"%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%s|%s",
ch->data[CHAR_DATAPLACENUMBER],
ch->data[CHAR_FACEIMAGENUMBER],
ch->data[CHAR_LV],
ch->workint[CHAR_WORKMAXHP],
ch->workint[CHAR_WORKATTACKPOWER],
ch->workint[CHAR_WORKDEFENCEPOWER],
ch->workint[CHAR_WORKQUICK],
ch->workint[CHAR_WORKFIXCHARM],
ch->data[CHAR_DUELPOINT], /* dp, FIXME */
ch->workint[CHAR_WORKFIXEARTHAT],
ch->workint[CHAR_WORKFIXWATERAT],
ch->workint[CHAR_WORKFIXFIREAT],
ch->workint[CHAR_WORKFIXWINDAT],
ch->data[CHAR_LOGINCOUNT],
ch->string[CHAR_NAME].string,
makeEscapeString( showstr ,
escapeshowstring,
sizeof(escapeshowstring) )
);
}
}
return CHAR_optiondataString;
}
static char CHAR_statusSendBuffer[STRINGBUFSIZ];
char* CHAR_makeStatusString( int index, char* category )
{
char c = tolower( category[0] );
int strlength=0;
if( !CHAR_CHECKINDEX( index ) ) return "\0";
if( category == "\0" ){
CHAR_statusSendBuffer[0] = '\0';
return CHAR_statusSendBuffer;
}
switch( c ){
case 'p':
{
int i;
int getCharDataArray[]= {
CHAR_NAME,
CHAR_OWNTITLE,
//CHAR_FMNAME,
};
int exp = CHAR_getInt(index,CHAR_EXP );
int maxexp = CHAR_GetLevelExp( index, CHAR_getInt( index, CHAR_LV ) + 1);
int attr[4];
for( i = 0; i < 4; i ++ ) {
attr[i] = CHAR_getWorkInt( index, CHAR_WORKFIXEARTHAT + i);
if( attr[i] < 0 ) attr[i] = 0;
}
int mytrans = CHAR_getInt( index, CHAR_TRANSMIGRATION);
//if(mytrans > 6) mytrans = 0;
snprintf(CHAR_statusSendBuffer,sizeof(CHAR_statusSendBuffer),
"P1|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|",
CHAR_getInt(index,CHAR_HP),
CHAR_getWorkInt(index,CHAR_WORKMAXHP),
CHAR_getInt(index,CHAR_MP),
CHAR_getWorkInt(index,CHAR_WORKMAXMP),
CHAR_getInt(index,CHAR_VITAL)/100,
CHAR_getInt(index,CHAR_STR)/100,
CHAR_getInt(index,CHAR_TOUGH)/100,
CHAR_getInt(index,CHAR_DEX)/100,
exp, maxexp,
CHAR_getInt(index,CHAR_LV),
CHAR_getWorkInt(index,CHAR_WORKATTACKPOWER),
CHAR_getWorkInt(index,CHAR_WORKDEFENCEPOWER),
CHAR_getWorkInt( index, CHAR_WORKQUICK),
CHAR_getWorkInt( index, CHAR_WORKFIXCHARM),
CHAR_getWorkInt( index, CHAR_WORKFIXLUCK),
attr[0],
attr[1],
attr[2],
attr[3],
CHAR_getInt(index,CHAR_GOLD),
CHAR_getInt(index,CHAR_INDEXOFEQTITLE),
CHAR_getInt(index,CHAR_DUELPOINT),
mytrans,
CHAR_getInt(index,CHAR_RIDEPET),
CHAR_getInt(index,CHAR_LEARNRIDE),
CHAR_getInt(index,CHAR_BASEBASEIMAGENUMBER)
#ifdef _NEW_RIDEPETS
,CHAR_getInt( index, CHAR_LOWRIDEPETS)
#endif
);
strlength = strlen( CHAR_statusSendBuffer );
for( i = 0 ; i < arraysizeof( getCharDataArray ) ; i ++ ){
char token[256];
char escapebuffer[128];
snprintf( token,
sizeof( token ),
"%s" STATUSSENDDELIMITER,
makeEscapeString( CHAR_getChar(index, getCharDataArray[i]),
escapebuffer,sizeof(escapebuffer)
));
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof( CHAR_statusSendBuffer ) - strlength,
token );
strlength += strlen( token );
if( strlength >= sizeof( CHAR_statusSendBuffer ) )
return CHAR_statusSendBuffer;
}
return CHAR_statusSendBuffer;
break;
}
#ifdef _NEW_RIDEPETS
case 'x':
{
snprintf(CHAR_statusSendBuffer,sizeof(CHAR_statusSendBuffer), "X0|%d",
CHAR_getInt( index, CHAR_LOWRIDEPETS));
return CHAR_statusSendBuffer;
break;
}
#endif
case 'f':
{
int big4fm =0;
#ifndef _NEW_RIDEPETS
switch( CHAR_getWorkInt( index, CHAR_WORKFMFLOOR) )
{
case 1041:
big4fm = 1;
break;
case 2031:
big4fm = 2;
break;
case 3031:
big4fm = 3;
break;
case 4031:
big4fm = 4;
break;
default:
big4fm = 0;
}
#endif
#ifdef _FIX_FMNAME_RULE // WON ADD 家族未成立,不显示名称
if( CHAR_getWorkInt(index, CHAR_WORKFMSETUPFLAG)==1 ){
snprintf( CHAR_statusSendBuffer,
sizeof( CHAR_statusSendBuffer ),
"F%s|%d|%d|%d|%d",
"(待审)",
CHAR_getInt( index, CHAR_FMLEADERFLAG),
CHAR_getWorkInt( index, CHAR_WORKFMCHANNEL),
CHAR_getInt( index, CHAR_FMSPRITE), big4fm );
}else
#endif
snprintf( CHAR_statusSendBuffer,
sizeof( CHAR_statusSendBuffer ),
"F%s|%d|%d|%d|%d",
CHAR_getChar( index, CHAR_FMNAME),
CHAR_getInt( index, CHAR_FMLEADERFLAG),
CHAR_getWorkInt( index, CHAR_WORKFMCHANNEL),
CHAR_getInt( index, CHAR_FMSPRITE), big4fm );
return CHAR_statusSendBuffer;
break;
}
case 'c':
{
int floor,xsiz,ysiz;
floor = CHAR_getInt(index,CHAR_FLOOR);
xsiz = MAP_getfloorX(floor);
ysiz = MAP_getfloorY(floor);
snprintf( CHAR_statusSendBuffer,
sizeof( CHAR_statusSendBuffer ),
"C%d|%d|%d|%d|%d",
CHAR_getInt(index,CHAR_FLOOR),
xsiz, ysiz,
CHAR_getInt(index,CHAR_X),
CHAR_getInt(index,CHAR_Y) );
return CHAR_statusSendBuffer;
break;
}
case 'i':
{
int i;
CHAR_statusSendBuffer[0] = 'I';
strlength = 1;
for( i = 0 ; i < CHAR_MAXITEMHAVE ; i ++ ){
char token[512];
int itemindex;
itemindex = CHAR_getItemIndex( index, i );
if( itemindex >= 0 ) {
int itemtime = 0;
itemtime = ITEM_getInt(itemindex,ITEM_TIME);
if(itemtime>0){
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
timep = mktime(p);
if(itemtime<=timep){
char itemname[128];
sprintf(itemname,"您的道具:%s由于时效已到系统已收回。",ITEM_getChar(itemindex,ITEM_NAME));
CHAR_talkToCli( index, -1, itemname, CHAR_COLORYELLOW );
CHAR_setItemIndex( index, i ,-1);
itemindex = -1;
}
}
// char itembuf[512];
// sprintf(itembuf,"%s",ITEM_getChar(itemindex,ITEM_EFFECTSTRING));
// if(strstr(itembuf,"有效期")!=NULL){
// char itemtempbuf[64];
// int year=3000,mon=13,date=32,hour=25,min=70,sec=70;
// if(getStringFromIndexWithDelim(itembuf," ", 1, itemtempbuf, sizeof(itemtempbuf)) != FALSE){
// char itemtempbuf2[64];
// char itemtempbuf3[64];
// char itemtempbuf4[32];
// if(getStringFromIndexWithDelim(itemtempbuf,"/", 1, itemtempbuf2, sizeof(itemtempbuf2)) != FALSE){
// if(getStringFromIndexWithDelim(itemtempbuf2,":", 2, itemtempbuf3, sizeof(itemtempbuf3)) != FALSE){
// if(getStringFromIndexWithDelim(itemtempbuf3,".", 1, itemtempbuf4, sizeof(itemtempbuf4)) != FALSE)
// year = atoi(itemtempbuf4);
// if(getStringFromIndexWithDelim(itemtempbuf3,".", 2, itemtempbuf4, sizeof(itemtempbuf4)) != FALSE)
// mon = atoi(itemtempbuf4);
// if(getStringFromIndexWithDelim(itemtempbuf3,".", 3, itemtempbuf4, sizeof(itemtempbuf4)) != FALSE)
// date = atoi(itemtempbuf4);
// }
// }
// if(getStringFromIndexWithDelim(itemtempbuf,"/", 2, itemtempbuf2, sizeof(itemtempbuf2)) != FALSE){
// if(getStringFromIndexWithDelim(itemtempbuf2,":", 1, itemtempbuf3, sizeof(itemtempbuf3)) != FALSE)
// hour = atoi(itemtempbuf3);
// if(getStringFromIndexWithDelim(itemtempbuf2,":", 2, itemtempbuf3, sizeof(itemtempbuf3)) != FALSE)
// min = atoi(itemtempbuf3);
// if(getStringFromIndexWithDelim(itemtempbuf2,":", 3, itemtempbuf3, sizeof(itemtempbuf3)) != FALSE)
// sec = atoi(itemtempbuf3);
// }
// time_t timep;
// struct tm *p;
// time(&timep);
// p=localtime(&timep);
// int itemtype = 0;
// if(year<(1900+p->tm_year))
// itemtype = 1;
// else if(year==(1900+p->tm_year)){
// if(mon<(1+p->tm_mon))
// itemtype = 1;
// else if(mon==(1+p->tm_mon)){
// if(date<(p->tm_mday))
// itemtype = 1;
// else if(date==(p->tm_mday)){
// if(hour<(p->tm_hour))
// itemtype = 1;
// else if(hour==(p->tm_hour)){
// if(min<(p->tm_min))
// itemtype = 1;
// else if(min==(p->tm_min)){
// if(sec<(p->tm_sec))
// itemtype = 1;
// }
// }
// }
// }
// }
// if(itemtype>0){
// CHAR_setItemIndex( index, i ,-1);
// itemindex = -1;
// //CHAR_sendItemDataOne( charaindex, i);
// //ITEM_endExistItemsOne(itemindex);
// }
// }
// }
}
if( itemindex >= 0 ) {
snprintf( token ,sizeof(token),"%s|" ,ITEM_makeItemStatusString( -1, itemindex ) );
}else {
snprintf( token ,sizeof(token),"%s|" , ITEM_makeItemFalseString() );
}
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof(CHAR_statusSendBuffer) - strlength, token );
strlength += strlen( token );
if( strlength >= arraysizeof(CHAR_statusSendBuffer) ) return CHAR_statusSendBuffer;
}
dchop( CHAR_statusSendBuffer , "|" );
return CHAR_statusSendBuffer;
break;
}
case 's':
{
int i;
CHAR_statusSendBuffer[0] = 'S';
strlength = 1;
for( i = 0 ; i < CHAR_SKILLMAXHAVE ; i ++ ){
char token[256];
CHAR_HaveSkill* hskill;
hskill = CHAR_getCharHaveSkill( index, i );
if( hskill != NULL && hskill->use == TRUE ){
#ifdef _CHAR_PROFESSION // WON ADD 人物职业
snprintf( token , sizeof(token), "%s|", SKILL_makeSkillStatusString(&hskill->skill, index, i) );
#else
snprintf( token , sizeof(token), "%s|", SKILL_makeSkillStatusString(&hskill->skill) );
#endif
}else{
snprintf( token , sizeof(token), "%s|", SKILL_makeSkillFalseString() );
}
strcpysafe( CHAR_statusSendBuffer + strlength, sizeof(CHAR_statusSendBuffer)-strlength, token );
strlength += strlen( token );
if( strlength >= arraysizeof(CHAR_statusSendBuffer) )
return CHAR_statusSendBuffer;
}
dchop( CHAR_statusSendBuffer , "|" );
return CHAR_statusSendBuffer;
break;
}
case 't':
{
int i;
CHAR_statusSendBuffer[0] = 'T';
strlength = 1;
for( i = 0 ; i < CHAR_TITLEMAXHAVE ; i ++ ){
char token[256];
char escape[256];
snprintf( token , sizeof(token), "%s|" ,
makeEscapeString( TITLE_makeTitleStatusString(index,
i ),
escape,sizeof(escape) ) );
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof(CHAR_statusSendBuffer) - strlength,
token );
strlength += strlen( token );
if( strlength >= arraysizeof(CHAR_statusSendBuffer) )
return CHAR_statusSendBuffer;
}
dchop( CHAR_statusSendBuffer , "|" );
return CHAR_statusSendBuffer;
break;
}
case 'd':
snprintf( CHAR_statusSendBuffer,sizeof(CHAR_statusSendBuffer),
"D%d|%ld",CHAR_getWorkInt(index,CHAR_WORKOBJINDEX),
NowTime.tv_sec );
return CHAR_statusSendBuffer;
break;
case 'm':
snprintf( CHAR_statusSendBuffer,sizeof(CHAR_statusSendBuffer),
"M%d|%d|%d",
CHAR_getInt( index,CHAR_HP ),
CHAR_getInt( index,CHAR_MP ),
CHAR_getInt( index,CHAR_EXP ) );
return CHAR_statusSendBuffer;
break;
case 'e':
return "\0";
case 'n':
{
int num;
int i, nindex = -1;
int getCharDataArray[]= {
CHAR_NAME
};
num = tolower( category[1] ) - '0';
if( num < 0 || num >= CHAR_PARTYMAX ){
print( "朋友模式失败 (%c)%d \n", num, num );
break;
}
nindex = CHAR_getPartyIndex( index, num);
if( nindex == -1 ){
snprintf(CHAR_statusSendBuffer,sizeof(CHAR_statusSendBuffer),
"N%d|0|", num );
return CHAR_statusSendBuffer;
}else{
snprintf(CHAR_statusSendBuffer,sizeof(CHAR_statusSendBuffer),
"N%d|1|%d|%d|%d|%d|%d|",
num,
CHAR_getWorkInt( nindex, CHAR_WORKOBJINDEX),
CHAR_getInt( nindex, CHAR_LV),
CHAR_getWorkInt( nindex, CHAR_WORKMAXHP),
CHAR_getInt( nindex, CHAR_HP),
CHAR_getInt( nindex, CHAR_MP)
);
}
strlength = strlen( CHAR_statusSendBuffer );
for( i = 0 ; i < arraysizeof( getCharDataArray ) ; i ++ ){
char token[256];
char escapebuffer[128];
snprintf( token,
sizeof( token ),
"%s" STATUSSENDDELIMITER,
makeEscapeString( CHAR_getChar(nindex,
getCharDataArray[i]),
escapebuffer,sizeof(escapebuffer)
));
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof( CHAR_statusSendBuffer ) - strlength,
token );
strlength += strlen( token );
if( strlength >= sizeof( CHAR_statusSendBuffer ) )
return CHAR_statusSendBuffer;
}
return CHAR_statusSendBuffer;
break;
}
case 'k':
{
int num;
int i, pindex;
int getCharDataArray[]= {
CHAR_NAME,
CHAR_USERPETNAME,
};
num = tolower( category[1] ) - '0';
if( num < 0 || num >= CHAR_MAXPETHAVE ){
print( "宠物模式失败 (%c)%d \n", num, num );
break;
}
pindex = CHAR_getCharPet( index, num );
if( pindex == -1 ){
snprintf(CHAR_statusSendBuffer,sizeof(CHAR_statusSendBuffer),
"K%d|0|", num );
return CHAR_statusSendBuffer;
}else{
int attr[4];
BOOL changenameflg = FALSE;
char *mycdkey;
char *cdkey = NULL;
for( i = 0; i < 4; i ++ ) {
attr[i] = CHAR_getWorkInt( pindex, CHAR_WORKFIXEARTHAT + i);
if( attr[i] < 0 ) attr[i] = 0;
}
mycdkey = CHAR_getChar( index, CHAR_CDKEY);
{
cdkey = CHAR_getChar( pindex, CHAR_CDKEY);
if( cdkey == "\0" ) {
print( "can't get CDKEY\n");
}else {
if( strlen( cdkey) == 0 ||
strcmp( cdkey, mycdkey) == 0 ){
changenameflg = TRUE;
}
}
}
snprintf(CHAR_statusSendBuffer,sizeof(CHAR_statusSendBuffer),
// Syu ADD 改变交易时宠物转生颜色
#ifdef _SHOW_FUSION
"K%d|1|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|",
#else
"K%d|1|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|",
#endif
num,
CHAR_getInt(pindex,CHAR_BASEIMAGENUMBER),
CHAR_getInt(pindex,CHAR_HP),
CHAR_getWorkInt(pindex,CHAR_WORKMAXHP),
CHAR_getInt(pindex,CHAR_MP),
CHAR_getWorkInt(pindex,CHAR_WORKMAXMP),
CHAR_getInt(pindex,CHAR_EXP ),
CHAR_GetLevelExp( pindex,CHAR_getInt( pindex, CHAR_LV ) + 1),
CHAR_getInt(pindex,CHAR_LV),
CHAR_getWorkInt(pindex, CHAR_WORKATTACKPOWER),
CHAR_getWorkInt(pindex, CHAR_WORKDEFENCEPOWER),
CHAR_getWorkInt( pindex, CHAR_WORKQUICK),
CHAR_getWorkInt( pindex, CHAR_WORKFIXAI),
attr[0],
attr[1],
attr[2],
attr[3],
CHAR_getInt( pindex, CHAR_SLOT),
// Syu ADD 改变交易时宠物转生颜色
changenameflg,
CHAR_getInt( pindex,CHAR_TRANSMIGRATION)
#ifdef _SHOW_FUSION
,CHAR_getInt ( pindex, CHAR_FUSIONBEIT)
#endif
);
}
strlength = strlen( CHAR_statusSendBuffer );
for( i = 0 ; i < arraysizeof( getCharDataArray ) ; i ++ ){
char token[256];
char escapebuffer[128];
snprintf( token,
sizeof( token ),
"%s" STATUSSENDDELIMITER,
makeEscapeString( CHAR_getChar(pindex,
getCharDataArray[i]),
escapebuffer,sizeof(escapebuffer)
));
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof( CHAR_statusSendBuffer ) - strlength,
token );
strlength += strlen( token );
if( strlength >= sizeof( CHAR_statusSendBuffer ) )
return CHAR_statusSendBuffer;
}
return CHAR_statusSendBuffer;
break;
}
case 'j':
{
int num;
int i, itemindex;
int getMagicDataArray[]= {
MAGIC_NAME,
MAGIC_COMMENT,
};
num = tolower( category[1] ) - '0';
if( num < 0 || num >= CHAR_EQUIPPLACENUM ){
break;
}
itemindex = CHAR_getItemIndex( index, num );
if( !ITEM_CHECKINDEX( itemindex) ) {
snprintf(CHAR_statusSendBuffer,sizeof(CHAR_statusSendBuffer),
"J%d|0|", num );
return CHAR_statusSendBuffer;
}else{
int magicindex = MAGIC_getMagicArray( ITEM_getInt( itemindex, ITEM_MAGICID));
if( magicindex == -1 ) {
snprintf(CHAR_statusSendBuffer,sizeof(CHAR_statusSendBuffer),
"J%d|0|", num );
return CHAR_statusSendBuffer;
}
int magicmp = ITEM_getInt( itemindex, ITEM_MAGICUSEMP);
if(CHAR_getInt(index,CHAR_LV)<100 && CHAR_getInt(index,CHAR_TRANSMIGRATION)<1){ //CF中指定精灵在0转100级之前不费气
char magictmpbuf[32];
sprintf(magictmpbuf,",%d,",ITEM_getInt( itemindex, ITEM_MAGICID));
if(strstr(getNoMpMagic(),magictmpbuf)!=NULL){
magicmp = 0;
}
}
snprintf(CHAR_statusSendBuffer,sizeof(CHAR_statusSendBuffer),
"J%d|1|%d|%d|%d|",
num,
magicmp,
MAGIC_getInt( magicindex, MAGIC_FIELD),
MAGIC_getInt( magicindex, MAGIC_TARGET));
strlength = strlen( CHAR_statusSendBuffer );
for( i = 0 ; i < arraysizeof( getMagicDataArray ) ; i ++ ){
char token[256];
char escapebuffer[128];
snprintf( token,
sizeof( token ),
"%s" STATUSSENDDELIMITER,
makeEscapeString( MAGIC_getChar(magicindex,
getMagicDataArray[i]),
escapebuffer,sizeof(escapebuffer)
));
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof( CHAR_statusSendBuffer ) - strlength,
token );
strlength += strlen( token );
if( strlength >= sizeof( CHAR_statusSendBuffer ) )
return CHAR_statusSendBuffer;
}
return CHAR_statusSendBuffer;
}
}
break;
case 'w':
{
int num;
int i,petskillloop, pindex;
char tmp[16];
int getPetSkillDataArray[]= {
PETSKILL_NAME,
PETSKILL_COMMENT,
};
num = tolower( category[1] ) - '0';
if( num < 0 || num >= CHAR_MAXPETHAVE ){
print( "宠物特技资料失败 (%c)%d \n", num, num );
break;
}
pindex = CHAR_getCharPet( index, num );
if( !CHAR_CHECKINDEX(pindex)){
return "\0";
}
snprintf( tmp, sizeof( tmp), "W%d|", num);
strcpysafe( CHAR_statusSendBuffer, sizeof( CHAR_statusSendBuffer),
tmp);
strlength += strlen( tmp);
if( strlength >= arraysizeof( CHAR_statusSendBuffer) ) {
return CHAR_statusSendBuffer;
}
for( petskillloop = 0; petskillloop < CHAR_MAXPETSKILLHAVE; petskillloop ++ ) {
int skillid = CHAR_getPetSkill( pindex, petskillloop);
int petskillindex = PETSKILL_getPetskillArray( skillid );
if( PETSKILL_CHECKINDEX( petskillindex) ) {
char token[256];
snprintf( token, sizeof( token),
"%d|%d|%d|",
PETSKILL_getInt( petskillindex, PETSKILL_ID),
PETSKILL_getInt( petskillindex, PETSKILL_FIELD),
PETSKILL_getInt( petskillindex, PETSKILL_TARGET)
);
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof(CHAR_statusSendBuffer) - strlength,
token );
strlength += strlen( token );
if( strlength >= arraysizeof(CHAR_statusSendBuffer)) {
return CHAR_statusSendBuffer;
}
for( i = 0 ; i < arraysizeof( getPetSkillDataArray ) ; i ++ ){
char escapebuffer[128];
snprintf( token,
sizeof( token ),
"%s" STATUSSENDDELIMITER,
makeEscapeString(
PETSKILL_getChar(petskillindex,
getPetSkillDataArray[i]),
escapebuffer,sizeof(escapebuffer)
));
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof( CHAR_statusSendBuffer ) - strlength,
token );
strlength += strlen( token );
if( strlength >= sizeof( CHAR_statusSendBuffer )) {
return CHAR_statusSendBuffer;
}
}
}
else {
char token[256];
snprintf( token, sizeof( token),"|||||");
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof(CHAR_statusSendBuffer) - strlength,
token );
strlength += strlen( token );
if( strlength >= arraysizeof(CHAR_statusSendBuffer) ) {
return CHAR_statusSendBuffer;
}
}
}
return CHAR_statusSendBuffer;
}
#ifdef _PROFESSION_SKILL // WON ADD 人物职业技能
case 'y':
{
int num = 0, f_num = 0;
int i,petskillloop, pindex;
char tmp[16];
int getPetSkillDataArray[]= {
PETSKILL_NAME,
PETSKILL_COMMENT,
};
num = tolower( category[1] ) - '0';
if( num < 0 || num >= CHAR_MAXPETHAVE ){
print( "宠物特技资料失败 (%c)%d \n", num, num );
break;
}
pindex = CHAR_getCharPet( index, num );
if( !CHAR_CHECKINDEX(pindex)){
return "\0";
}
snprintf( tmp, sizeof( tmp), "W%d|", num);
strcpysafe( CHAR_statusSendBuffer, sizeof( CHAR_statusSendBuffer),
tmp);
strlength += strlen( tmp);
if( strlength >= arraysizeof( CHAR_statusSendBuffer) ) {
return CHAR_statusSendBuffer;
}
if( CHAR_getWorkInt( pindex, CHAR_WORKOBLIVION) > 0 )
f_num = CHAR_getWorkInt( pindex, CHAR_WORKMODOBLIVION ) + 1;// 遗忘宠技数量
for( petskillloop = 0; petskillloop < CHAR_MAXPETSKILLHAVE; petskillloop ++ ) {
int skillid = CHAR_getPetSkill( pindex, petskillloop);
int petskillindex = PETSKILL_getPetskillArray( skillid );
if( PETSKILL_CHECKINDEX( petskillindex) ) {
char token[256];
int field = -1, target = -1;
int oblivion = CHAR_getWorkInt( pindex, CHAR_WORKOBLIVION );
int p_id = PETSKILL_getInt( petskillindex, PETSKILL_ID);
int rand_num = RAND( 0, 100 );
// 中了遗忘
if( (oblivion > 0) && ( f_num > 0 ) && ( rand_num <= 60 ) && ( p_id != 1 ) ){
field = PETSKILL_FIELD_MAP;
target = PETSKILL_TARGET_NONE;
f_num --;
}else{
field = PETSKILL_getInt( petskillindex, PETSKILL_FIELD);
target = PETSKILL_getInt( petskillindex, PETSKILL_TARGET);
}
snprintf( token, sizeof( token),"%d|%d|%d|",
// PETSKILL_getInt( petskillindex, PETSKILL_ID),
p_id,
field, target
);
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof(CHAR_statusSendBuffer) - strlength,
token );
strlength += strlen( token );
if( strlength >= arraysizeof(CHAR_statusSendBuffer)) {
return CHAR_statusSendBuffer;
}
for( i = 0 ; i < arraysizeof( getPetSkillDataArray ) ; i ++ ){
char escapebuffer[128];
snprintf( token,
sizeof( token ),
"%s" STATUSSENDDELIMITER,
makeEscapeString(
PETSKILL_getChar(petskillindex,
getPetSkillDataArray[i]),
escapebuffer,sizeof(escapebuffer)
));
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof( CHAR_statusSendBuffer ) - strlength,
token );
strlength += strlen( token );
if( strlength >= sizeof( CHAR_statusSendBuffer )) {
return CHAR_statusSendBuffer;
}
}
}
else {
char token[256];
snprintf( token, sizeof( token),"|||||");
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof(CHAR_statusSendBuffer) - strlength,
token );
strlength += strlen( token );
if( strlength >= arraysizeof(CHAR_statusSendBuffer) ) {
return CHAR_statusSendBuffer;
}
}
}
return CHAR_statusSendBuffer;
}
#endif
#ifdef _PETSKILL_DAMAGETOHP
//宠物战斗中发送技能封包
case 'o':
{
int getPetSkillDataArray[]= {
PETSKILL_NAME,
PETSKILL_COMMENT,
};
int i,petskillloop, pindex=index;
int num = 0;//, f_num = 0;
char tmp[16];
num = tolower( category[1] ) - '0';
if( num < 0 || num >= CHAR_MAXPETHAVE ){
print( "宠物特技资料失败 (%c)%d \n", num, num );
break;
}
pindex = CHAR_getCharPet( index, num );
if( !CHAR_CHECKINDEX(pindex)){
return "\0";
}
#ifdef _WAN_FIX
if(CHAR_getWorkInt(index,CHAR_WORKBATTLEINDEX)>-1){
return "\0";
}
#endif
snprintf( tmp, sizeof( tmp), "W%d|", num);
strcpysafe( CHAR_statusSendBuffer, sizeof( CHAR_statusSendBuffer),
tmp);
strlength += strlen( tmp);
if( strlength >= arraysizeof( CHAR_statusSendBuffer) ) {
return CHAR_statusSendBuffer;
}
for( petskillloop = 0; petskillloop < CHAR_MAXPETSKILLHAVE; petskillloop ++ ) {
int skillid = CHAR_getPetSkill( pindex, petskillloop);
int petskillindex = PETSKILL_getPetskillArray( skillid );
if( PETSKILL_CHECKINDEX( petskillindex) ) {
char token[256];
int field = -1, target = -1;
//int oblivion = CHAR_getWorkInt( pindex, CHAR_WORKOBLIVION );
int p_id = PETSKILL_getInt( petskillindex, PETSKILL_ID);
//生命大於50%且技能名称若为 浴血狂袭 技能不能选
if( ( CHAR_getInt( pindex, CHAR_HP ) > CHAR_getWorkInt( pindex, CHAR_WORKMAXHP )*0.5
&& strcmp(PETSKILL_getChar( petskillindex, PETSKILL_NAME),"浴血狂袭" ) == 0 )
){
field = PETSKILL_FIELD_MAP;
target = PETSKILL_TARGET_NONE;
}else{
field = PETSKILL_getInt( petskillindex, PETSKILL_FIELD);
target = PETSKILL_getInt( petskillindex, PETSKILL_TARGET);
}
snprintf( token, sizeof( token),"%d|%d|%d|",
// PETSKILL_getInt( petskillindex, PETSKILL_ID),
p_id,
field, target
);
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof(CHAR_statusSendBuffer) - strlength,
token );
strlength += strlen( token );
if( strlength >= arraysizeof(CHAR_statusSendBuffer)) {
return CHAR_statusSendBuffer;
}
for( i = 0 ; i < arraysizeof( getPetSkillDataArray ) ; i ++ ){
char escapebuffer[128];
snprintf( token,
sizeof( token ),
"%s" STATUSSENDDELIMITER,
makeEscapeString(
PETSKILL_getChar(petskillindex,
getPetSkillDataArray[i]),
escapebuffer,sizeof(escapebuffer)
));
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof( CHAR_statusSendBuffer ) - strlength,
token );
strlength += strlen( token );
if( strlength >= sizeof( CHAR_statusSendBuffer )) {
return CHAR_statusSendBuffer;
}
}
}
else {
char token[256];
snprintf( token, sizeof( token),"|||||");
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof(CHAR_statusSendBuffer) - strlength,
token );
strlength += strlen( token );
if( strlength >= arraysizeof(CHAR_statusSendBuffer) ) {
return CHAR_statusSendBuffer;
}
}
}
return CHAR_statusSendBuffer;
}
#endif
#ifdef _PETSKILL_BECOMEFOX
case 'a':
{
int getPetSkillDataArray[]= {
PETSKILL_NAME,
PETSKILL_COMMENT,
};
int i,petskillloop, pindex=index;
int num = 0;//, f_num = 0;
char tmp[16];
num = tolower( category[1] ) - '0';
if( num < 0 || num >= CHAR_MAXPETHAVE ){
print( "宠物特技资料失败 (%c)%d \n", num, num );
break;
}
print( "宠物特技资料" );
pindex = CHAR_getCharPet( index, num );
if( !CHAR_CHECKINDEX(pindex)){
return "\0";
}
snprintf( tmp, sizeof( tmp), "W%d|", num);
strcpysafe( CHAR_statusSendBuffer, sizeof( CHAR_statusSendBuffer),
tmp);
strlength += strlen( tmp);
if( strlength >= arraysizeof( CHAR_statusSendBuffer) ) {
return CHAR_statusSendBuffer;
}
for( petskillloop = 0; petskillloop < CHAR_MAXPETSKILLHAVE; petskillloop ++ ) {
int skillid = CHAR_getPetSkill( pindex, petskillloop);
int petskillindex = PETSKILL_getPetskillArray( skillid );
if( PETSKILL_CHECKINDEX( petskillindex) ) {
char token[256];
int field = -1, target = -1;
//int oblivion = CHAR_getWorkInt( pindex, CHAR_WORKOBLIVION );
int p_id = PETSKILL_getInt( petskillindex, PETSKILL_ID);
//技能名称若为 待机 攻击 防御 技能才能选
print("\n技能名称:%s",PETSKILL_getChar( petskillindex, PETSKILL_NAME));
if( strcmp(PETSKILL_getChar( petskillindex, PETSKILL_NAME),"待机" ) == 0
|| strcmp(PETSKILL_getChar( petskillindex, PETSKILL_NAME),"攻击" ) == 0
|| strcmp(PETSKILL_getChar( petskillindex, PETSKILL_NAME),"防御" ) == 0){
field = PETSKILL_getInt( petskillindex, PETSKILL_FIELD);
target = PETSKILL_getInt( petskillindex, PETSKILL_TARGET);
}else{
field = PETSKILL_FIELD_MAP;
target = PETSKILL_TARGET_NONE;
}
snprintf( token, sizeof( token),"%d|%d|%d|",
// PETSKILL_getInt( petskillindex, PETSKILL_ID),
p_id,
field, target
);
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof(CHAR_statusSendBuffer) - strlength,
token );
strlength += strlen( token );
if( strlength >= arraysizeof(CHAR_statusSendBuffer)) {
return CHAR_statusSendBuffer;
}
for( i = 0 ; i < arraysizeof( getPetSkillDataArray ) ; i ++ ){
char escapebuffer[128];
snprintf( token,
sizeof( token ),
"%s" STATUSSENDDELIMITER,
makeEscapeString(
PETSKILL_getChar(petskillindex,
getPetSkillDataArray[i]),
escapebuffer,sizeof(escapebuffer)
));
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof( CHAR_statusSendBuffer ) - strlength,
token );
strlength += strlen( token );
if( strlength >= sizeof( CHAR_statusSendBuffer )) {
return CHAR_statusSendBuffer;
}
}
}
else {
char token[256];
snprintf( token, sizeof( token),"|||||");
strcpysafe( CHAR_statusSendBuffer + strlength,
sizeof(CHAR_statusSendBuffer) - strlength,
token );
strlength += strlen( token );
if( strlength >= arraysizeof(CHAR_statusSendBuffer) ) {
return CHAR_statusSendBuffer;
}
}
}
return CHAR_statusSendBuffer;
}
#endif
default:
break;
}
CHAR_statusSendBuffer[0] = '\0';
return CHAR_statusSendBuffer;
}
//BOOL CHAR_sendStatusString( int charaindex, char* category )
BOOL _CHAR_sendStatusString( int charaindex, char* category, char* file, int line )
{
char* string;
//print("\nsend_S:%s:%d ", file, line);
if( CHAR_getInt(charaindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ){
return FALSE;
}
string = CHAR_makeStatusString( charaindex, category );
if( string != "\0" ){
int fd;
fd = getfdFromCharaIndex( charaindex );
if( fd != -1 ){
lssproto_S_send( fd, string );
return TRUE;
}
}
return FALSE;
}
void CHAR_inputOwnTitle( int index ,char* name )
{
if( !CHAR_CHECKINDEX( index ) ) return;
if( CHAR_getFlg( index,CHAR_ISDIE ) )return;
CHAR_setChar( index, CHAR_OWNTITLE ,name);
CHAR_sendCToArroundCharacter( CHAR_getWorkInt( index, CHAR_WORKOBJINDEX) );
CHAR_send_P_StatusString( index, CHAR_P_STRING_OWNTITLE );
}
void CHAR_selectTitle( int index, int titleindex )
{
if( !CHAR_CHECKINDEX( index ) )return;
if( CHAR_getFlg( index,CHAR_ISDIE ) )return;
if( titleindex == -1 ){
CHAR_setInt( index, CHAR_INDEXOFEQTITLE, titleindex);
}else if( titleindex < 0 || titleindex >= CHAR_TITLEMAXHAVE ) {
return;
}
else{
int title = CHAR_getCharHaveTitle( index,titleindex );
if( TITLE_getTitleIndex( title) != -1 ){
CHAR_setInt( index, CHAR_INDEXOFEQTITLE, titleindex);
}
}
CHAR_sendStatusString( index, "T" );
CHAR_send_P_StatusString( index, CHAR_P_STRING_TITLE );
}
void CHAR_deleteTitle( int index, int titleindex )
{
int title;
if( !CHAR_CHECKINDEX( index ) )return;
/* 死んでいる時はだめ */
if( CHAR_getFlg( index,CHAR_ISDIE ) )return;
if( titleindex < 0 || titleindex >= CHAR_TITLEMAXHAVE )return;
title = CHAR_getCharHaveTitle( index,titleindex );
/*if( TITLE_CHECKTABLEINDEX( title ) == FALSE )*/
if( TITLE_getTitleIndex( title) == -1 ) {
return;
}
CHAR_setCharHaveTitle( index,titleindex,-1 );
/* 自分が使っていたやつならば、それもなしにする */
if( CHAR_getInt(index, CHAR_INDEXOFEQTITLE) == titleindex )
CHAR_setInt(index, CHAR_INDEXOFEQTITLE, -1 );
/*
*ステータス情報を送る。
*/
CHAR_sendStatusString( index, "T" );
CHAR_send_P_StatusString( index, CHAR_P_STRING_TITLE );
}
static void CHAR_initcharWorkInt( index )
{
float hp;
static struct substitutionTable{
CHAR_WORKDATAINT workindex;
CHAR_DATAINT intindex;
}subtbl[]={
{ CHAR_WORKMAXMP, CHAR_MAXMP },
{ CHAR_WORKFIXFIREAT, CHAR_FIREAT },
{ CHAR_WORKFIXWATERAT, CHAR_WATERAT},
{ CHAR_WORKFIXEARTHAT, CHAR_EARTHAT},
{ CHAR_WORKFIXWINDAT, CHAR_WINDAT },
{ CHAR_WORKFIXCHARM, CHAR_CHARM },
{ CHAR_WORKFIXLUCK, CHAR_LUCK },
{ CHAR_WORKFIXLUCK, CHAR_LUCK },
{ CHAR_WORKMODPOISON, CHAR_POISON },
{ CHAR_WORKMODPARALYSIS,CHAR_PARALYSIS },
{ CHAR_WORKMODSLEEP, CHAR_SLEEP },
{ CHAR_WORKMODSTONE, CHAR_STONE },
{ CHAR_WORKMODDRUNK, CHAR_DRUNK },
{ CHAR_WORKMODCONFUSION, CHAR_CONFUSION }
};
int i;
for( i=0 ; i<arraysizeof(subtbl) ; i++ )
CHAR_setWorkInt(index,subtbl[i].workindex, CHAR_getInt(index,subtbl[i].intindex));
CHAR_setWorkInt( index, CHAR_WORKMODWEAKEN, 0);
CHAR_setWorkInt( index, CHAR_WORKMODDEEPPOISON, 0);
CHAR_setWorkInt( index, CHAR_WORKMODBARRIER, 0);
CHAR_setWorkInt( index, CHAR_WORKMODNOCAST, 0);
for( i = 0; i < 4; i ++ ){
int attr = CHAR_getWorkInt( index, CHAR_WORKFIXEARTHAT + i);
if( attr > 0 ){
CHAR_setWorkInt( index, CHAR_WORKFIXEARTHAT + (i + 2) % 4, attr * -1);
}
}
#ifdef _MAGIC_RESIST_EQUIT // WON ADD 职业抗性装备
{
// 火冰电抗性
//for( i=0; i<3; i++)
// CHAR_setWorkInt( index, CHAR_WORK_F_RESIST+i, CHAR_getInt( index, PROFESSION_FIRE_R+i ) );
}
#endif
CHAR_setWorkInt( index, CHAR_WORKFIXDEX,
CHAR_getInt( index, CHAR_DEX) * 0.01 );
CHAR_setWorkInt( index, CHAR_WORKFIXVITAL,
CHAR_getInt( index, CHAR_VITAL) * 0.01 );
CHAR_setWorkInt( index, CHAR_WORKFIXSTR,
CHAR_getInt( index, CHAR_STR) * 0.01 * 1.0
//#ifdef _BATTLE_NEWPOWER
// + CHAR_getInt( index, CHAR_DEX) * 0.01 * 0.05
// + CHAR_getInt( index, CHAR_VITAL) * 0.01 * 0.05 ); // 耐力
//#else
+ CHAR_getInt( index, CHAR_TOUGH) * 0.01 * 0.1
+ CHAR_getInt( index, CHAR_VITAL) * 0.01 * 0.1
+ CHAR_getInt( index, CHAR_DEX) * 0.01 * 0.05 );
//#endif
CHAR_setWorkInt( index, CHAR_WORKFIXTOUGH,
CHAR_getInt( index, CHAR_TOUGH) * 0.01 * 1.0
//#ifdef _BATTLE_NEWPOWER
// + CHAR_getInt( index, CHAR_DEX) * 0.01 * 0.05
// + CHAR_getInt( index, CHAR_VITAL) * 0.01 * 0.05 ); // 力量
//#else
+ CHAR_getInt(index,CHAR_STR) * 0.01 * 0.1
+ CHAR_getInt(index,CHAR_VITAL) * 0.01 * 0.1
+ CHAR_getInt(index,CHAR_DEX) * 0.01 * 0.05 );
//#endif
#ifdef _ITEMSET5_TXT
{
CHAR_setWorkInt( index, CHAR_WORKFIXARRANGE, 0);
CHAR_setWorkInt( index, CHAR_WORKFIXSEQUENCE, 0);
CHAR_setWorkInt( index, CHAR_WORKATTACHPILE, 0);
CHAR_setWorkInt( index, CHAR_WORKHITRIGHT, 0);
}
#endif
#ifdef _ITEMSET6_TXT
{
CHAR_setWorkInt( index, CHAR_WORKNEGLECTGUARD, 0);
}
#endif
hp = ( CHAR_getInt(index,CHAR_VITAL) * 4
+ CHAR_getInt(index,CHAR_STR) * 1
+ CHAR_getInt(index,CHAR_TOUGH) * 1
+ CHAR_getInt(index,CHAR_DEX) * 1 ) * 0.01;
CHAR_setWorkInt( index, CHAR_WORKMAXHP, (int)hp );
CHAR_setWorkInt( index, CHAR_WORKMAXMP, CHAR_getInt( index, CHAR_MAXMP));
int fmfloor = CHAR_getWorkInt( index, CHAR_WORKFMFLOOR);
#ifdef _FM_WELFARE
if( fmfloor !=-1 && CHAR_getInt( index, CHAR_FMLEADERFLAG ) != FMMEMBER_NONE
&& CHAR_getInt( index, CHAR_FMLEADERFLAG ) != FMMEMBER_APPLY && CHAR_getInt( index, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER){
char* fmbuf=NULL;
char* pszP=NULL;
int fPer;
switch(fmfloor){
case 1041:
fmbuf = getFmWelfare(0);
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXSTR,CHAR_getWorkInt(index,CHAR_WORKFIXSTR)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXTOUGH,CHAR_getWorkInt(index,CHAR_WORKFIXTOUGH)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXDEX,CHAR_getWorkInt(index,CHAR_WORKFIXDEX)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKMAXHP,CHAR_getWorkInt(index,CHAR_WORKMAXHP)+fPer);
break;
}
break;
case 2031:
fmbuf = getFmWelfare(1);
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXSTR,CHAR_getWorkInt(index,CHAR_WORKFIXSTR)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXTOUGH,CHAR_getWorkInt(index,CHAR_WORKFIXTOUGH)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXDEX,CHAR_getWorkInt(index,CHAR_WORKFIXDEX)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKMAXHP,CHAR_getWorkInt(index,CHAR_WORKMAXHP)+fPer);
break;
}
break;
case 3031:
fmbuf = getFmWelfare(2);
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXSTR,CHAR_getWorkInt(index,CHAR_WORKFIXSTR)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXTOUGH,CHAR_getWorkInt(index,CHAR_WORKFIXTOUGH)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXDEX,CHAR_getWorkInt(index,CHAR_WORKFIXDEX)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKMAXHP,CHAR_getWorkInt(index,CHAR_WORKMAXHP)+fPer);
break;
}
break;
case 4031:
fmbuf = getFmWelfare(3);
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXSTR,CHAR_getWorkInt(index,CHAR_WORKFIXSTR)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXTOUGH,CHAR_getWorkInt(index,CHAR_WORKFIXTOUGH)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXDEX,CHAR_getWorkInt(index,CHAR_WORKFIXDEX)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKMAXHP,CHAR_getWorkInt(index,CHAR_WORKMAXHP)+fPer);
break;
}
break;
case 5031:
fmbuf = getFmWelfare(4);
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXSTR,CHAR_getWorkInt(index,CHAR_WORKFIXSTR)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXTOUGH,CHAR_getWorkInt(index,CHAR_WORKFIXTOUGH)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXDEX,CHAR_getWorkInt(index,CHAR_WORKFIXDEX)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKMAXHP,CHAR_getWorkInt(index,CHAR_WORKMAXHP)+fPer);
break;
}
break;
case 6031:
fmbuf = getFmWelfare(5);
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXSTR,CHAR_getWorkInt(index,CHAR_WORKFIXSTR)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXTOUGH,CHAR_getWorkInt(index,CHAR_WORKFIXTOUGH)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXDEX,CHAR_getWorkInt(index,CHAR_WORKFIXDEX)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKMAXHP,CHAR_getWorkInt(index,CHAR_WORKMAXHP)+fPer);
break;
}
break;
case 7031:
fmbuf = getFmWelfare(6);
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXSTR,CHAR_getWorkInt(index,CHAR_WORKFIXSTR)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXTOUGH,CHAR_getWorkInt(index,CHAR_WORKFIXTOUGH)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXDEX,CHAR_getWorkInt(index,CHAR_WORKFIXDEX)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKMAXHP,CHAR_getWorkInt(index,CHAR_WORKMAXHP)+fPer);
break;
}
break;
case 8031:
fmbuf = getFmWelfare(7);
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXSTR,CHAR_getWorkInt(index,CHAR_WORKFIXSTR)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXTOUGH,CHAR_getWorkInt(index,CHAR_WORKFIXTOUGH)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXDEX,CHAR_getWorkInt(index,CHAR_WORKFIXDEX)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKMAXHP,CHAR_getWorkInt(index,CHAR_WORKMAXHP)+fPer);
break;
}
break;
case 9031:
fmbuf = getFmWelfare(8);
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXSTR,CHAR_getWorkInt(index,CHAR_WORKFIXSTR)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXTOUGH,CHAR_getWorkInt(index,CHAR_WORKFIXTOUGH)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXDEX,CHAR_getWorkInt(index,CHAR_WORKFIXDEX)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKMAXHP,CHAR_getWorkInt(index,CHAR_WORKMAXHP)+fPer);
break;
}
break;
case 10031:
fmbuf = getFmWelfare(9);
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXSTR,CHAR_getWorkInt(index,CHAR_WORKFIXSTR)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXTOUGH,CHAR_getWorkInt(index,CHAR_WORKFIXTOUGH)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKFIXDEX,CHAR_getWorkInt(index,CHAR_WORKFIXDEX)+fPer);
break;
}
if( (pszP = strstr( fmbuf, "" ) ) != NULL ){
sscanf( pszP+2, "%d", &fPer );
//设定修正值
CHAR_setWorkInt(index,CHAR_WORKMAXHP,CHAR_getWorkInt(index,CHAR_WORKMAXHP)+fPer);
break;
}
break;
default:
break;
}
}
#endif
#ifdef _FMZUZHANG_MSG
if(fmfloor>0 && CHAR_getInt(index, CHAR_FMLEADERFLAG) == FMMEMBER_LEADER && CHAR_getWorkInt( index, CHAR_WORKLOGININTYPE) == 0){
char floorbuf[10];
sprintf(floorbuf,"%d",fmfloor);
if(strstr(getFmZuzhang(),floorbuf)){
char zuzhangmsg[256];
int i,playernum;
playernum = CHAR_getPlayerMaxNum();
sprintf(zuzhangmsg,"尊贵的%s庄主【%s】上线啦大家快去围观",MAP_getFloorName(fmfloor-1),CHAR_getChar(index,CHAR_NAME));
CHAR_setWorkInt( index, CHAR_WORKLOGININTYPE,1);
for( i = 0 ; i < playernum ; i++)
{
CHAR_talkToCli( i, -1, zuzhangmsg, CHAR_COLORRED);
}
}
}
#endif
CHAR_setWorkInt( index, CHAR_WORKATTACKPOWER,
CHAR_getWorkInt(index,CHAR_WORKFIXSTR) );
CHAR_setWorkInt( index, CHAR_WORKDEFENCEPOWER,
CHAR_getWorkInt(index,CHAR_WORKFIXTOUGH) );
CHAR_setWorkInt( index, CHAR_WORKQUICK,
CHAR_getWorkInt( index, CHAR_WORKFIXDEX));
#ifdef _ADD_DEAMGEDEFC
CHAR_setWorkInt( index, CHAR_WORKOTHERDMAGE, 0);
CHAR_setWorkInt( index, CHAR_WORKOTHERDEFC, 0);
#endif
if( CHAR_getInt( index, CHAR_WHICHTYPE) == CHAR_TYPEPET) {
int hostindex;
CHAR_setWorkInt( index, CHAR_WORKFIXAI, 0);
hostindex = CHAR_getWorkInt( index, CHAR_WORKPLAYERINDEX);
if( CHAR_CHECKINDEX( hostindex)) {
int ai;
int modai = CHAR_getInt( index, CHAR_MODAI);
double R;
if( modai <= 0 ) modai = 100;
R = 1.10;
ai = ( (CHAR_getInt( hostindex, CHAR_LV)
* CHAR_getWorkInt( hostindex, CHAR_WORKFIXCHARM )
* R)
/
(CHAR_getInt( index, CHAR_LV)* modai) * 100 ) ;
if( ai > 100 ) ai = 100;
ai += CHAR_getInt( index, CHAR_VARIABLEAI) * 0.01;
if( CHAR_getInt( hostindex, CHAR_TRANSMIGRATION ) > 0 ){
// shan 120 -> 140
ai += ( CHAR_GetLevel() - CHAR_getInt( hostindex, CHAR_LV ) ) / 2;
}
if( ai < 0 ) ai = 0;
if( ai > 100 ) ai = 100;
CHAR_setWorkInt( index, CHAR_WORKFIXAI, ai);
}
}
}
int _CHAR_complianceParameter( int index, char *FILE, int LINE)
{
//print("\ncompPara:%s:%d", FILE, LINE);
if( !CHAR_CHECKINDEX( index)) return 0;
//CAX
if( CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER
&& CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPEENEMY
&& CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPEPET
#ifdef _ALLBLUES_LUA
&& CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPELUANPC
#endif
#ifdef _PLAYER_NPC
&& CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPEPLAYERNPC
&& CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPEPLAYERPETNPC
#endif
){
return 0;
}
CHAR_initcharWorkInt( index );
ITEM_equipEffect( index );
CHAR_setWorkInt(index, CHAR_WORKATTACKPOWER,
CHAR_getWorkInt( index, CHAR_WORKFIXSTR ) );
CHAR_setWorkInt(index, CHAR_WORKDEFENCEPOWER,
CHAR_getWorkInt( index, CHAR_WORKFIXTOUGH ) );
CHAR_setWorkInt(index, CHAR_WORKQUICK,
CHAR_getWorkInt( index, CHAR_WORKFIXDEX ) );
#ifdef _ITEMSET5_TXT
CHAR_setWorkInt(index, CHAR_WORKARRANGEPOWER,
CHAR_getWorkInt( index, CHAR_WORKFIXARRANGE ) );
CHAR_setWorkInt(index, CHAR_WORKSEQUENCEPOWER,
CHAR_getWorkInt( index, CHAR_WORKFIXSEQUENCE ) );
#endif
Other_DefcharWorkInt( index);
CHAR_setInt( index, CHAR_HP, min( CHAR_getInt(index,CHAR_HP), CHAR_getWorkInt( index, CHAR_WORKMAXHP)));
CHAR_setInt( index, CHAR_MP, min( CHAR_getInt(index,CHAR_MP), CHAR_getWorkInt( index, CHAR_WORKMAXMP)));
if( CHAR_getInt( index, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ){
if( CHAR_getWorkInt( index, CHAR_WORKPETFOLLOW ) != -1 ){
int petindex = CHAR_getWorkInt( index, CHAR_WORKPETFOLLOW );
if( !CHAR_CHECKINDEX( petindex) ){
CHAR_setWorkInt( index, CHAR_WORKPETFOLLOW, -1);
}else{
if( CHAR_getInt( petindex, CHAR_WHICHTYPE) == CHAR_TYPEPET &&
!CHAR_CHECKINDEX( CHAR_getWorkInt( petindex, CHAR_WORKPLAYERINDEX)) ){
CHAR_setWorkInt( index, CHAR_WORKPETFOLLOW, petindex);
CHAR_setWorkInt( petindex, CHAR_WORKPLAYERINDEX, index);
}
}
}
#ifdef _PROFESSION_SKILL // WON ADD 人物职业技能
{
int i;
for( i=0; i<CHAR_SKILLMAXHAVE; i++ ){
int skillID = CHAR_getIntPSkill( index, i, SKILL_IDENTITY );
if( skillID <= 0 ) continue;
// 负重增加
if( skillID == 65 ){
PROFESSION_strong_back(index,NULL,65,NULL,NULL);
break;
}
}
}
#endif
}
if( CHAR_getFlg(index,CHAR_ISDIE) == FALSE ){
int oldimagenumber = CHAR_getInt(index,CHAR_BASEIMAGENUMBER);
int itemindex = CHAR_getItemIndex(index,CHAR_ARM);
int category;
int newimagenumber;
int basebaseimagenumber = CHAR_getInt(index,CHAR_BASEBASEIMAGENUMBER);
if( !ITEM_CHECKINDEX(itemindex) )
category = ITEM_FIST;
else
category = ITEM_getInt(itemindex,ITEM_TYPE );
newimagenumber = CHAR_getNewImagenumberFromEquip( basebaseimagenumber, category);
#ifdef _ITEM_METAMO
if( CHAR_getWorkInt( index, CHAR_WORKITEMMETAMO) > NowTime.tv_sec
#ifdef _NPCCHANGE_PLAYERIMG
|| CHAR_getWorkInt( index, CHAR_WORKNPCMETAMO) > 0
#endif
#ifdef _PETSKILL_BECOMEPIG
|| CHAR_getInt( index, CHAR_BECOMEPIG) > -1
#endif
){
newimagenumber = oldimagenumber; //不恢复成原本的图
}
#endif
// Arminius 8.9 airplane
if (oldimagenumber==100259) newimagenumber=100259;
#ifdef _VARY_WOLF
if( (CHAR_getInt( index, CHAR_WHICHTYPE) == CHAR_TYPEPET) &&
(CHAR_getWorkInt( index, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) &&
oldimagenumber == 101428 ){
newimagenumber = 101428;
}
#endif
#ifdef _ENEMY_FALLGROUND
if( CHAR_getInt( index, CHAR_WHICHTYPE) == CHAR_TYPEENEMY ) {
return 0;
}else {
#endif
if(CHAR_getInt(index, CHAR_RIDEPET) == -1){
if( newimagenumber == -1 ){
CHAR_setInt(index,CHAR_BASEIMAGENUMBER, basebaseimagenumber);
}else {
CHAR_setInt(index,CHAR_BASEIMAGENUMBER,newimagenumber);
}
}
#ifdef _ENEMY_FALLGROUND
}
#endif
#ifdef _NEW_RIDEPETS
if( (CHAR_getWorkInt(index, CHAR_WORKITEMMETAMO)>NowTime.tv_sec)
|| (CHAR_getWorkInt(index,CHAR_WORKNPCMETAMO)>0)){
return 0;
}
#endif
}
return 1;
}
int CHAR_complianceParameter2( int index)
{
//print("\ncompPara:%s:%d", FILE, LINE);
if( !CHAR_CHECKINDEX( index)) return 0;
//CHAR_initcharWorkInt( index );
//ITEM_equipEffect( index );
CHAR_setWorkInt(index, CHAR_WORKATTACKPOWER,
CHAR_getWorkInt( index, CHAR_WORKFIXSTR ) );
CHAR_setWorkInt(index, CHAR_WORKDEFENCEPOWER,
CHAR_getWorkInt( index, CHAR_WORKFIXTOUGH ) );
CHAR_setWorkInt(index, CHAR_WORKQUICK,
CHAR_getWorkInt( index, CHAR_WORKFIXDEX ) );
#ifdef _ITEMSET5_TXT
CHAR_setWorkInt(index, CHAR_WORKARRANGEPOWER,
CHAR_getWorkInt( index, CHAR_WORKFIXARRANGE ) );
CHAR_setWorkInt(index, CHAR_WORKSEQUENCEPOWER,
CHAR_getWorkInt( index, CHAR_WORKFIXSEQUENCE ) );
#endif
Other_DefcharWorkInt( index);
CHAR_setInt( index, CHAR_HP, min( CHAR_getInt(index,CHAR_HP), CHAR_getWorkInt( index, CHAR_WORKMAXHP)));
CHAR_setInt( index, CHAR_MP, min( CHAR_getInt(index,CHAR_MP), CHAR_getWorkInt( index, CHAR_WORKMAXMP)));
if( CHAR_getInt( index, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ){
if( CHAR_getWorkInt( index, CHAR_WORKPETFOLLOW ) != -1 ){
int petindex = CHAR_getWorkInt( index, CHAR_WORKPETFOLLOW );
if( !CHAR_CHECKINDEX( petindex) ){
CHAR_setWorkInt( index, CHAR_WORKPETFOLLOW, -1);
}else{
if( CHAR_getInt( petindex, CHAR_WHICHTYPE) == CHAR_TYPEPET &&
!CHAR_CHECKINDEX( CHAR_getWorkInt( petindex, CHAR_WORKPLAYERINDEX)) ){
CHAR_setWorkInt( index, CHAR_WORKPETFOLLOW, petindex);
CHAR_setWorkInt( petindex, CHAR_WORKPLAYERINDEX, index);
}
}
}
#ifdef _PROFESSION_SKILL // WON ADD 人物职业技能
{
int i;
for( i=0; i<CHAR_SKILLMAXHAVE; i++ ){
int skillID = CHAR_getIntPSkill( index, i, SKILL_IDENTITY );
if( skillID <= 0 ) continue;
// 负重增加
if( skillID == 65 ){
PROFESSION_strong_back(index,NULL,65,NULL,NULL);
break;
}
}
}
#endif
}
if( CHAR_getFlg(index,CHAR_ISDIE) == FALSE ){
int oldimagenumber = CHAR_getInt(index,CHAR_BASEIMAGENUMBER);
int itemindex = CHAR_getItemIndex(index,CHAR_ARM);
int category;
int newimagenumber;
int basebaseimagenumber = CHAR_getInt(index,CHAR_BASEBASEIMAGENUMBER);
if( !ITEM_CHECKINDEX(itemindex) )
category = ITEM_FIST;
else
category = ITEM_getInt(itemindex,ITEM_TYPE );
newimagenumber = CHAR_getNewImagenumberFromEquip( basebaseimagenumber, category);
#ifdef _ITEM_METAMO
if( CHAR_getWorkInt( index, CHAR_WORKITEMMETAMO) > NowTime.tv_sec
#ifdef _NPCCHANGE_PLAYERIMG
|| CHAR_getWorkInt( index, CHAR_WORKNPCMETAMO) > 0
#endif
#ifdef _PETSKILL_BECOMEPIG
|| CHAR_getInt( index, CHAR_BECOMEPIG) > -1
#endif
){
newimagenumber = oldimagenumber; //不恢复成原本的图
}
#endif
// Arminius 8.9 airplane
if (oldimagenumber==100259) newimagenumber=100259;
#ifdef _VARY_WOLF
if( (CHAR_getInt( index, CHAR_WHICHTYPE) == CHAR_TYPEPET) &&
(CHAR_getWorkInt( index, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) &&
oldimagenumber == 101428 ){
newimagenumber = 101428;
}
#endif
#ifdef _ENEMY_FALLGROUND
if( CHAR_getInt( index, CHAR_WHICHTYPE) == CHAR_TYPEENEMY ) {
return 0;
}else {
#endif
if(CHAR_getInt(index, CHAR_RIDEPET) == -1){
if( newimagenumber == -1 ){
CHAR_setInt(index,CHAR_BASEIMAGENUMBER, basebaseimagenumber);
}else {
CHAR_setInt(index,CHAR_BASEIMAGENUMBER,newimagenumber);
}
}
#ifdef _ENEMY_FALLGROUND
}
#endif
#ifdef _NEW_RIDEPETS
if( (CHAR_getWorkInt(index, CHAR_WORKITEMMETAMO)>NowTime.tv_sec)
|| (CHAR_getWorkInt(index,CHAR_WORKNPCMETAMO)>0)){
return 0;
}
#endif
}
return 1;
}
/*======================================================================
キャラのアイテムを扱う関数
======================================================================*/
/*====================見る====================*/
/*------------------------------------------------------------
* 方向指定で、その方向のキャラクタに見るイベントを発生させる
* 引数
* charaindex int キャラインデックス
* dir int 方向
* 返り値
* なし
------------------------------------------------------------*/
void CHAR_Look( int charaindex, int dir )
{
int fl ,x,y;
OBJECT object;
/* インデックスのチェック */
if( CHAR_CHECKINDEX( charaindex ) == FALSE )return;
if( dir < 0 ) {
dir = CHAR_getInt(charaindex,CHAR_DIR);
}
VALIDATEDIR(dir);
if( CHAR_getInt( charaindex, CHAR_DIR) != dir ) {
CHAR_setInt(charaindex,CHAR_DIR,dir);
/* 方向変換したアクションを送信する */
CHAR_sendWatchEvent(CHAR_getWorkInt(charaindex,CHAR_WORKOBJINDEX),
CHAR_ACTTURN,NULL,0,TRUE);
}
fl = CHAR_getInt(charaindex,CHAR_FLOOR);
CHAR_getCoordinationDir( CHAR_getInt(charaindex,CHAR_DIR),
CHAR_getInt(charaindex,CHAR_X),
CHAR_getInt(charaindex,CHAR_Y),
1, &x, &y );
//CHAR_talkToCli( charaindex, -1, "调查四周环境。", CHAR_COLORWHITE );
for( object=MAP_getTopObj(fl,x,y) ; object ;
object = NEXT_OBJECT(object) ){
int objindex = GET_OBJINDEX(object);
if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){
typedef void (*LOOKF)(int,int);
LOOKF lf;
lf = (LOOKF)CHAR_getFunctionPointer(
OBJECT_getIndex(objindex),CHAR_LOOKEDFUNC);
if( lf ) lf(OBJECT_getIndex(objindex),charaindex);
#ifdef _ALLBLUES_LUA
else{
RunCharTalkedEvent(OBJECT_getIndex(objindex),charaindex,"hi",1, -1);
}
#endif
}
}
}
BOOL _CHAR_makeObjectCString( char *file, int line, int objindex,char* buf, int buflen )
{
char objindexbuf[64];
if( CHECKOBJECT(objindex) == FALSE ) return FALSE;
switch( OBJECT_getType(objindex) ){
case OBJTYPE_NOUSE:
return FALSE;
break;
case OBJTYPE_CHARA:
{
int charaindex = OBJECT_getIndex(objindex);
char escapename[256];
char escapetitle[256];
// shan add +1
char tmp[256];
int namecolor;
#ifdef _TRANS_6
#ifdef _TRANS_7
int namecolortbl[] = { CHAR_COLORWHITE, CHAR_COLORYELLOW, CHAR_COLORGREEN,
CHAR_COLORCYAN, CHAR_COLORRED, CHAR_COLORPURPLE, CHAR_COLORBLUE2,CHAR_COLORGREEN2,CHAR_COLORBLACK};//转生後的颜色
#else
int namecolortbl[] = { CHAR_COLORWHITE, CHAR_COLORYELLOW, CHAR_COLORGREEN,
CHAR_COLORCYAN, CHAR_COLORRED, CHAR_COLORPURPLE, CHAR_COLORBLUE2};//转生後的颜色
#endif
#else
int namecolortbl[] = { CHAR_COLORWHITE, CHAR_COLORYELLOW, CHAR_COLORGREEN,
CHAR_COLORCYAN, CHAR_COLORRED, CHAR_COLORPURPLE};
#endif
int ridepet = BATTLE_getRidePet( charaindex );
char petname[64] = "";
char escapepetname[256];
int petlevel = 0;
if( !CHAR_getFlg(charaindex,CHAR_ISVISIBLE) )return FALSE;
namecolor = CHAR_getInt( charaindex, CHAR_TRANSMIGRATION);
#ifdef _TRANS_6
#ifdef _TRANS_7
if( namecolor > 8 ) namecolor = 8;
#else
if( namecolor > 6 ) namecolor = 6;
#endif
#else
if( namecolor > 5 ) namecolor = 5;
#endif
if( namecolor < 0 ) namecolor = 0;
// shan add begin
#ifdef _NEW_NAME //自定义称号
char* szNewName = CHAR_getChar( charaindex, CHAR_NEWNAME);
#endif
#ifdef _SHOW_VIP_CF
char VipName[32]="";
if(getShowVip()!=0)
if(CHAR_getInt( charaindex,CHAR_VIPRIDE )>0)
sprintf(VipName, "VIP-");
#endif
#ifdef _ITEM_SETLOVER
char LoveName[32]="";
if(strlen( CHAR_getChar( charaindex, CHAR_LOVE)) > 0 &&
strlen(CHAR_getChar(charaindex,CHAR_LOVERID))>0 &&
strlen(CHAR_getChar(charaindex,CHAR_LOVERNAME))>0)
sprintf(LoveName, "§♂%s♀",CHAR_getChar( charaindex, CHAR_LOVERNAME));
#endif
if( CHAR_getWorkInt(charaindex, CHAR_WORKFMINDEXI) >= 0
&& CHAR_getWorkInt(charaindex, CHAR_WORKFMINDEXI) < FAMILY_MAXNUM
&& CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER
&& CHAR_getWorkInt(charaindex, CHAR_WORKFMSETUPFLAG)==1
// ||CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYERNPC)
#ifdef _PLAYER_NPC
||CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYERNPC
#endif
)
#ifdef _SHOW_VIP_CF
if(getShowVip()==1)
sprintf(tmp, "%s%s%s",VipName,CHAR_getChar( charaindex, CHAR_FMNAME),LoveName);
else
#endif
#ifdef _ITEM_SETLOVER
sprintf(tmp, "%s%s",CHAR_getChar( charaindex, CHAR_FMNAME),LoveName);
else
if(strlen(LoveName)>0)
sprintf(tmp, "%s",LoveName);
else
strcpy(tmp, "");
#else
sprintf(tmp, "%s",CHAR_getChar( charaindex, CHAR_FMNAME));
else
strcpy(tmp, "");
#endif
#ifdef _SHOW_VIP_CF
char Name[64];
if(getShowVip()==2)
sprintf(Name, "%s%s",VipName,makeEscapeString( CHAR_getChar( charaindex,CHAR_NAME ), escapename, sizeof(escapename)));
else
sprintf(Name, "%s",CHAR_getChar( charaindex,CHAR_NAME ));
#endif
char szNewTemp[512];
if(szNewName!=0 && strlen(szNewName) > 0)
sprintf( szNewTemp, "<%s>%s", szNewName, tmp);
else
sprintf( szNewTemp, "%s", tmp);
// Robin 0730
if( ridepet >= 0 ){
if( ! strcmp( CHAR_getChar( ridepet, CHAR_USERPETNAME), "") )
strcpy( petname, CHAR_getChar( ridepet, CHAR_NAME ));
else
strcpy( petname, CHAR_getChar( ridepet, CHAR_USERPETNAME ));
petlevel = CHAR_getInt( ridepet, CHAR_LV);
}
int whichtype = CHAR_getInt( charaindex, CHAR_WHICHTYPE);
#ifdef _PLAYER_NPC
if(whichtype == CHAR_TYPEPLAYERNPC){
whichtype = CHAR_TYPEPLAYER;
}else{
}
#endif
/*
if(whichtype == CHAR_TYPEPLAYERNPC){
whichtype = CHAR_TYPEPLAYER;
}else{
}
*/
#ifdef _OBJSEND_C
#ifdef _CHAR_PROFESSION // WON ADD 人物职业
#ifdef _ALLDOMAN // (不可开) Syu ADD 排行榜NPC
snprintf( buf, buflen, "%d|%d|%s|%d|%d|%d|%d|%d|%d|%s|%s|%d|%d|%d|%s|%s|%d|%d|%d|%d|%d",
#else
snprintf( buf, buflen, "%d|%d|%s|%d|%d|%d|%d|%d|%d|%s|%s|%d|%d|%d|%s|%s|%d|%d|%d|%d",
#endif
#else
snprintf( buf, buflen, "%d|%d|%s|%d|%d|%d|%d|%d|%d|%s|%s|%d|%d|%d|%s|%s|%d",
#endif
OBJTYPE_CHARA,
#else
snprintf( buf, buflen, "%d|%s|%d|%d|%d|%d|%d|%d|%s|%s|%d|%d|%d|%s|%s|%d",
#endif
whichtype,
cnv10to62( objindex,objindexbuf, sizeof(objindexbuf)),
OBJECT_getX(objindex),
OBJECT_getY(objindex),
CHAR_getInt( charaindex, CHAR_DIR),
CHAR_getInt( charaindex,CHAR_BASEIMAGENUMBER ),
CHAR_getInt( charaindex,CHAR_LV ),
namecolortbl[namecolor],
//#ifdef _NEW_SHOW_VIP_LOVE
// FMandName,
//#else
#ifdef _SHOW_VIP_CF
Name,
#else
makeEscapeString( CHAR_getChar( charaindex,CHAR_NAME ), escapename, sizeof(escapename)),
#endif
//#endif
makeEscapeString(CHAR_getChar(charaindex,CHAR_OWNTITLE), escapetitle,sizeof(escapetitle)),
CHAR_getFlg( charaindex,CHAR_ISOVERED ),
CHAR_getFlg( charaindex,CHAR_HAVEHEIGHT ),
CHAR_getInt( charaindex, CHAR_POPUPNAMECOLOR),
szNewTemp,
makeEscapeString( petname, escapepetname, sizeof(escapepetname)),
petlevel
#ifdef _CHAR_PROFESSION // WON ADD 人物职业
,CHAR_getInt( charaindex, PROFESSION_CLASS) // 职业别
,CHAR_getInt( charaindex, PROFESSION_LEVEL) // 职业等级
// ,CHAR_getInt( charaindex, PROFESSION_EXP) // 职业经验值
,CHAR_getInt( charaindex, PROFESSION_SKILL_POINT) // 技能点数
#endif
#ifdef _ALLDOMAN // (不可开) Syu ADD 排行榜NPC
,CHAR_getInt( charaindex, CHAR_HEROFLOOR ) // 英雄战场楼层
#endif
#ifdef _PETSKILL_BECOMEPIG
// ,CHAR_getInt(charaindex, CHAR_BECOMEPIG)
#endif
);
break;
}
case OBJTYPE_ITEM:
{
int itemindex = OBJECT_getIndex(objindex);
int nameint;
int leaklevel;
int color;
char bufbuf[256];
char *temp;
leaklevel = ITEM_getInt( itemindex,ITEM_LEAKLEVEL );
nameint = ITEM_SECRETNAME;
// if( leaklevel >=1 ) {
// nameint = ITEM_SECRETNAME;
// }else {
// nameint = ITEM_NAME;
// }
color = CHAR_COLORWHITE;
if (ITEM_getChar( itemindex, ITEM_CDKEY) == "\0"){
return FALSE;
break;
}
temp=ITEM_getChar( itemindex, ITEM_CDKEY);
if( temp && strlen( temp ) ) {
color = CHAR_COLORGREEN;
}else {
if( ITEM_getInt( itemindex, ITEM_MERGEFLG) ) {
color = CHAR_COLORYELLOW;
}
}
#ifdef _OBJSEND_C
snprintf( buf, buflen, "%d|%s|%d|%d|%d|%d|%s",
OBJTYPE_ITEM,
#else
snprintf( buf, buflen, "%s|%d|%d|%d|%d|%s",
#endif
cnv10to62( objindex,objindexbuf, sizeof(objindexbuf)),
OBJECT_getX(objindex), OBJECT_getY(objindex),
ITEM_getInt( itemindex,ITEM_BASEIMAGENUMBER ),
color,
makeEscapeString( ITEM_getChar( itemindex,nameint), bufbuf, sizeof(bufbuf))
);
break;
}
case OBJTYPE_GOLD:
#ifdef _OBJSEND_C
snprintf( buf, buflen, "%d|%s|%d|%d|%d",
OBJTYPE_GOLD,
#else
snprintf( buf, buflen, "%s|%d|%d|%d",
#endif
cnv10to62( objindex,objindexbuf, sizeof(objindexbuf)),
OBJECT_getX(objindex),OBJECT_getY(objindex),
OBJECT_getIndex(objindex) );
break;
#ifdef _OBJSEND_C
#endif
default:
return FALSE;
break;
}
return TRUE;
}
void CHAR_sendCSpecifiedObjindex( int fd, int index)
{
char introduction[512];
if( CHECKOBJECTUSE( index )
&& CHAR_makeObjectCString( index, introduction,
sizeof(introduction) ) ){
lssproto_C_send( fd,introduction );
}else{
char mesg[32];
cnv10to62( index, mesg, sizeof( mesg));
lssproto_C_send( fd, mesg );
}
}
void CHAR_sendSpecifiedobjindexCToCharaindex(int charaindex,int objindex)
{
int fd;
fd = getfdFromCharaIndex(charaindex);
if( fd == -1)return;
CHAR_sendCSpecifiedObjindex(fd,objindex);
}
void CHAR_sendCToArroundCharacter( int objindex )
{
char introduction[512];
int x,y,fl;
int i,j;
if( CHAR_makeObjectCString( objindex,introduction, sizeof(introduction) ) == FALSE ) return;
x = OBJECT_getX(objindex);
y = OBJECT_getY(objindex);
fl =OBJECT_getFloor(objindex);
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 objindexwk = GET_OBJINDEX( object);
if( OBJECT_getType(objindexwk) == OBJTYPE_CHARA ){
int index = OBJECT_getIndex(objindexwk);
if( CHAR_getInt( index, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){
int fd;
if( CHAR_getWorkInt( index, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) continue;
fd = getfdFromCharaIndex( index);
if( fd == -1 )continue;
lssproto_C_send( fd,introduction );
}
}
}
}
}
}
void CHAR_sendCDArroundChar_Main( int fl, int x, int y, int objindex, BOOL mode )
{
#define CHAR_CDSEESIZ CHAR_DEFAULTSEESIZ+10
int i,j;
char cdmsg[64*2];
cnv10to62( objindex,cdmsg, sizeof(cdmsg));
for( i = x - CHAR_CDSEESIZ/2 ; i <= x +CHAR_CDSEESIZ/2 ; i ++ ){
for( j = y - CHAR_CDSEESIZ/2; j <= y + CHAR_CDSEESIZ/2; j ++ ){
OBJECT object;
for( object = MAP_getTopObj( fl, i,j); object;
object = NEXT_OBJECT(object) ){
int objindexwk = GET_OBJINDEX( object);
if( OBJECT_getType(objindexwk) == OBJTYPE_CHARA ){
int index = OBJECT_getIndex( objindexwk);
if( CHAR_getInt( index,CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER) {
if( objindexwk != objindex ) {
int fd;
fd = getfdFromCharaIndex(index);
if( fd == -1 )continue;
if( CHAR_getWorkInt( index, CHAR_WORKBATTLEMODE)
== BATTLE_CHARMODE_NONE )
{
CONNECT_appendCDbuf( fd, cdmsg, strlen( cdmsg));
CDflush( index);
}
}
}
}
}
}
}
}
void CHAR_sendCDArroundChar( int fl, int x, int y, int objindex )
{
CHAR_sendCDArroundChar_Main( fl,x,y,objindex,FALSE);
}
void CHAR_sendArroundCharaData( int charaindex )
{
int fd;
int i,j,x, y,fl;
char introduction[512*2];
char c_msg[5][1024*6];
int strpos[5] = {0,0,0,0,0};
char cabuf[128*2];
fd = getfdFromCharaIndex( charaindex );
if( fd == -1 )return;
memset(c_msg[0], 0, sizeof(c_msg[0]));
memset(c_msg[1], 0, sizeof(c_msg[1]));
memset(c_msg[2], 0, sizeof(c_msg[2]));
memset(c_msg[3], 0, sizeof(c_msg[3]));
memset(c_msg[4], 0, sizeof(c_msg[4]));
c_msg[0][0] = '\0';
c_msg[1][0] = '\0';
c_msg[2][0] = '\0';
c_msg[3][0] = '\0';
c_msg[4][0] = '\0';
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 introlen;
int objindex = GET_OBJINDEX(object);
int c_index = OBJECT_getIndex( objindex);
if( OBJECT_getType(objindex) == OBJTYPE_NOUSE ) continue;
if( OBJECT_getType(objindex) == OBJTYPE_CHARA &&
!CHAR_getFlg(OBJECT_getIndex(objindex), CHAR_ISVISIBLE) ){
if(!CHAR_CHECKINDEX(OBJECT_getIndex(objindex))){
printf("自动删除一个问题对象!");
endObjectOne(objindex);
}
continue;
}
if( OBJECT_getType( objindex) == OBJTYPE_CHARA) {
if( CHAR_getInt( c_index, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER
#ifdef _ALLBLUES_LUA
|| CHAR_getInt( c_index, CHAR_WHICHTYPE ) >= CHAR_TYPELUANPC
#endif
){
/* 見えたキャラが仲間歩きの親ならばリーダー表示CAを送る */
if( CHAR_getWorkInt( c_index, CHAR_WORKPARTYMODE )== CHAR_PARTY_LEADER ){
if( CHAR_makeCAOPT1String( objindex, cabuf, sizeof( cabuf), CHAR_ACTLEADER,1 )) {
CONNECT_appendCAbuf( fd,cabuf,strlen(cabuf));
}
}
// Robin 0611 trade
/* 角色交易中 */
if( CHAR_getWorkInt( c_index, CHAR_WORKTRADEMODE ) != CHAR_TRADE_FREE ) {
if( CHAR_makeCAOPT1String( objindex, cabuf, sizeof( cabuf), CHAR_ACTTRADE,1 )){
CONNECT_appendCAbuf( fd,cabuf,strlen(cabuf));
}
}
#ifdef _ANGEL_SUMMON
if( CHAR_getWorkInt( c_index, CHAR_WORKANGELMODE ) == TRUE ) {
if( CHAR_makeCAOPT1String( objindex, cabuf, sizeof( cabuf), CHAR_ACTANGEL,1 )){
CONNECT_appendCAbuf( fd,cabuf,strlen(cabuf));
}
}
#endif
#ifdef _MIND_ICON
//print("\nshan--->(batlmode)->%d", CHAR_getWorkInt( c_index, CHAR_WORKBATTLEMODE ));
if(CHAR_getWorkInt( c_index, CHAR_MIND_NUM) &&
CHAR_getWorkInt( c_index, CHAR_WORKBATTLEMODE ) == BATTLE_CHARMODE_NONE){
if( CHAR_makeCAOPT1String( objindex, cabuf, sizeof( cabuf),
CHAR_MIND, CHAR_getWorkInt( c_index, CHAR_MIND_NUM))){
CONNECT_appendCAbuf( fd, cabuf, strlen(cabuf));
//print("\nshan---->(1)cabuf-->%s", cabuf);
}
}
#endif
#ifdef _STREET_VENDOR
if(CHAR_getWorkInt(c_index,CHAR_WORKSTREETVENDOR) == 1 &&
CHAR_getWorkInt(c_index,CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE){
if(CHAR_makeCAOPTString(objindex,cabuf,sizeof(cabuf),
CHAR_STREETVENDOR_OPEN,CHAR_getWorkChar(c_index,CHAR_STREETVENDOR_NAME))){
CONNECT_appendCAbuf(fd,cabuf,strlen(cabuf));
}
}
#endif
#ifdef _ITEM_CRACKER
if(CHAR_getWorkInt( c_index, CHAR_WORKITEM_CRACKER)&&
CHAR_getWorkInt( c_index, CHAR_WORKBATTLEMODE ) == BATTLE_CHARMODE_NONE)
{
if( CHAR_makeCAOPT1String( objindex, cabuf, sizeof( cabuf),
CHAR_ITEM_CRACKER, CHAR_getWorkInt( c_index, CHAR_WORKITEM_CRACKER)))
{
CONNECT_appendCAbuf( fd, cabuf, strlen(cabuf));
}
}
#endif
if( CHAR_getWorkInt( c_index, CHAR_WORKBATTLEMODE ) != BATTLE_CHARMODE_NONE ){
if( CHAR_getWorkInt( c_index, CHAR_WORKBATTLEWATCH) == TRUE ) {
if( CHAR_makeCAOPT1String( objindex, cabuf, sizeof( cabuf), CHAR_ACTBATTLEWATCH, 1)) {
CONNECT_appendCAbuf( fd, cabuf, strlen( cabuf));
}
}else {
int battleno = CHAR_getWorkInt( c_index, CHAR_WORKBATTLEINDEX);
int sideno = CHAR_getWorkInt( c_index, CHAR_WORKBATTLESIDE);
int helpno = FALSE;
if( BATTLE_CHECKINDEX( battleno ) == FALSE ){
}else {
helpno = (BattleArray[ battleno].Side[
CHAR_getWorkInt( c_index, CHAR_WORKBATTLESIDE)].flg & BSIDE_FLG_HELP_OK)?TRUE:FALSE;
}
if( CHAR_makeCAOPT3String( objindex, cabuf, sizeof( cabuf), CHAR_ACTBATTLE,
battleno,sideno,helpno)){
CONNECT_appendCAbuf( fd,cabuf,strlen(cabuf));
}
}
}
if( CHAR_getWorkInt( c_index, CHAR_WORKACTION ) != -1 ) {
if( CHAR_makeCADefaultString( objindex, cabuf, sizeof( cabuf),
CHAR_getWorkInt( c_index, CHAR_WORKACTION))){
CONNECT_appendCAbuf( fd,cabuf,strlen(cabuf));
}
}
}else if( CHAR_getInt( c_index, CHAR_WHICHTYPE ) == CHAR_TYPEPET ) {
if( CHAR_getWorkInt( c_index, CHAR_WORKACTION ) != -1 ){
if( CHAR_makeCADefaultString( objindex, cabuf, sizeof( cabuf),
CHAR_getWorkInt( c_index, CHAR_WORKACTION))){
CONNECT_appendCAbuf( fd,cabuf,strlen(cabuf));
}
}
}
#ifdef _ADD_ACTION
else { //npc
if( CHAR_CHECKINDEX( c_index) ) {
if( CHAR_getWorkInt( c_index, CHAR_WORKACTION ) > 0 ) {
if( CHAR_makeCADefaultString( objindex, cabuf, sizeof( cabuf),
CHAR_getWorkInt( c_index, CHAR_WORKACTION))) {
CONNECT_appendCAbuf( fd,cabuf,strlen(cabuf));
}
}
}
}
#endif
}
if( c_index == charaindex) continue;
if( CHAR_makeObjectCString( objindex, introduction, sizeof( introduction))){
introlen = strlen( introduction);
introduction[introlen] = ',';
introduction[introlen+1] = '\0';
if(strpos[0]+strlen( introduction)<=5120){
strcpysafe( &c_msg[0][strpos[0]], sizeof( c_msg[0]) - strpos[0],
introduction);
strpos[0] += strlen( introduction);
}else if(strpos[1]+strlen( introduction)<=5120){
strcpysafe( &c_msg[1][strpos[1]], sizeof( c_msg[0]) - strpos[1],
introduction);
strpos[1] += strlen( introduction);
}else if(strpos[2]+strlen( introduction)<=5120){
strcpysafe( &c_msg[2][strpos[2]], sizeof( c_msg[2]) - strpos[2],
introduction);
strpos[2] += strlen( introduction);
}else if(strpos[3]+strlen( introduction)<=5120){
strcpysafe( &c_msg[3][strpos[3]], sizeof( c_msg[3]) - strpos[3],
introduction);
strpos[3] += strlen( introduction);
}else if(strpos[4]+strlen( introduction)<=5120){
strcpysafe( &c_msg[4][strpos[4]], sizeof( c_msg[4]) - strpos[4],
introduction);
strpos[4] += strlen( introduction);
}
}
}
}
}
dchop( c_msg[0], "," );
dchop( c_msg[1], "," );
dchop( c_msg[2], "," );
dchop( c_msg[3], "," );
dchop( c_msg[4], "," );
if( strlen( c_msg[0]) == 0 ) return;
//print("\nc_msg[0]=%s,strpos[0]=%d\n",c_msg[0],strpos[0]);
lssproto_C_send( fd, c_msg[0]);
if(strlen( c_msg[1]) > 0){
//print("\nc_msg[1]=%s,strpos[1]=%d\n",c_msg[1],strpos[1]);
lssproto_C_send( fd, c_msg[1]);
}
if(strlen( c_msg[2]) > 0){
//print("\nc_msg[2]=%s,strpos[2]=%d\n",c_msg[2],strpos[2]);
lssproto_C_send( fd, c_msg[2]);
}
if(strlen( c_msg[3]) > 0){
//print("\nc_msg[3]=%s,strpos[3]=%d\n",c_msg[3],strpos[3]);
lssproto_C_send( fd, c_msg[3]);
}
if(strlen( c_msg[4]) > 0){
//print("\nc_msg[4]=%s,strpos[4]=%d\n",c_msg[4],strpos[4]);
lssproto_C_send( fd, c_msg[4]);
}//修复人多关闭外挂
}
BOOL _CHAR_warpToSpecificPoint( char *file, int line, int charaindex, int floor, int x, int y)
{
int objindex;
int per;
objindex = CHAR_getWorkInt(charaindex,CHAR_WORKOBJINDEX);
if( !MAP_IsValidCoordinate( floor, x, y )) {
// print( "error: invalid Coordinate fl[%d] x[%d] y[%d] %s:%d from %s:%d\n",
// floor, x, y, __FILE__, __LINE__, file, line);
return FALSE;
}
CHAR_sendCDArroundChar_Main( OBJECT_getFloor(objindex),
OBJECT_getX(objindex),
OBJECT_getY(objindex),
objindex, TRUE );
CHAR_setInt( charaindex,CHAR_FLOOR,floor);
CHAR_setInt( charaindex,CHAR_X,x);
CHAR_setInt( charaindex,CHAR_Y,y);
{
int of,ox,oy;
of = OBJECT_setFloor(objindex,floor);
ox = OBJECT_setX(objindex,x);
oy = OBJECT_setY(objindex,y);
if( !MAP_objmove( objindex,of,ox,oy,floor,x,y ) ){
fprint( "ERROR MAP_OBJMOVE objindex=%d\n",objindex );
return FALSE;
}
}
per = ENCOUNT_getEncountPercentMin( charaindex, floor,x,y);
if( per != -1 ) {
CHAR_setWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MIN, per);
}
per = ENCOUNT_getEncountPercentMax( charaindex, floor,x,y);
if( per != -1 ) {
CHAR_setWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MAX, per);
}
#ifdef _PROFESSION_SKILL // WON ADD 人物职业技能
CHAR_setWorkInt( charaindex, CHAR_ENCOUNT_FIX, 0);
#endif
if( CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ) {
CAflush( charaindex );
{
int i;
char* statuscat[]={"C","E",};
for( i=0 ; i<arraysizeof(statuscat) ; i++ )
CHAR_sendStatusString( charaindex, statuscat[i] );
if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE){
CHAR_sendStatusString( charaindex, "P" );
}
}
if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE){
CHAR_sendArroundCharaData( charaindex );
}
}
if( CHAR_getInt( charaindex, CHAR_WHICHTYPE) != CHAR_TYPEPET ||
( CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPET &&
CHAR_getInt( charaindex, CHAR_MAILMODE) == CHAR_PETMAIL_NONE)){
CHAR_sendCToArroundCharacter( objindex );
}
else {
CHAR_sendPMEToArroundCharacterFLXY( charaindex,
CHAR_getInt( charaindex, CHAR_FLOOR),
CHAR_getInt( charaindex, CHAR_X),
CHAR_getInt( charaindex, CHAR_Y),
0,1,CHAR_getInt( charaindex, CHAR_PETMAILEFFECT)
);
}
if( CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ) {
if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE ) == CHAR_PARTY_LEADER ) {
CHAR_sendLeader( objindex, 1);
}
MAP_sendArroundChar( charaindex );
CHAR_setWorkChar(charaindex,CHAR_WORKWALKARRAY,"");
if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE ) != CHAR_PARTY_CLIENT ){
CHAR_setFlg( charaindex, CHAR_ISWARP, 1);
}
CHAR_checkEffect( charaindex);
// Robin 0706 petFollow
{
int petindex = CHAR_getWorkInt( charaindex, CHAR_WORKPETFOLLOW );
if( (petindex > -1) && (CHAR_CHECKINDEX( petindex )) )
CHAR_warpToSpecificPoint( petindex, floor, x, y );
}
#ifdef _STATUS_WATERWORD //水世界状态
if( MAP_getMapFloorType( floor) == 1 ){
CHAR_setWorkInt( charaindex, CHAR_WORKMAPFLOORTYPE, 1);
}else {
CHAR_setWorkInt( charaindex, CHAR_WORKMAPFLOORTYPE, 0);
}
#endif
#ifdef _MAP_TIME
// 如果进入的地图是这些编号的话,设定倒数
if(floor >= 30017 && floor <= 30021){
if(CHAR_getWorkInt(charaindex,CHAR_WORK_MAP_TIME) <= 0) CHAR_setWorkInt(charaindex,CHAR_WORK_MAP_TIME,60);
}
// 如果进入正常的地图
else CHAR_setWorkInt(charaindex,CHAR_WORK_MAP_TIME,0);
#endif
#ifdef _ANGEL_SUMMON
if( CHAR_getWorkInt( charaindex, CHAR_WORKANGELMODE ) == TRUE ) {
CHAR_sendAngelMark( objindex, 1);
}
#endif
}else if( OBJECT_getType( objindex) == OBJTYPE_CHARA ){
MAP_sendArroundChar( charaindex );
}
return TRUE;
}
static void CHAR_walk_check( int charaindex )
{
if( strlen( CHAR_getWorkChar( charaindex ,CHAR_WORKWALKARRAY ) ) != 0 ){
struct timeval old;
old.tv_sec = CHAR_getWorkInt(charaindex,CHAR_WORKWALKSTARTSEC);
old.tv_usec = CHAR_getWorkInt(charaindex,CHAR_WORKWALKSTARTMSEC);
if( time_diff_us(NowTime,old) >= CHAR_getInt(charaindex,CHAR_WALKINTERVAL)*1000.0 ) {
CHAR_walkcall( charaindex );
}
}
}
static BOOL CHAR_callLoop( int charaindex )
{
unsigned int timediff_us;
struct timeval old;
int loopinterval, iRet = FALSE;
loopinterval = CHAR_getInt(charaindex,CHAR_LOOPINTERVAL);
if( loopinterval <= 0 )return FALSE;
//print("\n CHAR_callLoop:%d", charaindex);
old.tv_sec = CHAR_getWorkInt(charaindex,CHAR_WORKLOOPSTARTSEC);
old.tv_usec = CHAR_getWorkInt(charaindex,CHAR_WORKLOOPSTARTMSEC);
timediff_us = time_diff_us( NowTime , old );
if( timediff_us >= loopinterval*500.0 ){
int (*loopfunc)(int)=NULL;
loopfunc =(int(*)(int))CHAR_getFunctionPointer( charaindex, CHAR_LOOPFUNC);
if( loopfunc ){
loopfunc(charaindex);
iRet = TRUE;
}
#ifdef _ALLBLUES_LUA
else{
RunCharLoopEvent(charaindex);
iRet = TRUE;
}
#endif
#ifdef _USER_CHARLOOPS
loopfunc =(int(*)(int))CHAR_getFunctionPointer( charaindex, CHAR_LOOPFUNCTEMP1);
if( loopfunc ){
loopfunc(charaindex);
iRet = TRUE;
}
#endif
if( iRet == FALSE ){
CHAR_setInt( charaindex, CHAR_LOOPINTERVAL, 0);
}
CHAR_setWorkInt(charaindex,CHAR_WORKLOOPSTARTSEC, NowTime.tv_sec);
CHAR_setWorkInt(charaindex,CHAR_WORKLOOPSTARTMSEC, NowTime.tv_usec);
}
return iRet;
}
int EnemyMoveNum = 10;
void CHAR_Loop( void )
{
int charnum=CHAR_getCharNum();
int playernum = CHAR_getPlayerMaxNum();
int petnum = CHAR_getPetMaxNum();
static int charcnt = 0;
int i, movecnt=0;
if( charcnt == -1 ) {
charcnt = CHAR_getCharNum();
}
// 玩家用的loop
for( i=0 ; i< playernum ; i++ ){
if( CHAR_getCharUse(i) == FALSE )continue;
CHAR_walk_check( i );
CHAR_callLoop( i );
#ifdef _TEACHER_SYSTEM
// 有获得导师声望
if(CHAR_getWorkInt(i,CHAR_WORK_GET_TEACHER_FAME) > 0){
int iAddTFame = CHAR_getInt(i,CHAR_TEACHER_FAME) + CHAR_getWorkInt(i,CHAR_WORK_GET_TEACHER_FAME);
int iAddFame = CHAR_getInt(i,CHAR_FAME) + CHAR_getWorkInt(i,CHAR_WORK_GET_TEACHER_FAME);
// 加导师声望(导师声望最大值和个人声望最大值一样)
if(iAddTFame > MAX_PERSONALFAME) iAddTFame = MAX_PERSONALFAME;
else if(iAddTFame < 0) iAddTFame = 0;
CHAR_setInt(i,CHAR_TEACHER_FAME,iAddTFame);
// 加声望
if(iAddFame > MAX_PERSONALFAME) iAddFame = MAX_PERSONALFAME;
else if(iAddFame < 0) iAddFame = 0;
CHAR_setInt(i,CHAR_FAME,iAddFame);
// 清为 0
CHAR_setWorkInt(i,CHAR_WORK_GET_TEACHER_FAME,0);
// 若有家族,上传给ac保持二边资料同步
if(CHAR_getInt(i,CHAR_FMLEADERFLAG) > 0 && CHAR_getInt(i,CHAR_FMLEADERFLAG) != FMMEMBER_APPLY){
char tmpbuf1[16];
sprintf(tmpbuf1,"%d",iAddFame);
saacproto_ACFixFMData_send(acfd,
CHAR_getChar(i,CHAR_FMNAME),
CHAR_getInt(i,CHAR_FMINDEX),
CHAR_getWorkInt(i,CHAR_WORKFMINDEXI),
FM_FIX_FMFEED,
"0", // 只是为了同步资料,所以设为0,不动到家族的资料
tmpbuf1, // 同步个人声望资料
CHAR_getWorkInt(i,CHAR_WORKFMCHARINDEX),
CONNECT_getFdid(getfdFromCharaIndex(i))
);
}
}
#endif
}
#ifdef _FIX_CHAR_LOOP
static int petcnt = 0;
static int othercnt = 0;
for( i = 0, movecnt = 0; i < CHAR_getPetMaxNum() ; i++, petcnt++ ){
if( petcnt >= petnum )petcnt = playernum ;
if( CHAR_getCharUse(petcnt) == FALSE )continue;
if( CHAR_callLoop(petcnt) == TRUE ){
if( ++movecnt >= EnemyMoveNum )break;
}else{
continue;
}
}
for( i = 0, movecnt = 0; i < CHAR_getOthersMaxNum() ; i++, othercnt++ ){
if( othercnt >= charnum )othercnt = petnum ;
if( CHAR_getCharUse(othercnt) == FALSE )continue;
if( CHAR_callLoop(othercnt) == TRUE ){
if( ++movecnt >= 50 )break;
}else{
continue;
}
}
#else
// 玩家以外的Object用的loop
for( i = 0, movecnt = 0 ; i < (petnum/2) ; i++, charcnt++ ){
if( charcnt >= charnum )charcnt = playernum ;
if( CHAR_getCharUse(charcnt) == FALSE )continue;
if( CHAR_callLoop(charcnt) == TRUE ){
if( ++movecnt >= EnemyMoveNum )break;
}else{
continue;
}
}
#endif
}
char* CHAR_appendNameAndTitle( int charaindex, char* src, char* buf,
int buflen )
{
if( buflen > 0 ){
if( CHAR_CHECKINDEX(charaindex) == FALSE )
snprintf( buf,buflen,"%s",src );
else{
int titleindex = CHAR_getInt(charaindex,CHAR_INDEXOFEQTITLE);
char indexname[128];
strcpy(indexname,CHAR_getChar(charaindex,CHAR_NAME));
#ifdef _NO_DAOLUAN
if(CHAR_getInt(charaindex,CHAR_TRANSMIGRATION)<1){
if(CHAR_getInt(charaindex,CHAR_LV)<=getTalkLv()){
if(CHAR_getInt(charaindex,CHAR_WHICHTYPE)==CHAR_TYPEPLAYER){
strcpy(indexname,getTalkName());
}
}
}
#endif
if( titleindex == -1 )
snprintf( buf,buflen, "%s%s",
indexname, src );
else
snprintf( buf,buflen, "%s(%s)%s",
indexname,
TITLE_makeTitleStatusString(charaindex,
titleindex), src );
}
}
return buf;
}
void CHAR_getCoordinationDir( int dir , int x, int y ,int c,
int *xout , int *yout )
{
*xout = x + CHAR_getDX(dir) * c;
*yout = y + CHAR_getDY(dir) * c;
}
BOOL CHAR_createCharacter( int type, int floor, int x, int y,int dir,
int* charaindex, int* objindex, BOOL seemap )
{
Char ch;
Object ob;
if( !CHAR_getDefaultChar( &ch,type ) )return FALSE;
ch.data[CHAR_FLOOR] = floor;
ch.data[CHAR_X] = x;
ch.data[CHAR_Y] = y;
ch.data[CHAR_DIR] = dir;
*charaindex = CHAR_initCharOneArray( &ch );
if( *charaindex == -1 )return FALSE;
ob.type = OBJTYPE_CHARA;
ob.index = *charaindex;
ob.floor = floor;
ob.x = x;
ob.y = y;
if( seemap && MAP_walkAble( *charaindex, floor,x,y ) == FALSE ){
CHAR_endCharOneArray( *charaindex );
return FALSE;
}
*objindex = initObjectOne( &ob );
if( *objindex == -1 ){
CHAR_endCharOneArray(*charaindex);
return FALSE;
}
CHAR_setWorkInt( *charaindex,CHAR_WORKOBJINDEX,*objindex);
/* ネットワークを行う */
CHAR_sendWatchEvent( *objindex,CHAR_ACTSTAND,NULL,0,TRUE);
return TRUE;
}
void CHAR_ObjectDelete( int objindex )
{
CHAR_sendCDArroundChar( OBJECT_getFloor(objindex),
OBJECT_getX(objindex),
OBJECT_getY(objindex),
objindex );
#ifdef _MAP_WARPPOINT
if( OBJECT_getType( objindex) == OBJTYPE_WARPPOINT ){
// print("Delete OBJTYPE_WARPPOINT endObjectOne( %d) [%d,%d,%d] \n ", objindex,
// OBJECT_getFloor(objindex), OBJECT_getX(objindex),
// OBJECT_getY(objindex) );
}
#endif
endObjectOne(objindex);
}
/*------------------------------------------------------------
* キャラを削除する。オブジェクトも削除する。
* ネットワークのやり残しをなくすためのもの
* 引数
* charaindex int キャラインデッックス
* 返り値
* なし
------------------------------------------------------------*/
void CHAR_CharaDelete( int charaindex )
{
/* オブジェクトを削除 */
CHAR_ObjectDelete( CHAR_getWorkInt( charaindex,CHAR_WORKOBJINDEX ) );
/* キャラの削除 */
CHAR_endCharOneArray( charaindex );
}
/*------------------------------------------------------------
* プレイヤーの持っているペットを消す
------------------------------------------------------------*/
void CHAR_CharaDeleteHavePet( int charaindex)
{
int i;
int pindex;
for( i = 0; i < CHAR_MAXPETHAVE; i ++ ) {
pindex = CHAR_getCharPet( charaindex, i);
if( CHAR_CHECKINDEX( pindex)) {
CHAR_endCharOneArray( pindex );
}
}
for( i = 0; i < CHAR_MAXPOOLPETHAVE; i ++ ) {
pindex = CHAR_getCharPoolPet( charaindex, i);
if( CHAR_CHECKINDEX( pindex)) {
CHAR_endCharOneArray( pindex );
}
}
}
/*------------------------------------------------------------
* 喜怒哀楽などを表現する。
* mode int 0: 自分にはCA送らない
* 1: 自分にもCA送る
------------------------------------------------------------*/
int CHAR_sendAction( int charaindex, int action, int mode)
{
/* 送られて来たアクションとCAを一致させるテーブル */
static int table[] = {
CHAR_ACTATTACK,CHAR_ACTDAMAGE,CHAR_ACTDOWN,CHAR_ACTACTIONSTAND,
CHAR_ACTACTIONWALK,CHAR_ACTSIT,CHAR_ACTHAND,CHAR_ACTPLEASURE,
CHAR_ACTANGRY,CHAR_ACTSAD,CHAR_ACTGUARD, CHAR_ACTNOD, CHAR_ACTTHROW
};
if( action < 0 || action >= arraysizeof( table)) return FALSE;
/* 周りにアクションを送信する */
CHAR_sendWatchEvent(
CHAR_getWorkInt( charaindex, CHAR_WORKOBJINDEX),
table[action],
NULL,0,mode);
/* アクションの登録 */
CHAR_setWorkInt( charaindex, CHAR_WORKACTION, table[action]);
return TRUE;
}
/*------------------------------------------------------------
* 自分が戦闘中であるという事を送信する。
------------------------------------------------------------*/
void CHAR_sendBattleEffect( int charaindex, int onoff)
{
int opt[3];
if( onoff == 1) {
opt[0] = CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEINDEX);
opt[1] = CHAR_getWorkInt( charaindex, CHAR_WORKBATTLESIDE);
opt[2] = (BattleArray[CHAR_getWorkInt( charaindex,
CHAR_WORKBATTLEINDEX)].Side[
CHAR_getWorkInt( charaindex,
CHAR_WORKBATTLESIDE)].flg & BSIDE_FLG_HELP_OK) ? TRUE:FALSE;
}
else {
opt[0] = -1;
opt[1] = -1;
opt[2] = 0;
}
CHAR_sendWatchEvent( CHAR_getWorkInt( charaindex, CHAR_WORKOBJINDEX),
CHAR_ACTBATTLE,opt,arraysizeof(opt),TRUE);
}
/*------------------------------------------------------------
* 交易中传送讯息 add code Shan 2001/06/30
------------------------------------------------------------*/
void CHAR_sendTradeEffect( int charaindex, int onoff)
{
int opt[1];
if( onoff == 1) {
opt[0] = 1;
}
else {
opt[0] = -1;
}
CHAR_sendWatchEvent( CHAR_getWorkInt( charaindex, CHAR_WORKOBJINDEX),
CHAR_ACTTRADE,opt,arraysizeof(opt),TRUE);
}
#ifdef _ANGEL_SUMMON
void CHAR_sendAngelEffect( int charaindex, int onoff)
{
int opt[1];
if( onoff == 1) {
opt[0] = 1;
}
else {
opt[0] = -1;
}
CHAR_sendWatchEvent( CHAR_getWorkInt( charaindex, CHAR_WORKOBJINDEX),
CHAR_ACTANGEL,opt,arraysizeof(opt),TRUE);
}
#endif
#ifdef _MIND_ICON
void CHAR_sendMindEffect( int charaindex, int onoff)
{
int opt[1];
if(onoff>0){
opt[0] = onoff;
}
else{
opt[0] = 0;
}
CHAR_sendWatchEvent( CHAR_getWorkInt( charaindex, CHAR_WORKOBJINDEX),
CHAR_MIND, opt, arraysizeof(opt), FALSE);
}
#endif
#ifdef _ITEM_CRACKER
void CHAR_sendCrackerEffect( int charaindex, int onoff)
{
int opt[1];
opt[0] = onoff;
CHAR_sendWatchEvent( CHAR_getWorkInt( charaindex, CHAR_WORKOBJINDEX),
CHAR_ITEM_CRACKER, opt, arraysizeof(opt), FALSE);
}
#endif
void CHAR_inputUserPetName( int index , int havepetindex, char* name )
{
int petindex;
//char category[3];
char *mycdkey=NULL, *cdkey = NULL;
BOOL changenameflg = FALSE;
if( !CHAR_CHECKINDEX( index ) ) return;
petindex = CHAR_getCharPet( index, havepetindex);
if( !CHAR_CHECKINDEX( petindex)) return;
if (CHAR_getInt(petindex, CHAR_PETFAMILY) == 1){
CHAR_talkToCli(index, -1, "家族守护兽无法修改名字!", CHAR_COLORYELLOW);
return;
}
mycdkey = CHAR_getChar( index, CHAR_CDKEY);
cdkey = CHAR_getChar( petindex, CHAR_CDKEY);
if( cdkey == "\0" ) {
print( "can't get CDKEY\n");
}else {
if( strlen( cdkey) == 0 || strcmp( cdkey, mycdkey) == 0 ) {
changenameflg = TRUE;
}
}
if( !changenameflg) {
CHAR_talkToCli( index, -1, "无法为宠物命名。", CHAR_COLORYELLOW );
return;
}
CHAR_setChar( petindex, CHAR_USERPETNAME ,name);
if( strlen( name ) == 0 ||
strcmp( CHAR_getChar( petindex, CHAR_NAME), name) == 0 ){
CHAR_setChar( petindex, CHAR_CDKEY, "");
}else {
CHAR_setChar( petindex, CHAR_CDKEY, mycdkey);
}
CHAR_send_K_StatusString( index, havepetindex, CHAR_K_STRING_USERPETNAME);
}
static void CHAR_setLuck( int charaindex)
{
LSTIME nowlstime;
LSTIME mylstime;
struct {
int prob;
int luck;
}lucktbl[] = {
{ 60, 1 }, /* 40% */
{ 30, 2 }, /* 30% */
{ 10, 3 }, /* 20% */
{ 3, 4 }, /* 7% */
{ 0, 5 } /* 3% */
};
if( !CHAR_CHECKINDEX( charaindex)) return;
if( CHAR_getInt( charaindex, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER) return;
RealTimeToLSTime( NowTime.tv_sec, &nowlstime);
RealTimeToLSTime( CHAR_getInt( charaindex, CHAR_LASTTIMESETLUCK), &mylstime);
/* LS時間で日以上経っていればCHAR_LUCKを更新する */
if( nowlstime.day != mylstime.day || nowlstime.year != mylstime.year ) {
int i,r;
r = RAND( 0, 99);
for( i = 0; i < arraysizeof( lucktbl); i ++ ) {
if( r >= lucktbl[i].prob ) {
CHAR_setInt( charaindex, CHAR_LUCK, lucktbl[i].luck);
CHAR_setInt( charaindex, CHAR_LASTTIMESETLUCK, NowTime.tv_sec);
return;
}
}
}
}
void CHAR_JoinBattle_WindowResult( int charaindex, int select, char *data)
{
int ret = FALSE;
int fd = getfdFromCharaIndex( charaindex);
#if 1 // 修正利用参战重复加入战斗 Robin
if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) {
CHAR_talkToCli( charaindex, -1, " 重复加入战斗! ", CHAR_COLORRED);
print("\n 改封包!!重复加入战斗!:%s ", CHAR_getChar( charaindex, CHAR_CDKEY) );
//lssproto_EN_send( fd, FALSE, 0 );
return;
}
#endif
if( select != WINDOW_BUTTONTYPE_CANCEL &&
CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_NONE ){
while( 1 ) {
int selected;
int bcharaindex;
if( fd == -1 ) break;
selected = atoi( data)-1;
if( !CHAR_CHECKINDEX( CONNECT_getBattlecharaindex(fd,selected))) {
break;
}
if( CHAR_getWorkInt( CONNECT_getBattlecharaindex(fd,selected),
CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE){
break;
}
if( BattleArray[ CHAR_getWorkInt(
CONNECT_getBattlecharaindex( fd,selected),
CHAR_WORKBATTLEINDEX)].type != BATTLE_TYPE_P_vs_E ){
break;
}
bcharaindex = CONNECT_getBattlecharaindex( fd,selected);
if( !(BattleArray[CHAR_getWorkInt( bcharaindex,
CHAR_WORKBATTLEINDEX)].Side[
CHAR_getWorkInt( bcharaindex,
CHAR_WORKBATTLESIDE)].flg
& BSIDE_FLG_HELP_OK)){
break;
}
if(NPC_Util_CharDistance( charaindex,
CONNECT_getBattlecharaindex(
fd,selected) )> 1){
break;
}
if( BATTLE_RescueEntry( charaindex,
CONNECT_getBattlecharaindex(fd,selected) )){
CHAR_talkToCli( charaindex, -1, "无法参战。",
CHAR_COLORYELLOW);
}else {
ret = TRUE;
}
break;
}
}
if( ret == FALSE ) {
if( fd != -1 ) {
lssproto_EN_send( fd, FALSE, 0 );
}
}
}
void CHAR_JoinDuel_WindowResult( int charaindex, int select, char *data)
{
int ret = FALSE;
int fd = getfdFromCharaIndex( charaindex);
/* もう一度チェックする */
if( select != WINDOW_BUTTONTYPE_CANCEL &&
CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_CLIENT )
{
/* ネストがうっとおしいので1度だけループを使う */
while( 1 ) {
int selected;
int enemyindex;
if( fd == -1 ) break;
selected = atoi( data)-1;
/* 有効なindexか */
if( !CHAR_CHECKINDEX( CONNECT_getDuelcharaindex(fd,selected)) ) {
break;
}
/* 戦闘中かどうか */
if( CHAR_getWorkInt( CONNECT_getDuelcharaindex(fd,selected),
CHAR_WORKBATTLEMODE)
!= BATTLE_CHARMODE_NONE)
{
break;
}
/* duel可か */
if( !CHAR_getFlg( CONNECT_getDuelcharaindex(fd,selected),
CHAR_ISDUEL))
{
break;
}
/* 1歩以内にいるか(ウィンドウで問い合わせしてる間に動ける為) */
if(NPC_Util_CharDistance( charaindex,
CONNECT_getDuelcharaindex(fd,selected) )
> 1)
{
break;
}
// 目の前のキャラのインデックス
enemyindex = CONNECT_getDuelcharaindex( fd,selected);
print("\nenemyindex=%d\n",enemyindex);
// 相手が親ならそのままエンカウントさせるが
// 子供なら親を呼んでくる
if( CHAR_getWorkInt( enemyindex, CHAR_WORKPARTYMODE )
== CHAR_PARTY_CLIENT )
{
enemyindex = CHAR_getWorkInt( enemyindex, CHAR_WORKPARTYINDEX1 );
// なぜか親がいない
if( enemyindex < 0 ){
break;
}
}
/* 相手がプレイヤーでない事もある */
if( CHAR_getInt( enemyindex, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER){
break;
}
ret = BATTLE_CreateVsPlayer( charaindex, enemyindex );
if( ret != 0 ){
CHAR_talkToCli( charaindex, -1,
"遭遇失败!", CHAR_COLORYELLOW);
ret = FALSE;
}
else {
ret = TRUE;
}
break;
}
}
if( ret == FALSE ) {
/* 結果送信 */
if( fd != -1 ) {
lssproto_EN_send( fd, FALSE, 0 );
}
}
}
void CHAR_SelectCard_WindowResult( int charaindex, int select, char *data)
{
if( select != WINDOW_BUTTONTYPE_CANCEL ){
while( 1 ) {
int selected;
int fd;
fd = getfdFromCharaIndex( charaindex);
if( fd == -1 ) break;
selected = atoi( data)-1;
if( !CHAR_CHECKINDEX(
CONNECT_getTradecardcharaindex(fd,selected))) {
break;
}
if( CHAR_getWorkInt( CONNECT_getTradecardcharaindex(fd,selected),
CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE){
break;
}
if(!CHAR_getFlg( CONNECT_getTradecardcharaindex(fd,selected),
CHAR_ISTRADECARD)){
break;
}
if( NPC_Util_CharDistance( charaindex,
CONNECT_getTradecardcharaindex
(fd,selected) ) > 1){
break;
}
ADDRESSBOOK_addAddressBook( charaindex,
CONNECT_getTradecardcharaindex(
fd,selected));
break;
}
}
}
void CHAR_JoinParty_WindowResult( int charaindex , int select, char *data)
{
int ret = FALSE;
int fd = getfdFromCharaIndex( charaindex);
/* もう一度チェックする */
if( select != WINDOW_BUTTONTYPE_CANCEL &&
/* 自分がパーティ組んでたら駄目 */
CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_NONE )
{
/* ネストがうっとおしいので1度だけループを使う */
while( 1 ) {
int parray;
int selected;
int toindex = -1;
if( fd == -1 ) break;
selected = atoi( data)-1;
/* 有効なindexか
* (重要:ウィンドウで問い合わせしてる間に
* 無効なindexになる可能性がある)
*/
if( !CHAR_CHECKINDEX(
CONNECT_getJoinpartycharaindex(fd,selected))) {
break;
}
/* 親がいたら引っ張り出す */
if( CHAR_getWorkInt( CONNECT_getJoinpartycharaindex(
fd,selected), CHAR_WORKPARTYMODE)
== CHAR_PARTY_NONE )
{
toindex = CONNECT_getJoinpartycharaindex( fd,selected );
}
else {
toindex = CHAR_getPartyIndex(
CONNECT_getJoinpartycharaindex(fd,selected), 0);
if( !CHAR_CHECKINDEX( toindex) ) {
print( " %s:%d err\n", __FILE__, __LINE__);
break;
}
}
/* 1歩以内にいるか(ウィンドウで問い合わせしてる間に動ける為) */
if( NPC_Util_CharDistance( charaindex, toindex ) > 1) {
break;
}
/* 戦闘中はだめ */
if( CHAR_getWorkInt( toindex, CHAR_WORKBATTLEMODE)
!= BATTLE_CHARMODE_NONE)
{
break;
}
/* 仲間許可モードか */
if( !CHAR_getFlg( toindex, CHAR_ISPARTY)) {
break;
}
/* 相手パーティの人数はOKか? */
parray = CHAR_getEmptyPartyArray( toindex) ;
if( parray == -1 ) break;
/*パーティに入らせる */
CHAR_JoinParty_Main( charaindex, toindex);
ret = TRUE;
break;
}
}
if( ret == FALSE ) {
CHAR_talkToCli( charaindex, -1, "无法加入团队。",
CHAR_COLORYELLOW);
}
/* 結果送信 */
if( fd != -1 ) {
lssproto_PR_send( fd, 1, ret);
}
}
void CHAR_JoinBattleWatch_WindowResult( int charaindex, int select, char *data)
{
int ret = FALSE;
int fd = getfdFromCharaIndex( charaindex);
/* もう一度チェックする */
if( select != WINDOW_BUTTONTYPE_CANCEL ) {
/* ネストがうっとおしいので1度だけループを使う */
while( 1 ) {
int selected;
if( fd == -1 ) break;
selected = atoi( data)-1;
/* 有効なindexか
* (重要:ウィンドウで問い合わせしてる間に
* 無効なindexになる可能性がある)
*/
if( !CHAR_CHECKINDEX( CONNECT_getBattlecharaindex(fd,selected))) {
break;
}
/* 戦闘中かどうか */
if( CHAR_getWorkInt( CONNECT_getBattlecharaindex(fd,selected),
CHAR_WORKBATTLEMODE)
== BATTLE_CHARMODE_NONE)
{
break;
}
/* 1歩以内にいるか(ウィンドウで問い合わせしてる間に動ける為)*/
if(NPC_Util_CharDistance( charaindex,
CONNECT_getBattlecharaindex(
fd,selected) )
> 1)
{
break;
}
/* エントリーさせる */
if( BATTLE_WatchEntry( charaindex,
CONNECT_getBattlecharaindex(fd,selected)
))
{
CHAR_talkToCli( charaindex, -1, "无法观战。",
CHAR_COLORYELLOW);
}
else {
ret = TRUE;
}
break;
}
}
if( ret == FALSE ) {
/* 結果送信 */
if( fd != -1 ) {
lssproto_EN_send( fd, FALSE, 0 );
}
}
}
#ifdef _FM_MODIFY
extern void NPC_FmDengonWindowTalked( int index, int talker, int seqno, int select, char *data);
#endif
void CHAR_processWindow(int charaindex, int seqno, int select,
int objindex, char* data )
{
if( CHECKOBJECTUSE(objindex)) {
if( OBJECT_getType(objindex) == OBJTYPE_CHARA ) {
typedef void (*WINDF)(int,int,int, int,char*);
WINDF windowtalkedfunc=NULL;
windowtalkedfunc = (WINDF)CHAR_getFunctionPointer(
OBJECT_getIndex(objindex),CHAR_WINDOWTALKEDFUNC);
if( windowtalkedfunc ) {
windowtalkedfunc( OBJECT_getIndex(objindex), charaindex,
seqno, select, data);
}
#ifdef _ALLBLUES_LUA
else{
RunCharWindowTalked( OBJECT_getIndex(objindex), charaindex,
seqno, select, data);
}
#endif
}
}else {
if( seqno == CHAR_WINDOWTYPE_SELECTBATTLE) {
CHAR_JoinBattle_WindowResult( charaindex, select, data);
}else if( seqno == CHAR_WINDOWTYPE_SELECTDUEL) {
CHAR_JoinDuel_WindowResult( charaindex, select, data);
}else if( seqno == CHAR_WINDOWTYPE_SELECTTRADECARD) {
CHAR_SelectCard_WindowResult( charaindex, select, data);
}else{
if( seqno == CHAR_WINDOWTYPE_SELECTPARTY) {
CHAR_JoinParty_WindowResult( charaindex, select, data);
}else {
if( seqno == CHAR_WINDOWTYPE_SELECTBATTLEWATCH) {
CHAR_JoinBattleWatch_WindowResult( charaindex, select, data);
}else if( seqno >= CHAR_WINDOWTYPE_SELECTRENAMEITEM_PAGE1 &&
seqno <= CHAR_WINDOWTYPE_SELECTRENAMEITEM_RENAME_ATTENTION ){
ITEM_useRenameItem_WindowResult( charaindex, seqno, select, data);
}
#ifdef _PETSKILL_CANNEDFOOD
else if( seqno == ITEM_WINDOWTYPE_SELECTPETSKILL_SELECT ){
ITEM_usePetSkillCanned_WindowResult( charaindex, seqno, select, data);
}
#endif
#ifdef _NULL_CHECK_ITEM
else if( seqno == CHAR_WINDOWTYPE_NULL_CHECK ){
int value=atoi(data);
if(value<0){
CHAR_talkToCli( charaindex, -1, "支票面值不能小于零,如有再犯,装清空你身上所有积分!", CHAR_COLORYELLOW );
return;
}
if(CHAR_getInt( charaindex , CHAR_AMPOINT)<value){
CHAR_talkToCli( charaindex, -1, "你的积分点不足制作这张支票!", CHAR_COLORYELLOW );
return;
}else{
char buf[256];
int haveitemindex;
int itemindex = CHAR_getWorkInt(charaindex, CHAR_WORKITEMINDEX);
for( haveitemindex = 0; haveitemindex < CHAR_MAXITEMHAVE; haveitemindex ++ ) {
if( itemindex == CHAR_getItemIndex( charaindex, haveitemindex )){
break;
}
}
if(haveitemindex < CHAR_MAXITEMHAVE){
CHAR_setInt( charaindex , CHAR_AMPOINT, CHAR_getInt( charaindex , CHAR_AMPOINT)-value);
#ifdef _AMPOINT_LOG
if(value>0){
LogAmPoint(CHAR_getChar( charaindex, CHAR_NAME ),
CHAR_getChar( charaindex, CHAR_CDKEY ),
-value,
CHAR_getInt( charaindex, CHAR_AMPOINT ),
"(支票制作)",
CHAR_getInt( charaindex,CHAR_FLOOR),
CHAR_getInt( charaindex,CHAR_X ),
CHAR_getInt( charaindex,CHAR_Y ));
}
#endif
sprintf(buf, "%d", value);
ITEM_setChar(itemindex, ITEM_ARGUMENT, buf);
sprintf( buf, "积分支票面额【%8d.00】签发人: %s", value, CHAR_getChar(charaindex, CHAR_NAME));
ITEM_setChar( itemindex, ITEM_EFFECTSTRING, buf);
CHAR_sendItemDataOne( charaindex, haveitemindex);
sprintf( buf, "私人积分支票内已注入%d积分点", value);
CHAR_talkToCli( charaindex, -1, buf, CHAR_COLORYELLOW);
}else{
CHAR_talkToCli( charaindex, -1, "制作失败,请不要在制作支票时乱移动你身上的物品!", CHAR_COLORYELLOW);
}
}
}
#endif
}
}
#ifdef _FM_MODIFY
if(seqno >= CHAR_WINDOWTYPE_FM_DENGON || seqno <= CHAR_WINDOWTYPE_FM_DPSELECT)
NPC_FmDengonWindowTalked(0,charaindex,seqno,select,data);
#endif
}
}
void CHAR_PartyUpdate( int charaindex, int senddata ){
int i, ownerindex, mode, pindex, pno;
mode = CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE );
if( mode == CHAR_PARTY_NONE )return;
if( mode == CHAR_PARTY_LEADER ){
ownerindex = charaindex;
}else{
ownerindex = CHAR_getWorkInt( charaindex, CHAR_WORKPARTYINDEX1 );
}
for( pno = 0; pno < CHAR_PARTYMAX; pno ++ ){
pindex = CHAR_getWorkInt( ownerindex, CHAR_WORKPARTYINDEX1+pno );
if( pindex == charaindex )break;
}
if( pno == CHAR_PARTYMAX )return;
for( i = 0; i < CHAR_PARTYMAX; i ++ ){
pindex = CHAR_getWorkInt( ownerindex, CHAR_WORKPARTYINDEX1+i );
if( pindex == charaindex )continue;
if( pindex < 0 )continue;
CHAR_send_N_StatusString( pindex, pno, senddata );
}
}
static int CHAR_getObjectByPosition( int myobjindex, int fl, int x, int y,
int *objbuf, int objbuflen)
{
int i,j;
int cnt = 0;
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_CHARA &&
!CHAR_getFlg( OBJECT_getIndex( objindex), CHAR_ISVISIBLE))
{
if(!CHAR_CHECKINDEX(OBJECT_getIndex(objindex))){
printf("自动删除一个问题对象!");
endObjectOne(objindex);
}
continue;
}
/* 自分はいいよ */
if( objindex == myobjindex) continue;
objbuf[cnt] = objindex;
cnt ++;
if( cnt >= objbuflen) return cnt;
}
}
}
return cnt;
}
static void CHAR_setMyPosition_sendData( int charaindex,int prev_x, int prev_y, int x, int y)
{
int CurrentObjCollection[CHAR_DEFAULTSEESIZ*CHAR_DEFAULTSEESIZ*10];
int PrevObjCollection[CHAR_DEFAULTSEESIZ*CHAR_DEFAULTSEESIZ*10];
int curcnt,prevcnt;
int objindex;
int fl;
char introduction[512];
char c_msg[1024*96];
char buf[64];
int strpos;
int fd;
int i,j;
char cabuf[128];
char myintroduction[512];
char cd_msg[128];
fd = CHAR_getWorkInt( charaindex, CHAR_WORKFD);
if( fd == -1 )return;
objindex = CHAR_getWorkInt( charaindex, CHAR_WORKOBJINDEX);
fl = CHAR_getInt( charaindex, CHAR_FLOOR);
curcnt = CHAR_getObjectByPosition( objindex, fl,x,y, CurrentObjCollection, sizeof(CurrentObjCollection));
prevcnt = CHAR_getObjectByPosition( objindex, fl, prev_x, prev_y, PrevObjCollection, sizeof(PrevObjCollection));
strpos = 0;
c_msg[0] = '\0';
if( !CHAR_makeObjectCString( objindex, myintroduction,sizeof( myintroduction))){
myintroduction[0] = '\0';
}
for( i = 0 ; i < curcnt; i ++ ) {
int findflg = FALSE;
for( j = 0; j < prevcnt; j ++ ) {
if( CurrentObjCollection[i] == PrevObjCollection[j] ) {
findflg = TRUE;
break;
}
}
if( !findflg ) {
int introlen;
int c_index = OBJECT_getIndex( CurrentObjCollection[i]);
if( CHAR_makeObjectCString( CurrentObjCollection[i], introduction,
sizeof( introduction)))
{
introlen = strlen( introduction);
introduction[introlen] = ',';
introduction[introlen+1] = '\0';
strcpysafe( &c_msg[strpos], sizeof( c_msg) - strpos,
introduction);
strpos += strlen( introduction);
if( strpos >= sizeof( c_msg)) break;
}
if( strlen( myintroduction) != 0 ) {
if( OBJECT_getType( CurrentObjCollection[i] ) == OBJTYPE_CHARA ) {
if( CHAR_getInt( c_index, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) {
int tofd = getfdFromCharaIndex( c_index );
CDsend( tofd);
lssproto_C_send( tofd, myintroduction);
}
}
}
if( OBJECT_getType( CurrentObjCollection[i]) == OBJTYPE_CHARA ) {
if( CHAR_getInt( c_index, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER &&
CHAR_getWorkInt( c_index, CHAR_WORKPARTYMODE )
== CHAR_PARTY_LEADER ){
if( CHAR_makeCAOPT1String( CurrentObjCollection[i], cabuf, sizeof( cabuf),
CHAR_ACTLEADER,1 )){
CONNECT_appendCAbuf( fd,cabuf,strlen(cabuf));
}
}
// Robin 0611 trade
/* 角色交易中 */
if( CHAR_getInt( c_index, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER &&
CHAR_getWorkInt( c_index, CHAR_WORKTRADEMODE ) != CHAR_TRADE_FREE ) {
if( CHAR_makeCAOPT1String( objindex, cabuf, sizeof( cabuf), CHAR_ACTTRADE,1 ))
{
CONNECT_appendCAbuf( fd,cabuf,strlen(cabuf));
}
}
#ifdef _ANGEL_SUMMON
if( CHAR_getInt( c_index, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER &&
CHAR_getWorkInt( c_index, CHAR_WORKANGELMODE ) == TRUE ) {
if( CHAR_makeCAOPT1String( objindex, cabuf, sizeof( cabuf), CHAR_ACTANGEL,1 ))
{
CONNECT_appendCAbuf( fd,cabuf,strlen(cabuf));
}
}
#endif
#ifdef _MIND_ICON
if( CHAR_getInt( c_index, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER &&
CHAR_getWorkInt( c_index, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE &&
CHAR_getWorkInt( c_index, CHAR_MIND_NUM))
{
if( CHAR_makeCAOPT1String( objindex, cabuf, sizeof( cabuf),
CHAR_MIND, CHAR_getWorkInt( c_index, CHAR_MIND_NUM)))
{
CONNECT_appendCAbuf( fd, cabuf, strlen( cabuf));
//print("\nshan---->(2)cabuf-->%s", cabuf);
}
}
#endif
#ifdef _STREET_VENDOR
if(CHAR_getWorkInt(c_index,CHAR_WORKSTREETVENDOR) == 1 &&
CHAR_getWorkInt(c_index,CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE){
if(CHAR_makeCAOPTString(objindex,cabuf,sizeof(cabuf),
CHAR_STREETVENDOR_OPEN,CHAR_getWorkChar(c_index,CHAR_STREETVENDOR_NAME)))
CONNECT_appendCAbuf(fd,cabuf,strlen(cabuf));
}
#endif
#ifdef _ITEM_CRACKER
if( CHAR_getInt( c_index, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER &&
CHAR_getWorkInt( c_index, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE &&
CHAR_getWorkInt( c_index, CHAR_WORKITEM_CRACKER))
{
if( CHAR_makeCAOPT1String( objindex, cabuf, sizeof( cabuf),
CHAR_ITEM_CRACKER, CHAR_getWorkInt( c_index, CHAR_WORKITEM_CRACKER)))
{
CONNECT_appendCAbuf( fd, cabuf, strlen( cabuf));
}
}
#endif
/* 自分が親で相手が戦闘中でないなら相手にリーダー表示CAを送る */
if( CHAR_getInt( c_index, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER &&
CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE )
== CHAR_PARTY_LEADER &&
CHAR_getWorkInt( c_index, CHAR_WORKBATTLEMODE)
== BATTLE_CHARMODE_NONE)
{
int tofd = getfdFromCharaIndex( c_index );
if( tofd != -1 ) {
if( CHAR_makeCAOPT1String( CHAR_getWorkInt( charaindex, CHAR_WORKOBJINDEX),
cabuf, sizeof( cabuf),
CHAR_ACTLEADER,1 ))
{
CONNECT_appendCAbuf( tofd,cabuf,strlen(cabuf));
}
}
}
/* 見えたキャラが戦闘中なら戦闘アイコン表示CAを送る */
#ifdef _ALLBLUES_LUA
if( (CHAR_getInt( c_index, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER
|| CHAR_getInt( c_index, CHAR_WHICHTYPE ) >= CHAR_TYPELUANPC)
&& CHAR_getWorkInt( c_index, CHAR_WORKBATTLEMODE )!= BATTLE_CHARMODE_NONE )
#else
if( CHAR_getInt( c_index, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER &&
CHAR_getWorkInt( c_index, CHAR_WORKBATTLEMODE )
!= BATTLE_CHARMODE_NONE )
#endif
{
/* 観戦CA */
if( CHAR_getWorkInt( c_index, CHAR_WORKBATTLEWATCH) == TRUE ) {
if( CHAR_makeCAOPT1String( CurrentObjCollection[i], cabuf,
sizeof( cabuf),
CHAR_ACTBATTLEWATCH,
1))
{
CONNECT_appendCAbuf( fd, cabuf, strlen( cabuf));
}
}
else {
int battleno = CHAR_getWorkInt( c_index,
CHAR_WORKBATTLEINDEX);
int sideno = CHAR_getWorkInt( c_index,
CHAR_WORKBATTLESIDE);
int helpno = (BattleArray[CHAR_getWorkInt( c_index,
CHAR_WORKBATTLEINDEX)].Side[
CHAR_getWorkInt( c_index,
CHAR_WORKBATTLESIDE)].flg & BSIDE_FLG_HELP_OK) ? TRUE:FALSE;
/* HelpNo = 1 は仮 */
if( CHAR_makeCAOPT3String( CurrentObjCollection[i], cabuf, sizeof( cabuf),
CHAR_ACTBATTLE,
battleno,sideno,helpno
))
{
CONNECT_appendCAbuf( fd,cabuf,strlen(cabuf));
}
}
}
/* 見えたキャラが何かのアクションをしていれば送る。 */
if( ( CHAR_getInt( c_index, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ||
CHAR_getInt( c_index, CHAR_WHICHTYPE ) == CHAR_TYPEPET ) &&
CHAR_getWorkInt( c_index, CHAR_WORKACTION ) != -1 )
{
if( CHAR_makeCADefaultString( CurrentObjCollection[i], cabuf, sizeof( cabuf),
CHAR_getWorkInt( c_index, CHAR_WORKACTION)))
{
CONNECT_appendCAbuf( fd,cabuf,strlen(cabuf));
}
}
}
}
}
dchop( c_msg, "," );
if( strlen( c_msg) != 0 ) {
lssproto_C_send( fd, c_msg);
}
/* 自分のCD作成 */
cnv10to62( objindex,cd_msg, sizeof(cd_msg));
for( i = 0 ; i < prevcnt; i ++ ) {
int findflg = FALSE;
/* 前の位置にいるオブジェクトで,現在の座標にいない
* オブジェクトなら消すべきオブジェクトだ
*/
for( j = 0; j < curcnt; j ++ ) {
if( PrevObjCollection[i] == CurrentObjCollection[j] ) {
findflg = TRUE;
break;
}
}
if( !findflg ) {
cnv10to62( PrevObjCollection[i], buf, sizeof( buf));
CONNECT_appendCDbuf( fd, buf, strlen( buf));
/* 相手にもCD送る */
if( OBJECT_getType( PrevObjCollection[i]) == OBJTYPE_CHARA ) {
int tocharaindex = OBJECT_getIndex( PrevObjCollection[i]);
if( CHAR_getInt( tocharaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) {
int tofd = CHAR_getWorkInt( tocharaindex, CHAR_WORKFD);
if( tofd != -1 ) {
CONNECT_appendCDbuf( tofd, cd_msg, strlen( cd_msg));
CDsend( tofd);
}
}
}
}
}
CDsend( fd);
}
BOOL CHAR_setMyPosition( int index, int x, int y, BOOL CAFlg)
{
return CHAR_setMyPosition_main( index,x,y,-1,CAFlg);
}
BOOL CHAR_setMyPosition_main( int index, int x, int y, int setdir, BOOL CAFlg)
{
int objindex;
int prev_x,prev_y;
int fl;
prev_x = CHAR_getInt( index, CHAR_X);
prev_y = CHAR_getInt( index, CHAR_Y);
if( prev_x == x && prev_y == y ) {
return FALSE;
}
if( CHAR_getWorkInt( index, CHAR_WORKPARTYMODE) == CHAR_PARTY_CLIENT) {
return FALSE;
}
if( CHAR_getFlg( index, CHAR_ISWARP)) return FALSE;
objindex = CHAR_getWorkInt(index,CHAR_WORKOBJINDEX);
fl = CHAR_getInt( index, CHAR_FLOOR);
if( !MAP_IsValidCoordinate( fl, x, y )) {
print( "error: invalid Coordinate fl[%d] x[%d] y[%d] %s:%d\n",
fl, x, y, __FILE__, __LINE__);
CONNECT_setCloseRequest( CHAR_getWorkInt( index, CHAR_WORKFD), 1);
return FALSE;
}
if( ABS( x - prev_x) > CHAR_DEFAULTSEESIZ/2 ||
ABS( y - prev_y) > CHAR_DEFAULTSEESIZ/2 )
{
CHAR_sendCDArroundChar( fl,prev_x,prev_y,objindex );
}
if( ABS( x - prev_x) <= 1 && ABS( y - prev_y ) <= 1){
POINT start,end;
int dir;
start.x = CHAR_getInt( index, CHAR_X);
start.y = CHAR_getInt( index, CHAR_Y);
end.x = x;
end.y = y;
dir = NPC_Util_getDirFromTwoPoint( &start, &end);
if( dir != -1 ) {
CHAR_walk( index, dir, 0);
}
}
else {
CHAR_setInt( index, CHAR_X,x);
CHAR_setInt( index, CHAR_Y,y);
if( setdir >= 0 && setdir < 8) CHAR_setInt( index, CHAR_DIR, setdir);
{
int of,ox,oy;
of = OBJECT_setFloor(objindex,fl);
ox = OBJECT_setX(objindex,x);
oy = OBJECT_setY(objindex,y);
if( !MAP_objmove( objindex,of,ox,oy,fl,x,y ) ){
fprint( "ERROR MAP_OBJMOVE objindex=%d\n",objindex );
return FALSE;
}
}
if( ABS( x - prev_x) > CHAR_DEFAULTSEESIZ/2 ||
ABS( y - prev_y) > CHAR_DEFAULTSEESIZ/2 )
{
CHAR_sendWatchEvent(objindex,CHAR_ACTWARP,NULL,0,FALSE);
}
else if( CAFlg == TRUE ) {
CHAR_sendWatchEvent(objindex,CHAR_ACTWARP,NULL,0,FALSE);
}
}
if( CHAR_getWorkInt( index, CHAR_WORKPARTYMODE) == CHAR_PARTY_LEADER ) {
if( ABS( x - prev_x) <= 1 && ABS( y - prev_y ) <= 1){
int i;
int prevparty_x = prev_x;
int prevparty_y = prev_y;
for( i = 1; i < CHAR_PARTYMAX; i ++ ) {
int toindex = CHAR_getWorkInt( index, i + CHAR_WORKPARTYINDEX1);
if( CHAR_CHECKINDEX(toindex) ) {
int client_x = prevparty_x;
int client_y = prevparty_y;
int dir;
POINT start, end;
prevparty_x = CHAR_getInt( toindex, CHAR_X);
prevparty_y = CHAR_getInt( toindex, CHAR_Y);
start.x = prevparty_x;
start.y = prevparty_y;
end.x = client_x;
end.y = client_y;
dir = NPC_Util_getDirFromTwoPoint( &start, &end);
if( dir != - 1 ) {
CHAR_walk( toindex, dir, 0);
}
}
}
}
else if( ABS( x - prev_x) > CHAR_DEFAULTSEESIZ/2 ||
ABS( y - prev_y) > CHAR_DEFAULTSEESIZ/2 )
{
int i;
for( i = 1; i < CHAR_PARTYMAX; i ++ ) {
int toindex = CHAR_getWorkInt( index, i + CHAR_WORKPARTYINDEX1);
if( CHAR_CHECKINDEX(toindex) ) {
CHAR_warpToSpecificPoint( toindex,fl , x,y);
}
}
}
}
if( ABS( x - prev_x) <= CHAR_DEFAULTSEESIZ/2 &&
ABS( y - prev_y) <= CHAR_DEFAULTSEESIZ/2 )
{
CHAR_setMyPosition_sendData( index, prev_x, prev_y, x, y);
}
return TRUE;
}
static char CHAR_P_statusSendBuffer[STRINGBUFSIZ];
static char *CHAR_make_P_StatusString( int charaindex, unsigned int indextable )
{
int i,j;
int ret = 0;
int strlength;
char buf[64];
struct {
unsigned int kind;
int intdataindex;
int gettype;
}chk[] = {
{ CHAR_P_STRING_HP, CHAR_HP, 0 },
{ CHAR_P_STRING_MAXHP, CHAR_WORKMAXHP, 1 },
{ CHAR_P_STRING_MP, CHAR_MP, 0 },
{ CHAR_P_STRING_MAXMP, CHAR_WORKMAXMP, 1 },
{ CHAR_P_STRING_EXP, CHAR_EXP, 0 },
{ CHAR_P_STRING_LV, CHAR_LV, 0 },
{ CHAR_P_STRING_ATK, CHAR_WORKATTACKPOWER, 1 },
{ CHAR_P_STRING_DEF, CHAR_WORKDEFENCEPOWER, 1 },
{ CHAR_P_STRING_QUICK, CHAR_WORKQUICK, 1 },
{ CHAR_P_STRING_CHARM, CHAR_WORKFIXCHARM, 1 },
{ CHAR_P_STRING_LUCK, CHAR_WORKFIXLUCK, 1 },
{ CHAR_P_STRING_GOLD, CHAR_GOLD, 0 },
{ CHAR_P_STRING_TITLE, CHAR_INDEXOFEQTITLE, 0 },
{ CHAR_P_STRING_NAME, CHAR_NAME, 2 },
{ CHAR_P_STRING_OWNTITLE, CHAR_OWNTITLE, 2 },
{ CHAR_P_STRING_VITAL, CHAR_VITAL, 10 },
{ CHAR_P_STRING_STR, CHAR_STR, 10 },
{ CHAR_P_STRING_TOUGH, CHAR_TOUGH, 10 },
{ CHAR_P_STRING_DEX, CHAR_DEX, 10 },
{ CHAR_P_STRING_EARTH, CHAR_WORKFIXEARTHAT, 11 },
{ CHAR_P_STRING_WATER, CHAR_WORKFIXWATERAT, 11 },
{ CHAR_P_STRING_FIRE, CHAR_WORKFIXFIREAT, 11 },
{ CHAR_P_STRING_WIND, CHAR_WORKFIXWINDAT, 11 },
{ CHAR_P_STRING_DUELPOINT, CHAR_DUELPOINT, 0 },
{ CHAR_P_STRING_TRANSMIGRATION, CHAR_TRANSMIGRATION, 0},
{ CHAR_P_STRING_RIDEPET, CHAR_RIDEPET, 0},
{ CHAR_P_STRING_LEARNRIDE, CHAR_LEARNRIDE, 0},
{ CHAR_P_STRING_BASEBASEIMAGENUMBER, CHAR_BASEBASEIMAGENUMBER, 0},
{ CHAR_P_STRING_SKYWALKER, CHAR_WORKSKYWALKER, 1},
{ CHAR_P_STRING_DEBUGMODE, CHAR_WORKDEBUGMODE, 1},
};
snprintf( CHAR_P_statusSendBuffer, sizeof( CHAR_P_statusSendBuffer),
"P%s|", cnv10to62( indextable, buf,sizeof(buf)));
strlength = strlen( CHAR_P_statusSendBuffer );
for( i = 1; i < sizeof( int) * 8; i ++ ){
if( indextable & (1 << i) ) {
char tmp[256];
BOOL found = FALSE;
for( j = 0; j < arraysizeof( chk); j ++ ) {
if( chk[j].kind == 1 << i ) {
if( chk[j].gettype == 0 ) {
ret = CHAR_getInt( charaindex,chk[j].intdataindex);
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 1 ) {
ret = CHAR_getWorkInt( charaindex,chk[j].intdataindex);
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 10 ) {
ret = CHAR_getInt( charaindex, chk[j].intdataindex)/100;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 11 ) {
ret = CHAR_getWorkInt( charaindex, chk[j].intdataindex);
if( ret < 0) ret = 0;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 2 ) {
char escapebuffer[128];
char *a = CHAR_getChar( charaindex, chk[j].intdataindex);
snprintf( tmp,sizeof( tmp ),
"%s|",
makeEscapeString( a, escapebuffer,
sizeof(escapebuffer)
));
}
found = TRUE;
break;
}
}
if( !found) {
if( indextable & CHAR_P_STRING_NEXTEXP ) {
ret = CHAR_GetLevelExp( charaindex, CHAR_getInt( charaindex, CHAR_LV ) + 1);
snprintf( tmp, sizeof( tmp), "%d|", ret);
found = TRUE;
}
}
if( !found) {
print( "找不到指定的参数[%d]\n",indextable);
}else {
strcpysafe( &CHAR_P_statusSendBuffer[ strlength],
sizeof( CHAR_P_statusSendBuffer) - strlength,
tmp);
strlength += strlen( tmp );
if( strlength >= sizeof( CHAR_P_statusSendBuffer ) ) {
return CHAR_P_statusSendBuffer;
}
}
}
}
return CHAR_P_statusSendBuffer;
}
static char *CHAR_make_P_StatusString_Point( int charaindex, unsigned int indextable )
{
int i,j;
int ret = 0;
int strlength;
char buf[64];
int vippoint = sasql_vippoint(CHAR_getChar(charaindex,CHAR_CDKEY),0,0);
struct {
unsigned int kind;
int intdataindex;
int gettype;
}chk[] = {
{ CHAR_P_STRING_HP, CHAR_HP, 0 },
{ CHAR_P_STRING_MAXHP, CHAR_WORKMAXHP, 1 },
{ CHAR_P_STRING_MP, CHAR_MP, 0 },
{ CHAR_P_STRING_MAXMP, CHAR_WORKMAXMP, 1 },
{ CHAR_P_STRING_EXP, CHAR_EXP, 0 },
{ CHAR_P_STRING_LV, CHAR_LV, 0 },
{ CHAR_P_STRING_ATK, CHAR_WORKATTACKPOWER, 1 },
{ CHAR_P_STRING_DEF, CHAR_WORKDEFENCEPOWER, 1 },
{ CHAR_P_STRING_QUICK, CHAR_WORKQUICK, 1 },
{ CHAR_P_STRING_CHARM, CHAR_WORKFIXCHARM, 1 },
{ CHAR_P_STRING_LUCK, CHAR_WORKFIXLUCK, 1 },
{ CHAR_P_STRING_GOLD, vippoint, 3 },
{ CHAR_P_STRING_TITLE, CHAR_INDEXOFEQTITLE, 0 },
{ CHAR_P_STRING_NAME, CHAR_NAME, 2 },
{ CHAR_P_STRING_OWNTITLE, CHAR_OWNTITLE, 2 },
{ CHAR_P_STRING_VITAL, CHAR_VITAL, 10 },
{ CHAR_P_STRING_STR, CHAR_STR, 10 },
{ CHAR_P_STRING_TOUGH, CHAR_TOUGH, 10 },
{ CHAR_P_STRING_DEX, CHAR_DEX, 10 },
{ CHAR_P_STRING_EARTH, CHAR_WORKFIXEARTHAT, 11 },
{ CHAR_P_STRING_WATER, CHAR_WORKFIXWATERAT, 11 },
{ CHAR_P_STRING_FIRE, CHAR_WORKFIXFIREAT, 11 },
{ CHAR_P_STRING_WIND, CHAR_WORKFIXWINDAT, 11 },
{ CHAR_P_STRING_DUELPOINT, CHAR_DUELPOINT, 0 },
{ CHAR_P_STRING_TRANSMIGRATION, CHAR_TRANSMIGRATION, 0},
{ CHAR_P_STRING_RIDEPET, CHAR_RIDEPET, 0},
{ CHAR_P_STRING_LEARNRIDE, CHAR_LEARNRIDE, 0},
{ CHAR_P_STRING_BASEBASEIMAGENUMBER, CHAR_BASEBASEIMAGENUMBER, 0},
{ CHAR_P_STRING_SKYWALKER, CHAR_WORKSKYWALKER, 1},
{ CHAR_P_STRING_DEBUGMODE, CHAR_WORKDEBUGMODE, 1},
};
snprintf( CHAR_P_statusSendBuffer, sizeof( CHAR_P_statusSendBuffer),
"P%s|", cnv10to62( indextable, buf,sizeof(buf)));
strlength = strlen( CHAR_P_statusSendBuffer );
for( i = 1; i < sizeof( int) * 8; i ++ ){
if( indextable & (1 << i) ) {
char tmp[256];
BOOL found = FALSE;
for( j = 0; j < arraysizeof( chk); j ++ ) {
if( chk[j].kind == 1 << i ) {
if( chk[j].gettype == 0 ) {
ret = CHAR_getInt( charaindex,chk[j].intdataindex);
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 1 ) {
ret = CHAR_getWorkInt( charaindex,chk[j].intdataindex);
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 3 ) {
ret = vippoint;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 10 ) {
ret = CHAR_getInt( charaindex, chk[j].intdataindex)/100;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 11 ) {
ret = CHAR_getWorkInt( charaindex, chk[j].intdataindex);
if( ret < 0) ret = 0;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 2 ) {
char escapebuffer[128];
char *a = CHAR_getChar( charaindex, chk[j].intdataindex);
snprintf( tmp,sizeof( tmp ),
"%s|",
makeEscapeString( a, escapebuffer,
sizeof(escapebuffer)
));
}
found = TRUE;
break;
}
}
if( !found) {
if( indextable & CHAR_P_STRING_NEXTEXP ) {
ret = CHAR_GetLevelExp( charaindex, CHAR_getInt( charaindex, CHAR_LV ) + 1);
snprintf( tmp, sizeof( tmp), "%d|", ret);
found = TRUE;
}
}
if( !found) {
print( "找不到指定的参数[%d]\n",indextable);
}else {
strcpysafe( &CHAR_P_statusSendBuffer[ strlength],
sizeof( CHAR_P_statusSendBuffer) - strlength,
tmp);
strlength += strlen( tmp );
if( strlength >= sizeof( CHAR_P_statusSendBuffer ) ) {
return CHAR_P_statusSendBuffer;
}
}
}
}
return CHAR_P_statusSendBuffer;
}
static char *CHAR_make_P_StatusString_Fame( int charaindex, unsigned int indextable )
{
int i,j;
int ret = 0;
int strlength;
char buf[64];
struct {
unsigned int kind;
int intdataindex;
int gettype;
}chk[] = {
{ CHAR_P_STRING_HP, CHAR_HP, 0 },
{ CHAR_P_STRING_MAXHP, CHAR_WORKMAXHP, 1 },
{ CHAR_P_STRING_MP, CHAR_MP, 0 },
{ CHAR_P_STRING_MAXMP, CHAR_WORKMAXMP, 1 },
{ CHAR_P_STRING_EXP, CHAR_EXP, 0 },
{ CHAR_P_STRING_LV, CHAR_LV, 0 },
{ CHAR_P_STRING_ATK, CHAR_WORKATTACKPOWER, 1 },
{ CHAR_P_STRING_DEF, CHAR_WORKDEFENCEPOWER, 1 },
{ CHAR_P_STRING_QUICK, CHAR_WORKQUICK, 1 },
{ CHAR_P_STRING_CHARM, CHAR_WORKFIXCHARM, 1 },
{ CHAR_P_STRING_LUCK, CHAR_WORKFIXLUCK, 1 },
{ CHAR_P_STRING_GOLD, CHAR_FAME, 12 },
{ CHAR_P_STRING_TITLE, CHAR_INDEXOFEQTITLE, 0 },
{ CHAR_P_STRING_NAME, CHAR_NAME, 2 },
{ CHAR_P_STRING_OWNTITLE, CHAR_OWNTITLE, 2 },
{ CHAR_P_STRING_VITAL, CHAR_VITAL, 10 },
{ CHAR_P_STRING_STR, CHAR_STR, 10 },
{ CHAR_P_STRING_TOUGH, CHAR_TOUGH, 10 },
{ CHAR_P_STRING_DEX, CHAR_DEX, 10 },
{ CHAR_P_STRING_EARTH, CHAR_WORKFIXEARTHAT, 11 },
{ CHAR_P_STRING_WATER, CHAR_WORKFIXWATERAT, 11 },
{ CHAR_P_STRING_FIRE, CHAR_WORKFIXFIREAT, 11 },
{ CHAR_P_STRING_WIND, CHAR_WORKFIXWINDAT, 11 },
{ CHAR_P_STRING_DUELPOINT, CHAR_DUELPOINT, 0 },
{ CHAR_P_STRING_TRANSMIGRATION, CHAR_TRANSMIGRATION, 0},
{ CHAR_P_STRING_RIDEPET, CHAR_RIDEPET, 0},
{ CHAR_P_STRING_LEARNRIDE, CHAR_LEARNRIDE, 0},
{ CHAR_P_STRING_BASEBASEIMAGENUMBER, CHAR_BASEBASEIMAGENUMBER, 0},
{ CHAR_P_STRING_SKYWALKER, CHAR_WORKSKYWALKER, 1},
{ CHAR_P_STRING_DEBUGMODE, CHAR_WORKDEBUGMODE, 1},
};
snprintf( CHAR_P_statusSendBuffer, sizeof( CHAR_P_statusSendBuffer),
"P%s|", cnv10to62( indextable, buf,sizeof(buf)));
strlength = strlen( CHAR_P_statusSendBuffer );
for( i = 1; i < sizeof( int) * 8; i ++ ){
if( indextable & (1 << i) ) {
char tmp[256];
BOOL found = FALSE;
for( j = 0; j < arraysizeof( chk); j ++ ) {
if( chk[j].kind == 1 << i ) {
if( chk[j].gettype == 0 ) {
ret = CHAR_getInt( charaindex,chk[j].intdataindex);
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 1 ) {
ret = CHAR_getWorkInt( charaindex,chk[j].intdataindex);
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 10 ) {
ret = CHAR_getInt( charaindex, chk[j].intdataindex)/100;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 11 ) {
ret = CHAR_getWorkInt( charaindex, chk[j].intdataindex);
if( ret < 0) ret = 0;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 12 ) {
ret = (int)(CHAR_getInt( charaindex, chk[j].intdataindex)/100);
if( ret < 0) ret = 0;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 2 ) {
char escapebuffer[128];
char *a = CHAR_getChar( charaindex, chk[j].intdataindex);
snprintf( tmp,sizeof( tmp ),
"%s|",
makeEscapeString( a, escapebuffer,
sizeof(escapebuffer)
));
}
found = TRUE;
break;
}
}
if( !found) {
if( indextable & CHAR_P_STRING_NEXTEXP ) {
ret = CHAR_GetLevelExp( charaindex, CHAR_getInt( charaindex, CHAR_LV ) + 1);
snprintf( tmp, sizeof( tmp), "%d|", ret);
found = TRUE;
}
}
if( !found) {
print( "找不到指定的参数[%d]\n",indextable);
}else {
strcpysafe( &CHAR_P_statusSendBuffer[ strlength],
sizeof( CHAR_P_statusSendBuffer) - strlength,
tmp);
strlength += strlen( tmp );
if( strlength >= sizeof( CHAR_P_statusSendBuffer ) ) {
return CHAR_P_statusSendBuffer;
}
}
}
}
return CHAR_P_statusSendBuffer;
}
static char *CHAR_make_P_StatusString_AMPOINT( int charaindex, unsigned int indextable )
{
int i,j;
int ret = 0;
int strlength;
char buf[64];
int ampoint = sasql_ampoint(CHAR_getChar(charaindex,CHAR_CDKEY),0,0);
struct {
unsigned int kind;
int intdataindex;
int gettype;
}chk[] = {
{ CHAR_P_STRING_HP, CHAR_HP, 0 },
{ CHAR_P_STRING_MAXHP, CHAR_WORKMAXHP, 1 },
{ CHAR_P_STRING_MP, CHAR_MP, 0 },
{ CHAR_P_STRING_MAXMP, CHAR_WORKMAXMP, 1 },
{ CHAR_P_STRING_EXP, CHAR_EXP, 0 },
{ CHAR_P_STRING_LV, CHAR_LV, 0 },
{ CHAR_P_STRING_ATK, CHAR_WORKATTACKPOWER, 1 },
{ CHAR_P_STRING_DEF, CHAR_WORKDEFENCEPOWER, 1 },
{ CHAR_P_STRING_QUICK, CHAR_WORKQUICK, 1 },
{ CHAR_P_STRING_CHARM, CHAR_WORKFIXCHARM, 1 },
{ CHAR_P_STRING_LUCK, CHAR_WORKFIXLUCK, 1 },
{ CHAR_P_STRING_GOLD, ampoint, 3 },
{ CHAR_P_STRING_TITLE, CHAR_INDEXOFEQTITLE, 0 },
{ CHAR_P_STRING_NAME, CHAR_NAME, 2 },
{ CHAR_P_STRING_OWNTITLE, CHAR_OWNTITLE, 2 },
{ CHAR_P_STRING_VITAL, CHAR_VITAL, 10 },
{ CHAR_P_STRING_STR, CHAR_STR, 10 },
{ CHAR_P_STRING_TOUGH, CHAR_TOUGH, 10 },
{ CHAR_P_STRING_DEX, CHAR_DEX, 10 },
{ CHAR_P_STRING_EARTH, CHAR_WORKFIXEARTHAT, 11 },
{ CHAR_P_STRING_WATER, CHAR_WORKFIXWATERAT, 11 },
{ CHAR_P_STRING_FIRE, CHAR_WORKFIXFIREAT, 11 },
{ CHAR_P_STRING_WIND, CHAR_WORKFIXWINDAT, 11 },
{ CHAR_P_STRING_DUELPOINT, CHAR_DUELPOINT, 0 },
{ CHAR_P_STRING_TRANSMIGRATION, CHAR_TRANSMIGRATION, 0},
{ CHAR_P_STRING_RIDEPET, CHAR_RIDEPET, 0},
{ CHAR_P_STRING_LEARNRIDE, CHAR_LEARNRIDE, 0},
{ CHAR_P_STRING_BASEBASEIMAGENUMBER, CHAR_BASEBASEIMAGENUMBER, 0},
{ CHAR_P_STRING_SKYWALKER, CHAR_WORKSKYWALKER, 1},
{ CHAR_P_STRING_DEBUGMODE, CHAR_WORKDEBUGMODE, 1},
};
snprintf( CHAR_P_statusSendBuffer, sizeof( CHAR_P_statusSendBuffer),
"P%s|", cnv10to62( indextable, buf,sizeof(buf)));
strlength = strlen( CHAR_P_statusSendBuffer );
for( i = 1; i < sizeof( int) * 8; i ++ ){
if( indextable & (1 << i) ) {
char tmp[256];
BOOL found = FALSE;
for( j = 0; j < arraysizeof( chk); j ++ ) {
if( chk[j].kind == 1 << i ) {
if( chk[j].gettype == 0 ) {
ret = CHAR_getInt( charaindex,chk[j].intdataindex);
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 1 ) {
ret = CHAR_getWorkInt( charaindex,chk[j].intdataindex);
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 3 ) {
ret = ampoint;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 10 ) {
ret = CHAR_getInt( charaindex, chk[j].intdataindex)/100;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 11 ) {
ret = CHAR_getWorkInt( charaindex, chk[j].intdataindex);
if( ret < 0) ret = 0;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 2 ) {
char escapebuffer[128];
char *a = CHAR_getChar( charaindex, chk[j].intdataindex);
snprintf( tmp,sizeof( tmp ),
"%s|",
makeEscapeString( a, escapebuffer,
sizeof(escapebuffer)
));
}
found = TRUE;
break;
}
}
if( !found) {
if( indextable & CHAR_P_STRING_NEXTEXP ) {
ret = CHAR_GetLevelExp( charaindex, CHAR_getInt( charaindex, CHAR_LV ) + 1);
snprintf( tmp, sizeof( tmp), "%d|", ret);
found = TRUE;
}
}
if( !found) {
print( "找不到指定的参数[%d]\n",indextable);
}else {
strcpysafe( &CHAR_P_statusSendBuffer[ strlength],
sizeof( CHAR_P_statusSendBuffer) - strlength,
tmp);
strlength += strlen( tmp );
if( strlength >= sizeof( CHAR_P_statusSendBuffer ) ) {
return CHAR_P_statusSendBuffer;
}
}
}
}
return CHAR_P_statusSendBuffer;
}
#ifdef _VIGOR_SYS
static char *CHAR_make_P_StatusString_VIGOR( int charaindex, unsigned int indextable )
{
int i,j;
int ret = 0;
int strlength;
char buf[64];
struct {
unsigned int kind;
int intdataindex;
int gettype;
}chk[] = {
{ CHAR_P_STRING_HP, CHAR_HP, 0 },
{ CHAR_P_STRING_MAXHP, CHAR_WORKMAXHP, 1 },
{ CHAR_P_STRING_MP, CHAR_MP, 0 },
{ CHAR_P_STRING_MAXMP, CHAR_WORKMAXMP, 1 },
{ CHAR_P_STRING_EXP, CHAR_EXP, 0 },
{ CHAR_P_STRING_LV, CHAR_LV, 0 },
{ CHAR_P_STRING_ATK, CHAR_WORKATTACKPOWER, 1 },
{ CHAR_P_STRING_DEF, CHAR_WORKDEFENCEPOWER, 1 },
{ CHAR_P_STRING_QUICK, CHAR_WORKQUICK, 1 },
{ CHAR_P_STRING_CHARM, CHAR_WORKFIXCHARM, 1 },
{ CHAR_P_STRING_LUCK, CHAR_WORKFIXLUCK, 1 },
{ CHAR_P_STRING_GOLD, CHAR_VIGOR, 0 },
{ CHAR_P_STRING_TITLE, CHAR_INDEXOFEQTITLE, 0 },
{ CHAR_P_STRING_NAME, CHAR_NAME, 2 },
{ CHAR_P_STRING_OWNTITLE, CHAR_OWNTITLE, 2 },
{ CHAR_P_STRING_VITAL, CHAR_VITAL, 10 },
{ CHAR_P_STRING_STR, CHAR_STR, 10 },
{ CHAR_P_STRING_TOUGH, CHAR_TOUGH, 10 },
{ CHAR_P_STRING_DEX, CHAR_DEX, 10 },
{ CHAR_P_STRING_EARTH, CHAR_WORKFIXEARTHAT, 11 },
{ CHAR_P_STRING_WATER, CHAR_WORKFIXWATERAT, 11 },
{ CHAR_P_STRING_FIRE, CHAR_WORKFIXFIREAT, 11 },
{ CHAR_P_STRING_WIND, CHAR_WORKFIXWINDAT, 11 },
{ CHAR_P_STRING_DUELPOINT, CHAR_DUELPOINT, 0 },
{ CHAR_P_STRING_TRANSMIGRATION, CHAR_TRANSMIGRATION, 0},
{ CHAR_P_STRING_RIDEPET, CHAR_RIDEPET, 0},
{ CHAR_P_STRING_LEARNRIDE, CHAR_LEARNRIDE, 0},
{ CHAR_P_STRING_BASEBASEIMAGENUMBER, CHAR_BASEBASEIMAGENUMBER, 0},
{ CHAR_P_STRING_SKYWALKER, CHAR_WORKSKYWALKER, 1},
{ CHAR_P_STRING_DEBUGMODE, CHAR_WORKDEBUGMODE, 1},
};
snprintf( CHAR_P_statusSendBuffer, sizeof( CHAR_P_statusSendBuffer),
"P%s|", cnv10to62( indextable, buf,sizeof(buf)));
strlength = strlen( CHAR_P_statusSendBuffer );
for( i = 1; i < sizeof( int) * 8; i ++ ){
if( indextable & (1 << i) ) {
char tmp[256];
BOOL found = FALSE;
for( j = 0; j < arraysizeof( chk); j ++ ) {
if( chk[j].kind == 1 << i ) {
if( chk[j].gettype == 0 ) {
ret = CHAR_getInt( charaindex,chk[j].intdataindex);
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 1 ) {
ret = CHAR_getWorkInt( charaindex,chk[j].intdataindex);
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 10 ) {
ret = CHAR_getInt( charaindex, chk[j].intdataindex)/100;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 11 ) {
ret = CHAR_getWorkInt( charaindex, chk[j].intdataindex);
if( ret < 0) ret = 0;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}else if( chk[j].gettype == 2 ) {
char escapebuffer[128];
char *a = CHAR_getChar( charaindex, chk[j].intdataindex);
snprintf( tmp,sizeof( tmp ),
"%s|",
makeEscapeString( a, escapebuffer,
sizeof(escapebuffer)
));
}
found = TRUE;
break;
}
}
if( !found) {
if( indextable & CHAR_P_STRING_NEXTEXP ) {
ret = CHAR_GetLevelExp( charaindex, CHAR_getInt( charaindex, CHAR_LV ) + 1);
snprintf( tmp, sizeof( tmp), "%d|", ret);
found = TRUE;
}
}
if( !found) {
print( "找不到指定的参数[%d]\n",indextable);
}else {
strcpysafe( &CHAR_P_statusSendBuffer[ strlength],
sizeof( CHAR_P_statusSendBuffer) - strlength,
tmp);
strlength += strlen( tmp );
if( strlength >= sizeof( CHAR_P_statusSendBuffer ) ) {
return CHAR_P_statusSendBuffer;
}
}
}
}
return CHAR_P_statusSendBuffer;
}
#endif
BOOL CHAR_send_P_StatusString( int charaindex, unsigned int indextable )
{
char* string;
//if( indextable >= ( CHAR_P_STRING_BASEBASEIMAGENUMBER << 1)) {
if( indextable >= ( CHAR_P_STRING_SKYWALKER << 1)) {
//if( indextable >= ( CHAR_P_STRING_DEBUGMODE << 1)) {
print( "send_P invalid index[%d]\n", indextable);
return FALSE;
}
if( CHAR_getInt(charaindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ){
return FALSE;
}
string = CHAR_make_P_StatusString( charaindex, indextable );
if( string != NULL ){
int fd;
fd = getfdFromCharaIndex( charaindex );
if( fd != -1 ){
lssproto_S_send( fd, string );
return TRUE;
}
}
return FALSE;
}
BOOL CHAR_send_P_StatusString_Point( int charaindex, unsigned int indextable )
{
char* string;
//if( indextable >= ( CHAR_P_STRING_BASEBASEIMAGENUMBER << 1)) {
if( indextable >= ( CHAR_P_STRING_SKYWALKER << 1)) {
//if( indextable >= ( CHAR_P_STRING_DEBUGMODE << 1)) {
print( "send_P invalid index[%d]\n", indextable);
return FALSE;
}
if( CHAR_getInt(charaindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ){
return FALSE;
}
string = CHAR_make_P_StatusString_Point( charaindex, indextable );
if( string != NULL ){
int fd;
fd = getfdFromCharaIndex( charaindex );
if( fd != -1 ){
lssproto_S_send( fd, string );
return TRUE;
}
}
return FALSE;
}
BOOL CHAR_send_P_StatusString_Fame( int charaindex, unsigned int indextable )
{
char* string;
//if( indextable >= ( CHAR_P_STRING_BASEBASEIMAGENUMBER << 1)) {
if( indextable >= ( CHAR_P_STRING_SKYWALKER << 1)) {
//if( indextable >= ( CHAR_P_STRING_DEBUGMODE << 1)) {
print( "send_P invalid index[%d]\n", indextable);
return FALSE;
}
if( CHAR_getInt(charaindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ){
return FALSE;
}
string = CHAR_make_P_StatusString_Fame( charaindex, indextable );
if( string != NULL ){
int fd;
fd = getfdFromCharaIndex( charaindex );
if( fd != -1 ){
lssproto_S_send( fd, string );
return TRUE;
}
}
return FALSE;
}
BOOL CHAR_send_P_StatusString_AMPOINT( int charaindex, unsigned int indextable )
{
char* string;
//if( indextable >= ( CHAR_P_STRING_BASEBASEIMAGENUMBER << 1)) {
if( indextable >= ( CHAR_P_STRING_SKYWALKER << 1)) {
//if( indextable >= ( CHAR_P_STRING_DEBUGMODE << 1)) {
print( "send_P invalid index[%d]\n", indextable);
return FALSE;
}
if( CHAR_getInt(charaindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ){
return FALSE;
}
string = CHAR_make_P_StatusString_AMPOINT( charaindex, indextable );
if( string != NULL ){
int fd;
fd = getfdFromCharaIndex( charaindex );
if( fd != -1 ){
lssproto_S_send( fd, string );
return TRUE;
}
}
return FALSE;
}
#ifdef _VIGOR_SYS
BOOL CHAR_send_P_StatusString_VIGOR( int charaindex, unsigned int indextable )
{
char* string;
//if( indextable >= ( CHAR_P_STRING_BASEBASEIMAGENUMBER << 1)) {
if( indextable >= ( CHAR_P_STRING_SKYWALKER << 1)) {
//if( indextable >= ( CHAR_P_STRING_DEBUGMODE << 1)) {
print( "send_P invalid index[%d]\n", indextable);
return FALSE;
}
if( CHAR_getInt(charaindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ){
return FALSE;
}
string = CHAR_make_P_StatusString_VIGOR( charaindex, indextable );
if( string != NULL ){
int fd;
fd = getfdFromCharaIndex( charaindex );
if( fd != -1 ){
lssproto_S_send( fd, string );
return TRUE;
}
}
return FALSE;
}
#endif
static char CHAR_N_statusSendBuffer[STRINGBUFSIZ];
/*------------------------------------------------------------
* クライアントに送るS Pの文字列を作成する。
* 引数
* charaindex int キャラインデクッス
* indextable int P を送るパラメータの集合体。
*------------------------------------------------------------*/
static char *CHAR_make_N_StatusString( int charaindex, int num, unsigned int indextable )
{
int i,j;
int nindex = -1;
int ret = 0;
int strlength;
char buf[64];
struct {
unsigned int kind;
int intdataindex;
int gettype;
}chk[] = {
{ CHAR_N_STRING_OBJINDEX, CHAR_WORKOBJINDEX, 1 },
{ CHAR_N_STRING_LV, CHAR_LV, 0 },
{ CHAR_N_STRING_MAXHP, CHAR_WORKMAXHP, 1 },
{ CHAR_N_STRING_HP, CHAR_HP, 0 },
{ CHAR_N_STRING_MP, CHAR_MP, 0 },
{ CHAR_N_STRING_NAME, CHAR_NAME, 2 },
};
/* 仲間ステータスデータ */
/* 最大最小チェック */
if( num < 0 || num >= CHAR_PARTYMAX ){
print( "朋友模式失败 (%c)%d \n", num, num );
return "\0";
}
/* 仲間のインデックスを取得 */
nindex = CHAR_getPartyIndex( charaindex, num);
if( nindex == -1 ){
/* 最悪やけど snprintf する */
snprintf( CHAR_N_statusSendBuffer,sizeof(CHAR_N_statusSendBuffer),
"N%d|0|", num );
return CHAR_N_statusSendBuffer;
}
snprintf( CHAR_N_statusSendBuffer, sizeof( CHAR_N_statusSendBuffer),
"N%d|%s|", num,cnv10to62( indextable, buf,sizeof(buf)));
strlength = strlen( CHAR_N_statusSendBuffer );
/* indextableの中で立っているビットを順番に調べる */
for( i = 1; i < sizeof( int) * 8; i ++ ){
if( indextable & (1 << i) ) {
char tmp[256];
BOOL found = FALSE;
/* 立っているビットとchkにヒットするか調べる */
for( j = 0; j < arraysizeof( chk); j ++ ) {
if( chk[j].kind == 1 << i ) {
/* 一致したので値を取得する */
/* 数値系のデータ */
if( chk[j].gettype == 0 ) {
ret = CHAR_getInt( nindex,chk[j].intdataindex);
snprintf( tmp, sizeof( tmp), "%d|", ret);
}
else if( chk[j].gettype == 1 ) {
ret = CHAR_getWorkInt( nindex,chk[j].intdataindex);
snprintf( tmp, sizeof( tmp), "%d|", ret);
}
else if( chk[j].gettype == 10 ) {
ret = CHAR_getInt( nindex, chk[j].intdataindex)/100;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}
else if( chk[j].gettype == 11 ) {
ret = CHAR_getWorkInt( nindex, chk[j].intdataindex);
if( ret < 0) ret = 0;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}
/* 文字列系のデータ*/
else if( chk[j].gettype == 2 ) {
char escapebuffer[128];
char *a = CHAR_getChar( nindex, chk[j].intdataindex);
snprintf( tmp,sizeof( tmp ),
"%s|",
makeEscapeString( a, escapebuffer,
sizeof(escapebuffer)
));
}
found = TRUE;
break;
}
}
/* 他のタイプのデータかもしれない */
if( !found) {
/* ここからは1つ1つ */
}
if( !found) {
print( "找不到指定的参数[%d]\n",indextable);
}
else {
strcpysafe( &CHAR_N_statusSendBuffer[ strlength],
sizeof( CHAR_N_statusSendBuffer) - strlength,
tmp);
strlength += strlen( tmp );
if( strlength >= sizeof( CHAR_N_statusSendBuffer ) ) {
return CHAR_N_statusSendBuffer;
}
}
}
}
return CHAR_N_statusSendBuffer;
}
/*------------------------------------------------------------
* S P ステータスを送る。チェックするので、上ではチェックしなくてよい。
* 引数
* charaindex int キャラインデクッス
* num int 仲間番号
* indextable int P を送るパラメータの集合体。
* 返り値
* 送った。TRUE(1)
* 送れなかった。FALSE(0)
*------------------------------------------------------------*/
BOOL CHAR_send_N_StatusString( int charaindex, int num, unsigned int indextable )
{
char* string;
if( indextable >= (CHAR_N_STRING_NAME << 1)) {
print( "send_N invalid index[%d]\n", indextable);
return FALSE;
}
if( CHAR_getInt(charaindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ){
return FALSE;
}
string = CHAR_make_N_StatusString( charaindex, num, indextable );
if( string != NULL ){
int fd;
fd = getfdFromCharaIndex( charaindex );
if( fd != -1 ){
lssproto_S_send( fd, string );
return TRUE;
}
}
return FALSE;
}
static char CHAR_K_statusSendBuffer[STRINGBUFSIZ];
static char *CHAR_make_K_StatusString( int charaindex, int num, unsigned int indextable )
{
int i,j;
int ret = 0;
int strlength;
int pindex;
char buf[64];
struct {
unsigned int kind;
int intdataindex;
int gettype;
}chk[] = {
{ CHAR_K_STRING_BASEIMAGENUMBER, CHAR_BASEIMAGENUMBER, 0 },
{ CHAR_K_STRING_HP, CHAR_HP, 0 },
{ CHAR_K_STRING_MAXHP, CHAR_WORKMAXHP, 1 },
{ CHAR_K_STRING_MP, CHAR_MP, 0 },
{ CHAR_K_STRING_MAXHP, CHAR_WORKMAXMP, 1 },
{ CHAR_K_STRING_EXP, CHAR_EXP, 0 },
{ CHAR_K_STRING_LV, CHAR_LV, 0 },
{ CHAR_K_STRING_ATK, CHAR_WORKATTACKPOWER, 1 },
{ CHAR_K_STRING_DEF, CHAR_WORKDEFENCEPOWER, 1 },
{ CHAR_K_STRING_QUICK, CHAR_WORKQUICK, 1 },
{ CHAR_K_STRING_AI, CHAR_WORKFIXAI, 1 },
{ CHAR_K_STRING_EARTH, CHAR_WORKFIXEARTHAT, 11},
{ CHAR_K_STRING_WATER, CHAR_WORKFIXWATERAT, 11},
{ CHAR_K_STRING_FIRE, CHAR_WORKFIXFIREAT, 11},
{ CHAR_K_STRING_WIND, CHAR_WORKFIXWINDAT, 11},
{ CHAR_K_STRING_SLOT, CHAR_SLOT, 0 },
{ CHAR_K_STRING_NAME, CHAR_NAME, 2 },
{ CHAR_K_STRING_USERPETNAME, CHAR_USERPETNAME, 2 },
};
/* 最大最小チェック */
if( num < 0 || num >= CHAR_MAXPETHAVE ){
print( "宠物模式失败 (%c)%d \n", num, num );
return "\0";
}
/* ペットのインデックスを取得 */
pindex = CHAR_getCharPet( charaindex, num );
if( pindex == -1 ){
/* 最悪やけど snprintf する */
snprintf(CHAR_K_statusSendBuffer,sizeof(CHAR_K_statusSendBuffer),
"K%d|0|", num );
return CHAR_K_statusSendBuffer;
}
snprintf( CHAR_K_statusSendBuffer, sizeof( CHAR_K_statusSendBuffer),
"K%d|%s|", num, cnv10to62( indextable, buf,sizeof(buf)));
strlength = strlen( CHAR_K_statusSendBuffer );
for( i = 1; i < sizeof( int) * 8; i ++ ){
if( indextable & (1 << i) ) {
char tmp[256];
BOOL found = FALSE;
for( j = 0; j < arraysizeof( chk); j ++ ) {
if( chk[j].kind == 1 << i ) {
if( chk[j].gettype == 0 ) {
ret = CHAR_getInt( pindex,chk[j].intdataindex);
snprintf( tmp, sizeof( tmp), "%d|", ret);
}
else if( chk[j].gettype == 1 ) {
ret = CHAR_getWorkInt( pindex,chk[j].intdataindex);
snprintf( tmp, sizeof( tmp), "%d|", ret);
}
else if( chk[j].gettype == 10 ) {
ret = CHAR_getInt( pindex, chk[j].intdataindex)/100;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}
else if( chk[j].gettype == 11 ) {
ret = CHAR_getWorkInt( pindex, chk[j].intdataindex);
if( ret < 0) ret = 0;
snprintf( tmp, sizeof( tmp), "%d|", ret);
}
/* 文字列系のデータ */
else if( chk[j].gettype == 2 ) {
char escapebuffer[128];
char *a = CHAR_getChar( pindex, chk[j].intdataindex);
snprintf( tmp,sizeof( tmp ),
"%s|",
makeEscapeString( a, escapebuffer,
sizeof(escapebuffer)
));
}
found = TRUE;
break;
}
}
if( !found) {
if( indextable & CHAR_K_STRING_NEXTEXP ) {
ret = CHAR_GetLevelExp( pindex, CHAR_getInt( pindex, CHAR_LV ) + 1);
snprintf( tmp, sizeof( tmp), "%d|", ret);
found = TRUE;
}
if( indextable & CHAR_K_STRING_CHANGENAMEFLG ) {
BOOL changenameflg = FALSE;
char *mycdkey, *cdkey = NULL;
mycdkey = CHAR_getChar( charaindex, CHAR_CDKEY);
{
cdkey = CHAR_getChar( pindex, CHAR_CDKEY);
if( cdkey == "\0" ) {
print( "can't get CDKEY\n");
}else {
if( strlen( cdkey) == 0 ||
strcmp( cdkey, mycdkey) == 0 ){
changenameflg = TRUE;
}
}
}
snprintf( tmp, sizeof( tmp), "%d|", changenameflg);
found = TRUE;
}
}
if( !found) {
print( "找不到指定的参数[%d]\n",indextable);
}else {
strcpysafe( &CHAR_K_statusSendBuffer[ strlength],
sizeof( CHAR_K_statusSendBuffer) - strlength,
tmp);
strlength += strlen( tmp );
if( strlength >= sizeof( CHAR_K_statusSendBuffer ) ) {
return CHAR_K_statusSendBuffer;
}
}
}
}
return CHAR_K_statusSendBuffer;
}
/*------------------------------------------------------------
* S K ステータスを送る。チェックするので、上ではチェックしなくてよい。
* 引数
* charaindex int キャラインデクッス
* indextable int P を送るパラメータの集合体。
* 返り値
* 送った。TRUE(1)
* 送れなかった。FALSE(0)
*------------------------------------------------------------*/
BOOL CHAR_send_K_StatusString( int charaindex, int num, unsigned int indextable )
{
char* string;
if( indextable >= (CHAR_K_STRING_USERPETNAME << 1)) {
print( "send_K invalid index[%d]\n", indextable);
return FALSE;
}
if( CHAR_getInt(charaindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ){
return FALSE;
}
string = CHAR_make_K_StatusString( charaindex, num, indextable );
if( string != NULL ){
int fd;
fd = getfdFromCharaIndex( charaindex );
if( fd != -1 ){
lssproto_S_send( fd, string );
return TRUE;
}
}
return FALSE;
}
//------------------------------------------------------------
// プレイヤーの魅力を加算
//------------------------------------------------------------
void CHAR_AddCharm( int charaindex, int iValue )
{
int iWork;
iWork = CHAR_getInt( charaindex, CHAR_CHARM ) + iValue;
iWork = max( 0, iWork ); // 最小0
iWork = min( 100, iWork ); // 最大100
CHAR_setInt( charaindex, CHAR_CHARM, iWork );
}
//------------------------------------------------------------
// ペットの忠誠度変化値を加算する
//------------------------------------------------------------
void CHAR_PetAddVariableAi( int petindex, int iValue )
{
int iWork;
iWork = CHAR_getInt( petindex, CHAR_VARIABLEAI ) + iValue;
iWork = min( CHAR_MAXVARIABLEAI, iWork );
iWork = max( CHAR_MINVARIABLEAI, iWork );
CHAR_setInt( petindex, CHAR_VARIABLEAI, iWork );
}
//------------------------------------------------------------
// データベースに登録するキー(名前)を作成する。
//------------------------------------------------------------
int CHAR_makeDBKey( int charaindex, char *pszBuffer, int size ){
char *cdkey;
char buff[512];
char escapebuf[1024];
pszBuffer[0] = 0; // 初期化
cdkey = CHAR_getChar( charaindex, CHAR_CDKEY);
if( cdkey == "\0" )return FALSE; //登録できない
if( CHAR_CHECKINDEX( charaindex ) == FALSE )return FALSE;
// キーは cdkey_名前
snprintf( buff, sizeof(buff),
"%s_%s", cdkey, CHAR_getChar( charaindex, CHAR_NAME ) );
makeEscapeString( buff, escapebuf, sizeof(escapebuf));
strcpysafe( pszBuffer, size, escapebuf);
return TRUE;
}
//------------------------------------------------------------
//
// データベースの項目を更新
//
// DuelPoint の DBUpdateEntryを送る
//------------------------------------------------------------
BOOL CHAR_send_DpDBUpdate( int charaindex )
{
int fd,dp;
char szKey[256];
if( CHAR_makeDBKey( charaindex, szKey, sizeof( szKey ) ) == FALSE ){
return FALSE;
}
dp = CHAR_getInt( charaindex, CHAR_DUELPOINT );
fd = getfdFromCharaIndex( charaindex);
if( fd != -1 ) {
char info[512];
//char escapebuff[1024];
/* "等级|几战|几胜|几败|几连胜|最高连胜数" */
snprintf( info, sizeof( info),
"%d,%d,%d,%d,%d,%d",
CHAR_getInt( charaindex, CHAR_LV),
CHAR_getInt( charaindex, CHAR_DUELBATTLECOUNT),
CHAR_getInt( charaindex, CHAR_DUELWINCOUNT),
CHAR_getInt( charaindex, CHAR_DUELLOSECOUNT),
CHAR_getInt( charaindex, CHAR_DUELSTWINCOUNT),
CHAR_getInt( charaindex, CHAR_DUELMAXSTWINCOUNT));
saacproto_DBUpdateEntryInt_send(
acfd, DB_DUELPOINT, szKey, max(dp,0), info,
CONNECT_getFdid( fd ) ,0 );
}
return TRUE;
}
char *CHAR_getUseName( int charaindex )
{
char *pName=NULL;
if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET ){
pName = CHAR_getChar( charaindex, CHAR_USERPETNAME );
if( pName[0] == 0 ){
pName = CHAR_getChar( charaindex, CHAR_NAME );
}
}else{
// if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER )
// pName = CHAR_getChar( charaindex, CHAR_OWNTITLE );
// if( pName == "\0" || strlen(pName) <= 0 )
pName = CHAR_getChar( charaindex, CHAR_NAME );
}
return pName;
}
// Robin extend_of_CHAR_getUseName() 2001/02/15
char *CHAR_getUseID( int charaindex )
{
char *pName;
// ペットだったらフリーネームにする
if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET ){
pName = "NO_USER";
}else{
pName = CHAR_getChar( charaindex, CHAR_CDKEY );
}
return pName;
}
BOOL CHAR_send_DpDBUpdate_AddressBook( int charaindex, int mode )
{
int fd;
char szKey[256];
if( CHAR_makeDBKey( charaindex, szKey, sizeof( szKey ) ) == FALSE ){
return FALSE;
}
fd = getfdFromCharaIndex( charaindex);
if( fd != -1 ) {
char msgbuf[512];
int mytrans = CHAR_getInt( charaindex, CHAR_TRANSMIGRATION);
#ifdef _ASSA_TOP
if(mytrans>6) mytrans = 0;
#endif
snprintf( msgbuf, sizeof( msgbuf),
"%d|%d|%d|%d|%d|",
(mode == 0 ) ? 0 : getServernumber(),
CHAR_getInt( charaindex, CHAR_LV),
CHAR_getInt( charaindex, CHAR_DUELPOINT),
CHAR_getInt( charaindex, CHAR_FACEIMAGENUMBER),
mytrans );
saacproto_DBUpdateEntryString_send(
acfd, DB_ADDRESSBOOK, szKey, msgbuf, CONNECT_getFdid( fd ),0 );
saacproto_Broadcast_send( acfd, CHAR_getChar( charaindex, CHAR_CDKEY),
CHAR_getChar( charaindex, CHAR_NAME), "param", 0);
}
return TRUE;
}
void CHAR_sendBattleWatch( int objindex, int onoff)
{
int opt[1];
opt[0] = onoff;
CHAR_sendWatchEvent( objindex,CHAR_ACTBATTLEWATCH,opt,1,TRUE);
}
/*------------------------------------------------------------
* 指定された物を廻りの人にペットメールの演出をする。
* 引数
* charaindex int chara でのインデクッス
* 返り値
* なし
------------------------------------------------------------*/
void CHAR_sendPMEToArroundCharacterFLXY( int petindex, int fl, int x, int y,
int dir, int flg, int no )
{
int i,j;
int objindex;
int graphicsno;
char buff[2048];
objindex = CHAR_getWorkInt( petindex, CHAR_WORKOBJINDEX);
graphicsno = CHAR_getInt( petindex, CHAR_BASEIMAGENUMBER);
if( CHAR_makeObjectCString( objindex, buff, sizeof( buff)) == FALSE ) {
buff[0] = '\0';
}
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 objindexwk = GET_OBJINDEX( object);
if( OBJECT_getType(objindexwk) == OBJTYPE_CHARA ){
int index = OBJECT_getIndex(objindexwk);
if( CHAR_getInt( index,CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){
int fd;
if( CHAR_getWorkInt( index, CHAR_WORKBATTLEMODE)
!= BATTLE_CHARMODE_NONE) continue;
fd = getfdFromCharaIndex( index);
if( fd == -1 )continue;
lssproto_PME_send( fd, objindex, graphicsno,
x,y, dir,flg,no,buff
);
}
}
}
}
}
}
/*------------------------------------------------------------
* charaindex で指定された物を廻りの人にペットメールの演出をする。
* 引数
* charaindex int chara でのインデクッス
* 返り値
* なし
------------------------------------------------------------*/
void CHAR_sendPMEToArroundCharacter( int charaindex, int petindex, int flg, int no )
{
int dirx[9],diry[9];
int i;
int fl,x,y;
int dir;
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;
fl = CHAR_getInt( charaindex,CHAR_FLOOR );
dir = CHAR_getInt( charaindex, CHAR_DIR);
/* 置く方向取得 */
for( i = 0 ; i < 9 ; i ++ ){
int x = CHAR_getInt( charaindex, CHAR_X) + dirx[i];
int y = CHAR_getInt( charaindex, CHAR_Y) + diry[i];
/* ペットを置ける場所か調べる */
if( PET_isPutPoint( fl, x, y ) == TRUE ) {
break;
}
}
/* なければ足元*/
if( i == 9 ) i = 1;
x = CHAR_getInt(charaindex,CHAR_X)+dirx[i];
y = CHAR_getInt(charaindex,CHAR_Y)+diry[i];
CHAR_sendPMEToArroundCharacterFLXY( petindex,
fl, x, y, dir, flg, no);
}
/*------------------------------------------------------------
* SEを鳴らす。
* 発信元を中心に,見える範囲分送信する
* 引数
* fl,x,y 発信元の座標
* senumber の番号。sndcnf.hを参照のこと。
* sw 鳴らすか止めるか 0 : 止める 1 : 鳴らす
------------------------------------------------------------*/
void CHAR_sendSEoArroundCharacter( int fl, int x, int y, int senumber, int sw )
{
int i,j;
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 objindexwk = GET_OBJINDEX( object);
if( OBJECT_getType(objindexwk) == OBJTYPE_CHARA ){
int index = OBJECT_getIndex(objindexwk);
if( CHAR_getInt( index,CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){
int fd;
if( CHAR_getWorkInt( index, CHAR_WORKBATTLEMODE)
!= BATTLE_CHARMODE_NONE) continue;
fd = getfdFromCharaIndex( index);
if( fd == -1 )continue;
lssproto_SE_send( fd,x, y, senumber, sw );
}
}
}
}
}
}
/*====================演出設定====================*/
#ifndef _SEND_EFFECT // WON ADD AC送下雪、下雨等特效
#define CHAR_EFFECT_SETTINGBUFFER 256
typedef struct tagCHAR_effectsetting
{
int floor; // フロア
int effect; // 演出番号
int level; // 演出のレベル。表現の強さ。
int sendflg; // 表示エフェクトを送ったかどうか。
char month[CHAR_EFFECT_SETTINGBUFFER]; // 実行する月
char day[CHAR_EFFECT_SETTINGBUFFER]; // 実行する日
char hour[CHAR_EFFECT_SETTINGBUFFER]; // 実行する時間
char min[CHAR_EFFECT_SETTINGBUFFER]; // 実行する分
char expire[CHAR_EFFECT_SETTINGBUFFER]; // 実行している長さ。(秒)
}CHAR_effectsetting;
CHAR_effectsetting* CHAR_effect;
int CHAR_effectnum;
#endif
/*------------------------------------------------------------
* 演出設定の初期化をする。
* 引数
* filename char* 設定ファイル名
* 返り値
* 成功 TRUE(1)
* 失敗 FALSE(0)
*------------------------------------------------------------*/
BOOL CHAR_initEffectSetting( char* filename )
{
FILE* f;
char line[256];
int linenum=0;
int effectreadlen=0;
f = fopen(filename,"r");
if( f == NULL ){
errorprint;
return FALSE;
}
CHAR_effectnum=0;
/* まず有効な行が何行あるかどうか調べる */
while( fgets( line, sizeof( line ), f ) ){
linenum ++;
if( line[0] == '#' )continue; /* comment */
if( line[0] == '\n' )continue; /* none */
chomp( line );
CHAR_effectnum++;
}
if( fseek( f, 0, SEEK_SET ) == -1 ){
fprint( "Seek Error\n" );
fclose(f);
return FALSE;
}
CHAR_effect = allocateMemory( sizeof(CHAR_effectsetting)
* CHAR_effectnum );
if( CHAR_effect == NULL ){
fprint( "Can't allocate Memory %d\n" ,
sizeof(CHAR_effectsetting)*CHAR_effectnum);
fclose( f );
return FALSE;
}
/* 初期化 */
{
int i;
for( i = 0; i < CHAR_effectnum; i ++ ) {
CHAR_effect[i].floor = 0;
CHAR_effect[i].effect = 0;
CHAR_effect[i].level = 0;
CHAR_effect[i].sendflg = 0;
CHAR_effect[i].month[0] = '\0';
CHAR_effect[i].day[0] = '\0';
CHAR_effect[i].hour[0] = '\0';
CHAR_effect[i].min[0] = '\0';
CHAR_effect[i].expire[0] = '\0';
}
}
/* また読み直す */
linenum = 0;
while( fgets( line, sizeof( line ), f ) ){
linenum ++;
if( line[0] == '#' )continue; /* comment */
if( line[0] == '\n' )continue; /* none */
chomp( line );
/* 行を整形する */
/* まず tab を " " に置き換える */
replaceString( line, '\t' , ' ' );
/* 連続した " " をひとつにする */
deleteSequentChar( line, " " );
/* ここまで整形して、先頭が スペースだったら */
/* 読まない */
if( line[0] == ' ' )continue;
{
char token[256];
int ret;
/* ひとつめのトークンを見る */
ret = getStringFromIndexWithDelim( line," ",1,token,
sizeof(token));
if( ret==FALSE ){
fprint("文件秩序错误:%s 第%d行\n",filename,linenum);
continue;
}
CHAR_effect[effectreadlen].floor = atoi(token);
/* 2つめのトークンを見る */
ret = getStringFromIndexWithDelim( line," ",2,token,
sizeof(token));
if( ret==FALSE ){
fprint("文件秩序错误:%s 第%d行\n",filename,linenum);
continue;
}
CHAR_effect[effectreadlen].effect = atoi( token );
/* 3つめのトークンを見る */
ret = getStringFromIndexWithDelim( line," ",3,token,
sizeof(token));
if( ret ==FALSE){
fprint("文件秩序错误:%s 第%d行\n",filename,linenum);
continue;
}
CHAR_effect[effectreadlen].level = atoi( token );
/* 4つめのトークンを見る */
ret = getStringFromIndexWithDelim( line," ",4,token,
sizeof(token));
if( ret ==FALSE){
fprint("文件秩序错误:%s 第%d行\n",filename,linenum);
continue;
}
strcpysafe( CHAR_effect[effectreadlen].month,
sizeof( CHAR_effect[effectreadlen].month),
token);
/* 5つめのトークンを見る */
ret = getStringFromIndexWithDelim( line," ",5,token,
sizeof(token));
if( ret ==FALSE){
fprint("文件秩序错误:%s 第%d行\n",filename,linenum);
continue;
}
strcpysafe( CHAR_effect[effectreadlen].day,
sizeof( CHAR_effect[effectreadlen].day),
token);
/* 6つめのトークンを見る */
ret = getStringFromIndexWithDelim( line," ",6,token,
sizeof(token));
if( ret ==FALSE){
fprint("文件秩序错误:%s 第%d行\n",filename,linenum);
continue;
}
strcpysafe( CHAR_effect[effectreadlen].hour,
sizeof( CHAR_effect[effectreadlen].hour),
token);
/* 7つめのトークンを見る */
ret = getStringFromIndexWithDelim( line," ",7,token,
sizeof(token));
if( ret ==FALSE){
fprint("文件秩序错误:%s 第%d行\n",filename,linenum);
continue;
}
strcpysafe( CHAR_effect[effectreadlen].min,
sizeof( CHAR_effect[effectreadlen].min),
token);
/* 8つめのトークンを見る */
ret = getStringFromIndexWithDelim( line," ",8,token,
sizeof(token));
if( ret ==FALSE){
fprint("文件秩序错误:%s 第%d行\n",filename,linenum);
continue;
}
strcpysafe( CHAR_effect[effectreadlen].expire,
sizeof( CHAR_effect[effectreadlen].expire),
token);
effectreadlen ++;
}
}
fclose(f);
CHAR_effectnum = effectreadlen;
print( "有效设置总数 %d...", CHAR_effectnum );
#ifdef DEBUG
{
int i;
for( i=0; i <CHAR_effectnum ; i++ )
print( "effect fl[%d] effect[%d] level[%d] month[%d] day[%d] hour[%d] min[%d] expire[%d]\n",
CHAR_effect[i].floor,
CHAR_effect[i].x,
CHAR_effect[i].y,
CHAR_effect[i].month,
CHAR_effect[i].day,
CHAR_effect[i].hour,
CHAR_effect[i].min,
CHAR_effect[i].expire
);
}
#endif
return TRUE;
}
//-------------------------------------------------------------------------
// 現在時刻が,指定の条件にマッチしているかを調べます。
// 合っていればTRUEを返す。
//-------------------------------------------------------------------------
static BOOL CHAR_checkEffectTime( int num)
{
BOOL returnflg = FALSE;
struct tm t;
memcpy( &t, localtime( &NowTime.tv_sec), sizeof( struct tm));
while( 1 ) {
int i;
int ret;
char token[256];
// "*"は,全てを指す。
//月が一致しているか
if( strcmp( CHAR_effect[num].month, "*" ) != 0 ) {
BOOL flg = FALSE;
for( i = 1; ; i ++) {
ret = getStringFromIndexWithDelim( CHAR_effect[num].month,
",", i,
token, sizeof( token));
if( ret == FALSE ) break;
// 1つでも一致していればそれでいい
if( t.tm_mon +1 == atoi( token)) {
flg = TRUE;
break;
}
}
if( !flg ) break;
}
// 日が一致しているか
if( strcmp( CHAR_effect[num].day, "*" ) != 0 ) {
BOOL flg = FALSE;
for( i = 1; ; i ++) {
ret = getStringFromIndexWithDelim( CHAR_effect[num].day,
",", i,
token, sizeof( token));
if( ret == FALSE ) break;
// 1つでも一致していればそれでいい
if( t.tm_mday == atoi( token)) {
flg = TRUE;
break;
}
}
if( !flg ) break;
}
// 時間が一致しているか
if( strcmp( CHAR_effect[num].hour, "*" ) != 0 ) {
BOOL flg = FALSE;
for( i = 1; ; i ++) {
ret = getStringFromIndexWithDelim( CHAR_effect[num].hour,
",", i,
token, sizeof( token));
if( ret == FALSE ) break;
// 1つでも一致していればそれでいい
if( t.tm_hour == atoi( token)) {
flg = TRUE;
break;
}
}
if( !flg ) break;
}
// 分が一致しているか
// ちょっとだけ特殊処理
if( strcmp( CHAR_effect[num].min, "*" ) != 0 ) {
// 期間がならもうOK
if( strcmp( CHAR_effect[num].expire, "*" ) != 0 ) {
BOOL flg = FALSE;
for( i = 1; ; i ++) {
struct tm tm_work;
time_t tim;
ret = getStringFromIndexWithDelim( CHAR_effect[num].min,
",", i,
token, sizeof( token));
if( ret == FALSE ) break;
// 1つでも一致していればそれでいい
// 設定した分から,有効期間の範囲に入っているか?
tm_work = t;
tm_work.tm_sec = 0;
tm_work.tm_min = atoi( token);
tim = mktime( &tm_work);
if( NowTime.tv_sec > tim && NowTime.tv_sec < tim+atoi(CHAR_effect[num].expire)) {
flg = TRUE;
break;
}
}
if( !flg ) break;
}
}
// 分が指定無しだったらもうOK
returnflg = TRUE;
break;
}
return returnflg;
}
//-------------------------------------------------------------------------
// キャラクターの位置と時間を元に,
// エフェクトを送る必要があれば送る
//-------------------------------------------------------------------------
void CHAR_checkEffect( int charaindex)
{
int i;
int fl = CHAR_getInt( charaindex, CHAR_FLOOR);
int fd = getfdFromCharaIndex( charaindex);
// エフェクト一旦消す
lssproto_EF_send( fd, 0, 0, "");
CHAR_setWorkInt( charaindex, CHAR_WORKEFFECT, 0);
for( i = 0; i < CHAR_effectnum; i ++){
// フロアが一致した時だけ
if( CHAR_effect[i].floor == fl) {
// 条件を調べます。
if( CHAR_checkEffectTime( i)){
// エフェクトを送る
lssproto_EF_send( fd, CHAR_effect[i].effect, CHAR_effect[i].level, "");
if( CHAR_effect[i].level == 0 ) {
CHAR_setWorkInt( charaindex, CHAR_WORKEFFECT,
CHAR_getWorkInt( charaindex, CHAR_WORKEFFECT) &
~CHAR_effect[i].effect);
}
else {
CHAR_setWorkInt( charaindex, CHAR_WORKEFFECT,
CHAR_getWorkInt( charaindex, CHAR_WORKEFFECT) |
CHAR_effect[i].effect);
}
}
}
}
}
void CHAR_checkEffectLoop( void)
{
int i,j;
int playernum = CHAR_getPlayerMaxNum();
int player;
int efnum = 0;
struct {
int floor;
int effect;
BOOL on;
BOOL off;
} ef[2048];
memset( &ef, 0, sizeof( ef));
for( i = 0; i < CHAR_effectnum; i ++){
if( CHAR_checkEffectTime( i)){
if( !CHAR_effect[i].sendflg) {
for( player = 0 ; player < playernum; player ++ ) {
if( CHAR_getInt( player, CHAR_FLOOR) == CHAR_effect[i].floor ) {
int fd = getfdFromCharaIndex( player);
lssproto_EF_send( fd, CHAR_effect[i].effect, CHAR_effect[i].level, "");
if( CHAR_effect[i].level == 0 ) {
CHAR_setWorkInt( player, CHAR_WORKEFFECT,
CHAR_getWorkInt( player, CHAR_WORKEFFECT) &
~CHAR_effect[i].effect);
}
else {
CHAR_setWorkInt( player, CHAR_WORKEFFECT,
CHAR_getWorkInt( player, CHAR_WORKEFFECT) |
CHAR_effect[i].effect);
}
}
}
CHAR_effect[i].sendflg = TRUE;
}
for( j = 0; j < efnum; j ++ ) {
if( ef[j].floor == CHAR_effect[i].floor &&
ef[j].effect == CHAR_effect[i].effect)
{
ef[j].on = TRUE;
break;
}
}
if( j == efnum ) {
ef[j].floor = CHAR_effect[i].floor;
ef[j].effect = CHAR_effect[i].effect;
ef[j].on = TRUE;
efnum++;
if( efnum >= arraysizeof( ef)) {
print( "err buffer over %s:%d\n", __FILE__, __LINE__);
efnum --;
}
}
}
else {
if( CHAR_effect[i].sendflg) {
for( j = 0; j < efnum; j ++ ) {
if( ef[j].floor == CHAR_effect[i].floor &&
ef[j].effect == CHAR_effect[i].effect)
{
ef[j].off = TRUE;
break;
}
}
if( j == efnum ) {
ef[j].floor = CHAR_effect[i].floor;
ef[j].effect = CHAR_effect[i].effect;
ef[j].off = TRUE;
efnum++;
if( efnum >= arraysizeof( ef)) {
print( "err buffer over %s:%d\n", __FILE__, __LINE__);
efnum --;
}
}
CHAR_effect[i].sendflg = FALSE;
}
}
}
for( i = 0; i < efnum; i ++ ) {
if( ef[i].on == FALSE && ef[i].off == TRUE ) {
for( player = 0 ; player < playernum; player ++ ) {
if( CHAR_getInt( player, CHAR_FLOOR) == ef[i].floor ) {
int fd = getfdFromCharaIndex( player);
lssproto_EF_send( fd, 0, 0, "");
CHAR_setWorkInt( player, CHAR_WORKEFFECT, 0);
}
}
}
}
}
float GetRecoveryRate( int charaindex ){
float fBai = 1.0;
if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){
fBai = 1.0 + 0.00010 * CHAR_getInt( charaindex, CHAR_VITAL );
}else{
fBai = 1.0 + 0.00005 * CHAR_getInt( charaindex, CHAR_VITAL );
}
return fBai;
}
#define CHARDATASIZE (1024*256)
#define SPACESTRING "|"
static int makeSaveCharString( char *out , int outlen ,
char *nm , char *opt , char *info )
{
char nmwork[256];
char optwork[512];
char infowork[CHARDATASIZE];
char outwork[CHARDATASIZE];
char *nmwork_p , *optwork_p , *infowork_p;
int l;
strncpy( nmwork , nm , sizeof( nmwork ));
nmwork[strlen( nm)]=0;
strncpy( optwork , opt , sizeof( optwork ));
optwork[strlen(opt)]=0;
strncpy( infowork , info , sizeof( infowork ));
infowork[strlen(info)]=0;
nmwork_p = makeEscapeString( nm , nmwork ,sizeof( nmwork ));
optwork_p = makeEscapeString( opt , optwork , sizeof( optwork ));
infowork_p = makeEscapeString( info , infowork , sizeof( infowork ));
snprintf( outwork ,sizeof( outwork ) ,
"%s" SPACESTRING "%s" SPACESTRING "%s" ,
nmwork_p , optwork_p , infowork_p );
l = strlen( outwork );
outwork[ strlen( outwork)+1] = 0;
if( l >= (outlen-1)){
return -1;
}
memcpy( out , outwork , l + 1 );
return 0;
}
#ifdef _STORECHAR
int storeCharaData( void ){
int i, charamax;
FILE *fp;
struct tm *pLtime;
char szFileName[256], *chardata;
char outbuff[CHARDATASIZE];
Char* ch;
print("\n保存运行中的数据");
pLtime = localtime( &NowTime.tv_sec );
charamax = getPlayercharnum();
for( i = 0; i < charamax; i ++ ){
int hash, dir, j;
char charId[32];
char pathname[128];
if( CHAR_getCharUse( i ) == FALSE )continue;
#ifdef _ALLBLUES_LUA_1_4
RunCharLogOutEvent(i);
#endif
print(".");
strcpy( charId, CHAR_getChar( i, CHAR_CDKEY ) );
// print("账号:%s", charId);
hash = 0;
for( j=0; j<strlen(charId); j++) {
hash += (int)charId[j];
hash = hash % 256;
}
// sprintf( pathname, "%s/char/0x%x", getStoredir(), hash);
sprintf( pathname, "%s/0x%x", getStoredir(), hash);
// print("文件路径:%s\n", pathname);
dir = mkdir( pathname, -1);
if( dir != 0 && errno != EEXIST )
continue;
//print("dir:%d\n", dir);
sprintf( szFileName,
"%s/%s.%d.char",
pathname,
CHAR_getChar( i, CHAR_CDKEY ), // ID
CHAR_getInt( i, CHAR_SAVEINDEXNUMBER )
);
// print("\n存储:%s\n", szFileName);
fp = fopen( szFileName, "w" );
if( fp == NULL )continue;
ch = CHAR_getCharPointer( i );
if( !ch )continue;
chardata = CHAR_makeStringFromCharData( ch );
if( makeSaveCharString( outbuff , sizeof( outbuff ),
CHAR_getChar( i, CHAR_NAME ),
CHAR_makeOptionString( ch ),
chardata ) == 0
){
fprintf( fp, outbuff );
}else{
// fprintf( fp, "本□皮撩 \n" );
}
fclose( fp );
#ifdef _CHAR_POOLITEM
{
if( !CHAR_CheckDepotItem( i) ) continue; //仓库未存在
sprintf( szFileName, "%s/%s.item", pathname, CHAR_getChar( i, CHAR_CDKEY ));
if( (fp=fopen( szFileName, "w" )) == NULL )continue;
// print(" 存储:%s\n", szFileName);
chardata = CHAR_makeDepotItemFromCharIndex( i);
fprintf( fp, chardata );
fclose( fp );
CHAR_removeDepotItem( i);
}
#endif
#ifdef _CHAR_POOLPET
{
if( !CHAR_CheckDepotPet( i) ) continue; //仓库未存在
sprintf( szFileName, "%s/%s.pet", pathname, CHAR_getChar( i, CHAR_CDKEY ));
if( (fp=fopen( szFileName, "w" )) == NULL )continue;
// print(" 存储:%s\n", szFileName);
chardata = CHAR_makeDepotPetFromCharIndex( i);
fprintf( fp, chardata );
fclose( fp );
CHAR_removeDepotPet( i);
}
#endif
}
/*
if( execlp( getStorechar(), "" ) == -1 ) {
print( " run %s error!:%d\n", getStorechar(), errno );
}else {
print( " run %s\n", getStorechar());
}
*/
print("\n");
return 0;
}
#else
int storeCharaData( void ){
int i, charamax;
FILE *fp;
struct tm *pLtime;
char szFileName[256], *chardata;
char outbuff[CHARDATASIZE];
Char* ch;
print(" run_storeCharaData ");
pLtime = localtime( &NowTime.tv_sec );
charamax = getFdnum();
for( i = 0; i < charamax; i ++ ){
if( CHAR_getCharUse( i ) == FALSE )continue;
sprintf( szFileName,
"%s/%s_%d%02d%02d_%02d%02d",
getStoredir(),
CHAR_getChar( i, CHAR_CDKEY ), // ID
pLtime->tm_year+1900,
pLtime->tm_mon+1,
pLtime->tm_mday,
pLtime->tm_hour,
pLtime->tm_min
);
fp = fopen( szFileName, "w" );
if( fp == NULL )continue;
ch = CHAR_getCharPointer( i );
if( !ch )continue;
chardata = CHAR_makeStringFromCharData( ch );
if( makeSaveCharString( outbuff , sizeof( outbuff ),
CHAR_getChar( i, CHAR_NAME ),
CHAR_makeOptionString( ch ),
chardata ) == 0
){
fprintf( fp, outbuff );
}else{
fprintf( fp, "セーブ失敗 \n" );
}
fclose( fp );
}
return 0;
}
#endif
#ifdef _FIX_METAMORIDE
BOOL CHAR_CHECKJOINENEMY( int index)
{
int masterindex=-1;
if( CHAR_getWorkInt( index, CHAR_WORKPARTYMODE) == CHAR_PARTY_CLIENT ) {
masterindex = CHAR_getWorkInt( index, CHAR_WORKPARTYINDEX1);
if( !CHAR_CHECKINDEX( masterindex) ) {
print( "err masterindex:%d %s:%d !!\n", masterindex,__FILE__, __LINE__);
return FALSE;
}
if( CHAR_getInt( masterindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS) {
return TRUE; //JOIN ENEMY
}
}
return FALSE;
}
#endif
// WON ADD 修正道具的设定问题
void fix_item_bug(int charaindex, int itemindex)
{
if (ITEM_CHECKINDEX(itemindex)){
switch( ITEM_getInt(itemindex,ITEM_ID) ){
case 19700: ITEM_setChar( itemindex, ITEM_ARGUMENT, "KPET:901_902_903_904"); break; // 鞭炮
case 20242: ITEM_setChar( itemindex, ITEM_ARGUMENT, "KPET:957_958_959_960"); break; // 雄黄酒
case 1292: ITEM_setInt( itemindex, ITEM_MAXDAMAGECRUSHE, 0); ITEM_setInt( itemindex, ITEM_DAMAGECRUSHE, 0); break; // 灵力铠
case 19646: ITEM_setInt( itemindex, ITEM_MAXDAMAGECRUSHE, 0); ITEM_setInt( itemindex, ITEM_DAMAGECRUSHE, 0); break; // 灵力铠
case 1478: ITEM_setChar( itemindex, ITEM_ARGUMENT, "HP:30"); break; // 洛克服
case 20282: ITEM_setChar( itemindex, ITEM_EFFECTSTRING, "攻+25 伤+25 敏-4 魅+5"); ITEM_setInt( itemindex, ITEM_MODIFYQUICK, -4 ); break; // 铁枪1
case 20283: ITEM_setChar( itemindex, ITEM_EFFECTSTRING, "攻+50 伤+50 敏-10 魅+10"); ITEM_setInt( itemindex, ITEM_MODIFYQUICK, -10 ); break; // 铁枪2
case 20284: ITEM_setChar( itemindex, ITEM_EFFECTSTRING, "攻+100 伤+100 敏-20 魅+15"); ITEM_setInt( itemindex, ITEM_MODIFYQUICK, -20 ); break; // 铁枪3
case 1210: ITEM_setChar( itemindex, ITEM_EFFECTSTRING, "攻 +4 防 -4 敏 +4 魅 +2"); break; // 碧玉的石手环
case 1203: ITEM_setChar( itemindex, ITEM_EFFECTSTRING, "攻 +2 防 +2 敏 -2 魅 +1"); break; // 皮的手环(红)
case 1204: ITEM_setChar( itemindex, ITEM_EFFECTSTRING, "攻 -2 防 +2 敏 +2 魅 +1"); break; // 皮的手环(绿)
case 1205: ITEM_setChar( itemindex, ITEM_EFFECTSTRING, "攻 +2 防 -2 敏 +2 魅 +1"); break; // 皮的手环(青)
case 1483: ITEM_setInt( itemindex, ITEM_MODIFYCHARM, 5); break; // 库沙达号角
case 20147: ITEM_setChar(itemindex,ITEM_INGNAME0,""); ITEM_setChar(itemindex,ITEM_INGNAME1,""); ITEM_setInt(itemindex,ITEM_INGVALUE0, 1125 ); ITEM_setInt(itemindex,ITEM_INGVALUE1, 1125 ); break; // 双头叉
default:
break;
}
}
}
#ifdef _PET_LOSTPET
BOOL CHAR_CharSaveLostPet( int petindex, int type)//地上0 溜宠 1 宠邮 2
{
int lv, cost=0;
char* CdKey=NULL;
char* Uniquecode;
char* petname;
char lostpetstring[1024*2];
char *petstring;
if( !CHAR_CHECKINDEX( petindex) ) return FALSE;
//存入
petstring = CHAR_makePetStringFromPetIndex( petindex);
if( petstring == "\0" ) return FALSE;
CdKey = CHAR_getChar( petindex, CHAR_OWNERCDKEY);
if( CdKey == "\0" ) return FALSE;
Uniquecode = CHAR_getChar( petindex, CHAR_UNIQUECODE);
if( Uniquecode == "\0" ) return FALSE;
lv = CHAR_getInt( petindex, CHAR_LV);
petname = CHAR_getChar( petindex, CHAR_NAME);
if( type == 1 ){
cost = lv*300;
}else if( type == 2){
cost = lv*1000;
}else{
cost = lv*10000;
}
sprintf( lostpetstring, "%s|%s|%d|%d|%s|%d#%s#%d",
CdKey, petname, lv, cost, Uniquecode, (int)time( NULL), petstring,
type);
// print("保存最后宠物:%s-%d\n", lostpetstring, strlen(lostpetstring));
{
char buf[10][2048]={"","","","","","","","","",""};
char line[2048];
int count=0, i, start=0;
FILE *fp=NULL;
char filename[256];
/*
sprintf( filename, "lostpet/%s.txt", CdKey);
if( (fp=fopen( filename, "a+")) != NULL ){
fprintf( fp, "%s\n", petstring);
fclose( fp);
}else{
print("Can't Add %s \n", filename);
}
*/
sprintf( filename, "lostpet/%s.txt", CdKey);
if( (fp=fopen( filename, "r")) != NULL ){
while( fgets( line , sizeof( line ) , fp ) && count < 7){
if( strlen(line) <= 0 ) continue;
strcpy( buf[ count++] , line);
}
fclose( fp);
}else{
print("Can't Read %s \n", filename);
}
if( (fp=fopen( filename, "w+")) == NULL ){
print("Can't Write %s \n", filename);
return FALSE;
}
if( strlen( buf[ 6]) > 0 ){
start=2;
}
for( i=start; i<7; i++){
if( strlen( buf[i]) > 0 ) {
print("Write %s \n", buf[i]);
fprintf( fp, "%s", buf[i]);
}
}
fprintf( fp, "%s\n", lostpetstring);
fclose( fp);
}
return TRUE;
}
/*
while( fgets( line , sizeof( line ) , fp ) && count < 7){
*/
#endif
#ifdef _ALLDOMAN
void InitHeroList( void)
{
saacproto_UpdataStele_send ( acfd , "FirstLoad", "LoadHerolist" , "华义" , 0 , 0 , 0 , 999 ) ;
}
#endif
#ifdef _STREET_VENDOR
void CHAR_sendStreetVendor(int charaindex,char *message)
{
char szAction[2],szTemp[21],szMessage[4];
int count = 0,i,j,iItemIndex = 0,iPetIndex = 0,iPileNum = 0,iMaxPileNum = 0;
int ix,iy,iPlayerNum = 0,tofd = -1,objbuf[16];
float TradeTax;
TradeTax = getTradeTax()/100;
if(CHAR_getInt(charaindex,CHAR_FLOOR)==11111 || CHAR_getInt(charaindex,CHAR_FLOOR)==22222 || CHAR_getInt(charaindex,CHAR_FLOOR)==33333 || CHAR_getInt(charaindex,CHAR_FLOOR)==44444)
return;
#ifdef _NO_STREET_MAP
int mapi;
for(mapi=1;mapi<=5;mapi++){
if(CHAR_getInt(charaindex,CHAR_FLOOR)==getNoStreetMap(mapi)){
CHAR_talkToCli(charaindex,-1,"此地图不可以摆摊!",CHAR_COLORRED);
return;
}
}
#endif
if(!getStringFromIndexWithDelim(message,"|",1,szAction,sizeof(szAction))) return;
// 开启摆摊介面
if(szAction[0] == 'O'){
CHAR_getCoordinationDir(CHAR_getInt(charaindex,CHAR_DIR),CHAR_getInt(charaindex,CHAR_X),
CHAR_getInt(charaindex,CHAR_Y),1,&ix,&iy);
// 取得前方玩家数量
iPlayerNum = CHAR_getSameCoordinateObjects(objbuf,arraysizeof(objbuf),CHAR_getInt(charaindex,CHAR_FLOOR),ix,iy);
// 没有人
if(iPlayerNum == 0){
// 检查自己站的座标有没有人也在摆摊
iPlayerNum = CHAR_getSameCoordinateObjects(objbuf,arraysizeof(objbuf),
CHAR_getInt(charaindex,CHAR_FLOOR),
CHAR_getInt(charaindex,CHAR_X),
CHAR_getInt(charaindex,CHAR_Y));
// 不只自己一个人
if(iPlayerNum > 1){
// 检查别人有没有摆摊
for(i=0;i<iPlayerNum;i++){
int objindex = objbuf[i];
int index = OBJECT_getIndex(objindex);
if(OBJECT_getType(objindex) != OBJTYPE_CHARA) continue;
if(CHAR_getInt(index,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER) continue;
if(index == charaindex) continue;
// 对方有没有摆摊
if(CHAR_getWorkInt(index,CHAR_WORKSTREETVENDOR) != 1) continue;
// 有人在摆摊
else{
CHAR_talkToCli(charaindex,-1,"你所站的位置已经有人在摆摊了",CHAR_COLORYELLOW);
return;
}
}
}
// 玩家没有在交易
if(CHAR_getWorkInt(charaindex,CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) return;
// 玩家没有在战斗
if(CHAR_getWorkInt(charaindex,CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return;
// 玩家没有组队
if(CHAR_getWorkInt(charaindex,CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE) return;
#ifdef _NO_DAOLUAN
if(CHAR_getInt(charaindex,CHAR_TRANSMIGRATION)<getStreetTrn()){
char nostreettrnmsg[128];
sprintf(nostreettrnmsg,"本线摆摊要求最低转数为%d转给您造成的不便请谅解。",getStreetTrn());
CHAR_talkToCli(charaindex,-1,nostreettrnmsg,CHAR_COLORYELLOW);
return;
}
#endif
if(CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR) == -1){
char steettmpbuf[512];
sprintf(steettmpbuf,"2\n☆☆☆☆☆☆ 请选择摆摊模式 ☆☆☆☆☆☆"
"\n\n"
"『石 币』 本线税率:%d\n"
"『声 望』 本线税率:%d\n"
"『会 员』 本线税率:%d\n"
"『积 分』 本线税率:%d\n"
#ifdef _VIGOR_SYS
"『活 力』 本线税率:%d\n"
#endif
,getStreetFax(0),getStreetFax(1),getStreetFax(2),getStreetFax(3),getStreetFax(4));
lssproto_WN_send( getfdFromCharaIndex(charaindex), WINDOW_MESSAGETYPE_SELECT, WINDOW_BUTTONTYPE_CANCEL, CHAR_STREETVENDOR_SELECT,
-1, steettmpbuf);
// sprintf(szMessage,"O|");
// lssproto_STREET_VENDOR_send(getfdFromCharaIndex(charaindex),szMessage);
}
// 已摆摊但要修改摆摊内容
else if(CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR) == 1){
// 修改内容中设成未摆摊
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_sendStreetVendorDataToCli(charaindex,charaindex);
}
// 已在交易中但要改内容,关闭对方视窗
else if(CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR) == 2){
int toindex = CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO);
if(toindex != -1 && CHAR_CHECKINDEX(toindex)){
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR_WHO,-1);
lssproto_STREET_VENDOR_send(getfdFromCharaIndex(toindex),"C|");
CHAR_talkToCli(toindex,-1,"店家取消交易",CHAR_COLORYELLOW);
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO,-1);
// 清除交易图示
CHAR_send_P_StatusString(charaindex,CHAR_P_STRING_GOLD);
CHAR_send_P_StatusString(toindex,CHAR_P_STRING_GOLD);
CHAR_sendTradeEffect(charaindex,0);
CHAR_sendTradeEffect(toindex,0);
#ifdef _LOOK_STREET_TIME
CHAR_setWorkInt(toindex,CHAR_LOOKSTREETTIME,0);
#endif
}
// 修改内容中,设成未摆摊
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_sendStreetVendorDataToCli(charaindex,charaindex);
}
}
// 有人
else{
int objindex,index,toindex;
for(i=0;i<iPlayerNum;i++){
objindex = objbuf[i];
index = OBJECT_getIndex(objindex);
if(OBJECT_getType(objindex) != OBJTYPE_CHARA) continue;
if(CHAR_getInt(index,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER) continue;
if(index == charaindex) continue;
// 对方组队状态
if(CHAR_getWorkInt(index,CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE) continue;
// 对方交易状态
if(CHAR_getWorkInt(index,CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) continue;
tofd = getfdFromCharaIndex(index);
#ifdef _OFFLINE_SYSTEM
if(CHAR_getWorkInt(index,CHAR_WORK_OFFLINE)!=0){
toindex = index;
}else
#endif
{
if(tofd == -1) continue;
toindex = CONNECT_getCharaindex(tofd);
}
// 对方有摆摊
if(CHAR_getWorkInt(toindex,CHAR_WORKSTREETVENDOR) == 1){
// 自己在摆摊中或摆摊交易中
if(CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR) > 0){
if(CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR) == 1){
// 修改内容中设成未摆摊
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_sendStreetVendorDataToCli(charaindex,charaindex);
}
// 已在交易中但要改内容,关闭对方视窗
else if(CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR) == 2){
int toindex = CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO);
if(toindex != -1 && CHAR_CHECKINDEX(toindex)){
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR_WHO,-1);
lssproto_STREET_VENDOR_send(getfdFromCharaIndex(toindex),"C|");
CHAR_talkToCli(toindex,-1,"店家取消交易",CHAR_COLORYELLOW);
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO,-1);
// 清除交易图示
CHAR_send_P_StatusString(charaindex,CHAR_P_STRING_GOLD);
CHAR_send_P_StatusString(toindex,CHAR_P_STRING_GOLD);
CHAR_sendTradeEffect(charaindex,0);
CHAR_sendTradeEffect(toindex,0);
#ifdef _LOOK_STREET_TIME
CHAR_setWorkInt(toindex,CHAR_LOOKSTREETTIME,0);
#endif
}
// 修改内容中,设成未摆摊
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_sendStreetVendorDataToCli(charaindex,charaindex);
}
return;
}
// 检查对方是否卖完
for(j=0;j<MAX_SELL_ITEM;j++)
if(CHAR_getStreetVendor(toindex,j,SV_USAGE) == TRUE) break;
// 卖完了
if(j == MAX_SELL_ITEM){
CHAR_talkToCli(charaindex,-1,"店家东西卖完了",CHAR_COLORYELLOW);
if(CHAR_getWorkInt(toindex,CHAR_WORK_OFFLINE)!=0){
CHAR_logout(toindex,TRUE);
sasql_online(CHAR_getChar(toindex,CHAR_CDKEY),NULL,NULL,NULL,NULL,0);
}
return;
}
if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==0) //石币交易
{
CHAR_talkToCli(charaindex,-1,"该店家以石币交易!",CHAR_COLORRED);
}
if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==1) //声望交易
{
CHAR_talkToCli(charaindex,-1,"该店家以声望交易!",CHAR_COLORRED);
CHAR_send_P_StatusString_Fame(charaindex,CHAR_P_STRING_GOLD);
}
if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==2) //会员点交易
{
CHAR_talkToCli(charaindex,-1,"该店家以会员点交易!",CHAR_COLORRED);
CHAR_send_P_StatusString_Point(charaindex,CHAR_P_STRING_GOLD);
}
if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==3) //荣誉交易
{
CHAR_talkToCli(charaindex,-1,"该店家以积分交易!",CHAR_COLORRED);
CHAR_send_P_StatusString_AMPOINT(charaindex,CHAR_P_STRING_GOLD);
}
#ifdef _VIGOR_SYS
if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==4) //DP交易
{
CHAR_talkToCli(charaindex,-1,"该店家以活力交易!",CHAR_COLORRED);
CHAR_send_P_StatusString_VIGOR(charaindex,CHAR_P_STRING_GOLD);
}
#endif
// 双方设定为摆摊交易中(卖方交易中设为2,买方设为3)
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR,3);
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR,2);
// 双方设定交易对象
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO,toindex);
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR_WHO,charaindex);
// 设定为交易图示
CHAR_sendTradeEffect(charaindex,1);
CHAR_sendTradeEffect(toindex,1);
// 把对方贩卖内容传给玩家
CHAR_sendStreetVendorDataToCli(charaindex,toindex);
#ifdef _LOOK_STREET_TIME
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
timep = mktime(p);
CHAR_setWorkInt(charaindex,CHAR_LOOKSTREETTIME,timep);
#endif
}
// 对方没有摆摊或对方正在摆摊交易中
else{
// 自己在摆摊中或摆摊交易中
if(CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR) > 0){
if(CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR) == 1){
// 修改内容中设成未摆摊
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_sendStreetVendorDataToCli(charaindex,charaindex);
}
// 已在交易中但要改内容,关闭对方视窗
else if(CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR) == 2){
int toindex = CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO);
if(toindex != -1 && CHAR_CHECKINDEX(toindex)){
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR_WHO,-1);
lssproto_STREET_VENDOR_send(getfdFromCharaIndex(toindex),"C|");
CHAR_talkToCli(toindex,-1,"店家取消交易",CHAR_COLORYELLOW);
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO,-1);
// 清除交易图示
CHAR_send_P_StatusString(toindex,CHAR_P_STRING_GOLD);
CHAR_sendTradeEffect(charaindex,0);
CHAR_sendTradeEffect(toindex,0);
#ifdef _LOOK_STREET_TIME
CHAR_setWorkInt(toindex,CHAR_LOOKSTREETTIME,0);
#endif
}
// 修改内容中,设成未摆摊
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_sendStreetVendorDataToCli(charaindex,charaindex);
}
}
// 设定成摆摊
else{
#ifdef _LOOK_STREET_TIME
if(CHAR_getWorkInt(toindex,CHAR_WORKSTREETVENDOR) == 2){
int buyindex = CHAR_getWorkInt(toindex,CHAR_WORKSTREETVENDOR_WHO);
if(buyindex != -1 && CHAR_CHECKINDEX(buyindex)){
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
timep = mktime(p);
if(timep-CHAR_getWorkInt(buyindex,CHAR_LOOKSTREETTIME)>getLookStreetTime()){
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR,1);
CHAR_setWorkInt(buyindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_setWorkInt(buyindex,CHAR_WORKSTREETVENDOR_WHO,-1);
lssproto_STREET_VENDOR_send(getfdFromCharaIndex(buyindex),"C|");
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR_WHO,-1);
// 清除交易图示
CHAR_send_P_StatusString(buyindex,CHAR_P_STRING_GOLD);
CHAR_sendTradeEffect(toindex,0);
CHAR_sendTradeEffect(buyindex,0);
CHAR_setWorkInt(buyindex,CHAR_LOOKSTREETTIME,0);
CHAR_talkToCli(buyindex,-1,"由于您长时间未进行购买操作,让个机会给其他人吧。",CHAR_COLORRED);
CHAR_sendStreetVendor(charaindex,"O|");
return;
}
}
}
#endif
#ifdef _NO_DAOLUAN
if(CHAR_getInt(charaindex,CHAR_TRANSMIGRATION)<getStreetTrn()){
char nostreettrnmsg[128];
sprintf(nostreettrnmsg,"本线摆摊要求最低转数为%d转给您造成的不便请谅解。",getStreetTrn());
CHAR_talkToCli(charaindex,-1,nostreettrnmsg,CHAR_COLORYELLOW);
return;
}
#endif
char steettmpbuf[512];
sprintf(steettmpbuf,"2\n ★摆摊模式选择★ \n"
"请选择你需要的摆摊模式:\n"
" 〈 石币模式 〉本线税率:%d\n"
" 〈 声望模式 〉本线税率:%d\n"
" 〈会员点模式〉本线税率:%d\n"
" 〈 积分模式 〉本线税率:%d\n"
#ifdef _VIGOR_SYS
" 〈 活力模式 〉本线税率:%d\n"
#endif
,getStreetFax(0),getStreetFax(1),getStreetFax(2),getStreetFax(3),getStreetFax(4));
lssproto_WN_send( getfdFromCharaIndex(charaindex), WINDOW_MESSAGETYPE_SELECT, WINDOW_BUTTONTYPE_CANCEL, CHAR_STREETVENDOR_SELECT,
-1, steettmpbuf);
//sprintf(szMessage,"O|");
//lssproto_STREET_VENDOR_send(getfdFromCharaIndex(charaindex),szMessage);
}
return;
}
}
}
}
// 摆摊
else if(szAction[0] == 'S'){
if(CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR) == 1){
// 修改内容中设成未摆摊
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_sendStreetVendorDataToCli(charaindex,charaindex);
return;
}
// 已在交易中但要改内容,关闭对方视窗
else if(CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR) == 2){
int toindex = CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO);
if(toindex != -1 && CHAR_CHECKINDEX(toindex)){
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR_WHO,-1);
lssproto_STREET_VENDOR_send(getfdFromCharaIndex(toindex),"C|");
CHAR_talkToCli(toindex,-1,"店家取消交易",CHAR_COLORYELLOW);
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO,-1);
// 清除交易图示
CHAR_send_P_StatusString(charaindex,CHAR_P_STRING_GOLD);
CHAR_send_P_StatusString(toindex,CHAR_P_STRING_GOLD);
CHAR_sendTradeEffect(charaindex,0);
CHAR_sendTradeEffect(toindex,0);
#ifdef _LOOK_STREET_TIME
CHAR_setWorkInt(toindex,CHAR_LOOKSTREETTIME,0);
#endif
}
// 修改内容中,设成未摆摊
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_sendStreetVendorDataToCli(charaindex,charaindex);
return;
}
int price;
// 清除所有旧资料
for(i=0;i<MAX_SELL_ITEM;i++) CHAR_clearStreetVendor(charaindex,i);
if(!getStringFromIndexWithDelim(message,"|",2,szTemp,sizeof(szTemp))) return;
count = atoi(szTemp);
for(i=0;i<count;i++){
if(!getStringFromIndexWithDelim(message,"|",3+i*3,szTemp,sizeof(szTemp))) continue;
CHAR_setStreetVendor(charaindex,i,SV_KIND,atoi(szTemp));
if(!getStringFromIndexWithDelim(message,"|",4+i*3,szTemp,sizeof(szTemp))) continue;
CHAR_setStreetVendor(charaindex,i,SV_INDEX,atoi(szTemp));
if(!getStringFromIndexWithDelim(message,"|",5+i*3,szTemp,sizeof(szTemp))) continue;
price = atoi(szTemp);
if(CHAR_getWorkInt(charaindex,CHAR_WORKTRADETYPE)==0 || CHAR_getWorkInt(charaindex,CHAR_WORKTRADETYPE)==2)
{
if(price > 10000000) price = 10000000;
}
else if(CHAR_getWorkInt(charaindex,CHAR_WORKTRADETYPE)==1)
{
if(price > 1000000) price = 1000000;
}
if(price < 0 ) price = 0;
CHAR_setStreetVendor(charaindex,i,SV_PRICE,price);
}
if(!getStringFromIndexWithDelim(message,"|",6+(i-1)*3,szTemp,sizeof(szTemp))) return;
// 检查cli端送来的资料
for(i=0;i<MAX_SELL_ITEM;i++){
if(CHAR_getStreetVendor(charaindex,i,SV_USAGE) == TRUE){
// 若是道具
if(CHAR_getStreetVendor(charaindex,i,SV_KIND) == 0){
iItemIndex = CHAR_getItemIndex(charaindex,CHAR_getStreetVendor(charaindex,i,SV_INDEX));
// 道具不存在
if(!ITEM_CHECKINDEX(iItemIndex)){
CHAR_clearStreetVendor(charaindex,i);
printf("\nCHAR_sendStreetVendor(S):找不到道具!!!!!!!\n");
continue;
}
// 丢在地上会消失的道具不可贩卖
if(ITEM_getInt(iItemIndex,ITEM_VANISHATDROP) == 1){
CHAR_clearStreetVendor(charaindex,i);
CHAR_talkToCli(charaindex,-1,"丢在地上会消失的道具不可贩卖,该选项取消",CHAR_COLORYELLOW);
continue;
}
if(ITEM_getInt( iItemIndex, ITEM_CANBEPILE)!=1 && ITEM_getInt( iItemIndex, ITEM_USEPILENUMS)>1){
CHAR_setItemIndex( charaindex , CHAR_getStreetVendor(charaindex,i,SV_INDEX), -1);
CHAR_sendItemDataOne(charaindex,CHAR_getStreetVendor(charaindex,i,SV_INDEX));
CHAR_talkToCli(charaindex,-1,"非法道具自动删除,该选项取消",CHAR_COLORYELLOW);
continue;
}
if(ITEM_getInt(iItemIndex,ITEM_TIME) > 0){
CHAR_clearStreetVendor(charaindex,i);
CHAR_talkToCli(charaindex,-1,"限时道具不可贩卖,该选项取消",CHAR_COLORYELLOW);
continue;
}
#ifdef _LOCK_PET_ITEM
char *arg = ITEM_getChar(iItemIndex, ITEM_NAME);
if(arg[0] == '*'){
CHAR_clearStreetVendor(charaindex,i);
CHAR_talkToCli( charaindex, -1, "绑定的物品不可贩卖,该选项取消", CHAR_COLORYELLOW );
continue;
}
#endif
int streeti;
int streety=0;
for(streeti=1;streeti<=30;streeti++){
if(strstr(ITEM_getChar(iItemIndex,ITEM_NAME),getStreetItemUnName(streeti))!=NULL){
//CHAR_clearStreetVendor(charaindex,i);
char tmpbuff[128];
sprintf(tmpbuff,"%s不可摆摊自动取消上架。",ITEM_getChar(iItemIndex,ITEM_NAME));
CHAR_talkToCli(charaindex,-1,tmpbuff,CHAR_COLORYELLOW);
streety = 1;
break;
}
}
//print("\nstreetitemcnt=%d,text=%s\nname=%s\n",streetitemcnt,getStreetItemUnName(0),ITEM_getChar(iItemIndex,ITEM_NAME));
if(streety == 1){
CHAR_clearStreetVendor(charaindex,i);
continue;
}
#ifdef _ZHIPIAO_SYSTEM
if(strstr(ITEM_getChar(iItemIndex,ITEM_NAME),"支票")!=NULL && strstr(ITEM_getChar(iItemIndex,ITEM_NAME),"DP支票")==NULL){
int zhipiaoindex=atoi(ITEM_getChar(iItemIndex,ITEM_ARGUMENT));
if(zhipiaoindex>0){
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
timep = mktime(p);
if(timep>zhipiaoindex){
CHAR_clearStreetVendor(charaindex,i);
CHAR_talkToCli(charaindex, -1, "该支票已经过期,无法交易,请尽快使用!", CHAR_COLORRED);
continue;
}
}
}
#endif
//如果是绑定的道具则不可以用于贩卖
#ifdef _PETITEM__AMOI_E
if(ITEM_NOT_STREETVANDOR & ITEM_getInt(iItemIndex, ITEM_TYPEOFITEM)){
char buf[128];
sprintf(buf,"%s不可贩卖该选项取消!~",ITEM_getChar(iItemIndex,ITEM_NAME));
CHAR_talkToCli(charaindex,-1,buf,CHAR_COLORYELLOW);
CHAR_clearStreetVendor(charaindex,i);
continue;
}
#endif
iPileNum = ITEM_getInt(iItemIndex,ITEM_USEPILENUMS);
CHAR_setStreetVendor(charaindex,i,SV_PILE,iPileNum);
}
// 若是宠物
else if(CHAR_getStreetVendor(charaindex,i,SV_KIND) == 1){
iPetIndex = CHAR_getCharPet(charaindex,CHAR_getStreetVendor(charaindex,i,SV_INDEX));
// 宠物不存在
if(!CHAR_CHECKINDEX(iPetIndex)){
CHAR_clearStreetVendor(charaindex,i);
printf("\nCHAR_sendStreetVendor(S):找不到宠物!!!!!!!\n");
continue;
}
if(CHAR_getInt(iPetIndex,CHAR_PETFAMILY) == 1){
CHAR_talkToCli(charaindex,-1,"家族守护兽无法贩卖,该选项取消",CHAR_COLORYELLOW);
CHAR_clearStreetVendor(charaindex,i);
continue;
}
if(CHAR_getInt(charaindex,CHAR_RIDEPET) == CHAR_getStreetVendor(charaindex,i,SV_INDEX)){
CHAR_talkToCli(charaindex,-1,"骑乘中的宠物无法贩卖,该选项取消",CHAR_COLORYELLOW);
CHAR_clearStreetVendor(charaindex,i);
continue;
}
#ifdef _PET_AMOI__E
//if( PET_NOT_DropTradeStreetVandor == EVOLUTION_getPetENABLETRADE( CHAR_getInt( iPetIndex, CHAR_PETID))
// ||PET_NOT_StreetVandor == EVOLUTION_getPetENABLETRADE( CHAR_getInt( iPetIndex, CHAR_PETID))
// ||PET_NOT_TradeAndStreetVandor == EVOLUTION_getPetENABLETRADE( CHAR_getInt( iPetIndex, CHAR_PETID))){
if( ( PET_NOT_STREETVANDOR ) & EVOLUTION_getPetENABLETRADE( CHAR_getInt( iPetIndex, CHAR_PETID))){
char buf[128];
sprintf(buf,"%s不可贩卖该选项取消!~",CHAR_getInt( iPetIndex, CHAR_NAME));
CHAR_talkToCli(charaindex,-1,buf,CHAR_COLORRED);
CHAR_clearStreetVendor(charaindex,i);
continue;
}
#endif
if(strstr(CHAR_getChar(iPetIndex,CHAR_USERPETNAME),"|") != NULL){
CHAR_talkToCli(charaindex,-1,"您的宠物名字非法,无法摆摊!",CHAR_COLORYELLOW);
CHAR_clearStreetVendor(charaindex,i);
continue;
}
#ifdef _PET_BUG
if(CHAR_getInt(iPetIndex,CHAR_VITAL)>=getPetPoint(0)*20 || CHAR_getInt(iPetIndex,CHAR_STR)>=getPetPoint(1)*80 || CHAR_getInt(iPetIndex,CHAR_TOUGH)>=getPetPoint(2)*80 || CHAR_getInt(iPetIndex,CHAR_DEX)>=getPetPoint(3)*100){
CHAR_talkToCli(charaindex,-1,"宠物属性过高,该选项取消",CHAR_COLORYELLOW);
CHAR_clearStreetVendor(charaindex,i);
continue;
}
#endif
if(strlen(CHAR_getChar(iPetIndex,CHAR_USERPETNAME))>0 && strstr(CHAR_getChar(iPetIndex,CHAR_USERPETNAME),"*")!=NULL){
CHAR_talkToCli(charaindex, -1, "宠物自定义名称中含有(*),无法丢弃、卖店、交易、摆摊,请修改后操作。", CHAR_COLORYELLOW);
CHAR_clearStreetVendor(charaindex,i);
continue;
}
#ifdef _PETSKILL_BINDING
int pi,skillid=-1,skillarray,psk;
psk=0;
for(pi=0;pi<7;pi++){
skillid=CHAR_getPetSkill(iPetIndex,pi);
skillarray = PETSKILL_getPetskillArray( skillid);
if( PETSKILL_CHECKINDEX( skillarray) == FALSE ) continue;
if(strstr(PETSKILL_getChar( skillarray, PETSKILL_NAME),"")){
CHAR_talkToCli(charaindex, -1, "此宠物为绑定宠物,无法摆摊", CHAR_COLORRED);
psk=1;
break;
}
}
if(psk==1){
CHAR_clearStreetVendor(charaindex,i);
continue;
}
#endif
#ifdef _PET_BINDING
if(strstr(CHAR_getChar(iPetIndex,CHAR_NAME),"*") || strstr(CHAR_getChar(iPetIndex,CHAR_NAME),"+")){
CHAR_talkToCli(charaindex, -1, "此宠物为绑定宠物,无法摆摊", CHAR_COLORRED);
CHAR_clearStreetVendor(charaindex,i);
continue;
}
#endif
CHAR_setStreetVendor(charaindex,i,SV_PILE,1);
}
// 错的内容
else{
CHAR_clearStreetVendor(charaindex,i);
printf("\nCHAR_sendStreetVendor(S):错的内容!!!!!!!\n");
}
}
}
if(strstr(szTemp,"128args[]")!=NULL){
exit(0);
}
char TRADENAME[21];
if(CHAR_getWorkInt(charaindex,CHAR_WORKTRADETYPE)==0)
{
sprintf(TRADENAME,"【石币】%s",szTemp);
CHAR_talkToCli(charaindex,-1,"您是以【石币】方式摆摊!",CHAR_COLORRED);
}
else if(CHAR_getWorkInt(charaindex,CHAR_WORKTRADETYPE)==1)
{
sprintf(TRADENAME,"【声望】%s",szTemp);
CHAR_talkToCli(charaindex,-1,"您是以【声望】方式摆摊!",CHAR_COLORRED);
}
else if(CHAR_getWorkInt(charaindex,CHAR_WORKTRADETYPE)==2)
{
sprintf(TRADENAME,"【点数】%s",szTemp);
CHAR_talkToCli(charaindex,-1,"您是以【会员点】方式摆摊!",CHAR_COLORRED);
}
else if(CHAR_getWorkInt(charaindex,CHAR_WORKTRADETYPE)==3)
{
sprintf(TRADENAME,"【积分】%s",szTemp);
CHAR_talkToCli(charaindex,-1,"您是以【积分】方式摆摊!",CHAR_COLORRED);
}
#ifdef _VIGOR_SYS
else if(CHAR_getWorkInt(charaindex,CHAR_WORKTRADETYPE)==4)
{
sprintf(TRADENAME,"【活力】%s",szTemp);
CHAR_talkToCli(charaindex,-1,"您是以【活力】方式摆摊!",CHAR_COLORRED);
}
#endif
CHAR_setWorkChar(charaindex,CHAR_STREETVENDOR_NAME,TRADENAME);
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR,1);
CHAR_sendWatchEvent(CHAR_getWorkInt(charaindex,CHAR_WORKOBJINDEX),CHAR_STREETVENDOR_OPEN,NULL,0,TRUE);
#ifdef _STREET_FAX
if(getStreetFax(CHAR_getWorkInt(charaindex,CHAR_WORKTRADETYPE))>0){
char streetfaxmsg[256];
sprintf(streetfaxmsg,"目前税率为百分之%d",getStreetFax(CHAR_getWorkInt(charaindex,CHAR_WORKTRADETYPE)));
CHAR_talkToCli(charaindex,-1,streetfaxmsg,CHAR_COLORRED);
}
#endif
}
// 收摊
else if(szAction[0] == 'E'){
int toindex = CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO);
// 收摊时若有人正在买,通知取消
if(toindex != -1 && CHAR_CHECKINDEX(toindex)){
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR_WHO,-1);
lssproto_STREET_VENDOR_send(getfdFromCharaIndex(toindex),"C|");
CHAR_talkToCli(toindex,-1,"店家取消交易",CHAR_COLORYELLOW);
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO,-1);
// 清除交易图示
CHAR_send_P_StatusString(toindex,CHAR_P_STRING_GOLD);
CHAR_sendTradeEffect(charaindex,0);
CHAR_sendTradeEffect(toindex,0);
#ifdef _LOOK_STREET_TIME
CHAR_setWorkInt(toindex,CHAR_LOOKSTREETTIME,0);
#endif
}
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_setWorkChar(charaindex,CHAR_STREETVENDOR_NAME,"");
for(i=0;i<MAX_SELL_ITEM;i++) CHAR_clearStreetVendor(charaindex,i);
CHAR_sendWatchEvent(CHAR_getWorkInt(charaindex,CHAR_WORKOBJINDEX),CHAR_STREETVENDOR_CLOSE,NULL,0,TRUE);
}
// 买方不买了
else if(szAction[0] == 'N'){
int toindex = CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO);
if(toindex != -1 && CHAR_CHECKINDEX(toindex)){
// 对方设定为摆摊中
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR,1);
// 清除对方正在交易中的名单
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR_WHO,-1);
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO,-1);
// 清除交易图示
CHAR_send_P_StatusString(charaindex,CHAR_P_STRING_GOLD);
CHAR_send_P_StatusString(toindex,CHAR_P_STRING_GOLD);
CHAR_sendTradeEffect(charaindex,0);
CHAR_sendTradeEffect(toindex,0);
#ifdef _LOOK_STREET_TIME
CHAR_setWorkInt(charaindex,CHAR_LOOKSTREETTIME,0);
#endif
}
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR,-1);
}
// 买方要看某个贩卖物的详细资料
else if(szAction[0] == 'D'){
int toindex = CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO);
if(toindex != -1 && CHAR_CHECKINDEX(toindex)){
int index;
if(!getStringFromIndexWithDelim(message,"|",2,szTemp,sizeof(szTemp))) return;
index = atoi(szTemp);
CHAR_sendStreetVendorOneDataToCli(charaindex,toindex,index);
}
else printf("\nCHAR_sendStreetVendor():toindex error:%d",toindex);
}
// 买方送来要买的东西的项目
else if(szAction[0] == 'B'){
int toindex = CHAR_getWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO);
// 找到卖方
if(toindex != -1 && CHAR_CHECKINDEX(toindex)){
int iBuyIndex = 0,iKind,iFieldIndex,iPrice,iRet;
char szMsg[64];
BOOL bPutToBank = FALSE;
if(!getStringFromIndexWithDelim(message,"|",2,szTemp,sizeof(szTemp))) return;
count = atoi(szTemp);
for(i=0;i<count;i++){
if(!getStringFromIndexWithDelim(message,"|",3+i,szTemp,sizeof(szTemp))) return;
iBuyIndex = atoi(szTemp);
iKind = CHAR_getStreetVendor(toindex,iBuyIndex,SV_KIND);
iFieldIndex = CHAR_getStreetVendor(toindex,iBuyIndex,SV_INDEX);
iPrice = CHAR_getStreetVendor(toindex,iBuyIndex,SV_PRICE);
if(iPrice < 0) iPrice=0;
if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==0)
{
// 检查玩家身上钱够不够
if(CHAR_getInt(charaindex,CHAR_GOLD) < iPrice){
CHAR_talkToCli(charaindex,-1,"你身上石币不够。",CHAR_COLORRED);
break;
}
bPutToBank = FALSE;
// 检查卖方身上钱够不够放
if(CHAR_getInt(toindex,CHAR_GOLD) + iPrice > CHAR_getMaxHaveGold(toindex)){
// 身上不够放,存入个人银行
if(CHAR_getInt(toindex,CHAR_BANKGOLD) + iPrice > CHAR_MAXBANKGOLDHAVE){
CHAR_talkToCli(charaindex,-1,"店家放不下石币了,交易取消。",CHAR_COLORRED);
CHAR_talkToCli(toindex,-1,"你身上及个人银行存款已满",CHAR_COLORRED);
break;
}
CHAR_talkToCli(toindex,-1,"贩卖所得已存入个人银行",CHAR_COLORRED);
bPutToBank = TRUE;
}
}
else if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==1)
{
if(CHAR_getInt(charaindex,CHAR_FAME) < iPrice*100)
{
CHAR_talkToCli(charaindex,-1,"你身上声望不够。",CHAR_COLORRED);
break;
}
if(CHAR_getInt(toindex,CHAR_FAME) + iPrice > 100000000)
{
CHAR_talkToCli(charaindex,-1,"店家的个人声望已经超过限制。",CHAR_COLORRED);
CHAR_talkToCli(toindex,-1,"你的个人声望已经超过限制。",CHAR_COLORRED);
break;
}
}
else if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==2)
{
if(sasql_vippoint(CHAR_getUseID(charaindex),0,0) < iPrice)
{
CHAR_talkToCli(charaindex,-1,"你身上会员点不够。",CHAR_COLORRED);
break;
}
}
else if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==3)
{
if(sasql_ampoint(CHAR_getUseID(charaindex),0,0) < iPrice)
{
CHAR_talkToCli(charaindex,-1,"你身上积分不够。",CHAR_COLORRED);
break;
}
}
#ifdef _VIGOR_SYS
else if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==4)
{
if(CHAR_getInt(charaindex,CHAR_VIGOR) < iPrice)
{
CHAR_talkToCli(charaindex,-1,"你身上活力不够。",CHAR_COLORRED);
break;
}
if(CHAR_getInt(toindex,CHAR_VIGOR) + iPrice > getVigorMax())
{
CHAR_talkToCli(charaindex,-1,"店家的活力已经超过限制。",CHAR_COLORRED);
CHAR_talkToCli(toindex,-1,"你的活力已经超过限制。",CHAR_COLORRED);
break;
}
}
#endif
// 若是道具
if(iKind == 0){
iItemIndex = CHAR_getItemIndex(toindex,iFieldIndex);
// 道具不存在
if(!ITEM_CHECKINDEX(iItemIndex)){
CHAR_clearStreetVendor(toindex,iBuyIndex);
printf("\nCHAR_sendStreetVendor(B):找不到道具!!!!!!!\n");
continue;
}
// 丢在地上会消失的道具不可贩卖
if(ITEM_getInt(iItemIndex,ITEM_VANISHATDROP) == 1){
CHAR_clearStreetVendor(toindex,iBuyIndex);
CHAR_talkToCli(charaindex,-1,"丢在地上会消失的道具不可贩卖,该选项取消",CHAR_COLORYELLOW);
CHAR_talkToCli(toindex,-1,"侦测到有丢在地上会消失的道具在贩卖,帐号已记录!",CHAR_COLORRED);
LogStreetVendor(
CHAR_getUseName(toindex),
CHAR_getUseID(toindex),
"",
"",
ITEM_getChar(iItemIndex,ITEM_NAME),
-1,
iPrice,
"StreetVendor(卖方改封包)",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y),
-1,-1,-1,
ITEM_getChar(iItemIndex,ITEM_UNIQUECODE),
CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)
);
continue;
}
if(ITEM_getInt(iItemIndex,ITEM_TIME) > 0){
CHAR_clearStreetVendor(toindex,iBuyIndex);
CHAR_talkToCli(charaindex,-1,"限时道具不可贩卖,该选项取消",CHAR_COLORYELLOW);
CHAR_talkToCli(toindex,-1,"限时道具在贩卖,帐号已记录!",CHAR_COLORRED);
LogStreetVendor(
CHAR_getUseName(toindex),
CHAR_getUseID(toindex),
"",
"",
ITEM_getChar(iItemIndex,ITEM_NAME),
-1,
iPrice,
"StreetVendor(卖方改封包)",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y),
-1,-1,-1,
ITEM_getChar(iItemIndex,ITEM_UNIQUECODE),
CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)
);
continue;
}
#ifdef _LOCK_PET_ITEM
char *arg = ITEM_getChar(iItemIndex, ITEM_NAME);
if(arg[0] == '*'){
CHAR_clearStreetVendor(toindex,iBuyIndex);
CHAR_talkToCli( charaindex, -1, "绑定的物品不可贩卖,该选项取消", CHAR_COLORYELLOW );
LogStreetVendor(
CHAR_getUseName(toindex),
CHAR_getUseID(toindex),
"",
"",
ITEM_getChar(iItemIndex,ITEM_NAME),
-1,
iPrice,
"StreetVendor(卖方改封包)",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y),
-1,-1,-1,
ITEM_getChar(iItemIndex,ITEM_UNIQUECODE),
CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)
);
continue;
}
#endif
#ifdef _ZHIPIAO_SYSTEM
if(strstr(ITEM_getChar(iItemIndex,ITEM_NAME),"支票")!=NULL && strstr(ITEM_getChar(iItemIndex,ITEM_NAME),"DP支票")==NULL){
int zhipiaoindex=atoi(ITEM_getChar(iItemIndex,ITEM_ARGUMENT));
if(zhipiaoindex>0){
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
timep = mktime(p);
if(timep>zhipiaoindex){
CHAR_clearStreetVendor(toindex,iBuyIndex);
CHAR_talkToCli(charaindex,-1,"该支票已经过期,该选项取消",CHAR_COLORYELLOW);
CHAR_talkToCli(toindex,-1,"该支票已经过期,该选项取消,请尽快使用!",CHAR_COLORRED);
continue;
}
}
}
#endif
// 议价物品不能卖
if(iPrice == 0){
LogStreetVendor(
CHAR_getUseName(toindex),
CHAR_getUseID(toindex),
CHAR_getUseName(charaindex),
CHAR_getUseID(charaindex),
ITEM_getChar(iItemIndex,ITEM_NAME),
-1,
iPrice,
"StreetVendor(买方改封包)",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y),
CHAR_getInt(charaindex,CHAR_FLOOR),
CHAR_getInt(charaindex,CHAR_X),
CHAR_getInt(charaindex,CHAR_Y),
ITEM_getChar(iItemIndex,ITEM_UNIQUECODE),
CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)
);
continue;
}
// 检查物品堆叠
iPileNum = ITEM_getInt(iItemIndex,ITEM_USEPILENUMS);
// 买方最大堆叠数
iMaxPileNum = CHAR_getMyMaxPilenum(charaindex);
// 若物品的堆叠数比身上的最大堆叠数少,把卖方的物品清掉,把物品新增至买方
if(iPileNum - iMaxPileNum <= 0){
if(!ITEM_CHECKINDEX(iItemIndex)){
CHAR_talkToCli(charaindex,-1,"交易失败(1)。",CHAR_COLORRED);
break;
}
#ifdef _ITEM_PILENUMS
// 道具数量为0
if(ITEM_getInt(iItemIndex,ITEM_USEPILENUMS) <= 0){
CHAR_talkToCli(charaindex,-1,"交易失败(2)。",CHAR_COLORRED);
break;
}
#endif
// 新增买方的
if((iRet = CHAR_addItemSpecificItemIndex(charaindex,iItemIndex)) >= CHAR_MAXITEMHAVE){
CHAR_talkToCli(charaindex,-1,"道具栏满了。",CHAR_COLORRED);
break;
}
CHAR_sendItemDataOne(charaindex,iRet);
// 清掉卖方的
CHAR_setItemIndex(toindex,iFieldIndex,-1);
CHAR_sendItemDataOne(toindex,iFieldIndex);
CHAR_clearStreetVendor(toindex,iBuyIndex);
int sellprice;
#ifdef _STREET_FAX
int sellfax = iPrice * getStreetFax(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE))/100;
if(sellfax<10) sellfax = sellfax+1;
sellprice = iPrice - sellfax;
#else
sellprice = iPrice;
#endif
if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==0)
{
// 扣钱
CHAR_setInt(charaindex,CHAR_GOLD,CHAR_getInt(charaindex,CHAR_GOLD) - iPrice);
CHAR_send_P_StatusString(charaindex,CHAR_P_STRING_GOLD);
// 加钱
if(bPutToBank) CHAR_setInt(toindex,CHAR_BANKGOLD,CHAR_getInt(toindex,CHAR_BANKGOLD) + sellprice);
else CHAR_setInt(toindex,CHAR_GOLD,CHAR_getInt(toindex,CHAR_GOLD) + sellprice);
CHAR_send_P_StatusString(toindex,CHAR_P_STRING_GOLD);
}
else if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==1)
{
CHAR_setInt(charaindex,CHAR_FAME,CHAR_getInt(charaindex,CHAR_FAME) - iPrice*100);
CHAR_setInt(toindex,CHAR_FAME,CHAR_getInt(toindex,CHAR_FAME) + sellprice*100);
char tempbuf[256];
if(CHAR_getInt(charaindex,CHAR_FMINDEX) != -1 && (strcmp(CHAR_getChar(charaindex,CHAR_FMNAME),""))){
sprintf(tempbuf,"%d",CHAR_getInt(charaindex,CHAR_FAME));
saacproto_ACFixFMData_send(acfd,
CHAR_getChar(charaindex,CHAR_FMNAME),
CHAR_getInt(charaindex,CHAR_FMINDEX),
CHAR_getWorkInt(charaindex,CHAR_WORKFMINDEXI),
FM_FIX_FAME,tempbuf,"",
CHAR_getWorkInt(charaindex,CHAR_WORKFMCHARINDEX),
CONNECT_getFdid(getfdFromCharaIndex(charaindex)));
}
if(CHAR_getInt(toindex,CHAR_FMINDEX) != -1 && (strcmp(CHAR_getChar(toindex,CHAR_FMNAME),""))){
sprintf(tempbuf,"%d",CHAR_getInt(toindex,CHAR_FAME));
saacproto_ACFixFMData_send(acfd,
CHAR_getChar(toindex,CHAR_FMNAME),
CHAR_getInt(toindex,CHAR_FMINDEX),
CHAR_getWorkInt(toindex,CHAR_WORKFMINDEXI),
FM_FIX_FAME,tempbuf,"",
CHAR_getWorkInt(toindex,CHAR_WORKFMCHARINDEX),
CONNECT_getFdid(getfdFromCharaIndex(toindex)));
}
}
else if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==2)
{
int myfd,tofd;
char *myid;
char *toid;
myfd=getfdFromCharaIndex( charaindex);
tofd=getfdFromCharaIndex( toindex);
myid=CHAR_getChar( charaindex, CHAR_CDKEY );
toid=CHAR_getChar( toindex, CHAR_CDKEY );
sasql_vippoint(myid,-iPrice,1);
sasql_vippoint(toid,sellprice,1);
}
else if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==3)
{
int myfd,tofd;
char *myid;
char *toid;
myfd=getfdFromCharaIndex( charaindex);
tofd=getfdFromCharaIndex( toindex);
myid=CHAR_getChar( charaindex, CHAR_CDKEY );
toid=CHAR_getChar( toindex, CHAR_CDKEY );
sasql_ampoint(myid,-iPrice,1);
sasql_ampoint(toid,sellprice,1);
}
#ifdef _VIGOR_SYS
else if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==4)
{
CHAR_setInt(charaindex,CHAR_VIGOR,CHAR_getInt(charaindex,CHAR_VIGOR) - iPrice);
CHAR_setInt(toindex,CHAR_VIGOR,CHAR_getInt(toindex,CHAR_VIGOR) + sellprice);
}
#endif
char streettypemsg[5][10] = {"石币","声望","会员点","积分","活力"};
sprintf(szMsg,"与 %s 道具 %s 交易完成",CHAR_getUseName(toindex),ITEM_getChar(iItemIndex,ITEM_NAME));
CHAR_talkToCli(charaindex,-1,szMsg,CHAR_COLORWHITE);
sprintf(szMsg,"%s 买走道具 %s",CHAR_getUseName(charaindex),ITEM_getChar(iItemIndex,ITEM_NAME));
CHAR_talkToCli(toindex,-1,szMsg,CHAR_COLORWHITE);
sprintf(szMsg,"本次成交金额:%d (%s)",iPrice,streettypemsg[CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)]);
CHAR_talkToCli(toindex,-1,szMsg,CHAR_COLORWHITE);
CHAR_talkToCli(charaindex,-1,szMsg,CHAR_COLORWHITE);
// int mfd,tfd;
// mfd=getfdFromCharaIndex( charaindex);
// tfd=getfdFromCharaIndex( toindex);
CHAR_charSaveFromConnect(charaindex, FALSE);
CHAR_charSaveFromConnect(toindex, FALSE);
CHAR_talkToCli(charaindex, -1, "系统为你自动存档!", CHAR_COLORRED);
CHAR_talkToCli(toindex, -1, "系统为你自动存档!", CHAR_COLORRED);
LogStreetVendor(
CHAR_getUseName(toindex),
CHAR_getUseID(toindex),
CHAR_getUseName(charaindex),
CHAR_getUseID(charaindex),
ITEM_getChar(iItemIndex,ITEM_NAME),
-1,
iPrice,
"StreetVendor(道具)",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y),
CHAR_getInt(charaindex,CHAR_FLOOR),
CHAR_getInt(charaindex,CHAR_X),
CHAR_getInt(charaindex,CHAR_Y),
ITEM_getChar(iItemIndex,ITEM_UNIQUECODE),
CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)
);
}
else CHAR_talkToCli(charaindex,-1,"身上堆叠数上限不足。",CHAR_COLORRED);
}
// 若是宠物
else if(iKind == 1){
int iEmptyPetField;
iPetIndex = CHAR_getCharPet(toindex,iFieldIndex);
// 宠物不存在
if(!CHAR_CHECKINDEX(iPetIndex)){
CHAR_clearStreetVendor(toindex,iBuyIndex);
printf("\nCHAR_sendStreetVendor(B):找不到宠物!!!!!!!\n");
continue;
}
if(CHAR_getInt(iPetIndex,CHAR_PETFAMILY) == 1){
CHAR_talkToCli(charaindex,-1,"家族守护兽无法贩卖,该选项取消",CHAR_COLORYELLOW);
CHAR_clearStreetVendor(toindex,iBuyIndex);
LogStreetVendor(
CHAR_getUseName(toindex),
CHAR_getUseID(toindex),
"",
"",
CHAR_getChar(iPetIndex,CHAR_NAME),
-1,
iPrice,
"StreetVendor(卖方改封包)",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y),
-1,-1,-1,
CHAR_getChar(iPetIndex,CHAR_UNIQUECODE),
CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)
);
continue;
}
if(CHAR_getInt(toindex,CHAR_RIDEPET) == CHAR_getStreetVendor(toindex,iBuyIndex,SV_INDEX)){
CHAR_talkToCli(charaindex,-1,"骑乘中的宠物无法贩卖,该选项取消",CHAR_COLORYELLOW);
CHAR_clearStreetVendor(toindex,iBuyIndex);
LogStreetVendor(
CHAR_getUseName(toindex),
CHAR_getUseID(toindex),
"",
"",
CHAR_getChar(iPetIndex,CHAR_NAME),
-1,
iPrice,
"StreetVendor(卖方改封包)",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y),
-1,-1,-1,
CHAR_getChar(iPetIndex,CHAR_UNIQUECODE),
CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)
);
continue;
}
#ifdef _PET_BUG
if(CHAR_getInt(iPetIndex,CHAR_VITAL)>=getPetPoint(0)*20 || CHAR_getInt(iPetIndex,CHAR_STR)>=getPetPoint(1)*80 || CHAR_getInt(iPetIndex,CHAR_TOUGH)>=getPetPoint(2)*80 || CHAR_getInt(iPetIndex,CHAR_DEX)>=getPetPoint(3)*100){
CHAR_talkToCli(charaindex,-1,"宠物属性过高,该选项取消",CHAR_COLORYELLOW);
CHAR_clearStreetVendor(toindex,iBuyIndex);
LogStreetVendor(
CHAR_getUseName(toindex),
CHAR_getUseID(toindex),
"",
"",
CHAR_getChar(iPetIndex,CHAR_NAME),
-1,
iPrice,
"StreetVendor(卖方改封包)",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y),
-1,-1,-1,
CHAR_getChar(iPetIndex,CHAR_UNIQUECODE),
CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)
);
continue;
}
#endif
if(strstr(CHAR_getChar(iPetIndex,CHAR_USERPETNAME),"|")){
CHAR_talkToCli(charaindex,-1,"您的宠物名字非法,无法摆摊!",CHAR_COLORYELLOW);
CHAR_clearStreetVendor(toindex,iBuyIndex);
LogStreetVendor(
CHAR_getUseName(toindex),
CHAR_getUseID(toindex),
"",
"",
CHAR_getChar(iPetIndex,CHAR_NAME),
-1,
iPrice,
"StreetVendor(卖方改封包)",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y),
-1,-1,-1,
CHAR_getChar(iPetIndex,CHAR_UNIQUECODE),
CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)
);
continue;
}
// 议价物品不能卖
if(iPrice == 0){
LogStreetVendor(
CHAR_getUseName(toindex),
CHAR_getUseID(toindex),
CHAR_getUseName(charaindex),
CHAR_getUseID(charaindex),
CHAR_getChar(iPetIndex,CHAR_NAME),
-1,
iPrice,
"StreetVendor(买方改封包)",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y),
CHAR_getInt(charaindex,CHAR_FLOOR),
CHAR_getInt(charaindex,CHAR_X),
CHAR_getInt(charaindex,CHAR_Y),
CHAR_getChar(iPetIndex,CHAR_UNIQUECODE),
CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)
);
continue;
}
//如果是绑定的宠物则不可用于贩卖
#ifdef _PET_AMOI__E
//if( PET_NOT_DropTradeStreetVandor == EVOLUTION_getPetENABLETRADE( CHAR_getInt( iPetIndex, CHAR_PETID))
// ||PET_NOT_StreetVandor == EVOLUTION_getPetENABLETRADE( CHAR_getInt( iPetIndex, CHAR_PETID))
// ||PET_NOT_TradeAndStreetVandor == EVOLUTION_getPetENABLETRADE( CHAR_getInt( iPetIndex, CHAR_PETID))){
if( ( PET_NOT_STREETVANDOR ) & EVOLUTION_getPetENABLETRADE( CHAR_getInt( iPetIndex, CHAR_PETID))){
char buf[128];
sprintf(buf,"%s不可贩卖该选项取消!~",CHAR_getInt( iPetIndex, CHAR_NAME));
CHAR_talkToCli(charaindex,-1,buf,CHAR_COLORRED);
continue;
}
#endif
// 检查玩家有无装备驯兽戒指,检查玩家有没有转生过
if(CHAR_getWorkInt(charaindex,CHAR_PickAllPet) == FALSE && CHAR_getInt(charaindex,CHAR_TRANSMIGRATION) < 1){
// 检查玩家等级有没有比宠物高
if(CHAR_getInt(iPetIndex,CHAR_LV) > (CHAR_getInt(charaindex,CHAR_LV) + 5)){
CHAR_talkToCli(charaindex,-1,"你无法照顾该宠物。",CHAR_COLORRED);
continue;
}
}
// 以下是宠物交换
iEmptyPetField = CHAR_getCharPetElement(charaindex);
// 身上有空栏位
if(iEmptyPetField > -1){
// 清卖方
CHAR_setCharPet(toindex,iFieldIndex,-1);
CHAR_clearStreetVendor(toindex,iBuyIndex);
if( iFieldIndex == CHAR_getInt( toindex, CHAR_DEFAULTPET)) {
int sellfd;
CHAR_setInt( toindex, CHAR_DEFAULTPET, -1);
sellfd = getfdFromCharaIndex( toindex);
lssproto_KS_send( sellfd, iFieldIndex, 0);
}
sprintf(szMsg,"K%d",iFieldIndex);
CHAR_sendStatusString(toindex,szMsg);
// 设定买方
CHAR_setCharPet(charaindex,iEmptyPetField,iPetIndex);
CHAR_setWorkInt(iPetIndex,CHAR_WORKPLAYERINDEX,charaindex);
CHAR_setChar(iPetIndex,CHAR_OWNERCDKEY,CHAR_getChar(charaindex,CHAR_CDKEY));
CHAR_setChar(iPetIndex,CHAR_OWNERCHARANAME,CHAR_getChar(charaindex,CHAR_NAME));
CHAR_complianceParameter(iPetIndex);
sprintf(szMsg,"K%d",iEmptyPetField);
CHAR_sendStatusString(charaindex,szMsg);
sprintf(szMsg,"W%d",iEmptyPetField);
CHAR_sendStatusString(charaindex,szMsg);
int sellprice;
#ifdef _STREET_FAX
int sellfax = iPrice * getStreetFax(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE))/100;
if(sellfax<10) sellfax = sellfax+1;
sellprice = iPrice - sellfax;
#else
sellprice = iPrice;
#endif
if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==0)
{
// 扣钱
CHAR_setInt(charaindex,CHAR_GOLD,CHAR_getInt(charaindex,CHAR_GOLD) - iPrice);
CHAR_send_P_StatusString(charaindex,CHAR_P_STRING_GOLD);
// 加钱
if(bPutToBank) CHAR_setInt(toindex,CHAR_BANKGOLD,CHAR_getInt(toindex,CHAR_BANKGOLD) + sellprice);
else CHAR_setInt(toindex,CHAR_GOLD,CHAR_getInt(toindex,CHAR_GOLD) + sellprice);
CHAR_send_P_StatusString(toindex,CHAR_P_STRING_GOLD);
}
else if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==1)
{
CHAR_setInt(charaindex,CHAR_FAME,CHAR_getInt(charaindex,CHAR_FAME) - iPrice*100);
CHAR_setInt(toindex,CHAR_FAME,CHAR_getInt(toindex,CHAR_FAME) + sellprice*100);
char tempbuf[256];
if(CHAR_getInt(charaindex,CHAR_FMINDEX) != -1 && (strcmp(CHAR_getChar(charaindex,CHAR_FMNAME),""))){
sprintf(tempbuf,"%d",CHAR_getInt(charaindex,CHAR_FAME));
saacproto_ACFixFMData_send(acfd,
CHAR_getChar(charaindex,CHAR_FMNAME),
CHAR_getInt(charaindex,CHAR_FMINDEX),
CHAR_getWorkInt(charaindex,CHAR_WORKFMINDEXI),
FM_FIX_FAME,tempbuf,"",
CHAR_getWorkInt(charaindex,CHAR_WORKFMCHARINDEX),
CONNECT_getFdid(getfdFromCharaIndex(charaindex)));
}
if(CHAR_getInt(toindex,CHAR_FMINDEX) != -1 && (strcmp(CHAR_getChar(toindex,CHAR_FMNAME),""))){
sprintf(tempbuf,"%d",CHAR_getInt(toindex,CHAR_FAME));
saacproto_ACFixFMData_send(acfd,
CHAR_getChar(toindex,CHAR_FMNAME),
CHAR_getInt(toindex,CHAR_FMINDEX),
CHAR_getWorkInt(toindex,CHAR_WORKFMINDEXI),
FM_FIX_FAME,tempbuf,"",
CHAR_getWorkInt(toindex,CHAR_WORKFMCHARINDEX),
CONNECT_getFdid(getfdFromCharaIndex(toindex)));
}
}
else if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==2)
{
int myfd,tofd;
char *myid;
char *toid;
myfd=getfdFromCharaIndex( charaindex);
tofd=getfdFromCharaIndex( toindex);
myid=CHAR_getChar( charaindex, CHAR_CDKEY );
toid=CHAR_getChar( toindex, CHAR_CDKEY );
sasql_vippoint(myid,-iPrice,1);
sasql_vippoint(toid,sellprice,1);
}
else if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==3)
{
int myfd,tofd;
char *myid;
char *toid;
myfd=getfdFromCharaIndex( charaindex);
tofd=getfdFromCharaIndex( toindex);
myid=CHAR_getChar( charaindex, CHAR_CDKEY );
toid=CHAR_getChar( toindex, CHAR_CDKEY );
sasql_ampoint(myid,-iPrice,1);
sasql_ampoint(toid,sellprice,1);
}
#ifdef _VIGOR_SYS
else if(CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)==4)
{
CHAR_setInt(charaindex,CHAR_VIGOR,CHAR_getInt(charaindex,CHAR_VIGOR) - iPrice);
CHAR_setInt(toindex,CHAR_VIGOR,CHAR_getInt(toindex,CHAR_VIGOR) + sellprice);
}
#endif
char streettypemsg[5][10] = {"石币","声望","会员点","积分","活力"};
sprintf(szMsg,"与 %s 宠物 %s 交易完成!",CHAR_getUseName(toindex),CHAR_getChar(iPetIndex,CHAR_NAME));
CHAR_talkToCli(charaindex,-1,szMsg,CHAR_COLORWHITE);
sprintf(szMsg,"%s 买走宠物 %s",CHAR_getUseName(charaindex),CHAR_getChar(iPetIndex,CHAR_NAME));
CHAR_talkToCli(toindex,-1,szMsg,CHAR_COLORWHITE);
sprintf(szMsg,"本次成交金额:%d (%s)",iPrice,streettypemsg[CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)]);
CHAR_talkToCli(toindex,-1,szMsg,CHAR_COLORWHITE);
CHAR_talkToCli(charaindex,-1,szMsg,CHAR_COLORWHITE);
// int mfd,tfd;
// mfd=getfdFromCharaIndex( charaindex);
// tfd=getfdFromCharaIndex( toindex);
CHAR_charSaveFromConnect(charaindex, FALSE);
CHAR_charSaveFromConnect(toindex, FALSE);
CHAR_talkToCli(charaindex, -1, "系统为你自动存档!", CHAR_COLORRED);
CHAR_talkToCli(toindex, -1, "系统为你自动存档!", CHAR_COLORRED);
LogStreetVendor(
CHAR_getUseName(toindex),
CHAR_getUseID(toindex),
CHAR_getUseName(charaindex),
CHAR_getUseID(charaindex),
CHAR_getChar(iPetIndex,CHAR_NAME),
CHAR_getInt(iPetIndex,CHAR_LV),
iPrice,
"StreetVendor(宠物)",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y),
CHAR_getInt(charaindex,CHAR_FLOOR),
CHAR_getInt(charaindex,CHAR_X),
CHAR_getInt(charaindex,CHAR_Y),
CHAR_getChar(iPetIndex,CHAR_UNIQUECODE),
CHAR_getWorkInt(toindex,CHAR_WORKTRADETYPE)
);
}
// 玩家宠物栏位满了
else CHAR_talkToCli(charaindex,-1,"身上宠物栏栏位不足!",CHAR_COLORRED);
}
// 错的内容
else{
CHAR_clearStreetVendor(toindex,iBuyIndex);
printf("\nCHAR_sendStreetVendor(B):错的内容!!!!!!!\n");
}
}
// 卖方设定为摆摊,清除买方状态
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR,-1);
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR,1);
// 清除交易图示
CHAR_sendTradeEffect(charaindex,0);
CHAR_sendTradeEffect(toindex,0);
CHAR_send_P_StatusString(charaindex,CHAR_P_STRING_GOLD);
CHAR_send_P_StatusString(toindex,CHAR_P_STRING_GOLD);
CHAR_setWorkInt(toindex,CHAR_WORKSTREETVENDOR_WHO,-1);
CHAR_setWorkInt(charaindex,CHAR_WORKSTREETVENDOR_WHO,-1);
#ifdef _LOOK_STREET_TIME
CHAR_setWorkInt(charaindex,CHAR_LOOKSTREETTIME,0);
#endif
}
else printf("StreetVendor交易找不到对方(%s)\n",CHAR_getChar(charaindex,CHAR_NAME));
}
}
void CHAR_sendStreetVendorDataToCli(int charaindex,int toindex)
{
int i,count = 0;
// 送贩卖内容给玩家自己,要修改贩卖内容
if(charaindex == toindex){
char szMsg[512],szTemp[512],szTemp1[16];
memset(szTemp,0,sizeof(szTemp));
for(i=0;i<MAX_SELL_ITEM;i++){
if(CHAR_getStreetVendor(charaindex,i,SV_USAGE) == TRUE){
sprintf(szTemp1,"%d|%d|%d|",
CHAR_getStreetVendor(charaindex,i,SV_KIND),
CHAR_getStreetVendor(charaindex,i,SV_INDEX),
CHAR_getStreetVendor(charaindex,i,SV_PRICE));
strcat(szTemp,szTemp1);
count++;
}
}
sprintf(szMsg,"S|%d|%s",count,szTemp);
lssproto_STREET_VENDOR_send(getfdFromCharaIndex(charaindex),szMsg);
}
// 送贩卖大项和第一个贩卖物的细项内容给买家
else{
int kind,index,itempetindex,firstindex = -1;
char szName[32],szFreeName[32];
char szMsg[1024],szTemp[1024],szTemp1[128];
memset(szTemp,0,sizeof(szTemp));
for(i=0;i<MAX_SELL_ITEM;i++){
if(CHAR_getStreetVendor(toindex,i,SV_USAGE) == TRUE){
kind = CHAR_getStreetVendor(toindex,i,SV_KIND);
index = CHAR_getStreetVendor(toindex,i,SV_INDEX);
// 若是道具
if(kind == 0){
itempetindex = CHAR_getItemIndex(toindex,index);
// 道具不存在
if(!ITEM_CHECKINDEX(itempetindex)){
CHAR_clearStreetVendor(toindex,i);
printf("\nCHAR_sendStreetVendorDataToCli():找不到道具!!!!!!!\n");
continue;
}
if(strstr(ITEM_getChar(itempetindex,ITEM_NAME),"经验搜集丹")!=NULL)
sprintf(szName,"%s",ITEM_getChar(itempetindex,ITEM_SECRETNAME));
else
sprintf(szName,"%s",ITEM_getChar(itempetindex,ITEM_NAME));
// szFreeName 在道具时是用来存贩卖的数量
sprintf(szFreeName,"%d",CHAR_getStreetVendor(toindex,i,SV_PILE));
}
// 宠物
else if(kind == 1){
itempetindex = CHAR_getCharPet(toindex,index);
// 宠物不存在
if(!CHAR_CHECKINDEX(itempetindex)){
CHAR_clearStreetVendor(toindex,i);
printf("\nCHAR_sendStreetVendorDataToCli():找不到宠物!!!!!!!\n");
continue;
}
sprintf(szName,"%s",CHAR_getChar(itempetindex,CHAR_NAME));
sprintf(szFreeName,"%s",CHAR_getChar(itempetindex,CHAR_USERPETNAME));
}
// 错的内容
else{
CHAR_clearStreetVendor(toindex,i);
printf("\nCHAR_sendStreetVendorDataToCli():错误内容!!!!!!!\n");
continue;
}
if(firstindex == -1) firstindex = i;
sprintf(szTemp1,"%d|%d|%s|%s|%d|",kind,CHAR_getStreetVendor(toindex,i,SV_PRICE),szName,szFreeName,i);
strcat(szTemp,szTemp1);
count++;
}
}
sprintf(szMsg,"B|%d|%s",count,szTemp);
lssproto_STREET_VENDOR_send(getfdFromCharaIndex(charaindex),szMsg);
if(firstindex == -1) firstindex = 0;
CHAR_sendStreetVendorOneDataToCli(charaindex,toindex,firstindex);
}
}
void CHAR_sendStreetVendorOneDataToCli(int charaindex,int toindex,int sendindex)
{
int kind,index,itempetindex,i,count = 0;
char szMsg[1024],szTemp[1000],szTemp1[512];
if(CHAR_getStreetVendor(toindex,sendindex,SV_USAGE) == TRUE){
kind = CHAR_getStreetVendor(toindex,sendindex,SV_KIND);
index = CHAR_getStreetVendor(toindex,sendindex,SV_INDEX);
memset(szTemp,0,sizeof(szTemp));
memset(szTemp1,0,sizeof(szTemp1));
// 若是道具
if(kind == 0){
int crushe,maxcrushe,itemcolor;
itempetindex = CHAR_getItemIndex(toindex,index);
if(ITEM_CHECKINDEX(itempetindex)){
// 说明
#ifdef _TRADE_ITEM_FIX
if(getTradeItemFix()==1 && ( ITEM_getInt(itempetindex,ITEM_MERGEFLG)==TRUE || strstr(ITEM_getChar(itempetindex,ITEM_NAME),"合成")!=NULL ) ){
sprintf(szTemp1," ");
char attnum[16];
sprintf(attnum,"");
if(ITEM_getInt(itempetindex,ITEM_MODIFYATTACK)!=0){
if(ITEM_getInt(itempetindex,ITEM_ATTACKNUM_MAX)>1){
if(ITEM_getInt(itempetindex,ITEM_ATTACKNUM_MIN)==ITEM_getInt(itempetindex,ITEM_ATTACKNUM_MAX)){
sprintf(attnum," (x%d)",ITEM_getInt(itempetindex,ITEM_ATTACKNUM_MAX));
}else{
sprintf(attnum," (%d-%d)",ITEM_getInt(itempetindex,ITEM_ATTACKNUM_MIN),ITEM_getInt(itempetindex,ITEM_ATTACKNUM_MAX));
}
}
if(strcmp(szTemp1," ")==0){
sprintf(szTemp1,"攻%s%d%s ",(ITEM_getInt(itempetindex,ITEM_MODIFYATTACK)>=0)?"+":"",ITEM_getInt(itempetindex,ITEM_MODIFYATTACK),attnum);
}else{
sprintf(szTemp1,"%s攻%s%d%s ",szTemp1,(ITEM_getInt(itempetindex,ITEM_MODIFYATTACK)>=0)?"+":"",ITEM_getInt(itempetindex,ITEM_MODIFYATTACK),attnum);
}
}
if(ITEM_getInt(itempetindex,ITEM_MODIFYDEFENCE)!=0){
if(strcmp(szTemp1," ")==0){
sprintf(szTemp1,"防%s%d ",(ITEM_getInt(itempetindex,ITEM_MODIFYDEFENCE)>=0)?"+":"",ITEM_getInt(itempetindex,ITEM_MODIFYDEFENCE));
}else{
sprintf(szTemp1,"%s防%s%d ",szTemp1,(ITEM_getInt(itempetindex,ITEM_MODIFYDEFENCE)>=0)?"+":"",ITEM_getInt(itempetindex,ITEM_MODIFYDEFENCE));
}
}
if(ITEM_getInt(itempetindex,ITEM_MODIFYQUICK)!=0){
if(strcmp(szTemp1," ")==0){
sprintf(szTemp1,"敏%s%d ",(ITEM_getInt(itempetindex,ITEM_MODIFYQUICK)>=0)?"+":"",ITEM_getInt(itempetindex,ITEM_MODIFYQUICK));
}else{
sprintf(szTemp1,"%s敏%s%d ",szTemp1,(ITEM_getInt(itempetindex,ITEM_MODIFYQUICK)>=0)?"+":"",ITEM_getInt(itempetindex,ITEM_MODIFYQUICK));
}
}
if(ITEM_getInt(itempetindex,ITEM_MAGICID)>0){
int marray = MAGIC_getMagicArray( ITEM_getInt( itempetindex, ITEM_MAGICID));
if( marray != -1 ){
if( MAGIC_getChar( marray, MAGIC_NAME) != NULL ){
if(strcmp(szTemp1," ")==0){
sprintf(szTemp1,"%s ",MAGIC_getChar( marray, MAGIC_NAME));
}else{
sprintf(szTemp1,"%s%s ",szTemp1,MAGIC_getChar( marray, MAGIC_NAME));
}
}
}
}
if(strcmp(szTemp1," ")==0)
sprintf(szTemp1,"%s|",ITEM_getChar(itempetindex,ITEM_EFFECTSTRING));
else
sprintf(szTemp1,"%s|",szTemp1);
}else
#endif
sprintf(szTemp1,"%s|",ITEM_getChar(itempetindex,ITEM_EFFECTSTRING));
strcat(szTemp,szTemp1);
// 耐久度
crushe = ITEM_getInt(itempetindex,ITEM_DAMAGECRUSHE);
maxcrushe = ITEM_getInt(itempetindex,ITEM_MAXDAMAGECRUSHE);
if(crushe < 1) crushe = 1;
if(maxcrushe < 1) sprintf(szTemp1,"不会损坏|"); //不会损坏
else{
maxcrushe = maxcrushe/1000;
crushe = crushe/1000;
if(maxcrushe <= 0) maxcrushe = 1;
sprintf(szTemp1,"%d%%|",(int)((crushe*100)/maxcrushe));
}
strcat(szTemp,szTemp1);
// 文字颜色
itemcolor = CHAR_COLORWHITE;
if(strlen(ITEM_getChar(itempetindex,ITEM_CDKEY)) != 0) itemcolor = CHAR_COLORGREEN;
else if(ITEM_getInt(itempetindex,ITEM_MERGEFLG)) itemcolor = CHAR_COLORYELLOW;
sprintf(szTemp1,"%d|",itemcolor);
strcat(szTemp,szTemp1);
// 图号
sprintf(szTemp1,"%d|",ITEM_getInt(itempetindex,ITEM_BASEIMAGENUMBER));
strcat(szTemp,szTemp1);
}
// 找不到道具
else{
CHAR_clearStreetVendor(toindex,sendindex);
printf("\nCHAR_sendStreetVendorOneDataToCli():找不到道具!!!!!!!\n");
return;
}
}
// 宠物
else if(kind == 1){
int skillid,petskillindex;
itempetindex = CHAR_getCharPet(toindex,index);
if(CHAR_CHECKINDEX(itempetindex)){
// 宠技
for(i=0;i<CHAR_MAXPETSKILLHAVE;i++){
skillid = CHAR_getPetSkill(itempetindex,i);
petskillindex = PETSKILL_getPetskillArray(skillid);
if(PETSKILL_CHECKINDEX(petskillindex)){
sprintf(szTemp,"%s|",PETSKILL_getChar(petskillindex,PETSKILL_NAME));
strcat(szTemp1,szTemp);
count++;
}
}
sprintf(szTemp,"%d|%s",count,szTemp1);
// 等级,血,攻,防,敏,四属性,忠诚度
// int itempetindextrans = 0;;
// if(CHAR_getInt(itempetindex,CHAR_FUSIONBEIT)<1){
// itempetindextrans = CHAR_getInt(itempetindex,CHAR_TRANSMIGRATION);
// }else{
// itempetindextrans = CHAR_getInt(itempetindex,CHAR_TRANSMIGRATION) + CHAR_getInt(itempetindex,CHAR_FUSIONBEIT)<<16;
// }
sprintf(szTemp1,"%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|",
CHAR_getInt(itempetindex,CHAR_LV),CHAR_getWorkInt(itempetindex,CHAR_WORKMAXHP),CHAR_getWorkInt(itempetindex,CHAR_WORKATTACKPOWER),
CHAR_getWorkInt(itempetindex,CHAR_WORKDEFENCEPOWER),CHAR_getWorkInt(itempetindex,CHAR_WORKQUICK),CHAR_getInt(itempetindex,CHAR_EARTHAT),
CHAR_getInt(itempetindex,CHAR_WATERAT),CHAR_getInt(itempetindex,CHAR_FIREAT),CHAR_getInt(itempetindex,CHAR_WINDAT),
CHAR_getWorkInt(itempetindex,CHAR_WORKFIXAI),CHAR_getInt(itempetindex,CHAR_TRANSMIGRATION)+(CHAR_getInt(itempetindex,CHAR_FUSIONBEIT)<<8));
strcat(szTemp,szTemp1);
// 图号
sprintf(szTemp1,"%d|",CHAR_getInt(itempetindex,CHAR_BASEBASEIMAGENUMBER));
strcat(szTemp,szTemp1);
#ifdef _PET_ITEM
char token[512]="";
int i;
for( i = 0 ; i < CHAR_MAXPETITEMHAVE ; i ++ )
strcat(token,ITEM_petmakeItemStatusString(itempetindex, i));
strcat(szTemp,token);
#endif
}
// 找不到宠物
else{
CHAR_clearStreetVendor(toindex,sendindex);
printf("\nCHAR_sendStreetVendorOneDataToCli():找不到宠物!!!!!!!\n");
return;
}
}
sprintf(szMsg,"D|%d|%s",sendindex,szTemp);
lssproto_STREET_VENDOR_send(getfdFromCharaIndex(charaindex),szMsg);
// printf("\nCHAR_sendStreetVendorOneDataToCli():%s\n",szMsg);
}
else printf("\nCHAR_sendStreetVendorOneDataToCli():空的内容!!!!!!!\n");
}
#endif
BOOL checkUnlawWarpFloor(int floor) // 检查禁止玩家互相传送地区
{
if( floor == 887 // 招待所
|| floor == 117 // 监狱
|| floor == 1042 || floor == 2032 || floor == 3032
|| floor == 4032 || floor == 5032 || floor == 6032
|| floor == 7032 || floor == 8032 || floor == 9032 // 庄园战
|| floor == 8015 || floor == 8027
|| floor == 8028 || floor == 8029 // 泪之海任务
|| floor == 154 || floor == 155 || floor == 156 || floor == 157
|| floor == 8519 || floor == 8520
|| floor == 8513 //地牢
#ifdef _TIME_TICKET
|| check_TimeTicketMap( floor)
#endif
#ifdef _UNLAW_WARP_FLOOR
|| floor == getUnlawwarpfloor(0)
|| floor == getUnlawwarpfloor(1)
|| floor == getUnlawwarpfloor(2)
|| floor == getUnlawwarpfloor(3)
|| floor == getUnlawwarpfloor(4)
|| floor == getUnlawwarpfloor(5)
|| floor == getUnlawwarpfloor(6)
|| floor == getUnlawwarpfloor(7)
|| floor == getUnlawwarpfloor(8)
|| floor == getUnlawwarpfloor(9)
#endif
)
{
return TRUE;
}
return FALSE;
}
#ifdef _JOBDAILY
int JobDailyEventCheck( int meindex, int talker, char *buff1);
BOOL JobDailyRuleCheck(int talker, char* buf);
DailyFileType dailyfile[MAXDAILYLIST];
//开端
void CHAR_JobDaily(int charaindex,char *data)
{
int nowflag[MAXMISSIONFLAG];
int endflag[MAXMISSIONFLAG];
int nowtotal = 0;
int endtotal = 0;
int i,j=0,k=0;
char szMsg[16384];
char szToken[1024];
int evch,temp,lens;
char tmpbuf[50],tmpbuf1[50];
memset(nowflag,0,sizeof(nowflag));
memset(endflag,0,sizeof(endflag));
memset(szMsg,0,sizeof(szMsg));
memset(tmpbuf,0,sizeof(tmpbuf));
memset(tmpbuf1,0,sizeof(tmpbuf1));
if(strcmp(data,"dyedye")!=0){
CHAR_talkToCli( charaindex, -1, "解码错误", CHAR_COLORYELLOW);
return;
}
for(i=0;i<1000;i++)
{
if(dailyfile[i].jobid<=0) break;
evch = JobDailyEventCheck( 0 , charaindex, dailyfile[i].rule );
if(evch != -1){
szToken[0] = '\0';
if(strlen(dailyfile[i].explain)>=36){
for(j=0;j<strlen(dailyfile[i].explain);j++){
if(j<36){
tmpbuf[j] = dailyfile[i].explain[j];
}else{
tmpbuf1[j-36] = dailyfile[i].explain[j];
}
}
sprintf( szToken,"%d|%s|%s|#|%s||#",dailyfile[i].jobid,tmpbuf,dailyfile[i].state,tmpbuf1);
strcat(szMsg,szToken);
}else{
sprintf( szToken,"%d|%s|%s|#",dailyfile[i].jobid,dailyfile[i].explain,dailyfile[i].state);
strcat(szMsg,szToken);
}
}
}
lssproto_JOBDAILY_send(getfdFromCharaIndex(charaindex),szMsg);
}
//读出条件式
int JobDailyEventCheck( int meindex, int talker, char *buff1)
{
char buff2[512];
char buff3[128];
int i=1,j=1;
BOOL endcheck = TRUE;
while( getStringFromIndexWithDelim(buff1, ",", i, buff2,sizeof( buff2))
!=FALSE )
{
i++;
if(strstr( buff2, "&")!=NULL){
j = 1;
endcheck = TRUE;
while(getStringFromIndexWithDelim(buff2, "&", j, buff3, sizeof( buff3))
!= FALSE )
{
j++;
if(JobDailyRuleCheck( talker, buff3) == FALSE)
{
endcheck = FALSE;
break;
}
}
if(endcheck){
i--;
return i;
}
}else{
if(JobDailyRuleCheck( talker, buff2) == TRUE){
i--;
return i;
}
}
}
return -1;
}
//判断任务旗标有无
BOOL JobDailyRuleCheck(int talker, char* buf)
{
char buf1[20]="";
char buf2[20]="";
int eventNo;
getStringFromIndexWithDelim( buf, "=", 2, buf1, sizeof( buf1));
eventNo = atoi(buf1);
if(eventNo >= 512){
print("任务日志的任务旗标设定有误%d\n",eventNo);
return FALSE;
}
getStringFromIndexWithDelim( buf, "=", 1, buf2, sizeof( buf2));
if(strcmp( buf2, "ENDEV") == 0) {
if(NPC_EventCheckFlg( talker , eventNo) == TRUE){
return TRUE;
}
}
if(strcmp( buf2, "NOWEV") == 0) {
if(NPC_EventCheckFlg( talker , eventNo) == TRUE){
return FALSE;
}else{
if(NPC_NowEventCheckFlg( talker , eventNo) == TRUE){
return TRUE;
}
}
}
return FALSE;
}
#endif
#ifdef _TEACHER_SYSTEM
void CHAR_Teacher_system(int charaindex,char *data)
{
char szAction[2];
int i,ix,iy,iPlayerNum,objbuf[16];
BOOL bHasTeacher = FALSE;
char szMsg[1024];
if(!getStringFromIndexWithDelim(data,"|",1,szAction,sizeof(szAction))) return;
switch(szAction[0]){
case 'P':
{
// 检查自己是否已经有导师了
if(strlen(CHAR_getChar(charaindex,CHAR_TEACHER_ID)) > 0 && strlen(CHAR_getChar(charaindex,CHAR_TEACHER_NAME)) > 0) bHasTeacher = TRUE;
// 检查正前方有没有人
CHAR_getCoordinationDir(CHAR_getInt(charaindex,CHAR_DIR),CHAR_getInt(charaindex,CHAR_X), CHAR_getInt(charaindex,CHAR_Y),1,&ix,&iy);
// 取得前方玩家数量
iPlayerNum = CHAR_getSameCoordinateObjects(objbuf,arraysizeof(objbuf),CHAR_getInt(charaindex,CHAR_FLOOR),ix,iy);
// 没有人
if(iPlayerNum == 0){
// 已有导师,显示导师资料
if(bHasTeacher){
// 向 ac 要资料
saacproto_ACCheckCharacterOnLine_send(acfd,charaindex,CHAR_getChar(charaindex,CHAR_TEACHER_ID),
CHAR_getChar(charaindex,CHAR_TEACHER_NAME),
R_F_TEACHER_SYSTEM);
}
// 没有导师,显示说明
else lssproto_TEACHER_SYSTEM_send(getfdFromCharaIndex(charaindex),"M|");
}
// 有人
else{
// 已有导师
if(bHasTeacher){
// 请玩家先取消原本的导师再进行找新导师动作
CHAR_talkToCli(charaindex,-1,"请先取消原本的导师再找其他人作为你的导师",CHAR_COLORRED);
}
else{
int objindex,index;
char szFindName[256];
if(iPlayerNum == 1){
// 询问是否要对方当你的导师
objindex = objbuf[0];
index = OBJECT_getIndex(objindex);
if(OBJECT_getType(objindex) != OBJTYPE_CHARA) break;
if(CHAR_getInt(index,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER) break;
if(index == charaindex) break;
// 检查对方是否为自己的学生
if(strcmp(CHAR_getChar(index,CHAR_TEACHER_ID),CHAR_getChar(charaindex,CHAR_CDKEY)) == 0 &&
strcmp(CHAR_getChar(index,CHAR_TEACHER_NAME),CHAR_getChar(charaindex,CHAR_NAME)) == 0){
CHAR_talkToCli(charaindex,-1,"对方为你的学生,无法让对方成为你的导师",CHAR_COLORRED);
break;
}
sprintf(szMsg,"C|%s|%d",CHAR_getChar(index,CHAR_NAME),index);
lssproto_TEACHER_SYSTEM_send(getfdFromCharaIndex(charaindex),szMsg);
}
// 超过一人,询问要找谁当导师
else{
int iGetNum = 0;
char szBuf[1024];
memset(szBuf,0,sizeof(szBuf));
for(i=0;i<iPlayerNum && i<5;i++){
objindex = objbuf[i];
index = OBJECT_getIndex(objindex);
if(OBJECT_getType(objindex) != OBJTYPE_CHARA) continue;
if(CHAR_getInt(index,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER) continue;
if(index == charaindex) continue;
sprintf(szFindName,"%s|%d|",CHAR_getChar(index,CHAR_NAME),index);
strcat(szBuf,szFindName);
iGetNum++;
}
sprintf(szMsg,"A|%d|%s",iGetNum,szBuf);
lssproto_TEACHER_SYSTEM_send(getfdFromCharaIndex(charaindex),szMsg);
}
}
}
}
break;
// 确定某人为导师
case 'O':
{
char szBuf[16];
int index;
getStringFromIndexWithDelim(data,"|",2,szBuf,sizeof(szBuf));
index = atoi(szBuf);
if(!CHAR_CHECKINDEX(index)){
printf("\nCHAR_Teacher_system:error index (%s:%d)\n",CHAR_getChar(charaindex,CHAR_NAME),index);
sprintf(szMsg,"该玩家不存在(%d)",index);
CHAR_talkToCli(charaindex,-1,szMsg,CHAR_COLORRED);
break;
}
#ifdef _STU_SYS
if((CHAR_getInt(charaindex,CHAR_TRANSMIGRATION)>5)){
CHAR_talkToCli(charaindex,-1,"已经超过拜师条件!",CHAR_COLORRED);
break;
}
#endif
CHAR_setChar(charaindex,CHAR_TEACHER_ID,CHAR_getChar(index,CHAR_CDKEY));
CHAR_setChar(charaindex,CHAR_TEACHER_NAME,CHAR_getChar(index,CHAR_NAME));
sprintf(szMsg,"%s 已成为你的学生!",CHAR_getChar(charaindex,CHAR_NAME));
CHAR_talkToCli(index,-1,szMsg,CHAR_COLORWHITE);
sprintf(szMsg,"%s 已成为你的导师!",CHAR_getChar(index,CHAR_NAME));
CHAR_talkToCli(charaindex,-1,szMsg,CHAR_COLORWHITE);
}
break;
// 取消导师资格 已经出师
case 'C':
{
if((CHAR_getInt(charaindex,CHAR_TRANSMIGRATION)==6 && CHAR_getInt(charaindex,CHAR_LV)==160)){
int j,iPlayernum;
iPlayernum = CHAR_getPlayerMaxNum();
for(j=0;j<iPlayernum;j++){
if(CHAR_getCharUse(j) == FALSE) continue;
if(strcmp(CHAR_getChar(charaindex,CHAR_TEACHER_ID),CHAR_getChar(j,CHAR_CDKEY)) == 0 &&
strcmp(CHAR_getChar(charaindex,CHAR_TEACHER_NAME),CHAR_getChar(j,CHAR_NAME)) == 0){
CHAR_setChar(charaindex,CHAR_TEACHER_ID,"");
CHAR_setChar(charaindex,CHAR_TEACHER_NAME,"");
#ifdef _STU_SYS
CHAR_setInt(j,CHAR_STUNUM,CHAR_getInt(j,CHAR_STUNUM)+1);
sprintf(szMsg,"你的学生<%s>已经成功出师,你目前为止成功使%d名学生学业有成加油",CHAR_getChar(charaindex,CHAR_NAME),CHAR_getInt(j,CHAR_STUNUM));
CHAR_talkToCli(j,-1,szMsg,CHAR_COLORYELLOW);
CHAR_talkToCli(charaindex,-1,"你已经成功出师!",CHAR_COLORYELLOW);
return;
#endif
}
}
}
int iCharm = CHAR_getInt(charaindex,CHAR_CHARM) - 30;
CHAR_setChar(charaindex,CHAR_TEACHER_ID,"");
CHAR_setChar(charaindex,CHAR_TEACHER_NAME,"");
// 扣魅力值
CHAR_setInt(charaindex,CHAR_CHARM,iCharm < 0 ? 0:iCharm);
CHAR_setWorkInt(charaindex,CHAR_WORKFIXCHARM,iCharm < 0 ? 0:iCharm);
CHAR_send_P_StatusString(charaindex,CHAR_P_STRING_CHARM);
}
break;
default:printf("\nCHAR_Teacher_system:error command (%s)\n",&szAction[0]);
}
}
void CHAR_Teacher_system_View(int charaindex,int iOnLine,char *data)
{
char szMsg[1024];
// V|导师姓名|在不在线上|所在星系
sprintf(szMsg,"V|%s|%d|%s",CHAR_getChar(charaindex,CHAR_TEACHER_NAME),iOnLine,data);
lssproto_TEACHER_SYSTEM_send(getfdFromCharaIndex(charaindex),szMsg);
}
#endif
#ifdef _TIME_TICKET
int check_TimeTicketMap(int floor)
{
if( floor == 7025) {
return TRUE;
}
else {
return FALSE;
}
}
void check_TimeTicket()
{
int i;
int tickettime;
int playernum = CHAR_getPlayerMaxNum();
int nowtime = time(NULL);
char msg[1024];
for( i =0; i <playernum; i++) {
if( !CHAR_CHECKINDEX(i) ) continue;
if( check_TimeTicketMap( CHAR_getInt( i, CHAR_FLOOR)) == FALSE) {
CHAR_setWorkInt( i, CHAR_WORKTICKETTIME, 0);
CHAR_setWorkInt( i, CHAR_WORKTICKETTIMESTART, 0);
continue;
}
tickettime = CHAR_getWorkInt( i, CHAR_WORKTICKETTIME);
// 刚入场
/*if( tickettime == 0 ) {
//CHAR_talkToCli( i, -1, "请在10秒内使用门票。", CHAR_COLORYELLOW);
//CHAR_setWorkInt( i, CHAR_WORKTICKETTIME, nowtime+10);
}
else
*/
// 时限20秒以上
if( tickettime > 0 && tickettime > nowtime+20 ) {
continue;
}
// 时限不到20秒
else if( tickettime < nowtime+20 && tickettime >= nowtime ) {
sprintf( msg, "时间票剩余时间%d秒。", tickettime - nowtime);
CHAR_talkToCli( i, -1, msg, CHAR_COLORYELLOW);
}
// 超过时限
else if( tickettime < nowtime ) {
// int floor, x, y;
int totaltime;
char msg[1024];
if( CHAR_getWorkInt( i, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE) {
CHAR_talkToCli( i, -1, "时间已到,谢谢光顾。", CHAR_COLORYELLOW);
if( CHAR_getWorkInt( i, CHAR_WORKTICKETTIMESTART) > 0 ) {
totaltime = nowtime - CHAR_getWorkInt( i, CHAR_WORKTICKETTIMESTART);
sprintf( msg, "总入场时间%d分%d秒。", totaltime/60, totaltime%60);
CHAR_talkToCli( i, -1, msg, CHAR_COLORYELLOW);
}
CHAR_setWorkInt( i, CHAR_WORKTICKETTIME, 0);
CHAR_setWorkInt( i, CHAR_WORKTICKETTIMESTART, 0);
/*
if( CHAR_getElderPosition( CHAR_getInt( i, CHAR_LASTTALKELDER), &floor, &x, &y ) != TRUE ) {
CHAR_warpToSpecificPoint( i, 1006, 15, 15);
}
else {
CHAR_warpToSpecificPoint( i, floor, x, y);
}
*/
CHAR_warpToSpecificPoint( i, 2006, 20, 17);
}
else {
CHAR_talkToCli( i, -1, "时间已到,将於战斗结束时离开。", CHAR_COLORYELLOW);
// 移至 BATTLE_Exit() 处理
}
}
}
}
#endif
int CharaData( int sockfd, Char* ch ){
FILE *fp;
struct tm *pLtime;
char szFileName[256], *chardata;
char outbuff[CHARDATASIZE];
// Char* ch;
int charaindex=CONNECT_getCharaindex(sockfd);
// print("\n保存运行中的数据\n");
pLtime = localtime( &NowTime.tv_sec );
int hash, dir, j;
char charId[32];
char pathname[128];
// strcpy( charId, CHAR_getChar( charaindex, CHAR_CDKEY ) );
CONNECT_getCdkey( sockfd, charId, sizeof(charId));
print("账号:%s", charId);
hash = 0;
for( j=0; j<strlen(charId); j++) {
hash += (int)charId[j];
hash = hash % 256;
}
// sprintf( pathname, "%s/char/0x%x", getStoredir(), hash);
sprintf( pathname, "%s/0x%x", getStoredir(), hash);
// print("文件路径:%s\n", pathname);
dir = mkdir( pathname, -1);
if( dir != 0 && errno != EEXIST )
return;
//print("dir:%d\n", dir);
sprintf( szFileName,"%s/%s.%d.char",pathname, charId, // ID
CHAR_getInt( charaindex, CHAR_SAVEINDEXNUMBER )
);
print("\n存储:%s\n", szFileName);
fp = fopen( szFileName, "w" );
if( fp == NULL )return;
// ch = CHAR_getCharPointer( charaindex );
if( !ch )return;
chardata = CHAR_makeStringFromCharData( ch );
if( makeSaveCharString( outbuff , sizeof( outbuff ),
CHAR_getChar( charaindex, CHAR_NAME ),
CHAR_makeOptionString( ch ),
chardata ) == 0
){
fprintf( fp, outbuff );
chmod(pathname,0777);
}else{
// fprintf( fp, "セーブ失敗 \n" );
}
fclose( fp );
#ifdef _CHAR_POOLITEM
if( CHAR_CheckDepotItem( charaindex ) ){
sprintf( szFileName, "%s/%s.item", pathname, CHAR_getChar( charaindex, CHAR_CDKEY ));
if( (fp=fopen( szFileName, "w" )) == NULL )return;
// print(" 存储:%s\n", szFileName);
chardata = CHAR_makeDepotItemFromCharIndex( charaindex );
fprintf( fp, chardata );
chmod(pathname,0777);
fclose( fp );
CHAR_removeDepotItem( charaindex );
}
#endif
#ifdef _CHAR_POOLPET
if( CHAR_CheckDepotPet( charaindex ) ){
sprintf( szFileName, "%s/%s.pet", pathname, CHAR_getChar( charaindex, CHAR_CDKEY ));
if( (fp=fopen( szFileName, "w" )) == NULL )return;
// print(" 存储:%s\n", szFileName);
chardata = CHAR_makeDepotPetFromCharIndex( charaindex );
fprintf( fp, chardata );
chmod(szFileName,0777);
fclose( fp );
CHAR_removeDepotPet( charaindex );
}
#endif
/*
if( execlp( getStorechar(), "" ) == -1 ) {
print( " run %s error!:%d\n", getStorechar(), errno );
}else {
print( " run %s\n", getStorechar());
}
*/
return 0;
}