Minimapを制御するために〜Gathererの解析〜 †Gatherer.xml †AddOn.xml用の定型文 †<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> Scriptファイルの指定 †<Script file="localization.lua"/> <Script file="GatherIcons.lua"/> <Script file="Gatherer.lua"/> GathererUIの設定 †<Frame name="Gatherer" parent="UIParent"> <!--name:UIの名前--> <!--parent:親UIの名前(UIParentは全てのUIの親)--> <Size> <!--UIのサイズ:0×0--> <AbsDimension x="0" y="0"/> </Size> <Scripts> <!--それぞれの割り込みタイミングで呼び出されるスクリプト--> <OnLoad> <!--ロードされたとき--> Gatherer_OnLoad(); </OnLoad> <OnEvent> <!--イベント(?)が発生したとき--> Gatherer_OnEvent(event); </OnEvent> <OnUpdate> <!--アップデート(?)が発生したとき--> Gatherer_TimeCheck(arg1); </OnUpdate> </Scripts> </Frame> GatherNoteTemplate?の設定 †収集したものに関する情報を記述するGatherNote?のテンプレート <Button name="GatherNoteTemplate" hidden="true" virtual="true">
<!--ButtonタイプのUI-->
<!--hidden:隠すかどうか-->
<!--virtual:C++のvirtual修飾子と同じか?-->
<Size>
<!--UIのサイズ:12×12-->
<AbsDimension x="12" y="12"/>
</Size>
<Anchors>
<!--アンカーの設定…アンカーって?-->
<Anchor point="CENTER" relativeTo="MinimapBackdrop" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="-51" y="60"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
this:RegisterEvent("VARIABLES_LOADED");
this:SetFrameLevel(this:GetFrameLevel() + 1);
</OnLoad>
<OnEvent>
Gatherer_OnEvent(event);
</OnEvent>
<OnEnter>
<!--カーソルが入ったときの処理-->
GameTooltip:SetOwner(this, "ANCHOR_BOTTOMLEFT");
local name, count, dist = Gatherer_MakeName(this:GetID())
GameTooltip:SetText(name, 1.0, 0.82, 0.0, 1,1);
GameTooltip:AddLine("Count: "..count, 0.82, 1.0, 0.0);
GameTooltip:AddLine(dist.." units ("..(dist*4).." secs)", 0.0, 0.82, 1.0);
GameTooltip:Show();
</OnEnter>
<OnLeave>
<!--カーソルが離れたときの処理-->
GameTooltip:Hide();
</OnLeave>
<OnMouseUp>
Gatherer_OnClick();
</OnMouseUp>
</Scripts>
<NormalTexture name="$parentTexture" file="Interface\AddOns\Gatherer\IconGatherTest"/>
<!--NormalTextureの設定…デフォルトのテクスチャーのことだろうか?-->
</Button>
各種GatherNote?の設定 †GatherNoteTemplate?を継承しGatherNote?を設定する <Button name="GatherNote1" inherits="GatherNoteTemplate" id="1" hidden="false" parent="Minimap" toplevel="true">
<!--Minimapを親UIとするButtonタイプのUI。表示場所=toplevelという意味か?-->
<Scripts>
<OnUpdate>
Gatherer_OnUpdate(arg1);
</OnUpdate>
<OnLoad>
this:RegisterEvent("MINIMAP_UPDATE_ZOOM");
this:RegisterEvent("VARIABLES_LOADED");
</OnLoad>
</Scripts>
</Button>
<!--以下その他のGatherNoteの設定-->
<Button name="GatherNote2" inherits="GatherNoteTemplate" id="2" hidden="false" parent="Minimap" toplevel="true"/>
:
:
:
<Button name="GatherNote25" inherits="GatherNoteTemplate" id="25" hidden="false" parent="Minimap" toplevel="true"/>
GatherMainTemplate?の設定 †Mainmap上での収集物の場所を表示するためのGatherMain?のテンプレート <Button name="GatherMainTemplate" hidden="true" virtual="true"> <Size> <AbsDimension x="12" y="12"/> </Size> <Anchors> <Anchor point="CENTER"/> </Anchors> <Scripts> <OnEnter> local x, y = this:GetCenter(); local parentX, parentY = this:GetParent():GetCenter(); if ( x > parentX ) then WorldMapTooltip:SetOwner(this, "ANCHOR_LEFT"); else WorldMapTooltip:SetOwner(this, "ANCHOR_RIGHT"); end WorldMapTooltip:SetText(this.toolTip); WorldMapTooltip:Show(); </OnEnter> <OnLeave> WorldMapTooltip:Hide(); </OnLeave> </Scripts> <NormalTexture name="$parentTexture" file="Interface\AddOns\Gatherer\IconGatherTest"/> </Button> 各種GatherMain?の設定 †GatherMainTemplate?を継承しGatherMain?を設定する <Button name="GatherMain1000" inherits="GatherMainTemplate" id="1000" parent="WorldMapDetailFrame" toplevel="true"/> <!--WorldMapDetailFrameを親UIとするButtonタイプのUI--> : : : <Button name="GatherMain1500" inherits="GatherMainTemplate" id="1500" parent="WorldMapDetailFrame" toplevel="true"/> </Ui> Gatherer.lua †イベントへの登録 †function Gatherer_OnLoad()
this:RegisterEvent("CHAT_MSG_SPELL_SELF_BUFF");
this:RegisterEvent("UNIT_NAME_UPDATE");
this:RegisterEvent("WORLD_MAP_UPDATE");
this:RegisterEvent("CLOSE_WORLD_MAP");
-- event added for impossible to gather item
this:RegisterEvent("UI_ERROR_MESSAGE");
イベントの処理 †Gatherer_OnEvent(event)
1.CHAT_MSGを含む→Gatherer_ReadBuffにイベントを送る
2.UI_ERROR_MESSAGEを含む→…
3.MINIMAP_UPDATE_ZOOM→GatherMap_InCityにisMinimapInCity()の値を代入
4.WORLD_MAP_UPDATE→
WorldMapFrameのVisibleがON→
mapMinderがTrue、Gatherer_MapOpenがFalse→
Gatherer_CloseMapがnilではなく、最後にMapを閉じてからminderTime以内→
startContinentとstartZoneをGatherer_CloseMapから取得
Gatherer_CloseMapがnil もしくは最後にMapを閉じてからminderTimeを経過→
startContinentとstartZoneをGatherer_GetCurrentZone()から取得
Gatherer_MapOpen = true;
SetMapZoom(startContinent, startZone);
Gatherer_MapOpen = true;
現在地をmapContinent, mapZoneに設定
Gatherer_CloseMapに状態を設定
= { continent = mapContinent, zone = mapZone, time = GetTime() };
GatherMain_Draw();
WorldMapFrameのVisibleがOFFだけどGatherer_MapOpenがTrue→
Gatherer_MapOpen = false;
GatherMain_Draw();
Gatherer_ChangeMap();
5.CLOSE_WORLD_MAP→
Gatherer_MapOpen = false;
GatherMain_Draw();
Gatherer_ChangeMap()
6.VARIABLES_LOADED→
:
:
function Gatherer_PlayerPos?(forced) † currentZoneNameにGetZoneText()で現在のZoneを設定
もしそれがGather_LastZoneと異なる→
forced = true;
Gather_LastZoneにはcurrentZoneNameを設定
もしforcedならGatherer_ChangeMap()を処理
px, pyにGetPlayerMapPosition("player")で現在地を取得
px,pyどちらも0 で forcedではない時に…
Gatherer_ChangeMap()がTrue(Mapが変わった?)→
px, pyをGetPlayerMapPosition("player")によって再取得
Gatherer_ChangeMap()がFalse(Mapが変わってない?)→
px, pyともに0
(forcedなら0,0だろうが気にせずに現在地として返す)
px, py の値を返す
function Gatherer_ChangeMap?() † mapContinent, mapZoneに現在地を設定
まずminderCurZoneはfalseで
Gatherer_CloseMapがnilでなく、Gatherer_CloseMapとGatherer_LastZoneで場所が変わってない→
minderCurZoneをtrueに
playerの現在の大陸、ゾーンを取得
その位置をGatherer_LastZoneに設定
どっちかが0なら変化なしとしてreturn
playerの現在地とmapの現在地が同じならtrueをreturn
SetMapZoom(playerContinent, playerZone);
lastTimeを0で初期化
Gatherer_CloseMapがnilではなく、Gatherer_CloseMap.timeもnilではない→
lastTime = Gatherer_CloseMap.time;
minderCurZoneがtrue(Gatherer_CloseMapとGatherer_LastZoneで場所が変わってない)→
Gatherer_MapOpen = false;
Gatherer_CloseMap = { continent = playerContinent, zone = playerZone, time = lastTime };
Gatherer_OnEvent("WORLD_MAP_UPDATE");
trueを返して終了
|