Вопрос Партикли

Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
Как должна выглядеть нормальная система партиклей?

Тоесть у своем ранфрейм хуке у меня идёт такая херня:


C++:
class PARTICLEMANAGER::Particle
{

const char* name;
        UINT32 handle;
        UINT32 pad = 0;
        C_BaseEntity* entity;


}


PARTICLEMANAGER::Particle* PARTICLEMANAGER::GetParticle(const char* _name, C_BaseEntity* _entity)
{
    for (auto& particle : ParticleContainer)
    {
        if (particle->entity == _entity && !strcmp(particle->name, _name))
        {
            return particle;
        }
    }
    return nullptr;
}


bool PARTICLEMANAGER::CanCreateNewParticle(const char* _name, C_BaseEntity* _entity)
{
    for (auto& particle : ParticleContainer)
    {
        if (particle->entity == _entity && !strcmp(particle->name, _name))
        {
            return false;
        }
    }
    return true;
}


PARTICLEMANAGER::Particle* PARTICLEMANAGER::CreateParticle(const char* _name, ParticleAttachment_t type, C_BaseEntity* _entity)
{
    if (!CanCreateNewParticle(_name, _entity))
    {
        return GetParticle(_name,_entity);
    }
 
    ParticleStruct structure{ _name,type,_entity };
    Particle* particle = new Particle(_name, _entity);
    //if(oCreateParticle)
    //oCreateParticle(ParticleManager, particle->handle, &structure);
    //Msg("fnCreateParticle %p\n",fnCreateParticle);
    if (!oCreateParticle)
    {
        oCreateParticle = (_CreateParticle)VT_METHOD(ParticleManager, 7);
    }
     oCreateParticle(ParticleManager, particle->handle, &structure);
    //ParticleManager->fnCreateParticle(particle->handle, &structure);
    IncHandle();
    ParticleContainer.push_back(particle);
    return particle;
}


PARTICLEMANAGER::Particle* CreateCircle(C_BaseEntity* _entity, float _range, VECTOR color = {255,25,25 })
    {
 
        auto particle = CreateParticle(ParticleNames.ring, ParticleAttachment_t::PATTACH_ABSORIGIN_FOLLOW, _entity);
        if (particle)
        {
            VECTOR range = {_range,255,0 }; 
             
            particle->SetControlPoint(ControlPoint_t::Color, color);
            particle->SetControlPoint(ControlPoint_t::Radius, range);

            return particle;
        }

        return nullptr;
    }


 if (entity->IsLocalHero())
                            {
                                if (entity->HasItem("item_blink") || entity->HasItem("item_arcane_blink") || entity->HasItem("item_overwhelming_blink"))
                                {
                                    ParticleManager->CreateCircle(entity, 1200, { 1,255,0 });
                                    
                                }
                                else
                                {
                                  ParticleManager->DestroyParticle(ParticleManager->GetHandleForParticle(entity, ParticleNames.ring));
                                }
                            }
Не могу придумать, как сделать так, чтобы можно было иметь два одинаковых партикля.

Кружочок радиуса 1200
Кружочок радиуса 250


Если я уберу
C++:
if (!CanCreateNewParticle(_name, _entity))
    {
        return GetParticle(_name,_entity);
    }
то там будет пиздец и у меня будет создавать дохрена кругов вокруг героя
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
бля ужасно выглядит)
ну во-первых не надо new и delete юзать
Пожалуйста, авторизуйтесь для просмотра ссылки.
во-вторых зачем ты хранишь указатели в векторе? у тебя что там полиморфизм какой-то?
в-третьих схуяли у тебя партикль менеджер должен контроллировать какие партикли можно создавать а какие нельзя? его обязанности это максимум просто хранение всех партиклей + удаление всех партиклей при выходе из игры/из чита например.
пусть вбе/другие скрипты сами разбираются что где когда нужно и не нужно создавать. не вешай обязанности одного компонента на другой
 
Сверху Снизу