DN's D&D4e Character Sheet Framework

Framework(s) for D&D 4e, including Veggiesama's.

Moderators: dorpond, trevor, Azhrei, giliath, Gamerdude, jay, Mr.Ice

User avatar
MadJoker
Cave Troll
Posts: 55
Joined: Sat Mar 28, 2009 3:43 pm

Re: DN's D&D4e Character Sheet Framework

Post by MadJoker »

Cay wrote:@MadJoker
I would very much like to try your scripts. But I'm having some adding the timer.
I'm not sure where and how I am supposed to enter the timer functionality.
Go to Edit->Campaign Properties and you land in the tab Token Properties. In the list on the left side select Information and add the info from my post at the bottom of the list on the right side. Then make sure to click Update in the lower right corner. If you want to enable the turn timer then you can just double click the Lib:Information token and in the properties tab you can change the value for enableTurnTimer.

Cay
Cave Troll
Posts: 61
Joined: Sat Feb 18, 2012 5:23 am
Location: Hilden, Germany

Re: DN's D&D4e Character Sheet Framework

Post by Cay »

Ah, thanks a lot. Now I added all the macros and filled the initiative que with creatures.
When I click on NextInitiative for the first time, everything works great (e.g. PC is reminded to take ongoing damage). Wonderful script!

Clicking it a second time gives me the following error, when the timer property is set to 0:

Code: Select all

java.lang.ClassCastException: java.lang.String cannot be cast to java.math.BigDecimal error executing expression broadcast("" + getName(iniToken) + "'s turn took " + if(tMinutes > 0,tMinutes + " minute" + if(tMinutes > 1,"s","") + if(tSeconds > 0," and ",""),"") + if(tSeconds > 0 || tMinutes == 0, tSeconds + " second" + if(tSeconds > 1 || tSeconds == 0,"s",""),"") + ".",if(enableTurnTimer,"all","gm")).
I set the timer property to 1. Now the java error is gone. Instead I get the following output regarding a saving throw:

Code: Select all

Ylivara must make a save against 
net/rptools/maptool/client/image/smiley/emcurl.png'>heet/none/C0A80124C35F1DE1C36F0000C0080100?%7B%22WindowType%22%3A%22Condition%22%2C%22Name%22%3A%22Fire%22%2C%22Duration%22%3A1%2C%22Damage%22%3A2%2C%22Penalty%22%3A%22%22%2C%22Notes%22%3A%22%22%7D'>Fire condition.
And one minor thing: There is no code in the 'SortInitiative' section of your post. Was this intended?
Ready to play campaign: Kobold Hall - D&D4e LVL1

User avatar
MadJoker
Cave Troll
Posts: 55
Joined: Sat Mar 28, 2009 3:43 pm

Re: DN's D&D4e Character Sheet Framework

Post by MadJoker »

Thanks for the hint with the SortIniative part. I added the code.

About the first error: this most likely happened because you had a combat running already, and did not start the whole combat with the NextInitiative macro. I have added a fix for that problem to the macro in my previous post. But in general it would be best if you always use the NextIniative macro to start a combat, i.e. just roll initiative with all combatants, then click SortInitiative (includes automatic tie breaking), then click NextInitiative to start the combat, and use it until the combat is over. Then click ClearIniative once the encounter has ended.

EDIT: Haha, I figured out the second problem. It's a problem with smileys. MapTool knows :S as a smiley, and in the output of my script I give a link to the condition explanation of the ongoing damage. That link is generated by a MapTool function and the token where the macro lies is called Lib:Sheet. Now the link is just a long HTML text and is parsed first for smileys apparently. I cannot change that fact easily, so the only fix is to disable smileys on your machine (your players can use smileys without problems).
Last edited by MadJoker on Tue Jun 12, 2012 2:03 pm, edited 1 time in total.

Cay
Cave Troll
Posts: 61
Joined: Sat Feb 18, 2012 5:23 am
Location: Hilden, Germany

Re: DN's D&D4e Character Sheet Framework

Post by Cay »

Once again: many thanks. Everything works as advertised ;-).
And the thing with the smileys is almost hilarious :lol:
Ready to play campaign: Kobold Hall - D&D4e LVL1

dewin
Kobold
Posts: 11
Joined: Thu Sep 30, 2010 1:00 am

Re: DN's D&D4e Character Sheet Framework

Post by dewin »

I was building an virtual NPC to act as 'treasure storage', wanting to exploit the fact that giving items from an NPC duplicates the item rather than moving it.

Except... in my testing, this isn't what was actually happening. I did some troubleshooting and found the problem:

In GiveEdit@Lib:Sheet, there's a line that looks like this:

Code: Select all

[H: DNT_CharacterType = json.get(json.get(getLibProperty("CharacterTypes", "Lib:Information"), DNA_CharacterType), 2)]
This is supposed to be checking to see if the token is a PC character type, but instead is looking up the HP modifier. PCs and NPCs both have the same modifier (1), which causes this to not work.

The 'correct' fix is to replace that line of the macro with this version, changing the '2' to a '1' to properly query the "is PC" field rather than the "HP multiplier" field

Code: Select all

[H: DNT_CharacterType = json.get(json.get(getLibProperty("CharacterTypes", "Lib:Information"), DNA_CharacterType), 1)]
The alternative is to flag any NPCs that you're putting items on as an elite or a solo, as they have a HP modifier that is not equal to 1.

[Edit: I should learn to preview.]
Newbie D&D4e DM and tinkerer.
I made some terrain overlays for cover, concealment, etc.
I use DeviantNull's D&D4e Character Sheet Framework

ChaosDragon
Kobold
Posts: 3
Joined: Fri Jun 29, 2012 1:08 am

Re: DN's D&D4e Character Sheet Framework

Post by ChaosDragon »

Can someone please help me. I have been working on this campaign for about a month. I finally got it all set up for our first game, but after I started the server, my players did not have the character sheet window, and the character sheet macro button in the campaign window is gone. And all of a sudden, now I am getting this annoying message 'You do not have permission to call the "getOwned" function.' every time I click something, I can no longer even access the character sheets. I REALLY do not want to start over from scratch, so if anyone can shed any light on this I would greatly appreciate it.

P.S. The one time I did get the character sheet window to show up, none of the sheets would load and it just kept saying 'Undefined function: Find Color' , so any idea what that was would be some nice info as well.

User avatar
MadJoker
Cave Troll
Posts: 55
Joined: Sat Mar 28, 2009 3:43 pm

Re: DN's D&D4e Character Sheet Framework

Post by MadJoker »

@ChaosDragon
Well, two things that come two mind would be to make sure you start the server as GM, not as a player, and to make sure all the library token's are still named correctly, i.e. they are named "Lib:Sheet", "Lib:Execute", and "Lib:Information", without any spaces or something. For example if you have token numbering enabled if you copy around the tokens the get a number at the end of the name, which makes it not work anymore.

If this doesn't work, try loading the original FW campaign, right click all the library tokens and save them. In your campaign delete your library tokens and replace them with the saved ones.

That's about all I can think of.

PS: What MT version are you using?

ChaosDragon
Kobold
Posts: 3
Joined: Fri Jun 29, 2012 1:08 am

Re: DN's D&D4e Character Sheet Framework

Post by ChaosDragon »

MadJoker wrote:@ChaosDragon
Well, two things that come two mind would be to make sure you start the server as GM, not as a player, and to make sure all the library token's are still named correctly, i.e. they are named "Lib:Sheet", "Lib:Execute", and "Lib:Information", without any spaces or something. For example if you have token numbering enabled if you copy around the tokens the get a number at the end of the name, which makes it not work anymore.

If this doesn't work, try loading the original FW campaign, right click all the library tokens and save them. In your campaign delete your library tokens and replace them with the saved ones.

That's about all I can think of.

PS: What MT version are you using?
maptool-1.3.b87

ChaosDragon
Kobold
Posts: 3
Joined: Fri Jun 29, 2012 1:08 am

Re: DN's D&D4e Character Sheet Framework

Post by ChaosDragon »

I actually didn't touch the names, and I was logged in as a GM on the server. Really the only thing I did was mess with the ownership of some of the tokens but then it just kind of locked me out of everything.Also, what should the ownership of the 'lib:' things be set to?

User avatar
MadJoker
Cave Troll
Posts: 55
Joined: Sat Mar 28, 2009 3:43 pm

Re: DN's D&D4e Character Sheet Framework

Post by MadJoker »

ChaosDragon wrote:I actually didn't touch the names, and I was logged in as a GM on the server. Really the only thing I did was mess with the ownership of some of the tokens but then it just kind of locked me out of everything.Also, what should the ownership of the 'lib:' things be set to?
They shouldn't be owned by anyone, I think. But I think it might be the easiest way if you just upload the campaign file somewhere, and I will see if I can fix it. Sometimes the errors that MT or the FW generate are quite difficult to figure out, especially if one doesn't have access to the campaign.

dewin
Kobold
Posts: 11
Joined: Thu Sep 30, 2010 1:00 am

Re: DN's D&D4e Character Sheet Framework

Post by dewin »

Cay wrote:Ah, thanks a lot. Now I added all the macros and filled the initiative que with creatures.
When I click on NextInitiative for the first time, everything works great (e.g. PC is reminded to take ongoing damage). Wonderful script!

Clicking it a second time gives me the following error, when the timer property is set to 0:

Code: Select all

java.lang.ClassCastException: java.lang.String cannot be cast to java.math.BigDecimal error executing expression broadcast("" + getName(iniToken) + "'s turn took " + if(tMinutes > 0,tMinutes + " minute" + if(tMinutes > 1,"s","") + if(tSeconds > 0," and ",""),"") + if(tSeconds > 0 || tMinutes == 0, tSeconds + " second" + if(tSeconds > 1 || tSeconds == 0,"s",""),"") + ".",if(enableTurnTimer,"all","gm")).
I encountered this same problem, even after reading the post on how to fix it. This is how I fixed it:

1. Under Campaign Properties -> Token Properties -> Information, remove the default value for 'enableTurnTimer', e.g. change it from "enableTurnTimer:0" to "enableTurnTimer"

2. Edit the Lib:Information token and set enableTurnTimer to 0.

It turns out that getLibProperty() won't return 'defaulted' properties, so it ends up returning an empty string rather than 0. The if() construct to determine whether to report this to 'all' or 'gm' fails in this case, since it expects a number. The problem didn't occur when enableTurnTimer was manually set to 1, since it was no longer the default value.
Newbie D&D4e DM and tinkerer.
I made some terrain overlays for cover, concealment, etc.
I use DeviantNull's D&D4e Character Sheet Framework

User avatar
MadJoker
Cave Troll
Posts: 55
Joined: Sat Mar 28, 2009 3:43 pm

Re: DN's D&D4e Character Sheet Framework

Post by MadJoker »

dewin wrote:
Cay wrote:Ah, thanks a lot. Now I added all the macros and filled the initiative que with creatures.
When I click on NextInitiative for the first time, everything works great (e.g. PC is reminded to take ongoing damage). Wonderful script!

Clicking it a second time gives me the following error, when the timer property is set to 0:

Code: Select all

java.lang.ClassCastException: java.lang.String cannot be cast to java.math.BigDecimal error executing expression broadcast("" + getName(iniToken) + "'s turn took " + if(tMinutes > 0,tMinutes + " minute" + if(tMinutes > 1,"s","") + if(tSeconds > 0," and ",""),"") + if(tSeconds > 0 || tMinutes == 0, tSeconds + " second" + if(tSeconds > 1 || tSeconds == 0,"s",""),"") + ".",if(enableTurnTimer,"all","gm")).
I encountered this same problem, even after reading the post on how to fix it. This is how I fixed it:

1. Under Campaign Properties -> Token Properties -> Information, remove the default value for 'enableTurnTimer', e.g. change it from "enableTurnTimer:0" to "enableTurnTimer"

2. Edit the Lib:Information token and set enableTurnTimer to 0.

It turns out that getLibProperty() won't return 'defaulted' properties, so it ends up returning an empty string rather than 0. The if() construct to determine whether to report this to 'all' or 'gm' fails in this case, since it expects a number. The problem didn't occur when enableTurnTimer was manually set to 1, since it was no longer the default value.
Thanks for the info. I'll update my code with a fix for that. Might be that I even encountered this once myself, but I haven't used the default value since ages, so I forgot about it.

dewin
Kobold
Posts: 11
Joined: Thu Sep 30, 2010 1:00 am

Re: DN's D&D4e Character Sheet Framework

Post by dewin »

I decided I like the convention of having different monsters of the same type roll shared initiative and all act together. Before I'd just roll initiative for one of each kind of monster, but that breaks when I decide to just delete tokens upon death and accidentally delete the one that actually holds the initiative number. Plus, MadJoker's nice initiative state tracking system only works when the actual token comes up in initiative, so wouldn't work with that particular usage.

So I decided to take a fun adventure into the land of Maptools macros to accomplish that goal

This is a mod to the framework that will - for the GM only[1] - allow you to group monsters in initiative when you roll them in. The logic is as follows:

1. You can group monsters by (none), Name, GM Name, or Label

2. Two monsters are considered by the same group if they have identical names (excluding any trailing numbers -- so "Kobold", "Kobold 2", and "Kobold 25" are all in the same group, "Kobold Dragonshield" is in its own group.). If you opt to group by GM Name or Label, the same logic applies just using the relevant field. (If you name all of your kobolds "Kobold" so it's not readily obvious to your players what kind of kobolds they are, you can set their GM names to "Kobold Dragonshield", "Kobold Wyrmpriest", etc. and then group by initiative. Monsters with no name, label, or GM name (depending on grouping method) are never treated as grouped.

3. As each monster is added to initiative, it scans the initiative list for a monster in the same group. If a match is found, the new monster copies the old monster's initiative. ("Kobold 2: I share Kobold 1's initiative of 13.01"); otherwise initiative is done normally.

Note the exact mechanism for this process is fairly inefficient -- the entire initiative list has to be looped for each monster if grouping is enabled, so the cost is exponential as the list grows. There are a few ways this could be improved[2], but it's more fiddly than I'd like to get right now.

Notes:
* Re-adding tokens to initiative with grouping enabled is ineffective, as each token will find another token in its group and readd using its number.
* Behavior if tokens exist at differing initiative counts in the same group is undefined. (Actually, it'll follow the order of getInitiativeList() )
* Grouping tokens with differing initiative bonuses probably isn't a good idea.

With all the caveats out of the way, here's the actual code changes:
InitiativeCheckEntry@Lib:Sheet (Dice Checks)

Code: Select all

<!--InitiativeCheckEntry-->
[H: DNT_macroTarget = if(json.get(macro.args, "MacroTarget") == "Multiple", "Selected", currentToken())]

<head>
	<meta name="input" content = "true">
	<title>Initiative Check</title>
</head>
<body><form name="Initiative Check" method="json" action="[r: macroLinkText('CheckOutput@Lib:Execute', 'none', '', DNT_macroTarget)]">
<table width="100%" nowrap="nowrap" bgcolor="DBD9C0">
	<tr>
		<td width="1">Re-add to List:</td>
		<td><input type="checkbox" name="Readd" value="1"></input></td>
		<td width="1">Set Value:</td>
		<td align="left"><input type="text" name="Value" size="5"></input></td>
	</tr>
</table>
<table width="100%" nowrap="nowrap" bgcolor="DBD9C0">
	<tr>
[R, if(isGM() == 1 && getLibProperty("GMScreen", "Lib:Information") == 1), CODE:
	{
		<td width="1"><b>Modifier:</b></td>
		<td align="left"><input type="text" name="Mod" size="5"></input></td>
		<td width="1" align="right">Die Roll:</td>
		<td align="left"><input type="text" name="GMDieRoll" size="5"></input></td>
	};{
		<td width="1"><b>Modifier:</b></td>
		<td align="left"><input type="text" name="Mod" size="5"></input></td>
	}
]
	</tr>
</table>
[R, if(isGM() == 1), CODE:
{
<table width="100%" nowrap="nowrap" bgcolor="DBD9C0">
	<tr>
		<td width="1"><b>Group By:</b></td>
		<td><Select name="GroupBy">
			<Option selected="selected" value="None">(none)</option>
			<Option value="Name">Name</option>
			<Option value="Label">Label</option>
			<Option value="GM Name">GM Name</option>
		</select>
		</td>
	</tr>
</table>
};{}]
<table width="100%" nowrap="nowrap">
	<tr bgcolor="B3AF94">
		<td width="1">Private:</td>
		<td align="left"><input type="checkbox" name="Output" value="Private" [R, if(DNT_MacroTarget == "Selected"): if(getProperty("DNA_PrivateRolls" + getPlayerName()) == "1", "checked", "")]></input></td>
		<td align="right">Hide Roll Info:</td>
		<td align="left"><input type="checkbox" name="HideRoll" value="1" [R, if(DNT_MacroTarget == "Selected"): if(getProperty("DNA_HiddenRolls" + getPlayerName()) == "1", "checked", "")]></input></td>
	</tr>
	<tr bgcolor="DBD9C0">
		<td colspan="4" align="center">
			<input type="submit" name="SaveEntry" value="Fight!"></input>
		</td>
	</tr>
</table>
<input type="hidden" name="ExeMacro" value="InitiativeCheck"></input>
<input type="hidden" name="MacroTarget" value="[R: DNT_macroTarget]"></input>
</form></body>
(The only thing new here is the "Group By" section)
EntrySize@Lib:Sheet (Entry)
Find "InitiativeCheck" in the list, and change to:

Code: Select all

"InitiativeCheck",  "175, 325",
I also fixed a few minor bugs I was experiencing with character notes and equipment fields (always having to scroll a tiny bit to be able to click the save button) by finding and updating the following:

Code: Select all

"EquipmentNotes", "385, 570",
"Notes", "385, 570",
InitiativeCheck@Lib:Execute (Dice Checks)
Replace with

Code: Select all

<!--InitiativeCheck-->
[H, forEach(DNT_variable, "Mod, Readd, Value,Output, HideRoll"): set("DNT_Raw" + DNT_variable, json.get(macro.args, DNT_variable))]
[H: DNT_RawMod = DNT_RawMod + 0]
[H: DNT_Mod = eval(string(DNT_RawMod))]

[H: Die = if(json.get(macro.args, "GMDieRoll") == "", 1d20, json.get(macro.args, "GMDieRoll"))] 
[H: Rating = json.get(json.get(DNA_AbilityScores, 2), 2) + DNA_LevelBonus + DNA_InitBonus]

[H: DNT_InitTotal = if(DNT_RawValue == "", Die + Rating + DNT_Mod + ((Rating+DNT_Mod)/100), DNT_RawValue)]

<!--Sets if the token was on the initiative list to start with, this the output formating is correct-->
[H: DNT_OnInitList = if(getInitiative() == "The token is not in the initiative list.", 0, 1)]

<!--See if we are set to group with other like-named tokens-->

[H: DNT_Groupby = if(isGm(), json.get(macro.args, "GroupBy"), "None")]
[H, switch(DNT_Groupby), CODE:
	case "Name" : {[H: DNT_Groupfunction = "getName()" ]};
	case "Label": {[H: DNT_Groupfunction = "getLabel()" ]};
	case "GM Name": {[H: DNT_Groupfunction = "getGMName()" ]};
	default: {[H: DNT_Groupfunction = ""]};
]
<!-- Save our current token ID so we know if we compare against ourself later -->
[H: DNT_SelfId = currentToken()]
<!-- ID of the token that we decided to match against, if we find one -->
[H: DNT_OtherId = ""]

[H, if(DNT_Groupfunction == ""): DNT_SelfBaseName = ""; DNT_SelfBaseName = replace(eval(DNT_Groupfunction), "^(.*?) [0-9]+","\$1")]
[H, if(DNT_SelfBaseName != ""), CODE:
	{
		[H: DNT_InitiativeList = json.get(getInitiativeList(), "tokens")]
		[H, foreach(DNT_InitiativeEntry, DNT_InitiativeList), CODE:
			{
				In initiative scanning loop, [R: DNT_CheckId = json.get(DNT_InitiativeEntry, "tokenId")]
				[H, token(DNT_CheckId): DNT_OtherBaseName = replace(eval(DNT_Groupfunction), "(.*?) [0-9]+","\$1")]
				[H, if(DNT_CheckId != DNT_SelfId && DNT_OtherBaseName == DNT_SelfBaseName && DNT_OtherId == ""): DNT_OtherId = DNT_CheckId]
			}
		]
	}
]
[H, if(DNT_OtherId != ""), CODE:
	{
		[H, token(DNT_OtherId): DNT_InitTotal = getInitiative()]
	}
]

<!--Output Formating-->
[H: DNT_ModFormat = "%s(%s)"]
[H, if(isNumber(DNT_RawMod) == 1): Mod = DNT_RawMod; Mod = strformat(DNT_ModFormat, string(DNT_RawMod), DNT_Mod)]
[H: DNT_GMCheatMsg = "<b>[Rolls behind the GM Screen]</b>"]

<!--Adds to the initiative, only does it if the token is not on the list, if readd has been checked, or if there is a set Value-->
[H, if(DNT_OnInitList == 0 || DNT_RawReadd == 1 || DNT_RawValue != ""), CODE:
	{		
		[H: addToInitiative()]
		[H: setInitiative(DNT_InitTotal)]		
	}
]

[R, if(DNT_RawValue == "" && DNT_OtherId == ""), CODE:
	{
		[R: getLibProperty("GameMessage", "Lib:Information")] [R: if(isGM() == 1 && getLibProperty("GMScreen", "Lib:Information") == 1, DNT_GMCheatMsg, "")] [R: if(DNT_RawOutput == "", "", token.name + ":")] I make an Inititiative check and get a 
		[R, if(DNT_RawHideRoll == 1), CODE:
			{
				[gt, st, t(Die + Rating + DNT_Mod): Die + Rating + Mod]
			};{
				[t(Die + Rating + DNT_Mod): Die + Rating + Mod]
			}
		]. [R: if(DNT_OnInitList == 0 || DNT_RawReadd == 1, "", "But I'm already on the Initiative list.")]
	};{}
]

[R, if(DNT_RawValue != "" && DNT_OtherId == ""), CODE:
	{
		[R: getLibProperty("GameMessage", "Lib:Information")] [R: if(isGM() == 1 && getLibProperty("GMScreen", "Lib:Information") == 1, DNT_GMCheatMsg, "")] [R: if(DNT_RawOutput == "", "", token.name + ":")] I set my Initiative to [R: DNT_InitTotal].
	};{}
]

[R, if(DNT_OtherId != ""), CODE:
	{
		[R: getLibProperty("GameMessage", "Lib:Information")] [R: if(isGM() == 1 && getLibProperty("GMScreen", "Lib:Information") == 1, DNT_GMCheatMsg, "")] [R: if(DNT_RawOutput == "", "", token.name + ":")] I share [R: getName(DNT_OtherId)][R:"'s"] initiative of [R: DNT_InitTotal]. [R: if(DNT_OnInitList == 0 || DNT_RawReadd == 1, "", "But I'm already on the Initiative list.")]
	};{}
]
[1] Trying to get an 'untrusted' view of the initiative list from a trusted macro seems to be non-trivial, which means there's a 50/50 chance that it'd take all of one line of code and someone just needs to tell me what it is.

[2] By making a JSON map of group -> initiative_or_owner_token_ID at the start of adding tokens to initiative and updating it at the same time we add tokens to initiative. But there's no clear entry point between the "Okay, we're starting initiative now" and "For each token, run this macro" steps without more editing than I'd like to do.
Newbie D&D4e DM and tinkerer.
I made some terrain overlays for cover, concealment, etc.
I use DeviantNull's D&D4e Character Sheet Framework

User avatar
Jagged
Great Wyrm
Posts: 1306
Joined: Mon Sep 15, 2008 9:27 am
Location: Bristol, UK

Re: DN's D&D4e Character Sheet Framework

Post by Jagged »

dewin wrote:I decided I like the convention of having different monsters of the same type roll shared initiative and all act together.
Cool. I use Rumble's Slim framework but have been thinking about the same thing. I shall be looking through this as soon as I get the chance :)

Sirchibbi
Kobold
Posts: 3
Joined: Sat Mar 03, 2012 2:58 pm

Re: DN's D&D4e Character Sheet Framework

Post by Sirchibbi »

Using this Frame work and i keep getting a error.
Error
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.ComparableTimSort.mergeLo(Unknown Source)
at java.util.ComparableTimSort.mergeAt(Unknown Source)
at java.util.ComparableTimSort.mergeCollapse(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at net.rptools.maptool.client.ui.zone.FogUtil.calculateVisibility(FogUtil.java:81)
at net.rptools.maptool.client.ui.zone.ZoneView.getVisibleArea(ZoneView.java:216)
at net.rptools.maptool.client.ui.zone.FogUtil.exposeLastPath(FogUtil.java:256)
at net.rptools.maptool.client.tool.PointerTool.stopTokenDrag(PointerTool.java:267)
at net.rptools.maptool.client.tool.PointerTool.mouseReleased(PointerTool.java:541)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at net.rptools.maptool.client.swing.MapToolEventQueue.dispatchEvent(MapToolEventQueue.java:38)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Its very annoying, can anyone help Please?

Post Reply

Return to “D&D 4e Frameworks”