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

📄 gameunit.cpp

📁 混乱竞技场的全套代码,客户端资源可以网上搜
💻 CPP
📖 第 1 页 / 共 3 页
字号:
								char str[50];
								sprintf(str, "%d", (LONG)it->life_alter_obj);
								pUnit_obj->add_effect_tip(str, RGBA_MAKE(255,0,0,255), 2.0f, UNIT_EFFECT_FLAG_DAMAGE);
								m_pGame->add_game_msg(RGBA_MAKE(205,255,0,200), "角色:(%s) 击倒 角色(%s)", GetName(), pUnit_obj->GetName());
								pUnit_obj->PlyDeath();
								pUnit_obj->add_effect_sound("sound\\die_1.wav");
							}
							if(it->flag_special!=3)
							{
								pUnit_obj->count_die++;
								if(it->flag_special==1)
								{
									count_hunter++;
								}
								else
								{
									count_pk++;
								}
							}
							pUnit_obj->RunSpriteMove(GetFaceToDegree(), 
													 100+100*base_strength/pUnit_obj->base_strength, 
													 10*base_strength/pUnit_obj->base_strength + 10/**it->value_special*/, 
													 FALSE, 0, 1);
							if(pUnit_obj->IsPlayer())
							{
								//m_aim_unit	= 0;
							}
							else
							{
								pUnit_obj->m_is_locate_control	= FALSE;
								m_is_auto_attack				= FALSE;
								//pUnit_obj->SetControl(FALSE);
							}

							if(it->life_alter_obj!=0 || it->mana_alter_obj!=0)
							{
								pUnit_obj->life		= 0;
								pUnit_obj->mana		= 0;
								pUnit_obj->update_status();
							}
							if(it->life_alter!=0 || it->mana_alter!=0)
							{
								life			+= it->life_alter;
								mana			+= it->mana_alter;
								update_status();
							}
						}
						break;
					case ACTION_LOST://击空
						{
							if(!pUnit_obj->is_death())
							{
								/*pUnit_obj->*/add_effect_tip("miss", RGBA_MAKE(205,0,255,255), 2.0f, UNIT_EFFECT_FLAG_DAMAGE);
								m_pGame->add_game_msg(RGBA_MAKE(205,0,255,200), "角色:(%s) 没有击中 角色(%s)", GetName(), pUnit_obj->GetName());
							}
						}
						break;
					case 11://打击并击退
						{
							if(pUnit_obj->is_melee())
							{
								if(pUnit_obj->m_ani_melee.TestByPercent(50))
								{
									//pUnit_obj->CaleDamage(FALSE);
								}
							}
							else if(pUnit_obj->CanFlinch())
							{
								//pUnit_obj->CaleDamage(FALSE);
								pUnit_obj->PlyFlinch();
							}
							if(it->life_alter_obj!=0 || it->mana_alter_obj!=0)
							{
								pUnit_obj->life		+= it->life_alter_obj;
								pUnit_obj->mana		+= it->mana_alter_obj;
								pUnit_obj->update_status();
							}
							if(it->life_alter!=0 || it->mana_alter!=0)
							{
								life			+= it->life_alter;
								mana			+= it->mana_alter;
								update_status();
							}
							pUnit_obj->RunSpriteMove(GetFaceToDegree(), 
													 100+100*base_strength/pUnit_obj->base_strength, 
													 10*base_strength/pUnit_obj->base_strength + 10/**it->value_special*/, 
													 FALSE, GSANI_FRAME_NOCHANGE, 1);
							if(!pUnit_obj->is_death())
							{
								char str[50];
								sprintf(str, "%d", (LONG)it->life_alter_obj);
								pUnit_obj->add_effect_tip(str, RGBA_MAKE(255,0,0,255), 2.0f, UNIT_EFFECT_FLAG_DAMAGE);
								m_pGame->add_game_msg(RGBA_MAKE(205,0,0,200), "角色:(%s) 攻击 角色(%s) 造成伤害(%d)", GetName(), pUnit_obj->GetName(), (LONG)-it->life_alter_obj);
							}
//							pUnit_obj->add_effect_ani("magic\\stun.txg");
						}
						break;
					default:
						break;
					}
					if(it->flag_special!=10)
					{
						pUnit_obj->add_effect_ani(g_get_effect_ani_res(it->uid_action_type).c_str());
					}
					pUnit_obj->add_effect_sound(g_get_effect_sound_res(it->uid_action_type).c_str());
				}
				it	= m_list_effect_specific.erase(it);
			}
		}
	}
	{
		std::list<PARTICLE_MAGIC*>::iterator it_pm = m_list_particle_magic.begin();
		while(it_pm!=m_list_particle_magic.end())
		{
			STRUCT_EFFECT_SPECIFIC* it = &(*it_pm)->ses;
			Game_Unit* pUnit_obj	= (Game_Unit*)m_pWorld->GetObject(it->uid_victim);
			if(pUnit_obj!=NULL && (*it_pm)->life==0)
			{
				base_experience += it->experience_alter;
				switch(it->flag_special) {
				case 1://打倒
				case 2://打倒
					{
						if(!pUnit_obj->is_death())
						{
							char str[50];
							sprintf(str, "%d", (LONG)it->life_alter_obj);
							pUnit_obj->add_effect_tip(str, RGBA_MAKE(255,0,0,255), 2.0f, UNIT_EFFECT_FLAG_DAMAGE);
							m_pGame->add_game_msg(RGBA_MAKE(205,255,0,200), "角色:(%s) 击倒 角色(%s)", GetName(), pUnit_obj->GetName());
							pUnit_obj->PlyDeath();
						}
						if(it->flag_special!=3)
						{
							pUnit_obj->count_die++;
							if(it->flag_special==1)
							{
								count_hunter++;
							}
							else
							{
								count_pk++;
							}
						}
						if(it->uid_action_type>2000)
						{
							pUnit_obj->RunSpriteMove(D3DXToDegree((*it_pm)->angle), 
								150+70*base_magic/pUnit_obj->base_strength, 
								30*base_magic/pUnit_obj->base_strength + 30/**it->value_special*/, 
								FALSE, 0, 1);
						}
						if(pUnit_obj->IsPlayer())
						{
							//m_aim_unit	= 0;
						}
						else
						{
							pUnit_obj->m_is_locate_control	= FALSE;
							m_is_auto_attack				= FALSE;
							//pUnit_obj->SetControl(FALSE);
						}
						
						if(it->life_alter_obj!=0 || it->mana_alter_obj!=0)
						{
							pUnit_obj->life		= 0;
							pUnit_obj->mana		= 0;
							pUnit_obj->update_status();
						}
						if(it->life_alter!=0 || it->mana_alter!=0)
						{
							life			+= it->life_alter;
							mana			+= it->mana_alter;
							update_status();
						}
					}
					break;
				case 10://击空
					{
						if(!pUnit_obj->is_death())
						{
							/*pUnit_obj->*/add_effect_tip("miss", RGBA_MAKE(205,0,255,255), 2.0f, UNIT_EFFECT_FLAG_DAMAGE);
							m_pGame->add_game_msg(RGBA_MAKE(205,0,255,200), "角色:(%s) 没有击中 角色(%s)", GetName(), pUnit_obj->GetName());
						}
					}
					break;
				case 11://打击并击退
					{
						if(pUnit_obj->is_melee())
						{
							if(pUnit_obj->m_ani_melee.TestByPercent(50))
							{
								//pUnit_obj->CaleDamage(FALSE);
							}
						}
						else if(pUnit_obj->CanFlinch())
						{
							//pUnit_obj->CaleDamage(FALSE);
							pUnit_obj->PlyFlinch();
						}
						if(it->life_alter_obj!=0 || it->mana_alter_obj!=0)
						{
							pUnit_obj->life		+= it->life_alter_obj;
							pUnit_obj->mana		+= it->mana_alter_obj;
							pUnit_obj->update_status();
						}
						if(it->life_alter!=0 || it->mana_alter!=0)
						{
							life			+= it->life_alter;
							mana			+= it->mana_alter;
							update_status();
						}
						if(it->uid_action_type>2000)
						{
							pUnit_obj->RunSpriteMove(D3DXToDegree((*it_pm)->angle), 
								150+70*base_magic/pUnit_obj->base_strength, 
								30*base_magic/pUnit_obj->base_strength + 30/**it->value_special*/, 
								FALSE, GSANI_FRAME_NOCHANGE, 1);
						}
						if(!pUnit_obj->is_death())
						{
							char str[50];
							sprintf(str, "%d", (LONG)it->life_alter_obj);
							pUnit_obj->add_effect_tip(str, RGBA_MAKE(255,0,0,255), 2.0f, UNIT_EFFECT_FLAG_DAMAGE);
							m_pGame->add_game_msg(RGBA_MAKE(205,0,0,200), "角色:(%s) 攻击 角色(%s) 造成伤害(%d)", GetName(), pUnit_obj->GetName(), (LONG)-it->life_alter_obj);
						}
						//pUnit_obj->add_effect_ani("magic\\stun.txg");
					}
					break;
				default:
					break;
				}
				if(it->flag_special!=10)
					pUnit_obj->add_effect_ani(g_get_effect_ani_res(it->uid_action_type).c_str());
				pUnit_obj->add_effect_sound(g_get_effect_sound_res(it->uid_action_type).c_str());

			}
			it_pm++;
		}
	}
}

VOID Game_Unit::RunAI()
{
	if(is_death())
	{
		//m_aim_unit	= 0;
		return;
	}
	//m_ai_seq++;
	DWORD dwTime = Sys_GetTime();
//	if(dwTime-m_ai_seq>500)
//	{
//		m_ai_seq	= dwTime;
//	}
//	else
//	{
//		return;
//	}
	Game_Unit* ptr_unit_aim	= (Game_Unit*)m_pWorld->GetObject(m_aim_unit);
	Game_Unit* ptr_unit_lead	= (Game_Unit*)m_pWorld->GetObject(m_lead_unit);
	if((m_is_auto_attack || m_is_locate_control) && ptr_unit_aim)
	{
		if(m_pGame->GetControlUnit() 
			&& ptr_unit_aim->is_death()
			|| m_pGame->GetControlUnit()->is_death())
		{
			SetControl(FALSE);
			return;
		}
		if(CanSpell()&&!IsPlayer())
		{
			query_spell(ptr_unit_aim->m_FlatX, ptr_unit_aim->m_FlatY, 1001);
			return;
		}
		if(!IsPlayer() && life*10<base_life)
		{//逃跑
			float aim_angle = CGsFunc::Math_GetPointToAngle(m_FlatX - ptr_unit_aim->m_FlatX, m_FlatY - ptr_unit_aim->m_FlatY);
			float x = 300*cos(aim_angle);
			float y = 300*sin(aim_angle);
			query_goto(m_FlatX + x, m_FlatY + y);
			return;
		}
		if(TestRange(m_melee_radius, ptr_unit_aim))
		{
			if(CanMelee())//可以攻击
			{
				if(!is_melee() && !is_flinch() && !is_ranged())
				{
					//PlyMeleeTo(ptr_unit_aim->m_FlatX, ptr_unit_aim->m_FlatY, 1);
					if(dwTime-m_map_query_holder["melee"]>600)
					{
						query_melee(ptr_unit_aim, 0);
						if(IsPlayer())
						{
							m_is_locate_control = FALSE;
						}
					}
				}
				return;
			}
			else
			{//逃跑
				//PlyWalkTo((m_fPosX-m_pUnitEnemy->m_fPosX));
			}
		}
		else if(CanRanged())
		{
			if(TestRange(m_ranged_radius, ptr_unit_aim))//可以射击
			{
				if(!is_melee() && !is_flinch() && !is_ranged())
				{
					//PlyMeleeTo(ptr_unit_aim->m_FlatX, ptr_unit_aim->m_FlatY, 1);
					if(dwTime-m_map_query_holder["melee"]>1000)
					{
						query_melee(ptr_unit_aim, 100);
						if(IsPlayer())
						{
							m_is_locate_control = FALSE;
						}
					}
				}
				return;
			}
			
		}


		if(m_pAnimation && (is_wait() || is_walk()))
		{
			//if(TestEyeshot(m_pUnitEnemy))
			{//在视野范围内
				if((CanMelee() || CanRanged())
					&& !(CanRanged() && TestRange(m_ranged_radius, ptr_unit_aim)))
				{//靠近目标
					if(!is_melee() && !is_flinch())
					{
						if(dwTime-m_map_query_holder["goto"]>700)
						{
							std::vector<GM_Object*> obj_array;
							if(m_pWorld->select_obj(obj_array, m_FlatX, m_FlatY)>1)
							{
								float aim_angle = CGsFunc::Math_GetPointToAngle(ptr_unit_aim->m_FlatX - m_FlatX, ptr_unit_aim->m_FlatY - m_FlatY);
								int left_count = 0;
								for(int i=0; i<obj_array.size(); i++)
								{
									float obj_angle = CGsFunc::Math_GetPointToAngle(ptr_unit_aim->m_FlatX - obj_array[i]->m_FlatX, ptr_unit_aim->m_FlatY - obj_array[i]->m_FlatY);
									if(obj_angle<aim_angle || obj_angle-aim_angle>const_PI)
									{
										left_count++;
									}
									obj_array[i];
								}
								if(left_count*2>obj_array.size()-1)
								{//偏左走
									aim_angle -= const_PI_DIV_4;
								}
								else
								{
									aim_angle += const_PI_DIV_4;
								}
								float x = 200*cos(aim_angle);
								float y = 200*sin(aim_angle);
								query_goto(m_FlatX + x, m_FlatY + y);
							}
							else
							{
								query_goto(ptr_unit_aim->m_FlatX, ptr_unit_aim->m_FlatY);
							}
						}
					}
					//PlyWalkTo(ptr_unit_aim->m_FlatX, ptr_unit_aim->m_FlatY);
					//DoTestHit();
				}
			}
			//else
			{//目标逃掉了
			//	m_pUnitEnemy	= NULL;
			//	RunAI();
			}
		}

	}
	else if(IsPlayer())
	{
		if(dwTime-m_map_query_holder["goto"]>3000 && is_wait())
		{
			m_map_query_holder["goto"]=dwTime;
			if(rnd()>0.3)
			{
				STRUCT_HANDLE_PLACE shp;
				shp.uid		= m_id;
				shp.pos.src_x	= m_FlatX;
				shp.pos.src_y	= m_FlatY;
				shp.pos.src_h	= m_fHeight;
				shp.pos.dest_x	= m_FlatX;
				shp.pos.dest_y	= m_FlatY;
				shp.pos.dest_h	= m_fHeight;
				//pUnit->PlyWalkTo(point.x+x, point.y+y);
				
				m_pGame->query_handle_place(&shp);
			}
		}
	}
/*
	else if(m_ai_seq>m_ai_recover)
	{//寻找目标
		m_ai_seq = 0;
		OBJ_MAP	map;
		m_pWorld->GetRangeDirectionObject(map, m_FlatX, m_FlatY, m_eyeshot_x, this);
		OBJ_MAP::iterator it	= map.begin();
		while(it!=map.end())
		{
			if(it->second->IsUnit())
			{
				Game_Unit* pUnit	= (Game_Unit*)it->second;
				//if((m_relation[pUnit->m_force] & GSRELATION_BASE) == GSRELATION_ENEMY)
				{
					ptr_unit_aim	= pUnit;
					m_aim_unit		= ptr_unit_aim->GetID();
//					STRUCT_HANDLE_UNIT	shu;
//					shu.pos.action	= GSACT_AIM_OBJECT;
//					shu.pos.src_x	= m_FlatX;
//					shu.pos.src_y	= m_FlatY;
//					shu.pos.src_h	= m_fHeight;
//					shu.pos.dest_x	= pUnit->m_FlatX;
//					shu.pos.dest_y	= pUnit->m_FlatY;
//					shu.pos.dest_h	= pUnit->m_fHeight;
//					m_pGame->query_handle_unit(&shu);
//					m_is_locate_control	= false;
					return;
				}
			}
			it++;
		}
		map.clear();
	}
	*/


	switch(m_ai_type) 
	{
	case UNIT_AI_NONE:
		{
		}
		break;
	case UNIT_AI_PASSIVE:
		{
		}
		break;
	case UNIT_AI_WARLIKE:
		{
		}
		break;
	default:
		break;
	}
}

void Game_Unit::SetControl(BOOL bControl)
{
	if(m_is_locate_control==bControl)
		return;
	m_is_locate_control	= bControl;
	if(m_is_locate_control==FALSE)
	{
		m_is_indispensable	= FALSE;
		//m_list_effect_specific.clear();
		if(!IsPlayer())
		{
			STRUCT_HANDLE_UNIT	shu;
			shu.action	= GSACT_AIM_OBJECT;
			shu.uid		= m_id;
			shu.uid_obj	= 0;
			shu.pos.src_x	= m_FlatX;

⌨️ 快捷键说明

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