1"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7460],{7228:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/T_OnInteractionUpdatedWithStageTagEvent-c1ab10013ba494b53bebf9920d08874d.png"},11889:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/T_StageGameplayInteractableComponentDetails-b6eaf9ad0b5eecb0eda9003c24755299.png"},14877:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/T_IndicationEditCondition-c2ec795810fcdaca3470113f146f8ab7.png"},16700:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/T_LocalIndicationStageInteractor-cf431d9302466bd5c923537aae7326ad.png"},23873:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/T_PlayerIndicationIndicationChanged-56f03e177eddba1eaf81ffd89e612d04.png"},28453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>o});var a=n(96540);const i={},s=a.createContext(i);function r(e){const t=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(s.Provider,{value:t},e.children)}},43418:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/T_StageUpdateDelegatesView-49c1fb7868c0ab660208b8ecedb25d4a.png"},54672:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/T_InteractionStageOnChestExample-d856179c03ddc021ffb473bd1af83342.png"},77501:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"Staged-Interaction-System/Setup","title":"Setup","description":"Quick start https://dev.epicgames.com/documentation/en-us/unreal-engine/plugins-in-unreal-engine.","source":"@site/docs/Staged-Interaction-System/Setup.md","sourceDirName":"Staged-Interaction-System","slug":"/Staged-Interaction-System/Setup","permalink":"/docs/Staged-Interaction-System/Setup","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/docs/Staged-Interaction-System/Overview"},"next":{"title":"Using Stage Interaction","permalink":"/docs/Staged-Interaction-System/UsingStageInteraction"}}');var i=n(74848),s=n(28453);const r={sidebar_position:2},o="Setup",l={},c=[{value:"Core Concepts",id:"core-concepts",level:2},{value:"How it Works?",id:"how-it-works",level:2},{value:"Why use Stages?",id:"why-use-stages",level:2},{value:"Setting up Interactables",id:"setting-up-interactables",level:2},{value:"Event Delegates",id:"event-delegates",level:3},{value:"On Player Gameplay Interaction Stage Changed",id:"on-player-gameplay-interaction-stage-changed",level:4},{value:"On Player Indication Indication Changed",id:"on-player-indication-indication-changed",level:4},{value:"Conditions (Optional)",id:"conditions-optional",level:3},{value:"Gameplay Stage Edit Condition",id:"gameplay-stage-edit-condition",level:4},{value:"Indication Stage Edit Condition",id:"indication-stage-edit-condition",level:4},{value:"Seting up Your Interactors (Optional)",id:"seting-up-your-interactors-optional",level:2},{value:"Gameplay Stage Interactor",id:"gameplay-stage-interactor",level:3},{value:"Local Indication Stage Interactor Subsystem",id:"local-indication-stage-interactor-subsystem",level:3},{value:"Creating Gameplay Tags For Stages",id:"creating-gameplay-tags-for-stages",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",hr:"hr",img:"img",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"setup",children:"Setup"})}),"\n",(0,i.jsxs)(t.p,{children:["Quick start: install the plugin normally (Marketplace, ZIP, or source). If you need help installing plugins, see the official Unreal docs: ",(0,i.jsx)(t.a,{href:"https://dev.epicgames.com/documentation/en-us/unreal-engine/plugins-in-unreal-engine",children:"https://dev.epicgames.com/documentation/en-us/unreal-engine/plugins-in-unreal-engine"}),"."]}),"\n",(0,i.jsxs)(t.admonition,{type:"tip",children:[(0,i.jsx)(t.mdxAdmonitionTitle,{children:(0,i.jsx)(t.strong,{children:"Before you start"})}),(0,i.jsx)(t.p,{children:"Read this short overview so you understand the main concepts: Interactors, Interactables, and Stages."})]}),"\n",(0,i.jsx)(t.h2,{id:"core-concepts",children:"Core Concepts"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Interactors"})," \u2014 controller-related actors that perform interactions (for example: Player State for gameplay stages, or the Local Player controller for indication stages). They track who interacted with what. (Note that AI's can have ",(0,i.jsx)(t.em,{children:"Player State"}),"s too!)"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Interactables"})," \u2014 actors that contain the ",(0,i.jsx)(t.strong,{children:"StageGameplayInteractable"})," component. These actors receive stage changes and run the interaction logic."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Stage (Interaction Stage)"})," \u2014 a named interaction step (e.g., hover, overlap, open door). Stages are represented by Gameplay Tags so you can customize them per project."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"how-it-works",children:"How it Works?"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsx)(t.li,{children:"Define stages as Gameplay Tags."}),"\n",(0,i.jsx)(t.li,{children:"Add stage tags to Interactables when those interaction states are valid."}),"\n",(0,i.jsx)(t.li,{children:"Interactors read and act on the Interactable's current stages. (They have the full picture of interactions)"}),"\n",(0,i.jsx)(t.li,{children:"The system stores interaction results per Interactor so each player/AI has an independent view of the interaction state."}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"why-use-stages",children:"Why use Stages?"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Clear separation between visual indication (hover/outline) and gameplay logic (open/activate)."}),"\n",(0,i.jsx)(t.li,{children:"Supports multi-user scenarios and prevents conflicts when several actors try to interact with the same object."}),"\n",(0,i.jsx)(t.li,{children:"Fully customizable \u2014 use Blueprints, State Trees, or C++."}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"InteractionStageOnChestExample",src:n(54672).A+"",width:"1012",height:"845"})}),"\n",(0,i.jsxs)(t.admonition,{type:"tip",children:[(0,i.jsx)(t.mdxAdmonitionTitle,{children:(0,i.jsx)(t.strong,{children:"Gameplay & Indication Stage Difference"})}),(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Gameplay Stages"})," are the stages that effect the gameplay. They are replicated and will be the same across all players. Such as ",(0,i.jsx)(t.em,{children:"Openning A Door"}),", ",(0,i.jsx)(t.em,{children:"Activating a Lift"})," etc."]}),(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Indication Stages"})," are the local stages that are generally responsible of visual effects. Such as ",(0,i.jsx)(t.em,{children:"creating an outline whenever an item gets hovered"}),", or ",(0,i.jsx)(t.em,{children:'display a widget that says "Press E to Interact"'})," etc. Every local player has their own ",(0,i.jsx)(t.em,{children:"Indication Stage"})," for the same actor."]})]}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsx)(t.h2,{id:"setting-up-interactables",children:"Setting up Interactables"}),"\n",(0,i.jsxs)(t.p,{children:["Add the ",(0,i.jsx)(t.strong,{children:"StageGameplayInteractable"}
1)," component to any actor your pawns should interact with (C++ or Blueprints)."]}),"\n",(0,i.jsx)(t.p,{children:"Steps:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsx)(t.li,{children:"Select the actor in the editor."}),"\n",(0,i.jsxs)(t.li,{children:["Add the ",(0,i.jsx)(t.code,{children:"StageGameplayInteractable"})," component."]}),"\n",(0,i.jsx)(t.li,{children:"Configure initial stages (optional) and any component properties."}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Stage Gameplay Interactable Component Details",src:n(11889).A+"",width:"1402",height:"529"})}),"\n",(0,i.jsxs)(t.p,{children:["In The ",(0,i.jsx)(t.em,{children:"Details"})," view we have few properties for this component. These are displayed under ",(0,i.jsx)(t.em,{children:"Interaction"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"event-delegates",children:"Event Delegates"}),"\n",(0,i.jsxs)(t.p,{children:["In the details panel of ",(0,i.jsx)(t.em,{children:"Stage Gameplay Interactable"})," there are events that will fire whenever the ",(0,i.jsx)(t.em,{children:"interaction stages"})," gets updated."]}),"\n",(0,i.jsxs)(t.p,{children:["You ",(0,i.jsx)(t.em,{children:"can"})," use this event on blueprints to handle your interaction results. But a better approach will be shown in the following pages."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"StageUpdateDelegatesView",src:n(43418).A+"",width:"687",height:"142"})}),"\n",(0,i.jsx)(t.h4,{id:"on-player-gameplay-interaction-stage-changed",children:"On Player Gameplay Interaction Stage Changed"}),"\n",(0,i.jsxs)(t.p,{children:["Whenever a ",(0,i.jsx)(t.em,{children:"Gameplay Interaction"})," is updated (on all machines (server or clients)), this delegate will fire. This delegate will carry the information about the update."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"StageGameplayInteractionChangedEvent",src:n(80935).A+"",width:"704",height:"212"})}),"\n",(0,i.jsx)(t.h4,{id:"on-player-indication-indication-changed",children:"On Player Indication Indication Changed"}),"\n",(0,i.jsxs)(t.p,{children:["Whenever a ",(0,i.jsx)(t.em,{children:"Indication"})," stage gets updated this event will fire on the local machine. This delegate will carry the information about the update."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"OnPlayerIndicationIndicationChanged",src:n(23873).A+"",width:"572",height:"164"})}),"\n",(0,i.jsx)(t.h3,{id:"conditions-optional",children:"Conditions (Optional)"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.em,{children:"Conditions"})," for the Interactable objects, controls wheather a ",(0,i.jsx)(t.em,{children:"Stage"})," can ",(0,i.jsx)(t.em,{children:"enter"})," or ",(0,i.jsx)(t.em,{children:"exit"}),". These are classes that are blueprintable. So you can create your own conditions for your specific needs."]}),"\n",(0,i.jsxs)(t.p,{children:["Then in the details panel of your ",(0,i.jsx)(t.em,{children:"Stage Gameplay Interactable"})," you can add and customize its variables."]}),"\n",(0,i.jsxs)(t.p,{children:["You can use the ",(0,i.jsx)(t.em,{children:"Create Blueprints Class"})," to create them."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"StageEditConditionCreation",src:n(84560).A+"",width:"621",height:"715"})}),"\n",(0,i.jsx)(t.h4,{id:"gameplay-stage-edit-condition",children:"Gameplay Stage Edit Condition"}),"\n",(0,i.jsxs)(t.p,{children:["Controls wheather a ",(0,i.jsx)(t.em,{children:"Gameplay Stage"})," can enter or exit."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"StagedGamepalyStageInteractableCondition",src:n(89004).A+"",width:"1041",height:"380"})}),"\n",(0,i.jsxs)(t.p,{children:["When you ",(0,i.jsx)(t.em,{children:"override"})," the ",(0,i.jsx)(t.em,{children:"CanEditInteractionStages"})," function on the created class you can now create your own condition logic."]}),"\n",(0,i.jsx)(t.p,{children:"Below is a concise description of the function parameters and the expected return value. Use this table when documenting or implementing custom edit conditions."}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Parameter"}),(0,i.jsx)(t.th,{children:"Type"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"PlayerState"})}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"APlayerState*"})}),(0,i.jsx)(t.td,{children:"The player state of the player attempting to edit the interaction stages. Use this to check player-specific permissions, tags or state."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"StageTagToEdit"})}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"const FGameplayTag&"})}),(0,i.jsxs)(t.td,{children:["The Gameplay Tag that identifies the stage being added or removed (for example ",(0,i.jsx)(t.code,{children:"Gameplay.Stage.Interact"}),")."]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"bIsAddingStage"})}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"bool"})}),(0,i.jsxs)(t.td,{children:[(0,i.jsx)(t.code,{children:"true"})," when the stage is being added; ",(0,i.jsx)(t.code,{children:"false"})," when the stage is being removed. Use this to apply different rules for enter vs exit."]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"OutOptionalResultData"})}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"FStageEditResultCosmeticData&"})}),(0,i.jsxs)(t.td,{children:["Output parameter. Provide optional cosmetic data (instanced ",(0,i.jsx)(t.code,{children:"UStageEditResultCosmeticDataBase"}),") to communicate a visual result or reason back to the caller (for example a deny tooltip or animation). Leave ",(0,i.jsx)(t.code,{children:"Data"})," null if no cosmetic feedback is needed."]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"ParentInteractable"})}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"const UStageGameplayInteractable*"})}),(0,i.jsx)(t.td,{children:"The interactable object being edited. Use it to inspect the current stages, tags, or component properties for conditional logic."})]})]})]}),"\n",(0,i.jsx)(t.p,{children:"Return value:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["The function returns a ",(0,i.jsx)(t.code,{children:"bool"}),": ",(0,i.jsx)(t.code,{children:"true"})," to allow the edit (add/remove the stage), or ",(0,i.jsx)(t.code,{children:"false"})," to prevent it."]}),"\n"]}),"\n",(0,i.jsx)(t.h4,{id:"indication-stage-edit-condition",children:"Indication Stage Edit Condition"}),"\n",(0,i.jsxs)(t.p,{children:["It works the same as the ",(0,i.jsx)(t.em,{children:"Gameplay Stage Edit Condition"}),". But it handles ",(0,i.jsx)(t.em,{children:"Indication Stages"})," and uses the ",(0,i.jsx)(t.a,{href:"https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/ULocalPlayer",children:"Local Player"})," instead of the ",(0,i.jsx)(t.a,{href:"https://dev.epicgames.com/documentation/en-us/unreal-engine/python-api/class/PlayerState?application_version=5.0",children:"Player State"}),"."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Indication Stage Edit Condition",src:n(14877).A+"",width:"600",height:"207"})}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsx)(t.h2,{id:"seting-up-your-interactors-optional",children:"Seting up Your Interactors (Optional)"}),"\n",(0,i.jsx)(t.p,{children:"By default you actually don't need to do anything to set up your interactors. Interactin system will work. But if you want to get the updates from your interactors too, you can. So that you can follow your interacted objects in your interactors."}),"\n",(0,i.jsxs)(t.admonition,{type:"note",children:[(0,i.jsx)(t.mdxAdmonitionTitle,{children:(0,i.jsx)(t.strong,{children:"Using Player States on your AI's"})}),(0,i.jsxs)(t.p,{children:["This is a good part to mention this. By default your AI's won't get any ",(0,i.jsx)(t.em,{children:"Player State"})," for them. But unreal has an option to enable ",(0,i.jsx)(t.em,{children:"Player States"})," per AI. This is nececarry if you want your AI's to interact with actors just like the players."]}),(0,i.jsx)(t.p,{children:"To enable that feature:"}),(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Open up your ",(0,i.jsx)(t.a,{href:"https://dev.epicgames.com/documentation/en-us/unreal-engine/ai-controllers-in-unreal-engine",children:"AI Controller"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["In the details panel set ",(0,i.jsx)(t.em,{children:"Wants Player State"})," boolean to true."]}),"\n"]}),"\n"]}),(0,i.jsxs)(t.p,{children:["This way you can get their ",(0,i.jsx)(t.em,{children:"Player State"}
1)," but just getting the variable called ",(0,i.jsx)(t.em,{children:"Player State"})," on your controllers, so that you can input the correct ",(0,i.jsx)(t.em,{children:"Player State"})," whenever your AI wants to interact with an actor."]})]}),"\n",(0,i.jsx)(t.h3,{id:"gameplay-stage-interactor",children:"Gameplay Stage Interactor"}),"\n",(0,i.jsxs)(t.p,{children:["Open up your ",(0,i.jsx)(t.strong,{children:"Player State"})," class and add this component called ",(0,i.jsx)(t.strong,{children:"Gameplay Stage Interactor"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["With that component attached, you can get the event called ",(0,i.jsx)(t.strong,{children:"On Interaction Updated With Stage Tag"}),". So whenever that player state interacts with an actor, this event will fire."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"OnInteractionUpdatedWithStageTag",src:n(7228).A+"",width:"1057",height:"212"})}),"\n",(0,i.jsx)(t.h3,{id:"local-indication-stage-interactor-subsystem",children:"Local Indication Stage Interactor Subsystem"}),"\n",(0,i.jsxs)(t.p,{children:["This is a ",(0,i.jsx)(t.a,{href:"https://dev.epicgames.com/documentation/en-us/unreal-engine/programming-subsystems-in-unreal-engine",children:"Local Subsystem"})," that is linked to your ",(0,i.jsx)(t.em,{children:"Local Player"}),". So whenever a stage gets updated on that ",(0,i.jsx)(t.em,{children:"Local Player"})," this subsystem will know that and fire ",(0,i.jsx)(t.em,{children:"On Indication Stage Updated With Stage Tag Event"})," Delegate. You don't have to do anything do enable this. This is system is already enabled, but if you want to keep track of your locally interacted actors, this is how you do it."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"LocalStagedIndicatorSubsystem",src:n(16700).A+"",width:"509",height:"308"})}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsx)(t.h2,{id:"creating-gameplay-tags-for-stages",children:"Creating Gameplay Tags For Stages"}),"\n",(0,i.jsx)(t.p,{children:"[Gameplay Tags] are used to create our custom interaction stages. This part will change project to project. So you are free to create your gameplay tags as you want. But there is a parent tags group that is defined natively for our interactions for editing our gameplay tags easier in our data views in editor."}),"\n",(0,i.jsx)(t.p,{children:"These are:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Interaction.Gameplay"})," for gameplay stages."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Interaction.Indicator"})," for indication stages."]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.em,{children:"example:"})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Gameplay Tag Example View",src:n(97244).A+"",width:"793",height:"130"})}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsx)(t.p,{children:"That is it for the setup. Let's look at how to we can interact!"})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},80935:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/T_PlayerGameplayInteractionStageChangedEvent-b19a036b46c1621724f3df2072d47009.png"},84560:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/T_StageEditConditionCreation-ab1c0170f9621012722b12ef89db3e62.png"},89004:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/T_GameplayStageInteractableCond-be2656684c1f5f15ef7a345a308f451c.png"},97244:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/T_GameplayTagExample-1c8accc00a144fcc8e96094d3b2acbf5.png"}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.