c# pdf viewer open source : How to move pages in a pdf document SDK Library service wpf .net winforms dnn World%20of%20Warcraft%20Programming%20(2nd%20Edition)31-part1829

Chapter 14
Tracking Damage with CombatTracker 269
UNIT_COMBAT
Several events deal with the player sustaining damage, but you will be using
the
UNIT_COMBAT
event. Anytime a unit the player is interested in (such as
party members, raid members and their targets, and so on) has a change in
hit points that relates to combat, this event fires with the following arguments
describing the change:
unit
—The identifier for the unit that experienced the change.
action
—Thetype of combataction thathappened.Someexample values
are the strings
HEAL
,
DODGE
,
BLOCK
,
WOUND
,
MISS
,
PARRY
,and
RESIST
.
modifier
—If the action was a combat attack, it could possibly be a
glancing hit,critical hit, orcrushing blow. Example values are the strings
GLANCING
,
CRUSHING
,and
CRITICAL
.
damage
—The amount of damage sustained, or the amount of health
healed.
damagetype
—The type ofdamage thatoccurred, using one of the follow-
ing number values:
0—physical damage
1—holy damage
2—fire damage
3—nature damage
4—frost damage
5—shadow damage
6—arcane damage
Creating the Addon’s Skeleton
Although the entire CombatTracker addon (and most addons, actually) could
be written in just a single Lua file or a single XML file, this implementation
will separate the design and layout of the frames from the code that defines
the addon’s behavior. Create your addon skeleton:
1. In yourAddOns directory, createa newdirectory called CombatTracker.
2. In this new directory create a file called
CombatTracker.toc
,with the
following content:
How to move pages in a pdf document - re-order PDF pages in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support Customizing Page Order of PDF Document in C# Project
reorder pages of pdf; change page order pdf reader
How to move pages in a pdf document - VB.NET PDF Page Move Library: re-order PDF pages in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Sort PDF Document Pages Using VB.NET Demo Code
moving pages in pdf; reorder pages in pdf reader
270
Part II
Programming in World of Warcraft
## Interface: 30200
## Title: CombatTracker
## Notes: Tracks incoming DPS, and how long you spend in combat
CombatTracker.lua
CombatTracker.xml
3. Create an empty file called
CombatTracker.xml
,which will be used to
create the frames.
4. Create an empty file called
CombatTracker.lua
,which will be used to
define the addon’s behavior.
If you exit the game and open the WoW client backup, you should see
CombatTracker listed in the AddOn List along with the description,as shown
in Figure 14-1.
Figure 14-1: CombatTracker in the AddOn List
Defining CombatTracker’s XML Frame
Begin by adding the
<Ui>
element to
CombatTracker.xml
.Remember, this
should be the outermost element of every XML file:
<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/
http://wowprogramming.com/FrameXML/UI.xsd“>
</Ui>
Next, add the definition for the main frame. Following the specifications,
this frame needs to be clickable, so it will use the
Button
widget type. Add the
following code inside the
<Ui>
element:
<Button name=“CombatTrackerFrame“ parent=“UIParent“ enableMouse=“true“ i
movable=“true“ frameStrata=“LOW“>
<Size x=“175“ y=“40“/>
<Anchors>
<Anchor point=“TOP“ relativePoint=“BOTTOM“ relativeTo=“Minimap“>
<Offset x=“0“ y=“-10“/>
</Anchor>
</Anchors>
</Button>
C# TIFF: How to Reorder, Rearrange & Sort TIFF Pages Using C# Code
Reorder, Rearrange and Sort TIFF Document Pages in C#.NET Application. this C#.NET Tiff image management library, you can easily change and move the position of
pdf reverse page order online; how to move pages around in pdf file
C# Word - Sort Word Pages Order in C#.NET
adjust the order of all or several Word document pages, or just page inserting, Word page deleting and Word document splitting C# DLLs: Move Word Page Position.
reorder pages in pdf document; how to reverse pages in pdf
Chapter 14
Tracking Damage with CombatTracker 271
This code defines a new
Button
called
CombatTrackerFrame
and defines its
size and placement along with some attributes:
name
—Declares a name for the frame. When the frame is created, the
global variable with this name will be set to the createdframe so it can be
referred to in other code.
parent
—Defines the parent of a frame, used by the UI system to decide
the scale, opacity, and visibility of a frame. Frame parents are discussed
further in Chapter 10.
enableMouse
—Enables mouse input for the frame, allowing you to click
it and register for drag events.
movable
—Tells the user’s interface that this frame is movable. This is
simply an on/off switch; you will have to write the code to actually
accomplish the movement on your own.
frameStrata
—Frames intheuserinterfacecanbelayeredsosomeframes
appearaboveorbelow others. Thevalueof this attribute tells the UI what
strata the frame should be drawn on.
The default placement of the frame will be just below the minimap, but the
user can move it to a more desirable location.
Next give the frame some visible elements, so it can be seen on screen.
For this, you will use a special type of texture called a backdrop to provide a
background and border for the frame.
Defining a Backdrop
Abackdrop is a special way to define a background for a frame. They consist
of background files (which are, shockingly, used for the background of the
frame) and edge files (which are used to place a border around the frame).
Add the following backdrop definition within the
<Button>
element, but after
the
</Anchors>
tag:
<Backdrop bgFile=“Interface\DialogFrame\UI-DialogBox-Background“ i
edgeFile=“Interface\DialogFrame\UI-DialogBox-Border“ tile=“true“>
<BackgroundInsets>
<AbsInset left=“11“ right=“12“ top=“12“ bottom=“11“/>
</BackgroundInsets>
<TileSize>
<AbsValue val=“32“/>
</TileSize>
<EdgeSize>
<AbsValue val=“32“/>
</EdgeSize>
</Backdrop>
C# PowerPoint - Sort PowerPoint Pages Order in C#.NET
the order of all or several PowerPoint document pages, or just PowerPoint page deleting and PowerPoint document splitting C# DLLs: Move PowerPoint Page Position.
reorder pages pdf file; switch page order pdf
C# PDF File & Page Process Library SDK for C#.net, ASP.NET, MVC
RasterEdge XDoc.PDF allows you to easily move PDF document pages position, including sorting pages and swapping two pages. Copying and Pasting Pages.
reorder pdf pages; pdf reorder pages online
272
Part II
Programming in World of Warcraft
This sets up the frame to use the same background and border textures
as the default dialog box (the frame that pops up when you’re looting a
bind-on-pickupitem).Ifyou’re setting thebackdropusingLua insteadofXML,
you’ll need to call the
SetBackdrop()
method, passing in a table definition
with the same information:
frame:SetBackdrop({
bgFile = “Interface\\DialogFrame\\UI-DialogBox-Background“,
edgeFile = “Interface\\DialogFrame\\UI-DialogBox-Border“,
tile = true,
tileSize = 32,
edgeSize = 32,
insets = {
left = 11,
right = 12,
top = 12,
bottom = 11,
}
})
Adding a Font String
Now that your frame has a background and border, you need to add a line of
text to display the combat information. Include the following code within the
<Button>
after the
</Backdrop>
tag:
<Layers>
<Layer level=“OVERLAY“>
<FontString name=“$parentText“ inherits=“GameFontNormalSmall“ i
justifyH=“CENTER“ setAllPoints=“true“ text=“CombatTracker“/>
</Layer>
</Layers>
The code snippet defines a new graphical layer (at the
OVERLAY
level) and
creates a new
FontString
.
This completes the visual definition of the frame, so save the XML file and
log in to the game to see how it looks.
Testing CombatTrackerFrame
Before getting much further into the addon, log in to World of Warcraft to
verify that the XML definition is correct. Youshouldsee the minimapwith the
new
CombatTrackerFrame
directly below it, similar to Figure 14-2.
C# PDF insert text Library: insert text into PDF content in C#.net
int pageIndex = 0; // Move cursor to (400F, 100F). aChar, font, pageIndex, cursor); // Output the new document. Program.RootPath + "\\" output.pdf"; doc.Save
how to move pages in pdf files; pdf reverse page order preview
C# PDF Library SDK to view, edit, convert, process PDF file for C#
load, create, convert and edit PDF document (pages) in C# PDF files; insert, delete, move, rotate, copy and robust APIs for editing PDF document hyperlink (url
reverse page order pdf; how to rearrange pages in pdf document
Chapter 14
Tracking Damage with CombatTracker 273
Figure 14-2: CombatTrackerFrame anchored below the minimap
At this point, nothing can be done with the frame because no scripts have
been written to define its behavior. To make the addon fully functional, it
needs scripts to handle clicking, dragging, and handlers for events.
If for some reason you do not see the frame, check the
Logs/FrameXML.log
file under your World of Warcraft directory. It may contain information about
any errors you have made in creating the file. Alternatively, you can validate
the file using one of the validation tools mentioned in Chapter 7.
Adding Script Handlers to CombatTrackerFrame
The behavior in this addon will be defined in
CombatTracker.lua
,but before
you can write those functions you must refer to them in the frame definition
in
CombatTracker.xml
.Open the
.xml
file and add the following section right
after the
</Layers>
tag in the <
Button>
definition:
<Scripts>
<OnLoad>
CombatTracker_OnLoad(self)
</OnLoad>
<OnEvent>
CombatTracker_OnEvent(self, event, ...)
</OnEvent>
<OnClick>
CombatTracker_ReportDPS()
</OnClick>
<OnDragStart>
self:StartMoving()
</OnDragStart>
<OnDragStop>
self:StopMovingOrSizing()
</OnDragStop>
</Scripts>
C# PDF Image Extract Library: Select, copy, paste PDF images in C#
Get image information, such as its location, zonal information, metadata, and so on. Able to edit, add, delete, move, and output PDF document image.
move pdf pages online; pdf rearrange pages online
VB.NET PDF Library SDK to view, edit, convert, process PDF file
Rapidly and multiple PDF document (pages) creation and edit PDF files; insert, delete, move, rotate, copy robust APIs for editing PDF document hyperlink (url
pdf reorder pages; how to rearrange pages in a pdf file
274
Part II
Programming in World of Warcraft
As mentioned in Chapter 8, each frame type has a number of widget scripts
that can be set with a handler function. Table 14-1 describes the scripts you’re
using here (you can find more details about these scripts and the arguments
they accept in Chapter 29, ‘‘Widget Reference’’).
Table 14-1: Script Handlers Used in CombatTracker
SCRIPT
USE
<OnLoad>
The basic initialization function for CombatTracker will
be called CombatTracker_OnLoad().It’s called from
the <OnLoad> handler on the frame when the frame
has finished initializing. It works only for frames that are
defined in XML.
<OnEvent>
The addon will respond to a number of events, so you
must define an OnEvent script to handle them. The
CombatTracker_OnEvent() function will be
responsible for each of the events. The handling function
will need to know which event it’s being passed, so
ensure you are passing the frame self, the event name
event, and the variable set of arguments ... to the
function.
<OnClick>
When the player right-clicks CombatTrackerFrame,the
OnClick script handler will call the
CombatTracker_ReportDPS() function to print the
current combat status. The status message will be sent
to partychat if theplayer is in a party, otherwise it will be
printed to the chat frame.
<OnDragStart>
The code for allowing a frame to be dragged and placed
is very simple, so the code is written directly in the script
handler rather than in a function defined in
CombatTracker.lua. Later, if you wanted to add
options to the addon, such as allowing theuser to lock
the frame in place, you could move this code into the
Lua file to consolidate everything.
Each frame that has the movable attribute set to true
can call the self:StartMoving() method, which
causes the frame to followthe mouse. As a result, all
that’s required to set up frame movement when dragged
is to call this function.
<OnDragStop>
Stopping the frame from moving is a matter of calling
self:StopMovingOrSizing().This function also
flags the frame as user placed, meaning the next time
the addon loads, the frame will be put in the same place
the user dropped it. This is quite a handy side effect.
Chapter 14
Tracking Damage with CombatTracker 275
Adding Functions to CombatTracker.lua
To properly calculate the incoming damage,the time spent in combat, and the
average incoming DPS during combat, a few values need to be stored. These
will be created as local variables at the top of
CombatTracker.lua
.Open that
file and add the following lines:
-- Set up some local variables to track time and damage
local start_time = 0
local end_time = 0
local total_time = 0
local total_damage = 0
local average_dps = 0
Four more functions must be created to have a fully functional addon:
CombatTracker_OnLoad(frame)
CombatTracker_OnEvent(self, event, ...)
CombatTracker_UpdateText()
CombatTracker_ReportDPS()
These functions are discussed in the following sections.
CombatTracker_OnLoad(frame)
As you may recall from your work in Chapter 4, the variable name
self
has a
bit of a special meaning in Lua. When a function inside a table is called using
the colon syntax, the first argument that Lua passes is the table itself with
the name
self
.In addition, when the World of Warcraft client calls a frame
script, the first argument is called
self
and points to the frame itself. This can
be confusing, so when you define functions that are called from XML, it is a
good idea to make the variable names more meaningful. In the script handler
for
OnLoad
,the script is given the frame object in the
self
variable, and will
pass it on to the
CombatTracker_OnLoad()
function. The function definition,
however, will name it
frame
.That way there’s no question about what type of
value it contains.
Add the following function definition to the bottom of
CombatTracker.lua
:
function CombatTracker_OnLoad(frame)
frame:RegisterEvent(“UNIT_COMBAT“)
frame:RegisterEvent(“PLAYER_REGEN_ENABLED“)
frame:RegisterEvent(“PLAYER_REGEN_DISABLED“)
frame:RegisterForClicks(“RightButtonUp“)
frame:RegisterForDrag(“LeftButton“)
end
276
Part II
Programming in World of Warcraft
This function registers the combat tracker frame for the three events that
need to be watched. It also registers to receive right-click events, along with
drags with the left mouse button.
CombatTracker_OnEvent
The
CombatTracker_OnEvent()
function handles three different types of
events, so it will be one large conditional with special code for each event
name. Add the function as follows to the bottom of
CombatTracker.lua
:
function CombatTracker_OnEvent(frame, event, ...)
if event == “PLAYER_REGEN_DISABLED“ then
-- This event is called when we enter combat
-- Reset the damage total and start the timer
CombatTrackerFrameText:SetText(“In Combat“)
total_damage = 0
start_time = GetTime()
elseif event == “PLAYER_REGEN_ENABLED“ then
-- This event is called when the player exits combat
end_time = GetTime()
total_time = end_time - start_time
average_dps = total_damage / total_time
CombatTracker_UpdateText()
elseif event == “UNIT_COMBAT“ then
if InCombatLockdown() then
local unit, action, modifier, damage, damagetype = ...
if unit == “player“ and action ~= “HEAL“ then
total_damage = total_damage + damage
end_time = GetTime()
total_time = math.mind(end_time - start_time, 1)
average_dps = total_damage / total_time
CombatTracker_UpdateText()
end
end
end
end
The following sections explore the events handled by this function as
well as
CombatTracker_UpdateText()
,a function that’s called at the end of
CombatTracker_OnEvent()
.
PLAYER_REGEN_ENABLED
The
PLAYER_REGEN_ENABLED
section of the conditional happens when the
player exits combat, which means it’s time to clean up and display the final
results. The
GetTime()
function is used to set the
end_time
variable. It returns
thecurrent valueofthein-game timer.The actual valuedoesn’tmatterbecause
Chapter 14
Tracking Damage with CombatTracker 277
you’re just going to subtract the start time from the end time to give you the
difference (in seconds).
Finally, the
CombatTracker_UpdateText()
function is called to handle the
update of the actual text on the frame. You could do the updating directly in
this function, but the same code will be needed at a later point. Rather than
having the same code in two places, it’s cleaner to make a new function that
does the common work.
PLAYER_REGEN_DISABLED
The
PLAYER_REGEN_DISABLED
event fires when the player enters combat, so
it needs to set up the accounting variables to ensure the addon gets a clean
slate for each combat. It simply calls
CombatTrackerFrameText:SetText()
to
change the frame to say ‘‘In Combat.’’ It also sets the
total_damage
variable
back to
0
and initializes the
start_time
variable with the current time.
UNIT_COMBAT
Most of the addon’s logic actually happens in the
UNIT_COMBAT
section, so
it’s a bit larger than the other two. First you check to see if the player is in
combat (bychecking the
InCombatLockdown()
function),soyoucan ignore any
messages that arrive outside of combat. Because event arguments are passed
to the function as a vararg, you assign them to named variables so they are
more easily accessible.
You’re interested only in those events that happen to the player and want
to skipthose events in which the player is being healed,so check the
unit
and
action
arguments. If both conditions pass, the current amount of damage is
addedtothe total, the endtime is updated,and the totaltime and average DPS
arecalculated.Becausethetimemightbelessthan asecond(andthereisnoway
to divide by zero) you use the
math.min()
function to choose either the time
difference,or 1, whichever is larger.Finally the
CombatTracker_UpdateText()
function is called to update the frame.
CombatTracker_UpdateText()
CombatTracker_UpdateText()
is a simple function that updates the status on
the
CombatTrackerFrame
using
string.format()
.Add the following function
definition to the bottom of
CombatTracker.lua
:
function CombatTracker_UpdateText()
local status = string.format(“%ds / %d dmg / %.2f dps“, i
total_time, total_damage, average_dps)
CombatTrackerFrameText:SetText(status)
end
278
Part II
Programming in World of Warcraft
When run, this format string shows the number of seconds in combat,
followed by the amount of damage taken, and the average incoming DPS for
that combat period.
CombatTracker_ReportDPS()
The
CombatTracker_ReportDPS()
checkscallsthe
GetNumPartyMembers()
func-
tion to determine whether or not the player is in a party. If the number is
greater than
0
,the player is in a party. Add the following function to your
CombatTracker.lua
:
function CombatTracker_ReportDPS()
local msgformat = “%d seconds spent in combat with %d incoming i
damage.
Average incoming DPS was %.2f“
local msg = string.format(msgformat, total_time, total_damage, i
average_dps)
if GetNumPartyMembers() > 0 then
SendChatMessage(msg, “PARTY“)
else
print(msg)
end
end
This function uses a format string to craft the outgoing message, and then
uses
GetNumPartyMembers()
to decide where to send it. If the player is in a
party, the
SendChatMessage()
function is used to send the message to the
party; otherwise, the
print()
function is used to send it to the chat frame so
the player can see it.
Testing CombatTracker
You have completed all the code necessary for a fully functional Combat-
Tracker addon. Load the game and select a character. You should be greeted
with the CombatTrackerframe right below your minimap.
Testing is a very importantpart of addon writing if youplan to release your
addons to the public. When you write a set of features, it’s prudent to test
them yourself before you ship the addon to the public to ensure that users
won’t geterrormessages and be reporting them to you after the fact. That sort
of troubleshooting is always more difficult than errors you encounter on your
own. Systematically test each portion of the addon.
Documents you may be interested
Documents you may be interested