📄 char.c
字号:
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 */
"core_Loop", /* CHAR_LOOPFUNC */
"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, itemindex;
for( i=0; i<CHAR_STARTITEMARRAY; i++){ //检查装备中道具
int ti;
itemindex = CHAR_getItemIndex( charaindex , i );
if( !ITEM_CHECKINDEX( itemindex)){
continue;
}
ITEM_setItemUniCode( itemindex);
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 );
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_setItemUniCode( itemindex);
}
//检查寄放店道具
for( i = 0 ; i < CHAR_MAXPOOLITEMHAVE ; i++ ){
itemindex = CHAR_getPoolItemIndex( charaindex , i );
if( !ITEM_CHECKINDEX( itemindex) ) continue;
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);
#ifdef _ITEM_ADDEXP //vincent 经验提升
CHAR_setWorkInt(charaindex,CHAR_WORKITEM_ADDEXP, 0);
CHAR_setWorkInt(charaindex,CHAR_WORKITEM_ADDEXPTIME, 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 _ITEM_ADDEXP2
CHAR_setWorkInt( charaindex, CHAR_WORKITEM_ADDEXP,
CHAR_getInt( charaindex, CHAR_ADDEXPPOWER) );
CHAR_setWorkInt( charaindex, CHAR_WORKITEM_ADDEXPTIME ,
CHAR_getInt( charaindex, CHAR_ADDEXPTIME) );
#endif
}
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;
NPC_EventSetFlg( toindex, 156);
return TRUE;
}
static void CHAR_setLuck( int charaindex);
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];
CONNECT_getCdkey( clifd, cdkey, sizeof( cdkey ));
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;
}
printf("\ncharaindex:%d\n",charaindex);
if( CHAR_getFlg( charaindex, CHAR_ISDIE)){
print( "?data? ISDIE flg is standing.\n");
CHAR_setFlg( charaindex, CHAR_ISDIE, FALSE);
}
#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
{
int lv,vi,str,tou,dx,skup,trn,teq,quest,level,total,max;
float table[]={437,490,521,550,578,620,888}; //各转最高点数(减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;
#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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -