/*virtual*/ void WBCompOwner::HandleEvent( const WBEvent& Event )
{
	XTRACE_FUNCTION;

	Super::HandleEvent( Event );

	// Bit of a hack; OnEquipped is sent from Eldritch code and this lives in Workbench.
	STATIC_HASHED_STRING( OnEquipped );
	STATIC_HASHED_STRING( SetOwner );

	const HashedString EventName = Event.GetEventName();
	if( EventName == sOnEquipped )
	{
		STATIC_HASHED_STRING( Owner );
		WBEntity* const pOwner = Event.GetEntity( sOwner );
		SetOwner( pOwner );
	}
	else if( EventName == sSetOwner )
	{
		STATIC_HASHED_STRING( NewOwner );
		WBEntity* const pNewOwner = Event.GetEntity( sNewOwner );

		SetOwner( pNewOwner );
	}
}
/*virtual*/ void WBCompEldSleeper::HandleEvent(const WBEvent& Event) {
  XTRACE_FUNCTION;

  Super::HandleEvent(Event);

  STATIC_HASHED_STRING(OnDamaged);
  STATIC_HASHED_STRING(OnAINoise);

  const HashedString EventName = Event.GetEventName();
  if (EventName == sOnDamaged) {
    Wake();
  } else if (EventName == sOnAINoise) {
    STATIC_HASHED_STRING(EventOwner);
    WBEntity* const pEventOwner = Event.GetEntity(sEventOwner);
    ASSERT(pEventOwner);

    if (pEventOwner == GetEntity()) {
      // Ignore AI noises from self (see SensorHearing for more details).
    } else {
      STATIC_HASHED_STRING(NoiseLocation);
      const Vector NoiseLocation = Event.GetVector(sNoiseLocation);

      STATIC_HASHED_STRING(NoiseRadius);
      const float NoiseRadius = Event.GetFloat(sNoiseRadius);

      HandleNoise(NoiseLocation, NoiseRadius);
    }
  }
}
/*virtual*/ void WBCompEldLight::HandleEvent( const WBEvent& Event )
{
	XTRACE_FUNCTION;

	Super::HandleEvent( Event );

	STATIC_HASHED_STRING( OnMoved );
	STATIC_HASHED_STRING( OnDestroyed );
	STATIC_HASHED_STRING( AddLight );
	STATIC_HASHED_STRING( RemoveLight );

	const HashedString EventName = Event.GetEventName();
	if( EventName == sOnMoved )
	{
		if( m_DeferAddLight )
		{
			// Do nothing
		}
		else
		{
			AddLight();
		}
	}
	else if( EventName == sAddLight )
	{
		AddLight();
	}
	else if( EventName == sOnDestroyed || EventName == sRemoveLight )
	{
		RemoveLight();
	}
}
Exemple #4
0
/*virtual*/ void WBCompEldRope::HandleEvent(const WBEvent& Event) {
  XTRACE_FUNCTION;

  Super::HandleEvent(Event);

  STATIC_HASHED_STRING(OnWorldChanged);
  STATIC_HASHED_STRING(OnStaticCollisionChanged);
  STATIC_HASHED_STRING(OnInitialOrientationSet);

  const HashedString EventName = Event.GetEventName();
  if (EventName == sOnWorldChanged || EventName == sOnStaticCollisionChanged) {
    if (m_Dropped) {
      // If anchor is removed, destroy the rope (and drop anyone climbing on
      // it!)

      CollisionInfo Info;
      Info.m_CollideWorld = true;
      Info.m_CollideEntities = true;
      Info.m_CollidingEntity = GetEntity();
      Info.m_UserFlags = EECF_CollideAsEntity | EECF_CollideStaticEntities;

      EldritchWorld* const pWorld = GetWorld();
      if (!pWorld->PointCheck(m_Anchor, Info)) {
        GetEntity()->Destroy();
      }
    }
  } else if (EventName == sOnInitialOrientationSet) {
    DropRope();
  }
}
/*virtual*/ void WBCompEldHard::HandleEvent( const WBEvent& Event )
{
	XTRACE_FUNCTION;

	Super::HandleEvent( Event );

	STATIC_HASHED_STRING( SetHard );
	STATIC_HASHED_STRING( PushPersistence );
	STATIC_HASHED_STRING( PullPersistence );

	const HashedString EventName = Event.GetEventName();
	if( EventName == sSetHard )
	{
		m_Hard = true;

		// Broadcast event to everything with an EldHardListener component.
		WB_MAKE_EVENT( NotifyHardModeSet, NULL );
		WB_DISPATCH_EVENT( GetEventManager(), NotifyHardModeSet, NULL );
	}
	else if( EventName == sPushPersistence )
	{
		PushPersistence();
	}
	else if( EventName == sPullPersistence )
	{
		PullPersistence();
	}
}
Exemple #6
0
/*virtual*/ void Framework3D::HandleEvent(const WBEvent& Event) {
  XTRACE_FUNCTION;

  STATIC_HASHED_STRING(QuitGame);
  STATIC_HASHED_STRING(ResetRenderer);
  STATIC_HASHED_STRING(ConditionalRefreshDisplay);
  STATIC_HASHED_STRING(RefreshDisplay);

  const HashedString EventName = Event.GetEventName();
  if (EventName == sQuitGame) {
#if BUILD_WINDOWS_NO_SDL
    XTRACE_NAMED(PostQuitMessage);
    PostQuitMessage(0);
#endif
#if BUILD_SDL
    SDL_Event QuitEvent;
    QuitEvent.type = SDL_QUIT;
    const int Success = SDL_PushEvent(&QuitEvent);
    ASSERT(Success);
    Unused(Success);
#endif
  } else if (EventName == sResetRenderer) {
    ResetRenderer();
  } else if (EventName == sConditionalRefreshDisplay) {
    ConditionalRefreshDisplay();
  } else if (EventName == sRefreshDisplay) {
    RefreshDisplay(m_Display->m_Fullscreen, m_Display->m_Width,
                   m_Display->m_Height);
  }
}
/*virtual*/ void UIScreenEldMirror::HandleEvent( const WBEvent& Event )
{
	XTRACE_FUNCTION;

	STATIC_HASHED_STRING( SetHeadMesh );
	STATIC_HASHED_STRING( SetBodyMesh );

	const HashedString EventName = Event.GetEventName();

	if( EventName == sSetHeadMesh )
	{
		STATIC_HASHED_STRING( HeadMesh );
		const SimpleString HeadMesh = Event.GetString( sHeadMesh );

		STATIC_HASHED_STRING( HeadTexture );
		const SimpleString HeadTexture = Event.GetString( sHeadTexture );

		SetHeadMesh( HeadMesh, HeadTexture );
	}
	else if( EventName == sSetBodyMesh )
	{
		STATIC_HASHED_STRING( BodyMesh );
		const SimpleString BodyMesh = Event.GetString( sBodyMesh );

		STATIC_HASHED_STRING( BodyTexture );
		const SimpleString BodyTexture = Event.GetString( sBodyTexture );

		SetBodyMesh( BodyMesh, BodyTexture );
	}
}
/*virtual*/ void WBCompEldEndgameCounter::HandleEvent(const WBEvent& Event) {
  XTRACE_FUNCTION;

  Super::HandleEvent(Event);

  STATIC_HASHED_STRING(OnInitialized);
  STATIC_HASHED_STRING(IncrementEndgameCount);
  STATIC_HASHED_STRING(PushPersistence);
  STATIC_HASHED_STRING(PullPersistence);

  const HashedString EventName = Event.GetEventName();
  if (EventName == sOnInitialized) {
    if (m_Count > 0) {
      PublishToHUD();
    } else {
      SetHUDHidden(true);
    }
  } else if (EventName == sIncrementEndgameCount) {
    ++m_Count;

    PublishToHUD();
  } else if (EventName == sPushPersistence) {
    PushPersistence();
  } else if (EventName == sPullPersistence) {
    PullPersistence();
  }
}
/*virtual*/ void WBCompEldAnchor::HandleEvent( const WBEvent& Event )
{
	XTRACE_FUNCTION;

	Super::HandleEvent( Event );

	STATIC_HASHED_STRING( OnSpawnedQueued );
	STATIC_HASHED_STRING( OnWorldChanged );
	STATIC_HASHED_STRING( OnStaticCollisionChanged );
	STATIC_HASHED_STRING( Unanchor );

	const HashedString EventName = Event.GetEventName();
	if( EventName == sOnSpawnedQueued )
	{
		SetAnchor();
	}
	else if( EventName == sOnWorldChanged || EventName == sOnStaticCollisionChanged )
	{
		if( m_IsAnchored )
		{
			CheckAnchor();
		}
	}
	else if( EventName == sUnanchor )
	{
		if( m_IsAnchored )
		{
			// Forcibly unanchor the entity
			Unanchor();
		}
	}
}
Exemple #10
0
/*virtual*/ void WBCompEldWallet::HandleEvent(const WBEvent& Event) {
  XTRACE_FUNCTION;

  Super::HandleEvent(Event);

  STATIC_HASHED_STRING(AddMoney);
  STATIC_HASHED_STRING(RemoveMoney);
  STATIC_HASHED_STRING(OnInitialized);
  STATIC_HASHED_STRING(PushPersistence);
  STATIC_HASHED_STRING(PullPersistence);

  const HashedString EventName = Event.GetEventName();
  if (EventName == sOnInitialized) {
    PublishToHUD();
  } else if (EventName == sAddMoney) {
    STATIC_HASHED_STRING(Money);
    const uint Money = Event.GetInt(sMoney);

    STATIC_HASHED_STRING(ShowPickupScreen);
    const bool ShowPickupScreen = Event.GetBool(sShowPickupScreen);

    AddMoney(Money, ShowPickupScreen);
  } else if (EventName == sRemoveMoney) {
    STATIC_HASHED_STRING(Money);
    const uint Money = Event.GetInt(sMoney);
    RemoveMoney(Money);
  } else if (EventName == sPushPersistence) {
    PushPersistence();
  } else if (EventName == sPullPersistence) {
    PullPersistence();
  }
}
/*virtual*/ void WBCompEldLock::HandleEvent( const WBEvent& Event )
{
	XTRACE_FUNCTION;

	Super::HandleEvent( Event );

	STATIC_HASHED_STRING( OnSpawned );
	STATIC_HASHED_STRING( Unlock );

	const HashedString EventName = Event.GetEventName();
	if( EventName == sOnSpawned )
	{
		EldritchPersistence* const pPersistence = GetGame()->GetPersistence();
		ASSERT( pPersistence );

		if( pPersistence->IsOpenLock( m_Key ) )
		{
			Unlock();
		}
	}
	else if( EventName == sUnlock )
	{
		Unlock();
	}
}
/*virtual*/ void EldritchFramework::HandleEvent(const WBEvent& Event) {
  XTRACE_FUNCTION;

  Framework3D::HandleEvent(Event);

  STATIC_HASHED_STRING(ToggleInvertY);
  STATIC_HASHED_STRING(ToggleFullscreen);
  STATIC_HASHED_STRING(OnSliderChanged);
  STATIC_HASHED_STRING(WritePrefsConfig);
  STATIC_HASHED_STRING(CheckForUpdates);

  const HashedString EventName = Event.GetEventName();
  if (EventName == sToggleInvertY) {
    XTRACE_NAMED(ToggleInvertY);

    // TODO: Also invert controller? Or on a separate button?

    STATIC_HASHED_STRING(TurnY);
    const bool InvertY = !m_InputSystem->GetMouseInvert(sTurnY);
    m_InputSystem->SetMouseInvert(sTurnY, InvertY);
    m_InputSystem->SetControllerInvert(sTurnY, InvertY);

    // Publish config var so UI can reflect the change.
    // I could make input system publish config vars for each adjustment, but
    // that seems wasteful since most inputs currently have no adjustment.
    STATICHASH(InvertY);
    ConfigManager::SetBool(sInvertY, InvertY);
  } else if (EventName == sToggleFullscreen) {
    XTRACE_NAMED(ToggleFullscreen);
    ToggleFullscreen();
  } else if (EventName == sOnSliderChanged) {
    XTRACE_NAMED(OnSliderChanged);

    STATIC_HASHED_STRING(SliderName);
    const HashedString SliderName = Event.GetHash(sSliderName);

    STATIC_HASHED_STRING(SliderValue);
    const float SliderValue = Event.GetFloat(sSliderValue);

    HandleUISliderEvent(SliderName, SliderValue);
  } else if (EventName == sWritePrefsConfig) {
    XTRACE_NAMED(WritePrefsConfig);
    WritePrefsConfig();
  } else if (EventName == sCheckForUpdates) {
#if BUILD_WINDOWS && !BUILD_STEAM
    XTRACE_NAMED(CheckForUpdates);

    // So I can compile updating out of certain builds.
    STATICHASH(Framework);
    STATICHASH(CheckForUpdates);
    const bool CheckForUpdates =
        ConfigManager::GetBool(sCheckForUpdates, true, sFramework);
    if (CheckForUpdates) {
      m_CheckForUpdates->Check(false, true);
    }
#endif
  }
}
/*virtual*/ void WBCompEldIcicles::HandleEvent( const WBEvent& Event )
{
	XTRACE_FUNCTION;

	Super::HandleEvent( Event );

	STATIC_HASHED_STRING( OnTouched );

	const HashedString EventName = Event.GetEventName();
	// TODO
	Unused( EventName );
}
Exemple #14
0
/*virtual*/ void WBCompEldThinker::HandleEvent(const WBEvent& Event) {
  XTRACE_FUNCTION;

  WBEldritchComponent::HandleEvent(Event);

  STATIC_HASHED_STRING(TickThinkers);

  const HashedString EventName = Event.GetEventName();
  if (EventName == sTickThinkers) {
    Tick(0.0f);
  }
}
/*virtual*/ void WBCompEldPickup::HandleEvent( const WBEvent& Event )
{
	XTRACE_FUNCTION;

	Super::HandleEvent( Event );

	STATIC_HASHED_STRING( OnFrobbed );
	STATIC_HASHED_STRING( OnPurchaseBuy );
	STATIC_HASHED_STRING( OnPurchaseSteal );
	STATIC_HASHED_STRING( OnShopkeeperDied );

	const HashedString EventName = Event.GetEventName();
	if( EventName == sOnShopkeeperDied )
	{
		m_Price = 0;
	}
	else if( EventName == sOnFrobbed )
	{
		STATIC_HASHED_STRING( Frobber );
		WBEntity* const pFrobber = Event.GetEntity( sFrobber );
		ASSERT( pFrobber );

		if( m_Price > 0 )
		{
			SellItemTo( pFrobber );
		}
		else
		{
			GiveItemTo( pFrobber );
		}
	}
	else if( EventName == sOnPurchaseBuy )
	{
		if( this == sm_PurchasePickup )
		{
			ASSERT( sm_Purchaser );
			AcceptPaymentFrom( sm_Purchaser );
			NotifyPurchasedBy( sm_Purchaser );
			GiveItemTo( sm_Purchaser );
		}
	}
	else if( EventName == sOnPurchaseSteal )
	{
		if( this == sm_PurchasePickup )
		{
			ASSERT( sm_Purchaser );
			NotifyTheftBy( sm_Purchaser );
			GiveItemTo( sm_Purchaser );
		}
	}
}
/*virtual*/ void WBCompEldHUDMarker::HandleEvent( const WBEvent& Event )
{
	XTRACE_FUNCTION;

	Super::HandleEvent( Event );

	STATIC_HASHED_STRING( OnCameraTicked );

	const HashedString EventName = Event.GetEventName();
	if( EventName == sOnCameraTicked )
	{
		UpdateMarkerPosition();
	}
}
/*virtual*/ void EldritchPersistence::HandleEvent( const WBEvent& Event )
{
	STATIC_HASHED_STRING( SetPersistentVar );

	const HashedString EventName = Event.GetEventName();
	if( EventName == sSetPersistentVar )
	{
		STATIC_HASHED_STRING( Name );
		const HashedString Name = Event.GetHash( sName );

		STATIC_HASHED_STRING( Value );
		const WBEvent::SParameter* const pParameter = Event.GetParameter( sValue );
		m_VariableMap.Set( Name, pParameter );
	}
}
Exemple #18
0
/*virtual*/ void WBCompState::HandleEvent(const WBEvent& Event) {
  XTRACE_FUNCTION;

  Super::HandleEvent(Event);

  STATIC_HASHED_STRING(SetState);

  const HashedString EventName = Event.GetEventName();
  if (EventName == sSetState) {
    STATIC_HASHED_STRING(NewState);
    const HashedString State = Event.GetHash(sNewState);

    SetState(State);
  }
}
Exemple #19
0
/*virtual*/ void WBCompEldVisible::HandleEvent(const WBEvent& Event) {
  XTRACE_FUNCTION;

  Super::HandleEvent(Event);

  STATIC_HASHED_STRING(SetVisible);
  STATIC_HASHED_STRING(SetInvisible);

  const HashedString EventName = Event.GetEventName();
  if (EventName == sSetVisible) {
    m_Visible = true;
  } else if (EventName == sSetInvisible) {
    m_Visible = false;
  }
}
Exemple #20
0
/*virtual*/ void WBCompEldFaction::HandleEvent(const WBEvent& Event) {
  XTRACE_FUNCTION;

  Super::HandleEvent(Event);

  STATIC_HASHED_STRING(SetFaction);

  const HashedString EventName = Event.GetEventName();
  if (EventName == sSetFaction) {
    if (m_Immutable) {
      // Faction can't be changed, do nothing
    } else {
      STATIC_HASHED_STRING(Faction);
      m_Faction = Event.GetHash(sFaction);
    }
  }
}
/*virtual*/ void WBCompRodinBehaviorTree::HandleEvent(const WBEvent& Event) {
  XTRACE_FUNCTION;

  Super::HandleEvent(Event);

  STATIC_HASHED_STRING(PauseBT);
  STATIC_HASHED_STRING(UnpauseBT);

  const HashedString EventName = Event.GetEventName();
  if (EventName == sPauseBT) {
    m_Paused = true;

    // Also flush the scheduler so that running actions clean up.
    Flush();
  } else if (EventName == sUnpauseBT) {
    m_Paused = false;
  }
}
Exemple #22
0
/*virtual*/ void WBCompEldFrobber::HandleEvent(const WBEvent& Event) {
  XTRACE_FUNCTION;

  Super::HandleEvent(Event);

  STATIC_HASHED_STRING(OnFrob);
  STATIC_HASHED_STRING(EnableFrob);
  STATIC_HASHED_STRING(DisableFrob);

  const HashedString EventName = Event.GetEventName();
  if (EventName == sOnFrob) {
    STATIC_HASHED_STRING(InputEdge);
    const int InputEdge = Event.GetInt(sInputEdge);

    TryFrob(InputEdge);
  } else if (EventName == sEnableFrob) {
    m_FrobDisabled = false;
  } else if (EventName == sDisableFrob) {
    m_FrobDisabled = true;
  }
}
/*virtual*/ void WBCompEldSensorTheft::HandleEvent(const WBEvent& Event) {
  XTRACE_FUNCTION;

  Super::HandleEvent(Event);

  STATIC_HASHED_STRING(OnTheft);

  const HashedString EventName = Event.GetEventName();
  if (EventName == sOnTheft) {
    STATIC_HASHED_STRING(Thief);
    WBEntity* const pThief = Event.GetEntity(sThief);

    HandleTheft(pThief);

    // Also, forward event to this entity for scripting to handle.
    {
      WB_MAKE_EVENT(OnTheftSensed, GetEntity());
      WB_SET_AUTO(OnTheftSensed, Entity, Thief, pThief);
      WB_DISPATCH_EVENT(GetEventManager(), OnTheftSensed, GetEntity());
    }
  }
}
/*virtual*/ void WBCompEldMapMarker::HandleEvent( const WBEvent& Event )
{
	Super::HandleEvent( Event );

	STATIC_HASHED_STRING( OnMoved );
	STATIC_HASHED_STRING( OnTurned );
	STATIC_HASHED_STRING( OnInitializedQueued );
	STATIC_HASHED_STRING( OnDestroyed );

	const HashedString EventName = Event.GetEventName();
	if( EventName == sOnInitializedQueued )
	{
		AddMarker();
		UpdateMarker();
	}
	else if( EventName == sOnMoved || sOnTurned )
	{
		UpdateMarker();
	}
	else if( EventName == sOnDestroyed )
	{
		RemoveMarker();
	}
}
/*virtual*/ void WBCompEldSensor::HandleEvent( const WBEvent& Event )
{
	XTRACE_FUNCTION;

	WBEldritchComponent::HandleEvent( Event );

	STATIC_HASHED_STRING( TickSensors );
	STATIC_HASHED_STRING( PauseSensors );
	STATIC_HASHED_STRING( UnpauseSensors );

	const HashedString EventName = Event.GetEventName();
	if( EventName == sTickSensors )
	{
		Tick( 0.0f );
	}
	else if( EventName == sPauseSensors )
	{
		m_Paused = true;
	}
	else if( EventName == sUnpauseSensors )
	{
		m_Paused = false;
	}
}
Exemple #26
0
/*virtual*/ void WBCompEldMesh::HandleEvent(const WBEvent& Event) {
  XTRACE_FUNCTION;

  Super::HandleEvent(Event);

  STATIC_HASHED_STRING(OnInitialized);
  STATIC_HASHED_STRING(OnSpawnedQueued);
  STATIC_HASHED_STRING(OnLoaded);
  STATIC_HASHED_STRING(OnBecameFrobTarget);
  STATIC_HASHED_STRING(Hide);
  STATIC_HASHED_STRING(Show);
  STATIC_HASHED_STRING(HideMesh);
  STATIC_HASHED_STRING(ShowMesh);
  STATIC_HASHED_STRING(PlayAnim);
  STATIC_HASHED_STRING(SetAnim);
  STATIC_HASHED_STRING(CopyAnimations);
  STATIC_HASHED_STRING(SetMesh);
  STATIC_HASHED_STRING(SetTexture);

  const HashedString EventName = Event.GetEventName();
  if (EventName == sOnInitialized) {
    SetSendUpdatedEvent();
  } else if (EventName == sOnSpawnedQueued ||
             EventName == sOnLoaded)  // Need to have a valid transform
  {
    ImmediateUpdateBlendedIrradiance();
  } else if (EventName == sOnBecameFrobTarget) {
    STATIC_HASHED_STRING(IsFrobTarget);
    const bool IsFrobTarget = Event.GetBool(sIsFrobTarget);

    if (IsFrobTarget) {
      STATIC_HASHED_STRING(Highlight);
      m_CurrentHighlight = Event.GetVector(sHighlight);
    } else {
      m_CurrentHighlight.Zero();
    }
  } else if (EventName == sHide || EventName == sHideMesh) {
    m_Hidden = true;
  } else if (EventName == sShow || EventName == sShowMesh) {
    m_Hidden = false;
  } else if (EventName == sPlayAnim) {
    STATIC_HASHED_STRING(AnimationName);
    const HashedString AnimationName = Event.GetHash(sAnimationName);

    STATIC_HASHED_STRING(Loop);
    const bool Loop = Event.GetBool(sLoop);

    STATIC_HASHED_STRING(IgnoreIfAlreadyPlaying);
    const bool IgnoreIfAlreadyPlaying = Event.GetBool(sIgnoreIfAlreadyPlaying);

    STATIC_HASHED_STRING(PlayRate);
    const float PlayRate = Event.GetFloat(sPlayRate);

    PlayAnimation(AnimationName, Loop, IgnoreIfAlreadyPlaying, PlayRate);
  } else if (EventName == sSetAnim) {
    STATIC_HASHED_STRING(AnimationIndex);
    const int AnimationIndex = Event.GetInt(sAnimationIndex);

    STATIC_HASHED_STRING(AnimationTime);
    const float AnimationTime = Event.GetFloat(sAnimationTime);

    STATIC_HASHED_STRING(AnimationEndBehavior);
    const int AnimationEndBehavior = Event.GetInt(sAnimationEndBehavior);

    STATIC_HASHED_STRING(AnimationPlayRate);
    const float AnimationPlayRate = Event.GetFloat(sAnimationPlayRate);

    AnimationState::SPlayAnimationParams PlayParams;
    PlayParams.m_EndBehavior =
        static_cast<AnimationState::EAnimationEndBehavior>(
            AnimationEndBehavior);

    m_Mesh->SetAnimation(AnimationIndex, PlayParams);
    m_Mesh->SetAnimationTime(AnimationTime);
    m_Mesh->SetAnimationPlayRate(AnimationPlayRate > 0.0f ? AnimationPlayRate
                                                          : 1.0f);
  } else if (EventName == sCopyAnimations) {
    STATIC_HASHED_STRING(SourceEntity);
    WBEntity* const pSourceEntity = Event.GetEntity(sSourceEntity);

    STATIC_HASHED_STRING(SuppressAnimEvents);
    const bool SuppressAnimEvents = Event.GetBool(sSuppressAnimEvents);

    CopyAnimationsFrom(pSourceEntity, SuppressAnimEvents);
  } else if (EventName == sSetMesh) {
    STATIC_HASHED_STRING(Mesh);
    const SimpleString Mesh = Event.GetString(sMesh);

    STATIC_HASHED_STRING(Texture);
    const SimpleString Texture = Event.GetString(sTexture);

    SetMesh(Mesh);
    SetTexture(Texture);
    UpdateMesh(0.0f);
  } else if (EventName == sSetTexture) {
    STATIC_HASHED_STRING(Texture);
    const SimpleString Texture = Event.GetString(sTexture);

    SetTexture(Texture);
  }
}
/*virtual*/ void WBCompEldHands::HandleEvent( const WBEvent& Event )
{
	XTRACE_FUNCTION;

	Super::HandleEvent( Event );

	STATIC_HASHED_STRING( OnWorldLoaded );
	STATIC_HASHED_STRING( OnItemEquipped );
	STATIC_HASHED_STRING( OnItemUnequipped );
	STATIC_HASHED_STRING( OnItemsSwapped );
	STATIC_HASHED_STRING( UseRightHand );
	STATIC_HASHED_STRING( UseLeftHand );
	STATIC_HASHED_STRING( ShowHands );
	STATIC_HASHED_STRING( HideHands );
	STATIC_HASHED_STRING( PlayHandAnim );
	STATIC_HASHED_STRING( SetHandMeshes );

	const HashedString EventName = Event.GetEventName();
	if( EventName == sOnWorldLoaded )
	{
		if( GetItemInRightHand() == GetWeapon() )
		{
			WB_MAKE_EVENT( OnWeaponEquipped, GetEntity() );
			WB_SET_AUTO( OnWeaponEquipped, Entity, Weapon, GetWeapon() );
			WB_DISPATCH_EVENT( GetEventManager(), OnWeaponEquipped, GetEntity() );
		}

		RestoreHandAnimations();

		UpdateWeaponHUD();
	}
	else if( EventName == sOnItemEquipped )
	{
		STATIC_HASHED_STRING( Item );
		WBEntity* const pItem = Event.GetEntity( sItem );
		ASSERT( pItem );

		// Hide fists and show ammo when we equip a weapon
		if( pItem == GetWeapon() )
		{
			WB_MAKE_EVENT( Hide, GetEntity() );
			WB_DISPATCH_EVENT( GetEventManager(), Hide, GetFists() );

			WB_MAKE_EVENT( OnWeaponEquipped, GetEntity() );
			WB_SET_AUTO( OnWeaponEquipped, Entity, Weapon, pItem );
			WB_DISPATCH_EVENT( GetEventManager(), OnWeaponEquipped, GetEntity() );

			ShowWeaponHUD();
		}
		
		if( pItem == GetItemInRightHand() ||
			pItem == GetItemInLeftHand() )
		{
			AddAnimationsToHand( pItem );
		}

		if( pItem == GetWeaponAlt() )
		{
			// When traveling to a new world and spawning an item in the alt slot, immediately hide it
			WB_MAKE_EVENT( Hide, GetEntity() );
			WB_DISPATCH_EVENT( GetEventManager(), Hide, GetWeaponAlt() );

			ShowWeaponAltHUD();
		}
	}
	else if( EventName == sOnItemUnequipped )
	{
		// Show fists when we unequip a weapon
		STATIC_HASHED_STRING( Item );
		WBEntity* const pItem = Event.GetEntity( sItem );
		if( pItem == GetWeapon() )
		{
			WB_MAKE_EVENT( Show, GetEntity() );
			WB_DISPATCH_EVENT( GetEventManager(), Show, GetFists() );

			WB_MAKE_EVENT( OnWeaponUnequipped, GetEntity() );
			WB_DISPATCH_EVENT( GetEventManager(), OnWeaponUnequipped, GetEntity() );

			// Revert to the fists animations
			AddAnimationsToHand( GetFists(), EH_Right );

			// HACK: Play the idle animation. I could add an event for "restored equip focus"
			// or whatever and hook this up in data, but eh. That somehow feels worse.
			STATIC_HASHED_STRING( Idle );
			PlayAnimation( GetFists(), sIdle, EH_Right );

			HideWeaponHUD();
		}
	}
	else if( EventName == sOnItemsSwapped )
	{
		// HACK, since the only things we swap (currently) are Weapon/WeaponAlt

		// Hide the alt weapon, show the right hand item
		WB_MAKE_EVENT( Hide, GetEntity() );
		WB_DISPATCH_EVENT( GetEventManager(), Hide, GetWeaponAlt() );

		WB_MAKE_EVENT( Show, GetEntity() );
		WB_DISPATCH_EVENT( GetEventManager(), Show, GetItemInRightHand() );

		AddAnimationsToHand( GetItemInRightHand() );

		STATIC_HASHED_STRING( Idle );
		PlayAnimation( GetItemInRightHand(), sIdle, EH_Right );

		UpdateWeaponHUD();

		WB_MAKE_EVENT( OnWeaponEquipped, GetEntity() );
		WB_SET_AUTO( OnWeaponEquipped, Entity, Weapon, GetItemInRightHand() );
		WB_DISPATCH_EVENT( GetEventManager(), OnWeaponEquipped, GetEntity() );
	}
	else if( EventName == sUseRightHand )
	{
		WBEntity* const pWeapon = GetItemInRightHand();
		if( pWeapon )
		{
			STATIC_HASHED_STRING( InputEdge );
			const int InputEdge = Event.GetInt( sInputEdge );

			{
				WB_MAKE_EVENT( Use, GetEntity() );
				WB_SET_AUTO( Use, Int, InputEdge, InputEdge );
				WB_DISPATCH_EVENT( GetEventManager(), Use, pWeapon );
			}
		}
	}
	else if( EventName == sUseLeftHand )
	{
		WBEntity* const pPower = GetItemInLeftHand();
		if( pPower )
		{
			STATIC_HASHED_STRING( InputEdge );
			const int InputEdge = Event.GetInt( sInputEdge );

			{
				WB_MAKE_EVENT( Use, GetEntity() );
				WB_SET_AUTO( Use, Int, InputEdge, InputEdge );
				WB_DISPATCH_EVENT( GetEventManager(), Use, pPower );
			}
		}
	}
	else if( EventName == sShowHands )
	{
		DecrementHideHandsRefs();
	}
	else if( EventName == sHideHands )
	{
		IncrementHideHandsRefs();
	}
	else if( EventName == sPlayHandAnim )
	{
		STATIC_HASHED_STRING( AnimatingEntity );
		WBEntity* const pAnimatingEntity = Event.GetEntity( sAnimatingEntity );

		STATIC_HASHED_STRING( AnimationName );
		const HashedString AnimationName = Event.GetHash( sAnimationName );

		// Don't play hand anim if we're restoring the alternate weapon
		if( pAnimatingEntity == GetItemInRightHand() || pAnimatingEntity == GetItemInLeftHand() )
		{
			const EHand Hand = GetHandEnum( pAnimatingEntity );
			PlayAnimation( pAnimatingEntity, AnimationName, Hand );
		}
	}
	else if( EventName == sSetHandMeshes )
	{
		STATIC_HASHED_STRING( LeftHandMesh );
		const SimpleString LeftHandMesh = Event.GetString( sLeftHandMesh );

		STATIC_HASHED_STRING( LeftHandTexture );
		const SimpleString LeftHandTexture = Event.GetString( sLeftHandTexture );

		STATIC_HASHED_STRING( RightHandMesh );
		const SimpleString RightHandMesh = Event.GetString( sRightHandMesh );

		STATIC_HASHED_STRING( RightHandTexture );
		const SimpleString RightHandTexture = Event.GetString( sRightHandTexture );

		SetHandMeshes( LeftHandMesh, LeftHandTexture, RightHandMesh, RightHandTexture );
		RestoreHandAnimations();
	}
}
/*virtual*/ void EldritchGame::HandleEvent( const WBEvent& Event )
{
    XTRACE_FUNCTION;

    STATIC_HASHED_STRING( ReturnToHub );
    STATIC_HASHED_STRING( GoToNextLevel );
    STATIC_HASHED_STRING( GoToPrevLevel );
    STATIC_HASHED_STRING( GoToLevel );
    STATIC_HASHED_STRING( Checkpoint );
    STATIC_HASHED_STRING( TweetRIP );
    STATIC_HASHED_STRING( PlayMusic );
    STATIC_HASHED_STRING( StopMusic );
    STATIC_HASHED_STRING( LaunchWebSite );
    STATIC_HASHED_STRING( GoToLevelImmediate );

    const HashedString EventName = Event.GetEventName();
    if( EventName == sReturnToHub )
    {
        STATIC_HASHED_STRING( Restart );
        const bool Restart = Event.GetBool( sRestart );

        STATIC_HASHED_STRING( FlushHub );
        const bool FlushHub = Event.GetBool( sFlushHub );

        RequestReturnToHub( Restart, FlushHub );
    }
    else if( EventName == sGoToNextLevel )
    {
        RequestGoToNextLevel();
    }
    else if( EventName == sGoToPrevLevel )
    {
        RequestGoToPrevLevel();
    }
    else if( EventName == sGoToLevel )
    {
        STATIC_HASHED_STRING( Level );
        const SimpleString Level = Event.GetString( sLevel );

        STATIC_HASHED_STRING( WorldDef );
        const HashedString WorldDef = Event.GetHash( sWorldDef );

        RequestGoToLevel( Level, WorldDef, true );
    }
    else if( EventName == sCheckpoint )
    {
        Checkpoint();
    }
    else if( EventName == sTweetRIP )
    {
        LaunchRIPTweet();
    }
    else if( EventName == sLaunchWebSite )
    {
        LaunchWebSite();
    }
    else if( EventName == sPlayMusic )
    {
        STATIC_HASHED_STRING( Music );
        const SimpleString Music = Event.GetString( sMusic );

        m_Music->PlayMusic( ( Music == "" ) ? m_CurrentMusic : Music );
    }
    else if( EventName == sStopMusic )
    {
        m_Music->StopMusic();
    }
    else if( EventName == sGoToLevelImmediate )
    {
        // This should only be called after we've queued a go-to.
        ASSERT( m_GoToLevelOnNextTick );
        if( m_GoToLevelOnNextTick )
        {
            GoToLevel();
        }

        // HACK: Tick world once to pump the event queue. Fixes title screen bugs. (Hack because this assumes we only ever use this when returning to title screen.)
        EldritchFramework* const pFramework = EldritchFramework::GetInstance();
        EldritchWorld* const pWorld = pFramework->GetWorld();
        pWorld->Tick( 0.0f );
    }
}
/*virtual*/ void WBCompEldFrobbable::HandleEvent(const WBEvent& Event) {
  XTRACE_FUNCTION;

  Super::HandleEvent(Event);

  STATIC_HASHED_STRING(MarshalFrob);
  STATIC_HASHED_STRING(OnInitialized);
  STATIC_HASHED_STRING(OnDestroyed);
  STATIC_HASHED_STRING(OnMeshUpdated);
  STATIC_HASHED_STRING(SetIsFrobbable);
  STATIC_HASHED_STRING(BecomeFrobbable);
  STATIC_HASHED_STRING(BecomeNonFrobbable);
  STATIC_HASHED_STRING(SetHoldReleaseMode);
  STATIC_HASHED_STRING(SetFriendlyName);
  STATIC_HASHED_STRING(SetFrobVerb);
  STATIC_HASHED_STRING(SetBoundExtents);
  STATIC_HASHED_STRING(SetBoundOffsetZ);

  const HashedString EventName = Event.GetEventName();

  if (EventName == sMarshalFrob) {
    STATIC_HASHED_STRING(Frobber);
    WBEntity* const pFrobber = Event.GetEntity(sFrobber);

    STATIC_HASHED_STRING(InputEdge);
    const int InputEdge = Event.GetInt(sInputEdge);

    MarshalFrob(pFrobber, InputEdge);
  } else if (EventName == sOnInitialized) {
    if (m_UseCollisionExtents) {
      WBCompEldCollision* const pCollision =
          GET_WBCOMP(GetEntity(), EldCollision);
      if (pCollision) {
        m_BoundExtents =
            pCollision->GetExtents() +
            Vector(m_ExtentsFatten, m_ExtentsFatten, m_ExtentsFatten);
      }
    }
  } else if (EventName == sOnDestroyed) {
    if (m_IsProbableFrobbable) {
      SetHUDHidden(true);
    }
  } else if (EventName == sOnMeshUpdated) {
    ASSERT(m_UseMeshExtents);

    WBCompEldTransform* const pTransform =
        GetEntity()->GetTransformComponent<WBCompEldTransform>();
    DEVASSERT(pTransform);

    WBCompEldMesh* const pMeshComponent = GET_WBCOMP(GetEntity(), EldMesh);
    ASSERT(pMeshComponent);

    EldritchMesh* const pMesh = pMeshComponent->GetMesh();
    ASSERT(pMesh);

    m_BoundExtents = pMesh->m_AABB.GetExtents() +
                     Vector(m_ExtentsFatten, m_ExtentsFatten, m_ExtentsFatten);
    m_BoundOffset = pMesh->m_AABB.GetCenter() - pTransform->GetLocation();
  } else if (EventName == sSetIsFrobbable) {
    STATIC_HASHED_STRING(IsFrobbable);
    m_IsFrobbable = Event.GetBool(sIsFrobbable);
  } else if (EventName == sBecomeFrobbable) {
    m_IsFrobbable = true;
  } else if (EventName == sBecomeNonFrobbable) {
    m_IsFrobbable = false;
  } else if (EventName == sSetHoldReleaseMode) {
    const bool WasHoldReleaseMode = m_HoldReleaseMode;

    STATIC_HASHED_STRING(HoldReleaseMode);
    m_HoldReleaseMode = Event.GetBool(sHoldReleaseMode);

    if (m_HoldReleaseMode && !WasHoldReleaseMode) {
      m_HandleHoldRelease = false;
    }

    if (GetIsFrobTarget()) {
      PublishToHUD();
    }
  } else if (EventName == sSetFriendlyName) {
    STATIC_HASHED_STRING(FriendlyName);
    m_FriendlyName = Event.GetString(sFriendlyName);

    if (GetIsFrobTarget()) {
      PublishToHUD();
    }
  } else if (EventName == sSetFrobVerb) {
    STATIC_HASHED_STRING(FrobVerb);
    m_FrobVerb = Event.GetString(sFrobVerb);

    if (GetIsFrobTarget()) {
      PublishToHUD();
    }
  } else if (EventName == sSetBoundExtents) {
    STATIC_HASHED_STRING(BoundExtents);
    m_BoundExtents = Event.GetVector(sBoundExtents);
  } else if (EventName == sSetBoundOffsetZ) {
    STATIC_HASHED_STRING(BoundOffsetZ);
    m_BoundOffset.z = Event.GetFloat(sBoundOffsetZ);
  }
}