📄 gameunit.cpp
字号:
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 + -