This is a read only copy without any forum functionality of the old Modcraft forum.
If there is anything that you would like to have removed, message me on Discord via Kaev#5208.
Big thanks to Alastor for making this copy!

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Topics - XxXGenesisXxX

Pages: [1] 2
1
Tutorials / [TUTORIAL] Interface Modding - Character Create Screen
« on: January 29, 2014, 01:15:40 am »

Introduction


What's up guys, this is going to be a video series of how to mod the interface and will branch out of various areas, starting with modding the Create a Character screen. It will hopefully teach you how to work your way around the interface XML and Lua files, but more importantly it will hopefully help you teach yourself in the future.

Disclaimers


- I am hopeless and seeing through things like this, so don't be too surprised if it comes to an abrupt halt. I apologize for that, but it's just something I do and can't promise any different.
- This is all going to be for the WoW 3.3.5a client, however I doubt that much will change in terms of using Lua and XML for newer versions.

Prerequisites


Requirements


- WoW 3.3.5a (Wrath of the Lich King)
- Custom WoW.exe with GlueXML check removed (See Recommended): viewtopic.php?f=26&t=181
- Knowledge on how to create patches (See Recommended): viewtopic.php?f=26&t=41
- Knowledge on how to extract interface files: viewtopic.php?f=26&t=41

Recommended


- No more patches: viewtopic.php?f=26&t=1828
- Remove GlueXML Check Tool: viewtopic.php?f=59&t=883
- Instead of the above 2, you can just download my WoW.ex: https://www.mediafire.com/?0wsv4j9391j3a6h
- Notepad++ (It's a godsend)
- Create a shortcut to your WoW.exe, right-click it, go to properties, at the end of the Target add -console

The Tutorials


Character Create Screen


Part 1: http://youtu.be/aeZAsNLusyw

Part 2: http://youtu.be/50paqBP1l3E

Part 3: http://youtu.be/mZq2XKdh7TM

Part 4: http://youtu.be/we35CLPw-bc

Part 5: http://youtu.be/8wGWZSY3DQ4

Closing


Hope these videos help people, if you see any issues or have any problems just let me know, either on here or on my channel.

2
Workboard / [TUTORIAL] Interface Modding - Character Create Screen
« on: January 28, 2014, 11:32:32 pm »
WORKBOARD NOTE: This is a video tutorial series, I have completed the first episode and it is currently being uploaded. Just using this to post referred links and stuff for now. Also, what section of the forums should I post it in? It's basically UI modding the character create screen.

Introduction


What's up guys, this is going to be a video series of how to mod the interface and will branch out of various areas, starting with modding the Create a Character screen. It will hopefully teach you how to work your way around the interface XML and Lua files, but more importantly it will hopefully help you teach yourself in the future.

Disclaimers


- I am hopeless and seeing through things like this, so don't be too surprised if it comes to an abrupt halt. I apologize for that, but it's just something I do and can't promise any different.
- This is all going to be for the WoW 3.3.5a client, however I doubt that much will change in terms of using Lua and XML for newer versions.

Prerequisites


Requirements


- WoW 3.3.5a (Wrath of the Lich King)
- Custom WoW.exe with GlueXML check removed (See Recommended): viewtopic.php?f=26&t=181
- Knowledge on how to create patches (See Recommended): viewtopic.php?f=26&t=41
- Knowledge on how to extract interface files: viewtopic.php?f=26&t=41

Recommended


- No more patches: viewtopic.php?f=26&t=1828
- Remove GlueXML Check Tool: viewtopic.php?f=59&t=883
- Instead of the above 2, you can just download my WoW.ex: https://www.mediafire.com/?0wsv4j9391j3a6h
- Notepad++ (It's a godsend)
- Create a shortcut to your WoW.exe, right-click it, go to properties, at the end of the Target add -console

The Tutorials


Character Create Screen


Part 1: http://www.youtube.com/watch?v=aeZAsNLusyw&feature=youtu.be

Closing


Hope these videos help people, if you see any issues or have any problems just let me know, either on here or on my channel.

3
Random / Motivation
« on: September 15, 2013, 06:54:53 am »
I apologize if this is a bit long, but I feel deeper explanation is helpful. You can skip to the question section if you want.

-=== Back-story ===-

Basically, a while back I worked on a project that was a complete overhaul of WoW. While I was there I was the main developer, to which there really was only 2 of us working on the server consistently. When I was working on this project, I was highly motivated, because it was something I really enjoyed doing. Some days I would spend over 18 hours on it if I felt like it.

Anyway, this went on for a few months of countless hours of development. Eventually I got to the point, where everything felt like an obligation. I was no longer modding for the sake of enjoying it. I tried many things to help re-motivate myself, including teach people to do some of my jobs so in the long run I would have to do less work. By the end of it, things worked, but not enough to make me enjoy myself. I ended up just procrastinating, I couldn't force myself to do the work. It got the point where I felt I was more a hindrance than a help, because people would have to wait for me to do something they couldn't, meaning their production was dependent on my effort. So, I decided to resign, with the option of returning when I felt like it.

I watched the server progress for a little while, but never felt the want to mod, even on home servers for testing. Eventually the owner gave up on the server and it died out.

After that I followed some other projects, had a couple offers to do work or join them, however I still could not muster up the want to do the modding, and with that I declined nearly anything that came my way. I came to the realization, that anything further than opinions and advice, I wasn't going to be up for.

-=== Present ===-

Now, while this whole time I have been neglecting something I used to enjoy, I was fully aware of that note. I used to really enjoy modding. I still enjoy programming/scripting/modding other games etc... But for some reason I am struggling with WoW. But knowing how much I enjoyed WoW modding, makes me want to get back into it. However I am at a constant battle with motivation. The best way to explain this is with a simple 0-10 scale representing when I feel burnt out on modding.

When I used to mod, I would need to reach 10/10 for work load to feel burnt out of modding. Now it seems, it's only at like a 3/10, and each time I mod my threshold gets lower.

-=== Question ===-

I want to reverse this burnt out threshold point. I want to be able to do large amounts of modding again, I want to enjoy WoW-modding again. But I need suggestions on how to retain motivation, or how to get myself re-enthused.

So my question is, what do you guys do to retain your motivation? And what do you think I should do?



-=== Thank you for the effort if you actually read the whole thing ===-

4
Random / Apology Accepted! <3
« on: July 10, 2013, 11:16:26 pm »
Ok guys, this has been on my mind for a bit and I wanted to put it out there. This community is full of people from many different countries around the world, some of which do not speak English, or at least well. Some choose to use Google translate to help them convey their message, and that's all good. But nearly everyone adds an apology at the end, saying they aren't good at English.

Whilst I get why you want to say it, I almost feel guilty, because it is nothing you should have to apologize for. I can only speak English and nothing else. Yet I do not have to apologize for not understanding other people, when this site itself is actually German if I'm not mistaken.

I'm not having a go at you for apologizing, but I just don't want people feeling they have to apologize for something that is perfectly ok. And I'm aware some people just say it as a formality (which can help), and if that's the case, this isn't really a message for you. But to those who genuinely are concerned about their lack of English, please don't feel bad about it and know that people do understand the difficulty of speaking a foreign language.

Hell, to be honest if anything I probably should be thanking you for taking the time to translate or even learning my native language.

5
Random / [Discussion]Anti-bot System
« on: March 21, 2013, 01:15:03 pm »
I know this has been talked about many times in the shoutbox, but I think a documentation style thread that many of the intelligent minds here could read over and throw their ideas or 2 cents in on how to help prevent it. Because having 50 conversations with 50 people in shoutbox leads to repeated solutions and denials.

This is the current online users:

Registered users: 1y2r0m2s4j, 5o0c9t3g7p, Annwc01k, canabalt, Codebreaker, dghhdfgfrty, fdv9fhg8d, mhaastvhr, nhjftyndg, noc, Pid9z2noc14, smelovsky.com, XxXGenesisXxX, yugf5h5hb1

The staff have done a great job at minimizing the spam, but eliminating it would be best.

Personally an option I think would work would be to add a generalized question regarding WoW modding to the registration page. Obviously a lot of bots can simply google answers like 2 + 2. But a generic question relating specifically to this forums like "What game is forum dedicated to?", would be easily answered without a bot being able to automatically guess it. Only way for it to guess it would be from manual implementation targeting this forum.

6
Development and Presentation / Project Genesis
« on: January 28, 2013, 05:38:16 pm »

Disclaimers


  • I am not looking for developers, I am not looking for hosts, I am simply sharing what I am working on in my spare time to get constructive feedback. This content may or may not be a live server in the distant future, I haven't decided.
  • Most content I will be producing is purely for my own self interest in how each particular game mechanic works. I am not doing these things as tasks to achieve for what others would want to play, I am merely attempting to entertain my own interests and better my knowledge of WoW modding and handling.
  • This project will get updates when I feel like working on it. As said, I am doing this for fun, not as an obligation.

Introduction


What's up ladies an gentlemen!? Today I am deciding to show you what I am working on every now and then for some fun. To put it shortly, it is custom content project, built as if it were made by Blizzard. All content I am making is to be built as if it was made to Blizzard's standards, without bugs or workarounds. Content may take me longer due to this, but I think the proffessionalism of it will make up for that.

At the current time I have no name for this server, but I have a few that I am spitballing in my head, so for now I am just calling it Project Genesis (I know, I am an artist and a creationist of imagination).

Content


Updated Creation Screen


I decided to go for more of a cleaner look that Mists of Pandaria provided, without copying it fully. It now follows the same 2 page structure, where you first select a "Gender", "Race" and "Class", before continuing to the next screen to do the Customization and Naming. Also included is the show/hide info button; to show & hide the Race and Class information screens.

(See images section below)

The Conjurer Class


Conjurers are seers of mystery and illusion. They are practitioners of the arcane arts, having learned through researching ancient tomes to bend the forces of nature to do their will. They can conjure powerful weapons and armor, summon forth great creatures or even cast illusions to fool opponents.

Conjurers are a hybrid class, capable of deal damage according to their talents and equipment.

A Conjurer can focus on melee or range combat by drastically boosting their Conjure Weapon and Conjure Armor spells via the Conjuration talent tree, increasing a multitude of things including, armor buffs, damage buffs, stat buffs and special weapon effects based on which Conjure Weapon spell the Conjurer chooses to use.

As just mentioned a Conjurer has access to many different weapons they can conjure. Each weapon has it's stats based on different situations to further diversify the Conjurer class.

  • Swords - Str, Sta
  • Axe - Sta, Agi
  • Daggers - Agi, Int
  • Staves - Int, Spi
  • Maces - Spi, Str

However the Conjurer class specialized in the Conjuration talent tree is not limitted to melee combat, with a selection of Range weapons included.

  • Bow - Agi, Int
  • Crossbow - Agi, Sta
  • Gun - Agi, Str

The Illusion talent tree takes more of a support role, focusing more on magical based spells, including crowed control, buffs/debuffs and some lower end damaging spells.

The Summoning talent tree is exactly as it sounds. The Conjurer gains access to summoning powerful creatures to fight alongside them, be it only for a few minutes, or until dismissed. All creatures fill different roles and act differently according to those roles, they are more or less a hydbrid between a Hunter's pet and Warlock's demon.

Ofcourse with such diversity, it is only natural that to keep the balance, like Druids, the Conjurer's only real true power lies in tree specilization. As a class that can crowed control, summon, do melee damage and range damage effectively, is clearly an over-powered joke. Many restrictions will be in place, with heavier Talent Tree reliability than any other class.

The Conjurer will also have access to unique off-hand weapons known as "Tomes", these tomes will have many varying effects also drastically changing how a Conjurer builds their class. Some Tomes will act like a glyph by modifying spells, while others will act like trinket giving access to a bonus spell.

This class is currently still in progress and many things may change during the completion of the class.

Still to do:
  • Custom spells
  • Conjuration talent sree
  • Conjured Items
  • Illusion talent tree
  • Summoning talent tree
  • Summoned creatures
  • Class specific quests

(See images section below)

Planned Features


  • 2 Completed Custom Classes
  • 2 New Proffessions
  • More use for current proffessions (Including new end-game items with difficult to obtain materials)
  • More Mounts
  • Probably more things, it's 3:17am, I can't think anymore xD

Closing Notes


Thanks for reading guys, hope you enjoyed. If you have any opinions, thoughts or ideas please feel free to share them. I am posting this specifically to get feedback. Constructive critisism is encouraged. Also, if you have questions regarding how something is done, also feel free to ask. But keep in mind, this is a feedback thread not a tutorial thread.

As mentioned I am not sure whether to take this live or not (in which-case I would take the prject more seriously), so please let me know whether you think it would be worth it or a waste of time. As factors like having to download a custom patch tends to be a deterrent for a lot of players.

Images


Page 1 of the Character Creation screen, with the Race and Class information hidden.


Page 1 of the Character Creation screen, with the Race and Class information Shown, also showing the Conjuration Class description.


Page 2 of the Character Creation screen, demonstrating the customization page.


Showing the starting spell Conjure Shield in the Conjuration spell book tab.


Showing the starting spell Conjure Sword in the Conjuration spell book tab.


Showing the weapon created by the starting spell Conjure Sword..

7
Resources and Tools / [RELEASE] MyDBCEditor Profiles (3.3.5)
« on: January 15, 2013, 02:44:13 pm »
I got sick of my Spell.dbc looking so messy with 234 columns, so I cleaned it up by giving it a new profile so that all the columns are now names not just numbers. Figured I would share it with you guys, might make some more eventually, just makes things easier in such an awesome program. All column names were taken from the WoWDev Wiki: http://wowdev.wiki/index.php?title=Category:DBC_WotLK

To install this, just go to the your MyDBCEditor folder and open Profile.ini, then add the following to it (personally I deleted the rest except the height/width, it's all out-dated).

Due to what appears to be a link limit, I am just going to post and update a master file instead. I will probably update after completion of each letter.

Master File

Currently Implemented:
A
Achievement.dbc
AchievementCategory.dbc
AchievementCriteria.dbc
AnimationData.dbc
AreaGroup
AreaPOI.dbc
AreaTable.dbc
AreaTrigger.dbc
AttackAnimKits.dbc
AttackAnimTypes
AuctionHouse.dbc

B
BankBagSlotPrices.dbc
BarberShopStyle.dbc
BattleMasterList.dbc

C
CameraShakes.dbc
Cfg_Categories
Cfg_Configs
CharacterFacialStyles.dbc
CharHairGeosets.dbc
CharHairTextures.dbc
CharSections.dbc
CharTitles.dbc
ChatChannels.dbc
ChatProfanity.dbc
ChrClasses
ChrRaces.dbc
CinematicCamera.dbc
CinematicSequences.dbc
CreatureDisplayInfo.dbc
CreatureDisplayInfoExtra.dbc
CreatureFamily.dbc
CreatureModelData.dbc
CreatureMovementInfo.dbc
CreatureSoundData.dbc
CreatureSpellData.dbc
CreatureType.dbc
CurrencyCategory.dbc
CurrencyTypes.dbc

D
DanceMoves.dbc
DeathThudLookups.dbc
DeclinedWord.dbc
DeclinedWordCases.dbc
DesctructibleModelData.dbc
DungeonEncounter.dbc
DungeonMap.dbc
DungeonMapChunk.dbc
DurabilityCosts.dbc
DurabilityQuality.dbc

E
Emotes.dbc
EmotesText.dbc
EmotesTextData.dbc
EmotesTextSound.dbc
EnvironmentalDamage.dbc
Exhaustion.dbc

F
Faction.dbc
FactionGroup.dbc
FactionTemplate.dbc
FileData.dbc
FootprintTextures.dbc
FootstepTerrainLookup.dbc

G
GmAnswerSurvey.dbc
GMSurveyCurrentSurvey.dbc
GMSurveyQuestions.dbc

S
SkillLine.dbc
SkillLineAbility.dbc
SkillLineCategory.dbc
Spell.dbc
SpellVisualKit.dbc

8
Serverside Modding / [C++] Database query
« on: December 13, 2012, 02:38:27 am »
I'm trying to get this gossip script to get the players characters GUID and a creatures Entry (not GUID) then INSERT them into a table. But I can't seem to have these in the same line:
Code: [Select]
plr->GetGUID(), pCreature->GetEntry()

Which came from this:

Code: [Select]
CharacterDatabase.Execute("INSERT INTO player_shop (ownerguid, vendor) VALUES(%u, %u)", plr->GetGUID(), pCreature->GetEntry());
However all that did is insert the GUID into the ownerguid column, and then set a 0 for the vendor ID. So then I tried this:

Code: [Select]
CharacterDatabase.Execute("INSERT INTO player_shop (ownerguid, vendor) VALUES(%u, %u)", plr->GetGUID(), pCreature->GetGUID());
And it worked as it should. But I don't want the GUID I want the "entry" from the creature table. So then I tried this:

Code: [Select]
CharacterDatabase.Execute("INSERT INTO player_shop (ownerguid, vendor) VALUES(%u, %u)", plr->GetGUID(), pCreature->GetEntry());
CharacterDatabase.Execute("INSERT INTO player_shop (vendor) VALUES(%u)", pCreature->GetEntry());

Which sort of worked, it got both the player character GUID and the creatures entry ID absolutely fine, but as expected it puts it into 2 individual rows.

Also, while the creature_proto and creature_names table use "entry" and I am using "Entry" if I use "entry" in the C++ script it comes says the class hasn't got it as a member. However I fail to see it as important since when on seperate lines it still successfully pulls the "entry" and inserts it into the table.

So can someone please correct this for me and explain why it's screwing up? Is it simply that I can't have the "Get" command twice in one query?

9
Serverside Modding / [SOLVED] Action Bar Saving
« on: November 22, 2012, 06:38:00 pm »
Summary: Spells not saving to the action bar on ArcEmu.

Ok, so basically my custom spells are not saving to the the Character table (action1, action2 columns) like they should be. After a series of testing with Ascathos, it appears that is adhering to the SQL 65535 limitation.

I ran a test where I put 2 blizzards spells into my action bar. The spell ID 65510 into my action bar and I also put the spell ID 65541 into the action bar. I logged out, and upon logging in only the 65510 was saved. Another test I did, I cloned a custom spell of mine ID 85000 to the new ID of 8. The 85000 will not save to the action bar, but the ID of 8 will, even though the spell is identical.

I ran another test where I manually put the 85000 spell ID into the action1 column of my Character table (yes the character knew the spell). It did not appear upon logging in.

Ascahos and myself ended up searching through the core to find some reference to the saving of the Action Bars. Although in all the player.cpp/.h section where it saves spells, skills, achievements, auras etc... It only had a tiny reference to the Action Bars and no mention of saving it. Even though it is capable of saving spells under the ID of 65535.

Another less relevant thing that I found interesting, the action structure is done in 3 parts, ID, Type and Misc. Now the type is said in the core to define the difference between Macro, Spell and Item, but I can't find in the Database where it saves that difference like it does in Trinity.

So I am confused lol. Anyone have any idea to the cause of this? Perhaps a solution?

10
Miscellaneous / [SOLVED] Remove Integrity Check for AddOns folder.
« on: November 06, 2012, 08:02:34 pm »
Basically I want to edit the Blizzard_TalentUI but I can't without removing the integrity check. I have seen posts about GlueXML and FrameXML checks, but I have already got those. I had a look at the guide on removing the integrity checks on GlueXML's to try adjust it for AddOns folder, but didn't exactly get to far.

Can someone please help me with a workaround. guide or something on how I can achieve this?

Edit: Ended up making my own AddOn copying the BlizzardUI. Not a fix, but a workaround.

11
Serverside Modding / [SOLVED] [QUESTION] Attributes
« on: October 11, 2012, 06:26:44 am »
When doing the attributes you edit the enumerations, if you want 2 out of the same column for example:

Code: [Select]
SPELL_ATTR0_ABILITY                          = 0x10, //  4
+
SPELL_ATTR0_PASSIVE                          = 0x40, //  6

You would add them together for 0x50. But what if it needs to carry on? For example:

Code: [Select]
SPELL_ATTR0_PASSIVE                          = 0x40, //  6
+
SPELL_ATTR0_HIDDEN_CLIENTSIDE                = 0x80, //  7

This would equal 0x120... That's the exact same as:

Code: [Select]
SPELL_ATTR0_HIDE_IN_COMBAT_LOG               = 0x100, //  8
+
SPELL_ATTR0_TRADESPELL                       = 0x20, //  5

So how would I get the 0x40 and the 0x80 together? Is that when letters get involved?

12
Tutorials / [Guide/Tutorial] Creating a brand new profession from scratc
« on: September 03, 2012, 12:59:51 am »
[center:3ifguder]

Introduction


THIS INCLUDES CLIENT SIDE PATCHING!!!

Ok guys, so it's 6:15am and I can't sleep, so I figured I'd make a guide on how to make new custom professions from scratch. My previous guide was inadequately named and should of been "Custom Recipes". I'm not exactly in the most creative mindset right now, so I'm going to be ripping off Runescape (LOL!) and going with the new profession of "Fletching".

To be honest, this is actually very simple to do and I'm surprised not many servers have done it. In saying that, it should be known that this is not for repacks and still requires basic knowledge of compiling your own core. To add to that, this guide is based on ArcEmu and the C++ side of this guide will not work for Trinitycore.

By the end of this guide you will have a basic custom profession and you can move onto my other guide on Custom Recipes. If i can be bothered, I may just merge the 2 guides together another day.

And yes, I did copy the basic layout from my previous guide. Saves time and looks neat in my opinion.

Contents


1. Required Programs
2. Step One: The DBC's
3. Step Two: The C++
4. Step Three: The Recipes
5. Step Four: MPQ Patch
6. The Results!
7. Coming Soon!

Programs


Taliis

MyWarCraftStudio <=== Just google for it. I'll find a good link tomorrow.

Step One: The DBC


SkillLine.dbc


We are going to be using SkillLine.dbc to define "Fletching" as it's own skill. This is the very basic bones of a skill.

First off we are going to need to open up Taliis and open "SkillLine.dbc". After you open it, go down to strings in the left hand pane in here we need to make 3 things.
1 - The name of the profession. (Fletching)
2 - The description. (Higher fletching skill allows you to learn higher level fletching designs. Designs can be found on trainers around the world as well as from quests and monsters.)
3 - The verb. (Fletch)

To do this you need to delete the text where it says "String lenght CANNOT changed at the moment!" and write in each of the above sentences (customized to your profession). And press the green button.



After doing so, if you scroll to the bottom of the list you should see this, (numbers may vary). Make note of those numbers as we'll be needing them.



Now we need to go back to Table in the left hand pane. Find another profession, right-click on it and clone it. I'll be cloning Blacksmithing. After doing so, scroll to the bottom of the table list and you should fine a new entry for Blacksmithing.

The columns we'll be using: SkillLine.dbc
0: ID
1: CatergoryID (Stays the same as it is already set to Profession.)
3: The name of the profession.
20: The description.
37: IconID
38: The verb
55: This allows us to link it to chat. (We don't need to edit this as Blacksmithing already can.)


0: ID. This is very simple, just change it to a unique number, I'll be using 800.
1: As stated above, we do not need to edit this as 11 is what is referred to as Professions.
3: This column is a string column, we cannot just type in "Fletching". We have to call it from the strings table. Remember those numbers in the strings section? Well, they are what we are going to need. Go back to Strings in the left hand pane and scroll too the bottom. Find the one for the name of your profession, mine being Fletching at 5151. After you have your number, go back to the table section and type in the string number. You'll now notice when you click off the column it will automatically update to the name instead.



20: Repeat the steps for column 3 but with your description instead of your profession name. For me 5344.



37: Ok, this one requires a bit more research to find the spell icon you really want. Me? I'm gonna be lazy and just gonna use the stand "cog/gear" looking icon which is ID 1 for column 37. I will (eventually) get round to adding a how to find the right icon. But for now a cheap trick is just to look for a spell with an icon you want, go to it's spell ID, scroll across and copy the icon ID.

38: Repeat column 3 but with your verb (Fletch) instead of your name (Fletching), mine is 5516.



55: Just leave this alone as 1 means CanLink.

We can now close SkillLine.dbc and move onto the next DBC.

SkillRaceClassInfo.dbc


This is so simple I'm not gonna go into detail.

Clone ID 243, scroll to the bottom, change the ID to something unique, I'm gonna do 950. Then change the second column to your Skills ID from "SkillLine.dbc".



OH EM GEE THAT WAS TOO HARD!!!

Spell.dbc


Spell.dbc is where we make the Skill spell you click on to open up the professions pane. Also the trainer spells that handles that removes the previous spell and increases the skill cap (Thanks to Terrorblade for pointing me to this). For example: Blacksmithing - Spell - World of Warcraft and Leatherworking - Spell - World of Warcraft.

Ok, obviously open up Spell.dbc and yet again we will start with the strings. This time we'll need 3+ strings, for this guide I'll be making 3. Why 3+? Well it all depends how high your profession goes. We will have one string for Fletching. But we will have 2+ for the different skill levels (Apprentice, Journeyman, etc.). So if you're making it go to grandmaster you would have to make one for all the previous ranks too.

Anyways, the 5 we will be making are:
1 - The basic name for all the ranks (Fletching)
2 - The Apprentice rank description (Allows a fletcher to fletch bows and arrows up to a maximum potential skill of 75. Requires wood found throughout Azeroth.)
3 - The Journeyman rank description (Allows a fletcher to fletch bows and arrows up to a maximum potential skill of 150. Requires wood found throughout Azeroth.)
4 - The Apprentice trainer/parent spell name (Apprentice Fletcher)
5 - The Journeyman trainer/parent spell name (Journeyman Fletcher)



Now we need to clone some rows: The apprentice spell, the journeyman and parent spells etc... For me I will only be cloning these four from Blacksmithing.

So first I need to go to the ID of the actual spell, so back to Blacksmithing - Spell - World of Warcraft and grab the ID from the end of the link. So 2018. Back into Spell.dbc go to your spells ID. You'll see that we conveniently have 3 spells in a row to clone. 2018 (the Apprentice spell), 2020 (the Apprentice trainer spell) and 2021 (the Journeyman trainer spell). To keep it neater, only clone 2018 and 2020, then find the Journeyman spell (same wowhead steps but journeyman spell), clone it as well (3100 in my case), then back to your journeyman trainer/parent spell and clone it.



And at column 136 it should show

I hate this part... *Sigh*

The columns we'll be using: Spell.dbc
0: ID
111: The skillID (This is the reference to the SkillID in "SkillLine.dbc" mine being 800)
116: The Trigger spell (Honestly I don't know how to explain it better than; the link between spell and trainer/parent spell)
133: Icon ID
136: Spell name
170: Spell description


0: ID, ok just change this to something unique again, I'll use 95000, 95001, 95002 and 95003.



111: Easy enough, change all these to the skillID number from your "SkillLine.dbc".

116: Detail isn't really worth the effort for this, but it is important. For JUST your 2 trainer/parent spells you need to change it to the spell ID of your Ranked spells. For example with my spells: Apprentice Fletcher trainer/parent spell (95001) must have it's trigger spell set to the Apprentice Fletcher ranked spell (95000). Meaning obviously in my case in column 116 for spell 95001 I need to write 95000 and for column 116 of spell 95003 I need to write 95002.

133: Same as with the "SkillLine.dbc" IconID. Again mine being 264.

136: The name, same string name thing as usual. For 95000 and 95002 we need to just put out stringID for "Fletching" (for me it's 2318091) , for 95001 is "Apprentice Fletcher"  (for me it's 2318051), for 95003 is "Journeyman Fletcher" (2318091).



170: Same thing as 136 but with the descriptions, only do this for your actual spells not the trainer/parent spells. 95000 being 2317804 and 95002 being 2317927.



And we're done with "Spell.dbc". Obviously repeat certain steps if you have a higher ranking profession.

SkillLineAbility.dbc


Almost done with the DBC's yay! I'm kinda slacking off at the moment xD This section will set require skill levels.

For some reason this DBC is auto-sorted to Skilline. Scroll down to 164 for Skillline id, then look for normal ID number 1283 (this is Apprentice Blacksmith). Clone it for each ranked spell you have, so for me it's 2 times.



The columns we'll be using: SkillLineAbility.dbc
0: ID
1: Skillline.dbc ID
2: Spell ID (we'll only be doing the 2 ranked spells, not the trainer/parent spells)
7: The minimum skill required. (1 for apprentice, 50 for journeyman etc...)
8: The spell that's next in line. (so for apprentice spell you would put the ID for the journeyman spell)

0: Same as always, just change to a unique number. I'll be using 95000 and 95001.

1: This would be 800 again, or whatever your skills ID number is.

2: This will be our Apprentice spells ID and our Journeyman spells ID. So for ID 95000 we'll put in 95000 and ID 95001 would be 95002.

7: For our apprentice skill we need only need a requirement of 1. Because the trainer/parent spell when you learn it will put your skill to level 1 before you learn the apprentice spell (this happens in a split second, but enough for the code to recognize). And the journeyman spell we need to type in 50 for requirement.

8: For our Apprentice spell we need to put the ID of our Journeyman spell. As for our Journeyman spell, we can put as 0 as it won't be increasing.


Step Two: The C++


For once this is actually the easiest part.

Skill.h


Similar to the "SkillLine.dbc" this is where we actually make the core recognize "Fletching" as a skill.

This step is fairly easy; just search for

Code: [Select]
#define SKILL_PET_EXOTIC_SPIRIT_BEAST 788
Underneath that line add another line saying this

Code: [Select]
#define SKILL_FLETCHING 800 //XxXGenesisXxX
The "SKILL_FLETCHING" is the name of your profession, if it has multiple words, use_underscores_in_between_words.
The "800" is your skills ID.
The "//XxXGenesisXxX" is not necessary but it's a habit I strongly advise. It's a comment that does not effect the code, it's just there so I can go into search and type in my name, it's to easily find where I've editing things. If you choose not to use this remove the // as well.




ItemPrototype.h
As you probably know; items have to classes, class and subclass. For example: Worn Shortsword - Item - World of Warcraft is class 2 subclass 7. This means its Weapon(class) One-Handed Sword(subclass). Same applies for recipes, recipes use class 9 and then the subclass depends on the profession. For example blacksmithing recipes would be class 9 subclass 4, while enchanting is still class 9 but the subclass 8. So to finally make my short point, we need to make a subclass for our recipes.

Search for and don't ask why it's named FISNING not FISHING, it just is:

Code: [Select]
ITEM_SUBCLASS_RECIPE_FISNING = 9,
Then underneath that line we need to write:

Code: [Select]
ITEM_SUBCLASS_RECIPE_FLETCHING =10, // XxXGenesisXxX
"FLETCHING" is the name of your profession.
"10 is the ID (for in the database).
"//XxXGenesisXxX" is the same as before.


Player.h


This step is just so that like all other professions you CAN have a Grand Master title for your profession. This isn't necessary but takes 2 seconds and allows you to add a new title later on if you so choose.

Search for:
Code: [Select]
PVPTITLE_WRATHFUL_GLADIATOR             = 142,
And write underneath:
Code: [Select]
PVPTITLE_GRAND_MASTER_FLETCHER     = 143, // XxXGenesisXxX
Same as the 2 previous.


AchievementMgr.cpp


Just like all the other professions we will be making the code for the realm first achievement for being first to max the skill. Again not necessary but takes 2 seconds and leaves options open.

Search for:

Code: [Select]
case 1463: // Realm First! Northrend Vanguard:
Add underneath:

Code: [Select]
case 1500: // Realm First! Grand Master Fletcher XxXGenesisXxX
This time just change your name and the profession name. If you want to remove your name, leave the "//".



And that also concludes the C++ part of the tutorial, you just need to compile your core now.

Step Three: The Recipes


Very Important!

You must have at least 1 recipe in your profession for the professions pane to show when you click the spell.

As mentioned at the start of the guide, I have already written a guide on this. So you can simply follow that from here on.
You can find it here: http://modcraft.io/viewtopic.php?f=61&t=1755

However for the sake that you can see it work I will tell you some short steps to make Hardened Iron Shortsword - Spell - World of Warcraft work for your profession.

Step 1: Open "spell.dbc" and go to it's spell id (3492).
Step 2: Clone spell, scroll to the bottom change the ID to a unique ID (mine will be 95004)
Step 3: Change column 18 to 0 (This gets rid of the requirement to stand next to an anvil)
Step 4: Change column 222 to 0 (This gets rid of the requirement for a hammer)
Step 5: Save "spell.dbc" and open up "SkillLineAbility.dbc"
Step 6: Scroll down till 164 in the column 1. Then find 1985 in column 0.
Step 7: Clone this row, scroll to the bottom, change the ID to a unique ID (mine will be 95002)
Step 8: Change column 1 to your skill ID (800 for me)
Step 9: Change column 2 to your new spell (95004)
Step 10: Column 9 to 1, column 10 to 50 and column 11 to 75.
Step 11: Save and close. You're done with recipes for now.







Step Four: MPQ Patch


OK so I'm buggered and this is all basically the same... I stole this from my previous guide. The images will be different DBC's but all round it's the same. I'll change text to suit this guide though.

So, now we need to open up MyWarCraftStudio then click Pack-> Create MPQ Archive.



Go to your World of Warcraft folder then into the folder named Data. save the file as "patch-x.mpq" but change the number to one higher than the ones already in the folder. I saved mine as "patch-8.mpq".



Now click Pack->Add file to archive... Go to your dbc folder and select "SkillLine.dbc" but don't push ok yet!
Instead put this in front of it "DBFilesClient". So that it says "DBFilesClientSkillLine.dbc". Then press ok.


Now this time, right click on the folder "DBFilesClient" and select import file. Now find your "Spell.dbc" and click open.
Repeat for "SkillLineAbility.dbc" and "SkillRaceClassInfo.dbc".



Now go to Pack->Sort ListFile.

Now final step of all! Go to Pack->Save and close.

The Result!










Coming Soon!


Going to update my sub-par previous guide.
How to add it to a trainer.
Fix 1 minor bug that creates 2 spell buttons when going up a rank. Does no harm, but no bugs is better.

Hope this helped someone!
I'm completely buggered at this point, I didn't double check it all, however I was making it along the whole time and mine works fine. However sometimes what's written and what was done are two different things. So if you find anything to improve or any mistakes just let me know.

Also BB-Codes may be a little off. I wrote this on Ownedcore.[/center:3ifguder]

13
Miscellaneous / [SOLVED] Custom Profession
« on: August 24, 2012, 12:19:01 am »
I have made a custom profession from scratch, it is more or less like tailoring or blacksmithing (rather than mining herblore). However I cannot for the life of me find anywhere to solve a small problem I have. When ever I hit level 50 in my skill, and I go to upgrade to Journeyman spell, it learns the new spell, deletes the old but the max skill level stays at 75 instead of 150. Clearly there is somewhere basic to change this, but i cannot find it lol.

Everything else runs completely smoothly and I even have a guide written for making new custom classes from scratch, but I don't want to release it until I fix this bug.

Any ideas?

14
Serverside Modding / [C++] Talent Points Per Level
« on: May 30, 2012, 12:19:05 am »
Hey guys. been trying to get it so that instead of gaining one talent point per level, instead you gain them once every 15 levels.

Original Code
Code: [Select]
while(newxp >= nextlevelxp && newxp > 0)
{
++level;
li = objmgr.GetLevelInfo(getRace(), getClass(), level);
if(li == NULL) return;
newxp -= nextlevelxp;
nextlevelxp = li->XPToNextLevel;
levelup = true;

if(level > 9)
AddTalentPointsToAllSpec( 1 );

if(level >= GetMaxLevel())
break;
}

if(level > GetMaxLevel())
level = GetMaxLevel();

I've tried quite a few different things and keep getting results I'm not after.

Looking for something similar to this but actually working xD

Code: [Select]
while(newxp >= nextlevelxp && newxp > 0)
{
++level;
li = objmgr.GetLevelInfo(getRace(), getClass(), level);
if(li == NULL) return;
newxp -= nextlevelxp;
nextlevelxp = li->XPToNextLevel;
levelup = true;

if(level == 15)
AddTalentPointsToAllSpec( 1 );
break;
if(level == 30)
AddTalentPointsToAllSpec( 1 );
break;
if(level == 45)
AddTalentPointsToAllSpec( 1 );
break;
if(level == 60)
AddTalentPointsToAllSpec( 1 );
break;
if(level >= GetMaxLevel())
break;
}

Help and an explanation would be greatly appreciated :)

15
Tutorials / [TUTORIAL] Creating a shell of a class!
« on: May 24, 2012, 09:09:32 pm »
By XxXGenesisXxX

Introduction


Firstly this is not gonna be a noob friendly guide. It will still be fairly easy to understand for the most part, but going further into every detail will take far too long with far too many images. I'm sorry if this impedes anyone, but if you need any help or have questions feel free to reply on here or inbox me and I'll do my best to help you out.

However keep in mind; this is a guide not a walk-through. Creating a custom class from scratch has so many variables it is impossible to cater to every aspect and angle. So in this guide (especially the C++ section) it will be heavily based on a magic using Necromancer class. When it comes to the C++ area, to branch out further than what I have done, you are going to need to know how to figure things out yourself within the core. Others can help, but if you can't figure things out on your own as well, you are going to have a never ending supply of questions.

What do I mean by a basic shell?


Well basically I won't be writing how to add skills, spells, talents, starting locations etc. This may seems bland or lacking but you will have a fully functioning class by the end of this guide. And the things I just mentioned (adding spells/skills etc...) will be no different to adding it to an existing class after this guide.

Few Notes


  • In this guide I am gonna be using the term "For Simplicities Sake" a bit. So instead I'm just gonna use the abbreviation FSS.
  • I have been awake for over 24 hours while being out all day. So pretty buggered while writing this xD
  • Always back up anything before you edit it. Even simple edits. One thing wrong can be very frustrating to fix.
  • Always save your work before closing. Obvious but easily forgotten.
  • This was done in ArcEmu, you will have to adapt yourself for other cores, however good luck unless you really know what you're doing xD
  • Their is a huge client side bug, that from what I have read in questions on forums (nor have I found an answer to) is a bug that when you open up your character pane. If your stats are shown it will crash WoW. So I'll be posting a macro at the end of this guide you can use on your characters to stop them showing stats while still being able to access equipment screen. If anyone knows how to fix this or even an idea on how to fix please let me know.

Step 1. DBCs


If you've done it before, you'll notice these steps are a lot like creating your own race. So having done that previously is probably going to make this part a lot easier.

First off you need to open up your "ChrClasses.dbc" and clone one of the rows. FSS I suggest copying one that has the closest similarities to your new class. For me? I'll be making a Necromancer and the way I'm designing it, it will be closest to a Mage. Yes a Mage, not a Warlock.

ChrClasses.dbc


For reference: http://www.wowdev.wiki/index.php?title=ChrClasses.dbc
The columns:
  • 0: This is our Class ID, we'll need to change this to the next number up, so in my case 12.
  • 1: Leave this.
  • 2: This is our powertype our class will use. 0 = Mana, 1 = Rage, 2 = Focus, 3 = Energy, 4 = Happiness, 6 = Runes. FSS, I suggest using either, mana, rage or energy. I won't be covering into detail in this guide a bot them. I'll be using 0 for mana.
  • 3: This is our pet type, if you want to summon demons like warlock you CAN choose to set it as demon, but honestly, you can make demon like creatures with it set as pet. So again, FSS just go with pet.
  • 4: The name of our class, for this we need to go down to Strings on the left hand tab and add a new string. This is the displayed one, so use correct punctuation in this, it isn't code dependent. I'll be naming my string "Necromancer". Once you've added it you'll get it down the bottom with a number next to it. Go back to column 4 in the Table section and type in that number.
  • 5 - 54: :Leave them alone.
  • 55: This is our code dependent name. This is what is gonna be called upon a lot. We need to make a new string. Only this time, it needs to all be in capitals. Also if you have a space in your class name like "Death Knight", you'll need to ignore the space and just type "DEATHKNIGHT". So just do the same as you did for column 4, but capitals and no spaces. So for me; "NECROMANCER".
  • 56: FSS leave this alone or just copy the one closest to your class.
  • 57: I'm not 100% sure on this one, too many inconsistencies, if you feel like experimenting try some different ones out, otherwise stick to the closest to your class.
  • 58: Leave this.
  • 59: This is for different expansions. 0 = Classic, 1 = TBC, 2 = WotLK.

Now you can save and close "ChrClasses.dbc".

CharBaseInfo.dbc


Next we need to open up "CharBaseInfo.dbc". This one is very simple. All we need to do is clone as many rows as race/class combinations as needed. For me, I am only gonna have a Human Necromancer and an Undead Necromancer. So I need to clone 2.

For reference: http://www.wowdev.wiki/index.php?title=CharBaseInfo.dbc
The columns:
  • 0: Race ID. So for me I want 1 (Human) for my first cloned ID and 5 (Undead) for my other.
  • 1: Class ID. All of these should be your new classes ID. Mine was 12, so I need to put in 12 for all of it.
Easy. You can save and close "CharBaseInfo.dbc" now.

TalentTab.dbc


Open up "TalentTab.dbc"

Clone 3 times.

For reference:  http://www.wowdev.wiki/index.php?title=TalentTab.dbc
The columns:
  • 0: These are the ID's. FSS change these to 450, 451 and 452.
  • 1: The names of your talent trees. I'll be using the old school Diablo 2 Necromancer trees. Curses, Poison and Bones, Summoning. you are going to have to make new name strings for each of these again.
  • 2-17: Leave them alone.
  • 18: This is your spell icon ID. I'm just gonna be using the ones I copy for now (warlock ones). If you want to get specific ones, go onto WoWhead, pick a spell with the icon you want. Go into "Spell.dbc". In the first column find the ID of the spell you were looking at, then go across to column 133 and that's your icon ID.
  • 19: Set all to 2047.
  • 20: This is classes, however it's in bits not the standard ID. If your class was ID number 12, than you will need to type in 2048 for each of them.
  • 21: Leave as 0.
  • 22: This is the orderindex. Which ever you want to be first in the list of the 3 talent tree tabs is set to 0, then the middle is set to 1, the the last is set to 2.
  • 23: This is the background image. I'm just leaving mine as default copied one. If you can find the file path, go ahead and make your own, if not just use one you like the background of. You can type your own path in without an image file being present, your will just get the basic background with the color like a quest background.

Once that's done, save and close.

After all that, you are free to pack your MPQ archive.

Step 2. Character Create Screen


Again this is practically the same steps as creating a new race.
Time for client side xml/lua editing. You'll need to use this first in order to remove xml/lua checks from your "wow.exe".
http://modcraft.io/viewtopic.php?f=59&t=883

However for those who have done this before I will move onto the files.

In our InterfaceGlueXML folder, we need to open up:

GlueStrings.lua


In this file we need to hit ctrl+f and search for this

Code: [Select]
CLASS_INFO_WARRIOR4 = "- Uses rage as a resource.";
Now underneath the we need to add these lines (replacing NECROMANCER with your class name in capitals. Then change each description)

Code: [Select]
CLASS_INFO_NECROMANCER0 = "- Role: Damage";
CLASS_INFO_NECROMANCER1 = "- Light Armor (Cloth)";
CLASS_INFO_NECROMANCER2 = "- Can call forth skeletons of different combat abilities.";
CLASS_INFO_NECROMANCER3 = "- Can afflict curses to weaken opponents.";
CLASS_INFO_NECROMANCER4 = "- Uses mana as a resource.";

Now it should look like this

Code: [Select]
CLASS_INFO_WARRIOR0 = "- Role: Tank, Damage";
CLASS_INFO_WARRIOR1 = "- Heavy Armor (Mail / Plate and Shield)";
CLASS_INFO_WARRIOR2 = "- Deals damage with melee weapons.";
CLASS_INFO_WARRIOR3 = "- Has 3 fighting stances with different benefits.";
CLASS_INFO_WARRIOR4 = "- Uses rage as a resource.";
CLASS_INFO_NECROMANCER0 = "- Role: Damage";
CLASS_INFO_NECROMANCER1 = "- Light Armor (Cloth)";
CLASS_INFO_NECROMANCER2 = "- Can call forth skeletons of different combat abilites.";
CLASS_INFO_NECROMANCER3 = "- Can afflict curses to weaken opponents.";
CLASS_INFO_NECROMANCER4 = "- Uses mana as a resource.";

^^^ This is the dot point description you get in the right hand pane in character create screen.

Now hit ctrl+f again and search for

Code: [Select]
tanking warriors desire Stamina as well.";
Now just below that we'll be adding this (again replacing and adjusting to your own class name and descriptions)

Code: [Select]
CLASS_NECROMANCER = "Necromancers are powerful spell casters thought upon by many to be of great evil. These thoughts come from the belief that summoning the dead to fight under controllers will, is a heinously unnatural disrespect towards the dead.";
CLASS_NECROMANCER_FEMALE = "Necromancers are powerful spell casters thought upon by many to be of great evil. These thoughts come from the belief that summoning the dead to fight under controllers will, is a heinously unnatural disrespect towards the dead.";

So now it should look like this

Code: [Select]
CLASS_WARRIOR = "Warriors are plate-wearing fighters who strive for perfection in armed combat. As warriors deal or take damage, they generate rage, which is used to power their special attacks.|n|nWarriors can choose to focus on a two-handed weapon, dual-wielding or using a sword and shield. Warriors have several abilities that let them move quickly around the battlefield. Their primary stat is Strength, though tanking warriors desire Stamina as well.";
CLASS_WARRIOR_FEMALE = "Warriors are plate-wearing fighters who strive for perfection in armed combat. As warriors deal or take damage, they generate rage, which is used to power their special attacks.|n|nWarriors can choose to focus on a two-handed weapon, dual-wielding or using a sword and shield. Warriors have several abilities that let them move quickly around the battlefield. Their primary stat is Strength, though tanking warriors desire Stamina as well.";
CLASS_NECROMANCER = "Necromancers are powerful spell casters thought upon by many to be of great evil. These thoughts come from the belief that summoning the dead to fight under controllers will, is a heinously unnatural disrespect towards the dead.";
CLASS_NECROMANCER_FEMALE = "Necromancers are powerful spell casters thought upon by many to be of great evil. These thoughts come from the belief that summoning the dead to fight under controllers will, is a heinously unnatural disrespect towards the dead.";

^^^ This is the full class description in the right hand character create pane.

Now we can save and close "GlueStrings.lua".

CharacterCreate.lua


Next up we have "CharacterCreate.lua". But before we edit this file we are gonna want to add our class icon to the images. Otherwise we are gonna be looking at a blank image.

So open up your MPQ editor, I'll be using MyWarCraftStudio. Now open up "locale-enUS.MPQ".
Then go to; Interface -> GLUES -> CHARACTERCREATE -> "UI-CHARACTERCREATE-CLASSES.BLP". And now extract this to your desktop.

Ok, so now we need to convert it from a ".blp" to a ".png". To do this we'll be using BLP converter made by PatrickCyr.
http://modcraft.io/viewtopic.php?f=59&t=801

To convert it, all we need to do is simply drag and drop our ".blp" image onto the "BLPConverter.exe" and wait. Shouldn't take long at all. Tada a PNG file!

Now to edit the PNG. Open the image up into your favorite image editor. I'm gonna be awesomely unique and very rare to find........... Adobe Photoshop....... :O

When you open it you'll see exactly how it fits in. All you need to do is copy one of the current ones (for the frame), move it next to DK icon and under the priest icon, then place a new image inside the frame. This will be your class icon. Here's mine if you are too lazy to do it...


Once you've created it, delete your old .blp from the desktop and drop your new png onto the "BLPConverter.exe". Now we need to add this one back to where we found it. So open up your MPQ file again, go to the same path, Interface -> GLUES -> CHARACTERCREATE -> "UI-CHARACTERCREATE-CLASSES.BLP". Only this time delete the current "UI-CHARACTERCREATE-CLASSES.BLP". Now right click on the CHARACTERCREATE folder and choose import. Now import your new "UI-CHARACTER-CLASSES.BLP". Pack your MPQ again and save and close.

Time to go back to the "CharacterCreate.lua", time to edit it.

At the very top change
Code: [Select]
MAX_CLASSES_PER_RACE = 10;to
Code: [Select]
MAX_CLASSES_PER_RACE = 11;
Again in "CharacterCreate.lua" hit ctrl+f (or just scroll down) and search for

Code: [Select]
["DEATHKNIGHT"] = {0.25, 0.49609375, 0.5, 0.75},Now underneath that we are going to need to put
Code: [Select]
["NECROMANCER"] = {0.49609375, 0.7421875, 0.5, 0.75},
^^^ This is the co-ords it searches for on the BLP image we made to show that section.

Save and Close "CharacterCreate.lua".

CharacterCreate.xml


Open up "CharacterCreate.xml".

Search for
Code: [Select]
<CheckButton name="CharacterCreateClassButton10" inherits="CharacterCreateClassButtonTemplate" id="10">
<Anchors>
<Anchor point="TOP" relativeTo="CharacterCreateClassButton5" relativePoint="BOTTOM" x="0" y="-6"/>
</Anchors>
</CheckButton>
Then add after it:
Code: [Select]
<CheckButton name="CharacterCreateClassButton11" inherits="CharacterCreateClassButtonTemplate" id="11">
<Anchors>
<Anchor point="LEFT" relativeTo="CharacterCreateClassButton5" relativePoint="RIGHT" x="6" y="0"/>
</Anchors>
</CheckButton>
^^^ This is telling our button to link on to the 5th button on the top row in class selection.

Now we still have to make them all fit onto the menu bars unlike this:



So search for this:

Code: [Select]
<Anchor point="TOP" x="-90" y="-463"/>And change it to:
Code: [Select]
<Anchor point="TOP" x="-98" y="-463"/>
Now go through all of the "CharacterCreateClassButton"'s and change the x="6" to x="0"

If done right, you should have this:



And that's it for this step for now! =D

P.S I am aware the Necromancer right hand pane icon is missing. I have been awake for over 24 hours and can't remember for the life of me where that BLP is, so I'll get to that when less tired, it's only a minor detail for now, I'm sure you'll live :P

Step 3. Fixing the client crash when checking stats bug!


Ok for all of these, we are going to be doing some cloning of columns in the gt* dbc files. It is highly advised you do this in CSVED.EXE & DBCUtil.exe and that's what my guide is going to be using.

You get CSVED from here: http://csved.sjfrancke.nl/

And DBCUtil from here: http://code.google.com/p/cntc2/downloads/detail?name=DBCUtil.rar&can=2&q=

I would to thank Khira for their original guide that helped me figure this out. However it wasn't the most straightforward on how to do it, so I thought I'd rewrite it a bit easier here. I would link the guide, but I have no idea where it is, it was in spanish and I had sent to me via someone quoting it.

So let's start! Firstly I want you to make a folder on your desktop and name it what ever the hell you want. Then go to your server and copy all the gt* .dbc files into your new folder. We are doing this just to keep it neat and as backup. Now in your new folder go ahead and delete "gtBarberShopCostBase.dbc", "gtNPCManaCostScaler.dbc" and "gtCombatRatings.dbc" as we won't be touching these.

Now that you've done that, go to where you extracted DBCUtil, go into that folder, create a shortcut to DBCUtil.exe and copy that shortcut into your desktop folder, highlight all your DBC's and and drag them over the DBCUtil and let go of your mouse button, it will begin converting them to csv.files. Once done you should have a 1 csv for each DBC. Now to clone entries. WARNING! DO NOT USE MICROSOFT EXCEL FOR THIS STEP!

First open up CSVED.exe. Now go to File->Open ... and navigate to your desktop folder and open up "gtChanceToMeleeCrit.dbc.csv".

gtChanceToMeleeCrit.dbc.csv
This has 1101 entries, that's 100 per class (including the dummy class) + 1, the plus 1 is just stating all these files are floating (don't ask, not important). Now open upen up ChrClasses.dbc in Taliss. Get the ID of the class your custom class is most like stat wise. So for me my class is like a Mage, so the ID I want is 8. So since it's ID of 8, I have to right-click on any entry in CSVED.EXE and select "Go to line". We need to go to line 702. Why 702 for ID of 8? Figure it out like this:

Code: [Select]
Obviously
8*100 = 800
But this starts at 0 not 100, so
800-100 = 700
We have to include the line that stats it's all floating, so
700+1 = 701
And finally, I have no idea why but, we need to add another 1. xD
701+1=702

Now because this program is wierd, click on the entry underneath the highlighted one, then click back on the first entry, this is just to make sure it's selected properly. Right click on the entry it sent you to, that you have highlighted, then select "Go to line" again. This time add 99 lines. So for me I need 801. Now shift click on that entry. All lines between here and there should be highlighted. Right-Click on one and select "Copy Selected Records". Then scroll to the bottom of the page.

Click the very last entry, then right click and select "Add Record", type in any number, we will be deleting this anyway, it's just to keep everything in line, this is a flaw in the program. It has an option to paste below cursor, point but it doesn't always work like that, and we don't want to push the last line to the bottom and throw off the stat calc. Once you've typed in any number, hit Ready. I typed in 999999 so I can tell which it is.

Now select your added line, right-click and select "Paste records below cursor pos". Now find that entry you added and delete it. Look up the top and it should say 1201 recors. If so, you've done this correctly. If not close without saving and try again. If it does say 1201, go to file and select Save As, then save over your csv file.

Repeat these exact steps for these files:

gtChanceToSpellCrit.dbc
gtOCTRegenHP.dbc
gtOCTRegenMP.dbc
gtRegenHPPerSpt.dbc
gtRegenMPPerSpt.dbc

Now do the exact same for these files, but you only need to add 1 entry, so you should have 13 records at the end.

gtChanceToMeleeCritBase.dbc
gtChanceToSpellCritBase.dbc

Now we open up "gtOCTClassCombatRatingScalar.dbc.csv"

Gonna have to do some basic math here because instead of 100, 1 or 10 entries per class it's 32. So to find yours just do this:

Code: [Select]
ID*32, so for me
8*32=256
Plus the float file
256+1=257
And that's the answer

You should end up with the column 1 saying the number 1 below your line number, that's good, it means we can ignore the flot line now. Again click off it then back on it. We need to go down another 32 lines. So do the math and go to the line.

Code: [Select]
257+32=289
Now just do the same as all the others, copy selected records, go to bottom, add new row, paste below cursor, delete created row. Now we've done that we have to edit column 1, just simply go to the top of you copied files and continue the numbers on. So mine says 352, 256, 257, 258. I need it to say 352, 353, 354, 355 etc. Once that's done, check you have 386 records. Save As and close CSVED.exe.

Now delete all the .dbc files in the folder. Then drag and drop all your .dbc.csv files onto DBCUtil shortcut again, this time it should spit out your new working dbc's. Copy them and place them into your patch and your server, then you're done for this step!

Step 4. The Core Modifications


(ArcEmu based, not sure about Trinity or Mangos sorry).

BACK UP YOUR ENTIRE WORLD SOLUTION!!!

Ok this is where we branch far away from create a race (besides the first part) and hit the stuff that most people don't know what to do. But to be completely honest; once you learn how, it's extremely basic. Just a whole bunch of ctrl+f, copy & paste, then editing. This part is not going to be fun...

I already mentioned in my introduction, this is going to be heavily based on my necromancer class, which is an adaption of a Mage class. All these stats and everything in this C++ is the basic of the basic. It isn't going to walk you through every single step for each individual style of class. You have to figure that out on your own. However, luckily, nearly all the spots for the ctrl+f sections, have all original classes listed there. Along with relevant things you will need to adjust for your own personal class.

Please remember in the core, ctrl+f is your best friend.

I apologize if this is difficult and looks very rough, but it is not an easy guide to write.

List of files we are editing:

  • Gossip.h
  • Player.h
  • StdAfx.h
  • NPCHandler.h
  • CharacterHandler.cpp
  • Creature.cpp
  • Gossip.cpp
  • MiscHandler.cpp
  • NPCHandler.cpp
  • ObjectMgr.cpp
  • player.cpp
  • ScriptMgr.cpp
  • Stats.cpp
  • AchievementMgr.cpp
  • Level3.cpp
  • CMakeLists.txt

First up, open your world.sln

Easiest part to do, under "world" section, right click on the "Header Files" folder and click Add -> New item. Then create a new Header File and name it, your class name (normal casing no spaces), so mine would be named "Necromancer".

Ok type this into it (with same caps settings as mine. For full caps, use _ instead of spaces, for normal caps don't use spaces at all. For example DEATH_KNIGHT_H and DeathKnight):
Code: [Select]
#ifndef _NECROMANCER_H
#define _NECROMANCER_H

class Necromancer : public Player
{
public:
Necromancer(uint32 guid) : Player(guid) {}

bool IsNecromancer() { return true; }
};

#endif

Save it and done for that one.

Now do the same, but in the "Source Files" folder with a cpp item instead.

And just add this into it
Code: [Select]
#include "StdAfx.h"Save it.

Now go to "CMakeLists.txt" under the world project. You have to add both of these files into it, so it actually makes them when you build with cmake.
So ctrl+f
Code: [Select]
MovementHandler.cppChange to
Code: [Select]
MovementHandler.cpp
Necromancer.cpp
NPCHandler.cpp

Then ctrl+f
Code: [Select]
NameTables.hChange to
Code: [Select]
NameTables.h
Necromancer.h
NPCHandler.h

Save the cmakelist.

Now go to your "build" folder, so not your source but the folder after CMAKE. Go into world, you'll find both your Necromancer.h and Necromancer.cpp in there. Cut them both, go to your code folder, then the src folder, followed by arcemu-world. Paste both of the items in there. Now leave and build your project with CMAKE again.

To save time I'm just gonna type the .h or .cpp name followed by very brief description/demonstration of what to do or where to add. Just replace necromancer with your class, in same caps format as mine!

Gossip.h


ctrl+f
Code: [Select]
Mage (Match Whole Word)
Code: [Select]
MAGE,
NECROMANCER,
SHAMAN,

Player.h


ctrl+f
Code: [Select]
DRUID = 11,
Code: [Select]
WARLOCK = 9,
DRUID = 11,
NECROMANCER = 12,
MAX_PLAYER_CLASSES

ctrl+f
Code: [Select]
druid - restoration - 282
Code: [Select]
druid - balance - 283
druid - feral combat - 281
druid - restoration - 282

necromancer - curses - 450
necromancer - poison and bones - 451
necromancer - summoning - 452

*/

That part was unneccessary, but it keeps it neat and doesn't hurt.

Scroll down just a little bit to:
Code: [Select]
static const uint32 TalentTreesPerClass[DRUID + 1][3] =change to
Code: [Select]
static const uint32 TalentTreesPerClass[DRUID + 2][3] =
Then a bit further to
Code: [Select]
{ 283, 281, 282 },  // DRUIDchange to
Code: [Select]
{ 283, 281, 282 },  // DRUID
{ 450, 451, 452 },  // NECROMANCER
};

ctrl+f
Code: [Select]
virtual bool IsDruid() { return false; }
change to
Code: [Select]
virtual bool IsDruid() { return false; }
virtual bool IsNecromancer() { return false; }

StdAfx.h
ctrl+f
Code: [Select]
#include "Mage.h" change to
Code: [Select]
#include "Mage.h"
#include "Hunter.h"
#include "Shaman.h"
#include "Necromancer.h"

CharacterHandler.cpp
ctrl+f
Code: [Select]
case DRUID:
plr = new Druid(playerGuid);
break;
   
Change to

Code: [Select]
case DRUID:
plr = new Druid(playerGuid);
break;
case NECROMANCER:
plr = new Necromancer(playerGuid);
break;
   
Creature.cpp
Code: [Select]
ctrl+f static const char* classes[12] = {"None", "Warrior", "Paladin", "Hunter", "Rogue", "Priest", "Death Knight", "Shaman", "Mage", "Warlock", "None", "Druid"};
change to

Code: [Select]
static const char* classes[13] = {"None", "Warrior", "Paladin", "Hunter", "Rogue", "Priest", "Death Knight", "Shaman", "Mage", "Warlock", "None", "Druid", "Necromancer"};
Gossip.cpp
Code: [Select]
ctrl+f 81 You must have Wrath of the Lich King Expansion to access this content.
change to

Code: [Select]
81 You must have Wrath of the Lich King Expansion to access this content.
82  Deathknight
83 Necromancer
*/

^^^ Not neccessary.

ctrl+f
Code: [Select]
case ::DEATHKNIGHT:
itemname += string(Plr->GetSession()->LocalizedWorldSrv(Gossip::DEATHKNIGHT));
break;
               
Change to

Code: [Select]
case ::DEATHKNIGHT:
itemname += string(Plr->GetSession()->LocalizedWorldSrv(Gossip::DEATHKNIGHT));
break;
case ::NECROMANCER:
itemname += string(Plr->GetSession()->LocalizedWorldSrv(Gossip::NECROMANCER));
break;
            
               
MiscHandler.cpp
Code: [Select]
ctrl+f case PRIEST:  // allowing priest, warlock, mage to equip ammo will mess up wand shoot. stop it.
change to

Code: [Select]
case PRIEST:  // allowing priest, warlock, mage, necromancer to equip ammo will mess up wand shoot. stop it.
case WARLOCK:
case MAGE:
case NECROMANCER:
      
      
NPCHandler.cpp
ctrl+f
Code: [Select]
{ "Druid", 0 },
change to

Code: [Select]
{ "Druid", 0 },
{ "Necromancer", 0
   
   
ObjectMgr.cpp
ctrl+f
Code: [Select]
case DEATHKNIGHT: // Based on 55-56 more testing will be done.
if(Level < 60)TotalHealthGain += 92;
                  
change to

               
Code: [Select]
case DEATHKNIGHT: // Based on 55-56 more testing will be done.
if(Level < 60)TotalHealthGain += 92;
/*else if(Level <60) TotalHealthGain+=??;
else if(Level <70) TotalHealthGain+=??;*/
else TotalHealthGain += 92;
break;
case NECROMANCER:
if(Level < 23)TotalHealthGain += 15;
// else if(Level >60) TotalHealthGain+=Level+40;
else if(Level > 60) TotalHealthGain += Level + 190;
else TotalHealthGain += Level - 8;

if(Level < 28)TotalManaGain += Level + 23;
// else if(Level>60)TotalManaGain+=Level+26;
else if(Level > 60)TotalManaGain += Level + 115;
else TotalManaGain += 51;
break;
}
               
               
               
ctrl+f       
Code: [Select]
case DRUID:
result = new Druid(guid);
break;
         
change to

      
Code: [Select]
case DRUID:
result = new Druid(guid);
break;
case NECROMANCER:
result = new Necromancer(guid);
break;

ctrl+f    
Code: [Select]
for(uint32 Class = WARRIOR; Class <= DRUID; ++Class)
change to

   
Code: [Select]
for(uint32 Class = WARRIOR; Class <= NECROMANCER; ++Class)         

NPCHandler.h
Code: [Select]
ctrl+f #define TRAINER_TYPE_MAX 16
change to

Code: [Select]
#define TRAINER_TYPE_MAX 17         
player.cpp
Code: [Select]
ctrl+f 1.7f       // Druid
change to

   
Code: [Select]
1.7f,      // Druid
1.0f       // Necromancer
   
   
ctrl+f
Code: [Select]
if((getClass() == MAGE) || (getClass() == PRIEST) || (getClass() == WARLOCK))
change to

Code: [Select]
if((getClass() == MAGE) || (getClass() == PRIEST) || (getClass() == WARLOCK) || (getClass() == NECROMANCER))
ctrl+f
Code: [Select]
default:    //mage,priest,warlock
change to

Code: [Select]
default:    //mage,priest,warlock,necromancer
^^^ Not neccessary

ScriptMgr.cpp
ctrl+f
Code: [Select]
81 You must have Wrath of the Lich King Expansion to access this content.
change to

Code: [Select]
81 You must have Wrath of the Lich King Expansion to access this content.
82 Deathknight
83 Necromancer
*/

Stats.cpp
ctrl+f                
Code: [Select]
case STAT_SPIRIT:
{ gain = CalculateStat(level, 0.000006, 0.002031, 0.278360, -0.340077); }
                  
Change to

      
Code: [Select]
case DEATHKNIGHT:
{
switch(Stat)
{
case STAT_STRENGTH:
{ gain = CalculateStat(level, 0.000039, 0.006902, 1.080040, -1.051701); }
break;
case STAT_AGILITY:
{ gain = CalculateStat(level, 0.000022, 0.004600, 0.655333, -0.600356); }
break;
case STAT_STAMINA:
{ gain = CalculateStat(level, 0.000059, 0.004044, 1.040000, -1.488504); }
break;
case STAT_INTELLECT:
{ gain = CalculateStat(level, 0.000002, 0.001003, 0.100890, -0.076055); }
break;
case STAT_SPIRIT:
{ gain = CalculateStat(level, 0.000006, 0.002031, 0.278360, -0.340077); }
break;
}

}
break;

case NECROMANCER:
{
switch(Stat)
{
case STAT_STRENGTH:
{ gain = CalculateStat(level, 0.000002, 0.001003, 0.100890, -0.076055); }
break;
case STAT_AGILITY:
{ gain = CalculateStat(level, 0.000008, 0.001001, 0.163190, -0.064280); }
break;
case STAT_STAMINA:
{ gain = CalculateStat(level, 0.000006, 0.002031, 0.278360, -0.340077); }
break;
case STAT_INTELLECT:
{ gain = CalculateStat(level, 0.000040, 0.007416, 1.125108, -1.003045); }
break;
case STAT_SPIRIT:
{ gain = CalculateStat(level, 0.000039, 0.006981, 1.090090, -1.006070); }
break;
}
}
break;
      
         
Level3.cpp
Code: [Select]
ctrl+f static const char* classes[12] =
{"None", "Warrior", "Paladin", "Hunter", "Rogue", "Priest", "Death Knight", "Shaman", "Mage", "Warlock", "None", "Druid"};
   
Change to

Code: [Select]
static const char* classes[13] =
{"None", "Warrior", "Paladin", "Hunter", "Rogue", "Priest", "Death Knight", "Shaman", "Mage", "Warlock", "None", "Druid", "Necromancer"};


ctrl+f    
Code: [Select]
if(plr->getClass() == DRUID)
{
plr->ClearCooldownsOnLine(573, guid);
plr->ClearCooldownsOnLine(574, guid);
plr->ClearCooldownsOnLine(134, guid);
BlueSystemMessage(m_session, "Cleared all Druid cooldowns.");
return true;
}
break;
Change to

   
Code: [Select]
if(plr->getClass() == DRUID)
{
plr->ClearCooldownsOnLine(573, guid);
plr->ClearCooldownsOnLine(574, guid);
plr->ClearCooldownsOnLine(134, guid);
BlueSystemMessage(m_session, "Cleared all Druid cooldowns.");
return true;
}
if(plr->getClass() == NECROMANCER)
{
plr->ClearCooldownsOnLine(6, guid);
plr->ClearCooldownsOnLine(8, guid);
plr->ClearCooldownsOnLine(237, guid);
BlueSystemMessage(m_session, "Cleared all Necromancer cooldowns.");
return true;
}
   

ctrl+f
Code: [Select]
static uint32 spellarray[DRUID + 1][512] =
change to

Code: [Select]
static uint32 spellarray[DRUID + 2][512] =
Scroll down a bite and find

         
Code: [Select]
{ 0 }, // N/A         
Change to

         
Code: [Select]
{ 0 }, // N/A
{ 0 }, // Necromancer


         
ctrl+f
Code: [Select]
static const char* CLASS[] =
Scroll a little down to find

   
Code: [Select]
"warlock",
"invalid 10",
"druid"
   
Change to

   
Code: [Select]
"warlock",
"invalid 10",
"druid",
"necromancer"
   
AchievementMgr.cpp
ctrl+f    
Code: [Select]
case  458: // Realm First! Level 80 Rogue   
change to

      
Code: [Select]
case  458: // Realm First! Level 80 Rogue
case  480: // Realm First! Level 80 Necromancer
   
ctrl+f    
Code: [Select]
(achievement->ID == 458 && GetPlayer()->getClass() != ROGUE) ||
change to

                 
Code: [Select]
(achievement->ID == 458 && GetPlayer()->getClass() != ROGUE) ||
(achievement->ID == 480 && GetPlayer()->getClass() != NECROMANCER) ||
         
END OF SCRIPTING!!! WOOOOOOOOOOOOOOOOOOOOOOT!!!!

Now you just need to build your World Project.

Step 5. The Database


First thing to know, this is the easiest part of all! That I am sure many of you have done similar stuff before.

Open up the playercreateinfo table add a new line and fill in as the titles say. If you could do step 3 I'm pretty sure you can do step 4 by yourself. Either way here is a basic SQL file I'm using for a Human Necromancer and an Undead Necromancer. Just adjust accordingly.

Code: [Select]
INSERT INTO `playercreateinfo` VALUES (66, 1, 1, 12, 0, 12, -8946.42, -131.35, 83.63, 49, 20, 20, 20, 20, 20, 60, 0, 1000, 0, 0, 20, 3, 4, 81, '2');
INSERT INTO `playercreateinfo` VALUES (67, 5, 5, 12, 0, 85, 1676.62, 1677.2, 121.67, 57, 20, 20, 20, 20, 20, 60, 0, 1000, 0, 0, 20, 3, 4, 2, '1024');

Warning though, these classes will have no spells, no skills, no items and no talents. They are just basic shells!

Results!









Final Notes



As I said at the start, there is a big bug. If you have a look in the 3rd result image I have the stats hidden. If that is not done and the Character/Reputation/Currency/Pet/Skills pane is opened, it crashes your client. That's why I use this macro that has floated around for ages for 255 servers with druids that have the same problem.

Code: [Select]
/console PlayerStatLeftDropDown Melee
/console PlayerStatRightDropDown Spell
/reload

Simply use that, don't use any addons like "All Stats" and it will work fine. It may be an inconvenience, but I'm working on it. And any input on it would be greatly appreciated.

I'm gonna try write some guides up on custom Talents/Spells etc... To accompany this, however I'm a pretty busy lately, so not sure when I'll be able to get round to it.

Again, I apologize for how rough this guide is. It's a very difficult guide to write and touch on the right subjects. I will try and update with more info on things if I can. And any questions I'll reply to as fast as I can.

Might be a few mistakes in there, my class is working fine and my scripts are fine, however I backtracked a few times and might have written a word or two wrong in the guide version of the code as opposed to my own. If you spot anything, let me know and I'll correct it.

Thanks for taking the time read this you guys. Hope you find it helpful and more importantly, hopefully you can help custom classes expand!


Edit: Fixed an error.

Pages: [1] 2