diff --git a/server/gameserver/buff/callfunc.cc b/server/gameserver/buff/callfunc.cc index 7f5c4312..46511b24 100644 --- a/server/gameserver/buff/callfunc.cc +++ b/server/gameserver/buff/callfunc.cc @@ -1554,25 +1554,27 @@ void CallFuncBuff::BatchRandomPosSummonObstacle() glm::vec3 center = glm::vec3(x, y, z); for (int i = 0; i < num; ++i) { glm::vec3 out_point = center; - owner->room->map_instance->RandPoint(center, range, out_point); - Obstacle* ob = owner->SummonObstacle(this, - id, - out_point, - owner->GetAttackDir()); - if (ob) { - std::shared_ptr> vars = std::make_shared>(); - vars->push_back(ob->GetUniId()); - vars->push_back(ob->GetPos().GetX()); - vars->push_back(ob->GetPos().GetY()); - vars->push_back(ob->GetPos().GetZ()); - for (int buff_id : meta->_buff_param8_int_list) { - owner->TryAddBuff( - GetCaster().Get(), - buff_id, - skill_meta, - init_args, - vars - ); + bool ret = owner->room->map_instance->RandPoint(center, range, out_point); + if (ret) { + Obstacle* ob = owner->SummonObstacle(this, + id, + out_point, + owner->GetAttackDir()); + if (ob) { + std::shared_ptr> vars = std::make_shared>(); + vars->push_back(ob->GetUniId()); + vars->push_back(ob->GetPos().GetX()); + vars->push_back(ob->GetPos().GetY()); + vars->push_back(ob->GetPos().GetZ()); + for (int buff_id : meta->_buff_param8_int_list) { + owner->TryAddBuff( + GetCaster().Get(), + buff_id, + skill_meta, + init_args, + vars + ); + } } } } diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 9dd70342..e38f55e7 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -972,16 +972,19 @@ void Creature::DoSkill(int skill_id, if (skill->GetMinorType()) { auto old_context_dir = context_dir; auto old_context_pos = context_pos; - context_dir = skill_dir_; + context_dir = skill_dir; context_pos = GetPos(); - context_pos.AddGlmVec3(skill_dir_ * skill_distance); + context_pos.AddGlmVec3(skill_dir * skill_distance); #ifdef MYDEBUG - a8::XPrintf("skill_dir:%f %f %f skill_distance:%f\n", + a8::XPrintf("skill_dir:%f %f %f skill_distance:%f skill_target_pos:%f %f %f\n", { - skill_dir_.x, - skill_dir_.y, - skill_dir_.z, - skill_distance + skill_dir.x, + skill_dir.y, + skill_dir.z, + skill_distance, + context_pos.GetX(), + context_pos.GetY(), + context_pos.GetZ(), }); #endif SetAttackDir(skill_dir); diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 46d8d302..7a370a96 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -369,10 +369,20 @@ bool MapInstance::RandPoint(const glm::vec3& center, float range, glm::vec3& out glm::vec3 start = center; glm::vec3 dir = GlmHelper::UP; - GlmHelper::RotateY(dir, (10 + rand() % 360)/ 180.0f); + GlmHelper::RotateY(dir, glm::radians(1.0f + (float)(rand() % 360))); GlmHelper::Normalize(dir); - glm::vec3 end = center + dir * range; + glm::vec3 end = center + dir * (float)(rand() % (int)std::max(1.0f, range)); + out_point = center; +#ifdef MYDEBUG + a8::XPrintf("MapInstance::RandPoint:%f %f %f\n", + { + out_point.x, + out_point.y, + out_point.z, + }); +#endif + return true; Scale(start); Scale(end); if (Raycast