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

📄 skill.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#include "..\stdafx.h"
#include "DefaultHeader.h"
#include "Citem.h"
#include "Kein_item.h"
#include "Sealstone.h"
#include "..\HigherLayers\WeatherControl.h"//020610 lsw
#include "Scrp_exe.h"
#include "..\LowerLayers\servertable.h"	// BBD 040311

extern void SaveBallancingSkill( LPCHARLIST a, int skillno );

extern int CanLocalWarAttack(CHARLIST* pAttacker,CHARLIST* pDefencer);		// 020115 LTS 弥己悼 ,烙惑快傍悼 //020205 lsw
extern int CheckEventAttack();
extern bool isLevelUp(CHARLIST*);

t_ItemRare ItemRare[MAX_ITEM_RARE];
t_ItemGrade ItemGrade[MAX_ITEM_GRADE];
t_ItemMutantKind ItemMutantKind[MAX_ITEM_MUTANT_KIND];

static lpMAPSKILLTABLE	g_Header[8][8];
CItem_Join	item_join[ ITEM_JOIN_MAX];
t_earthpower EarthPower;
int TotalItemJoinTableCount;
int Npc_Item_Table[NPC_ITEM_TABLE_X][NPC_ITEM_TABLE_Y];	//npc啊 磷阑锭 唱棵 酒捞袍甸捞 葛咯乐绰 抛捞喉
int SkillLevelExp[ SKILL_LEVEL_EXP_TABLE_MAX_ + 1 ][ SKILL_LEVEL_EXP_TABLE_MAX_ +1 ];
int SkillExp[ SKILL_EXP_TABLE_MAX_ +1 ][SKILL_EXP_TABLE_MAX_ +1 ];
int MAX_JOB_LEVEL = 100; // CSD-040223

//<! BBD 040311
unsigned short	g_UsercountInServerSet = 1501;		// 弥檬 1501悼立捞扼绊 焊绊 矫累茄促.
float resource_rate[6] =
{
	// 悼立俊 蝶弗 磊盔 硅啦
	1.0f, 1.2f, 1.4f, 1.6f, 1.8f, 2.0f
};

//<! BBD 040322 俊捞辑侩
float resource_rate2[6] =
{
	// 悼立俊 蝶弗 磊盔 硅啦
	1.4f, 1.55f, 1.7f, 1.85f, 2.0f, 2.15f
};
//> BBD 040322

float GetResourceRate(int nCount);
//> BBD 040311

extern HDBC hDBC;
extern void SendOtherInv( int type, int other_id, t_connection c[], int cn );
extern void SendNK( int id, int nk );
extern inline int	IsHeNK(  LPCHARLIST ch, int nation  );
extern inline int	OutNK( LPCHARLIST ch, int nation );
extern void			InNK( LPCHARLIST ch, int nation, short int add_nk );
extern inline bool	IsWarfare( int anation, int bnation );
extern int			GetCaseOfNK( int cur_nation, int a_nation, int d_nation, int a_nk, int d_nk ) ;
extern void			CheckNK( int a_id, int d_id, int type  );
extern bool ExtraExp(void);
extern int	addEXP(CHARLIST *a, CHARLIST *d, int criteria, int damage );

extern void RequestUsercountToProxy();		// BBD 040311

// 030307 soto眠啊 吝赋瘤开牢瘤 魄窜茄促.
bool IsNeutralZone(int nMapNumber)
{	//< CSD-030314   
	return (MapInfo[nMapNumber].nation == 0) ? true:false; //吝赋瘤开俊辑父 档迪龙捞 啊瓷窍促.
}	//> CSD-030314
// soto End. 

int skillProb_k1( const int skillno, CItem_Join *join )
{	
	int k1 = 65;
	
	if( join ) // ItemJoinTable俊辑 k1阑 啊廉柯促.
	{
		k1 = join->k1;
	}
	else
	{
		k1 = SkillTbl[skillno].k1;
	}
	if( k1 < 0 ) k1 = 0;
	if( k1 > 100 ) k1 = 100;
	return k1;
}	
//-----------------------------------------------------
// 扁  瓷 : 扁贱 己傍涪狼 弥家蔼阑 府畔茄促. 
// 牢  磊 : 扁贱锅龋.
// 府畔蔼 : 0 < n < 100 
//-----------------------------------------------------
int skillProb_k2( const int skillno, CItem_Join *join )
{	
	int k2 = 65;
	if( join ) // ItemJoinTable俊辑 k2阑 啊廉柯促.
	{
		k2 = join->k2;
	}
	else
	{
		k2 = SkillTbl[skillno].k2;
	}
	if( k2 < 0 ) k2 = 0;
	if( k2 > 100 ) k2 = 100;
	return k2;
}	

int skillProb_needmax( const int skillno, const int target_id, CItem_Join *join )
{	
	int ret = 0;

	switch( SkillTbl[skillno].MotherSkillExp )
	{
		// 公炼扒 100%
	case 0 : ret = 100; 
		break;

		// 弊成 1 - 100
	case 1 : ret = 100;							
		break;	

		// 秦寸 酒摹袍狼 搬钦抛捞喉曼炼..
	case 2 : if( join == NULL ) ret = 0;
		else 
		{
			ret = join->skill1_maximum;	
			return ret;
		}
		break;

		// 秦寸 胶懦狼 抛捞喉曼炼.
	case 3 : ret = SkillTbl[ skillno].Ability_max;
		break;

		// 胶懦狼 怕腐磐 单捞磐 曼炼..( 抛捞怪 )
	case 4 : if( target_id >= 10000 )
			 {
				ret = NPC_Gen_Ref[NPCList[ target_id - 10000].SprNo].Taming_max;
			 }
			 else
			 {
				ret = 100;
			 }break;
		
		// 秦寸 胶懦狼 某腐磐 单捞磐 曼炼..
	case 5 : if( target_id >= 10000 )
			 {
				 ret = NPC_Gen_Ref[NPCList[ target_id-10000].SprNo].Talkanimal_max;
			 }
			 else
			 {
				ret = 100;
			 }break;
		
		// 酒捞袍狼 漂己 曼炼..版累...
	case 6 :  ret = 100;							
		break;

		// 拱绊扁 抛捞喉 曼炼.. 超矫.
	case 7 :  ret = 100;

		// 秦寸 胶懦 某腐磐 单捞磐 曼炼 ( 澜厩胶懦 ) 
	case 8 :
	case 9 :
	case 10:
	case 11:
	case 12:
	case 13:
	case 14:
	case 15:
	default :	ret = 100;
		break;
	}
	if( ret < 0 ) ret = 0;
	if( ret > 100 ) ret = 100;
	return ret;
}

int skillProb_needmin( const int skillno, const int target_id, CItem_Join *join )
{	
	int ret = 25;
	switch( SkillTbl[skillno].MotherSkillExp )
	{
		// 公炼扒 100%
	case 0 : ret = 1; 
		break;

		// 弊成 1 - 100
	case 1 : ret = 1;							
		break;	

		// 秦寸 酒摹袍狼 搬钦抛捞喉曼炼..
	case 2 : if( join == NULL ) ret = 0;
			 else ret = join->skill1_minimum;		
		break;

		// 秦寸 胶懦狼 抛捞喉曼炼.
	case 3 : ret = SkillTbl[ skillno].Ability_min;
		break;

		// 胶懦狼 怕腐磐 单捞磐 曼炼..( 抛捞怪 )
	case 4 :	if( target_id >= 10000 )
				{
					ret = NPC_Gen_Ref[NPCList[ target_id - 10000].SprNo].Taming_min;
				}
				else
				{
					ret = 1;
				}
		break;
		
		// 秦寸 胶懦狼 某腐磐 单捞磐 曼炼..
	case 5 : if( target_id >= 10000 )
			 {
				ret = NPC_Gen_Ref[NPCList[ target_id-10000].SprNo].Talkanimal_min;
			 }
			 else
			 {
				 ret = 1;
			 }
		 
		break;
		
		// 酒捞袍狼 漂己 曼炼..版累...
	case 6 :  ret = 1;							
		break;

		// 拱绊扁 抛捞喉 曼炼.. 超矫.
	case 7 :  ret = 1;

		// 秦寸 胶懦 某腐磐 单捞磐 曼炼 ( 澜厩胶懦 ) 
	case 8 :
	case 9 :
	case 10:
	case 11:
	case 12:
	case 13:
	case 14:
	case 15:
	default :	ret = 1;
		break;
	}

	if( ret < 0 ) ret = 0;
	if( ret > 100 ) ret = 100;
	return ret;
}

int ReturnSkillProbablity(	const int cn, const int skillno, const int x, const int y, 
							const int targettype, const int target_id,CItem_Join *joinitem = NULL )
{	
	if( cn >= 10000 ) return 0;
	
	const int needmin = skillProb_needmin( skillno, target_id, joinitem );//聪靛固聪肛 罐酒坷绰镑! //this2 lsw
	const int needmax = skillProb_needmax( skillno, target_id, joinitem );
	int base = needmax - needmin;
	
	if( base < 0 ) 
	{
		return 0; 
	}
	if( base <= 0 ) 
	{
		base = 1;
	}

	int mybase = connections[ cn].chrlst.skillexp[ SkillTbl[skillno].MotherSkillType].skillexp / 10000 -  needmin;

	double k = (double)mybase / (double)base;

	if(k>1) k=1;
	
	const int k1 =  skillProb_k1( skillno, joinitem );
	const int k2 =  skillProb_k2( skillno, joinitem );	
	
	int hitrate =  (int)(k * k1 + k2);
	
	if( hitrate < 0 )	hitrate = 0;
	if( hitrate > 100 ) hitrate = 100;

	AddSkillExp( cn, skillno, hitrate );

	return hitrate;
}	

void SendSkillResultFail( const int cn, const int iSkillNo, const int iWhy = 0 )
{	
	t_packet p;
	p.h.header.type = CMD_SKILL_RESULT_FAIL;
	p.u.server_skill_result_fail.skillno	= iSkillNo;
	p.u.server_skill_result_fail.why		= iWhy;
	p.h.header.size = sizeof( t_server_skill_result_fail );
	QueuePacket( connections, cn, &p, 1);
}	

void SendViewCharInfo(const int cn, int target_id, int type, DWORD data, char *killer)
{
	t_packet p;
	int len;

	p.h.header.type = CMD_VIEW_CHAR_INFO;
	p.u.view_char_info.server_id= target_id;
	p.u.view_char_info.type		= type;
	p.u.view_char_info.data		= data;
	if( killer )
	{
		if( killer[0] )	EatRearWhiteChar( killer );
		len = strlen( killer );
	}
	else len = 0;

	if( killer != NULL ) strcpy( p.u.view_char_info.killer, killer );
	else	p.u.view_char_info.killer[0] = 0;

	p.h.header.size = sizeof( t_view_char_info ) - ( 31 - len );

	QueuePacket( connections, cn, &p, 1);
}

//1013 zhh 烹唱公客 格犁俊父 阂捞 嘿绰 巴阑 官槽促
int skill_Makefire_preCheck	(const int cn, const int skillno, const int x, const int y, const int targettype, const int target_id )
{	
	
	int ret = ReturnSkillProbablity( cn, skillno, x, y, targettype, target_id );
	if( ret == 0 ) { SendSkillResultFail(cn, skillno); return 0; }

	switch( ItemList[target_id].item_no  )
	{
	case 1011	:	//	<Log>	<烹唱公>
	case 1012	:	//	<Timber>	<格犁>	
	case 1023	:	//	<Nutmeg Log>	<厚磊唱公>
	case 1024	:	//	<唱公>	<府扁促唱公>
	case 1025	:	//	<Fir Log>	<备惑唱公>
	case 1026	:	//	<Oak Log>	<惑荐府唱公>
	case 1027	:	//	<唱公>	<芭力荐唱公>
	case 1028	:	//	<Beech Log>	<呈档广唱公>
	case 1029	:	//	<Whitebirch Log>	<磊累唱公 >
	case 1030	:	//	<Nutmeg Timber>	<厚磊唱公 格犁>
	case 1031	:	//	<唱公>	<府扁促唱公 格犁>
	case 1032	:	//	<Fir Timber>	<备惑唱公 格犁>
	case 1033	:	//	<Oak Timber>	<惑荐府唱公 格犁>
	case 1034	:	//	<唱公>	<芭力荐唱公 格犁>
	case 1035	:	//	<Beech Timber>	<呈档广唱公 格犁>
	case 1036	:	//	<Whitebirch Timber>	<磊累唱公 格犁>
		break;
		
	default :
				SendSkillResultFail(cn, skillno);
				return 0;		
	} 
	
	if( ( ItemList[ target_id].attr[ IATTR_ATTR] & IA2_FIRE ) == 0 )
	{
		ItemList[ target_id].attr[ IATTR_ATTR] |= IA2_NOTMOVE;
		SetArea( CHANGE_IA2_ATTR_ITEM_AREA, target_id );
	}
				
	return 1; 
}	

void PrintSkillItemJoin( void  )
{			
	FILE *fp;
	CItem_Join *s;
	int i;
	int no;
			
	fp = fopen( "./OutPut/WhatNeededToMakeItem.txt", "wt");
	if( fp == NULL ) return;
			
	for( i = 0 ; i < TotalItemJoinTableCount ; i ++)
	{		
		s = &item_join[i];
			
		no = s->item_id;
		CItem *ii = ItemUnit( no/1000, no%1000 );
			
		if( ii == NULL ) 
		{	
			fprintf( fp, "\n %d俊 乐绰 Item篮 荤侩登瘤 臼绰 Item捞啊夸? \n\n", no ); 
			continue;
		}	
			
		fprintf( fp, "'%s(%d)'阑 掘阑妨搁 '%s(%d)扁贱捞 鞘夸.\n", ii->GetHanName(), no, 
						SkillTbl[s->need_skill1].Skill_Minute, s->need_skill1 );
		
			
		fprintf( fp, "        鞘夸茄 扁贱篮 ");
		if( s->need_skill1 )	fprintf( fp,"'%30s(%7d)'( %d - %d )\n", SkillTbl[s->need_skill1].Skill_Minute, s->need_skill1, s->skill1_minimum, s->skill1_maximum );
		if( s->need_skill2 )	fprintf( fp, "                        '%30s(%7d)'( %d - %d )\n", SkillTbl[s->need_skill2].Skill_Minute, s->need_skill2,  s->skill2_minimum, s->skill2_maximum );

		if( s->need_skill1 == 0 && s->need_skill2 == 0 ) 
		{
		    fprintf( fp, "绝嚼聪促. \n" );
		}
				
		if( s->resource1 == 0 && s->resource2 == 0 && s->resource3 == 0 && s->resource4 == 0)
		{		
			fprintf( fp, " 捞扁贱篮 酒捞袍捞 鞘夸啊 绝嚼聪促. \n" );
		}		
		else	
		{		
//			fprintf( fp, "        鞘夸茄 Item 篮  " );

			if( s->resource1 )
				if( s->resource1_amount ) 
				{
					ii = ItemUnit( s->resource1/1000, s->resource1%1000 );
					if( ii ) fprintf( fp, "        '%15s(%7d)'  %d俺 鞘夸\n", ii->GetHanName(), s->resource1, s->resource1_amount );
				}
			if( s->resource2 )
				if( s->resource2_amount ) 
				{
					ii = ItemUnit( s->resource2/1000, s->resource2%1000 );
					if( ii ) fprintf( fp, "        '%15s(%7d)'  %d俺 鞘夸\n", ii->GetHanName(), s->resource2, s->resource2_amount );
				}
			if( s->resource3 )
				if( s->resource3_amount ) 
				{
					ii = ItemUnit( s->resource3/1000, s->resource3%1000 );
					if( ii ) fprintf( fp, "        '%15s(%7d)'  %d俺 鞘夸\n", ii->GetHanName(), s->resource3, s->resource3_amount );
				}
			if( s->resource4 )

⌨️ 快捷键说明

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