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

📄 op_battle.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#include "..\stdafx.h"
#include "DefaultHeader.h"

#include "../LowerLayers/mylog.h" //!!
#include "CItem.h"
#include "WeatherControl.h"
#include "Map.h"
#include "Path.h"
#include "OP_Magic.h"
#include "SealStoneGameServer.h"
#include "SealStone.h"
#include "scrp_exe.h"
#include "teambattle.h"
#include "QuestFunction.h"	// 021022 kyo 
#include "LogManager.h"
#include "AIManager.h"
#include "ArenaManager.h"
#include "RegenManager.h"
#include "UserManager.h"

extern void CountNationDeath(CHARLIST* pCaster,CHARLIST* pTarget);
extern void CheckLocalWarDeath(CHARLIST* pCaster,CHARLIST* pTarget);	// LTS LOCALWAR
extern void CheckEventLocalWarDeath(CHARLIST* Attacker,CHARLIST* Defencer);		// 020115 LTS
extern bool isNationWarfieldServer();
extern bool IsWar();
extern void UpdateGuardStoneStatus(LPCHARLIST pCaster,LPCHARLIST pTarget);
extern bool isNewWarfieldServer();
extern void CountNewWarfieldDeath(LPCHARLIST Attacker,LPCHARLIST Defencer);


// 030506 YGI
extern char g_LogoutPath[80];
extern char g_ChangeLogPath[80];

// tactics skill definition
#define FIST	0
#define SWORD	1
#define AXE		2
#define MACE	3
#define STAFF	4
#define SPEAR	5
#define THR_SW	6
#define BOW		7
#define TWO_SW	8
#define TWO_AX	9
#define SHIELD	10
#define FENCING	11


#define PLAYER	0
#define NPC		1

#define MELEE			0	// 窜芭府.
#define RANGE_BOW		1	// 厘芭府..
#define RANGE_HURL		2	// 吝芭府.
#define RANGE_DEFAULT	3	// 窜芭府..
#define MAGIC			4	// 付过.

extern NPCName_by_Gender	NPC_Name_Ref[Num_Of_NPC_Name];
extern NPCLev_to_Exp		NPC_Lev_Ref[Num_Of_NPC_Lev] ;
extern NPC_Generation		NPC_Gen_Ref[Num_Of_NPC_Generation] ;

// 010129 
extern NPC_Generation		NPC_Gen_Ref[Num_Of_NPC_Generation];
extern MAGICTABLE Magic_Ref[] ;

extern int GetEnemyEnemy( CHARLIST *a, CHARLIST *d );
extern bool isLevelUp(CHARLIST *chr);
extern void getItemIndex(int, int &, int &) ;


extern void SendServerKillPc( short int cn );			//
///////////////////// 0811 yjs 眠啊 ////////////////////////

extern bool IsWar();	// 010904 LTS								// 惫啊傈 惑炔俊辑 傈里捞 酒聪搁 己巩 荐龋籍 固胶
extern bool CanDestroyTarget(CHARLIST* pCaster,CHARLIST* pTarget);  // 010904 LTS	// 规绢磊狼 己巩 荐龋籍 固胶
extern void CheckBossAndDeActiveGroupNo(CHARLIST* Npc);				// LTS AI2

void rollDice(int base_hd, int &dice_res);
int  getDistance(CHARLIST *a, CHARLIST *d);
int  calcClassWeaponCorrection( CHARLIST * a, int itemtype );	// 努贰胶俊 嘎绰 Item阑 荤侩沁阑版快 20%刘啊茄促. 
short int getWeatherCorrection( void );
int  calcRangeCorrection(CHARLIST *a, CHARLIST *d );
int  AttackMapper( int a_id, int d_id,  int *damage_val);
void SendNK( int id, int nk );
void SendNK( int id, int nk3, int nk4, int nk6 );
inline int  IsHeNK(  LPCHARLIST ch, int nation  );
inline int	OutNK( LPCHARLIST ch, int nation );
void		InNK( LPCHARLIST ch, int nation, short int add_nk );
inline bool IsWarfare( int anation, int bnation );
int			GetCaseOfNK( int cur_nation, int a_nation, int d_nation, int a_nk, int d_nk ) ;
void		CheckNK( int a_id, int d_id, int type  );
extern void CheckDragonLordWarTeam(CHARLIST *a,CHARLIST *d);			// LTS DRAGONLORD



// 020428 YGI acer
extern int SaveLogDefault( char *file_name, char *str, int is_first );
extern void SaveCharacterBin( char *filename, CHARLIST *ch );

///////////////////////////////////////////////////////////////////////////////////////
///
///		User Function Definitions....
///

inline int ran( int r )
{
	if( r == 0 ) return 0;
	return rand()%r;
}

void rollDice(int base_hd, int &dice_res)		// 0712 YGI
{	
	int dice_type, dice_repeat;
	int i ;
	
	int plus = 0;
	if( base_hd > 1000000 ) 
	{
		plus = base_hd % 1000;
		base_hd /= 1000;
	}
	
	dice_type	= base_hd % 1000 ;
	dice_repeat	= base_hd / 1000 ;
	
	dice_res= 0 ;
	for(i= 0 ; i < dice_repeat ; i++) {
		dice_res+= (ran(dice_type) + 1);
	}
	dice_res += plus;
}	

int getDistance(CHARLIST *a, CHARLIST *d)
{
	double dist ;
	dist= pow((a->X - d->X), 2) + pow((a->Y - d->Y), 2) ;
	dist= sqrt(dist) ;
	
	//return -1 ;
	return (int)dist / TILE_SIZE ;
}	

int calcClassWeaponCorrection( CHARLIST * a, int itemtype )	
{				
	int item_no= a->equip[ itemtype].item_no ;
	int type, no;
				
	getItemIndex( item_no, type, no );
	if( item_no <= 0 ) return 80;
				
	CItem *ii = ItemUnit( type, no );
	if( ii == NULL ) return 80;
	else		
	{			
		if ( itemtype == WT_WEAPON || itemtype == WT_SHIELD ) 
		{		
			switch( a->Class )
			{	
			case  WARRIOR	:	return CWeapon[no].Class_Warrior * 20 + 80;
			case  THIEF		:	return CWeapon[no].Class_Archer  * 20 + 80;
			case  ARCHER	:	return CWeapon[no].Class_Thief   * 20 + 80;
			case  WIZARD	:	return CWeapon[no].Class_Wizard  * 20 + 80;
			case  PRIEST	:	return CWeapon[no].Class_Cleric  * 20 + 80;
			default : return 80;
			}	
		}		
	}				
				
	return 80;
}					

static bool	bAttackChangeCondition_slow_i = false;
static bool	bAttackChangeCondition_slow_you = false;
static bool	bAttackChangeCondition_daze_i  =false;
static bool	bAttackChangeCondition_daze_you  =false;
// 努贰胶-公扁喊 焊沥: 1.傈荤(窜芭府:100/吝芭府:100/厘芭府:90) 2.档利(窜芭府:90/吝芭府:100/厘芭府:100) 3.泵荐(窜芭府:90/吝芭府:100/厘芭府:100)
//                     4.付过荤(窜芭府:100/吝芭府:100/厘芭府:100) 5.己流磊(窜芭府:100/吝芭府:100/厘芭府:100)
static	int rate_by_class[5][3] = { { 100, 90, 100 }, { 90, 100, 100}, { 90, 100, 100}, { 100, 100, 100 }, { 100, 100, 100 } };

extern ItemAttr *GetItemByPOS( int cn, POS item ); // itemtable.cpp

void SendItemAttrDurationChange( t_connection c[], int cn, int pos )
{	
	t_packet p;
	
	ItemAttr *i = &c[cn].chrlst.equip[pos];
	if( i == NULL ) return;
	if( i->item_no == 0 ) return;
	
	p.h.header.type = CMD_ITEM_DURATION_CHANGE;
	{
		p.u.item_duration_change.pos = pos;
		p.u.item_duration_change.dur = LOWORD( i->attr[ IATTR_DURATION] );
	}
	p.h.header.size = sizeof( t_item_duration_change );
	
	QueuePacket( c, cn, &p, 1 );
}	


extern void GetItemDuration( ItemAttr item, WORD &d_curr, WORD &d_max );	// 酒捞袍 郴备仿 惶酒 坷扁
// 020428 YGI acer
extern int BreakItemByDuration( ItemAttr *item, CHARLIST *ch, POS pos );

/*	公扁唱 规绢备狼 付畴档 拌魂..
// type : 0 傍拜档备.
//        1 规绢备 

  
	d_curr = LOWORD( item.attr[IATTR_DURATION] );
	d_max = HIWORD( item.attr[IATTR_DURATION] );
	
	  亮篮 酒捞袍篮  1000历档甫 扁霖茄促. 
	  
		拌魂篮 1000阑 啊瘤绊 窍瘤父 Display绰 /10阑 窍咯 钎矫茄促. 
		
*/
int getEquipRandomPos( void )//郴备档 别阑锭 器瘤记阑 罐酒坷绰 何盒
{	
	const int pos = rand()%100;
	
	if( pos < 25 )  {return	WT_ARMOR;}
	if( pos < 50 )  {return  WT_SHIELD;}
	if( pos < 75 )  {return  WT_HELMET;}
	if( pos < 100 ) {return  WT_SHOES;}
	
	return WT_ARMOR; 
}	

// 厘芭府 公扁狼 辆幅俊 蝶弗 荤沥芭府狼 函拳客 傍拜仿狼 啊皑..
////////////////////// 0804 lkh 眠啊 ////////////////////////
int calcRangeCorrection(CHARLIST *a, CHARLIST *d )
{	
	int range_corr= 100;
	int min = 0, mid = 0, max = 0;
	
	const int dist= getDistance(a, d) ;
	if(dist < 2 )			return 100;		// 惑龋 芭府啊 64固父捞搁..
	
	const int ino = a->equip[ WT_WEAPON].item_no;		// Item捞 绝促.
	if( ino == 0 )			return 100;
	
	CItem *ii = ItemUnit( ino/1000, ino%1000 );	// Item捞 绝促.
	if( ii == NULL )		return 100;
	
	
	// 公扁狼 荤沥芭府..
	/*
	int range = ii->Getrange();
	if( range < 2 )			return 100;
	*/
	
	switch( ii->GetItemKind() ) 
	{
	case IK_HURL: // general throwing weapon
		min = 3;
		mid = 4;
		max = 5;
		break ;
		
	case IK_LONG_BOW:	// 010724 LSW
	case IK_DUAL_BOW://030102 lsw Dual BOW
		min = 13;
		mid = 19;
		max = 22;
		break ;
		
	case IK_SHORT_BOW : // short BOW
		min = 4;
		mid = 8;
		max = 12;
		break ;
		
	case IK_TWO_ARROW :	//拳混.籍泵..
	case IK_DUAL_ARROW:
		min = 5;
		mid = 10;
		max = 15;
		break ;
		
	default :
		min = 3;
		mid = 5;
		max = 7;
		break;
	}
	
	if		( dist < min )		range_corr= 100;
	else if	( dist < mid )		range_corr=  90;
	else if	( dist < max )		range_corr=  85;
	
	return 	range_corr;
}	

int addEXP(CHARLIST *a, CHARLIST *d, int criteria, int damage )
{	//< CSD-030509
	if (g_pArenaManager->IsColossusArena())
	{
		return 0;
	}
	//> CSD-030509 
	if (a == NULL || d == NULL)         return 0;
	if (a->IsNpc())                     return 0;
	if (a->IsPlayer() && d->IsPlayer()) return 0;
			
	int exp;
	float base_point;
	DWORD partyexp;
	int tdamage;
	
	int t,i;																
	int partexpflag = 0;											
	bool bCanGetExpPcPc = false;
	
	damage = abs(damage);
	
	switch (d->Race)
	{ // 版氰摹甫 林瘤 臼绰 NPC
    case GUARD:
    case SEALSTONE: return 0; 
	}
	
	if( d->SprNo == 96 ) return 0;
	if (d->IsTamedNpc())  return 0;	// 怕怪等 局茄抛辑绰 版摹甫 掘阑荐 绝促.
	
#ifdef _NATION_APPLY_
	if( d->SprType != SPRITETYPE_NPC ) 
		if( a->name_status.nation != d->name_status.nation ) bCanGetExpPcPc = true;	// 0927 YGI
#endif
		
		switch(criteria)					
		{
		case HIT_FAILED : return 0;											
		case HIT_AND_DEAD:
		case HIT_AND_NOTDEAD:	
			{
				if (bCanGetExpPcPc == false)
					if (a->IsPlayer() && d->IsPlayer())
					{// PK茄 惑怕捞促. 
						return 0;
					}		
					
					if( d ) // 版氰摹甫 掘阑荐 绝绰 NPC甸..					
						if( d->SprType == SPRITETYPE_NPC )
						{
							switch( d->SprNo )
							{
							case 92 :	// 扁嫡..
							case 93 :	// 扁嫡..
							case 94 :	// 苞翅..
							case 95 :	// 倾荐酒厚.
							case 96 :	// 倾荐酒厚.
								{
									if (a->GetLevel() > ENABLE_DUMMY_LEVEL)
									{	//< CSD-030806
										return 0;
									}	//> CSD-030806
								}
							}
							// NPC狼 辆练捞 牢埃捞搁...版摹绝澜..
							if( d->Race == 1 ) return 0;
						}
						
						const int nTotal = (d->IsPlayer()) ? NPC_Lev_Ref[d->GetLevel()].nTrainingExp:
															 NPC_Gen_Ref[d->npc_index].nEpMax; // CSD-030806 
						if (a->GetLevel() == d->GetLevel())
						{	//< CSD-030806 
							t = 1;
						}	//> CSD-030806 
						
						if (a->GetLevel() < d->GetLevel())
						{	//< CSD-030806 
							t = 1;
							if( NPC_Lev_Ref[a->GetLevel()].nGreatRate )
							{
								t = (d->GetLevel() - a->GetLevel())/NPC_Lev_Ref[a->GetLevel()].nGreatRate;
							}
							else
							{
								SaveCharacterBin( "error_level_check", a);
							}
						}	//> CSD-030806 
						
						if (a->GetLevel() > d->GetLevel())
						{	//< CSD-030806 
							t = 1;
							if( NPC_Lev_Ref[a->GetLevel()].nLessRate )
							{
								t = (a->GetLevel() - d->GetLevel())/NPC_Lev_Ref[a->GetLevel()].nLessRate;
							}
							else
							{
								SaveCharacterBin( "error_level_check", a);
							}
						}	//> CSD-030806 
						
						base_point = (t < 1) ? nTotal:nTotal/t;
						break;
			}
		case HIT_GHOSTRESURRECTION:
			{
				base_point = damage;
				break;
			}
		}
		
		
		// base_point甫 捞侩秦 版摹狼 樊阑 拌魂茄促. 
		switch(criteria)
		{
		case HIT_FAILED:		exp = 0; partexpflag = 0;	break;
		case HIT_AND_DEAD:	

⌨️ 快捷键说明

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