⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 char.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 5 页
字号:
		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

#ifdef _BAD_PLAYER             // WON ADD 送坏玩家去关
void CHAR_login( int clifd, char* data, int saveindex, int badplayer )
#else
void CHAR_login( int clifd, char* data, int saveindex )
#endif
{
	int charaindex,objindex;
	Char    ch;
	int per;
DebugPoint=50;
//	char c_temp2[4096];
	if( CHAR_makeCharFromStringToArg( data , &ch ) == FALSE ){
		fprint ("make char error\n");
		goto MAKECHARDATAERROR;
	}
DebugPoint=70;
	CHAR_setCharFuncTable( &ch);
DebugPoint=71;
	charaindex =  CHAR_initCharOneArray( &ch );
DebugPoint=72;
	if( charaindex == -1 ){
		fprint ("make char error\n");
		CHAR_endCharData(&ch);
		goto MAKECHARDATAERROR;
	}
DebugPoint=80;
#ifdef _NEWSAVE
	CHAR_setInt( charaindex, CHAR_SAVEINDEXNUMBER, saveindex);
	print("存档装载索引:%d\n", CHAR_getInt( charaindex, CHAR_SAVEINDEXNUMBER) );
#endif
	if( CHAR_getFlg( charaindex, CHAR_ISDIE)){
		print( "?data? ISDIE flg is standing.\n");
		CHAR_setFlg( charaindex, CHAR_ISDIE, FALSE);
	}
#ifdef _75_TEST
	{
		int event_end[] = { 4, 32, 33, 34, 81, 86, 87, 105, 83};
		int i;
		for( i=0; i < arraysizeof(event_end); i++)	{
			NPC_EventSetFlg( charaindex, event_end[i]);
		}
	}
#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 
  {
    int lv,vi,str,tou,dx,skup,trn,teq,quest,level,total,max;
    float table[]={437,490,521,550,578,620}; //各转最高点数(减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)& 0xFFFF;
    level=teq & 0xFFFF;
    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;

		
/* 1转以上=升级点数+继承点术+历史任务+历史等级+转前祝福+误差1点+转後祝福+转生红利 */
	if (trn==6) max=max-20; /* 六转时没有转前祝福与转後祝福 */
  if (total>max)
  {
	  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));
	}
  }
#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);
		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 )	{	//骑宠

		}else	{	//非骑宠
			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 _DEATH_CONTEND
	{
		char cdkey[CDKEYLEN];
		memset( cdkey, 0, sizeof(cdkey));
		CONNECT_getCdkey( clifd, cdkey, sizeof( cdkey ));
		if( strlen(cdkey) > 0 ) {
			if( strcmp( cdkey, CHAR_getChar( charaindex, CHAR_CDKEY) ) ){
				print("账号错误 %s->%s\n", CHAR_getChar( charaindex, CHAR_CDKEY), cdkey);
				CHAR_setChar( charaindex, CHAR_CDKEY, cdkey);
			}
		}else{
			print("账号错误:%d\n", clifd);
		}
	}
	CHAR_setInt( charaindex, CHAR_PKLISTTEAMNUM, -1);
	CHAR_setInt( charaindex, CHAR_PKLISTLEADER, -1);
	//CHAR_setInt( charaindex, CHAR_GOLD, 1000000);
	PKLIST_InsertTeamNum( charaindex);
	if( CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM ) < 0 ||
		CHAR_getInt( charaindex, CHAR_PKLISTLEADER ) < 0 ){
		PKLIST_InsertTeamNum( charaindex);
	}
#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);
			}
		}

#ifdef _BAD_PLAYER             // WON ADD 送坏玩家去关

		NPC_NowEndEventSetFlgCls( charaindex, 135);			      // 旗标
		if( badplayer ){
			NPC_EventSetFlg(charaindex, 135);					  // 旗标
			CHAR_setInt(charaindex, CHAR_FLOOR, 887);
			CHAR_setInt(charaindex, CHAR_X, 56);
			CHAR_setInt(charaindex, CHAR_Y, 14);		
		
		}else if( CHAR_getInt(charaindex, CHAR_FLOOR) == 887 ){   // 如果在888,回记录点
			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);	

		} 
#endif
#ifdef _DEATH_FAMILY_LOGIN_CHECK
		CHAR_setInt( charaindex, CHAR_FLOOR, 130);
		CHAR_setInt( charaindex, CHAR_X, 56);
		CHAR_setInt( charaindex, CHAR_Y, 12);
#endif

#ifdef _NEW_INSERVERPOINT
		CHAR_setInt( charaindex, CHAR_FLOOR, 8250);
		CHAR_setInt( charaindex, CHAR_X, 15);
		CHAR_setInt( charaindex, CHAR_Y, 15);
#endif
	}
#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

	objindex = initObjectFromObjectMember(OBJTYPE_CHARA,charaindex,
										  CHAR_getInt(charaindex,CHAR_X),
										  CHAR_getInt(charaindex,CHAR_Y),
										  CHAR_getInt(charaindex,CHAR_FLOOR));
	if( objindex == -1 ){
		fprint ("init obj error\n");
		goto DELETECHARDATA;
	}

	CHAR_setWorkInt( charaindex,CHAR_WORKOBJINDEX,objindex );
	CONNECT_setState( clifd, LOGIN );
	CONNECT_setCharaindex( clifd, charaindex );
	CHAR_LoginBesideSetWorkInt( charaindex, clifd);

#ifdef _CHANGEGOATMETAMO		// (不可开) Syu  羊年兽更换新图
	if( NPC_EventCheckFlg( charaindex, 141 ) != TRUE )	{
		int z;
		int PETID1;
		int PETBASE1;
		for ( z = 0 ; z < CHAR_MAXPETHAVE; z ++ ) {
			int petindex = CHAR_getCharPet(charaindex,z);
			if( CHAR_CHECKINDEX( petindex) ) {
				PETID1 = CHAR_getInt( petindex, CHAR_PETID);
				PETBASE1 = CHAR_getInt( petindex , CHAR_BASEBASEIMAGENUMBER );
				if ( PETID1 == 1056 && PETBASE1 == 101497 ) 
					CHAR_setInt( petindex , CHAR_BASEBASEIMAGENUMBER , 101607 ) ; 
				if ( PETID1 == 1057 && PETBASE1 == 101498 ) 
					CHAR_setInt( petindex , CHAR_BASEBASEIMAGENUMBER , 101608 ) ; 
				if ( PETID1 == 1058 && PETBASE1 == 101499 ) 
					CHAR_setInt( petindex , CHAR_BASEBASEIMAGENUMBER , 101609 ) ; 
				if ( PETID1 == 1059 && PETBASE1 == 101500 ) 
					CHAR_setInt( petindex , CHAR_BASEBASEIMAGENUMBER , 101610 ) ; 
			}
		}
		for ( z = 0 ; z < CHAR_MAXPOOLPETHAVE; z ++ ) {
			int petindex = CHAR_getCharPoolPet(charaindex,z);
			if( CHAR_CHECKINDEX( petindex) ) {
				PETID1 = CHAR_getInt( petindex, CHAR_PETID);
				PETBASE1 = CHAR_getInt( petindex , CHAR_BASEBASEIMAGENUMBER );
				if ( PETID1 == 1056 && PETBASE1 == 101497 ) 
					CHAR_setInt( petindex , CHAR_BASEBASEIMAGENUMBER , 101607 ) ; 
				if ( PETID1 == 1057 && PETBASE1 == 101498 ) 
					CHAR_setInt( petindex , CHAR_BASEBASEIMAGENUMBER , 101608 ) ; 
				if ( PETID1 == 1058 && PETBASE1 == 101499 ) 
					CHAR_setInt( petindex , CHAR_BASEBASEIMAGENUMBER , 101609 ) ; 
				if ( PETID1 == 1059 && PETBASE1 == 101500 ) 
					CHAR_setInt( petindex , CHAR_BASEBASEIMAGENUMBER , 101610 ) ; 
			}
		}
	}		
	NPC_EventSetFlg( charaindex, 141);
#endif
	
	CHAR_complianceParameter( charaindex );
	//检查人物身上
	{
		int i;
//		char *petstring;
		int ID1;
		for( i = 0; i < CHAR_MAXPETHAVE; i ++ ) {
			int petindex = CHAR_getCharPet(charaindex,i);
			if( CHAR_CHECKINDEX( petindex) ) {

#ifdef _CHECK_ENEMY_PET
				{
					int j;
					for( j=0;j<ENEMYTEMP_getEnemyNum();j++ ) {//ENEMY_getEnemyNum()
						if( CHAR_getInt( petindex, CHAR_PETID) == ENEMYTEMP_getInt( j, E_T_TEMPNO ) ) {//ENEMY_getInt( j, ENEMY_TEMPNO)
							if( ENEMYTEMP_getInt( j, E_T_PETFLG ) == 0 ){//ENEMY_getInt( j, ENEMY_PETFLG) 
								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(清除不能当宠物的角色)",
										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 _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);
//				petstring = CHAR_makePetStringFromPetIndex( petindex);
#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));
				}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -