void AttachableSystem::Update( double DeltaTime ) { for (auto actor : mScene.GetActorsFromMap( GetType_static() )) { Opt<IAttachableComponent> attachableC = actor->Get<IAttachableComponent>(); if ( !attachableC.IsValid() ) { continue; } Opt<Actor> attachedActor( mScene.GetActor( attachableC->GetAttachedGUID() ) ); if ( attachableC->GetAttachedGUID() == -1 ) { continue; } if ( !attachedActor.IsValid() ) { attachableC->SetAttachedGUID( -1 ); EventServer< AttachStateChangedEvent>::Get().SendEvent( AttachStateChangedEvent( AttachStateChangedEvent::Detached, -1, actor->GetGUID() ) ); continue; } Opt<IHealthComponent> attachedHealthC( attachedActor->Get<IHealthComponent>() ); if ( attachedHealthC.IsValid() ) { if ( !attachedHealthC->IsAlive() ) { if (attachableC->IsRemoveOnAttachedDeath()) { Opt<IHealthComponent> healthC( actor->Get<IHealthComponent>() ); if (healthC.IsValid()) { healthC->SetHP( 0 ); } } attachableC->SetAttachedGUID( -1 ); EventServer<AttachStateChangedEvent>::Get().SendEvent( AttachStateChangedEvent( AttachStateChangedEvent::Detached, attachedActor->GetGUID(), actor->GetGUID() ) ); continue; } } Opt<IPositionComponent> attachedPositionC( attachedActor->Get<IPositionComponent>() ); if ( !attachedPositionC.IsValid() ) { continue; } Opt<IPositionComponent> positionC( actor->Get<IPositionComponent>() ); if ( !positionC.IsValid() ) { continue; } glm::vec2 rvec = glm::rotate(glm::vec2(attachableC->GetPositionX(), attachableC->GetPositionY()), float( attachedPositionC->GetOrientation() ) ); positionC->SetX( attachedPositionC->GetX() + rvec.x ); positionC->SetY( attachedPositionC->GetY() + rvec.y ); if (attachableC->IsInheritOrientation()) { positionC->SetOrientation( attachedPositionC->GetOrientation() + boost::math::double_constants::pi ); } } }
void WeaponItemSubSystem::SetProjectilePosition(Actor& projectile, Actor& actor) { Opt<IPositionComponent> projPositionC = projectile.Get<IPositionComponent>(); Opt<IPositionComponent> actorPositionC = actor.Get<IPositionComponent>(); glm::vec2 rvec(0.0, 0.0); Opt<IInventoryComponent> inventoryC = actor.Get<IInventoryComponent>(); if (inventoryC.IsValid()) { Opt<Weapon> weapon = inventoryC->GetSelectedWeapon(); if (weapon.IsValid()) { rvec.x += weapon->GetPositionX(); rvec.y -= weapon->GetPositionY(); } } rvec=glm::rotate(rvec, float(actorPositionC->GetOrientation())); projPositionC->SetX( projPositionC->GetX() + actorPositionC->GetX() + rvec.x ); projPositionC->SetY( projPositionC->GetY() + actorPositionC->GetY() + rvec.y ); }