View Events

O sistema de View Events permite que scripts reajam quando jogadores olham para outros jogadores, entidades ou blocos. Utiliza ray casting para detecção precisa da linha de visão.

Visão Geral

View events usam ray casting periódico para detectar o que os jogadores estão olhando. Existem três tipos de eventos:

  • view - Dispara continuamente enquanto olha algo
  • focus - Dispara uma vez quando começa a olhar
  • unfocus - Dispara uma vez quando para de olhar

Sintaxe

View Events (Contínuo)

on view player:
    # Dispara a cada verificação enquanto olha outro jogador
    send action bar "&eLooking at: %target player%" to player

on view entity:
    # Dispara enquanto olha qualquer entidade (incluindo players)
    send action bar "&eEntity: %target type%" to player

on view block:
    # Dispara enquanto olha um bloco
    send action bar "&eBlock: %target block%" to player

on view any:
    # Dispara enquanto olha qualquer coisa
    send action bar "&eDistance: %view distance%m" to player

Focus Events (Começar a Olhar)

on focus player:
    # Dispara quando começa a olhar outro jogador
    send "&aYou are now looking at %target player%!" to player

on focus entity:
    # Dispara quando começa a olhar qualquer entidade
    play sound "random.click" to player

on focus block:
    # Dispara quando começa a olhar um bloco
    set {looking-at} to target block

Unfocus Events (Parar de Olhar)

on unfocus player:
    # Dispara quando desvia o olhar de um jogador
    send "&7You looked away from %target player%" to player

on unfocus entity:
    # Dispara quando desvia de qualquer entidade
    log "%player% stopped looking at entity"

on unfocus block:
    # Dispara quando desvia de um bloco
    clear {looking-at}

Aliases

on look at player:
    # Mesmo que "on view player:"

on start looking at player:
    # Mesmo que "on focus player:"

on stop looking at player:
    # Mesmo que "on unfocus player:"

Dados Disponíveis

ExpressãoTipoDescrição
player / viewerPlayerO jogador que está olhando
targetViewTargetObjeto target completo
target typeStringTipo: "player", "entity", "block", "none"
target nameStringNome/descrição do target
distance / view distanceFloatDistância até o target em blocos
target playerPlayerO jogador sendo olhado (se type é player)
target entityEntityA entidade sendo olhada (se type é entity)
target blockBlockO bloco sendo olhado (se type é block)

Exemplos Práticos

Sistema de Highlight de Player

on focus player:
    set {highlighted.%player%} to target player
    send "&aYou are now targeting %target player%!" to player

on unfocus player:
    if {highlighted.%player%} is set:
        send "&7No longer targeting %{highlighted.%player%}%" to player
        delete {highlighted.%player%}

Combat Lock-On

on focus entity:
    if target entity is not player:
        set {combat-target.%player%} to target entity
        send "&cLocked onto: %target name%!" to player

on unfocus entity:
    if {combat-target.%player%} is set:
        send "&7Target lost" to player
        delete {combat-target.%player%}

Sistema Anti-Stare

# Rastreia quanto tempo jogadores olham uns para os outros
on view player:
    add 1 to {stare-time.%player%.%target player%}
    
    if {stare-time.%player%.%target player%} >= 100:
        send "&c%player% has been staring at you!" to target player
        set {stare-time.%player%.%target player%} to 0

on unfocus player:
    set {stare-time.%player%.%target player%} to 0

Configuração

Configure o sistema de view em config.yml:

# Distância máxima para detecção (em blocos)
view-max-distance: 100.0

# Intervalo de verificação em ticks (20 ticks = 1 segundo)
# Valores menores = mais responsivo mas maior uso de CPU
view-check-interval: 5  # 4 vezes por segundo

Considerações de Performance

  • Intervalo de verificação - O padrão é 5 ticks (4x por segundo). Aumente se tiver muitos jogadores
  • Distância máxima - Distâncias menores = ray casting mais rápido
  • Tipos de target - Use tipos específicos (player, block) ao invés de any quando possível
  • Tipo de evento - Use focus/unfocus ao invés de view quando só precisa de mudanças de estado

Detalhes Técnicos

  • A detecção de view usa ray casting a partir da posição dos olhos do jogador
  • Detecção de entidades usa interseção de bounding box com o raio
  • Detecção de blocos usa VoxelRayTrace do PocketMine
  • O sistema mantém cache do último target por jogador para detectar mudanças de focus
  • Eventos view disparam a cada intervalo de verificação enquanto olha targets válidos
  • Eventos focus/unfocus só disparam em mudanças de estado