static Vec3f GetChestPos(EntityHandle num) { if(num == EntityHandle_Player) { return player.pos + Vec3f(0.f, 70.f, 0.f); } if(ValidIONum(num)) { ObjVertHandle idx = GetGroupOriginByName(entities[num]->obj, "chest"); if(idx != ObjVertHandle()) { return entities[num]->obj->vertexlist3[idx.handleData()].v; } else { return entities[num]->pos + Vec3f(0.f, -120.f, 0.f); } } else { // should not happen return Vec3f_ZERO; } }
static Vec3f GetChestPos(EntityHandle num) { if(num == EntityHandle_Player) { return player.pos + Vec3f(0.f, 70.f, 0.f); } Entity * io = entities.get(num); if(!io) { // should not happen return Vec3f(0.f); } ObjVertHandle idx = GetGroupOriginByName(io->obj, "chest"); if(idx != ObjVertHandle()) { return io->obj->vertexWorldPositions[idx.handleData()].v; } return io->pos + Vec3f(0.f, -120.f, 0.f); }
void LightningStrikeSpell::Update() { float fBeta = 0.f; float falpha = 0.f; Entity * caster = entities[m_caster]; ObjVertHandle idx = GetGroupOriginByName(caster->obj, "chest"); if(idx != ObjVertHandle()) { m_caster_pos = caster->obj->vertexlist3[idx.handleData()].v; } else { m_caster_pos = caster->pos; } if(m_caster == EntityHandle_Player) { falpha = -player.angle.getPitch(); fBeta = player.angle.getYaw(); } else { fBeta = caster->angle.getYaw(); if(ValidIONum(caster->targetinfo) && caster->targetinfo != m_caster) { const Vec3f & p1 = m_caster_pos; Vec3f p2 = GetChestPos(caster->targetinfo); falpha = MAKEANGLE(glm::degrees(getAngle(p1.y, p1.z, p2.y, p2.z + glm::distance(Vec2f(p2.x, p2.z), Vec2f(p1.x, p1.z))))); //alpha entre orgn et dest; } else if(ValidIONum(m_target)) { const Vec3f & p1 = m_caster_pos; Vec3f p2 = GetChestPos(m_target); falpha = MAKEANGLE(glm::degrees(getAngle(p1.y, p1.z, p2.y, p2.z + glm::distance(Vec2f(p2.x, p2.z), Vec2f(p1.x, p1.z))))); //alpha entre orgn et dest; } } m_lightning.m_pos = m_caster_pos; m_lightning.m_beta = fBeta; m_lightning.m_alpha = falpha; m_lightning.m_caster = m_caster; m_lightning.m_level = m_level; m_lightning.Update(ArxDurationMs(g_framedelay)); m_lightning.Render(); ARX_SOUND_RefreshPosition(m_snd_loop, entities[m_caster]->pos); }
void ConfuseSpell::Update() { Vec3f pos = entities[m_target]->pos; if(m_target != EntityHandle_Player) { pos.y += entities[m_target]->physics.cyl.height - 30.f; } ObjVertHandle idx = entities[m_target]->obj->fastaccess.head_group_origin; if(idx != ObjVertHandle()) { pos = entities[m_target]->obj->vertexlist3[idx.handleData()].v; pos.y -= 50.f; } eCurPos = pos; RenderMaterial mat; mat.setDepthTest(false); mat.setBlendType(RenderMaterial::Additive); mat.setTexture(tex_trail); Anglef stiteangle = Anglef(0.f, -glm::degrees(arxtime.now_f() * ( 1.0f / 500 )), 0.f); { AnimationDuration delta = AnimationDurationUs(s64(g_framedelay * 1000.f)); EERIEDrawAnimQuatUpdate(spapi, animlayer, stiteangle, eCurPos, delta, NULL, false); EERIEDrawAnimQuatRender(spapi, eCurPos, NULL, 0.f); } for(int i = 0; i < 6; i++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } Vec2f p = glm::diskRand(15.f); pd->ov = eCurPos + Vec3f(p.x, 0.f, p.y); pd->move = Vec3f(0.f, Random::getf(1.f, 4.f), 0.f); pd->siz = 0.25f; pd->tolive = Random::getu(2300, 3300); pd->tc = tex_p1; pd->m_flags = PARTICLE_GOLDRAIN | FADE_IN_AND_OUT | ROTATING | DISSIPATING; pd->m_rotation = 0.0000001f; Color3f baseColor = Color3f(0.4f, 0.2f, 0.4f); Color3f randomFactor = Color3f(0.4f, 0.6f, 0.4f); Color3f c = baseColor + randomColor3f() * randomFactor; while(glm::abs(c.r - c.g) > 0.3f && glm::abs(c.g - c.b) > 0.3f) { c = baseColor + randomColor3f() * randomFactor; } pd->rgb = c * Color3f(0.8f, 0.8f, 0.8f); } EERIE_LIGHT * light = dynLightCreate(m_light); if(light) { light->intensity = 1.3f; light->fallstart = 180.f; light->fallend = 420.f; light->rgb = Color3f(0.3f, 0.3f, 0.5f) + Color3f(0.2f, 0.f, 0.2f) * randomColor3f(); light->pos = eCurPos; light->duration = ArxDurationMs(200); light->extras = 0; } }