void ARX_EQUIPMENT_RecreatePlayerMesh() { if(EXITING) return; arx_assert(entities.player()); Entity * io = entities.player(); if(io->obj != hero) delete io->obj; io->obj = loadObject("graph/obj3d/interactive/npc/human_base/human_base.teo", false); applyTweak(EQUIP_SLOT_HELMET, TWEAK_HEAD, "head"); applyTweak(EQUIP_SLOT_ARMOR, TWEAK_TORSO, "chest"); applyTweak(EQUIP_SLOT_LEGGINGS, TWEAK_LEGS, "leggings"); Entity * target = entities.player(); for(size_t i = 0; i < MAX_EQUIPED; i++) { if(ValidIONum(player.equiped[i])) { Entity *toequip = entities[player.equiped[i]]; if(toequip) { if(toequip->type_flags & (OBJECT_TYPE_DAGGER | OBJECT_TYPE_1H | OBJECT_TYPE_2H | OBJECT_TYPE_BOW)) { if(player.Interface & INTER_COMBATMODE) { ARX_EQUIPMENT_AttachPlayerWeaponToHand(); } else { EERIE_LINKEDOBJ_LinkObjectToObject(target->obj, toequip->obj, "weapon_attach", "primary_attach", toequip); } } else if(toequip->type_flags & OBJECT_TYPE_SHIELD) { if(ValidIONum(player.equiped[EQUIP_SLOT_SHIELD])) { EERIE_LINKEDOBJ_LinkObjectToObject(target->obj, toequip->obj, "shield_attach", "shield_attach", toequip); } } } } } ARX_PLAYER_Restore_Skin(); HERO_SHOW_1ST = -1; if(EXTERNALVIEW) { ARX_INTERACTIVE_Show_Hide_1st(entities.player(), 0); } else { ARX_INTERACTIVE_Show_Hide_1st(entities.player(), 1); } ARX_INTERACTIVE_HideGore(entities.player(), 1); EERIE_Object_Precompute_Fast_Access(hero); EERIE_Object_Precompute_Fast_Access(entities.player()->obj); ARX_INTERACTIVE_RemoveGoreOnIO(entities.player()); }
void CreateFieldSpell::Launch() { unsigned long start = (unsigned long)(arxtime); if(m_flags & SPELLCAST_FLAG_RESTORE) { start -= std::min(start, 4000ul); } m_timcreation = start; m_duration = (m_launchDuration > -1) ? m_launchDuration : 800000; m_hasDuration = true; m_fManaCostPerSecond = 1.2f; Vec3f target; float beta = 0.f; bool displace = false; if(m_caster == PlayerEntityHandle) { target = entities.player()->pos; beta = player.angle.getPitch(); displace = true; } else { if(ValidIONum(m_caster)) { Entity * io = entities[m_caster]; target = io->pos; beta = io->angle.getPitch(); displace = (io->ioflags & IO_NPC) == IO_NPC; } else { ARX_DEAD_CODE(); } } if(displace) { target += angleToVectorXZ(beta) * 250.f; } ARX_SOUND_PlaySFX(SND_SPELL_CREATE_FIELD, &target); res::path cls = "graph/obj3d/interactive/fix_inter/blue_cube/blue_cube"; Entity * io = AddFix(cls, -1, IO_IMMEDIATELOAD); if(io) { ARX_INTERACTIVE_HideGore(io); RestoreInitialIOStatusOfIO(io); m_entity = io->index(); io->scriptload = 1; io->ioflags |= IO_NOSAVE | IO_FIELD; io->initpos = io->pos = target; SendInitScriptEvent(io); m_field.Create(target); m_field.SetDuration(m_duration); m_field.lLightId = GetFreeDynLight(); if(lightHandleIsValid(m_field.lLightId)) { EERIE_LIGHT * light = lightHandleGet(m_field.lLightId); light->intensity = 0.7f + 2.3f; light->fallend = 500.f; light->fallstart = 400.f; light->rgb = Color3f(0.8f, 0.0f, 1.0f); light->pos = m_field.eSrc - Vec3f(0.f, 150.f, 0.f); } m_duration = m_field.GetDuration(); if(m_flags & SPELLCAST_FLAG_RESTORE) { m_field.Update(4000); } } else { m_duration = 0; } }
void RiseDeadSpell::Update(float timeDelta) { if(m_creationFailed) { m_light = LightHandle(); return; } m_duration+=200; m_fissure.Update(timeDelta); m_fissure.Render(); if(lightHandleIsValid(m_light)) { EERIE_LIGHT * light = lightHandleGet(m_light); light->intensity = 0.7f + 2.3f; light->fallend = 500.f; light->fallstart = 400.f; light->rgb = Color3f(0.8f, 0.2f, 0.2f); light->duration=800; light->time_creation = (unsigned long)(arxtime); } unsigned long tim = m_fissure.ulCurrentTime; if(tim > 3000 && m_entity == EntityHandle() && !m_creationFailed) { ARX_SOUND_PlaySFX(SND_SPELL_ELECTRIC, &m_targetPos); Cylinder phys = Cylinder(m_targetPos, 50, -200); float anything = CheckAnythingInCylinder(phys, NULL, CFLAG_JUST_TEST); if(glm::abs(anything) < 30) { const char * cls = "graph/obj3d/interactive/npc/undead_base/undead_base"; Entity * io = AddNPC(cls, -1, IO_IMMEDIATELOAD); if(io) { ARX_INTERACTIVE_HideGore(io); RestoreInitialIOStatusOfIO(io); io->summoner = m_caster; io->ioflags|=IO_NOSAVE; m_entity = io->index(); io->scriptload=1; ARX_INTERACTIVE_Teleport(io, phys.origin); SendInitScriptEvent(io); if(ValidIONum(m_caster)) { EVENT_SENDER = entities[m_caster]; } else { EVENT_SENDER = NULL; } SendIOScriptEvent(io,SM_SUMMONED); Vec3f pos = m_fissure.m_eSrc; pos += randomVec3f() * 100.f; pos += Vec3f(-50.f, 50.f, -50.f); MakeCoolFx(pos); } m_light = LightHandle(); } else { ARX_SOUND_PlaySFX(SND_MAGIC_FIZZLE); m_creationFailed = true; m_duration=0; } } else if(!arxtime.is_paused() && tim < 4000) { if(Random::getf() > 0.95f) { MakeCoolFx(m_fissure.m_eSrc); } } }