void CMultiPoisonProjectile::Create(Vec3f srcPos, float afBeta) { long lMax = 0; for(size_t i = 0; i < m_projectiles.size(); i++) { CPoisonProjectile * projectile = m_projectiles[i]; projectile->Create(srcPos, afBeta + frand2() * 10.0f); long lTime = ulDuration + Random::get(0, 5000); projectile->SetDuration(lTime); lMax = std::max(lMax, lTime); projectile->lLightId = GetFreeDynLight(); if(lightHandleIsValid(projectile->lLightId)) { EERIE_LIGHT * light = lightHandleGet(projectile->lLightId); light->intensity = 2.3f; light->fallend = 250.f; light->fallstart = 150.f; light->rgb = Color3f::green; light->pos = projectile->eSrc; light->time_creation = (unsigned long)(arxtime); light->duration = 200; } } SetDuration(lMax + 1000); }
void PoisonProjectileSpell::Launch() { ARX_SOUND_PlaySFX(SND_SPELL_POISON_PROJECTILE_LAUNCH, &m_caster_pos); Vec3f srcPos = Vec3f_ZERO; float afBeta = 0.f; Entity * caster = entities[m_caster]; m_hand_group = caster->obj->fastaccess.primary_attach; if(m_hand_group != -1) { long group = m_hand_group; m_hand_pos = caster->obj->vertexlist3[group].v; } if(m_caster == PlayerEntityHandle) { afBeta = player.angle.getPitch(); if(m_hand_group != -1) { srcPos = m_hand_pos; } else { srcPos = player.pos; } } else { afBeta = entities[m_caster]->angle.getPitch(); if(m_hand_group != -1) { srcPos = m_hand_pos; } else { srcPos = entities[m_caster]->pos; } } srcPos += angleToVectorXZ(afBeta) * 90.f; long level = std::max(long(m_level), 1l); size_t uiNumber = std::min(5L, level); for(size_t i = 0; i < uiNumber; i++) { CPoisonProjectile * projectile = new CPoisonProjectile(); m_projectiles.push_back(projectile); } m_duration = 8000ul; long lMax = 0; for(size_t i = 0; i < m_projectiles.size(); i++) { CPoisonProjectile * projectile = m_projectiles[i]; projectile->Create(srcPos, afBeta + frand2() * 10.0f); long lTime = m_duration + Random::get(0, 5000); projectile->SetDuration(lTime); lMax = std::max(lMax, lTime); projectile->lLightId = GetFreeDynLight(); if(lightHandleIsValid(projectile->lLightId)) { EERIE_LIGHT * light = lightHandleGet(projectile->lLightId); light->intensity = 2.3f; light->fallend = 250.f; light->fallstart = 150.f; light->rgb = Color3f::green; light->pos = projectile->eSrc; light->time_creation = (unsigned long)(arxtime); light->duration = 200; } } m_duration = lMax + 1000; }
void PoisonProjectileSpell::Launch() { ARX_SOUND_PlaySFX(g_snd.SPELL_POISON_PROJECTILE_LAUNCH, &m_caster_pos); Vec3f srcPos(0.f); float afBeta = 0.f; Entity * caster = entities[m_caster]; m_hand_group = caster->obj->fastaccess.primary_attach; if(m_hand_group != ActionPoint()) { ActionPoint group = m_hand_group; m_hand_pos = actionPointPosition(caster->obj, group); } if(m_caster == EntityHandle_Player) { afBeta = player.angle.getYaw(); if(m_hand_group != ActionPoint()) { srcPos = m_hand_pos; } else { srcPos = player.pos; } } else { afBeta = entities[m_caster]->angle.getYaw(); if(m_hand_group != ActionPoint()) { srcPos = m_hand_pos; } else { srcPos = entities[m_caster]->pos; } } srcPos += angleToVectorXZ(afBeta) * 90.f; size_t uiNumber = glm::clamp(static_cast<unsigned int>(m_level), 1u, 5u); for(size_t i = 0; i < uiNumber; i++) { CPoisonProjectile * projectile = new CPoisonProjectile(); m_projectiles.push_back(projectile); } m_duration = GameDurationMs(8000); m_hasDuration = true; GameDuration lMax = 0; for(size_t i = 0; i < m_projectiles.size(); i++) { CPoisonProjectile * projectile = m_projectiles[i]; projectile->Create(srcPos, afBeta + Random::getf(-10.f, 10.f)); GameDuration lTime = m_duration + GameDurationMs(Random::getu(0, 5000)); projectile->SetDuration(lTime); lMax = std::max(lMax, lTime); EERIE_LIGHT * light = dynLightCreate(projectile->lLightId); if(light) { light->intensity = 2.3f; light->fallend = 250.f; light->fallstart = 150.f; light->rgb = Color3f::green; light->pos = projectile->eSrc; light->creationTime = g_gameTime.now(); light->duration = GameDurationMs(200); } } m_duration = lMax + GameDurationMs(1000); }