Unless I'm missing something, most values between 255 and 65536 will end up in the first category. Is that correct? I think it would be clearer if you added an example (how it works and why one'd want to use it).
I don't really think there is any reason to want to use p2=1 it with p1 values > 255, or even >100.
If 'Parameter1' is 65536, it will deal damage while the target's current HP is between 0 and 50, 100 and 150, 200 and 250, etc...
If 'Parameter1' is 131072, it will deal damage while the target's current HP is between 0 and 25, 50 and 75, 100 and 125, etc...
Both at a rate of 1/s. Dropping out of those ranges does not end the effect, damage will resume if they are later healed/damaged back into one of those ranges.
This function (param2=1) was intended to damage a target for a total given percentage of maximum health (See description on Arrows of Biting), but has never worked that way, and is why it's mechanics are so weird.
The arrows, in their current form, damage a target until their current HP < 3.33 (100 / 30) , or their duration expires (it's on redmine somewhere, if they haven't purged it yet).
To sum up, the opcodes that behave like that are: #25 (Poison) and #98 (Regeneration). #78 (Disease) and #272 (Use EFF file on condition) seem to be slightly different. In particular:
op#78 – when param#2 = 1, the damage dealt is 'Parameter1' per rounds (instead of per seconds)
op#272 – param#2 = 1 is unknown
Is that correct? Are there any other significant differences?
In the EE's, op25, 78, and 98 share the same p2=1 behavior.
In the EE's, op272 does not AFAIK have any function when p2=1, thought the effect is still present (it doesn't just instantly terminate), and will generate a portrait icon is special is non-zero.
To sum up, the opcodes that behave like that are: #25 (Poison) and #98 (Regeneration). #78 (Disease) and #272 (Use EFF file on condition) seem to be slightly different. In particular:
op#78 – when param#2 = 1, the damage dealt is 'Parameter1' per rounds (instead of per seconds)
op#272 – param#2 = 1 is unknown
Is that correct? Are there any other significant differences?
In the EE's, op25, 78, and 98 share the same p2=1 behavior.
In the EE's, op272 does not AFAIK have any function when p2=1, thought the effect is still present (it doesn't just instantly terminate), and will generate a portrait icon is special is non-zero.
What about p2=0,2,3,4 and the special field? Do they share the same behavior?
If I got it right, the only difference between op#25, #78, #98 and #272 should be the relation with opcode #329 (which affects only op#25) and that detail about p2=1 and op#272 – Is that correct?
The special field determines the portrait icon for all 4 opcodes regardless of parameter2. The only difference between the opcodes special field is which icon is used as the default (#0). (Poison uses the poison icon, the others default to "none").
The other major difference is op78 (Disease) p2 values 4-13, which are completely unrelated to the other 3 opcodes. Used for ability score drain, mold touch, slow, and contagion.
The ability score drain effects are rather simple - reduces said ability score by 'parameter1'.
The Slow effect is no different from that caused by op40, including it's stacking interaction with haste, except that it is blocked/removed as a disease, not as a slow effect.
Contagion is a composite of Strength, Dexterity, Charisma drain and the Slow effect, each ability score reduced by 'parameter1'.
Mold touch is complicated and not consisted across the EE games (it currently does not match what is mentioned on IESDP), but the general idea is that it deals (x or xd6) damage and applies the resource SPL every (round or second) for either 1 round (single) or across multiple rounds dealing less each round (decrement).
Mold touch is complicated and not consisted across the EE games (it currently does not match what is mentioned on IESDP), but the general idea is that it deals (x or xd6) damage and applies the resource SPL every (round or second) for either 1 round (single) or across multiple rounds dealing less each round (decrement).
I see, so NI's description of the special field is wrong too...
When you say it deals (x or xd6) damage, that 'x' is 'parameter1', right?
I see, so NI's description of the special field is wrong too...
When you say it deals (x or xd6) damage, that 'x' is 'parameter1', right?
If p2=11(single), it's always '1'.
If p2=12(decrement), it depends on the game:
IWDEE uses 'parameter1' for x, and calculates duration as (6 * parameter1).
BGEE calculates x from (duration / 6). (I think BG2EE uses this one as well).
If you set (duration = 6 * parameter1) it should junction the same in both games.
'parameter4' determines whether it deals damage every second or every round, and whether it deals x or xd6 damage.
p4 = 0 = xd6 per round.
p4 = 65536+ (even) = x per round.
p4 = 65537+ (odd) = x per second.
regardless, the value of x decrements only once per round.
What are the differences between op#218 and op#314? As far as op#218 is concerned, is it correct that if p2=1, then the total number of skins is: p1 + dice values (i.e., it behaves like op#12)?
It seems that if a CRE is affected by op#39, then STATE_REALLY_DEAD returns true. Intended or bug?
As far as ITM headers are concerned, what are exactly Alternative dice thrown (located at offset 0x11) and Alternative damage bonus (located at offset 0x13)?
Is it true that op#45 (Stun) automatically provides the stun portrait icon?
Is it true that both op#175 and op#185 automatically provide the "Held" string (or, better, the string specified by STRREF_EFFECT_HOLD in ENGINEST.2da)?
[*] What are the differences between op#218 and op#314? As far as op#218 is concerned, is it correct that if p2=1, then the total number of skins is: p1 + dice values (i.e., it behaves like op#12)?
Yes to dice values.
Each sets a different STAT (218:88, 314:199), important for detecting them through scripts.
#314 doesn't support the dice values or a customizable portrait Icon through the Special Field.
The Juggernaut Golem 'TOMEGOL4.CRE' is scripted by 'TOMEGOL4.BCS' to Kill() itself if its Summoner and none of the Players Party have stat #199 set to a non-zero value.
Stat 199 can also be set by op282 (Modify Scripting States), though is not officially supported, setting it this way provides all the benefits of stoneskin, but it does not decrement, nor does it provide the "stone" overlay color.
[*] As far as ITM headers are concerned, what are exactly Alternative dice thrown (located at offset 0x11) and Alternative damage bonus (located at offset 0x13)?
[*] Is it true that both op#175 and op#185 automatically provide the "Held" string (or, better, the string specified by STRREF_EFFECT_HOLD in ENGINEST.2da)?
Sadly yes (both), it even overrides the entries in EFFTEXT.2DA.
Looks like NI sometimes allows filenames of over 8 characters. Not sure in what circumstances though. Made EEKeeper crash when I loaded the new resources.
Looks like NI sometimes allows filenames of over 8 characters. Not sure in what circumstances though. Made EEKeeper crash when I loaded the new resources.
Do you have menu "Options -> Show Unknown Resource Types" enabled? In this case the entry counts as "unknown resource" and should not be available for resource-specific operations. Other game editors (and the game itself) should ignore these files. They were probably installed by some mods, maybe as marker files or simply by accident.
Yes, that option was enabled by default when I first started up the program. The files in the screenshot were in the override folder, and were created by me using "Add copy of".
Can anyone please provide step by step guide how to build Near Infinite (compile) with build.xml (latest commits)?
I cant start Ant -> that program should compile? I dont know now anything.
Please help
That my NearInfinite dir: https://imgur.com/a/UXho8Vp
@majber If you have correctly installed JDK (8 or later) and Apache Ant then calling "ant" from the source base directory (where build.xml is located) should be enough to build NearInfinity.jar. You might see a couple of warnings if you compile it with more recent JDK versions, but the build process should complete successfully (haven't tested yet with JDK 13 though).
But it's not really necessary to build NI yourself unless you want to modify the sources or test the latest experimental changes. Precompiled binaries can be downloaded from the link in the first post of this thread.
A new version is available after a long wait, which provides a great number of new features, various improvements and many bugfixes. You can find out more in the changelog below.
Many thanks to Mingun for his contributions over the past two years.
Changelog:
Show search names of areas (if available), creatures, items, spells and stores in the resource navigation tree (thanks Mingun) <- can be turned on/off in Options menu
Show overridden resources in bold in the resource navigation tree (thanks Mingun) <- can be turned on/off in Options menu
Moved game-related configuration files (such as baldur.lua, WeiDU.log, ...) from Edit menu to the new "Special" folder in the resource navigation tree
Bookmarks: Use game name by default (thanks Mingun)
Copy or rename game resources: Show a default naming suggestion; allow change of extension for rename operation
Added script compiler option "Autogenerate BCS comments" for scripts, mass exporter and bcs drop zone
Improved enforcing global font size for all UI text (useful for high dpi displays)
Allow negative numbers in parameter 1 of opcode 233
The same should hold for opcode #1 (Modify attacks per round) too...
Moreover, I'd rename op#318 and op#324 to "Protection from resource" and "Immunity to resource and message" respectively (they can block SPL, ITM and EFF files). Op#206 instead can block SPL and EFF files (but only if "Resource type" is 1 – Spell), so I'd leave "Protection from spell" here...
Allow negative numbers in parameter 1 of opcode 233
The same should hold for opcode #1 (Modify attacks per round) too...
Opcode 233 is special because of the complicated encoding scheme of active and original class values. For opcode 1 you can right-click on the field and select "Edit as number" to enter numeric values directly, including negative values.
Moreover, I'd rename op#318 and op#324 to "Protection from resource" and "Immunity to resource and message" respectively (they can block SPL, ITM and EFF files).
Opcode 233 is special because of the complicated encoding scheme of active and original class values. For opcode 1 you can right-click on the field and select "Edit as number" to enter numeric values directly, including negative values.
I see. The "problem" is that once you save changes, NI displays "Error (-2)" (or whatever value you put)... I know it's a purely cosmetic issue, but still kinda bad...?
Opcode 233 is special because of the complicated encoding scheme of active and original class values. For opcode 1 you can right-click on the field and select "Edit as number" to enter numeric values directly, including negative values.
I see. The "problem" is that once you save changes, NI displays "Error (-2)" (or whatever value you put)... I know it's a purely cosmetic issue, but still kinda bad...?
Yes, that's a bit misleading. I'll see if I can come up with a solution.
This is a first preview of a new search feature I've been working on for some time. It is intended to be much more powerful and flexible than the current "Extended Search" (but at the cost of some convenience).
The central element of the search feature are filter definitions. Filters can be used to define search options for specific resource fields or groups of fields with similar properties and provides a great number of options to match field values.
There is virtually no limit to how many filters can be defined, which makes it possible to build rather complex filter chains.
The whole search configuration can be exported and imported as xml data, so you don't have to build it time and again when you want to search for resources with the same kind of properties.
The main search dialog:
The upper section contains the filter list. In this example the filter list is set up to find only items that are exclusively usable by shamans.
The dialog for setting up individual filter entries:
The structure level defines where to search for the resource fields. In this example only global Effect structures are searched.
The field section deals with field names of the structure. It is possible to search by name or by (relative or absolute) offsets.
The value section deals with the field values themselves. The filter dialog provides options to search for text (in the broadest sense), numeric values or ranges of values, resource references or bitfields (useful to target specific flags or flag combinations).
The bottom-most option "Invert match" inverts the search result for this filter, so only resource fields NOT matching the specified definitions will be added.
Very nice feature: for now, I always use WeiDU for this kind of search as NI did not allow them. But I don't know how you will manage to propose an intuitive search canvas.
Yeah, that's actually the biggest challenge I have to overcome. Many settings have additional tooltips with helpful hints and clarifications. I will also add a section to the NearInfinity Wiki eventually. The original "Extended Search" will still be available though, since it's easier to use for a quick and simple search.
It should now reflect the current state of Near Infinity's feature set. Several outdated links have been fixed, and documentation for the upcoming "Advanced Search" has been added.
Added option to colorize resource structures and their associated offset and count fields (replaces former "Colorized offset fields" option). Can be turned on/off in menu Options > Show colored structures in Edit tabs.
Advanced Search:
Added feature to add selected resource fields as filter definitions (Right-click on resource field in Edit tab of resource and select "Add to Advanced Search")
Fixed missing import of "Match case" options for field and value definitions
Fixed a bug in search of grouped filter definitions
Area Viewer:
Overlay transparency from ARE field is considered when rendering overlays
Fixed overlay rendering issues in EET and possibly other games
Fixed erroneous detection of extended night maps in PSTEE
BAM Converter:
Fixed transparency issues with external palettes
Added support for PNG palette in "Replace colors" filter
Improved support of Microsoft PAL palettes
Experimental: Changed detection of transparent palette indices in BAM resources (palette index 0 and any palette indices matching RGB(0,255,0) are considered as transparent). Because of technical reasons BAM frame export and BAM Converter preview box will only support one transparent palette index though.
Search for resource references: Improved results for textual resource types (BCS, 2DA, ...). Results list shows matching line and line number, added support for multiple matches per resource, and cursor jumps to matching line when resource is opened.
Updated ARE Animation appearance and flags descriptions
Updated fields in GAM and GAM > NPC structures
Added ITM Ability flags bit 9 description
Further improved search names for areas in resource tree (uses names from worldmap if available)
Fixed bug when assigning resource references containing lower-case extensions in resource fields
More robust decoding of compresed BAMs containing corrupted data
Found a small issue I believe. Using StringRef Lookup and search for 27505 (bgee string) it will find 6 hits. However, opening any one of these hits will open up the first hit only - In this case being state 1.
Found a small issue I believe. Using StringRef Lookup and search for 27505 (bgee string) it will find 6 hits. However, opening any one of these hits will open up the first hit only - In this case being state 1.
Ah yes, that one is still buried in my (ever-growing) todo list. I'll look into it.
Looking for some help. Trying to edit a custom item to add an ability to cast a spell once per day. I've tried a couple ways, but every time i actually add the ability, the item corrupts and i get and error reading item null.
Even copying an ability from an existing item to the item in question, corrupts the file. The following errors throw in the debug console. I'm curious if i'm missing something obvious.
Error reading PCRING01.ITM
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
at org.infinity.resource.ResourceFactory.getResource(Unknown Source)
at org.infinity.resource.ResourceFactory.getResource(Unknown Source)
at org.infinity.gui.ResourceTree.valueChanged(Unknown Source)
at java.desktop/javax.swing.JTree.fireValueChanged(JTree.java:2967)
at java.desktop/javax.swing.JTree$TreeSelectionRedirector.valueChanged(JTree.java:3456)
at java.desktop/javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:641)
at java.desktop/javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1111)
at java.desktop/javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(DefaultTreeSelectionModel.java:297)
at java.desktop/javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(DefaultTreeSelectionModel.java:191)
at java.desktop/javax.swing.JTree.setSelectionPath(JTree.java:1656)
at java.desktop/javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(BasicTreeUI.java:2736)
at java.desktop/javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:4016)
at java.desktop/javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3955)
at java.desktop/java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:287)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6633)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6401)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5012)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4919)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4545)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4489)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2764)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.nio.BufferUnderflowException
at java.base/java.nio.Buffer.nextGetIndex(Buffer.java:690)
at java.base/java.nio.HeapByteBuffer.get(HeapByteBuffer.java:164)
at org.infinity.datatype.Bitmap.read(Unknown Source)
at org.infinity.datatype.Bitmap.<init>(Unknown Source)
at org.infinity.resource.itm.Ability.read(Unknown Source)
at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
at org.infinity.resource.AbstractAbility.<init>(Unknown Source)
at org.infinity.resource.itm.Ability.<init>(Unknown Source)
at org.infinity.resource.itm.ItmResource.read(Unknown Source)
at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
at org.infinity.resource.itm.ItmResource.<init>(Unknown Source)
... 49 more
EDIT: Removing existing effects, adding the item ability and then adding effects seems to work. Is it a case of offsets not setting right if abilities and effects aren't added in a certain order?
@rkocour Thanks for the report. I was able to reproduce this issue.
You're right, currently abilities and global effects must be added in the correct order to an item that doesn't contain any abilities yet (add ability first). Otherwise the resource is corrupted when adding ability effects. Btw, SPL resources are affected by this issue as well.
I've been told that the Animation field (CRE files, offset 0x28) is just 2 bytes long (instead of 4). The other two bytes are unused...? Calling @Bubb for confirmation...
Comments
If 'Parameter1' is 65536, it will deal damage while the target's current HP is between 0 and 50, 100 and 150, 200 and 250, etc...
If 'Parameter1' is 131072, it will deal damage while the target's current HP is between 0 and 25, 50 and 75, 100 and 125, etc...
Both at a rate of 1/s. Dropping out of those ranges does not end the effect, damage will resume if they are later healed/damaged back into one of those ranges.
This function (param2=1) was intended to damage a target for a total given percentage of maximum health (See description on Arrows of Biting), but has never worked that way, and is why it's mechanics are so weird.
The arrows, in their current form, damage a target until their current HP < 3.33 (100 / 30) , or their duration expires (it's on redmine somewhere, if they haven't purged it yet).
In the EE's, op25, 78, and 98 share the same p2=1 behavior.
In the EE's, op272 does not AFAIK have any function when p2=1, thought the effect is still present (it doesn't just instantly terminate), and will generate a portrait icon is special is non-zero.
What about p2=0,2,3,4 and the special field? Do they share the same behavior?
If I got it right, the only difference between op#25, #78, #98 and #272 should be the relation with opcode #329 (which affects only op#25) and that detail about p2=1 and op#272 – Is that correct?
The other major difference is op78 (Disease) p2 values 4-13, which are completely unrelated to the other 3 opcodes. Used for ability score drain, mold touch, slow, and contagion.
The ability score drain effects are rather simple - reduces said ability score by 'parameter1'.
The Slow effect is no different from that caused by op40, including it's stacking interaction with haste, except that it is blocked/removed as a disease, not as a slow effect.
Contagion is a composite of Strength, Dexterity, Charisma drain and the Slow effect, each ability score reduced by 'parameter1'.
Mold touch is complicated and not consisted across the EE games (it currently does not match what is mentioned on IESDP), but the general idea is that it deals (x or xd6) damage and applies the resource SPL every (round or second) for either 1 round (single) or across multiple rounds dealing less each round (decrement).
Unlike the other 3 opcodes, this one lacks the behavior that involves EFF files and 'Parameter3', right?
I see, so NI's description of the special field is wrong too...
When you say it deals (x or xd6) damage, that 'x' is 'parameter1', right?
If p2=12(decrement), it depends on the game:
IWDEE uses 'parameter1' for x, and calculates duration as (6 * parameter1).
BGEE calculates x from (duration / 6). (I think BG2EE uses this one as well).
If you set (duration = 6 * parameter1) it should junction the same in both games.
'parameter4' determines whether it deals damage every second or every round, and whether it deals x or xd6 damage.
p4 = 0 = xd6 per round.
p4 = 65536+ (even) = x per round.
p4 = 65537+ (odd) = x per second.
regardless, the value of x decrements only once per round.
Thank you, everything is hopefully clear now...
I've got other questions though:
Each sets a different STAT (218:88, 314:199), important for detecting them through scripts.
#314 doesn't support the dice values or a customizable portrait Icon through the Special Field.
The Juggernaut Golem 'TOMEGOL4.CRE' is scripted by 'TOMEGOL4.BCS' to Kill() itself if its Summoner and none of the Players Party have stat #199 set to a non-zero value.
Stat 199 can also be set by op282 (Modify Scripting States), though is not officially supported, setting it this way provides all the benefits of stoneskin, but it does not decrement, nor does it provide the "stone" overlay color. I don't see such behavior in my game, whether op39 is used for sleep or unconsciousness.
STATE_REALLY_DEAD should be 0x00000FC0 in STATE.IDS Unused AFAIK. Yes. Sadly yes (both), it even overrides the entries in EFFTEXT.2DA.
I cant start Ant -> that program should compile? I dont know now anything.
Please help
That my NearInfinite dir: https://imgur.com/a/UXho8Vp
But it's not really necessary to build NI yourself unless you want to modify the sources or test the latest experimental changes. Precompiled binaries can be downloaded from the link in the first post of this thread.
A new version is available after a long wait, which provides a great number of new features, various improvements and many bugfixes. You can find out more in the changelog below.
Many thanks to Mingun for his contributions over the past two years.
Changelog:
The same should hold for opcode #1 (Modify attacks per round) too...
Moreover, I'd rename op#318 and op#324 to "Protection from resource" and "Immunity to resource and message" respectively (they can block SPL, ITM and EFF files). Op#206 instead can block SPL and EFF files (but only if "Resource type" is 1 – Spell), so I'd leave "Protection from spell" here...
Sounds reasonable. Will be fixed.
I see. The "problem" is that once you save changes, NI displays "Error (-2)" (or whatever value you put)... I know it's a purely cosmetic issue, but still kinda bad...?
The central element of the search feature are filter definitions. Filters can be used to define search options for specific resource fields or groups of fields with similar properties and provides a great number of options to match field values.
There is virtually no limit to how many filters can be defined, which makes it possible to build rather complex filter chains.
The whole search configuration can be exported and imported as xml data, so you don't have to build it time and again when you want to search for resources with the same kind of properties.
The main search dialog:
The upper section contains the filter list. In this example the filter list is set up to find only items that are exclusively usable by shamans.
The dialog for setting up individual filter entries:
The structure level defines where to search for the resource fields. In this example only global Effect structures are searched.
The field section deals with field names of the structure. It is possible to search by name or by (relative or absolute) offsets.
The value section deals with the field values themselves. The filter dialog provides options to search for text (in the broadest sense), numeric values or ranges of values, resource references or bitfields (useful to target specific flags or flag combinations).
The bottom-most option "Invert match" inverts the search result for this filter, so only resource fields NOT matching the specified definitions will be added.
It should now reflect the current state of Near Infinity's feature set. Several outdated links have been fixed, and documentation for the upcoming "Advanced Search" has been added.
Changelog:
Changelog:
Was just searching now and noticed this bug remains:
Changelog:
Even copying an ability from an existing item to the item in question, corrupts the file. The following errors throw in the debug console. I'm curious if i'm missing something obvious.
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
at org.infinity.resource.ResourceFactory.getResource(Unknown Source)
at org.infinity.resource.ResourceFactory.getResource(Unknown Source)
at org.infinity.gui.ResourceTree.valueChanged(Unknown Source)
at java.desktop/javax.swing.JTree.fireValueChanged(JTree.java:2967)
at java.desktop/javax.swing.JTree$TreeSelectionRedirector.valueChanged(JTree.java:3456)
at java.desktop/javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:641)
at java.desktop/javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1111)
at java.desktop/javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(DefaultTreeSelectionModel.java:297)
at java.desktop/javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(DefaultTreeSelectionModel.java:191)
at java.desktop/javax.swing.JTree.setSelectionPath(JTree.java:1656)
at java.desktop/javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(BasicTreeUI.java:2736)
at java.desktop/javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:4016)
at java.desktop/javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3955)
at java.desktop/java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:287)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6633)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6401)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5012)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4919)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4545)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4489)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2764)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.nio.BufferUnderflowException
at java.base/java.nio.Buffer.nextGetIndex(Buffer.java:690)
at java.base/java.nio.HeapByteBuffer.get(HeapByteBuffer.java:164)
at org.infinity.datatype.Bitmap.read(Unknown Source)
at org.infinity.datatype.Bitmap.<init>(Unknown Source)
at org.infinity.resource.itm.Ability.read(Unknown Source)
at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
at org.infinity.resource.AbstractAbility.<init>(Unknown Source)
at org.infinity.resource.itm.Ability.<init>(Unknown Source)
at org.infinity.resource.itm.ItmResource.read(Unknown Source)
at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
at org.infinity.resource.itm.ItmResource.<init>(Unknown Source)
... 49 more
EDIT: Removing existing effects, adding the item ability and then adding effects seems to work. Is it a case of offsets not setting right if abilities and effects aren't added in a certain order?
You're right, currently abilities and global effects must be added in the correct order to an item that doesn't contain any abilities yet (add ability first). Otherwise the resource is corrupted when adding ability effects. Btw, SPL resources are affected by this issue as well.
I'll see if I can fix it.