yep, didnt work
Printable View
yep, didnt work
Im sorry, but i cant reproduce your error.
When i press "Save config" it saves the server path in config file.
Do you get an error, cant read config file?
lol i think this i a important error, it annoying always to set server path again =)
The other error in loading files, i set up all values to max. 2000. maybe i have to count all files and then set the dimensions of my variables. lol
I started programming Vbasic with PriTaTor lol
so the old code is kind of mess.
But if i rewrite the old code, i have to chance the complete handling in PriTaTor, i think this is to much work(5000+ code lines). so i just try to fix all error and try to make it more robust against Exceptions.
Thats why i wrote a programmpart to catch Exceptions and write to error.log=)
Thanks for using PriTaTor=)
the program save the config, cuz when it start and i check, the server path is correct but the data didnt load until i choose the server path again with the server path button.
wow, 5000 lines thats alot, gj
it dont load the data automaitc, you have to press reload=)
maybe this is the problem?^^
jaja, noob me, yep, i didnt touch that button cuz i was afraid, in the last versions, everytime i pressed it the program made an error of execution and closed it self but it is working well now :)
I have another problem:
I made a totally new custom map that is remplacing another, and when i choose this map an error pops up and the detail of it is:
**********************************************************************************************************************
See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.
************** Exception Text **************
System.ArgumentOutOfRangeException: Index and count must refer to a location within the string.
Parameter name: count
at System.String.Remove(Int32 startIndex, Int32 count)
at PriTaTor.PriTaEditor.MapAuswertung(Int64 MapIndex)
at PriTaTor.PriTaEditor.lbFilesMaps_SelectedIndexChanged(Object sender, EventArgs e)
at System.Windows.Forms.ListBox.OnSelectedIndexChanged(EventArgs e)
at System.Windows.Forms.ListBox.WmReflectCommand(Message& m)
at System.Windows.Forms.ListBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** Loaded Assemblies **************
mscorlib
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
PriTaTor
Assembly Version: 1.3.648.0
Win32 Version: 1.3.648.0
CodeBase: file:///D:/AgeOfPristonTale%20server/AgeOfPristonTale/PriTaTor_1.8.800.exe
----------------------------------------
Microsoft.VisualBasic
Assembly Version: 8.0.0.0
Win32 Version: 8.0.50727.3053 (netfxsp.050727-3000)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Microsoft.VisualBasic/8.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
----------------------------------------
System
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Windows.Forms
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Runtime.Remoting
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Runtime.Remoting/2.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
----------------------------------------
System.Configuration
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
Accessibility
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Accessibility/2.0.0.0__b03f5f7f11d50a3a/Accessibility.dll
----------------------------------------
System.Management
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Management/2.0.0.0__b03f5f7f11d50a3a/System.Management.dll
----------------------------------------
************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.
For example:
<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>
When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.
**********************************************************************************************************************
What should i change to fix that cuz i made the map and i dont know what needs the pritator to work with this new map.
PriTaTor without mapfiles.
Just some little fixes, like NPC editor find all .npc and .inx files.
I found a bug in adding new NPC, it says, he cant find the new NPC file.
Please press reload and then it should work. i duno where exacly the problem is =)
Please use this version, because it give me more information about an error.
I also catched the map error SoyEdu had.
Attachment 70896
Dumomo, you should add some error handling in your application.
This all to make your application crash less!Code:Try
txtResult.Text = Encrypt(Amount.Text) 'Error occurs if field is empty.
Catch ex As Exception 'There are different kinds of exceptions; e.g. InvalidCastException
MessageBox.Show("Error Message", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
'Something to do after all the code in the catch is being executed
End Try
90% of my code catch the errors and write it to the error.log file.
But some parts i forgott to catch, because i cant catch all. lol
Now i added some =) and it will give me more information about the crash xD
But thx for the tipp=)
still the error in the maps section when i choose my map:
Pritator window error: "Error! :Index and count must refer to a location within the string. Parameter name: count"
Error log:
"mi
About the error, i knew that i didnt fix it=)
but i needed to know why it happens, and i hope this error.log gives me more information =)
The other thing is, my programm dont support all maps, the rest maps ill add later to my programm.
Because i didnt got the correct coordinates of PT. PT use global coordinatessystem, not for each map=)
About excel export, i think this sould be possible.
U wand to export data in excel, and then u calculate something with this data and transfer back to PriTaTor?
I was also thinking about, to make a Item List generator, that can do a list of items u want with stats like Perf stats=) or all stats that are interesting for players.
I also was think about to make a monster list and map list generator.
It generates a list with monster exp, and atk pow... well just this thats that you selected.
Its maybe interesting for ppl with PT server and websites=)
I hope today ill get the error.
yes thats exactly what i was thinking off, but the export-import thing isnt to modify one by one, i was thinking in export what u said, a totally list of items for example, then u can modify that and import all the data back to pt, same for monster so u dont need to edit it one by one.
Ya, i know, the maps areint in different places in the pt world, they are all in near to the absolute Cero in the 3d world and they switched Y axis for Z axis.
I think this is a good idea, i will think about how to realise this.
I wrote a other programm, that can read and write into excel files.
But i think it will support excel 2007, i duno it excel 2003 will work, because i only have 2007 and the interface for VB.net =)
i will try it=) hehe
I would like to vote for CSV (instead or as-well) as this can be used in other (more powerful, more cheap, more varied) tools besides the one mentioned in posts above which I shall not advertise again. ;)
CSV is also really really easy to code, so I can't see this being a difficult task considering what you've already achieved. It would be a shame to get an .XLS (or worse .XLSX) and be hunting around for something that could turn it into a .CSV just because it hadn't occurred to anyone to build CSV export in, only M$ Ossif. lol
Yes... I know lots of on-line office products can do that now, and that's great, until you find yourself taking the file away to work on while on holiday on a USB stick and get there only to find there is no internet access and you don't have M$ Ossif (or the copy is like 5 years out of date) on your laptop. :`(
Or other equally improbable happenstance that invariably arises despite the odds against it... Come on... Admit it... we've all been in that place at least once. lol
(I've been following this thread silently till now BTW. And I must say, while I'm speaking. Great program, good show. :two thumbs:)
.csv is a easy file structure thats true=)
That will be a easy way to export files in other programms like excel.
thats a good idea =) thx :8:
btw. i found the bug that SoyEdu got, it seems it
ya sure, pm me ur email
lol, i got what was the error:
Pritator cant work with a map that has some monster in the spm if that monster doesnt exist in the gameserver, so i guess if that happends, the pritator should pick thouse monsters and should show you to remove this monsters or to get the correct monster files.
btw, i fixed the error commenting that monsters (with //) in the spm file
no=) if monster dont exist, PriTaTor will say and show it.
But i think the code in PriTaTor is not good to read the spm file.
Maybe is there is no spawn rate could make an error (ill test today)
or maybe there is no " in monster name, could make an error too.
fore sure is, PriTaTor try to remove a string.
Like
*Spawncode "Monster name" 20
now my code remove spawncode
rest is
"monster name" 20
now remove all not needed space (empty char)
"Monster name" 20
now get monster name "monster name"
and remove the monster name
Rest is:
20
now my code try to get the spawnrate
possible is, if something is not there, my code get error
im not sure, but ill test today =)
i think i have to optimize the code hehe
I don't suppose I could request that the window be small enough to fit on the screen (Which, on my server is a maximum 1024x768 as GFX isn't priority on a server system) instead of loosing a millimetre off the bottom under the start bar and 15mil off the right?
I can size it, but the controls don't scale according to the window, which is odd for a VB program. And I can run it off a public share via SMB on my game system over the network (1280x1024) but that's not the best way to run server tools either.
I always try to assume people don't have more than 800x600, but allow a UI to scale to 1600x1200 without difficulty.
And please keep up the good work Sumomo. PriTaTor crashes less than any other dotNET application I have ever used. lol So don't feel too bad about it.:thumbup: Do I need Map files to use the last release? As it does presently just crash when I try to load NPCs and my last version was 1.5.056. :(
Yes, map files are in older Version, i should add maps in each upload hehe.
Ok, i will try to 800x600 and resize function lol
but i duno how it works, i need to read about it xD but should be possible hehe.
this is the version with maps http://www.megaupload.com/?d=E9O82SMF
just replace the .exe with newest PriTaTor=)
Thx for use PriTaTor=)
Thanks Sumom. IDK if going down to 800x600 will be possible with some of the page control layouts you have there, but 1024x768 nearly fits, but not quite.
Did I say I just don't do dotNet? Well anyway, in classic VB you set controls alignment. So you would align to the left, right, centre or client of the parent control. Each control in the UI has a parent, even if it's only the window (Form in VBees) and the parent of the window is the display... which ever one it's presently on in a multi-display system.
Panes, panel objects and groups are often used as parents (usually pretty invisible to the user) for collections of similar controls to gain more control over the resizing process without programatically doing anything.
That is to say... yes, you can move and resize a control manually in the OnPaint() event, but that is a lot of work and usually produces pretty poor results, so it's best to avoid it unless you are looking for something really unusual looking. Like a scrolling banner or something.
I hope that at least some of this translates to VBdotNET. :s
hi guy!
I had been reset my system , Do I need to setup .NET for pritator ???
Depends on what system set-up you have. XP SP2 + Have DotNet 2.0 to some extent built in, Vista and Win7 have DotNet 3 or 3.5 in them (depending on service pack)... Windows 2K (and early XP releases) doesn't include (enforced) any DotNet, but has optional updates in the Automatic Updater for up to DotNet 2.5 or thereabouts IMS.
(Likewise it's possible to install later XP versions without DotNet, but you need to do a custom OEM install to manage it)
From personal experience (because I don't see the need for more than Win2K on a PT server) to get the DotNet framework to work for most of the custom server management tools for PT you actually need to install the DotNet 2 Framework SDK, not just the Redistributable or Automatic Update patch. IDK why, but for some reason 2K seems to be missing some packages.
Short answer, if it crashes, or fails to load, you probably need to update your .NET 2 framework. ^_^
Thank U , Thank U very much , Ur nice , I understand now ~!!
I mean was : you are good man ! You are warm-hearted !
Because I didn't understand what was going on until you explained it in detail to me !~
Hi ,guys ,I have a question , when to updata again for Pritator , that's a nice tool !!!
Settings:
Server-Path=// name server?
hi, can someone get the download exe + MAP files from here
http://www.megaupload.com/?d=E9O82SMF
then upload to rapidshare or filefront? I cant get into megaupload since they block outside of the US connection and my proxies are getting "file download exceeded for this IP".
Im currently using PriTaTor_1.8.857.exe and getting this error when using the NPC tab.
Looks like I am missing MAP files :grr:Code:See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.
************** Exception Text **************
System.IO.FileNotFoundException: C:\PTServer\Maps\error.bmp
at System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
at System.Drawing.Image.FromFile(String filename)
at PriTaTor.PriTaEditor.lbNPCMapFileList_SelectedIndexChanged(Object sender, EventArgs e)
at System.Windows.Forms.ListBox.OnSelectedIndexChanged(EventArgs e)
at System.Windows.Forms.ListBox.WmReflectCommand(Message& m)
at System.Windows.Forms.ListBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** Loaded Assemblies **************
mscorlib
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
PriTaTor
Assembly Version: 1.3.648.0
Win32 Version: 1.3.648.0
CodeBase: file:///C:/PTServer/PriTaTor_1.8.857.exe
----------------------------------------
Microsoft.VisualBasic
Assembly Version: 8.0.0.0
Win32 Version: 8.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Microsoft.VisualBasic/8.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
----------------------------------------
System
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Windows.Forms
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Configuration
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Runtime.Remoting
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Runtime.Remoting/2.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
----------------------------------------
Accessibility
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Accessibility/2.0.0.0__b03f5f7f11d50a3a/Accessibility.dll
----------------------------------------
************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.
For example:
<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>
When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.
Thanks
Map files come with the client you use. Copy the "Field" folder from your client to your server.
I can get the files from MegaUpload, but I can't upload to FileFront or RapidShare because I'm outside the US, and they give me pretty much the message you describe for MegaUpload, only for uploading... well, actually RapidShare just insists I register and pay them for the service... That's why I use MegaUpload... Here in the U.K. it's pretty fast.
I can use MediaFire or Uploading.com or DepositFiles.com if they are any help?
hey Bob, thanks I got the files I needed, just contacted a friend that lives in the US then he sent them to me via email.
I don't think the map files from the field folder works as they are not converted yet, maybe they need to be converted to BMP format prior to use? I don't know as I have not tried and since the problem is already resolved, I am moving on to other things.
Just figured I reply to give others heads up if they get the same error.
Thanks Again. :)
Ahh... those "maps" are in the last full release... the latest update is just that, and needs to be applied over the top of an existing installation.
Sorry for the confusion... I had it my self, because my last full install didn't have visual representations of NPC locations when I applied the update.
I don't know which file to download for the first time. I heard that I need the main one, then download the updates. Can somebody sort this out for me?
Okay, for a complete up-to-date copy of PriTaTor, you will need the following files:-
PriTaTor v1.8.800 full version.
PriTaTor v1.8.857 update.
Thanks Bobsobol ;)
Hello everyone=)
I need your help!
PriTaTor will manage all monsters/items and maps with SQL database.
This is a good idea, because its easy for everyone with some
SQL & webdesign skills to use this database to make a monster/items list on his webpage. it can even use for make some
statistics like chance of item drop in a map etc.
My problem is now, some values in monsters/items and maps can have
2 values(Min and max)
I need to now all propertys that can have 2 values. (monster/items and maps)
Thanks =)
(lucky im almost ready with studing and will go earn money soon)
In monster files the only low-high values I'm aware of are Pack(How many spawn at once), Attack Power, Special Hit Damage, and the drops.
Your are welcome to my Monster DataBase CSV, attached.
I have a basic program that produces it. Well, kinda 2 actually, one to turn all the little files into one long file with some translation and another to turn that into a CSV.
Still love PriTaTor.:thumbup1:
Cool xD
Thats nice
I work with SQL now, because its easyer to manage like search & filters.
and less errors for sure!
because i was working with very big array variables. its so complex atm thats hard to fix errors and add new functions.
i hope with database the coding will be more easy =)
My PriTraTor never worked so I just kept doing everything root files, however I noticed you guys where talking that PriTraTor requires sql databases to work? ...Explain some more please? :)
The old version dont need SQL =) But there are a lot of bugs hehe
Now i will try to manage all monsters, items and maps with SQL database.
im sure there will be less bugs in PriTaTor =)
I will work with foreign keys to link monsters, items and maps to each other xD
Since we already have an MS-SQL database for the game, are you using that?
If I needed SQL queries, I'd probably run a little SQLite system, but I'd really like to:-
a) Liberate PT servers from MS-SQL (so you can use any DB_Engine)
b) Liberate PT from the Korean Text files (so all data is stored in whatever DBMS you choose to use with it.
If PriTaTor standardises a dataset for NPCs, Items, Monsters etc, I will probably follow that form for the main server.
The CSV was an attempt to see all the monster files in a single table without loosing any (used) data... I do loose the comments, but they are Korean anyway. XD
I'm sure server startup will be faster and less buggy accessing this data via SQL too.
I always look forward to new PriTaTor releases... and that says a lot for a .net-o-phobe like me. XD
Well atm i use SQLite xD
I like it, because it dont need big installation and its very fast hehe.
MSSQL need Passwords and have a lot of security problems like (Login to database fail) etc. hehe
Thanks bobsobol=)
I think that's a good choice.
It avoids the program putting any of the rest of the game database at any risk, and because SQLite is a small (embeddable, even) SQL engine, and not another full fledged DBMS, users don't have the hassle of trying to install MySQL or something as well as MS-SQL without conflicts.
If you wanted to use the MS-SQL engine that (at the moment) we all have to have anyway, you can create a new database instance, separate from the main game one. That keeps the game safe from PriTaTor and vise-vesa, but I agree that it's a pain in the bum to do. Both for you as the developer and in terms of end user support.
I've already said I probably wouldn't do that if I where in your shoes. XD Wanting to understand MS-SQL programming would be the only encouraging point of the exercise.
I notice that a lot of early posters here are very confused between MySQL and MS-SQL, not to mention the fact that most of us probably have one or two programs with SQLite or another mini-SQL embedded in them. So it's probably worth pointing out that your SQL usage isn't connected to the game, or clan systems SQL database, and that there are good reasons why it shouldn't be. :wink:
Here is my first version of my database.
Just a preview, (Monster and Items)
Atm im not sure, how to manage the monster drops (foreign keys)
Its n:m and more than that lol, the monster drops are tables in tabels.
Its a SQLite Database, can view with "SQLite Database Browser" =)
Attachment 76279
Tables within tables is what relational databases excel at. XD
Monster drops... Example, Sen:-아이템카운터 = Number of items dropped per kill (IMS)Code://몬스터가 떨어뜨리는 아이템 설정 블럭
*아이템카운터 1
*아이템 2100 없음
*아이템 4000 돈 8 14
*아이템 1000 pl101 ps101 pl101
*아이템 1500 da102 da202 wa101 wh101 wm101 ws101 wp101 om101 pl101 ps101 or101
*아이템 800 da103 da203 wa102 wc102 wh102 wm102 ws102 ws202 wp102 om102 or102 oa102 os102
*아이템 400 da104 da204 wa103 wc103 wh103 wm103 ws103 ws203 wp103 om103 or103 oa103 os103
*아이템 200 wa104 wc104 wh104 wm104 ws104 ws204 wp104 om104 or104 oa104 os103 gp109
아이템 = Drop item set. Chance followed by item list.
If the item list entry is 돈 then that's a gold drop, followed by Maximum and then Minimum.
If the item list entry is 없음 then nothing is dropped... that the chance of getting no drop.
Other than that, the server should add all the chances together, roll a random number between 0 and the total, and depending on what number it gets it will pick 1 item from the row which corresponds to that chance weight.
2100 + 4000 + 1000 + 1500 + 800 + 400 + 200 = 10000. So in this case (and I think most of the original jPT monsters add up this way) you can consider the chances 21%, 40%, 10%, 15%, 8%, 4% and 2%You already know how to look up an item name from it's item code, because PriTaTor already does this.
If you want to dip out of using full relational-database functionality, you can store the items as a string with separation character... you know how in Basic you can turn a string into an array so that you get an array of 5 Integers from "5|3|2|1|4"... depending on the dialect you can select the element separator character. The Basic normal is a bar symbol "|", but common alternatives are a comma "," a semi-colon ";" a tab character or a space.
If vb.net is ghey enough not to support a built in you can make a UDF pretty easy, I'm sure. XD
However, you can have a table of Drop Lists, and a table of linked lists.... Linked lists indexed against monsters, listing each drop list (all items of the same drop chance / weight), Drop Lists equating to a single weight value (or drop chance) and a list of item codes.
The biggest problem with this is that, in the standard jPT release server, there are not many items in a row, and the same item never appears twice in a single row, and no row has the same chance / weight.
Custom server files are usually a complete mess, and do not follow these guiding philosophies. :s
Alternatively you could have a very large table with very few columns, containing "monster", "chance", "item". You can SELECT on "monster" and reconstruct all the drops of the same "chance". This is probably more work for the SQL engine and less work for PriTaTor. eg. not exactly optimal in CPU time, but logically easier to manage.
I know when I looked at it, I was in a quandary as to whether to preserve the exact rows in the text file, or just their meaning. So if there are 2 rows both with a chance of "2100" should I store two rows, or just store all the items in one record, as their weight is the same.
What does this dropcode means?!
*¾ÆÀÌÅÛ¸ðµÎ
It doesn't mean anything.
I think that line of smeg is *아이템카운터 in the wrong code page though. XD
*아이템카운터 is explained in my previous post.
A fair translation of 아이템카운터 would be "Item Count"
thanks =) so i will ignore this code hehe
in most of the monsters it´s just a comment //*¾ÆÀÌÅÛ¸ðµÎ .
Reading monster and items files into database take almost 1 minute (700 items 300 monsters) lol
beause i have to clean so many things lol.
Some txt files use tab, some use many space chars. so i have to clean all
lines, but its working xD
so sad i dont have more time hehe, so tired when im home from work and then need to learn and then some (1-2) hours for PriTaTor. hehe
I wouldn't "ignore it" as such. Presumably the default drop count is 1, so if the line isn't there, or is commented out there is 1 drop roll for a kill of this kind.
Almost all of the * options in monster files have some default... and when I wrote my program I started with a set of default values (usually 1, 0, "" or something of the sort) and if I find * commands which override them, then I fill in the true value from that.
Yes, the files are messy.. but you can skip any line which starts "//" or "#", or you can simply process only lines which start "*"
Of those lines string search and replace Tab for Space, then Space Space for Space (excluding any space characters in double quotes) and it gets clean pretty quick.
Would you like me to knock up a PT file cleaner in a Basic dialect? It won't be vb.net, but I imagine you know enough by now to make any minor adjustments.
It's a shame they didn't use a standard Windows INI file format though. :(: That would make processing a lot easier, as there are already many handlers for this format.
I dont ignore the line, i got the dropcount already.
This code dont have any value behind, so i dont know what this do =)
Just look this part of code hehe
It transfere all items into database table "items"
the function: Funktionen.SUmwandlung.StringVorbereitung(string) clean the string (tab, space etc.) and seperate all with just one space char)
CZahl will convert string to a number (double or integer), i need to write it myself, because, if vbasic fails to convert a string into a number, it throw a exception.
I think PriTaTor will get more then 6000 code lines hehe.
Its just hard to test it all myself xD
Some parts of my code is in german, because im from german and i wrote
some functions/class/sub with german names xD
Code:Shared Sub ItemsEinspielen()
PriTaEditor.lblProg.Text = "Writing table: Items"
PriTaEditor.lblProg.Refresh()
Dim x As Integer = 0
Dim xx As Integer = 0
Dim selecteditem As Integer
Dim SQLComm As New SQLite.SQLiteCommand("", SQLConn)
Dim SQLParameter As SQLite.SQLiteParameter
Dim prozent As Double = (100 / PriTaEditor.ItemFound.Text)
Dim Fortschritt As Double
SQLComm.Parameters.Clear()
SQLComm.Connection.Open()
SQLTrans = SQLComm.Connection.BeginTransaction
SQLComm.Parameters.Clear()
SQLComm.Parameters.Add("@Item_JPName", DbType.AnsiString)
SQLComm.Parameters.Add("@Item_Name", DbType.AnsiString)
SQLComm.Parameters.Add("@Item_Code", DbType.AnsiString)
SQLComm.Parameters.Add("@Item_QuestID", DbType.AnsiString)
SQLComm.Parameters.Add("@Item_GlowColor", DbType.AnsiString)
SQLComm.Parameters.Add("@Item_IntegrityMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_IntegrityMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_Weight", DbType.Int32)
SQLComm.Parameters.Add("@Item_Price", DbType.Int32)
SQLComm.Parameters.Add("@Item_ResiOrganicMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_ResiOrganicMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_ResiFireMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_ResiFireMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_ResiFrostMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_ResiFrostMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_ResiLightingMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_ResiLightingMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_ResiPoisonMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_ResiPoisonMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_HPRecoveryMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_HPRecoveryMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_MPRecoveryMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_MPRecoveryMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_STMRecoveryMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_STMRecoveryMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_PoitionStore", DbType.Int32)
SQLComm.Parameters.Add("@Item_AttackPowerMinMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_AttackPowerMinMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_AttackPowerMaxMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_AttackPowerMaxMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_AttackRange", DbType.Int32)
SQLComm.Parameters.Add("@Item_AttackSpeed", DbType.Int32)
SQLComm.Parameters.Add("@Item_AttackRatingMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_AttackRatingMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_AttackCriticalRating", DbType.Int32)
SQLComm.Parameters.Add("@Item_AbsorbMin", DbType.Double)
SQLComm.Parameters.Add("@Item_AbsorbMax", DbType.Double)
SQLComm.Parameters.Add("@Item_DefenceMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_DefenceMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_BlockMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_BlockMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_SpecAttackSpeed", DbType.Int32)
SQLComm.Parameters.Add("@Item_SpecCriticalRating", DbType.Int32)
SQLComm.Parameters.Add("@Item_SpecAttackPowerMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_SpecAttackPowerMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_SpecAttackRatingMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_SpecAttackRatingMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_SpecAbsorbMin", DbType.Double)
SQLComm.Parameters.Add("@Item_SpecAbsorbMax", DbType.Double)
SQLComm.Parameters.Add("@Item_SpecDefenceMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_SpecDefenceMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_SpecBlock", DbType.Int32)
SQLComm.Parameters.Add("@Item_SpecHPRecoveryMin", DbType.Double)
SQLComm.Parameters.Add("@Item_SpecHPRecoveryMax", DbType.Double)
SQLComm.Parameters.Add("@Item_SpecMPRecoveryMin", DbType.Double)
SQLComm.Parameters.Add("@Item_SpecMPRecoveryMax", DbType.Double)
SQLComm.Parameters.Add("@Item_SpecRunSpeedMin", DbType.Double)
SQLComm.Parameters.Add("@Item_SpecRunSpeedMax", DbType.Double)
SQLComm.Parameters.Add("@Item_SpecAttackRange", DbType.Int32)
SQLComm.Parameters.Add("@Item_RunSpeedMin", DbType.Double)
SQLComm.Parameters.Add("@Item_RunSpeedMax", DbType.Double)
SQLComm.Parameters.Add("@Item_HPRegenMin", DbType.Double)
SQLComm.Parameters.Add("@Item_HPRegenMax", DbType.Double)
SQLComm.Parameters.Add("@Item_MPRegenMin", DbType.Double)
SQLComm.Parameters.Add("@Item_MPRegenMax", DbType.Double)
SQLComm.Parameters.Add("@Item_STMRegenMin", DbType.Double)
SQLComm.Parameters.Add("@Item_STMRegenMax", DbType.Double)
SQLComm.Parameters.Add("@Item_HPAddMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_HPAddMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_MPAddMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_MPAddMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_STMAddMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_STMAddMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_MagicAPTMin", DbType.Int32)
SQLComm.Parameters.Add("@Item_MagicAPTMax", DbType.Int32)
SQLComm.Parameters.Add("@Item_Level", DbType.Int32)
SQLComm.Parameters.Add("@Item_Strengh", DbType.Int32)
SQLComm.Parameters.Add("@Item_Spirit", DbType.Int32)
SQLComm.Parameters.Add("@Item_Talent", DbType.Int32)
SQLComm.Parameters.Add("@Item_Agility", DbType.Int32)
SQLComm.Parameters.Add("@Item_Health", DbType.Int32)
SQLComm.Parameters.Add("@Item_PrimarySpec", DbType.AnsiString)
SQLComm.Parameters.Add("@Item_SecondarySpec", DbType.AnsiString)
SQLComm.Parameters.Add("@Item_FileName", DbType.AnsiString)
SQLComm.Parameters.Add("@Item_Datestamp", DbType.DateTime)
Do Until ItemFiles(xx) = Nothing
selecteditem = GetItemIndex(ItemFiles(xx))
x = 0
For Each SQLParameter In SQLComm.Parameters
SQLParameter.Value = Nothing
Next
SQLComm.Parameters("@Item_Code").Value = ItemCodes(xx).Replace(Chr(34), "").ToUpper
Do Until ItemDatenListe(selecteditem, x) = "End of File"
If ItemDatenListe(selecteditem, x).StartsWith("*") Then
If ItemDatenListe(selecteditem, x).StartsWith(ItemAbs) Then
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemAbs)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_AbsorbMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_AbsorbMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_AbsorbMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_AbsorbMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemJPName) Then
SQLComm.Parameters("@Item_JPName").Value = ItemDatenListe(selecteditem, x).Substring(Len(ItemJPName)).Trim
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemEngName) Then
SQLComm.Parameters("@Item_Name").Value = ItemDatenListe(selecteditem, x).Substring(Len(ItemEngName)).Trim.Replace(" ", " ").Replace(vbTab, " ")
End If
' tbItmInGameNAme.Text = ItemName(SelectedItem)
If ItemDatenListe(selecteditem, x).StartsWith(ItemQuest) Then
If ItemDatenListe(selecteditem, x).StartsWith(ItemColor) Then
SQLComm.Parameters("@Item_GlowColor").Value = ItemDatenListe(selecteditem, x).Substring(Len(ItemColor)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Else
SQLComm.Parameters("@Item_QuestID").Value = ItemDatenListe(selecteditem, x).Substring(Len(ItemQuest)).Trim.Replace(" ", " ").Replace(vbTab, " ")
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemIntegrity) Then
' tbItmIntegrity.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemIntegrity)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemIntegrity)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_IntegrityMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_IntegrityMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_IntegrityMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_IntegrityMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemWeight) Then
''tbItmWeight.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemWeight)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemWeight)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_Weight").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemPrise) Then
' tbItmPrice.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemPrise)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemPrise)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_Price").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemOrganic) Then
'tbItmOrganic.Text = ItemDatenListe(selecteditem, x).Substring(Len(ItemOrganic)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemOrganic)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_ResiOrganicMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_ResiOrganicMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_ResiOrganicMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_ResiOrganicMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemFire) Then
'tbItmFire.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemFire)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemFire)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_ResiFireMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_ResiFireMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_ResiFireMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_ResiFireMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemFrost) Then
'tbItmFrost.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemFrost)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemFrost)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_ResiFrostMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_ResiFrostMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_ResiFrostMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_ResiFrostMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemLighting) Then
'tbItmLighting.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemLighting)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemLighting)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_ResiLightingMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_ResiLightingMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_ResiLightingMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_ResiLightingMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemPosion) Then
'tbItmPoision.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemPosion)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemPosion)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_ResiPoisonMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_ResiPoisonMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_ResiPoisonMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_ResiPoisonMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemHPREC) Then
'tbItmHPRec.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemHPREC)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemHPREC)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_HPRecoveryMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_HPRecoveryMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_HPRecoveryMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_HPRecoveryMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemMPREC) Then
'tbItmManaRec.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemMPREC)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemMPREC)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_MPRecoveryMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_MPRecoveryMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_MPRecoveryMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_MPRecoveryMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemSTMREC) Then
'tbItmStmRec.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemSTMREC)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemSTMREC)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_STMRecoveryMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_STMRecoveryMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_STMRecoveryMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_STMRecoveryMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemPotStore) Then
'tbItmPots.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemPotStore)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemPotStore)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_PoitionStore").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemAtkPower) Then
'tbItmAtkPow.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemAtkPower)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemAtkPower)).Trim).Split(" ")
SQLComm.Parameters("@Item_AttackPowerMinMin").Value = Nothing
SQLComm.Parameters("@Item_AttackPowerMinMax").Value = Nothing
SQLComm.Parameters("@Item_AttackPowerMaxMin").Value = Nothing
SQLComm.Parameters("@Item_AttackPowerMaxMax").Value = Nothing
If Not Spl(0) = "" Then
For i As Integer = 0 To Spl.Length - 1
If i = 0 Then SQLComm.Parameters("@Item_AttackPowerMinMin").Value = Spl(i)
If i = 1 Then SQLComm.Parameters("@Item_AttackPowerMinMax").Value = Spl(i)
If i = 2 Then SQLComm.Parameters("@Item_AttackPowerMaxMin").Value = Spl(i)
If i = 3 Then SQLComm.Parameters("@Item_AttackPowerMaxMax").Value = Spl(i)
Next
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemAtkRange) Then
'tbItmRange.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemAtkRange)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemAtkRange)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_AttackRange").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemAtkSpeed) Then
'tbItmSpeed.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemAtkSpeed)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemAtkSpeed)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_AttackSpeed").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemAtkRating) Then
'tbItmAtkRtg.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemAtkRating)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemAtkRating)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_AttackRatingMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_AttackRatingMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_AttackRatingMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_AttackRatingMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemAtkCrit) Then
'tbItmCrtRtg.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemAtkCrit)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemAtkCrit)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_AttackCriticalRating").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemDef) Then
'tbItmdef.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemDef)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemDef)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_DefenceMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_DefenceMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_DefenceMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_DefenceMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemBlock) Then
'tbItmBlk.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemBlock)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemBlock)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_BlockMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_BlockMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_BlockMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_BlockMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemSpAtkSPeed) Then
'tbItmSPatkSpd.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemSpAtkSPeed)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemSpAtkSPeed)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_SpecAttackSpeed").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemSpAtkCrit) Then
'tbItmSPCrt.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemSpAtkCrit)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemSpAtkCrit)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_SpecCriticalRating").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemSpPowerLV) Then
'tbItmSPLvl.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemSpPowerLV)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemSpPowerLV)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_SpecAttackPowerMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_SpecAttackPowerMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_SpecAttackPowerMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_SpecAttackPowerMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemSpRatingLv) Then
'tbItmSPRtg.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemSpRatingLv)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemSpRatingLv)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_SpecAttackRatingMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_SpecAttackRatingMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_SpecAttackRatingMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_SpecAttackRatingMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemSpAbs) Then
'tbItmSPabs.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemSpAbs)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemSpAbs)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_SpecAbsorbMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_SpecAbsorbMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_SpecAbsorbMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_SpecAbsorbMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemSpDef) Then
'tbItmSPdef.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemSpDef)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemSpDef)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_SpecDefenceMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_SpecDefenceMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_SpecDefenceMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_SpecDefenceMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemSpBlock) Then
'tbItmSPblk.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemBlock)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemBlock)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_SpecBlock").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemSpHPRegen) Then
'tbItmSPdef.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemSpHPRegen)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemSpHPRegen)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_SpecHPRecoveryMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_SpecHPRecoveryMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_SpecHPRecoveryMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_SpecHPRecoveryMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemSpMPRegen) Then
'tbItmSPMp.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemSpMPRegen)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemSpMPRegen)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_SpecMPRecoveryMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_SpecMPRecoveryMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_SpecMPRecoveryMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_SpecMPRecoveryMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemSPSpeed) Then
' tbItmSPRun.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemSPSpeed)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemSPSpeed)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_SpecRunSpeedMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_SpecRunSpeedMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_SpecRunSpeedMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_SpecRunSpeedMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemSPRange) Then
'tbItmSPRange.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemSPRange)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemSPRange)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_SpecAttackRange").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemRunSpeed) Then
'tbItmRun.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemRunSpeed)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemRunSpeed)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_RunSpeedMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_RunSpeedMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_RunSpeedMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_RunSpeedMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemHPRegen) Then
'tbItmHPRegen.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemHPRegen)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemHPRegen)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_HPRegenMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_HPRegenMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_HPRegenMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_HPRegenMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemMPRegen) Then
'tbItmMPRegen.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemMPRegen)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemMPRegen)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_MPRegenMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_MPRegenMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_MPRegenMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_MPRegenMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemSTMRegen) Then
'tbItmSTMRegen.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemSTMRegen)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemSTMRegen)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_STMRegenMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_STMRegenMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_STMRegenMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_STMRegenMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemHPAdd) Then
'tbItmHPAdd.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemHPAdd)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemHPAdd)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_HPAddMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_HPAddMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_HPAddMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_HPAddMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemMPAdd) Then
'tbItmMPAdd.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemMPAdd)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemMPAdd)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_MPAddMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_MPAddMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_MPAddMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_MPAddMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemSTMAdd) Then
'tbItmSTMAdd.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemSTMAdd)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemMPAdd)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_STMAddMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_STMAddMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_STMAddMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_STMAddMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemAPT) Then
'tbItmAPT.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemAPT)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim Spl() As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(Len(ItemAPT)).Trim).Split(" ")
If Not Spl(0) = "" Then
If Spl.Length > 1 Then
SQLComm.Parameters("@Item_MagicAPTMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_MagicAPTMax").Value = CZahl(Spl(1))
Else
SQLComm.Parameters("@Item_MagicAPTMin").Value = CZahl(Spl(0))
SQLComm.Parameters("@Item_MagicAPTMax").Value = Nothing
End If
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemLevel) Then
' 'tbItmLevel.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemLevel)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemLevel)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_Level").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemStr) Then
'tbItmStr.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemStr)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemStr)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_Strengh").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemSpirit) Then
'tbItmSpirit.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemSpirit)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemSpirit)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_Spirit").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemTalent) Then
'tbItmTalent.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemTalent)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemTalent)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_Talent").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemAgility) Then
' tbItmAgi.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemAgility)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemAgility)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_Agility").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemHPReq) Then
'tbItmreqHP.Text = ItemDatenListe(SelectedItem, x).Substring(Len(ItemHPReq)).Trim.Replace(" ", " ").Replace(vbTab, " ")
Dim wert As Double = CZahl(ItemDatenListe(selecteditem, x).Substring(Len(ItemHPReq)).Trim.Replace(" ", " ").Replace(vbTab, " "))
If Not wert = Nothing Then
SQLComm.Parameters("@Item_Health").Value = wert
End If
End If
If ItemDatenListe(selecteditem, x).StartsWith(ItemPriSpec) Then
If ItemDatenListe(selecteditem, x).StartsWith(ItemSecSpec) Then
Dim wert As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(ItemSecSpec.Length).Trim)
SQLComm.Parameters("@Item_SecondarySpec").Value = wert
Else
Dim wert As String = Funktionen.SUmwandlung.StringVorbereitung(ItemDatenListe(selecteditem, x).Substring(ItemPriSpec.Length).Trim)
SQLComm.Parameters("@Item_PrimarySpec").Value = wert
End If
End If
End If
x = x + 1
Loop
SQLComm.Parameters("@Item_FileName").Value = ItemFiles(xx)
SQLComm.Parameters("@Item_Datestamp").Value = Date.Now
SQLComm.CommandText = "update items set " & _
"Item_JPName=@Item_JPName," & _
"Item_Name=@Item_Name," & _
"Item_Code=@Item_Code," & _
"Item_QuestID=@Item_QuestID," & _
"Item_GlowColor=@Item_GlowColor," & _
"Item_IntegrityMin=@Item_IntegrityMin," & _
"Item_IntegrityMax=@Item_IntegrityMax," & _
"Item_Weight=@Item_Weight," & _
"Item_Price=@Item_Price," & _
"Item_ResiOrganicMin=@Item_ResiOrganicMin," & _
"Item_ResiOrganicMax=@Item_ResiOrganicMax," & _
"Item_ResiFireMin=@Item_ResiFireMin," & _
"Item_ResiFireMax=@Item_ResiFireMax," & _
"Item_ResiLightingMin=@Item_ResiLightingMin," & _
"Item_ResiLightingMax=@Item_ResiLightingMax," & _
"Item_ResiPoisonMin=@Item_ResiPoisonMin," & _
"Item_ResiPoisonMax=@Item_ResiPoisonMax," & _
"Item_HPRecoveryMin=@Item_HPRecoveryMin," & _
"Item_HPRecoveryMax=@Item_HPRecoveryMax," & _
"Item_MPRecoveryMin=@Item_MPRecoveryMin," & _
"Item_MPRecoveryMax=@Item_MPRecoveryMax," & _
"Item_STMRecoveryMin=@Item_STMRecoveryMin," & _
"Item_STMRecoveryMax=@Item_STMRecoveryMax," & _
"Item_PoitionStore=@Item_PoitionStore," & _
"Item_AttackPowerMinMin=@Item_AttackPowerMinMin," & _
"Item_AttackPowerMinMax=@Item_AttackPowerMinMax," & _
"Item_AttackPowerMaxMin=@Item_AttackPowerMaxMin," & _
"Item_AttackPowerMaxMax=@Item_AttackPowerMaxMax," & _
"Item_AttackRange=@Item_AttackRange," & _
"Item_AttackSpeed=@Item_AttackSpeed," & _
"Item_AttackRatingMin=@Item_AttackRatingMin," & _
"Item_AttackRatingMax=@Item_AttackRatingMax," & _
"Item_AttackCriticalRating=@Item_AttackCriticalRating," & _
"Item_AbsorbMin=@Item_AbsorbMin," & _
"Item_AbsorbMax=@Item_AbsorbMax," & _
"Item_DefenceMin=@Item_DefenceMin," & _
"Item_DefenceMax=@Item_DefenceMax," & _
"Item_BlockMin=@Item_BlockMin," & _
"Item_BlockMax=@Item_BlockMax," & _
"Item_SpecAttackSpeed=@Item_SpecAttackSpeed," & _
"Item_SpecCriticalRating=@Item_SpecCriticalRating," & _
"Item_SpecAttackPowerMin=@Item_SpecAttackPowerMin," & _
"Item_SpecAttackPowerMax=@Item_SpecAttackPowerMax," & _
"Item_SpecAttackRatingMin=@Item_SpecAttackRatingMin," & _
"Item_SpecAttackRatingMax=@Item_SpecAttackRatingMax," & _
"Item_SpecAbsorbMin=@Item_SpecAbsorbMin," & _
"Item_SpecAbsorbMax=@Item_SpecAbsorbMax," & _
"Item_SpecDefenceMin=@Item_SpecDefenceMin," & _
"Item_SpecDefenceMax=@Item_SpecDefenceMax," & _
"Item_SpecBlock=@Item_SpecBlock," & _
"Item_SpecHPRecoveryMin=@Item_SpecHPRecoveryMin," & _
"Item_SpecHPRecoveryMax=@Item_SpecHPRecoveryMax," & _
"Item_SpecMPRecoveryMin=@Item_SpecMPRecoveryMin," & _
"Item_SpecMPRecoveryMax=@Item_SpecMPRecoveryMax," & _
"Item_SpecRunSpeedMin=@Item_SpecRunSpeedMin," & _
"Item_SpecRunSpeedMax=@Item_SpecRunSpeedMax," & _
"Item_SPecAttackRange=@Item_SpecAttackRange," & _
"Item_RunSpeedMin=@Item_RunSpeedMin," & _
"Item_RunSpeedMax=@Item_RunSpeedMax," & _
"Item_HPRegenMin=@Item_HPRegenMin," & _
"Item_HPRegenMax=@Item_HPRegenMax," & _
"Item_MPRegenMin=@Item_MPRegenMin," & _
"Item_MPRegenMax=@Item_MPRegenMax," & _
"Item_STMRegenMin=@Item_STMRegenMin," & _
"Item_STMRegenMax=@Item_STMRegenMax," & _
"Item_HPAddMin=@Item_HPAddMin," & _
"Item_HPAddMax=@Item_HPAddMax," & _
"Item_MPAddMin=@Item_MPAddMin," & _
"Item_MPAddMax=@Item_MPAddMax," & _
"Item_STMAddMin=@Item_STMAddMin," & _
"Item_STMAddMax=@Item_STMAddMax," & _
"Item_MagicAPTMin=@Item_MagicAPTMin," & _
"Item_MagicAPTMax=@Item_MagicAPTMax," & _
"Item_Level=@Item_Level," & _
"Item_Health=@Item_Health," & _
"Item_Spirit=@Item_Spirit," & _
"Item_Talent=@Item_Talent," & _
"Item_Agility=@Item_Agility," & _
"Item_Strengh=@Item_Strengh," & _
"Item_PrimarySpec=@Item_PrimarySpec," & _
"Item_SecondarySpec=@Item_SecondarySpec," & _
"Item_Datestamp=@Item_Datestamp " & _
" where Item_FileName=@Item_FileName"
Fortschritt = Fortschritt + prozent
PriTaEditor.pbWorking.Value = Fortschritt
PriTaEditor.pbWorking.Refresh()
SQLComm.ExecuteNonQuery()
xx = xx + 1
Loop
SQLTrans.Commit()
SQLComm.Connection.Close()
SQLConn.Close()
End Sub
And why not? I've seen plenty in Portuguese, and I'm sure much of Gregoos programs have French function names. :lol:
That all looks pretty complex, but should vb be able to trap exceptions? That's usually what the "On Error Goto" facility is for. But it pre-dates the more common "Try... Throw..." syntax usually used for structured exception handling you see in C++, C# & J#... and vb.net looks a lot more like C# or J# than Basic to me a lot of the time. I'm sure your help files will have details on how to catch and handle exceptions though, as it's pretty common practice.
It used to be that you got an error code back from the function, and if you didn't handle it, it can't have been that important... but now the theory is that if you didn't handle the error condition, you are a moron and your program shouldn't continue running. :?: Such is progress. :(:
---EDIT---
You might like to try a 2D array, or linked list loop to get an index of "ItemDatenListe(selecteditem, x).StartsWith" to use a "Select Case" instead of the nested "If... ElseIf... EndIf" stuff. That is usually easier to read (for the programmer) and process (for the CPU).
---EDIT---
That cleans lines quite nicely. Two pass operation though, and not thoroughly tested.Code:Declare Function Clean(ByVal sLine As String) As String
Dim As Integer InFile, OutFile
Dim As String InLine, OutLine
InFile = FreeFile()
OutFile = FreeFile() + 1 'Quick, but v.bad practice
Open Command For Input As InFile
Open Command & ".tmp" For Output As OutFile
While Not Eof(InFile)
Line Input #InFile, InLine
OutLine = Clean(InLine)
Print #OutFile, OutLine
WEnd
Close OutFile
Close InFile
Function Clean(ByVal sLine As String) As String
Dim As String sBuf, sInp
sInp = sLine
sBuf = ""
While Len(sInp) > 0
If Left(sInp, 1) = Chr(&h09) Then 'Chr(&h09) is a Tab
sBuf = sBuf & " "
sInp = Mid(sInp, 2)
ElseIf Left(sInp, 1) = Chr(&h22) Then 'Chr(&h22) is a double quote
sInp = Mid(sInp, 2)
If InStr(sInp, Chr(&h22)) <> 0 Then
sBuf = sBuf & Chr(&h22) & Left(sInp, InStr(sInp, Chr(&h22)) + 1)
sInp = Mid(sInp, InStr(sInp, Chr(&h22)) + 1)
Else
sBuf = sBuf & Chr(&h22)
sInp = Mid(sInp, 2)
EndIf
Else
sBuf = sBuf & Left(sInp, 1)
sInp = Mid(sInp, 2)
EndIf
Wend
While Len(sBuf) > 0
If Left(sBuf, 1) = " " Then
If Right(sInp, 1) <> " " Then
sInp = sInp & " "
EndIf
sBuf = Mid(sBuf, 2)
ElseIf Left(sBuf, 1) = Chr(&h22) Then 'Chr(&h22) is a double quote
sBuf = Mid(sBuf, 2)
If InStr(sBuf, Chr(&h22)) <> 0 Then
sInp = sInp & Chr(&h22) & Left(sBuf, InStr(sBuf, Chr(&h22)) + 1)
sBuf = Mid(sBuf, InStr(sBuf, Chr(&h22)) + 1)
Else
sInp = sInp & Chr(&h22)
sBuf = Mid(sBuf, 2)
EndIf
Else
sInp = sInp & Left(sBuf, 1)
sBuf = Mid(sBuf, 2)
EndIf
Wend
Return sInp
End Function
I'm attaching an executable build. No parameter checking but if you drop a monster, npc or OpenItem file on it, it makes another with ".tmp" added to the name which is cleaned to one space only.
Correctly skips any double spaces, or tabs in quoted text. (I hope)
It has a "get out" clause if an open double quote (") is found but no matching close double quote, whereby it treats the " like any other character.
Looks good =)
I wish i had someone that will help me to code and find errors lol.
---------- Post added at 09:48 AM ---------- Previous post was at 09:42 AM ----------
Looks good =)
I wish i had someone that will help me to code and find errors lol.
Something like this function. This is just a little thing, to clean the strings bevor u can use them in other function.
'But this need a lot of time to test them hehe
Same is, if some codes in Monsters/Items are activated, but no values behint.
I dont know what Pristontale use as default value, so i will leave a nothing(null) value there.
Im planing to use mask txt files like:
//monster example
@Mo_Size@
...
@Mo_AttackPower@
...
@Mo_DropList@
etc.
PriTaTor will use this mask with variabels to clan all monster and items files.
Just a idea xD
Sounds like a great idea.
I will try to help where I can. I wanted to get the routine to you quick, so I didn't have time to test hard... but I threw all folders at it and it didn't crash... the results looked okay with a cursory glance, but you can never be too sure. I think most of my data files are pretty clean, and I've seen some (usually from M.I.B., I'm sorry to say) that are really messy... good enough for PT to accept, but messy.
BTW, if you want some other small, fast (hopefully) routines like that, I could always build them them as DLL routines you could call from .net without me having to install and re-learn vb in it's new .net form. I have tried, and it just really doesn't seem practical to me.
Let me know how that code fits with vb.net, and if it works out. :D:
best way is the dll i think
because i need to translate it into vbasic .net
this is not that effectiv, if you give me this as dll ill use ur function to clean a string line =)
If you will help me this would be great.
i just found a little problem, that SQLite dont support "IF EXIST.." function.
This is little sad, maybe u have a idea ?
Like "Function FileExists(FName As String) As Bool" you mean?
SQL wouldn't support that because it isn't concerned with files so much as tables and records. I'm not sure what the syntax for SQL, or SQLite is, but if a "SELECT FROM ... WHERE" returns no records, that's pretty much a "NOT EXISTS" if the table doesn't exist at all... err... I would guess that SQLite would return an error code, probably a handle with a negative value.
If you are actually trying to check the existence of a file (SQL or otherwise) then a. The regular FileExists() or FExists() function should work fine provided you know the full path to the file you want to check for, b. You can always simulate the function, and I can tell you there are times where you need more information than just TRUE or FALSE to the "does the file exist?" question.Why this may be better is because you can try to open with write access, or see if you can get a read, write or shared lock on the file.Code:If Open(FName for input as #1) = 0 Then
Return False
Else
Return True
EndIf
Close #1
These things don't matter all that much 98% of the time, and TBH, that fragment is a very bad example if you where hoping to get that sort of information... but you aren't, so it's good enough.
If you monitor any C or Assembler program, they tend to open a file, close it, then open it again... because at System API level, that, or a FindFirst(), FindNext(), FindNext()... directory search is the only way to tell, and one operation beats the heck out of 1 to n operations.
The extended error data from Win32 GetLastError() will tell you why you couldn't open the file with a "not found" error code, but if you can't open it to read from it, does it really matter why? You're probably going to have to MsgBox() a critical fail, or skip to the next file anyway, right?
I'll build as a DLL, for you. I presume you would prefer an StdCall with C style ZString rather than FastCall or Basic/Pascal String... or, does vb.net prefer *WCharT these days? I can build to work to any of these, as freeBASIC has built in types for each, specifically so it can interact with other languages easily.
If you are not sure (though I guess you have examined this to some extent in order to link to SQLite.dll) I can always look it up. F.Y.I. Traditional Basic, or Pascal strings consist of a Word, or DWord character count followed by that many bytes of characters... where C uses a string of characters read up until one of them is Chr(0). Advantages either way, Basic and Pascal (and Fortran I think) can have Chr(0) encoded in a string and it doesn't terminate (sometimes handy, not often) C can store an infinite number of characters in one string, where Basic and Pascal max out at about 4Gigabytes. XD (sometimes unfortunate, not often)
Oh well=) you know a lot about programming xD
Im not sure, all i know is: VB.Net can handle a lot of string types. U can declare strings like UTF16, UTF*** Unicode, Ansi etc. i will try it out xD
Finaly i made it. my first database with Pristontale Items/monster and the relations. the relations are a little bit complex. even i dont get it atm xD
Tables:
Items (Values of AtkPow etc.)
Monsters (Values of AtkPow etc.)
ItemDropLine (Foreign Key of monsters)
DropItems (Foreign key of ItemDropLine)
GoldDrop (Foreign key of monsters)
NoDrop (foreignkey of monsters)
lol with normal jpt basic server the DropItems table get 15.000 entrys xD
New version of Database Attachment 76341
I would have thought NoDrop could be a DropItems of item type null or something, but you may have found something that isn't obvious till you get there.
In any case, I'm attaching my DLL build. Right now, it's only got the one function:- char * StringClean(char *)
Or in human form pass it a pointer to a null terminated string and it will return a pointer to a null terminated string that is the cleaned up version of the one you gave it.
It's assuming the string is an ANSI string (8-bit no Unicode extensions local code page) which is how the PT server normally works. This dll is built the way most 32Bit Windows DLLs are, following C conventions, as I'm guessing this will cause you the least problems. If you can natively call the User32:MessageBox() API then you should be able to call this the same way... I hope. XDI'm "out of date" which has advantages and disadvantages.
I'm trained and practised in writing small, fast functional code, and externally documenting what I do in a very explicit way. These days, OOP is considered to be "self-documenting" and optimization is something the compiler does for you... I disagree with both these points, as they run contrary to my education.
While I like to take advantage of the odd object, writing an entire program without functional programming techniques to hand seems like an impossible task to me. But that's how most programs are written these days, and how contemporary programmers are taught.
Like a fencer... dueling with one hand tied behind your back promoters and enforces good poise and elegance, promotes balance and reduces the risk of getting "foul" points through instinctive defence with the off-hand. (an illegal play) With both hands tied the chances of "epic fail" are beyond reasonable.:lol: A pro-fencer doesn't need to tie even his off-hand because he has already trained his balance and instinct. XD
OOP increases productivity. Software is written quickly, and new programmers learn it fast... I learned the hard way, and now that training is stuck in my head, and it's hard to change. Alternatively, there is no OOP safety net when you are using Assembler or Olly. XD
Attached, is a zip containing the PTSupp.dll and lib.PTSupp.dll.a. The latter is often added to the lib folder in your development environment to import the linking information, like a binary form of a .h / .hpp in C(++).
The Win32 SDK holds most of these for normal system DLLs... you may or may not need it. All the information is in the DLL header anyway, but some compilers don't want to root through the DLL just to find function names, addresses and legal parameters.
I made a little tool, to translate the monster filesCode:*µÎ¸ñ //Boss
*¸ðµ¨Å©±â 1.4 //Model Size
*¼Ó¼º Àû //Attribute
*¸ð¾çÆÄÀÏ "char\monster\MonSKnight\MonSknight-b.ini" //Image files
*À̸§ "¾ðȦ¸® ³ªÀÌÆ®" //Name
*Name "Unholy Knight"
*·¹º§ 54 //Level
//¸ó½ºÅͰ¡ Ȱµ¿ÇÏ´Â ½Ã°£ //Monster time activity
*Ȱµ¿½Ã°£ Á¦ÇѾøÀ½ //Activity Time Protection
//¹«¸®°¡ ÇÊ¿äÇÑ ¸ó½ºÅÍÀÇ ¼ö ÃÖ¼ÒX-ÃÖ´ëX //For the multitude of monsters Min Max
*Á¶Á÷ 1
//Áö´ÉÀÇ ±¸ºÐÀº 1-10 ±îÁöÀÇ IQ //The distinction between intelligence 1-10
*Áö´É 7
//¸ó½ºÅÍÀÇ ¼ºÇâ Good, Neutral, Evil //Monsters of the propensity
*ǰ¼º Evil
//¸ó½ºÅͰ¡ ij¸¯Å͸¦ ÀνÄÇÏ´Â °Å¸® 1M = 27 //monster recognition 1m=27
*½Ã¾ß 430
//¸ó½ºÅÍÀÇ HP
*»ý¸í·Â 2550
//¸ó½ºÅÍÀÇ °ø°Ý·Â
*°ø°Ý·Â 69 81
//¸ó½ºÅÍÀÇ °ø°Ý Èí¼öÀ² XX% ¸¸Å µ¥¹ÌÁö¸¦ Èí¼öÇÑ´Ù.
*Èí¼öÀ² 18
//¹æÆÐ¸¦ µç ¸ó½ºÅÍÀÇ °æ¿ì ºí·°À²ÀÌ Á¸Àç //Monster holding a shield block rate, the present
*ºí·°À² 14
//¸ó½ºÅÍÀÇ ¹æ¾î·Â //Monsters of the Defense
*¹æ¾î·Â 340
//°ø°Ý ¼ÓµµÀÇ ºü¸£±â ÃÖ¼Ò 5 - ÃÖ´ë 9 //The fast attack speed, at least 5 - to 9
*°ø°Ý¼Óµµ 8
//°ø°Ý½Ã °ø°ÝÀÇ ¸íÁß·Â (92) //Attack of the attack myeongjungryeok (92)
*¸íÁß·Â 900
//¸ó½ºÅͰ¡ °¡Áö°í ÀÖ´Â °ø°Ý ÆÐÅÏÀÇ È®·ü ±¸ºÐ (ÃÖ¼Ò µ¥¹ÌÁö / ÃÖ´ë µ¥¹ÌÁö = m / m (+X) //Monster has a probability of an attack pattern 9 minutes - The minimum damage and maximum damage = m / m (X)
*Ư¼ö°ø°Ý·ü 15
//¸ó½ºÅÍÀÇ ±×¸²ÀÚ Å©±â ¼ÒÇü, ÁßÇü, Áß´ëÇü, ´ëÇü, ¾øÀ½ //The shadow of a monster the size of small, medium, medium to large, large, no
*Å©±â ÁßÇü
//°ø°Ý¹üÀ§ ¸ó½ºÅͰ¡ °ø°Ý ÇÒ ¶§ °ø°Ý ¹üÀ§¸¦ Ç¥½Ã //When the monsters attack attack attack range to display the range
*°ø°Ý¹üÀ§ 55
//¼Ó¼º
////////// ¼Ó¼º ÀúÇ×·Â //////////
*»ýü 100
*¹ø°³ 10
*¾óÀ½ 20
*ºÒ 10
*µ¶ 100
*¸ÅÁ÷ -10
//¸ó½ºÅÍ ºÐ·ù //Monster Categories
*¸ó½ºÅÍÁ¾Á· ¾ðµ¥µå //Monster races Undead
//¸ó½ºÅÍÀÇ À̵¿ ¼Óµµ 1-6ÀÇ ¹üÀ§ //Monsters of the moving speed of the range of 1-6
*À̵¿¼Óµµ 4
//À̵¿Å¸ÀÔ //Move Type
*À̵¿Å¸ÀÔ 0
//±¸ºÐ ( CYCLOPS / HOBGOBLIN / IMP / MINIG / PLANT / SKELETON / ZOMBI / OBIT )
*È¿°úÀ½ SkeletonMelee
//¹°¾à °¹¼ö (¸ó½ºÅͰ¡ ¹°¾àÀ» °¡Áö°í ÀÖ´Â ¼ö) //The number of potions (potions have monsters Wed)
*¹°¾àº¸À¯¼ö 0
//¹°¾à »ç¿ë·ü (¸ó½ºÅÍ ¹ß»ý½Ã ¹°¾àÀ» °¡Áö°í ³ª¿Ã È®·ü) //Potion utilization (the probability of getting a monster in the event with potion)
*¹°¾àº¸À¯·ü 0
//¸ó½ºÅÍ »ç¸Á½Ã À¯Àúµé¿¡°Ô µ¹¾Æ°¡´Â °æÇèÄ¡ÀÇ ¾ç //Upon the death of a monster amount of experience going back to the user
*°æÇèÄ¡ 17000
//¸ó½ºÅÍ »ç¸Á½Ã ÀüÀ¯¹°·Î ¶³¾î ¶ß¸®´Â GoldÀÇ ¾ç ÃÖ¼Òxx-ÃÖ´ëxx È®À² xx //Upon the death of a monster monopoly that Gold dropped to the minimum amount of up to xx-xx xx Odds
*°ñµå 200 220 80
*À̺¥Æ®¾ÆÀÌÅÛ QT110
//¸ó½ºÅͰ¡ ¶³¾î¶ß¸®´Â ¾ÆÀÌÅÛ ¼³Á¤ ºí·°
*¾ÆÀÌÅÛÄ«¿îÅÍ 3
*¾ÆÀÌÅÛ 0 ¾øÀ½
*¾ÆÀÌÅÛ 2000 µ· 2600 3100
*¾ÆÀÌÅÛ 5600 da108 da208 wa106 wc106 wh107 wm107 wp107 ws108 ws208 wt107 db106 ds106 dg106 oa206 or108 oa108 os105
*¾ÆÀÌÅÛ 1600 da109 da209 wa107 wc107 wh108 wm108 wp108 ws109 ws209 wt108 db107 ds107 dg107 oa207 or109 oa109 os106 os106
*¾ÆÀÌÅÛ 600 da110 da210 wa108 wc108 wh109 wm109 wp109 ws110 ws210 wt109 db108 ds108 dg108 oa208 or110 oa110 os106 os106
*¾ÆÀÌÅÛ 200 da111 da211 wa109 wc109 wh110 wm110 wp110 ws111 ws211 wt110 db109 ds109 dg109 oa209 or111 oa111 os106 os106
*¿¬°áÆÄÀÏ "name\B_43_SkeletonKnight.zhoon"
I dont get it what the Gold Drop means, there are 3 values O.o and the gold drop are later.
Someone have a idea? (i marked it red)
Must you insist on using non-EUC Korean code page? XDshould readCode:*¾ÆÀÌÅÛ 2000 µ· 2600 3100
TranslationCode:*아이템 2000 돈 2600 3100
*DropItem [chance/weight] Coins [min_coin] [max_coin]
This is often described in the comment lines above, but the file you use as example only says "몬스터가 떨어뜨리는 아이템 설정 블럭" Which is just a general drop item description.
To explain, the first variable number is the drop weight like any other drop and is added to the total 100% when the monster dies. The Korean word for "coin" (돈) breaks normal drop item processing and takes the next value as the minimum amount of gold to drop, and the one after that as the maximum amount to drop.
So if that kind of monster is killed, add up all the weights for drops INCLUDING the gold drop weight (see them like a pie chart if you like) pick a number (throw a dart at the pie chart, preferably with eyes shut XD) where it falls is what is dropped. If the drop is gold (the dart hit the pie chart was in the gold "cheese slice" XD) then pick a number between min_coin and max_coin and that's how many gold is in the pile dropped. If the dart hit a drop item list, pick an item from that list at random, and that is what the will fall.
Interestingly, your example monster has 0% chance of dropping a "nothing". But the above process will happen 3 times, as each kill should drop three items.
20% chance of dropping between 2600 and 3100 gold coins.
56% chance of dropping one of da108, da208, wa106, wc106, wh107, wm107, wp107, ws108, ws208, wt107, db106, ds106, dg106, oa206, or108, oa108 or os105
16% chance of dropping one of da**** da209, wa107, wc107, wh108, wm108, wp108, ws**** ws209, wt108, db107, ds107, dg107, oa207, or**** oa**** os106 or os106
6% chance of dropping one of da**** da210, wa108, wc108, wh**** wm**** wp**** ws**** ws210, wt**** db108, ds108, dg108, oa208, or**** oa**** os106 or os106
2% chance of dropping one of da**** da211, wa**** wc**** wh**** wm**** wp**** ws**** ws211, wt**** db**** ds**** dg**** oa209, or**** oa**** os106 or os106
Because each individual items drop chance is a percentage of a percentage, (and sometimes, item on several rows; so that + a percentage of a percentage [+ a percentage of a percentage {etc}]) it would be difficult (but possible) to generate a WoWHead style drop chance for each item the mob could possibly drop.
It's confusing, but I find it much easier to read in native Korean. And if you can see how you could calculate the true drop chance for each item from the rates (weights) and lists... then you really have cracked it. :D:
---EDIT---
I finally found your "red" line... scroll right.
The codeDoesn't work. What the Korean comment actually says is not "Upon the death of a monster monopoly that Gold dropped to the minimum amount of up to xx-xx xx Odds" as you (or someone before you) have / has auto translated. Though something not dislike that comes out of Google-translate.Code://몬스터 사망시 전유물로 떨어 뜨리는 Gold의 양 최소xx-최대xx 확율 xx
*골드 200 220 80
The text is coder short-hand, not well punctuated, we've all done it when in code-head mode. Comments are notes, not sentences. If you try to translate the words, fix grammar / syntax to your own language etc. you get a better idea.
En = "[Monster] [death] [possession] [less] [break] Gold[amount] [amount] [Min]XX - [Max]XX [XX] [Chance]"
De = "[Monster] [tod] [zu ihrem ausschließlichen Besitz] [weniger] [bruch / pause] Gold[von] [betrag] [Geringste]XX - [Maximale]XX [Wetten]"
It may be connected to an older form of the file, or additional drops for a boss monster, but I've just not seen it do anything... the DropItem is where I go to change gold drops.