PDA

View Full Version : Starting work on Seeds of Destruction


trevius
03-22-2010, 06:48 PM
Ok, well I have decided to attempt to get the SoD expansion compatible with EQEmu. This decision is largely thanks to the discovery by Boo on the PEQ forums that SoD is now available on Steam for $2.50 here (thanks Boo):

http://store.steampowered.com/app/24130/

I purchased it from steam and downloaded it last night and briefly checked a few things to see where we would stand if this was taken on. So far, it is looking like it may definitely be worth the time to try to get this client functional with EQEmu.

Here is a list of some pros and cons:


Cons:
1. The show-stopper right now is that the new clients (including the SoD one from Steam) are unable to log into the Login Server yet. This issue is top priority if we are going to move into expansions past SoF. I will note more info/thoughts on this in the next post.

2. Since the SoD download from Steam is listed as the starter pack, I assume that once the next EQ expansion after Underfoot is released, then Underfoot will replace SoD as the new starter pack. This means that everyone who would want to use SoD from Steam would have to purchase it from Steam before the next expansion comes out toward the end of 2010. After that point, there will likely be no way to legally attain this client version. I think we can cross that road when we get there. Maybe the decision will be to take the next step and work on Underfoot at that point so there will always be a new client available legally for cheap.

3. The current price of $2.50 is marked down from $19.99 currently. I have no idea if they plan to increase the price again, but it is something that should be considered. If purchases increase on Steam, they may decide to up the cost some, so I would recommend that anyone who thinks they might want to try out SoD on EQEmu to buy it sooner rather than later. Even if we are never able to get it working with EQEmu, it is only $2.50, which I think should be within anyone's gaming budget.

4. There may be some unforeseen bugs with the client, but we won't know that until development for it is further along. At this point, I am thinking there is a good chance that it may not only have less bugs than any other client we currently have, but it may even be better than any other client we have currently due to some major fixes that deal with multiple core CPUs and others.


Pros:

1. The price of $2.50 and the fact that this is available via download makes it extremely easy to attain at this point. Anyone should be able to afford it and can get it nearly instantly. That is a hard deal to beat. One suggestion I will make is that anyone who does download it should make sure to make a backup of the complete Everquest folder as soon as the download completes and save it somewhere so they always have a backup if it is ever needed, since the disks won't be readily available like they have been in the past.

2. SoD was publicly released on Oct 21 2008, and here are the patch notes:
http://eqplayers.station.sony.com/game_updates.vm?date=10/21/2008
The actual client on Steam is from Dec 21 2008, and I assume the patch notes for that client version is here:
http://eqplayers.station.sony.com/game_updates.vm?date=12/23/2008

The reason this is good is because it means that SoD was released and patched for at least 2 months before the version on Steam was put up. This means that chances are good that the client version will be very complete (as apposed to some things missing from SoF due to how the retail releases work), and already have most major client issues worked out. Many nice updates and fixes were added in even between Oct to Dec of 2008, so it may be a very nice client to work with. I also don't see any patches shortly after the Steam version came out that show any client issues being fixed, so the client should be pretty solid.

3. Another huge reason for me to start working on this is because while I was working on SoF, I was using SoD packet collects. This means that I have most of the packet collects that should be needed to make the client as functional as possible. Almost all packet structures in SoF match what they should be in SoD, so work on structures should be pretty limited. Offhand, I think only the Player Profile, New Spawn and Position Update packet structs will need to be adjusted. To get the needed changes for those structs, I should be able to reference what the ShowEQ project was using at that time. So, structures should take very little time to work out for SoD. That leaves only opcodes to do, and I believe that have all of them as well and should be able to get every single opcode for SoD in order in very little time/work. So, the amount of work to get SoD working with EQEmu should be pretty small for pretty-much full functionality. I won't know for sure until it can get past the Login Server, though. But, once the LS is working for SoD, I wouldn't be surprised if we could have people playing on the SoD client within 1 week!

4. Of course the new content is always a good thing. There are 20 new zones, 40 new races, and I am sure some nice new weapon models and such as well. There are also some new features like Mercenaries, which we should be able to use Bots in their place and work on using the new control features built into the client for Mercs. Another cool feature is the voice chat that was added, but I don't see that being added to EQEmu as it would require a voice server to be built from scratch most likely and I don't think that would be an easy task at all.


Summary:

I think it is pretty clear that the benefits of starting work on SoD out-weigh not doing it at this point. The main hang-up at this time is the Login Server, and that is a huge hang-up, but it may not be too bad to get it functional with SoD.

trevius
03-22-2010, 06:48 PM
Notes on development so far:

The Login Server:

The current problem is that when you try to log into the EQEmu Login Server with the SoD client from Steam, it just sits there waiting to log in and never gets to the Server List. I haven't sniffed the packets for the communication to the Login Server yet, so everything here is pure speculation at this point. My guess is that the problem is 1 of 2 possibilities:

1. It may be that the encryption for the client has been changed. This may be the case, and if so, I don't really know much about that yet, so I can't say much about what may need to be done to allow SoD to log in with new encryption. However, I am leaning toward the problem not being caused by encryption.

2. There may be a new packet that the client is waiting for when logging in that it is not getting. In the patch notes from Dec 23 2008, it is mentioned that they added a new feature that will now send you a message if you already have a character logged in on that account before it lets you log in and kick that character out. My guess is that the client is now waiting for a reply packet that says no character is currently logged in. I am guessing we could just make a generic "OK to log in" response packet to send the client. Most likely, the Titanium and SoF clients would just ignore it, so we could probably just send the new generic packet to all.


I will try to look into this, but I really haven't looked into the LS code at all yet. I also don't have access to even look at the Public Login Server source, so Rogean or KLS may need to assist if possible to help get this functioning. Since we do have an open source Login Server, anyone who may be able to help figure this out is welcome to try to resolve it and get SoD logging in on the open source version. If we can get it working there, then hopefully, we can persuade Rogean to update the Public Login Server to do whatever the SoD client is needing in order to log in.

Basically, for the SoD client development to move forward at this point, I am going to need help from some of the Pros around here like KLS, Derision and Rogean. Otherwise, if anyone else thinks they can figure it out or provide any useful information that might help, please do! I can't really go any further until the Login Server is working with SoD. Though, I can start some prep work for SoD and get the SVN updated with what my guesses are for what will be needed. Maybe by the time the Login Server is working with SoD, the client will be mostly functional already, lol.


Some potential benefits of the SoD client over the SoF client:

1. After SoF was released, SOE did a lot of work to resolve most multi-core CPU issues. This means that more players should be able to play the SoD client on any OS without having to worry about doing anything special for multiple CPU cores. I believe the Steam version of the SoD client may even include some nice tweaks for splitting multi-box sessions between cores better, which may increase performance while multi-boxing too.

2. SoF is unable to lock it's window size while in windowed mode, which can lead to screen lockups or even more crashes than normal, especially while multi-boxing. the SoD client includes an option to disable window resizing and should also have most of the odd crashing issues from SoF resolved.

3. The UIs for SoF are pretty flaky when switching between them or when trying to use a new one. This issue should be corrected in the SoD client.

4. From what I have seen/heard, the SoF client is easier on the servers than the Titanium client is. So, if we can get the SoD client working as good or better than Titanium and start getting the masses to switch to it, it may boost server performance over-all for servers that support the new client.

Other than the new content, there definitely is a good chance that the SoD client may be a complete replacement for the Titanium client for EQEmu. Even though the SoF client works well enough to play and enjoy it, I think the SoD client would be much more stable and bug-free.

MNWatchdog
03-22-2010, 11:31 PM
For $2.50, might as well buy it just to have it if it ever gets adopted on Emu.

Who knows, maybe it will be a lot easy to configure to work with Emu than SoF has been.

trevius
03-22-2010, 11:47 PM
I am working on updating the opcodes for SoD, and this is what I have so far (anything marked with C or U is done already otherwise I haven't gotten that far yet):

patch_SoF.conf
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage

OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer

# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close

# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x0ff4 # U
OP_ApproveWorld=0x701f # C
OP_LogServer=0x4762 # C
OP_SendCharInfo=0x0f14 # C
OP_ExpansionInfo=0x7519 # C
OP_GuildsList=0x5b0b # C
OP_EnterWorld=0x1c20 # U
OP_PostEnterWorld=0x7c94 # U
OP_World_Client_CRC1=0x0ca5 # C
OP_World_Client_CRC2=0x1cb3 # C
OP_SendSpellChecksum=0x5d24 # U
OP_SendSkillCapsChecksum=0x3278 # U

# Character Select Related:
OP_DeleteCharacter=0x0254 # C
OP_CharacterCreateRequest=0x4e4e # U
OP_CharacterCreate=0x1513 # C
OP_RandomNameGenerator=0x3604 # U
OP_ApproveName=0x413f # C

OP_MOTD=0x192e # C
OP_SetChatServer=0x7f2b # U
OP_SetChatServer2=0x5a6f # U
OP_ZoneServerInfo=0x5da4 # U
OP_WorldComplete=0x698a # U
OP_WorldUnknown001=0x3dd2 # U
OP_FloatListThing=0x0f48 # U

# Reasons for Disconnect:
OP_ZoneUnavail=0x7930 # U
OP_WorldClientReady=0x1a84 # U
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #

# Zone in opcodes
OP_AckPacket=0x3594 # C
OP_ZoneEntry=0x5a6b # U
OP_ReqNewZone=0x43ac # C
OP_NewZone=0x5ca5 # C
OP_ZoneSpawns=0x72f8 # C
OP_PlayerProfile=0x6022 # C
OP_TimeOfDay=0x6015 # C
OP_LevelUpdate=0x6a99 # C
OP_Stamina=0x3e50 # C
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #

OP_RequestClientZoneChange=0x4885 # C
OP_ZoneChange=0x051b # C

OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #

# Required to fully log in
OP_SpawnAppearance=0x10b7 # C
OP_TributeUpdate=0x416b # U
OP_TributeTimer=0x2daa # U
OP_TaskDescription=0x7b77 # C
OP_TaskActivity=0x0525 # C
OP_CompletedTasks=0x29d7 # U
OP_Weather=0x2641 # C
OP_SendAATable=0x3683 # U
OP_UpdateAA=0x1b26 # U
OP_RespondAA=0x0142 # C
OP_ReqClientSpawn=0x1436 # C
OP_SpawnDoor=0x102f # U
OP_GroundSpawn=0x33e5 # C
OP_SendZonepoints=0x5821 # U
OP_SendAAStats=0x5db5 # U
OP_WorldObjectsSent=0x7b73 # C
OP_BlockedBuffs=0x064d # U
OP_SendExpZonein=0x69cd # C
OP_SendTributes=0x4cc6 # U
OP_TributeInfo=0x38b0 # U
OP_SendGuildTributes=0x1ff1 # U
OP_AAExpUpdate=0x3088 # C
OP_ExpUpdate=0x0e98 # C
OP_HPUpdate=0x02d6 # U
OP_ManaChange=0x50c2 # C
OP_TGB=0x2d74 # C
OP_SpecialMesg=0x074f # C
OP_GuildMemberList=0x51bc # C
OP_GuildMOTD=0xd677 # C
OP_CharInventory=0x709d # U
OP_WearChange=0x231f # C
OP_ClientUpdate=0x7062 # C
OP_ClientReady=0x6759 # C
OP_SetServerFilter=0x7312 # C

# Guild Opcodes
OP_GetGuildMOTD=0x189e # U
OP_GetGuildMOTDReply=0x7a16 # U
OP_GuildMemberUpdate=0x41c0 # U
OP_GuildInvite=0x4843 # C
OP_GuildMemberLevelUpdate=0x0000 #
OP_GuildRemove=0x2b9d # C
OP_GuildPeace=0x3f21 # C
OP_SetGuildMOTD=0x481f # C
OP_GuildList=0x5b0b # C
OP_GuildWar=0x7bfb # C
OP_GuildLeader=0x1055 # C
OP_GuildDelete=0x75d0 # C
OP_GuildInviteAccept=0x5f25 # C
OP_ZoneGuildList=0x0000 #
OP_GuildDemote=0x15b2 # U
OP_GetGuildsList=0x0000 #
OP_GuildPublicNote=0x2dbd # C
OP_GuildManageBanker=0x7e23 # U
OP_GuildBank=0x1c36 # U
OP_SetGuildRank=0x4ffe # C
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #

# GM/guide opcodes
OP_GMServers=0x6989 # C
OP_GMBecomeNPC=0x56e7 # C
OP_GMZoneRequest=0x4578 # C
OP_GMZoneRequest2=0x1912 # U
OP_GMGoto=0x0402 # C
OP_GMSearchCorpse=0x7872 # C
OP_GMHideMe=0x34a1 # C
OP_GMDelCorpse=0x0dda # C
OP_GMApproval=0x72fa # C
OP_GMToggle=0x7566 # C
OP_GMSummon=0x596d # U
OP_GMEmoteZone=0x3e7c # U
OP_GMEmoteWorld=0x3e7c # U
OP_GMFind=0x6e27 # C
OP_GMKick=0x799c # C
OP_GMKill=0x6685 # C
OP_GMNameChange=0x4b1e # U
OP_GMLastName=0x3563 # C

OP_InspectAnswer=0x4938 # U
OP_Action2=0x7e4d # C OP_Damage?
OP_BeginCast=0x0d5a # C
OP_BuffFadeMsg=0x569a # C
OP_ConsentResponse=0x6e47 # U
OP_MemorizeSpell=0x8543 # C
OP_SwapSpell=0x3fd2 # C
OP_CastSpell=0x3582 # C
OP_Consider=0x6024 # C
OP_FormattedMessage=0x1318 # C
OP_SimpleMessage=0x5448 # C
OP_Buff=0x7ea8 # C
OP_Illusion=0x48f9 # C
OP_MoneyOnCorpse=0x6546 # C
OP_RandomReply=0x6cdc # C
OP_DenyResponse=0x7ce7 # U
OP_SkillUpdate=0x7f01 # C
OP_GMTrainSkillConfirm=0x23a1 # U
OP_RandomReq=0x777c # C
OP_Death=0x1b85 # C
OP_Bind_Wound=0x3969 # C
OP_GMTraining=0x7b64 # C
OP_GMEndTraining=0x3c02 # C
OP_GMTrainSkill=0x7686 # C
OP_Animation=0x47d3 # C
OP_Begging=0x6d37 # C
OP_Consent=0x6bb9 # C
OP_ConsentDeny=0x01e3 # U
OP_AutoFire=0x466c # U
OP_PetCommands=0x3ad6 # C
OP_DeleteSpell=0x0736 # C
OP_Surname=0x7547 # C
OP_ClearSurname=0x6840 # U
OP_FaceChange=0x5658 # C
OP_SenseHeading=0x3887 # C
OP_Action=0x2c27 # C
OP_ConsiderCorpse=0x37a7 # C
OP_Bug=0x02b # U 0x002b or 0x02b0?
OP_Feedback=0x0d1d # C
OP_Report=0x6884 # C
OP_Damage=0x7e4d # C or OP_Action2?
OP_ChannelMessage=0x2e79 # C
OP_Assist=0x2b59 # C
OP_AssistGroup=0x601b # U
OP_MoveCoin=0x1fcd # C
OP_ZonePlayerToBind=0x7530 # U
OP_KeyRing=0x0a18 # C
OP_WhoAllRequest=0x177a # C
OP_WhoAllResponse=0x31f3 # C
OP_FriendsWho=0x6a90 # C
OP_ConfirmDelete=0x3d00 # C
OP_Logout=0x66e0 # C
OP_Rewind=0x2a58 # U
OP_TargetCommand=0x17f7 # C
OP_InspectRequest=0x4892 # U
OP_Hide=0x1d22 # C
OP_Jump=0x6c16 # C
OP_Camp=0x3eec # C
OP_Emote=0x7434 # C
OP_SetRunMode=0x07fb # C
OP_BankerChange=0x4c14 # U
OP_TargetMouse=0x7bbb # C
OP_MobHealth=0x6c5f # U
OP_InitialMobHealth=0x3676 # U
OP_TargetHoTT=0x3ec7 # C
OP_DeleteSpawn=0x3164 # C
OP_MobUpdate=0x4656 # C
OP_AutoAttack=0x3d86 # C
OP_AutoAttack2=0x4ca1 # C
OP_Consume=0x7ce4 # C
OP_MoveItem=0x7f56 # C
OP_DeleteItem=0x36f8 # C
OP_DeleteCharge=0x1df9 # C
OP_ItemPacket=0x34f8 # U
OP_ItemLinkResponse=0x2bad # C
OP_ItemLinkClick=0x3c66 # C
OP_NewSpawn=0x5c29 # C
OP_Track=0x4817 # U
OP_TrackTarget=0x7337 # U
OP_TrackUnknown=0x7b56 # C
OP_ClickDoor=0x1516 # C
OP_MoveDoor=0x6e97 # C
OP_EnvDamage=0x5ac4 # C
OP_BoardBoat=0x5cd3 # C
OP_Forage=0x7b05 # C
OP_LeaveBoat=0x7554 # C
OP_ControlBoat=0x5bd9 # C
OP_SafeFallSuccess=0x6ad2 # C
OP_RezzComplete=0x42d0 # C
OP_RezzRequest=0x0976 # C
OP_RezzAnswer=0x6e1c # C
OP_Shielding=0x2f6a # C
OP_RequestDuel=0x79e0 # U
OP_MobRename=0x0a1d # C
OP_AugmentItem=0x0370 # U
OP_WeaponEquip1=0x17d5 # U
OP_WeaponEquip2=0x7b6e # U
OP_WeaponUnequip2=0x19a8 # U
OP_ApplyPoison=0x405b # C
OP_Save=0x5c85 # C
OP_TestBuff=0x5fc7 # U
OP_CustomTitles=0x1524 # U
OP_Split=0x53f9 # C
OP_YellForHelp=0x6f79 # C
OP_LoadSpellSet=0x7113 # U
OP_Bandolier=0x675c # U
OP_PotionBelt=0x7bf6 # U
OP_DuelResponse=0x1ebb # C
OP_SaveOnZoneReq=0x6eff # C
OP_ReadBook=0x2444 # U
OP_Dye=0x3672 # C
OP_InterruptCast=0x072f # C
OP_AAAction=0x50d0 # C
OP_LeadershipExpToggle=0x34c5 # C
OP_LeadershipExpUpdate=0x69d0 # C
OP_PurchaseLeadershipAA=0x07b3 # C
OP_UpdateLeadershipAA=0x6948 # C
OP_MarkNPC=0x0d4b # C
OP_ClearNPCMarks=0x5033 # C
OP_DoGroupLeadershipAbility=0x540b # C
OP_DelegateAbility=0x0322 # C
OP_SetGroupTarget=0x521c # C
OP_DuelResponse2=0x52b5 # C
OP_Charm=0x7108 # C
OP_Stun=0x2a6d # C
OP_FindPersonRequest=0x3168 # U
OP_FindPersonReply=0x1ac8 # U
OP_Sound=0x303e # C
OP_PetBuffWindow=0x3df8 # U
OP_LevelAppearance=0x2cd4 # U
OP_Translocate=0x2042 # C
OP_Sacrifice=0x5805 # C
OP_PopupResponse=0x15c4 # U
OP_OnLevelMessage=0x1875 # U
OP_AugmentInfo=0x5e79 # U
OP_Petition=0x31d1 # C
OP_SomeItemPacketMaybe=0x54e8 # C
OP_PVPStats=0x1e7b # U
OP_PVPLeaderBoardRequest=0x5156 # U
OP_PVPLeaderBoardReply=0x300a # U
OP_PVPLeaderBoardDetailsRequest=0x24cb # U
OP_PVPLeaderBoardDetailsReply=0x6ac2 # U
OP_RestState=0x0f3e # U
OP_RespawnWindow=0x268c # U
OP_DisciplineTimer=0x0b89 # U
OP_LDoNButton=0x41b5 # U
OP_SetStartCity=0x6a7e # U
OP_VoiceMacroIn=0x7880 # U
OP_VoiceMacroOut=0x37db # U
OP_DisciplineUpdate=0x0000 #
OP_BecomeCorpse=0x0000 #


# Looting
OP_LootRequest=0x36E3 #
OP_EndLootRequest=0x6599 #
OP_LootItem=0x3760 #
OP_LootComplete=0x48F3 #

# bazaar trader stuff stuff:
OP_BazaarSearch=0x14F2 #
OP_TraderDelItem=0x068D #
OP_BecomeTrader=0x32B7 #
OP_TraderShop=0x1ACF #
OP_TraderItemUpdate=0x0000 #
OP_Trader=0x6b41 #
OP_ShopItem=0x0000 #
OP_TraderBuy=0x7569 #
OP_Barter=0x51bf #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #

# pc/npc trading
OP_TradeRequest=0x180D #
OP_TradeAcceptClick=0x1D07 #
OP_TradeRequestAck=0x1255 #
OP_TradeCoins=0x08CA #
OP_FinishTrade=0x30B7 #
OP_CancelTrade=0x7A43 #
OP_TradeMoneyUpdate=0x69E7 #
OP_MoneyUpdate=0x305A #

# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x4919 #
OP_FinishWindow2=0x1758 #

# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x0cc2 #
OP_ItemVerifyReply=0x41ee #

# merchant crap
OP_ShopPlayerSell=0x5A58 #
OP_ShopRequest=0x5FB7 #
OP_ShopEnd=0x0BD9 #
OP_ShopEndConfirm=0x475F #
OP_ShopPlayerBuy=0x09C4 #
OP_ShopDelItem=0x068D #

# tradeskill stuff:
OP_ClickObject=0x21B3 #
OP_ClickObjectAction=0x67C0 #
OP_ClearObject=0x0e66 #
OP_RecipeDetails=0x0706 #
OP_RecipesFavorite=0x2E2C #
OP_RecipesSearch=0x41A2 #
OP_RecipeReply=0x67f5 #
OP_RecipeAutoCombine=0x0427 #
OP_TradeSkillCombine=0x163C #

# Tribute Packets:
OP_OpenGuildTributeMaster=0x3223 #
OP_OpenTributeMaster=0x5027 #
OP_OpenTributeReply=0x0000 #
OP_SelectTribute=0x1D8C #
OP_TributeItem=0x16D6 #
OP_TributeMoney=0x65BC #
OP_TributeNPC=0x0000 #
OP_TributeToggle=0xE59F #
OP_TributePointUpdate=0x656C #
OP_GuildTributeInfo=0x0000 #
# OP_GuildTributeStatus=0x0000 #

# Adventure packets:
OP_LeaveAdventure=0x1342 #
OP_AdventureFinish=0x0974 #
OP_AdventureInfoRequest=0x6e84 #
OP_AdventureInfo=0x526d #
OP_AdventureRequest=0x4f4c #
OP_AdventureDetails=0x7f4d #
OP_AdventureData=0x10b9 #
OP_AdventureUpdate=0x53c2 #
OP_AdventureMerchantRequest=0x71b2 #
OP_AdventureMerchantResponse=0x40d6 #
OP_AdventureMerchantPurchase=0x5488 #
OP_AdventureMerchantSell=0x1c26 #
OP_AdventurePointsUpdate=0x6583 #
OP_AdventureStatsRequest=0x70B2 #
OP_AdventureStatsReply=0x5A3A #
OP_AdventureLeaderboardRequest=0x2A28 #
OP_AdventureLeaderboardReply=0x6555 #

# Group Opcodes
OP_GroupDisband=0x4B26 #
OP_GroupInvite=0x6321 #
OP_GroupFollow=0x1A12 #
OP_GroupUpdate=0x2E5C #
OP_GroupCancelInvite=0x596C #
OP_GroupAcknowledge=0x1306 #
OP_GroupDelete=0x0000 #
OP_CancelInvite=0x596C #
OP_GroupFollow2=0x59D4 #
OP_GroupInvite2=0x07F6 #

# LFG/LFP Opcodes
OP_LFGCommand=0x5D81 #
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
OP_LFGGetMatchesRequest=0x21E0 #
OP_LFGGetMatchesResponse=0x6dca #
OP_LFPGetMatchesRequest=0x601A #
OP_LFPGetMatchesResponse=0x2274 #
OP_LFPCommand=0x1F00 #

# Raid Opcodes
OP_RaidJoin=0x0000 #
OP_RaidInvite=0x0E11 #
OP_RaidUpdate=0x237E #

# Button-push commands
OP_Taunt=0x094D #
OP_CombatAbility=0x045D #
OP_SenseTraps=0x7466 #
OP_PickPocket=0x768A #
OP_DisarmTraps=0x0000 #
OP_Disarm=0x19B6 #
OP_Sneak=0x17C4 #
OP_Fishing=0x73AB #
OP_InstillDoubt=0x6865 #
OP_FeignDeath=0x1C68 #
OP_Mend=0x7767 #
OP_LDoNOpen=0x4b92 #

# Task packets
OP_TaskActivityComplete=0x7338 #
OP_TaskMemberList=0x0ad6 #
OP_OpenNewTasksWindow=0x17C3 #
OP_AvaliableTask=0x5d1d #
OP_AcceptNewTask=0x66A8 #
OP_TaskHistoryRequest=0x3035 #
OP_TaskHistoryReply=0x3A60 #
OP_CancelTask=0x4db6 #
OP_DeclineAllTasks=0x0000 #

# Title opcodes
OP_NewTitlesAvailable=0x179c #
OP_RequestTitles=0x3445 #
OP_SendTitleList=0x3754 #
OP_SetTitle=0x54fe #
OP_SetTitleReply=0x690b #

# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #

# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #

# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_IncreaseStats=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #

# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_VetRewardsAvaliable=0x044b #
OP_VetClaimRequest=0x7503 #
OP_VetClaimReply=0x01e1 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_CrystalCountUpdate=0x64C1 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think

# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #


# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
OP_LoginUnknown1=0x22cf
OP_LoginUnknown2=0x43ba
OP_ItemViewUnknown=0x4db4

# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search

OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #

# Login opcodes
OP_SessionReady=0x0001 #
OP_Login=0x0002 #
OP_ServerListRequest=0x0004 #
OP_PlayEverquestRequest=0x000d #
OP_PlayEverquestResponse=0x0021 #
OP_ChatMessage=0x0016 #
OP_LoginAccepted=0x0017 #
OP_ServerListResponse=0x0018 #
OP_Poll=0x0029 #
OP_EnterChat=0x000f #
OP_PollResponse=0x0011 #

# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #

# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #

ptarp
03-23-2010, 01:17 AM
2. There may be a new packet that the client is waiting for when logging in that it is not getting. In the patch notes from Dec 23 2008, it is mentioned that they added a new feature that will now send you a message if you already have a character logged in on that account before it lets you log in and kick that character out. My guess is that the client is now waiting for a reply packet that says no character is currently logged in. I am guessing we could just make a generic "OK to log in" response packet to send the client. Most likely, the Titanium and SoF clients would just ignore it, so we could probably just send the new generic packet to all.They changed something in the client to pop up a window if you have a toon logged into the world somewhere.. It was added to allow you to "force" an LD toon off the server faster, so what you're looking for is something that tells the client there's no toon's from the account on the server.
Window text if check shows a toon on server is -
You already have a character logged into a world server from this account. You may only 1 character from a single account logged into a server at a time (even across different servers). Would you like to remove this character from the game so you may login? with NO and YES buttons on the bottom. Hope that helps.

Derision
03-23-2010, 05:51 AM
I'll have a look at a trace of the current live logon process, which hopefully is the same as SoD, to see if there is a simple fix to get it working with the open source login server.

Hopefully it's just a packet size that has changed, or an extra opcode or two and not the encryption :(

trevius
03-23-2010, 06:37 AM
Thanks, Ptarp, that is what I had figured as one of the possible causes since that went in right about the same time as the Steam Client version.

Derision, if you want to check it out, but don't have SoD yet, or an account to try it on, I will buy you one if you want to just send me the email address you want it gifted to from Steam :) We can use all of the help we can get.

KLS, Secrets and I briefly reviewed some collects to compare SoF>EQEmu with SoD>EQEmu and SoD>EQLive and so far they do look pretty similar. It seems 2 extra bytes were added to the end of the second packet that gets sent from the Client (after the OP_SessionReady from the client and the OP_Login from the server). And the server reply to that packet is a bit different in structure. So, at the very least, it looks like they have changed the structure a bit. We are not sure if encryption has been changed yet.

I may try setting up the Open Source LS to just send me a Login Accepted packet no matter what, so I can at least log in with the SoD client to continue work on it while the LS stuff is being worked on.

On a side-note, it looks like SOE may be considering an idea I mentioned a year or 2 ago on their forums to allow custom content created by players. When logging in to collect packets, here is one of the vote options I got:
"Player generated content system - Allow players to place NPCs and traps, set mission types, and turn loose their custom zone for other players to experience and gain points in a scaling reward system"

My idea was for custom player run servers, but this would definitely be a stepping stone toward that!

bad_captain
03-23-2010, 09:39 AM
Looks like it's on sale until the 26th, or for 3 more days, if anyone is wanting to get it just in case. I think will be.

ChaosSlayerZ
03-23-2010, 11:21 AM
As I always I admire your dedication to the project Trev, but I worry that getting emu attuned to a downloaded software may result in this software ultimately become no longer available or modified/patched on the source side, resulting in further incompatibility between version downloaded at different time.

I strongly believe its better to connect Emu with "on disk" based versions.
Another thing, the content gain between SoF and SoD is not as significant as it was between T and SoF. Waiting for a cheap Underfoot pack would be a better option, specially since SOE officially stated that Underfoot contains TWICE number of weapon/item models ENTIRE game had before that point =)

I am sorry if this coming off as ungrateful criticism, I just feel that downloaded version won't be a reliable source for the future =(

Derision
03-23-2010, 02:13 PM
I have SoD downloading from Steam ... going to take a while.

In the meantime I took a look at a live login capture vs a SoF EQEmu login capture and I don't think the encryption has changed, as the OP_Login sent from the client is byte for byte the same in both captures (obviously I used the same account and password, so what was being encrypted was the same in both cases).

Secrets
03-23-2010, 03:14 PM
As I always I admire your dedication to the project Trev, but I worry that getting emu attuned to a downloaded software may result in this software ultimately become no longer available or modified/patched on the source side, resulting in further incompatibility between version downloaded at different time.

I strongly believe its better to connect Emu with "on disk" based versions.
Another thing, the content gain between SoF and SoD is not as significant as it was between T and SoF. Waiting for a cheap Underfoot pack would be a better option, specially since SOE officially stated that Underfoot contains TWICE number of weapon/item models ENTIRE game had before that point =)

I am sorry if this coming off as ungrateful criticism, I just feel that downloaded version won't be a reliable source for the future =(

SOE already said there will not be any more box sets.

Akkadius
03-23-2010, 04:22 PM
SOE already said there will not be any more box sets.

Aye, and Trevius just got done saying that Underfoot will be just as easy if not easier to get working as well. And he gave me a rough estimate of a week or so that he could get SoD working (If all goes well). And of course, considering he has the time on his hands available.

trevius
03-23-2010, 05:04 PM
Yeah, ChaosSlayer, I listed that as one of the cons for starting this work. If it was going to take nearly as much work as it took to get SoF to where it is now, then I wouldn't even bother. But, I am pretty confident that I have everything I need (or most of it anyway) to get the SoD expansion working with the Emu within a fairly short amount of time.

Getting every opcode we have on SoF right now converted into SoD opcodes will be trivial thanks to some information I have from around that time. It will still take time to adjust them all, but I was able to update the entire opcode list for SoD and get it on the SVN last night already. At least 50% of the ones on the SVN now should be correct for SoD and I can get the other half correct as soon as I can get past the Login Server and run a couple packet collects.

The item packets were a big part of getting SoF to work as they had changed how those work considerably from Titanium to SoF. But, the item packets in SoD are exactly like (or very very close) the SoF ones, so there should be no changes needed there.

Most of the packet structures that were created for SoF were exact copies from Live during SoD, so that means they should work without any editing. Only a few key packet structures should need any work, and I can get most of that info from ShowEQ's forums/svn.

So, I should have everything I need to get this running in a pretty short time if all goes well.

I do agree that a retail release would be MUCH preferred over a digital download, but I don't want to wait another year to see if the next expansion is retail or only digital like the last 2 have been. The community manager on the SOE forums pretty-much confirmed that they probably won't be doing any more retail releases. That could always change, but I don't think it is likely at this point.

I think the Steam version will likely stay the same until Underfoot replaces it as the new starter pack once the new expansion comes out at the end of 2010. We will have to cross that bridge when we get there, but hopefully we can just upgrade to Underfoot at that time like we are for SoD now.

One nice thing about digital download like this is that people can get it instantly (not including download time of course) from anywhere in the world. Shipping to certain places is hard to find, so many people wanting a retail release would have a hard time getting it when they could now just download it.

I hope that the price of SoD doesn't jump up too much after the sale is over. I don't think it would go back up to $19.99, but maybe up to $5 or $10 tops (pure guess). Again though, I recommend that anyone who thinks they might want it to get it now before the sale ends. It is practically free at this point!

Derision,

Thanks for checking it out! I didn't think about using the same account and password to verify if encryption had changed or not. That is good news! So, it sounds like it may just be the 2 extra bytes on the end of the packet from the client that is throwing it off. My guess is that the LS is just ignoring the packet because it doesn't match the size it wants for the struct. I don't know what those 2 extra bytes are for, but I have a feeling they can probably just be ignored. They may be for telling the server if you have read news/voted/etc recently, or something like that, which we don't care about.

I wonder if simply adding 2 unknown bytes to that login struct would allow the SoD client to log in. If so, it should be a pretty easy solution. Then we will just need Rogean to make the needed adjustments for the Public LS and we should be able to move to the next step of getting SoD going :D

Noport
03-23-2010, 08:10 PM
i'll throw in my 2 cent's SOD digital download works with
login server and can get into the game with no problems might
try using OP_SendLoginInfo=0x6c3c is why you are stuck at the
login screen. The zone's need to be added there is a file posted
on another website site with the list done for you and all the
opcodes all you have do is surf the web on another websites.

Underfoot works with just a couple of opcodes changed.

0 2243 qeynos South Qeynos
2 2244 qeynos2 North Qeynos
3 2245 qrg Surefall Glade
4 2246 qeytoqrg Qeynos Hills
6 2248 highkeep HighKeep
8 2249 freportn North Freeport
9 2250 freportw West Freeport
10 2251 freporte East Freeport
11 2252 runnyeye Clan RunnyEye
12 2253 qey2hh1 West Karana
13 2254 northkarana North Karana
14 2255 southkarana South Karana
15 2256 eastkarana East Karana
16 2257 beholder Gorge of King Xorbb
17 2258 blackburrow BlackBurrow
18 2259 paw Infected Paw
19 2260 rivervale Rivervale
20 2261 kithicor Kithicor Forest
21 2262 commons West Commonlands
22 2263 ecommons East Commonlands
408 616 commonlands Commonlands
409 2310 oceanoftears Ocean Of Tears
410 2261 kithforest Kithicor Forest
411 2277 befallenb Befallen
412 2248 highpasskeep HighKeep
413 2287 innothuleb Innothule Swamp
414 2279 toxxulia Toxxulia Forest
415 2274 mistythicket Misty Thicket
23 2264 erudnint Erudin Palace
24 2265 erudnext Erudin
25 2266 nektulos Nektulos Forest
26 2267 cshome Sunset Home
27 2268 lavastorm Lavastorm Mountains
28 2269 nektropos Nektropos
29 2270 halas Halas
30 2271 everfrost Everfrost Peaks
31 2276 soldunga Solusek's Eye
32 2277 soldungb Nagafen's Lair
33 2274 misty Misty Thicket
34 2275 nro North Ro
35 2276 sro South Ro
36 2277 befallen Befallen
37 2278 oasis Oasis of Marr
38 2279 tox Toxxulia Forest
39 2280 hole The Ruins of Old Paineel
40 2281 neriaka Neriak Foreign Quarter
41 2282 neriakb Neriak Commons
42 2283 neriakc Neriak Third Gate
43 2284 neriakd Neriak Palace
44 2285 najena Najena
45 2286 qcat Qeynos Catacombs
46 2287 innothule Innothule Swamp
47 2288 feerrott The Feerrott
48 2289 cazicthule Cazic-Thule
49 2290 oggok Oggok
50 2291 rathemtn Mountains of Rathe
51 2292 lakerathe Lake Rathetear
52 2293 grobb Grobb
53 2294 aviak Aviak Village
54 2295 gfaydark Greater Faydark
55 2296 akanon Ak'Anon
56 2297 steamfont Steamfont Mountains
57 2298 lfaydark Lesser Faydark
58 2299 crushbone Clan Crushbone
59 2300 mistmoore Castle Mistmoore
60 2308 kaladima Kaladim
61 2303 felwithea Felwithe
62 2303 felwitheb Felwithe
63 2304 unrest Estate of Unrest
64 2305 kedge Kedge Keep
65 2306 guktop Upper Guk
66 2307 gukbottom Lower Guk
67 2308 kaladimb Kaladim
68 2309 butcher Butcherblock Mountains
69 2310 oot Ocean of Tears
70 2311 cauldron Dagnor's Cauldron
71 2312 airplane Plane of Sky
72 2313 fearplane Plane of Fear
73 2314 permafrost Permafrost Keep
74 2315 kerraridge Kerra Isle
75 2316 paineel Paineel
76 2317 hateplane The Plane of Hate
77 2401 arena The Arena
78 2319 fieldofbone The Field of Bone
79 2320 warslikswood Warsliks Wood
80 2321 soltemple Temple of Solusek Ro
81 2322 droga Temple of Droga
82 2323 cabwest West Cabilis
83 2324 swampofnohope Swamp of No Hope
84 2325 firiona Firiona Vie
85 2326 lakeofillomen Lake of Ill Omen
86 2327 dreadlands Dreadlands
87 2328 burningwood Burning Woods
88 2329 kaesora Kaesora
89 2330 sebilis Old Sebilis
90 2331 citymist City of Mist
91 2332 skyfire Skyfire Mountains
92 2333 frontiermtns Frontier Mountains
93 2334 overthere The Overthere
94 2335 emeraldjungle The Emerald Jungle
95 2336 trakanon Trakanon's Teeth
96 2337 timorous Timorous Deep
97 2338 kurn Kurn's Tower
98 2339 erudsxing Erud's Crossing
100 2340 stonebrunt Stonebrunt Mountains
101 2341 warrens The Warrens
102 2342 karnor Karnor's Castle
103 2343 chardok Chardok
104 2344 dalnir Dalnir
105 2345 charasis Howling Stones
106 2346 cabeast East Cabilis
107 2347 nurga Mines of Nurga
108 2348 veeshan Veeshan's Peak
109 2349 veksar Veksar
110 2350 iceclad Iceclad Ocean
111 2351 frozenshadow Tower of Frozen Shadow
112 2352 velketor Velketor's Labyrinth
113 2353 kael Kael Drakkal
114 2354 skyshrine Skyshrine
115 2355 thurgadina Thurgadin
116 2356 eastwastes Eastern Wastes
117 2357 cobaltscar Cobalt Scar
118 2358 greatdivide Great Divide
119 2359 wakening The Wakening Land
120 2360 westwastes Western Wastes
121 2361 crystal Crystal Caverns
123 2362 necropolis Dragon Necropolis
124 2363 templeveeshan Temple of Veeshan
125 2364 sirens Siren's Grotto
126 2365 mischiefplane Plane of Mischief
127 2366 growthplane Plane of Growth
128 2367 sleeper Sleeper's Tomb
129 2368 thurgadinb Icewell Keep
130 2369 erudsxing2 Marauder's Mire
150 2370 shadowhaven Shadow Haven
151 2371 bazaar The Bazaar
152 2372 nexus The Nexus
153 2373 echo Echo Caverns
154 2374 acrylia Acrylia Caverns
155 2375 sharvahl Shar Vahl
156 2376 paludal Paludal Caverns
157 2377 fungusgrove Fungus Grove
158 2378 vexthal Vex Thal
159 2379 sseru Sanctus Seru
160 2380 katta Katta Castellum
161 2381 netherbian Netherbian Lair
162 2382 ssratemple Ssraeshza Temple
163 2383 griegsend Grieg's End
164 2384 thedeep The Deep
165 2385 shadeweaver Shadeweaver's Thicket
166 2386 hollowshade Hollowshade Moor
167 2387 grimling Grimling Forest
168 2388 mseru Marus Seru
169 2389 letalis Mons Letalis
170 2390 twilight The Twilight Sea
171 2391 thegrey The Grey
172 2392 tenebrous The Tenebrous Mountains
173 2393 maiden The Maiden's Eye
174 2394 dawnshroud Dawnshroud Peaks
175 2395 scarlet The Scarlet Desert
176 2396 umbral The Umbral Plains
179 2397 akheva Akheva Ruins
180 2401 arena2 The Arena
181 2398 jaggedpine The Jaggedpine Forest
182 5803 nedaria Nedaria's Landing
187 5827 shadowrest Shadowrest
183 2399 tutorial Tutorial Zone
188 5856 tutoriala The Mines of Gloomingdeep
189 5856 tutorialb The Mines of Gloomingdeep
190 2301 clz Loading
184 2301 load Loading
185 2301 load2 Loading
996 0 arttest Art Testing Domain
999 0 apprentice Designer Apprentice
202 9004 poknowledge Plane of Knowledge
203 9005 potranquility Plane of Tranquility
200 9006 codecay Ruins of Lxanvom
201 9007 pojustice Plane of Justice
204 9008 ponightmare Plane of Nightmare
221 9009 nightmareb Lair of Terris Thule
205 9010 podisease Plane of Disease
206 9011 poinnovation Plane of Innovation
207 9012 potorment Plane of Torment
208 9013 povalor Plane of Valor
209 9014 bothunder Torden, The Bastion of Thunder
210 9015 postorms Plane of Storms
211 9016 hohonora Halls of Honor
220 9017 hohonorb Temple of Marr
212 9018 solrotower Solusek Ro's Tower
213 9019 powar Plane of War
214 9020 potactics Drunder, Fortress of Zek
215 9021 poair Eryslai, the Kingdom of Wind
216 9022 powater Reef of Coirnav
217 9023 pofire Doomfire, The Burning Lands
218 9024 poeartha Vegarlson, The Earthen Badlands
222 9025 poearthb Stronghold of the Twelve
219 9026 potimea Plane of Time
223 9026 potimeb Plane of Time
226 4046 torgiran Torgiran Mines
227 4047 nadox Crypt of Nadox
224 4048 gunthak Gulf of Gunthak
225 4049 dulak Dulak's Harbor
228 4050 hatesfury Hate's Fury, The Scorned Maiden
186 2317 hateplaneb The Plane of Hate
277 598 chardokb The Halls of Betrayal
278 600 soldungc The Caverns of Exile
229 9086 guka The Cauldron of Lost Souls
230 9114 ruja The Bloodied Quarries
231 9124 taka The Sunken Library
232 9094 mira The Silent Gallery
233 9104 mmca The Forlorn Caverns
234 9087 gukb The Drowning Crypt
235 9115 rujb The Halls of War
236 9125 takb The Shifting Tower
237 9095 mirb The Maw of the Menagerie
238 9105 mmcb The Dreary Grotto
239 9088 gukc The Ancient Aqueducts
240 9116 rujc The Wind Bridges
241 9126 takc The Fading Temple
242 9096 mirc The Spider Den
243 9106 mmcc The Asylum of Invoked Stone
244 9089 gukd The Mushroom Grove
245 9117 rujd The Gladiator Pits
246 9127 takd The Royal Observatory
247 9097 mird The Hushed Banquet
248 9107 mmcd The Chambers of Eternal Affliction
249 9090 guke The Foreboding Prison
250 9118 ruje The Drudge Hollows
251 9128 take The River of Recollection
252 9098 mire The Frosted Halls
253 9108 mmce The Sepulcher of the Damned
254 9091 gukf The Chapel of the Witnesses
255 9119 rujf The Fortified Lair of the Taskmasters
256 9129 takf The Sandfall Corridors
257 9099 mirf The Forgotten Wastes
258 9109 mmcf The Ritualistic Summoning Grounds
259 9092 gukg The Root Garden
260 9120 rujg The Hidden Vale
261 9130 takg The Balancing Chamber
262 9100 mirg The Heart of the Menagerie
263 9110 mmcg The Cesspits of Putrescence
264 9093 gukh The Accursed Sanctuary
265 9121 rujh The Blazing Forge
266 9131 takh The Sweeping Tides
267 9101 mirh The Morbid Laboratory
268 9111 mmch The Aisles of Blood
269 9122 ruji The Arena of Chance
270 9132 taki The Antiquated Palace
271 9102 miri The Theater of Imprisoned Horrors
272 9112 mmci The Halls of Sanguinary Rites
273 9123 rujj The Barracks of War
274 9133 takj The Prismatic Corridors
275 9103 mirj The Grand Library
276 9113 mmcj The Infernal Sanctuary
77 2401 arena The Arena
279 3385 abysmal Abysmal Sea
280 3386 natimbi Natimbi, The Broken Shores
281 3387 qinimi Qinimi, Court of Nihilia
282 3388 riwwi Riwwi, Coliseum of Games
283 3389 barindu Barindu, Hanging Gardens
284 3390 ferubi Ferubi, Forgotten Temple of Taelosia
285 3391 snpool Sewers of Nihilia, Pool of Sludge
286 3392 snlair Sewers of Nihilia, Lair of Trapped Ones
287 3393 snplant Sewers of Nihilia, Purifying Plant
288 3394 sncrematory Sewers of Nihilia, the Crematory
289 3395 tipt Tipt, Treacherous Crags
290 3396 vxed Vxed, The Crumbling Caverns
291 3397 yxtta Yxtta, Pulpit of Exiles
292 3398 uqua Uqua, The Ocean God Chantry
293 3399 kodtaz Kod'Taz, Broken Trial Grounds
294 3447 ikkinz Ikkinz, Chambers of Destruction
296 3448 inktuta Inktu`Ta, The Unmasked Chapel
297 3449 txevu Txevu, Lair of the Elite
298 3450 tacvi Tacvi, Seat of the Slaver
295 3451 qvic Qvic, Prayer Grounds of Calling
299 5826 qvicb Qvic, the Hidden Vault
300 5889 wallofslaughter Wall of Slaughter
301 5890 bloodfields The Bloodfields
302 5891 draniksscar Dranik's Scar
303 5892 causeway Nobles' Causeway
304 5898 chambersa Muramite Proving Grounds
305 5898 chambersb Muramite Proving Grounds
306 5898 chambersc Muramite Proving Grounds
307 5898 chambersd Muramite Proving Grounds
308 5898 chamberse Muramite Proving Grounds
309 5898 chambersf Muramite Proving Grounds
316 5893 provinggrounds Muramite Proving Grounds
317 5894 anguish Asylum of Anguish
318 5899 dranikhollowsa Dranik's Hollows
319 5899 dranikhollowsb Dranik's Hollows
320 5899 dranikhollowsc Dranik's Hollows
321 5899 dranikhollowsd Dranik's Hollows
322 5899 dranikhollowse Dranik's Hollows
323 5899 dranikhollowsf Dranik's Hollows
324 5899 dranikhollowsg Dranik's Hollows
325 5899 dranikhollowsh Dranik's Hollows
326 5899 dranikhollowsi Dranik's Hollows
327 5899 dranikhollowsj Dranik's Hollows
328 5900 dranikcatacombsa Catacombs of Dranik
329 5900 dranikcatacombsb Catacombs of Dranik
330 5900 dranikcatacombsc Catacombs of Dranik
331 5901 draniksewersa Sewers of Dranik
332 5901 draniksewersb Sewers of Dranik
333 5901 draniksewersc Sewers of Dranik
334 5895 riftseekers Riftseekers' Sanctum
335 5896 harbingers Harbingers' Spire
336 5897 dranik The Ruined City of Dranik
998 5158 fhalls The Forgotten Halls
337 5160 broodlands The Broodlands
338 5161 stillmoona Stillmoon Temple
339 5162 stillmoonb The Ascent
340 5163 thundercrest Thundercrest Isles
341 5164 delvea Lavaspinner's Lair
342 5165 delveb Tirranun's Delve
343 5166 thenest The Accursed Nest
344 6112 guildlobby The Guild Lobby
345 6111 guildhall Guild Hall
346 6116 barter The Barter Hall
347 5170 illsalin Ruins of Illsalin
348 5171 illsalina Imperial Bazaar
349 5172 illsalinb Temple of the Korlach
350 5173 illsalinc The Nargilor Pits
351 5174 dreadspire Dreadspire Keep
354 5175 drachnidhive The Hive
355 5176 drachnidhivea Living Larder
356 5177 drachnidhiveb Coven of the Skinwalkers
357 5178 drachnidhivec Queen Sendaii's Lair
358 5179 westkorlach Stoneroot Falls
359 5180 westkorlacha Chambers of Xill
360 5181 westkorlachb Caverns of the Lost
361 5182 westkorlachc Lair of the Korlach
362 5183 eastkorlach Undershore
363 5184 eastkorlacha Snarlstone Dens
364 5185 shadowspine Shadowspine
365 5186 corathus Corathus Creep
366 5187 corathusa Sporali Caverns
367 5188 corathusb Corathus Lair
368 5189 nektulosa Shadowed Grove
369 3630 arcstone Arcstone
370 3631 relic Relic
371 3632 skylance Skylance
372 3633 devastation The Devastation
373 3634 devastationa The Seething Wall
374 3635 rage Sverag, Stronghold of Rage
375 3636 ragea Razorthorn, Tower of Sullon Zek
376 3637 takishruins Ruins of Takish-Hiz
377 3638 takishruinsa The Root of Ro
378 3639 elddar The Elddar Forest
379 3640 elddara Tunare's Shrine
380 3641 theater Theater of Blood
381 3642 theatera Deathknell, Tower of Dissonance
382 3643 freeporteast East Freeport
383 3644 freeportwest West Freeport
384 3645 freeportsewers Freeport Sewers
385 3646 freeportacademy Academy of Arcane Sciences
386 3647 freeporttemple Temple of Marr
387 3648 freeportmilitia Freeport Militia House
388 3649 freeportarena Arena
389 3650 freeportcityhall City Hall
390 3651 freeporttheater Theater
391 3652 freeporthall Hall of Truth
392 2275 northro North Ro
393 2276 southro South Ro
394 3675 crescent Crescent Reach
395 3676 moors Blightfire Moors
396 3677 stonehive Stone Hive
397 3678 mesa Goru`kar Mesa
398 3679 roost Blackfeather Roost
399 3680 steppes The Steppes
400 3681 icefall Icefall Glacier
401 3682 valdeholm Valdeholm
402 3683 frostcrypt Frostcrypt, Throne of the Shade King
403 3684 sunderock Sunderock Springs
404 3685 vergalid Vergalid Mines
405 3686 direwind Direwind Cliffs
406 3687 ashengate Ashengate, Reliquary of the Scale
407 2247 highpasshold Highpass Hold
416 617 kattacastrum Katta Castrum
417 618 thalassius Thalassius, the Coral Keep
418 619 atiiki Jewel of Atiiki
419 620 zhisza Zhisza, the Shissar Sanctuary
420 621 silyssar Silyssar, New Chelsith
421 622 solteris Solteris, the Throne of Ro
422 623 barren Barren Coast
423 624 buriedsea The Buried Sea
424 625 jardelshook Jardel's Hook
425 626 monkeyrock Monkey Rock
426 627 suncrest Suncrest Isle
427 628 deadbone Deadbone Reef
428 629 blacksail Blacksail Folly
429 630 maidensgrave Maiden's Grave
430 631 redfeather Redfeather Isle
431 8057 shipmvp The Open Sea
432 8057 shipmvu The Open Sea
433 8057 shippvu The Open Sea
434 8057 shipuvu The Open Sea
435 8057 shipmvm The Open Sea
436 652 mechanotus Fortress Mechanotus
437 653 mansion Meldrath's Majestic Mansion
438 654 steamfactory The Steam Factory
439 655 shipworkshop S.H.I.P. Workshop
440 656 gyrospireb Gyrospire Beza
441 657 gyrospirez Gyrospire Zeka
442 658 dragonscale Dragonscale Hills
443 659 lopingplains Loping Plains
444 660 hillsofshade Hills of Shade
445 661 bloodmoon Bloodmoon Keep
446 662 crystallos Crystallos, Lair of the Awakened
447 663 guardian The Mechamatic Guardian
449 665 cryptofshade Crypt of Shade
450 671 dragonscalea Tinmizer's Wunderwerks
451 672 dragonscaleb Deepscar's Den
452 1216 oldfieldofbone Field of Scale
478 1216 oldfieldofboneb Field of Scale
453 1216 oldkaesoraa Kaesora Library
454 1216 oldkaesorab Hatchery Wing
455 1216 oldkurn Kurn's Tower
456 1216 oldkithicor Bloody Kithicor
457 1216 oldcommons Old Commonlands
458 1216 oldhighpass Highpass Hold
459 1216 thevoida The Void
460 1216 thevoidb The Void
461 1216 thevoidc The Void
462 1216 thevoidd The Void
463 1216 thevoide The Void
464 1216 thevoidf The Void
465 1216 thevoidg The Void
466 1216 oceangreenhills Oceangreen Hills
467 1216 oceangreenvillage Oceangreen Village
468 1216 oldblackburrow Blackburrow
469 1216 bertoxtemple Temple of Bertoxxulous
470 1216 discord Korafax, Home of the Riders
471 1216 discordtower Citadel of the Worldslayer
472 1216 oldbloodfield Old Bloodfields
473 1216 precipiceofwar The Precipice of War
474 1216 olddranik City of Dranik
475 1216 toskirakk Toskirakk
476 1216 korascian Korascian Warrens
477 1216 rathechamber Rathe Council Chambers
448 2297 steamfontmts Steamfont Mountains
479 1216 crafthalls Ngreth's Den
480 1216 brellsrest Brell's Rest
481 1216 fungalforest Fungal Forest
482 1216 underquarry The Underquarry
483 1216 coolingchamber The Cooling Chamber
484 1216 shiningcity Kernagir, The Shining City
485 1216 arthicrex Arthicrex
486 1216 foundation The Foundation
487 1216 lichencreep Lichen Creep
488 1216 pellucid Pellucid Grotto
489 1216 stonesnake Volska's Husk
490 1216 brellstemple Brell's Temple
491 1216 convorteum The Convorteum
492 1216 brellsarena Brell's Arena
493 1216 weddingchapel Wedding Chapel
494 1216 weddingchapeldark Wedding Chapel
495 1216 dragoncrypt Lair of the Fallen
700 1216 feerrott2 The Feerrott
701 1216 thulehouse1 Thule House 1
702 1216 thulehouse2 Thule House 2
703 1216 housegarden House Garden
704 1216 houselibrary House Library
705 1216 well Well
706 1216 fallen Fallen
707 1216 morellcastle Morell's Castle
708 1216 morelltower Morell's Tower
709 1216 alkabormare Al'Kabor's Nightmare
710 1216 miragulmare Miragul's Nightmare
711 1216 thuledream Thule's Dream

KLS
03-23-2010, 08:25 PM
I was going to look at login when I can finish downloading this, I have a good idea of what probably needs to be done.

trevius
03-23-2010, 09:00 PM
Sounds like good news, KLS :) Hopefully once it is figured out, we can get Rogean to patch the Login Server to work with the new clients as well. Or, do you have access to the Public Login Server host to do it yourself? I forget if Rogean ever gave access to anyone else yet or if it is still just him with access to it.

Thanks for the info, Oscargrouch. The OP_SendLoginInfo has nothing to do with why we can't get into the Login Server as far as I know, though. That packet is for logging into the actual servers once you get into the server list. At this point, we can't even get to the server list yet, but it seems like it won't be that much longer before we can. Once we can, I can get the rest of the opcodes up to date for SoD in a few hours. Then, it will just be a matter of adjusting a few structs and looking for any issues with other structs or encodes/decodes. I don't suspect this will be very hard at all.

Also, I am sure you are referencing the ShowEQ website/svn to get the opcodes and structs. I already mentioned that is where I plan to get the structs from that we will need (or at very least the correct packet sizes). They may have some opcodes we could use there, but as I already said, opcodes are not an issue at all. Plus, the ShowEQ team only cares about having a very limited number of accurate Opcodes, so there are hundreds that would be missing if we only used what they have as a reference. Still great info there though.

As for working with Underfoot, I am sure it probably wouldn't be that much off from what SoD is. So, if SoD is easy to get going, I may even give a shot at Underfoot once SoD is all situated. I don't want to get ahead of myself here, but the change to the LS for SoD should make it work with Underfoot as well, then it would again just be an easy opcode update and a few packet structs again and it would be working. Focusing on SoD solely for now, but just throwing that out there as a possibility sometime. It will probably be $39.99 until the next expansion comes out, so most people probably wouldn't get it anyway.

trevius
03-23-2010, 11:01 PM
Here is the everquest.h file from ShowEQ that should have useful structure sizes and fields for the SoD client:

/*
* everquest.h
*
* ShowEQ Distributed under GPL
* http://seq.sourceforge.net/
*/


/*
** Please be kind and remember to correctly re-order
** the values in here whenever you add a new item,
** thanks. - Andon
*/

/*
** Structures used in the network layer of Everquest
*/

#ifndef EQSTRUCT_H
#define EQSTRUCT_H

#include "config.h"

#ifdef __FreeBSD__
#include <sys/types.h>
#else
#include <stdint.h>
#endif

/*
** ShowEQ specific definitions
*/
// Statistical list defines
#define LIST_HP 0
#define LIST_MANA 1
#define LIST_STAM 2
#define LIST_EXP 3
#define LIST_FOOD 4
#define LIST_WATR 5
#define LIST_STR 6
#define LIST_STA 7
#define LIST_CHA 8
#define LIST_DEX 9
#define LIST_INT 10
#define LIST_AGI 11
#define LIST_WIS 12
#define LIST_MR 13
#define LIST_FR 14
#define LIST_CR 15
#define LIST_DR 16
#define LIST_PR 17
#define LIST_AC 18
#define LIST_ALTEXP 19
#define LIST_MAXLIST 20

/*
** MOB Spawn Type
*/
#define SPAWN_PLAYER 0
#define SPAWN_NPC 1
#define SPAWN_PC_CORPSE 2
#define SPAWN_NPC_CORPSE 3
#define SPAWN_NPC_UNKNOWN 4
#define SPAWN_DROP 6
#define SPAWN_DOOR 7
#define SPAWN_SELF 10

/*
** Diety List
*/
#define DEITY_UNKNOWN 0
#define DEITY_AGNOSTIC 396
#define DEITY_BRELL 202
#define DEITY_CAZIC 203
#define DEITY_EROL 204
#define DEITY_BRISTLE 205
#define DEITY_INNY 206
#define DEITY_KARANA 207
#define DEITY_MITH 208
#define DEITY_PREXUS 209
#define DEITY_QUELLIOUS 210
#define DEITY_RALLOS 211
#define DEITY_SOLUSEK 213
#define DEITY_TRIBUNAL 214
#define DEITY_TUNARE 215
#define DEITY_BERT 201
#define DEITY_RODCET 212
#define DEITY_VEESHAN 216

//Team numbers for Deity teams
#define DTEAM_GOOD 1
#define DTEAM_NEUTRAL 2
#define DTEAM_EVIL 3
#define DTEAM_OTHER 5

//Team numbers for Race teams
#define RTEAM_HUMAN 1
#define RTEAM_ELF 2
#define RTEAM_DARK 3
#define RTEAM_SHORT 4
#define RTEAM_OTHER 5

//Maximum limits of certain types of data
#define MAX_KNOWN_SKILLS 75
#define MAX_SPELL_SLOTS 10
#define MAX_KNOWN_LANGS 25
#define MAX_SPELLBOOK_SLOTS 400
#define MAX_GROUP_MEMBERS 6
#define MAX_BUFFS 25
#define MAX_GUILDS 1500
#define MAX_AA 359
#define MAX_BANDOLIERS 20
#define MAX_POTIONS_IN_BELT 5
#define MAX_TRIBUTES 5
#define MAX_DISCIPLINES 100

//Item Flags
#define ITEM_NORMAL 0x0000
#define ITEM_NORMAL1 0x0031
#define ITEM_NORMAL2 0x0036
#define ITEM_NORMAL3 0x315f
#define ITEM_NORMAL4 0x3336
#define ITEM_NORMAL5 0x0032
#define ITEM_NORMAL6 0x0033
#define ITEM_NORMAL7 0x0034
#define ITEM_NORMAL8 0x0039
#define ITEM_CONTAINER 0x7900
#define ITEM_CONTAINER_PLAIN 0x7953
#define ITEM_BOOK 0x7379
#define ITEM_VERSION 0xFFFF

// Item spellId no spell value
#define ITEM_SPELLID_NOSPELL 0xffff

// Item Field Count
#define ITEM_FIELD_SEPERATOR_COUNT 117
#define ITEM_CMN_FIELD_SEPERATOR_COUNT 102

//Combat Flags
#define COMBAT_MISS 0
#define COMBAT_BLOCK -1
#define COMBAT_PARRY -2
#define COMBAT_RIPOSTE -3
#define COMBAT_DODGE -4

#define PLAYER_CLASSES 16
#define PLAYER_RACES 15

/*
** Item Packet Type
*/
enum ItemPacketType
{
ItemPacketViewLink = 0x00,
ItemPacketMerchant = 0x64,
ItemPacketLoot = 0x66,
ItemPacketTrade = 0x67,
ItemPacketSummonItem = 0x6a,
ItemPacketWorldContainer = 0x6b
};

/*
** Item types
*/
enum ItemType
{
ItemTypeCommon = 0,
ItemTypeContainer = 1,
ItemTypeBook = 2
};

/*
** Chat Colors
*/
enum ChatColor
{
CC_Default = 0,
CC_DarkGrey = 1,
CC_DarkGreen = 2,
CC_DarkBlue = 3,
CC_Purple = 5,
CC_LightGrey = 6,
CC_User_Say = 256,
CC_User_Tell = 257,
CC_User_Group = 258,
CC_User_Guild = 259,
CC_User_OOC = 260,
CC_User_Auction = 261,
CC_User_Shout = 262,
CC_User_Emote = 263,
CC_User_Spells = 264,
CC_User_YouHitOther = 265,
CC_User_OtherHitYou = 266,
CC_User_YouMissOther = 267,
CC_User_OtherMissYou = 268,
CC_User_Duels = 269,
CC_User_Skills = 270,
CC_User_Disciplines = 271,
CC_User_Default = 273,
CC_User_MerchantOffer = 275,
CC_User_MerchantExchange = 276,
CC_User_YourDeath = 277,
CC_User_OtherDeath = 278,
CC_User_OtherHitOther = 279,
CC_User_OtherMissOther = 280,
CC_User_Who = 281,
CC_User_Yell = 282,
CC_User_NonMelee = 283,
CC_User_SpellWornOff = 284,
CC_User_MoneySplit = 285,
CC_User_Loot = 286,
CC_User_Random = 287,
CC_User_OtherSpells = 288,
CC_User_SpellFailure = 289,
CC_User_ChatChannel = 290,
CC_User_Chat1 = 291,
CC_User_Chat2 = 292,
CC_User_Chat3 = 293,
CC_User_Chat4 = 294,
CC_User_Chat5 = 295,
CC_User_Chat6 = 296,
CC_User_Chat7 = 297,
CC_User_Chat8 = 298,
CC_User_Chat9 = 299,
CC_User_Chat10 = 300,
CC_User_MeleeCrit = 301,
CC_User_SpellCrit = 302,
CC_User_TooFarAway = 303,
CC_User_NPCRampage = 304,
CC_User_NPCFurry = 305,
CC_User_NPCEnrage = 306,
CC_User_EchoSay = 307,
CC_User_EchoTell = 308,
CC_User_EchoGroup = 309,
CC_User_EchoGuild = 310,
CC_User_EchoOOC = 311,
CC_User_EchoAuction = 312,
CC_User_EchoShout = 313,
CC_User_EchoEmote = 314,
CC_User_EchoChat1 = 315,
CC_User_EchoChat2 = 316,
CC_User_EchoChat3 = 317,
CC_User_EchoChat4 = 318,
CC_User_EchoChat5 = 319,
CC_User_EchoChat6 = 320,
CC_User_EchoChat7 = 321,
CC_User_EchoChat8 = 322,
CC_User_EchoChat9 = 323,
CC_User_EchoChat10 = 324,
CC_User_UnusedAtThisTime = 325,
CC_User_ItemTags = 326,
CC_User_RaidSay = 327,
CC_User_MyPet = 328,
CC_User_DamageShield = 329,
};

/*
** Group Update actions
*/
enum GroupUpdateAction
{
GUA_Joined = 0,
GUA_Left = 1,
GUA_LastLeft = 6,
GUA_FullGroupInfo = 7,
GUA_MakeLeader = 8,
GUA_Started = 9,
};

/**
* Leadership AAs enum, used to index into leadershipAAs in charProfileStruct
*/
enum LeadershipAAIndex
{
groupMarkNPC = 0,
groupNPCHealth,
groupDelegateMainAssist,
groupDelegateMarkNPC,
groupUnknown4,
groupUnknown5,
groupInspectBuffs,
groupUnknown7,
groupSpellAwareness,
groupOffenseEnhancement,
groupManaEnhancement,
groupHealthEnhancement,
groupHealthRegeneration,
groupFindPathToPC,
groupHealthOfTargetsTarget,
groupUnknown15,
raidMarkNPC, //0x10
raidNPCHealth,
raidDelegateMainAssist,
raidDelegateMarkNPC,
raidUnknown4,
raidUnknown5,
raidUnknown6,
raidSpellAwareness,
raidOffenseEnhancement,
raidManaEnhancement,
raidHealthEnhancement,
raidHealthRegeneration,
raidFindPathToPC,
raidHealthOfTargetsTarget,
raidUnknown14,
raidUnknown15,
MAX_LEAD_AA //=32
};

/**
* Recast timer types. Used as an off set to charProfileStruct timers.
*/
enum RecastTypes
{
RecastTimer0 = 0,
RecastTimer1,
WeaponHealClickTimer, // 2
MuramiteBaneNukeClickTimer, // 3
RecastTimer4,
DispellClickTimer, // 5 (also click heal orbs?)
EpicTimer, // 6
OoWBPClickTimer, // 7
VishQuestClassItemTimer, // 8
HealPotionTimer, // 9
RecastTimer10,
RecastTimer11,
RecastTimer12,
RecastTimer13,
RecastTimer14,
RecastTimer15,
RecastTimer16,
RecastTimer17,
RecastTimer18,
ModRodTimer, // 19
MAX_RECAST_TYPES // 20
};


/*
** Compiler override to ensure
** byte aligned structures
*/
#pragma pack(1)

/*
** Generic Structures used in specific
** structures below
*/

// OpCode stuff (all kinda silly, but until we stop including the OpCode everywhere)...
struct opCodeStruct
{
int16_t opCode;

// kinda silly -- this is required for us to be able to stuff them in a QValueList
bool operator== ( const opCodeStruct t ) const
{
return ( opCode == t.opCode);
}
bool operator== ( uint16_t opCode2 ) const
{
return ( opCode == opCode2 );
}
};

/**
* Session request on a stream. This is sent by the client to initiate
* a session with the zone or world server.
*
* Size: 12 Octets
*/
struct SessionRequestStruct
{
/*0000*/ uint32_t unknown0000;
/*0004*/ uint32_t sessionId;
/*0008*/ uint32_t maxLength;
/*0012*/
};

/**
* Session response on a stream. This is the server replying to a session
* request with session information.
*
* Size: 19 Octets
*/
struct SessionResponseStruct
{
/*0000*/ uint32_t sessionId;
/*0004*/ uint32_t key;
/*0008*/ uint16_t unknown0008;
/*0010*/ uint8_t unknown0010;
/*0011*/ uint32_t maxLength;
/*0015*/ uint32_t unknown0015;
};

/**
* Session disconnect on a stream. This is the server telling the client to
* close a stream.
*
* Size: 8 Octets
*/
struct SessionDisconnectStruct
{
/*0000*/ uint8_t unknown[8];
};

/*
* Used in charProfileStruct
* Size: 4 bytes
*/
struct Color_Struct
{
union
{
struct
{
/*0000*/uint8_t blue;
/*0001*/uint8_t red;
/*0002*/uint8_t green;
/*0003*/uint8_t unknown0003;
} rgb;
/*0000*/uint32_t color;
};
};

/*
** Buffs
** Length: 24 Octets
** Used in:
** charProfileStruct(07012)
*/
struct spellBuff
{
/*0000*/ uint8_t unknown0000; //
/*0001*/ int8_t level; // Level of person who cast buff
/*0002*/ uint8_t unknown0002; //
/*0003*/ uint8_t unknown0003; //
/*0004*/ int32_t spellid; // Spell
/*0008*/ int32_t duration; // Time remaining in ticks
/*0012*/ int32_t effect; // holds the dmg absorb amount on runes
/*0016*/ uint8_t unknown0016[4]; // *** this might need to be swapped with playerId
/*0020*/ uint32_t playerId; // Global id of caster (for wear off)
/*0024*/
};


/*
* Used in charProfileStruct
* Size: 8 octets
*/
struct AA_Array
{
/*000*/ uint32_t AA;
/*004*/ uint32_t value;
/*008*/
};

/**
* An item inline in the stream, used in Bandolier and Potion Belt.
* Size: 72 Octets
*/
struct InlineItem
{
/*000*/ uint32_t itemId;
/*004*/ uint32_t icon;
/*008*/ char itemName[64];
/*072*/
};

/**
* Used in charProfileStruct. Contents of a Bandolier.
* Size: 320 Octets
*/
struct BandolierStruct
{
/*000*/ char bandolierName[32];
/*032*/ InlineItem mainHand;
/*104*/ InlineItem offHand;
/*176*/ InlineItem range;
/*248*/ InlineItem ammo;
/*320*/
};

/**
* A tribute a player can have loaded.
* Size: 8 Octets
*/
struct TributeStruct
{
/*000*/ uint32_t tribute;
/*004*/ uint32_t rank;
/*008*/
};

/**
* A bind point.
* Size: 20 Octets
*/
struct BindStruct
{
/*000*/ uint32_t zoneId;
/*004*/ float x;
/*008*/ float y;
/*012*/ float z;
/*016*/ float heading;
/*020*/
};

/*
* Visible equiptment.
* Size: 12 Octets
*/
struct EquipStruct
{
/*00*/ uint32_t equip0;
/*04*/ uint32_t equip1;
/*08*/ uint32_t itemId;
/*12*/
};

/*
** Type: Zone Change Request (before hand)
** Length: 88 Octets
** OpCode: ZoneChangeCode
*/
struct zoneChangeStruct
{
/*0000*/ char name[64]; // Character Name
/*0064*/ uint16_t zoneId; // zone Id
/*0066*/ uint16_t zoneInstance; // zone Instance
/*0068*/ uint8_t unknown0068[8]; // unknown
/*0076*/ uint8_t unknown0076[12]; // ***Placeholder (6/29/2005)
/*0088*/
};

/*
** Type: Request Zone Change (server asking the client to change zones)
** Size: 24 Octets
** OpCode: OP_RequestZoneChange
*/
struct requestZoneChangeStruct
{
/*0000*/ uint16_t zoneId; // Zone to change to
/*0002*/ uint16_t zoneInstance; // Instance to change to
/*0004*/ float x; // Zone in x coord in next zone
/*0008*/ float y; // Zone in y coord in next zone
/*0012*/ float z; // Zone in z coord in next zone
/*0016*/ float heading; // Zone in heading in next zone
/*0020*/ uint32_t unknown0020; // *** Placeholder
};

/*
** Client Zone Entry struct
** Length: 68 Octets
** OpCode: ZoneEntryCode (when direction == client)
*/
struct ClientZoneEntryStruct
{
/*0000*/ uint32_t unknown0000; // ***Placeholder
/*0004*/ char name[32]; // Player firstname
/*0036*/ uint8_t unknown0036[28]; // ***Placeholder
/*0064*/ uint32_t unknown0064; // unknown
};


/*
** New Zone Code
** Length: 924 Octets
** OpCode: NewZoneCode
*/
struct newZoneStruct
{
/*0000*/ char name[64]; // Character name
/*0064*/ char shortName[32]; // Zone Short Name (maybe longer?)
/*0096*/ char unknown0096[96];
/*0192*/ char longName[278]; // Zone Long Name
/*0470*/ uint8_t ztype; // Zone type
/*0471*/ uint8_t fog_red[4]; // Zone fog (red)
/*0475*/ uint8_t fog_green[4]; // Zone fog (green)
/*0479*/ uint8_t fog_blue[4]; // Zone fog (blue)
/*0483*/ uint8_t unknown0483[87]; // *** Placeholder
/*0570*/ uint8_t sky; // Zone sky
/*0571*/ uint8_t unknown0571[13]; // *** Placeholder
/*0584*/ float zone_exp_multiplier; // Experience Multiplier
/*0588*/ float safe_y; // Zone Safe Y
/*0592*/ float safe_x; // Zone Safe X
/*0596*/ float safe_z; // Zone Safe Z
/*0600*/ float unknown0600; // *** Placeholder
/*0604*/ float unknown0604; // *** Placeholder
/*0608*/ float underworld; // Underworld
/*0612*/ float minclip; // Minimum view distance
/*0616*/ float maxclip; // Maximum view distance
/*0620*/ uint8_t unknown0616[84]; // *** Placeholder
/*0704*/ char zonefile[64]; // Zone file name?
/*0768*/ uint8_t unknown0764[36]; // *** Placeholder (12/05/2006)
/*0804*/ uint8_t unknown0800[32]; // *** Placeholder (02/13/2007)
/*0836*/ uint8_t unknown0832[12]; // *** Placeholder
/*0848*/ uint8_t unknown0844[4]; // *** Placeholder (06/29/2005)
/*0852*/ uint8_t unknown0848[4]; // *** Placeholder (09/13/2005)
/*0856*/ uint8_t unknown0852[4]; // *** Placeholder (02/21/2006)
/*0860*/ uint8_t unknown0856[36]; // *** Placeholder (06/13/2006)
/*0896*/ uint8_t unknown0892[12]; // *** Placeholder (12/05/2006)
/*0908*/ uint8_t unknown0904[8]; // *** Placeholder (02/13/2007)
/*0916*/ uint8_t unknown0916[4]; // *** Placeholder (11/24/2007)
/*0920*/ uint8_t unknown0920[4]; // *** Placeholder (01/17/2008)
/*0924*/ uint8_t unknown0924[4]; // *** Placeholder (09/03/2008)
/*0928*/ uint8_t unknown0928[4]; // *** Placeholder (10/07/2008)
/*0932*/
};

/*
** Dynamic Zone Switch Info Struct
** Length: 32 Octets
** OpCode: DzSwitchInfo
*/
struct dzSwitchInfo
{
/*0000*/ uint32_t unknown0000;
/*0004*/ uint32_t show; // Show compass line
/*0008*/ uint16_t zoneID;
/*0010*/ uint16_t instanceID;
/*0012*/ uint32_t type; // if(type != 1 && type > 2 && type <= 5) { color = green; } else { color = pink; }
/*0016*/ uint32_t unknown0016;
/*0020*/ float y;
/*0024*/ float x;
/*0028*/ float z;
/*0032*/
};

/*
** Dynamic Zone Info Struct
** Length: 208 Octets
** OpCode: DzInfo
*/
struct dzInfo
{
/*0000*/ uint32_t unknown0000;
/*0004*/ uint32_t unknown0004;
/*0008*/ uint8_t newDZ;
/*0009*/ uint8_t padding0009[3];
/*0012*/ uint32_t maxPlayers;
/*0016*/ char dzName[128]; // Instance name
/*0144*/ char name[64]; // Your player's name
/*0208*/
};

/**
* Player Profile. Common part of charProfileStruct shared between
* shrouding and zoning profiles.
*
* NOTE: Offsets are kept in here relative to OP_PlayerProfile to ease in
* diagnosing changes in that struct.
*/
struct playerProfileStruct
{
/*00004*/ uint32_t gender; // Player Gender - 0 Male, 1 Female
/*00008*/ uint32_t race; // Player race
/*00012*/ uint32_t class_; // Player class
/*00016*/ uint8_t unknown00016[40]; // ***Placeholder
/*00056*/ uint8_t level; // Level of player
/*00057*/ uint8_t level1; // Level of player (again?)
/*00058*/ uint8_t unknown00058[2]; // ***Placeholder
/*00060*/ BindStruct binds[5]; // Bind points (primary is first)
/*00160*/ uint32_t deity; // deity
/*00164*/ uint32_t intoxication; // Alcohol level (in ticks till sober?)
/*00168*/ uint32_t spellSlotRefresh[MAX_SPELL_SLOTS]; // Refresh time (millis)
/*00208*/ uint8_t unknown0208[4];
/*00212*/ uint8_t haircolor; // Player hair color
/*00213*/ uint8_t beardcolor; // Player beard color
/*00214*/ uint8_t eyecolor1; // Player left eye color
/*00215*/ uint8_t eyecolor2; // Player right eye color
/*00216*/ uint8_t hairstyle; // Player hair style
/*00217*/ uint8_t beard; // Player beard type
/*00218*/ uint8_t unknown00218[10];
/*00228*/ uint32_t item_material[9]; // Item texture/material of worn items
/*00264*/ uint8_t unknown00260[232];
/*00496*/ Color_Struct item_tint[9]; // RR GG BB 00
/*00532*/ AA_Array aa_array[MAX_AA]; // AAs
/*03404*/ uint8_t unknown03400[728]; // ***** this may be wrong or aa_array might be wrong (10/21/07)
/*04132*/ uint32_t points; // Unspent Practice points
/*04136*/ uint32_t MANA; // Current MANA
/*04140*/ uint32_t curHp; // Current HP without +HP equipment
/*04144*/ uint32_t STR; // Strength
/*04148*/ uint32_t STA; // Stamina
/*04152*/ uint32_t CHA; // Charisma
/*04156*/ uint32_t DEX; // Dexterity
/*04160*/ uint32_t INT; // Intelligence
/*04164*/ uint32_t AGI; // Agility
/*04168*/ uint32_t WIS; // Wisdom
/*04172*/ uint8_t face; // Player face
/*04173*/ uint8_t unknown04173[175];
/*04348*/ int32_t sSpellBook[400]; // List of the Spells in spellbook
/*05948*/ uint8_t unknown5948[448]; // all 0xff after last spell
/*06396*/ int32_t sMemSpells[MAX_SPELL_SLOTS]; // List of spells memorized
/*06436*/ uint8_t unknown06436[28];
/*06464*/ uint32_t platinum; // Platinum Pieces on player
/*06468*/ uint32_t gold; // Gold Pieces on player
/*06472*/ uint32_t silver; // Silver Pieces on player
/*06476*/ uint32_t copper; // Copper Pieces on player
/*06480*/ uint32_t platinum_cursor; // Platinum Pieces on cursor
/*06484*/ uint32_t gold_cursor; // Gold Pieces on cursor
/*06488*/ uint32_t silver_cursor; // Silver Pieces on cursor
/*06492*/ uint32_t copper_cursor; // Copper Pieces on cursor
/*06496*/ uint32_t skills[MAX_KNOWN_SKILLS]; // List of skills
/*06796*/ uint8_t unknown06796[236];
/*07032*/ uint32_t toxicity; // Potion Toxicity (15=too toxic, each potion adds 3)
/*07036*/ uint32_t thirst; // Drink (ticks till next drink)
/*07040*/ uint32_t hunger; // Food (ticks till next eat)
/*07044*/ spellBuff buffs[MAX_BUFFS]; // Buffs currently on the player
/*07644*/ uint32_t disciplines[MAX_DISCIPLINES]; // Known disciplines
/*08044*/ uint8_t unknown08044[160];
/*08204*/ uint32_t recastTimers[MAX_RECAST_TYPES]; // Timers (GMT of last use)
/*08284*/ uint32_t endurance; // Current endurance
/*08288*/ uint32_t aa_spent; // Number of spent AA points
/*08292*/ uint32_t aa_unspent; // Unspent AA points
/*08296*/ uint8_t unknown08296[4];
/*08300*/ BandolierStruct bandoliers[MAX_BANDOLIERS]; // bandolier contents
/*14700*/ InlineItem potionBelt[MAX_POTIONS_IN_BELT]; // potion belt
/*15060*/ uint8_t unknown15060[92];
/*15152*/
};

/*
** Player Profile
** Length: 23488 Octets
** OpCode: CharProfileCode
*/
struct charProfileStruct
{
/*00000*/ uint32_t checksum; //
/*00004*/ playerProfileStruct profile; // Profile
/*15152*/ char name[64]; // Name of player
/*15216*/ char lastName[32]; // Last name of player
/*15248*/ uint8_t unknown15248[12]; //***Placeholder (1/18/2006)
/*15260*/ int32_t guildID; // guildID
/*15264*/ uint32_t birthdayTime; // character birthday
/*15268*/ uint32_t lastSaveTime; // character last save time
/*15272*/ uint32_t timePlayedMin; // time character played
/*15276*/ uint8_t unknown15276[4];
/*15280*/ uint8_t pvp; // 1=pvp, 0=not pvp
/*15281*/ uint8_t anon; // 2=roleplay, 1=anon, 0=not anon
/*15282*/ uint8_t gm; // 0=no, 1=yes (guessing!)
/*15283*/ int8_t guildstatus; // 0=member, 1=officer, 2=guildleader
/*15284*/ uint8_t unknown15284[8];
/*15292*/ uint32_t exp; // Current Experience
/*15296*/ uint8_t unknown15296[12];
/*15308*/ uint8_t languages[MAX_KNOWN_LANGS]; // List of languages
/*15333*/ uint8_t unknown15333[7]; // All 0x00 (language buffer?)
/*15340*/ float y; // Players y position
/*15344*/ float x; // Players x position
/*15348*/ float z; // Players z position
/*15352*/ float heading; // Players heading
/*15356*/ uint32_t standState; // 0x64 = stand
/*15360*/ uint32_t platinum_bank; // Platinum Pieces in Bank
/*15364*/ uint32_t gold_bank; // Gold Pieces in Bank
/*15368*/ uint32_t silver_bank; // Silver Pieces in Bank
/*15372*/ uint32_t copper_bank; // Copper Pieces in Bank
/*15376*/ uint32_t platinum_shared; // Shared platinum pieces
/*15380*/ uint8_t unknown15380[1036];
/*16416*/ uint32_t expansions; // Bitmask for expansions
/*16420*/ uint8_t unknown16420[12];
/*16432*/ uint32_t autosplit; // 0 = off, 1 = on
/*16436*/ uint8_t unknown16436[16];
/*16452*/ uint16_t zoneId; // see zones.h
/*16454*/ uint16_t zoneInstance; // Instance id
/*16456*/ uint8_t unknown16456[800];
/*17256*/ uint32_t leadAAActive; // 0 = leader AA off, 1 = leader AA on
/*17260*/ uint8_t unknown17260[4];
/*17264*/ uint32_t ldon_guk_points; // Earned GUK points
/*17268*/ uint32_t ldon_mir_points; // Earned MIR points
/*17272*/ uint32_t ldon_mmc_points; // Earned MMC points
/*17276*/ uint32_t ldon_ruj_points; // Earned RUJ points
/*17280*/ uint32_t ldon_tak_points; // Earned TAK points
/*17284*/ uint32_t ldon_avail_points; // Available LDON points
/*17288*/ uint8_t unknown17288[136];
/*17424*/ uint32_t tributeTime; // Time remaining on tribute (millisecs)
/*17428*/ uint32_t careerTribute; // Total favor points for this char
/*17432*/ uint32_t unknown17432; // *** Placeholder
/*17436*/ uint32_t currentTribute; // Current tribute points
/*17440*/ uint32_t unknown17440; // *** Placeholder
/*17444*/ uint32_t tributeActive; // 0 = off, 1=on
/*17448*/ TributeStruct tributes[MAX_TRIBUTES]; // Current tribute loadout
/*17488*/ uint8_t unknown17488[4];
/*17492*/ float expGroupLeadAA; // Current group lead exp points
/*17496*/ uint32_t unknown17496;
/*17500*/ float expRaidLeadAA; // Current raid lead AA exp points
/*17504*/ uint32_t unknown17504;
/*17508*/ uint32_t groupLeadAAUnspent; // Unspent group lead AA points
/*17512*/ uint32_t raidLeadAAUnspent; // Unspent raid lead AA points
/*17516*/ uint32_t leadershipAAs[MAX_LEAD_AA]; // Leader AA ranks
/*17644*/ uint8_t unknown17644[128];
/*17772*/ uint32_t airRemaining; // Air supply (seconds)
/*17776*/ uint8_t unknown17776[4608];
/*22384*/ uint32_t expAA; // Exp earned in current AA point
/*22388*/ uint8_t unknown22388[40];
/*22428*/ uint32_t currentRadCrystals; // Current count of radiant crystals
/*22432*/ uint32_t careerRadCrystals; // Total count of radiant crystals ever
/*22436*/ uint32_t currentEbonCrystals;// Current count of ebon crystals
/*22440*/ uint32_t careerEbonCrystals; // Total count of ebon crystals ever
/*22444*/ uint8_t groupAutoconsent; // 0=off, 1=on
/*22445*/ uint8_t raidAutoconsent; // 0=off, 1=on
/*22446*/ uint8_t guildAutoconsent; // 0=off, 1=on
/*22447*/ uint8_t unknown22447[5]; // ***Placeholder (6/29/2005)
/*22452*/ uint32_t showhelm; // 0=no, 1=yes
/*22456*/ uint8_t unknown22456[1032]; // ***Placeholder (2/13/2007)
/*23488*/
};

#if 0
// The following seem to be totally gone from charProfileStruct (9/13/05)
/*2384*/ char title[32]; // Current character title
/*2352*/ char servername[32]; // server the char was created on
/*2416*/ char suffix[32]; // Current character suffix
#endif

#if 1
struct playerAAStruct {
/* 0 */ uint8_t unknown0;
union {
uint8_t unnamed[17];
struct _named {
/* 1 */ uint8_t innate_strength;
/* 2 */ uint8_t innate_stamina;
/* 3 */ uint8_t innate_agility;
/* 4 */ uint8_t innate_dexterity;
/* 5 */ uint8_t innate_intelligence;
/* 6 */ uint8_t innate_wisdom;
/* 7 */ uint8_t innate_charisma;
/* 8 */ uint8_t innate_fire_protection;
/* 9 */ uint8_t innate_cold_protection;
/* 10 */ uint8_t innate_magic_protection;
/* 11 */ uint8_t innate_poison_protection;
/* 12 */ uint8_t innate_disease_protection;
/* 13 */ uint8_t innate_run_speed;
/* 14 */ uint8_t innate_regeneration;
/* 15 */ uint8_t innate_metabolism;
/* 16 */ uint8_t innate_lung_capacity;
/* 17 */ uint8_t first_aid;
} named;
} general_skills;
union {
uint8_t unnamed[17];
struct _named {
/* 18 */ uint8_t healing_adept;
/* 19 */ uint8_t healing_gift;
/* 20 */ uint8_t unknown20;
/* 21 */ uint8_t spell_casting_reinforcement;
/* 22 */ uint8_t mental_clarity;
/* 23 */ uint8_t spell_casting_fury;
/* 24 */ uint8_t chanelling_focus;
/* 25 */ uint8_t unknown25;
/* 26 */ uint8_t unknown26;
/* 27 */ uint8_t unknown27;
/* 28 */ uint8_t natural_durability;
/* 29 */ uint8_t natural_healing;
/* 30 */ uint8_t combat_fury;
/* 31 */ uint8_t fear_resistance;
/* 32 */ uint8_t finishing_blow;
/* 33 */ uint8_t combat_stability;
/* 34 */ uint8_t combat_agility;
} named;
} archetype_skills;
union {
uint8_t unnamed[93];
struct _name {
/* 35 */ uint8_t mass_group_buff; // All group-buff-casting classes(?)
// ===== Cleric =====
/* 36 */ uint8_t divine_resurrection;
/* 37 */ uint8_t innate_invis_to_undead; // cleric, necromancer
/* 38 */ uint8_t celestial_regeneration;
/* 39 */ uint8_t bestow_divine_aura;
/* 40 */ uint8_t turn_undead;
/* 41 */ uint8_t purify_soul;
// ===== Druid =====
/* 42 */ uint8_t quick_evacuation; // wizard, druid
/* 43 */ uint8_t exodus; // wizard, druid
/* 44 */ uint8_t quick_damage; // wizard, druid
/* 45 */ uint8_t enhanced_root; // druid
/* 46 */ uint8_t dire_charm; // enchanter, druid, necromancer
// ===== Shaman =====
/* 47 */ uint8_t cannibalization;
/* 48 */ uint8_t quick_buff; // shaman, enchanter
/* 49 */ uint8_t alchemy_mastery;
/* 50 */ uint8_t rabid_bear;
// ===== Wizard =====
/* 51 */ uint8_t mana_burn;
/* 52 */ uint8_t improved_familiar;
/* 53 */ uint8_t nexus_gate;
// ===== Enchanter =====
/* 54 */ uint8_t unknown54;
/* 55 */ uint8_t permanent_illusion;
/* 56 */ uint8_t jewel_craft_mastery;
/* 57 */ uint8_t gather_mana;
// ===== Mage =====
/* 58 */ uint8_t mend_companion; // mage, necromancer
/* 59 */ uint8_t quick_summoning;
/* 60 */ uint8_t frenzied_burnout;
/* 61 */ uint8_t elemental_form_fire;
/* 62 */ uint8_t elemental_form_water;
/* 63 */ uint8_t elemental_form_earth;
/* 64 */ uint8_t elemental_form_air;
/* 65 */ uint8_t improved_reclaim_energy;
/* 66 */ uint8_t turn_summoned;
/* 67 */ uint8_t elemental_pact;
// ===== Necromancer =====
/* 68 */ uint8_t life_burn;
/* 69 */ uint8_t dead_mesmerization;
/* 70 */ uint8_t fearstorm;
/* 71 */ uint8_t flesh_to_bone;
/* 72 */ uint8_t call_to_corpse;
// ===== Paladin =====
/* 73 */ uint8_t divine_stun;
/* 74 */ uint8_t improved_lay_of_hands;
/* 75 */ uint8_t slay_undead;
/* 76 */ uint8_t act_of_valor;
/* 77 */ uint8_t holy_steed;
/* 78 */ uint8_t fearless; // paladin, shadowknight

/* 79 */ uint8_t two_hand_bash; // paladin, shadowknight
// ===== Ranger =====
/* 80 */ uint8_t innate_camouflage; // ranger, druid
/* 81 */ uint8_t ambidexterity; // all "dual-wield" users
/* 82 */ uint8_t archery_mastery; // ranger
/* 83 */ uint8_t unknown83;
/* 84 */ uint8_t endless_quiver; // ranger
// ===== Shadow Knight =====
/* 85 */ uint8_t unholy_steed;
/* 86 */ uint8_t improved_harm_touch;
/* 87 */ uint8_t leech_touch;
/* 88 */ uint8_t unknown88;
/* 89 */ uint8_t soul_abrasion;
// ===== Bard =====
/* 90 */ uint8_t instrument_mastery;
/* 91 */ uint8_t unknown91;
/* 92 */ uint8_t unknown92;
/* 93 */ uint8_t unknown93;
/* 94 */ uint8_t jam_fest;
/* 95 */ uint8_t unknown95;
/* 96 */ uint8_t unknown96;
// ===== Monk =====
/* 97 */ uint8_t critical_mend;
/* 98 */ uint8_t purify_body;
/* 99 */ uint8_t unknown99;
/* 100 */ uint8_t rapid_feign;
/* 101 */ uint8_t return_kick;
// ===== Rogue =====
/* 102 */ uint8_t escape;
/* 103 */ uint8_t poison_mastery;
/* 104 */ uint8_t double_riposte; // all "riposte" users
/* 105 */ uint8_t unknown105;
/* 106 */ uint8_t unknown106;
/* 107 */ uint8_t purge_poison; // rogue
// ===== Warrior =====
/* 108 */ uint8_t flurry;
/* 109 */ uint8_t rampage;
/* 110 */ uint8_t area_taunt;
/* 111 */ uint8_t warcry;
/* 112 */ uint8_t bandage_wound;
// ===== (Other) =====
/* 113 */ uint8_t spell_casting_reinforcement_mastery; // all "pure" casters
/* 114 */ uint8_t unknown114;
/* 115 */ uint8_t extended_notes; // bard
/* 116 */ uint8_t dragon_punch; // monk
/* 117 */ uint8_t strong_root; // wizard
/* 118 */ uint8_t singing_mastery; // bard
/* 119 */ uint8_t body_and_mind_rejuvenation; // paladin, ranger, bard
/* 120 */ uint8_t physical_enhancement; // paladin, ranger, bard
/* 121 */ uint8_t adv_trap_negotiation; // rogue, bard
/* 122 */ uint8_t acrobatics; // all "safe-fall" users
/* 123 */ uint8_t scribble_notes; // bard
/* 124 */ uint8_t chaotic_stab; // rogue
/* 125 */ uint8_t pet_discipline; // all pet classes except enchanter
/* 126 */ uint8_t unknown126;
/* 127 */ uint8_t unknown127;
} named;
} class_skills;
};
#endif

/*
** Generic Spawn Struct
** Length: Variable.
** Used in:
** dbSpawnStruct
** petStruct
** spawnShroudOther
** spawnShroudSelf
*/

// Fixed-length struct that we'll fill with data from the variable-length packet,
// unnecessary fields removed, arranged in order with the packet.
struct spawnStruct
{
/*0000*/ char name[64];
/*0000*/ uint32_t spawnId;
/*0000*/ uint8_t level;
/*0000*/ uint8_t NPC; // 0=player,1=npc,2=pc corpse,3=npc corpse
/*0000*/ union
{
struct
{
unsigned padding7:1;
unsigned AFK:1;
unsigned sneak:1;
unsigned LFG:1;
unsigned padding6:1;
unsigned invis:1;
unsigned padding5:11;
unsigned gm:1;
unsigned anon:1; // 0=normal, 1=anon, 2=roleplay
unsigned padding4:1;
unsigned gender:1; // Gender (0=male, 1=female)
unsigned padding3:1;
unsigned linkdead:1;
unsigned betabuffed:1;
unsigned padding2:2;
unsigned targetable:1;
unsigned targetcyclable:1;
unsigned padding1:2;
unsigned trader:1;
unsigned buyer:1;
};
int32_t miscData;
};
/*0000*/ uint8_t otherData; // & 4 - has title, & 8 - has suffix, & 1 - it's a chest or untargetable
/*0000*/ uint32_t race;
/*0000*/ uint8_t charProperties;
/*0000*/ uint32_t bodytype;
/*0000*/ uint32_t bodytype2;
/*0000*/ uint8_t curHp;
/*0000*/ uint8_t holding;
/*0000*/ uint32_t deity;
/*0000*/ uint32_t guildID;
/*0000*/ uint32_t guildstatus; // 0=member, 1=officer, 2=leader, -1=not guilded
/*0000*/ uint8_t class_;
/*0000*/ uint8_t state; // stand state
/*0000*/ uint8_t light;
/*0000*/ char lastName[32];
/*0000*/ uint32_t petOwnerId;
union
{
struct
{
/*0000*/ signed padding0000:12; // ***Placeholder
signed deltaX:13; // change in x
signed padding0005:7; // ***Placeholder
/*0000*/ signed deltaHeading:10;// change in heading
signed deltaY:13; // change in y
signed padding0006:9; // ***Placeholder
/*0000*/ signed y:19; // y coord
signed animation:13; // animation
/*0000*/ unsigned heading:12; // heading
signed x:19; // x coord
signed padding0014:1; // ***Placeholder
/*0000*/ signed z:19; // z coord
signed deltaZ:13; // change in z
};
int32_t posData[5];
};
/*0000*/ union
{
struct
{
/*0000*/ Color_Struct color_helmet; // Color of helmet item
/*0000*/ Color_Struct color_chest; // Color of chest item
/*0000*/ Color_Struct color_arms; // Color of arms item
/*0000*/ Color_Struct color_bracers; // Color of bracers item
/*0000*/ Color_Struct color_hands; // Color of hands item
/*0000*/ Color_Struct color_legs; // Color of legs item
/*0000*/ Color_Struct color_feet; // Color of feet item
/*0000*/ Color_Struct color_primary; // Color of primary item
/*0000*/ Color_Struct color_secondary; // Color of secondary item
} equipment_colors;
/*0000*/ Color_Struct colors[9]; // Array elements correspond to struct equipment_colors above
};
/*0000*/ union
{
struct
{
/*0000*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
/*0000*/ EquipStruct equip_chest; // Equiptment: Chest visual
/*0000*/ EquipStruct equip_arms; // Equiptment: Arms visual
/*0000*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
/*0000*/ EquipStruct equip_hands; // Equiptment: Hands visual
/*0000*/ EquipStruct equip_legs; // Equiptment: Legs visual
/*0000*/ EquipStruct equip_feet; // Equiptment: Boots visual
/*0000*/ EquipStruct equip_primary; // Equiptment: Main visual
/*0000*/ EquipStruct equip_secondary; // Equiptment: Off visual
} equip;
/*0000*/ EquipStruct equipment[9];
};
/*0000*/ char title[32];
/*0000*/ char suffix[32];
};

#if 0
// Basic structure of how the packet looks on the wire, for reference.
// May 29, 2008 eqgame.exe
struct spawnStruct
{
/*0000*/ char name[0];
/*0000*/ uint32_t spawnId;
/*0000*/ uint8_t level;
/*0000*/ float unknown1;
/*0000*/ uint8_t NPC; // 0=player,1=npc,2=pc corpse,3=npc corpse
/*0000*/ unsigned padding7:1;
unsigned AFK:1;
unsigned sneak:1;
unsigned LFG:1;
unsigned padding6:1;
unsigned invis:1;
unsigned padding5:11;
unsigned gm:1;
unsigned anon:1; // 0=normal, 1=anon, 2=roleplay
unsigned padding4:1;
unsigned gender:1; // Gender (0=male, 1=female)
unsigned padding3:1;
unsigned linkdead:1;
unsigned betabuffed:1;
unsigned padding2:2;
unsigned targetable:1;
unsigned targetcyclable:1;
unsigned padding1:2;
unsigned trader:1;
unsigned buyer:1;
/*0000*/ uint8_t otherData; // & 4 - has title, & 8 - has suffix, & 1 - it's a chest or untargetable
/*0000*/ uint32_t unknown3;
/*0000*/ uint32_t unknown4;
/*0000*/ uint32_t unknown5;
/*0000*/ uint8_t facestyle;
/*0000*/ float walkspeed;
/*0000*/ float runspeed;
/*0000*/ uint32_t race;
/*0000*/ uint8_t charProperties; // for body types
/*0000*/ uint32_t bodytype;
/*0000*/ uint32_t bodytype2; // this is only present if charProperties==2
// are there more than two possible properties?
/*0000*/ uint8_t curHp;
/*0000*/ uint8_t haircolor;
/*0000*/ uint8_t facialhaircolor;
/*0000*/ uint8_t eyecolor1;
/*0000*/ uint8_t eyecolor2;
/*0000*/ uint8_t hairstyle;
/*0000*/ uint8_t facialhair;
/*0000*/ uint32_t heritage;
/*0000*/ uint32_t tattoo;
/*0000*/ uint32_t details;
/*0000*/ uint8_t holding;
/*0000*/ uint32_t deity;
/*0000*/ uint32_t guildID;
/*0000*/ uint32_t guildstatus; // 0=member, 1=officer, 2=leader, -1=not guilded
/*0000*/ uint8_t class_;
/*0000*/ uint8_t PVP;
/*0000*/ uint8_t state; // stand state
/*0000*/ uint8_t light;
/*0000*/ uint8_t unknown7;
/*0000*/ uint8_t unknown8;
/*0000*/ uint8_t unknown9;
/*0000*/ uint8_t unknown10;
/*0000*/ uint8_t unknown11;
/*0000*/ char lastName[0];
/*0000*/ uint32_t AARank;
/*0000*/ uint8_t unknown12;
/*0000*/ uint32_t petOwnerId;
/*0000*/ uint8_t unknown13;
/*0000*/ uint32_t unknown14;
/*0000*/ uint32_t unknown15;
/*0000*/ uint32_t unknown16;
/*0000*/ uint32_t unknown17;
/*0000*/ uint32_t unknown18;
/*0000*/ uint32_t unknown19;
/*0000*/ signed padding0000:12; // ***Placeholder
signed deltaX:13; // change in x
signed padding0005:7; // ***Placeholder
/*0000*/ signed deltaHeading:10;// change in heading
signed deltaY:13; // change in y
signed padding0006:9; // ***Placeholder
/*0000*/ signed y:19; // y coord
signed animation:13; // animation
/*0000*/ unsigned heading:12; // heading
signed x:19; // x coord
signed padding0014:1; // ***Placeholder
/*0000*/ signed z:19; // z coord
signed deltaZ:13; // change in z
/*0000*/ union
{
struct
{
/*0000*/ Color_Struct color_helmet; // Color of helmet item
/*0000*/ Color_Struct color_chest; // Color of chest item
/*0000*/ Color_Struct color_arms; // Color of arms item
/*0000*/ Color_Struct color_bracers; // Color of bracers item
/*0000*/ Color_Struct color_hands; // Color of hands item
/*0000*/ Color_Struct color_legs; // Color of legs item
/*0000*/ Color_Struct color_feet; // Color of feet item
/*0000*/ Color_Struct color_primary; // Color of primary item
/*0000*/ Color_Struct color_secondary; // Color of secondary item
} equipment_colors;
/*0000*/ Color_Struct colors[9]; // Array elements correspond to struct equipment_colors above
};

// skip these bytes if not a valid player race
/*0000*/ union
{
struct
{
/*0000*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
/*0000*/ EquipStruct equip_chest; // Equiptment: Chest visual
/*0000*/ EquipStruct equip_arms; // Equiptment: Arms visual
/*0000*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
/*0000*/ EquipStruct equip_hands; // Equiptment: Hands visual
/*0000*/ EquipStruct equip_legs; // Equiptment: Legs visual
/*0000*/ EquipStruct equip_feet; // Equiptment: Boots visual
/*0000*/ EquipStruct equip_primary; // Equiptment: Main visual
/*0000*/ EquipStruct equip_secondary; // Equiptment: Off visual
} equip;
/*0000*/ EquipStruct equipment[9];
};

/*0000*/ char title[0]; // only read if(hasTitleOrSuffix & 4)
/*0000*/ char suffix[0]; // only read if(hasTitleOrSuffix & 8)
/*0000*/ char unknown20[32];
};
#endif


#if 0
// Old stuff from spawnStruct seq doesn't actually use at all..
//
/*0004*/ float size; // Model size
/*0078*/ int8_t aa_title; // 0=none, 1=general, 2=archtype, 3=class
/*0074*/ uint8_t invis; // Invis (0=not, 1=invis)
/*0117*/ uint8_t lfg; // 0=off, 1=lfg on
/*0196*/ uint8_t afk; // 0=no, 1=afk
/*0207*/ int8_t guildrank; // 0=normal, 1=officer, 2=leader
/*0213*/ uint8_t face; // Face id for players
/*0247*/ uint8_t is_pet; // 0=no, 1=yes
/*0284*/ uint8_t beardcolor; // Beard color
/*0500*/ uint8_t showhelm; // 0=no, 1=yes
/*0501*/ uint8_t helm; // Helm texture
/*0660*/ uint8_t hairstyle; // Hair style
/*0090*/ uint8_t eyecolor1; // Player's left eye color
/*0542*/ uint8_t eyecolor2; // Left eye color
/*0547*/ uint8_t haircolor; // Hair color
/*0574*/ uint8_t is_npc; // 0=no, 1=yes
/*0575*/ uint8_t findable; // 0=can't be found, 1=can be found
/*0728*/ uint8_t beard; // Beard style (not totally, sure but maybe!)
/*0723*/ uint8_t max_hp; // (name prolly wrong)takes on the value 100 for players, 100 or 110 for NPCs and 120 for PC corpses...
/*122*/ uint8_t pvp; // 0=Not pvp,1=pvp
union
{
/*0091*/ int8_t equip_chest2; // Second place in packet for chest texture (usually 0xFF in live packets)
// Not sure why there are 2 of them, but it effects chest texture!
/*0091*/ int8_t mount_color; // drogmor: 0=white, 1=black, 2=green, 3=red
};
#endif

/*
** Server Zone Entry struct
** Length: 383 Octets
** OpCode: ZoneEntryCode (when direction == server)
*
* This is just a spawnStruct for the player
*/
struct ServerZoneEntryStruct : public spawnStruct
{
};

/*
** Generic Door Struct
** Length: 92 Octets
** Used in:
** OP_SpawnDoor
**
*/

struct doorStruct
{
/*0000*/ char name[16]; // Filename of Door?
/*0016*/ uint8_t unknown016[16]; // ***Placeholder
/*0032*/ float y; // y loc
/*0036*/ float x; // x loc
/*0040*/ float z; // z loc
/*0044*/ float heading; // heading
/*0048*/ uint8_t unknown0028[7]; // ***Placeholder
/*0055*/ int8_t auto_return;
/*0056*/ uint8_t initialState;
/*0057*/ uint8_t unknown041[3];
/*0060*/ uint8_t doorId; // door's id #
/*0061*/ uint8_t opentype;
/*0062*/ uint8_t size; // size of door
/*0063*/ uint8_t holdstateforever;
/*0064*/ uint32_t zonePoint;
/*0068*/ uint8_t unknown068[12]; // ***Placeholder
/*0080*/ uint8_t unknown0080[8]; // ***Placeholder (12/07/2005)
/*0088*/ uint8_t unknown0088[4]; // ***Placeholder (2/13/2007)
/*0092*/
};

/*
** Drop Item On Ground
** Length: 104 Octets
** OpCode: MakeDropCode
*/
struct makeDropStruct
{
/*0000*/ uint32_t prevObject; // Previous object in the linked list
/*0004*/ uint32_t nextObject; // Next object in the linked list
/*0008*/ uint32_t unknown0008; // ***Placeholder
/*0012*/ uint32_t dropId; // DropID
/*0016*/ uint16_t zoneId; // ZoneID
/*0018*/ uint16_t zoneInstance; // Zone instance id
/*0020*/ uint8_t unknown0020[8]; // ***Placeholder
/*0028*/ uint8_t unknown0028[12]; // ***Placeholder (9/23/2006)
/*0040*/ float heading; // Heading
/*0044*/ float z; // Z Position
/*0048*/ float x; // X Position
/*0052*/ float y; // Y Position
/*0056*/ char idFile[16]; // ACTOR ID
/*0072*/ uint32_t unknown0072[5]; // ***Placeholder
/*0092*/ uint32_t dropType; // drop type
/*0096*/ uint32_t unknown0096; // ***Placeholder
/*0100*/ uint32_t userSpawnID; // spawn id of the person using
/*0104*/
};

/*
** ZonePoint
** Length: 24 Octets
** Sent as part of zonePointsStruct
*/

struct zonePointStruct
{
/*0000*/ uint32_t zoneTrigger;
/*0004*/ float y;
/*0008*/ float x;
/*0012*/ float z;
/*0016*/ float heading;
/*0020*/ uint16_t zoneId;
/*0022*/ uint16_t zoneInstance;
/*0024*/
};

/*
** ZonePointsStruct
** Length: Variable
** OPCode: OP_SendZonePoints
*/
struct zonePointsStruct
{
/*0000*/ uint32_t count;
/*0004*/ zonePointStruct zonePoints[0];
/*0xxx*/ uint8_t unknown0xxx[24];
/*0yyy*/
};

/*
** Time of Day
** Length: 8 Octets
** OpCode: TimeOfDayCode
*/
struct timeOfDayStruct
{
/*0000*/ uint8_t hour; // Hour (1-24)
/*0001*/ uint8_t minute; // Minute (0-59)
/*0002*/ uint8_t day; // Day (1-28)
/*0003*/ uint8_t month; // Month (1-12)
/*0004*/ uint16_t year; // Year
/*0006*/ uint16_t unknown0016; // Placeholder
/*0008*/
};

/*
** Item Packet Struct - Works on a variety of item operations
** Packet Types: See ItemPacketType enum
** Length: Variable
** OpCode: ItemCode
*/
struct itemPacketStruct
{
/*000*/ ItemPacketType packetType; // See ItemPacketType for more info.
/*004*/ char serializedItem[0];
/*xx*/
};

/*
** Item Info Request Struct
** OpCode: ItemInfoCode
*/
struct itemInfoReqStruct
{
/*000*/ uint32_t itemNr; // ItemNr
/*005*/ uint32_t requestSeq; // Request sequence number
/*008*/ char name[64]; // Item name
/*072*/
};

/*
** Item Info Response Struct
** Length: Variable
** OpCode: ItemInfoCode
*/
struct itemInfoStruct
{
/*000*/ uint32_t requestSeq; // Corresponds to sequence # in req
/*004*/ char serializedItem[0];
/*xxx*/
};

/*
** Simple Spawn Update
** Length: 14 Octets
** OpCode: MobUpdateCode
*/

struct spawnPositionUpdate
{
/*0000*/ int16_t spawnId;
/*0002*/ int64_t y:19, z:19, x:19, u3:7;
unsigned heading:12;
signed unused2:4;
/*0010*/
};

/*
** Rename a spawn
** Length: 200 Octets
** OpCode: SpawnRename
*/
struct spawnRenameStruct
{
/*000*/ char old_name[64];
/*064*/ char old_name_again[64]; //not sure what the difference is
/*128*/ char new_name[64];
/*192*/ uint32_t unknown192; //set to 0
/*196*/ uint32_t unknown196; //set to 1
};

/*
** Illusion a spawn
** Length: 256 Octets
** OpCode: Illusion
*/
struct spawnIllusionStruct
{
/*0000*/ uint32_t spawnId; // Spawn id of the target
/*0004*/ char name[64]; // Name of the target
/*0068*/ uint32_t race; // New race
/*0072*/ uint8_t gender; // New gender (0=male, 1=female)
/*0073*/ uint8_t texture; // ???
/*0074*/ uint8_t helm; // ???
/*0075*/ uint8_t unknown0077; // ***Placeholder
/*0076*/ uint32_t face; // New face
/*0080*/ uint8_t unknown0080[176]; // ***Placeholder
/*0256*/
};

/**
* Shroud spawn. For others shrouding, this has their spawnId and
* spawnStruct.
*
* Length: variable
* OpCode: OP_Shroud
*/
struct spawnShroudOther
{
/*00000*/ uint32_t spawnId; // Spawn Id of the shrouded player
/*00004*/ uint16_t spawnStructSize; // Size of spawnStruct (or start of)
/*00006*/ spawnStruct spawn; // Updated spawn struct for the player (variable length)
/*xxxxx*/
};

/**
* Shroud yourself. For yourself shrouding, this has your spawnId, spawnStruct,
* bits of your charProfileStruct (no checksum, then charProfile up till
* but not including name), and an itemPlayerPacket for only items on the player
* and not the bank.
*
* Length: Variable
* OpCode: OP_Shroud
*/
struct spawnShroudSelf
{
/*00000*/ uint32_t spawnId; // Spawn Id of you
/*00004*/ uint16_t ppStart; // Start of playerProfile data (spawnId+ppStart+spawnStruct)
/*00004*/ spawnStruct spawn; // Updated spawnStruct for you (variable length)
/*xxxxx*/ playerProfileStruct profile; // Character profile for shrouded char
/*xxxxx*/ uint8_t items; // Items on the player
/*xxxxx*/
};

/*
** Campfire spawn
** Length: 997
** OpCode: OP_ZoneEntry
*/
struct spawnCampfire
{
/*0000*/ spawnStruct spawn;
/*0532*/ uint8_t unknown0532[465];
/*0997*/
};


/*
** ShowEQ Specific Structures
*/

/*
** DB spawn struct (adds zone spawn was in)
*/

struct dbSpawnStruct
{
/*0000*/ struct spawnStruct spawn; // Spawn Information
/*0258*/ char zoneName[40]; // Zone Information
};

/*
** Pet spawn struct (pets pet and owner in one struct)
*/

struct petStruct
{
/*0000*/ struct spawnStruct owner; // Pet Owner Information
/*0258*/ struct spawnStruct pet; // Pet Infromation
};

/*
** Server System Message
** Length: Variable Length
** OpCode: SysMsgCode
*/

struct sysMsgStruct
{
/*0000*/ char message[0]; // Variable length message
};

/*
** Emote text
** Length: Variable Text
** OpCode: emoteTextCode
*/

struct emoteTextStruct
{
/*0000*/ uint8_t unknown0002[4]; // ***Placeholder
/*0002*/ char text[0]; // Emote `Text
};

/*
** Channel Message received or sent
** Length: 148 Octets + Variable Length + 4 Octets
** OpCode: ChannelMessageCode
*/

struct channelMessageStruct
{
/*0000*/ char target[64]; // the target characters name
/*0064*/ char sender[64]; // The senders name
/*0128*/ uint32_t language; // Language
/*0132*/ uint32_t chanNum; // Channel
/*0136*/ int8_t unknown0136[8]; // ***Placeholder
/*0144*/ uint32_t skillInLanguage; // senders skill in language
/*0148*/ char message[0]; // Variable length message
};

/*
** Formatted text messages
** Length: Variable Text
** OpCode: emoteTextCode
*/

struct formattedMessageStruct
{
/*0000*/ uint8_t unknown0002[4]; // ***Placeholder
/*0004*/ uint32_t messageFormat; // Indicates the message format
/*0008*/ ChatColor messageColor; // Message color
/*0012*/ char messages[0]; // messages(NULL delimited)
/*0???*/ uint8_t unknownXXXX[8]; // ***Placeholder
};

/*
** Simple text messages
** Length: 12 Octets
** OpCode: SimpleMessageCode
*/

struct simpleMessageStruct
{
/*0000*/ uint32_t messageFormat; // Indicates the message format
/*0004*/ ChatColor messageColor; // Message color
/*0008*/ uint32_t unknown; // ***Placeholder
/*0012*/
};

/*
** Special Message Struct
** Length: Variable Text
** OPCode: OP_SpecialMesg
*/

struct specialMessageStruct
{
/*0000*/ uint8_t unknown0000[3]; // message style?
/*0003*/ ChatColor messageColor; // message color
/*0007*/ uint16_t target; // message target
/*0009*/ uint16_t padding; // padding
/*0011*/ char source[0]; // message text
/*0xxx*/ uint32_t unknown0xxx[3]; //***Placeholder
/*0yyy*/ char message[0]; // message text
};

/*
** Guild MOTD Struct
** Length: Variable Text
** OPCode: OP_GuildMOTD
*/
struct guildMOTDStruct
{
/*0000*/ uint32_t unknown0000; //***Placeholder
/*0004*/ char target[64]; // motd target
/*0068*/ char sender[64]; // motd "sender" (who set it)
/*0132*/ uint32_t unknown0132; //***Placeholder
/*0136*/ char message[0];
};

/*
** Corpse location
** Length: 18 Octets
** OpCode: corpseLocCode
*/

struct corpseLocStruct
{
/*0000*/ uint32_t spawnId;
/*0004*/ float x;
/*0008*/ float y;
/*0012*/ float z;
};

/*
** Consent request
** Length: Variable by length of the name of the consentee
*/

struct consentRequestStruct
{
/*0000*/ char consentee[0]; // Name of player who was consented
};

/*
** Consent Response
** Length: 193 Octets
*/

struct consentResponseStruct
{
/*0000*/ char consentee[64]; // Name of player who was consented
/*0064*/ char consenter[64]; // Name of player who consented
/*0128*/ uint8_t allow; // 00 = deny, 01 = allow
/*0129*/ char corpseZoneName[64]; // Zone where the corpse is
/*0193*/
};

/*
** Grouping Infromation
** Length: 452 Octets
** OpCode: OP_GroupUpdate
*/

struct groupUpdateStruct
{
/*0000*/ int32_t action; // Group update action
/*0004*/ char yourname[64]; // Group Member Names
/*0068*/ char membername[64]; // Group leader name
/*0132*/ uint8_t unknown0132[324]; // ***Placeholder
/*456*/
};


/*
** DEPRECATED
** Grouping Infromation
** Length: 768 Octets
** OpCode: OP_GroupUpdate
*/

struct groupFullUpdateStruct
{
/*0000*/ int32_t action;
/*0004*/ char membernames[MAX_GROUP_MEMBERS][64]; // Group Member Names
/*0388*/ char leader[64]; // Group leader Name
/*0452*/ char unknown0452[316]; // ***Placeholder
/*0768*/
};

/*
** Grouping Invite
** Length 148 Octets (invite a player) or 152 (you get invited)
** Opcode OP_GroupInvite
*/

struct groupInviteStruct
{
/*0000*/ char invitee[64]; // Invitee's Name
/*0064*/ char inviter[64]; // Inviter's Name
/*0128*/ uint8_t unknown0128[20]; // ***Placeholder
/*0148*/
};

struct groupAltInviteStruct
{
/*0000*/ char invitee[64]; // Invitee's Name
/*0064*/ char inviter[64]; // Inviter's Name
/*0128*/ uint8_t unknown0128[24]; // ***Placeholder
/*0152*/
};

/*
** Grouping Invite Answer - Decline
** Length 152 Octets
** Opcode GroupDeclineCode
*/

struct groupDeclineStruct
{
/*0000*/ char yourname[64]; // Player Name
/*0064*/ char membername[64]; // Invited Member Name
/*0128*/ uint8_t unknown0128[20]; // ***Placeholder
/*0148*/ uint8_t reason; // Already in Group = 1, Declined Invite = 3
/*0149*/ uint8_t unknown0141[3]; // ***Placeholder
/*0152*/
};

/*
** Grouping Invite Answer - Accept
** Length 148 Octets
** Opcode OP_GroupFollow
*/

struct groupFollowStruct
{
/*0000*/ char unknown0000[64]; // ***Placeholder (zeros)
/*0064*/ char invitee[64]; // Invitee's Member Name
/*0128*/ uint8_t unknown0132[4]; // ***Placeholder
/*0132*/ uint32_t level; // Invitee's level
/*0136*/ uint8_t unknown0136[12]; // ***Placeholder (zeros)
/*0148*/
};

/*
** Group Disbanding
** Length 148 Octets
** Opcode
*/

struct groupDisbandStruct
{
/*0000*/ char yourname[64]; // Player Name
/*0064*/ char membername[64]; // Invited Member Name
/*0128*/ uint8_t unknown0128[20]; // ***Placeholder
/*0148*/
};

/*
** Group Leader Change
** Length 148 Octets
** Opcode OP_GroupLeader
*/

struct groupLeaderChangeStruct
{
/*0000*/ char unknown0000[64]; // ***Placeholder
/*0064*/ char membername[64]; // Invited Member Name
/*0128*/ uint8_t unknown0128[20]; // ***Placeholder
/*0148*/
};

/*
** Delete Self
** Length: 4 Octets
** OpCode: OP_DeleteSpawn
*/

struct deleteSpawnStruct
{
/*0000*/ uint32_t spawnId; // Spawn ID to delete
};

/*
** Remove Spawn
** Length: 5 Octets
** OpCode: OP_RemoveSpawn
*/

struct removeSpawnStruct
{
/*0000*/ uint32_t spawnId; // Spawn ID to delete
/*0004*/ uint8_t removeSpawn; // 0 if spawn is not in your update radius
};

/*
** Remove Drop Item On Ground
** Length: 8 Octets
** OpCode: RemDropCode
*/

struct remDropStruct
{
/*0000*/ uint16_t dropId; // DropID - Guess
/*0002*/ uint8_t unknown0004[2]; // ***Placeholder
/*0004*/ uint16_t spawnId; // Pickup ID - Guess
/*0006*/ uint8_t unknown0008[2]; // ***Placeholder
};

/*
** Consider Struct
** Length: 20 Octets
** OpCode: considerCode
*/

struct considerStruct
{
/*0000*/ uint32_t playerid; // PlayerID
/*0004*/ uint32_t targetid; // TargetID
/*0008*/ int32_t faction; // Faction
/*0012*/ int32_t level; // Level
/*0016*/ int32_t unknown0016; // unknown
/*0020*/
};

/*
** Spell Casted On
** Length: 36 Octets
** OpCode: castOnCode
*/

struct castOnStruct
{
/*0000*/ uint16_t targetId; // Target ID
/*0002*/ uint8_t unknown0002[2]; // ***Placeholder
/*0004*/ int16_t sourceId; // ***Source ID
/*0006*/ uint8_t unknown0006[2]; // ***Placeholder
/*0008*/ uint8_t unknown0008[24]; // might be some spell info?
/*0032*/ uint16_t spellId; // Spell Id
/*0034*/ uint8_t unknown0034[2]; // ***Placeholder
};

/*
** Spawn Death Blow
** Length: 32 Octets
** OpCode: NewCorpseCode
*/

struct newCorpseStruct
{
/*0000*/ uint32_t spawnId; // Id of spawn that died
/*0004*/ uint32_t killerId; // Killer
/*0008*/ uint32_t corpseid; // corpses id
/*0012*/ int32_t type; // corpse type?
/*0016*/ uint32_t spellId; // ID of Spell
/*0020*/ uint16_t zoneId; // Bind zone id
/*0022*/ uint16_t zoneInstance; // Bind zone instance
/*0024*/ uint32_t damage; // Damage
/*0028*/ uint8_t unknown0028[4]; // ***Placeholder
/*0032*/
};

/**
** Environmental damage (lava, falls)
** Length: 31 Octets
*/

struct environmentDamageStruct
{
/*0000*/ uint32_t spawnId; // Who is taking the damage
/*0004*/ uint8_t unknown0004[2];
/*0006*/ uint32_t damage; // how much damage?
/*0010*/ uint8_t unknown0010[12];
/*0022*/ uint8_t type; // Damage type. FC = fall. FA = lava.
/*0023*/ uint8_t unknown0023[8];
};

/*
** Money Loot
** Length: 20 Octets
** OpCode: MoneyOnCorpseCode
*/

struct moneyOnCorpseStruct
{
/*0000*/ uint8_t unknown0002[4]; // ***Placeholder
/*0004*/ uint32_t platinum; // Platinum Pieces
/*0008*/ uint32_t gold; // Gold Pieces
/*0012*/ uint32_t silver; // Silver Pieces
/*0016*/ uint32_t copper; // Copper Pieces
/*0020*/
};

/*
** Stamina
** Length: 8 Octets
** OpCode: staminaCode
*/

struct staminaStruct
{
/*0000*/ uint32_t food; // Hunger, in ticks till next eat
/*0004*/ uint32_t water; // Thirst, in ticks till next eat
/*0008*/
};

/*
** Battle Code
** Length: 28 Octets
** OpCode: ActionCode
*/

// This can be used to gather info on spells cast on us
struct action2Struct
{
/*0000*/ uint16_t target; // Target ID
/*0002*/ uint16_t source; // Source ID
/*0004*/ uint8_t type; // Bash, kick, cast, etc.
/*0005*/ int16_t spell; // SpellID
/*0007*/ int32_t damage;
/*0011*/ uint8_t unknown0011[13]; // ***Placeholder
/*0024*/ uint8_t unknown0024[4]; // ***Placeholder (11/24/07)
/*0028*/
};

// This can be used to gather info on spells cast on us
struct actionStruct
{
/*0000*/ uint16_t target; // Target ID
/*0002*/ uint16_t source; // SourceID
/*0004*/ uint8_t level; // Caster level
/*0005*/ uint8_t unknown0005[17]; // ***Placeholder
/*0022*/ uint8_t type; // Casts, Falls, Bashes, etc...
/*0023*/ int32_t damage; // Amount of Damage
/*0027*/ int16_t spell; // SpellID
/*0029*/ uint8_t unknown0029[2]; // ***Placeholder
/*0031*/
};

// Starting with 2/21/2006, OP_Actions seem to come in pairs, duplicating
// themselves, with the second one with slightly more information. Maybe this
// has to do with buff blocking??
struct actionAltStruct
{
/*0000*/ uint16_t target; // Target ID
/*0002*/ uint16_t source; // SourceID
/*0004*/ uint8_t level; // Caster level
/*0005*/ uint8_t unknown0005[17]; // ***Placeholder
/*0022*/ uint8_t type; // Casts, Falls, Bashes, etc...
/*0023*/ int32_t damage; // Amount of Damage
/*0027*/ int16_t spell; // SpellID
/*0029*/ uint8_t unknown0029[2]; // ***Placeholder
/*0031*/ uint32_t unknown0031;
/*0035*/ uint8_t unknown0035[21];
/*0056*/
};

/*
** client changes target struct
** Length: 4 Octets
** OpCode: clientTargetCode
*/

struct clientTargetStruct
{
/*0000*/ uint32_t newTarget; // Target ID
/*0004*/
};

/*
** Info sent when you start to cast a spell
** Length: 20 Octets
** OpCode: StartCastCode
*/

struct startCastStruct
{
/*0000*/ int32_t slot; // ***Placeholder
/*0004*/ uint32_t spellId; // Spell ID
/*0008*/ int32_t inventorySlot; // ***Placeholder
/*0012*/ uint32_t targetId; // The current selected target
/*0016*/ uint8_t unknown0018[4]; // ***Placeholder
/*0020*/
};

/*
** New Mana Amount
** Length: 20 Octets
** OpCode: manaDecrementCode
*/

struct manaDecrementStruct
{
/*0000*/ int32_t newMana; // New Mana AMount
/*0004*/ int32_t unknown;
/*0008*/ int32_t spellId; // Last Spell Cast
/*0012*/ uint8_t unknown0012[4];
/*0016*/ uint8_t unknown0016[4]; //*** Placeholder (02/13/07)
/*0020*/
};

/*
** Special Message
** Length: 4 Octets + Variable Text Length
** OpCode: SPMesgCode
*/
struct spMesgStruct
{
/*0000*/ int32_t msgType; // Type of message
/*0004*/ char message[0]; // Message, followed by four Octets?
};

/*
** Spell Fade Struct
** Length: 10 Octets
** OpCode: SpellFadedCode
*/
struct spellFadedStruct
{
/*0000*/ uint32_t color; // color of the spell fade message
/*0004*/ char message[0]; // fade message
/*0???*/ uint8_t paddingXXX[3]; // always 0's
};

/*
** Spell Action Struct
** Length: 8 Octets
** OpCode: BeginCastCode
*/
struct beginCastStruct
{
/*0000*/ uint16_t spawnId; // Id of who is casting
/*0002*/ uint16_t spellId; // Id of spell
/*0004*/ int16_t param1; // Paramater 1
/*0006*/ int16_t param2; // Paramater 2
/*0008*/
};

/*
** Spell Action Struct
** Length: 16 Octets
** OpCode: MemSpellCode
*/

struct memSpellStruct
{
/*0000*/ uint32_t slotId; // Slot spell is being memorized in
/*0004*/ uint32_t spellId; // Id of spell
/*0008*/ int16_t param1; // Paramater 1
/*0010*/ int16_t param2; // Paramater 2
/*0012*/ uint8_t unknown0012[4]; // *** Placeholder
/*0016*/
};

/*
** Train Skill
** Length: 12 Octets
** OpCode: SkillTrainCode
*/

struct skillTrainStruct
{
/*0000*/ int32_t playerid; // player doing the training
/*0004*/ int32_t type; // type of training?
/*0008*/ uint32_t skillId; // Id of skill
/*0012*/
};

/*
** Skill Increment
** Length: 8 Octets
** OpCode: SkillIncCode
*/

struct skillIncStruct
{
/*0000*/ uint32_t skillId; // Id of skill
/*0004*/ int32_t value; // New value of skill
/*0008*/
};

/*
** When somebody changes what they're wearing
** or give a pet a weapon (model changes)
** Length: 14 Octets
** Opcode: WearChangeCode
*/

// ZBTEMP: Find newItemID
struct wearChangeStruct
{
/*0000*/ uint16_t spawnId; // SpawnID
/*0002*/ Color_Struct color; // item color
/*0006*/ uint8_t wearSlotId; // Slot ID
/*0007*/ uint8_t unknown0005[7]; // unknown
/*0014*/
};

/*
** Level Update
** Length: 12 Octets
** OpCode: LevelUpUpdateCode
*/

struct levelUpUpdateStruct
{
/*0000*/ uint32_t level; // New level
/*0004*/ uint32_t levelOld; // Old level
/*0008*/ uint32_t exp; // Current Experience
/*0012*/
};

/*
** Experience Update
** Length: 8 Octets
** OpCode: ExpUpdateCode
*/

struct expUpdateStruct
{
/*0000*/ uint32_t exp; // experience value x/330
/*0004*/ uint32_t type; // 0=set, 2=update
/*0008*/
};

/*
** Alternate Experience Update
** Length: 12 Octets
** OpCode: AltExpUpdateCode
*/
struct altExpUpdateStruct
{
/*0000*/ uint32_t altexp; // alt exp x/330
/*0004*/ uint32_t aapoints; // current number of AA points
/*0008*/ uint8_t percent; // percentage in integer form
/*0009*/ uint8_t unknown0009[3]; // ***Place Holder
/*0012*/
};

/**
* Leadership AA update
* Length: 32 Octets
* OpCode: LeadExpUpdate
*/
struct leadExpUpdateStruct
{
/*0000*/ uint32_t unknown0000; // All zeroes?
/*0004*/ uint32_t groupLeadExp; // Group leadership exp value
/*0008*/ uint32_t unspentGroupPoints; // Unspent group points
/*0012*/ uint32_t unknown0012; // Type?
/*0016*/ uint32_t unknown0016; // All zeroes?
/*0020*/ uint32_t raidLeadExp; // Raid leadership exp value
/*0024*/ uint32_t unspentRaidPoints; // Unspent raid points
/*0028*/ uint32_t unknown0028;
};

/*
** Player Spawn Update
** Length: 19 Octets
** OpCode: SpawnUpdateCode
*/

struct SpawnUpdateStruct
{
/*0000*/ uint16_t spawnId; // Id of spawn to update
/*0002*/ uint16_t subcommand; // some sort of subcommand type
/*0004*/ int16_t arg1; // first option
/*0006*/ int16_t arg2; // second option
/*0008*/ uint8_t arg3; // third option?
/*0009*/ uint8_t unknown0009[10];
/*0019*/
};

/*
** NPC Hp Update
** Length: 10 Octets
** Opcode NpcHpUpdateCode
*/

struct hpNpcUpdateStruct
{
/*0000*/ int32_t curHP;
/*0004*/ int32_t maxHP;
/*0008*/ uint16_t spawnId;
/*0010*/
};

/*
** Inspecting Information
** Length: 1860 Octets
** OpCode: InspectDataCode
*/

struct inspectDataStruct
{
/*0000*/ uint8_t unknown0000[8]; // ***Placeholder
/*0008*/ char itemNames[23][64]; // 23 items with names
// 64 characters long.
/*1480*/ int32_t icons[23]; // Icon Information
/*1572*/ char mytext[200]; // Player Defined Text Info
/*1772*/ uint8_t unknown1772[88]; // ***Placeholder
/*1860*/
};

/*
** Reading Book Information
** Length: Variable Length Octets
** OpCode: BookTextCode
*/

struct bookTextStruct
{
/*0000*/ uint16_t unknown0000;
/*0002*/ char text[0]; // Text of item reading
};

/*
** Interrupt Casting
** Length: 6 Octets + Variable Length Octets
** Opcode: BadCastCode
*/

struct badCastStruct
{
/*0000*/ uint32_t spawnId; // Id of who is casting
/*0004*/ char message[0]; // Text Message
};

/*
** Random Number Request
** Length: 8 Octets
** OpCode: RandomCode
*/
struct randomReqStruct
{
/*0000*/ uint32_t bottom; // Low number
/*0004*/ uint32_t top; // High number
};

/*
** Random Number Result
** Length: 76 Octets
** OpCode: RandomCode
*/
struct randomStruct
{
/*0000*/ uint32_t bottom; // Low number
/*0004*/ uint32_t top; // High number
/*0008*/ uint32_t result; // result number
/*0012*/ char name[64]; // name rolled by
/*0076*/
};

/*
** Player Position Update
** Length: 22 Octets
** OpCode: PlayerPosCode
*/

struct playerSpawnPosStruct
{
/*0000*/ uint16_t spawnId;
/*0002*/ signed padding0000:12; // ***Placeholder
signed deltaX:13; // change in x
signed padding0005:7; // ***Placeholder
/*0006*/ signed deltaHeading:10;// change in heading
signed deltaY:13; // change in y
signed padding0006:9; // ***Placeholder
/*0010*/ signed y:19; // y coord
signed animation:10; // animation
signed padding0010:3; // ***Placeholder
/*0014*/ unsigned heading:12; // heading
signed x:19; // x coord
signed padding0014:1; // ***Placeholder
/*0018*/ signed z:19; // z coord
signed deltaZ:13; // change in z
/*0022*/
};

/*
** Self Position Update
** Length: 40 Octets
** OpCode: PlayerPosCode
*/

struct playerSelfPosStruct
{
/*0000*/ uint16_t spawnId; // Player's spawn id
/*0002*/ uint8_t unknown0002[2]; // ***Placeholder (update time counter?)
/*0004*/ uint8_t unknown0004[4]; // ***Placeholder
/*0008*/ float x; // x coord (2nd loc value)
/*0012*/ float y; // y coord (1st loc value)
/*0016*/ signed deltaHeading:10; // change in heading
unsigned animation:10; // animation
unsigned padding0016:12; // ***Placeholder
/*0020*/ float deltaX; // Change in x
/*0024*/ float deltaY; // Change in y
/*0028*/ float z; // z coord (3rd loc value)
/*0032*/ float deltaZ; // Change in z
/*0036*/ unsigned padding0036:10; // ***Placeholder
unsigned heading:12; // Directional heading
unsigned padding0037:10; // ***Placeholder
/*0040*/
};


/*
** Spawn Appearance
** Length: 8 Octets
** OpCode: spawnAppearanceCode
*/

struct spawnAppearanceStruct
{
/*0000*/ uint16_t spawnId; // ID of the spawn
/*0002*/ uint16_t type; // Type of data sent
/*0004*/ uint32_t parameter; // Values associated with the type
/*0008*/
};


/*
** Structures that are not being currently used
* (except for logging)
*/

struct bindWoundStruct
{
/*0000*/ uint16_t playerid; // TargetID
/*0002*/ uint8_t unknown0002[2]; // ***Placeholder
/*0004*/ uint32_t hpmaybe; // Hitpoints -- Guess
/*0008*/
};

struct inspectedStruct
{
/*0000*/ uint16_t inspectorid; // Source ID
/*0002*/ uint8_t unknown0002[2]; // ***Placeholder
/*0004*/ uint16_t inspectedid; // Target ID - Should be you
/*0006*/ uint8_t unknown0006[2]; // ***Placeholder
/*0008*/
};

struct attack1Struct
{
/*0000*/ uint16_t spawnId; // Spawn ID
/*0002*/ int16_t param1; // ***Placeholder
/*0004*/ int16_t param2; // ***Placeholder
/*0006*/ int16_t param3; // ***Placeholder
/*0008*/ int16_t param4; // ***Placeholder
/*0010*/ int16_t param5; // ***Placeholder
/*0012*/
};

struct attack2Struct
{
/*0000*/ uint16_t spawnId; // Spawn ID
/*0002*/ int16_t param1; // ***Placeholder
/*0004*/ int16_t param2; // ***Placeholder
/*0006*/ int16_t param3; // ***Placeholder
/*0008*/ int16_t param4; // ***Placeholder
/*0010*/ int16_t param5; // ***Placeholder
/*0012*/
};

struct newGuildInZoneStruct
{
/*0000*/ uint8_t unknown0000[8]; // ***Placeholder
/*0008*/ char guildname[56]; // Guildname
/*0064*/
};

struct moneyUpdateStruct
{
/*0000*/ uint32_t spawnid; // ***Placeholder
/*0004*/ uint32_t cointype; // Coin Type
/*0008*/ uint32_t amount; // Amount
/*0012*/
};

/* Memorize slot operations, mem, forget, etc */

struct memorizeSlotStruct
{
/*0000*/ uint32_t slot; // Memorization slot (0-7)
/*0004*/ uint32_t spellId; // Id of spell
// (offset of spell in spdat.eff)
/*0008*/ uint32_t action; // 1-memming,0-scribing,2-forget
/*0012*/
};

struct cRunToggleStruct
{
/*0000*/ uint32_t status; //01=run 00=walk
};

struct cChatFiltersStruct
{
/*0000*/ uint32_t DamageShields; //00=on 01=off
/*0004*/ uint32_t NPCSpells; //00=on 01=off
/*0008*/ uint32_t PCSpells; //00=all 01=off 02=grp
/*0012*/ uint32_t BardSongs; //00=all 01=me 02=grp 03=off
/*0016*/ uint32_t Unused;
/*0020*/ uint32_t GuildChat; //00=off 01=on
/*0024*/ uint32_t Socials; //00=off 01=on
/*0028*/ uint32_t GroupChat; //00=off 01=on
/*0032*/ uint32_t Shouts; //00=off 01=on
/*0036*/ uint32_t Auctions; //00=off 01=on
/*0040*/ uint32_t OOC; //00=off 01=on
/*0044*/ uint32_t MyMisses; //00=off 01=on
/*0048*/ uint32_t OthersMisses; //00=off 01=on
/*0052*/ uint32_t OthersHits; //00=off 01=on
/*0056*/ uint32_t AttackerMisses; //00=off 01=on
/*0060*/ uint32_t CriticalSpells; //00=all 01=me 02=off
/*0064*/ uint32_t CriticalMelee; //00=all 01=me 02=off
/*0068*/
};

struct cOpenSpellBookStruct
{
/*0000*/ int32_t status; //01=open 00=close
/*0004*/
};

struct tradeSpellBookSlotsStruct
{
/*0000*/ uint32_t slot1;
/*0004*/ uint32_t slot2;
/*0008*/
};


/*
** serverLFGStruct
** Length: 10 Octets
** signifies LFG, maybe afk, role, ld, etc
*/

struct serverLFGStruct
{
/*0000*/ uint16_t spawnID;
/*0002*/ uint16_t unknown0004;
/*0004*/ uint16_t LFG; //1=LFG
/*0006*/ uint16_t unknown0008;
/*0008*/
};

/*
** clientLFGStruct
** Length: 70 Octets
** signifies LFG, maybe afk, role, ld, etc
*/

struct clientLFGStruct
{
/*0000*/ uint8_t name[64];
/*0064*/ uint16_t LFG; //1=LFG
/*0066*/ uint16_t unknown0008;
};

/*
** buffStruct
** Length: 34 Octets
**
*/

struct buffStruct
{
/*0000*/ uint32_t spawnid; //spawn id
/*0004*/ uint8_t unknown0004[4];
/*0008*/ uint32_t spellid; // spellid
/*0012*/ uint32_t duration; // duration
/*0016*/ uint8_t unknown0012[8];
/*0024*/ uint32_t playerId; // Player id who cast the buff
/*0028*/ uint32_t spellslot; // spellslot
/*0032*/ uint32_t changetype; // 1=buff fading,2=buff duration
/*0034*/
};

/*
** Guild Member Update structure
** Length: 76 octets
**
*/

struct GuildMemberUpdate
{
/*000*/ uint32_t guildId; // guild id
/*004*/ char name[64]; // member name
/*068*/ uint16_t zoneId; // zone id
/*070*/ uint16_t zoneInstance; // zone instance
/*072*/ uint32_t lastOn; // time the player was last on.
/*076*/
};

/*
** Bazaar trader on/off struct
** Length: 8 Octets
**
*/
struct bazaarTraderRequest
{
/*000*/ uint32_t spawnId; // Spawn id of person turning trader on/off
/*004*/ uint8_t mode; // 0=off, 1=on
/*005*/ uint8_t uknown005[3]; //
/*008*/
};

struct bazaarSearchQueryStruct
{
uint32_t mark;
uint32_t type;
char unknownXXX0[20]; // Value seems to always be the same
char searchstring[64];
uint32_t unknownXXX1;
uint32_t unknownXXX2;
};

struct bazaarSearchResponseStruct
{
uint32_t mark;
uint32_t count;
uint32_t item_id;
uint32_t player_id;
uint32_t price;
uint32_t status; // XXX Still poorly understood. 0=simple search
char item_name[64]; // nul-padded name with appended "(count)"
};

/*
** Item Bazaar Search Result
** Length: Variable
** OpCode: BazaarSearch
*/
union bazaarSearchStruct
{
uint32_t mark;
struct bazaarSearchQueryStruct query;
struct bazaarSearchResponseStruct response[];
};

/*******************************/
/* World Server Structs */

/*
** Guild List (from world server)
** Length: 96 Octets
** used in: worldGuildList
*/

struct guildListStruct
{
/*0000*/ char guildName[64];
};

/*
** Guild List (from world server)
** Length: 96064 Octets
*/
struct worldGuildListStruct
{
/*000*/ guildListStruct dummy;
/*064*/ guildListStruct guilds[MAX_GUILDS];
};

struct worldMOTDStruct
{
/*002*/ char message[0];
/*???*/ uint8_t unknownXXX[3];
};

// Restore structure packing to default
#pragma pack()

#endif // EQSTRUCT_H

//. .7...6....,X....D4.M.\.....P.v..>..W....
//123456789012345678901234567890123456789012
//000000000111111111122222222223333333333444

KLS
03-24-2010, 04:28 AM
Got the client to send the login info but our reply packet is wrong so it just hangs. Will take some time to figure it out.

The good news is the encryption is unchanged.

wolfwalkereci
03-24-2010, 05:04 PM
This is all very good news. Wishing you guys the best with this project.

Derision
03-24-2010, 06:03 PM
Just a brief update:

We can get to character select with the SoD client. The next step is to work out the correct Player Profile structure in order to be able to enter a zone. I don't anticipate that will take more than a few days. There will still be a fair bit to do from that point though to get things playable.

Taurinus
03-24-2010, 07:32 PM
This is pretty badass.

I was looking over the features of the SoD client and it appears we already have all of the framework to support mercs. All we would really need is a separate table (or modification of the current) for bots who are to be considered static (i.e. client cannot equip them). The SoD client should also enhance overall bot interaction with the client due to the merc-specific opcodes that the client can send.

Pretty exciting.

KLS
03-24-2010, 08:39 PM
SVN Login accepts SoD connections now; though on a different port than regular login and the config files need to be updated.

thepoetwarrior
03-25-2010, 06:54 AM
I bought my copy already. Will follow your progress. Only wish I didn't have to use Steam to download and install. I got the client installed again for first time in a while. Wish SoD came on DvD (or iso) instead. At least I'm prepared if this goes mainstream, and seems have have lots of pros already. Good luck guys!

Eva Aisling
03-25-2010, 07:54 AM
Steam collects personally identifiable information on all the games downloaded from them. You can't even run a LAN unless every computer has their own connection. Is that going to be a concern?

cavedude
03-25-2010, 09:11 AM
Steam collects personally identifiable information on all the games downloaded from them. You can't even run a LAN unless every computer has their own connection. Is that going to be a concern?

No, the EQ client is stock from Sony. No alterations have been done to it. At least, that I can see. Of course, you're going to want to move the client away from the Steam folder, and run it like we do with the other clients.

pfyon
03-25-2010, 09:19 AM
I haven't tried installing SoD through steam, but my friend suggested that most of the non-valve games just put the files into a folder so it can be run without steam.

Zandig
03-25-2010, 09:48 AM
How big is the download from Steam?

It doesn't say at this link:
http://store.steampowered.com/app/24130/

trevius
03-25-2010, 09:58 AM
SoD is about 7GB in size.

And in other news, I will give you guys 3 guesses as to which client this is:

http://stormhavenserver.com/downloads/pics/first_sod_ss.jpg

:D

Eva Aisling
03-25-2010, 10:18 AM
Awesome! I'm so excited! >,<

I wish I knew how to do programming, because I have pretty much all day. I stay at home with my son.

Taurinus
03-25-2010, 10:40 AM
How long were you able to stay in before the client borked? Rough estimate (in percentage) of things that appear to work correctly?

Sweet stuff. :D

Secrets
03-25-2010, 10:49 AM
You can use my Dual-LS hack if you guys want to implement this into your own servers, by the way, until the official LS gets updated with support. I'd suggest not using it for players till it's mostly finished though lol.

Zandig
03-25-2010, 12:40 PM
Thanks for the info Trevius - quite a heavy download.

But after seeing your in-game screenshot I decided to purchase and start the download :D

Looking forward to seeing what can be done with the emu and the SOD client!

steve
03-25-2010, 02:03 PM
You can run Steam through Sandboxie, and then move the EQ folder out of the steamapps folder. This way Steam won't leave any garbage on your system.

Kaenos
03-25-2010, 03:29 PM
I just ran Steam, got the download, then pulled the folder out and uninstalled Steam..

just waiting on the go ahead :)

Taurinus
03-25-2010, 11:13 PM
@rev 1301

SoD.cpp needs to be added to the visual studio project in order to build under Windows.

World->Patches->SoD.cpp
Zone->Patches->SoD.cpp

\common\patches\SoD.cpp

Taurinus
03-26-2010, 05:42 AM
I think there is something in the water...

http://i41.tinypic.com/34i1rvs.jpg

Poor little guy.:D

trevius
03-26-2010, 08:33 AM
Here are all of the new zones:

INSERT INTO `zone` VALUES ('bertoxtemple', '', 'Temple of Bertoxxulous', '-13', '0', '2', '0', '0', '0', '469', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('discord', '', 'Korafax, Home of the Riders', '20', '-20', '-16', '0', '0', '0', '470', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('discordtower', '', 'Citadel of the Worldslayer', '0', '0', '-55', '0', '0', '0', '471', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('dragonscaleb', '', 'Deepscar\'s Den', '25', '20', '5', '0', '0', '0', '451', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('korascian', '', 'Korascian Warrens', '25', '-5', '4', '0', '0', '0', '476', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('oceangreenhills', '', 'Oceangreen Hills', '80', '0', '5', '0', '0', '0', '466', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('oceangreenvillag', '', 'Oceangreen Village', '80', '0', '5', '0', '0', '0', '467', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('oldblackburrow', '', 'Blackburrow', '170', '-220', '46', '0', '0', '0', '468', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('oldbloodfield', '', 'Old Bloodfields', '0', '0', '4', '0', '0', '0', '472', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('oldcommons', '', 'Old Commonlands', '0', '0', '25', '0', '0', '0', '457', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('olddranik', '', 'City of Dranik', '220', '-1240', '58', '0', '0', '0', '474', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('oldfieldofbone', '', 'Field of Scale', '0', '0', '-38', '0', '0', '0', '452', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('oldhighpass', '', 'Highpass Hold', '0', '0', '-5', '0', '0', '0', '458', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('oldkaesoraa', '', 'Kaesora Library', '0', '0', '1', '0', '0', '0', '453', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('oldkaesorab', '', 'Hatchery Wing', '0', '0', '1', '0', '0', '0', '454', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('oldkithicor', '', 'Bloody Kithicor', '0', '0', '56', '0', '0', '0', '456', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('oldkurn', '', 'Kurn\'s Tower', '0', '0', '1', '0', '0', '0', '455', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('precipiceofwar', '', 'The Precipice of War', '985', '-1110', '285', '0', '0', '0', '473', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('rathechamber', '', 'Rathe Council Chambers', '0', '0', '-21', '0', '0', '0', '477', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('thevoida', '', 'The Void', '0', '0', '5', '0', '0', '0', '459', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('thevoidb', '', 'The Void', '0', '0', '5', '0', '0', '0', '460', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('thevoidc', '', 'The Void', '0', '0', '5', '0', '0', '0', '461', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('thevoidd', '', 'The Void', '0', '0', '5', '0', '0', '0', '462', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('thevoide', '', 'The Void', '0', '0', '5', '0', '0', '0', '463', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('thevoidf', '', 'The Void', '0', '0', '5', '0', '0', '0', '464', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('thevoidg', '', 'The Void', '0', '0', '5', '0', '0', '0', '465', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');
INSERT INTO `zone` VALUES ('toskirakk', '', 'Toskirakk', '0', '0', '4', '0', '0', '0', '475', '0', '0', '1', '', '-2030', '450', '3000', '10', '3000', '0', '0', '0', '1', '1', '1.50', '0.4', '2', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '0', '0', '0', '10', '3000', '0', '0', '0', '450', '450', '', '2', '1', '1', '1', '0', '0', '5000', '0');


Making some really nice progress so far BTW. It should be nearly playable fairly soon. Main priority right now is getting spawns to show up properly. I am also working on getting the inventory to load fully atm.

cavedude
03-26-2010, 12:27 PM
Just wanted to make a note that the next PEQ database update will have the current 13th floor items dump, and also the SoD spells merged in.

Zandig
03-26-2010, 08:17 PM
For those of us still using MINILOGIN a modification is needed in order for the "Seeds Of Destruction" client and MiniLogin to "login" properly with the SOD client. Updated login opcodes are needed as follows:

- You must modify the contents of your 'opcodes.conf' file in your EQEmu server startup directory.

- Modify the contents of the file 'opcodes.conf'

1) Staring at around line 454 of the file 'opcodes.conf' (use the program NOTEPAD++ to get the line numbers)
http://notepad-plus.sourceforge.net/uk/site.htm

2) Replace the following lines:

#Login opcodes
OP_SessionReady=0x0001
OP_Login=0x0002
OP_ServerListRequest=0x0004
OP_PlayEverquestRequest=0x000d
OP_PlayEverquestResponse=0x0021
OP_ChatMessage=0x0016
OP_LoginAccepted=0x0017
OP_ServerListResponse=0x0018
OP_Poll=0x0029
OP_EnterChat=0x000f
OP_PollResponse=0x0011


3) With the following updated opcodes for the SOD client which will allow you to log in successfully:

#EQEmu Public Login Server OPCodes
OP_SessionReady=0x0001
OP_Login=0x0002
OP_ServerListRequest=0x0004
OP_PlayEverquestRequest=0x000d
OP_PlayEverquestResponse=0x0022
OP_ChatMessage=0x0017
OP_LoginAccepted=0x0018
OP_ServerListResponse=0x0019
OP_Poll=0x0029
OP_EnterChat=0x000f
OP_PollResponse=0x0011


and save the file.

These updated "Seeds of Destruction" client login opcodes can be found in your SVN directory in the file:
EQEmuLoginServer/login_util/login_opcodes_sod.conf

[b]NOTES:
- Be sure to backup your original 'opcodes.conf' file in case you want to switch back to the "Titanium" or "Secrets of Faydwer" client as the login opcodes for those clients differ from those of the "Seeds of Destruction" client when using MiniLogin.

PS:
- I'll also post this info in the MiniLogin section of the forum as well.
- If a dev can program a "smoother" way for MiniLogin to switch between clients it would be awesome but probably not necessary as the SOD client will most likely be preferred.

Zandig
03-26-2010, 08:20 PM
Awesome work on the SOD client guys!
I got a chance to login with it today and check it out after sorting my MiniLogin issues.
Your coding is brilliant and much appreciated!

KLS
03-26-2010, 10:22 PM
It should be 'playable' in a short amount of time which is amazing. All that work we did on SoF was not wasted eh?

blackdragonsdg
03-27-2010, 04:31 AM
Don't know if anyone else has attempted to generate the .map files for SoD zones yet but I did attempt it tonight and I was mostly successful but oldfieldofbone did not work at all. When attempting to generate the oldfieldofbone map it crashed Azone2.exe repeatedly. Has anyone else encountered that problem?

I don't have an SoD setup yet so I could not test the .map files but I am going to share them anyway. Files size is 185.52 MB.

http://www.megaupload.com/?d=J4O34TMC

I wasn't sure where to post this so if it is in the wrong place please move it.

Derision
03-27-2010, 03:18 PM
I hadn't tried azone2 on any of the new zones, but I just tried it on oldfieldofbone.eqg and it does indeed crash.

It will be looked at eventually, but getting the game to a playable state is the first priority.

I'll move this into the general SoD development thread.

trevius
03-28-2010, 02:52 AM
I went through all of the Patch Notes for EQ between SoF and the Steam SoD client release dates. Here is a compiled list of the changes that might be relevant to changes in the client since SoF and may be useful for development of the SoD client:


12/23/2008 December 23, 2008
- Improved linkdead recovery: We've decreased the amount of time linkdead players will have to wait to log back in because of a stuck character.
- If you attempt to login to the world when that account is already logged in, you will now be prompted as to whether you wish to kick off the currently logged in player. The logged in player (if it is truly logged in and not link dead) will be prompted whether they wish to allow themselves to be kicked off.
- When going linkdead in combat, a 30 second delay is enforced before the kick is executed.
- When going linkdead while out of combat a 5 second delay is enforced before the kick is executed.
- Improved camera control: We added the ability to rotate the 3rd person camera (the one you get when you use the mousewheel) using the left mouse button. This allows you to move the camera around your character without rotating the character. This is very similar to the way 3rd person cameras work in many other games.

- New Icons for the Original Epics: With the newly discovered old set of icons, we gave the original epic 1.0s their intended art (for the original 1.0 epics that had one made).

- Added a new /merclog command that logs information for the player's mercenary (if they have one) to MercenaryAILog.txt. This command can only be executed once per minute. Also, added a new "mercenaries" bug type to the /bug window. Any bugs submitted with this type also generates the MercenaryAILog.txt file (if the player owns a merc and the merc is not dead/suspended).

- Buff icons from effects that are not removed by death should no longer disappear after receiving a resurrection.
- Fixed an issue preventing targeting players or entities by clicking on their HP gauges.
- Changing the volume in the in-game music player should now work correctly again.

12/09/2008 December 9, 2008
*** Mercenaries ***

- Healer mercenaries will give less priority to healing shamen that are not flagged as the main tank role and that are not being directly attacked. This should allow them to be a bit friendlier with regards to cannibalize.
- Mercenaries should be friendlier to feign splitting techniques. If the puller feigns in camp before the merc has a chance to react, the merc will not attack the mobs hostile only to the puller.
- Mercenaries will no longer attack enemies that are currently engaging targets outside their group (or group's pets).
- The camp radius now scales somewhat dynamically in that if your group is widely spaced, the radius around the group's center considered "in camp" to the AI is increased to avoid a situation where you've pulled an NPC past one of the group's members, but the AI still does not react to it. The minimum camp radius from group center is still 50feet as it was before.
- Healer mercenaries will no longer cast heal spells on themselves that have an invulnerability component, as the AI was never tuned to do this at the right time, and it leads to problems with the mercs appearing to be unresponsive.
- Increased the timer for how often a merc will attempt to resurrect a corpse when the res is not accepted from 2 minutes to 5 minutes.
- The ability to suspend/un-suspend a mercenaries is now locked when in combat and when the player still has a cool-down timer on PvP servers. For standard rule servers, the cool-down timer still does not factor into this, suspend/un-suspend can be done immediately after the hatelist is cleared.
- Tank mercenaries will now default to following their owner (or group) when there are no melee targets even when in combat.
- Mercenary Clerics should no longer cast their spell haste buff on classes that have no mana.
- Mercenaries now appear with a ':' before their name in the tracking window, similar to pets.
- Fixed a bug that allowed a mercenary to keep the effects of an aura permanently after the aura was no longer present.
- Fixed a problem that caused some players that zoned slowly to not be able to unsuspend their mercenary after they zoned.
- Mercenary healers will now only dispel buffs on enemies when in aggressive stance. Since aggressive stance isn't currently in the game (though it may return at some point) healer mercs will no longer be dispelling for now.
- Mercenaries should no longer become bald after various illusions.
- Added a new "Assist" stance for Journeyman and above tank mercs that allows them to operate in essentially a DPS mode. If the tank merc is in Assist stance and not designated the main tank it will not use any off-tanking behavior like it does when in Aggressive stance. It will attack whatever the main assist is targeting (or whatever it last attacked it there is no main assist) and continue to do so until the main assist switches targets. If in Assist mode and designated the main tank the tank merc should behave the same as it does in Aggressive stance.
- Fixed a problem where if you had maxed out your buff slots, healer mercenaries would no longer heal you.
- Fixed a problem that caused the AI to be blind to damage taken from certain spells like Blood Magic or Divine Arbitration.
- Fixed a problem where mercenaries were counting toward the hit limit for rain type spells, causing them to have fewer pulses when in the area of effect.
- Merc healers will no longer cure charmed pets.
- Mercenary "in camp" radius is no longer a sphere. It is now more of a disc to help with problems of mercs healing, etc. when a puller is on a floor above or below.
- Merc healer AI will no longer cast cure spells if somone in the group is at lower than 50% health.
- Mercs will no longer move out of melee range of their target if they are casting a beneficial spells (heals, buffs). This should cut down on a fair amount of unnecessary movement.
- Mercs should no longer run off to follow someone across the zone when their owner is set as puller. They will only follow another group member other than their owner if that other group member is within their awareness radius (about 200 ft.).
- Fixed an issue with out of combat healing AI doing a lot of over healing.
- PvP spell resist and duration values are now used when hostile spells are exchanged between a merc and a PC (for non PvP servers this only applies to the Arena).
- Fixed an issue with merc suspend timers counting down too fast if a custom UI had multiple instances of the timer display.
- Fixed a problem where mercenaries would go bald when removing an illusion and zoning.
- After carefully watching mercenaries since SoD launch some balance changes are being made:
-- You will no longer be able to suspend or unsuspend your mercenary while you are in combat.
-- Journeyman mercenaries will now cast 96% resurrection. Apprentice mercenaries are limited to 90% res.
-- Increased the stats of the Tank Mercenaries starting at the Journeyman tier. The values are tuned to be less than what an equivalently geared player would be but is higher than previous values for various mitigation and avoidance stats useful for a tank.

*** Miscellaneous ***

- Corrected a few Stability issues.
- Fixed a bug that was causing power sources to only be drained when out of combat. Now they only drain while in combat instead.
- The NPC buy/sell/bank window will no longer disappear when the game client is re-sized.
- Players can now decline a group invite when they own a mercenary.
- Fixed a problem that caused player traps (e.g., fadelure, fire rune, bonestitch fetish) to trigger on pets/mounts/mercs, causing all kinds of havoc.
- The incorrect boosts to HP/mana/endurance have been brought back in line with what they should have been. Please see other posts on this subject for more information.
- Fixed a bug that caused certain spells that triggered casting of more spells (like Spectralside and Unity of Spirits) to overwrite each other even though that was not intended.
- Power sources will once again change the color of the affected stats in that slot.
- The potion belt now conveys the cool down timers on potions.
- Fixed a client crash when your pet got more than 30 effects on it.
- Corrected an issue that caused guilded characters to be forcably placed in the guild voice channel upon zoning.
- Changed the way charges are deducted from consumable click items. Now, if the spell on the item is beneficial and it does not land, the charge will not be consumed.
- Drakkin should now revert to a walk/run animation after dismounting.

11/20/2008 November 20, 2008
*** Test Server ***
- HP, Mana, and Endurance calculations have been adjusted to address a few unintended inconsistencies.

We've identified the unintended inconsistencies in the HP/Mana/Endurance formulae that were causing inflated values. We've readjusted the values to be more in line with expectations and to help prevent problems like this in the future.

The net result of these adjustments will be that everyone should see a benefit Over the values present at the launch of Seeds of Destruction, although you will notice a drop from the most recent values if you're level 81+.

10/29/2008 October 29, 2008
- Fixed a few zone stability issues.

- Mercenaries should no longer break mez when using their AE offensive abilities.
- Mercenaries are now allowed in Qeynos Catacombs.
- Fixed an issue that caused healer mercenaries to react incorrectly if a familiar they were buffing was summoned.
- Casting a spell on a mercenary will now give a downtime timer. This is based on the difficulty of the most difficult NPC on the mercenary is engaged with. Spells cast on the mercenary when not in combat should not generate a downtime timer.
- NPCs fighting a mercenary should now correctly call for help from their friends.
- Damage from mercenaries is, like pet damage, no longer considered as "NPC damage" for purposes of calculating if an NPC did more damage than PC groups - They will no longer steal credit for your kill!

- A dead player's corpse will no longer steal the credit for a kill due to DoT spells of the player in hover mode.

- While in windowed mode, changing to another application (clicking or alt-tabbing) should no longer cause the target to clear or change.
- Fixed an issue with toggling between the last two targets.
- Escaping the loot window while looting should no longer cause the client to crash.
- Clicking an empty spell gem slot should no longer cause the client to crash.
- Fixed issue with not selecting the correct target when clicking on the group gauges.

10/21/2008 October 21, 2008
- Level Cap Increase: Players can now achieve level 85. New high level item sets, new Alternate Advancement ability lines, new spells, and new skill caps come with this increase.

- Mercenaries: Mercenaries are NPCs for hire that will aid adventurers in their heroic endeavors. Their levels and abilities will scale appropriately and they will think and act for themselves with limited player guidance. They are designed for extra support or extra muscle in PvE encounters.

Unlike player pets, these NPCs are not directly controllable by players, though the player can give them general orders. They function like a normal party member including taking up a group slot and taking a share of the experience.

Mercenary Liaisons can be found in the Plane of Knowledge as well as all starting cities and will allow you to hire mercenaries based on their race. The Liaisons within the Plane of Knowledge will allow you to hire mercenaries of any player race. These merchants can be found using the Find ability.

Before purchasing a mercenary be sure to read the descriptions, cost value, and restrictions. There are different levels and tiers available. Some mercenaries may not available until you have completed certain content but there are some apprentice and journeyman ones available to all.

Mercenares have a one-time hire cost and an upkeep cost that is charged every 15 minutes. The hire cost is usually much higher than the upkeep cost.

There are two classes of Mercenaries available - Tank and Healer.

Healer Mercenary: Healer mercenaries prefer to heal and buff their owner and others in the group rather than engage directly in combat. These mercenaries can also resurrect players upon death.

Tank Mercenary: Tank mercenaries prefer to melee. They will taunt if it is set to the main tank role. Though it will still attack and behave as a secondary tank if it is not set as main tank.

If your group has someone with the puller role, mercenaries will only assist them when they and any NPCs chasing them are near camp. Any mercenary owned by the puller will stay back with the group.

Like pets, mercenaries will not aggro NPCs on their own.

Mercenaries can be suspended like a pet, though they will remain suspended forever or until you dismiss them. Mercenaries will be suspended automatically when entering most raid zones. They must also be suspended before you join a raid.

If your mercenary dies, it can be revived after five minutes with an additional upkeep charge.

Some mercenaries may not think your gold is worth them risking their life. Those with higher confidence in themselves will cost more money.

- Corpses will now automatically decay after you receive an experience-granting resurrection while in hover mode.
- Corrected an issue that caused NPCs to not receive full damage when multiple ranged attackers hit them at the exact same time.
- Fixed a problem with toggling between the last two targets if last target was selected by clicking the group window or player window using the mouse.
- Fixed an issue where all items in any list window would display a tool tip regardless of whether there was a tool tip string defined.
- Fixed a bug that caused groups to be out of sync when a group member went linkdead.
- Fixed a bug with /hidecorpse looted that caused it to hide your own corpse when you looted it.
- Fixed a bug that caused active and suspended pets to be lost when their owner went link dead.
- Optimized the network traffic for the target buff window. This should result in significant improvements in lag.
- Fixed several bugs with /makeleader.
- Fixed a bug with charm that was causing charmed pets to not properly clear their hate lists.

- Things that shouldn't have a con color (corpses, boats, etc.) will no longer display with a white con in the target window.
- Re-arranged the General Options tab to allow for more options.

10/09/2008 October 9, 2008
- Corrected a few behind the scenes issues with items.
10/07/2008 October 7, 2008
- Group Merge Ability: Looking to fill the last few spaces of your group? Groups now have the ability to merge with each other without disbanding from their own group! With this new feature, the group leader of one group can invite the group leader of another group to join his/her group. If the invitation is accepted, the two groups will merge together to form one group. This change merely allows groups to merge without having to make everyone drop out of their current group. All other group functionality should work as it did in the past. It does not increase the six person group maximum for groups.
- Group Window Enhancements: The following changes have been made to improve the Group Window - We've added mana and endurance gauges for group members. We've added a Group Roles infrastructure. When right-clicking on a member of the group, a leader will now have the roles sub-menu for role administration. If currently the leader of a group, right-clicking the player's health / mana / stamina window will also show the same role administration menu. We also added in the /grouproles command. A group role indicator was also added to the Player Info window.
- Target Window Enhancements: The following changes have been made to improve the Target Window - The target window will now display the buffs on target players, pets, and in the future mercenaries. The Inspect Buffs leadership ability is still needed to view NPC buffs. The target's buff timers displays in hours, minutes, seconds. We've added the ability to remove buffs from yourself, your pet, and in the future mercenaries from the target window. The ability to block buffs on you and your pet has also been added to the target window. The Target Window is now resizable.
- More Firiona Vie Character Slots: We've extended the amount of character slots available on the Firiona Vie server to 3 characters.
-Added the ability for players to target nearest corpse and cycle through the nearest corpses via hotkeys. These will need to be set in the options menu to be used.
-Increased the range of emotes to match the range of say.
-Fixed an issue with damage shield mitigation on items.
-/target will now target the player instead of their familiar, as long as the player is within a reasonable distance of their familiar.
- We now display all bind points for a player when using /charinfo.
- Removed the group leadership AA Designate Main Assist since this functionality is given to all groups through the new Group Role system. Leadership AAs spent on this ability have been refunded in the form of regular AAs.

- Items and coin are no longer left on a corpse upon death. The items will remain equipped and in their respective containers.
- Spells will now remain memorized on a character upon death.
- Players should now be able to equip items for which they don't meet the required level. In the inventory window, the item will be highlighted in yellow if the required level is not met. No benefits will be granted from this item other than being able to equip it.
- Added the concept of revive effects. When you respawn, you will receive negative effects for a while to compensate for having all your equipment and spells still memorized.
- /target will now choose PCs over NPCs when using a partial name.
- If you have a familiar buff but no familiar, it should no longer destroy any other pets you have when you remove the buff.
- All classes now keep their familiar buffs when the familiar is killed or dismissed, not just wizards.
- Fixed a problem with familiars for pet classes. If you have a pet, then summon a familiar, then zone, it will now keep your pet properly with only the familiar buff.
- Fixed some problems with the muted friends list for voice chat.
- Corrected a few issues with group and raid management functions.
- Groups are now somewhat persistent. If you log out and log back in you will still be in your group. Offline players should still be able to be kicked out of groups.
- Fixed a problem with /hidecorpse looted where the client and zone could get out of sync and keep you from looting for a while after that.
- Added /hidecorpse npc which works just like /hidecorpse all except it only hides NPC corpses.
- Drakkin rogues will now sneak at the correct speed when over level 50.
- Added in Group Roles infrastructure. When right-clicking on a member of the group, a leader will now have the roles sub-menu for role administration. If currently the leader of a group, right-clicking the player's health / mana / stamina window will also show the same role administration menu. Also, added in the /grouproles command. A group role indicator was also added to the Player Info window.
- Group members in other zones will now be notified when their group member (that previously logged off) logs back in (grey when they're offline, white when they're online). Their name in the group window changes color as indicated for online/offline status.

- Slash versions of the commands are effective on playername for the channel you are in and only if you are the moderator (raid/guild/group leader)
- Unban only works via slash command since there the banned player is no longer in the channel and therefore no longer available to click on.
- /voicechat unban playername
-Unban only works to unban playername in the channel you are currently in, and only if you are the moderator (raid/guild/group leader)

- The group leader will now be displayed in a different color in the group window and player window. This will work in addition to /groupleader to find out who the group leader is.
- Updated the pet window to display timers in hours, minutes, seconds like the buff window.
- "Caster:" in the buff info window will now display the user name. Also, if there is no caster information available, the "Caster:" line should not appear.
- Added the ability to click on a group member and target out of zone / link dead group members. Using the function keys by default should also bring up the players in the target window.
- Invite, follow and disband/decline buttons are no longer required in the group window.
- Modified the spell gem window to auto-resize based on the number of spell gems activated via Mnemonic Retention.
- Added the ability when using custom UI's to target out-of-zone group members by clicking on their EQType's gauge.
- Fixed a bug seen in custom UI's where the spell name in the buff and short term buff windows would be "Unknown Spell" when there was no buff in that slot.
- In the group window, the gauge size can now be used by custom UI modifiers to set the size for gauges instead of having to change the background size.

9/30/2008 September 30, 2008
- Message to custom UI users: With the next Game Update, we will be releasing several extensive changes to the User Interface (UI). Some of these changes can currently be found on the Test Server and additional changes may be released throughout the week. Please take a moment to visit the Test Server so that you can prepare ahead of time for these changes.
9/10/2008 September 10, 2008
- Fixed a few server and zone stability issues.
9/03/2008 September 3, 2008
- Guild Banners will again be sustainable with only one guild member in the zone.
- Weightless Coinage: Coinage no longer adds to the weight of player characters. Adventurers all across Norrath rejoice... especially monks!
- The timer for returning to the game after going linkdead with a character has been reduced from 3 minutes to 1 minute.

- Station Voice Comes to EverQuest!

- How does it work in EverQuest? -
To begin using voice chat, verify the feature is enabled by opening the Option window (Alt+O) and navigating to the Voice tab. This feature will be turned off by default.

Devices: Once Voice Chat is enabled EverQuest will attempt to connect to the correct hardware.

Push-to-talk key: Initially the voice chat system uses Ctrl+Tab as the push-to-talk key. This can be reconfigured to any available key from the Options window, Keys tab.

Output volume: Master volume for all incoming Voice Chat traffic. This setting is independent of music and sound effect volume settings. Setting this to high results in distortion of incoming speech.

Input volume: The relative sensitivity of your microphone. Turning it up means your microphone picks up quieter sounds. Setting this to high results in distortion of your outgoing speech. The sound indicator gives an estimate of the distortion. Red signifies high distortion, yellow medium distortion and green low distortion.

Testing your setup with Echo channel: The echo channel allows you to get an idea of your settings by broadcasting what you say back to you after a short delay.

- The Voice Bar -
Once Voice Chat is enabled and has successfully connected the Voice Bar will automatically be shown. The Voice Bar by default will remain active as long as voice chat is enabled. A hot key may be mapped to open and close the Voice Bar.

The Voice Bar offers a push to talk button, a list of users of the current channel, what channels are available, a link to Options, and indication of who is currently talking.

The Talk button is simply a push-to-talk button that is mouse activated instead of keypress activated.
The Voice Users button presents a list of the users of the current channel. Clicking on the speaker by any user allows you to adjust the volume of that player relative to your master volume. A particularly loud player can be turned down relative to other voice chat traffic Moderators for a channel are given additional options of muting a player for the entire channel, banning a player from the channel and kicking a player from the channel.

The channel button pulls down a menu of channels available to you. The currently selected one is shown in green if connected. Red if the connection has failed. Unselected but available channels are shown in white.

Voice chat has been integrated into some other interfaces in the game. Speaker icons show up for players that have voice chat active. The speaker icons behave as they do in the Voice Users window, giving access to Voice Chat options specific to that player.

There is currently an issue with leaving a private channel making you unable to invite someone to a new private channel. We are working on resolving this issue, but until then, logging out and back in should clear your channel status.

- Using the /voicechat Command -
The /voicechat command offers the following options:

-- on: activate voice chat (ex. /voicechat on)
-- off: deactivate voice chat
-- Moderator Controls:
-Mute <player> - mutes a player for everyone in the current channel
-Unmute <player>- unmutes a player for everyone in the current channel
-Kick <player>- kicks a player form the current channel
-Ban <player> - bans a player from the current channel and kicks them if they are present
-Unban <player> - unbans a player from current channel

7/17/2008 July 17, 2008
- Spells and procs will no longer reset swing timers for any class, PC or NPC.
- The NPCs that were made easier in our previous patch will now have their proper consider message.
- Fix a problem that was causing some custom UIs to crash while drawing buff icons.
- Improved an issue that was causing poor performance in outdoor zones.
- Fixed an issue that was causing poor performance when switching between background and foreground modes.

7/09/2008 July 9, 2008
- Moved the Max FPS and Max background FPS sliders to the advanced display options window.
- The spell information window has been changed. For buffs that are on you or your pet, you will be able to see the name of the caster, the full duration of the spell, the level required to cast the spell, the skill required to cast the spell, the mana cost of the spell, and the spell description. Non existing buff based spells will display the total duration of the spell in a new format, hours, minutes, and seconds.
- New visual indicators have been added to the buff window icons, and short duration buff window icons. Additionally, the spell counter information has been moved to facilitate the visual display of the buff timer on the respective buff icon. There have been four pieces of visual information added to the buff icons. This includes a visual indicator to show each of four possible pieces of information. The new pieces of information are Buff Timer, Buff Counters, Song Timer, and Song Counters.
- With the description changes added, all relevant counter information for BARD songs, all short duration effects, and regular buffs in either the spell window buff icon or short duration buff icon respectively will also be displayed.
- The buff icon will now display the time remaining in the form of hours (h), minutes (m), or seconds (s) whichever is greater. This significantly reduces the amount physical space used on the icon to print out the remaining time, in effect showing more of the buff or short duration buff icon to the player.

- Ornament Mutation Tools are now available for purchase from Magus Alaria in the Guild Lobby. They can be used to permanently change Ornament items into single use Ornamentation containers.

- We've adjusted the fog settings in all zones to allow for better visibility.

- More fixes for corpse looting problems when using /hidecorpse looted.
- Added the Background FPS slider to the Options->Display window. Allows setting the frame rate for the EQ window when it is not the foreground window. Sliding all the way to the left (the default) will use "Min. CPU" mode. Increasing this above "Min. CPU" can improve auto-follow behavior when the client is not in the foreground.
- 'alpha' and 'ralpha' added to /tracksort command.
- Added new SoF stats to the bazaar search options.
- Fixed a problem causing a client disconnect when consuming or using the last item in a stack.
- Made an optimization that will slightly improve lag in loping plains. This is not a full fix.
- Changed the way CPU affinity assignment works so that when you have multiple clients running and exit one and restart it, you still get correct distribution of CPU assignment. Previously, this could cause both clients to be assigned to the same CPU.

6/11/2008 June 11, 2008
- Added a few new item icons for future items. Custom UIs will need to update to see them.

5/29/2008 May 29, 2008
- The experience gained formulas have been modified to present players with a much smoother increase in the number of kills required to progress through a level as they gain more levels. This change has the side effect of reducing the number of kills required to gain a level in certain scenarios between levels 50 and 75.
- Improvements have been made to load balancing for instance servers that should improve peak-time performance of instances.
- Corpses should once again disappear immediately rather than fading away slowly after looting when using /hidecorpse looted even if all the items have been removed from the corpse.

5/22/2008 May 22, 2008
- The EQPlayers database has received an upgrade to improve performance.

- We have enabled player proximity again. The proximity algorithms have been improved and tuned. Bandwidth usage has been reduced and both client and server performance have been improved. In addition, the delay upon first zoning in should be largely eliminated as any NPCs in your proximity on zone-in are sent by the server before you are officially in the zone (while the zoning screen is still up).
- Player-made powersources will now result in "sealed" orbs which can be right-clicked to create the actual powersources. This will guarantee that players will get a fully-charged powersource, and allow for multiple yields on the tradeskill combine as originally intended.
- Fixed an issue that could cause players with /hidecorpse looted active to be unable to loot+.
- Fixed an issue that was causing players to go linkdead when accepting a resurrection.

5/07/2008 May 7, 2008
- Changed variations of the same SoF evolving item that were not on lore groups to now share lore groups.
- /guildstatus should once again work on any players in the zone regardless of location.
- The Mark NPC command should display NPC names correctly now.
- The /who command will now always put your name last in the list.
- Fixed a problem in the bazaar where if you used mouselook right after right clicking on a trader name in the search window your view would pitch up to look at the ceiling.
- /hidecorpse looted now persists after zoning (the hidden corpses don't persist, but the /hidecorpse looted "mode" does).
- Looting all the items on a corpse when in /hidecorpse looted mode will cause the corpse to immediately disappear, rather than fade out slowly.

4/24/2008 April 24, 2008
- Several speed and stability changes have been made to address issues with proximity loading.
- Leadership AAs should work more reliably with mobs that come from outside of the group's awareness range.
- Several speed and stability changes have been made to address issues with proximity loading.
- The client will now load more information upon initial zone-in to make later movement smoother. There will be a performance hit when first zoning in, however.
- The tracking window updates have been optimized and should be somewhat faster now.
- Fixed issues where /guildstatus and /guildinvite were not working on players outside of proximity range.
- The corpses of group members who die outside of proximity range should once again be targetable by clicking their name and should show on the map.
- Fixed several issues with the /hidecorpse command:
- - You can now hide corpses after being resurrected from hover mode.
- - Corpses of group members not in zone will no longer be hidden with /hidecorpse allbutgroup.
- - /hidecorpse looted will not hide your own corpse.
- The /who guild command should now return players in the zone who are in /roleplay mode.
- The /who count command will again work for all players in the zone.
- Using the center view key after moving downward on a mount will no longer cause your view angle and movement angle to be out of sync.
- Right clicking a player's name in the bazaar window will again face you towards them and generate a path.

4/17/2008 April 17, 2008
- The tracking window can now be sorted alphabetically and reverse-alphabetically. Also, there is now a check box to set whether you want the tracking window to auto-update every six seconds.
- Our UI xml schema has changed. If you are using a custom UI you may need to update this file in your custom UI directory.

- Changes have been made to the way the client is notified about other entities (players, NPCs, etc.) in the zone.
- Zone-wide /who commands now use a similar code path to server wide /who all commands. Note that this will impose a similar time limit to how often it can be used.
- The bobbing effect of levitation has been removed. A new effect that pushes you off the ground about a foot and a half has been introduced.
- Fixed an issue with the "Public if Usable" permission in the guild bank.
- Fixed an issue that could place levitated players below the world when entering certain zones.
- Fixed an issue that would cause levitate to fail if a player's mount was hit by a spell (usually an aura).
- Stacks of two items in the guild bank can now be split.

2/28/2008 February 28, 2008
- Guild Bank items and deposits now sort after the contents have been changed.
- The Adventure window now includes the ability to sort entries by the properties of each adventure entry.
- Added default height sizes to many of the illusions in the game. This should cause illusions of creatures that are typically non-human heights to grow or shrink the user as appropriate when they change into that illusion.

2/06/2008 February 6, 2008
- We've made improvements to increase the stability of the servers.

1/16/2008 January 16, 2008
-Loot All has been changed to help resolve some client disconnect/corpse loss issues. This will cause the loot all to be slower than it was previously. When stability is improved, we will take a look at speeding it back up again.

- Bazaar traders can now resume selling stacks of items at higher cost again.
- Submitting an in-game mail with a blank "To" field should no longer crash the game client for the sender.

12/17/2007 December 17, 2007
Here's some important news regarding the Bazaar.

Currently there is an issue when setting prices for stacked items in bazaar. Do not sell a stack of items worth more than 4,294,967 pp (platinum pieces) total.

12/05/2007 December 5, 2007
- Double fogging has been eliminated and now all in game objects should fog correctly.
- Dragon Heritage/Tattoos should no longer randomly change when using 'face' function in the inventory window.
- Fixed a few graphic issues with removing an illusion buff.
- Fixed a few zone and server stability issues.
- Fixed collision issues that caused problems for shorter characters and characters on mounts.

11/13/2007 November 13, 2007
Level Cap Increase: Players can now achieve level 80. New high level item sets, new Alternate Advancement ability lines, and new spells will come with this increase, including a new AA that grants a new spell slot.

New Loot All Options: "Loot All" functionality has been added to corpses. This includes a "Loot All" button on the loot window and the ability to shift-right-click loot a corpse.

AC Mitigation Improvements: We modified the AC Caps and over-cap returns for mitigation for all classes to bring them more in line with their intended ability to mitigate damage. Warriors, Paladins, Shadowknights, Clerics, and Monks received a minor increase in their mitigation ability. Rangers, Bards, Rogues, Shaman, Beastlords, and Berserkers received a moderate increase in their mitigation ability. Druids, Necromancers, Wizards, Enchanters, and Magicians received a considerable increase in their mitigation ability.

Fog Rendering System Enhancements: An entirely new fog rendering system has been implemented in the EverQuest graphics engine. This new system is used in all zones that currently have fog.

Multi-core CPU Support: If you have a Multi-core CPU you no longer have to manually set their processor affinity! EverQuest will automatically assign itself to an available core. If you run multiple copies of the client, each new copy running will assign itself to the next available core. Those interested in customizing which core or cores EverQuest clients run on, check the forums.

Issue: West Display Bug
Summary: When you face west the video geometry disappears except the UI and the Sky. When you face another direction the issue goes away. Normally this is only fixed by doing a reboot of your PC or reloading EQ.
Status: We have made a change that should reduce the chances of the "west bug" occurring; unfortunately the change requires us to turn off some optimizations. If you want to disable this workaround, please add the following line to your eqclient.ini: DisableWestBugFix=1 (The EQ team would like to thank Community Member Strommmm for his feedback on helping us with this issue.)

10/04/2007 October 4, 2007
- Copy Layout Window: Typing either /copylayout or pressing the Copy Layout button within the General tab of the Options window will bring up a list of all your UI_name_server.ini files with each layout stored in them (along with the ones stored in defaults.ini). Selecting one will copy the layout you selected over the current layout, including any custom skin, viewport and alpha/color/fade settings that might be in use. This can also be done directly (for those with a custom UI that does not contain the new window) by typing "/copylayout resolution INI_filename" where resolution is in the form "1280x1024" or "Windowed" for the windowed layout. INI_filename is optional, and defaults to the currently logged in character’s UI INI file.

*** UI ***

- Fixed numerous UI issues related to changing the game resolution.
- The /viewport command has a new optional parameter. The 5th parameter "scale" can be "0" or "1". Not including it or using "0" causes /viewport to behave the way it always has, allowing a fixed size viewport. Using "1" causes the viewport to scale with the windowed mode EQ window as it resizes.
- Fixed several problems with window layouts and custom skins. The changes affect the way the windowed mode window layout is saved. In most cases your windowed mode layout will be converted for you automatically as you log each character into the game. However, in some cases the conversion will be unable to determine the original size of your windowed mode window. If this occurs you can simply use the new copy layout window (which should be displayed automatically for default skin users) or /copylayout command to copy a window layout of your choice to be your windowed mode layout. For more information visit the EverQuest forum thread on the subject.
(http://forums.station.sony.com/eq/posts/list.m?topic_id=120218)
- Notes to custom UI builders: There was at least one custom UI that did not render windows at all when they were minimized. The UI changes include persisting the minimized state of windows. In those custom UI's, if you minimize, and the window disappears, there is no way of getting it back unless you manually edit the .ini file to change the Minimized setting.
- Once you have your windowed mode window sized the way you like it, you may now prevent accidental resizing by clicking off the "Allow window resizing" button in Options->Display.
- Like your EQ window to overlap the Windows task bar? This can be enabled with the new "Overlap Windows Taskbar" button in Options->Display.


Next post, I will make a sorted list of the above to help organize it and make it more useful for development.

trevius
03-28-2010, 04:38 AM
Ok, here are most of the Patch Notes from above after being slightly organized into categories. Some of the categories overlap, but this should break them up a bit better than just being in random order.

Stability, and Performance Changes:

- Corrected a few Stability issues (Note: Many similar notes like this were mentioned through the patch notes).
- Improved an issue that was causing poor performance in outdoor zones.
- Fixed an issue that was causing poor performance when switching between background and foreground modes.
- Added the Background FPS slider to the Options->Display window. Allows setting the frame rate for the EQ window when it is not the foreground window. Sliding all the way to the left (the default) will use "Min. CPU" mode. Increasing this above "Min. CPU" can improve auto-follow behavior when the client is not in the foreground.
- Changed the way CPU affinity assignment works so that when you have multiple clients running and exit one and restart it, you still get correct distribution of CPU assignment. Previously, this could cause both clients to be assigned to the same CPU.
- Multi-core CPU Support: If you have a Multi-core CPU you no longer have to manually set their processor affinity! EverQuest will automatically assign itself to an available core. If you run multiple copies of the client, each new copy running will assign itself to the next available core. Those interested in customizing which core or cores EverQuest clients run on, check the forums.


Camera Control Changes:

- Improved camera control: We added the ability to rotate the 3rd person camera (the one you get when you use the mousewheel) using the left mouse button. This allows you to move the camera around your character without rotating the character. This is very similar to the way 3rd person cameras work in many other games.
- Using the center view key after moving downward on a mount will no longer cause your view angle and movement angle to be out of sync.


Fixes and Adjustments:

- Changing the volume in the in-game music player should now work correctly again.
- Fixed an issue preventing targeting players or entities by clicking on their HP gauges.
- Buff icons from effects that are not removed by death should no longer disappear after receiving a resurrection.
- Fixed a client crash when your pet got more than 30 effects on it.
- Fixed a bug with /hidecorpse looted that caused it to hide your own corpse when you looted it.
- Fixed several bugs with /makeleader.
- Fixed a problem with /hidecorpse looted where the client and zone could get out of sync and keep you from looting for a while after that.
- Added /hidecorpse npc which works just like /hidecorpse all except it only hides NPC corpses.
- We've adjusted the fog settings in all zones to allow for better visibility.
- More fixes for corpse looting problems when using /hidecorpse looted.
- Fixed a problem causing a client disconnect when consuming or using the last item in a stack.
- Fixed an issue that could cause players with /hidecorpse looted active to be unable to loot+.
- Fixed an issue that was causing players to go linkdead when accepting a resurrection.
- /guildstatus should once again work on any players in the zone regardless of location.
- /hidecorpse looted now persists after zoning (the hidden corpses don't persist, but the /hidecorpse looted "mode" does).
- Looting all the items on a corpse when in /hidecorpse looted mode will cause the corpse to immediately disappear, rather than fade out slowly.
- The tracking window updates have been optimized and should be somewhat faster now.
- Fixed several issues with the /hidecorpse command:
- - You can now hide corpses after being resurrected from hover mode.
- - Corpses of group members not in zone will no longer be hidden with /hidecorpse allbutgroup.
- - /hidecorpse looted will not hide your own corpse.
- Fixed an issue that could place levitated players below the world when entering certain zones.
- Fixed an issue that would cause levitate to fail if a player's mount was hit by a spell (usually an aura).
- Bazaar traders can now resume selling stacks of items at higher cost again.
- Submitting an in-game mail with a blank "To" field should no longer crash the game client for the sender.
- Double fogging has been eliminated and now all in game objects should fog correctly.
- Dragon Heritage/Tattoos should no longer randomly change when using 'face' function in the inventory window.
- Fixed a few graphic issues with removing an illusion buff.
- Fixed collision issues that caused problems for shorter characters and characters on mounts.
- Issue: West Display Bug
Summary: When you face west the video geometry disappears except the UI and the Sky. When you face another direction the issue goes away. Normally this is only fixed by doing a reboot of your PC or reloading EQ.
Status: We have made a change that should reduce the chances of the "west bug" occurring; unfortunately the change requires us to turn off some optimizations. If you want to disable this workaround, please add the following line to your eqclient.ini: DisableWestBugFix=1 (The EQ team would like to thank Community Member Strommmm for his feedback on helping us with this issue.)


New Feature/System Changes:

- HP, Mana, and Endurance calculations have been adjusted to address a few unintended inconsistencies.
- The incorrect boosts to HP/mana/endurance have been brought back in line with what they should have been. Please see other posts on this subject for more information.
- Group Merge Ability: Looking to fill the last few spaces of your group? Groups now have the ability to merge with each other without disbanding from their own group! With this new feature, the group leader of one group can invite the group leader of another group to join his/her group. If the invitation is accepted, the two groups will merge together to form one group. This change merely allows groups to merge without having to make everyone drop out of their current group. All other group functionality should work as it did in the past. It does not increase the six person group maximum for groups.
- Group Window Enhancements: The following changes have been made to improve the Group Window - We've added mana and endurance gauges for group members. We've added a Group Roles infrastructure. When right-clicking on a member of the group, a leader will now have the roles sub-menu for role administration. If currently the leader of a group, right-clicking the player's health / mana / stamina window will also show the same role administration menu. We also added in the /grouproles command. A group role indicator was also added to the Player Info window.
- Target Window Enhancements: The following changes have been made to improve the Target Window - The target window will now display the buffs on target players, pets, and in the future mercenaries. The Inspect Buffs leadership ability is still needed to view NPC buffs. The target's buff timers displays in hours, minutes, seconds. We've added the ability to remove buffs from yourself, your pet, and in the future mercenaries from the target window. The ability to block buffs on you and your pet has also been added to the target window. The Target Window is now resizable.
- We now display all bind points for a player when using /charinfo.
- Removed the group leadership AA Designate Main Assist since this functionality is given to all groups through the new Group Role system. Leadership AAs spent on this ability have been refunded in the form of regular AAs.
- Items and coin are no longer left on a corpse upon death. The items will remain equipped and in their respective containers.
- Spells will now remain memorized on a character upon death.
- Players should now be able to equip items for which they don't meet the required level. In the inventory window, the item will be highlighted in yellow if the required level is not met. No benefits will be granted from this item other than being able to equip it.
- Added the concept of revive effects. When you respawn, you will receive negative effects for a while to compensate for having all your equipment and spells still memorized.
- Added in Group Roles infrastructure. When right-clicking on a member of the group, a leader will now have the roles sub-menu for role administration. If currently the leader of a group, right-clicking the player's health / mana / stamina window will also show the same role administration menu. Also, added in the /grouproles command. A group role indicator was also added to the Player Info window.
- Group members in other zones will now be notified when their group member (that previously logged off) logs back in (grey when they're offline, white when they're online). Their name in the group window changes color as indicated for online/offline status.
- Weightless Coinage: Coinage no longer adds to the weight of player characters. Adventurers all across Norrath rejoice... especially monks!
- Ornament Mutation Tools are now available for purchase from Magus Alaria in the Guild Lobby. They can be used to permanently change Ornament items into single use Ornamentation containers.
- Player-made powersources will now result in "sealed" orbs which can be right-clicked to create the actual powersources. This will guarantee that players will get a fully-charged powersource, and allow for multiple yields on the tradeskill combine as originally intended.
- The experience gained formulas have been modified to present players with a much smoother increase in the number of kills required to progress through a level as they gain more levels. This change has the side effect of reducing the number of kills required to gain a level in certain scenarios between levels 50 and 75.
- Changes have been made to the way the client is notified about other entities (players, NPCs, etc.) in the zone.
- The bobbing effect of levitation has been removed. A new effect that pushes you off the ground about a foot and a half has been introduced.
- New Loot All Options: "Loot All" functionality has been added to corpses. This includes a "Loot All" button on the loot window and the ability to shift-right-click loot a corpse.
- AC Mitigation Improvements: We modified the AC Caps and over-cap returns for mitigation for all classes to bring them more in line with their intended ability to mitigate damage. Warriors, Paladins, Shadowknights, Clerics, and Monks received a minor increase in their mitigation ability. Rangers, Bards, Rogues, Shaman, Beastlords, and Berserkers received a moderate increase in their mitigation ability. Druids, Necromancers, Wizards, Enchanters, and Magicians received a considerable increase in their mitigation ability.
- Fog Rendering System Enhancements: An entirely new fog rendering system has been implemented in the EverQuest graphics engine. This new system is used in all zones that currently have fog.


Content Related Changes:

- New Icons for the Original Epics: With the newly discovered old set of icons, we gave the original epic 1.0s their intended art (for the original 1.0 epics that had one made).
- Made an optimization that will slightly improve lag in loping plains. This is not a full fix.
- Added a few new item icons for future items. Custom UIs will need to update to see them.
- Changed variations of the same SoF evolving item that were not on lore groups to now share lore groups.
- Added default height sizes to many of the illusions in the game. This should cause illusions of creatures that are typically non-human heights to grow or shrink the user as appropriate when they change into that illusion.


UI Changes/Fixes:

- The NPC buy/sell/bank window will no longer disappear when the game client is re-sized.
- Power sources will once again change the color of the affected stats in that slot.
- The potion belt now conveys the cool down timers on potions.
- While in windowed mode, changing to another application (clicking or alt-tabbing) should no longer cause the target to clear or change.
- Fixed an issue with toggling between the last two targets.
- Escaping the loot window while looting should no longer cause the client to crash.
- Clicking an empty spell gem slot should no longer cause the client to crash.
- Fixed issue with not selecting the correct target when clicking on the group gauges.
- Fixed a problem with toggling between the last two targets if last target was selected by clicking the group window or player window using the mouse.
- Fixed an issue where all items in any list window would display a tool tip regardless of whether there was a tool tip string defined.
- Optimized the network traffic for the target buff window. This should result in significant improvements in lag.
- Re-arranged the General Options tab to allow for more options.
-Added the ability for players to target nearest corpse and cycle through the nearest corpses via hotkeys. These will need to be set in the options menu to be used.
- Corrected a few issues with group and raid management functions.
- The group leader will now be displayed in a different color in the group window and player window. This will work in addition to /groupleader to find out who the group leader is.
- Updated the pet window to display timers in hours, minutes, seconds like the buff window.
- "Caster:" in the buff info window will now display the user name. Also, if there is no caster information available, the "Caster:" line should not appear.
- Added the ability to click on a group member and target out of zone / link dead group members. Using the function keys by default should also bring up the players in the target window.
- Invite, follow and disband/decline buttons are no longer required in the group window.
- Modified the spell gem window to auto-resize based on the number of spell gems activated via Mnemonic Retention.
- Added the ability when using custom UI's to target out-of-zone group members by clicking on their EQType's gauge.
- Fixed a bug seen in custom UI's where the spell name in the buff and short term buff windows would be "Unknown Spell" when there was no buff in that slot.
- In the group window, the gauge size can now be used by custom UI modifiers to set the size for gauges instead of having to change the background size.
- Fix a problem that was causing some custom UIs to crash while drawing buff icons.
- Moved the Max FPS and Max background FPS sliders to the advanced display options window.
- The spell information window has been changed. For buffs that are on you or your pet, you will be able to see the name of the caster, the full duration of the spell, the level required to cast the spell, the skill required to cast the spell, the mana cost of the spell, and the spell description. Non existing buff based spells will display the total duration of the spell in a new format, hours, minutes, and seconds.
- New visual indicators have been added to the buff window icons, and short duration buff window icons. Additionally, the spell counter information has been moved to facilitate the visual display of the buff timer on the respective buff icon. There have been four pieces of visual information added to the buff icons. This includes a visual indicator to show each of four possible pieces of information. The new pieces of information are Buff Timer, Buff Counters, Song Timer, and Song Counters.
- With the description changes added, all relevant counter information for BARD songs, all short duration effects, and regular buffs in either the spell window buff icon or short duration buff icon respectively will also be displayed.
- The buff icon will now display the time remaining in the form of hours (h), minutes (m), or seconds (s) whichever is greater. This significantly reduces the amount physical space used on the icon to print out the remaining time, in effect showing more of the buff or short duration buff icon to the player.
- 'alpha' and 'ralpha' added to /tracksort command.
- Added new SoF stats to the bazaar search options.
- The Mark NPC command should display NPC names correctly now.
- The /who command will now always put your name last in the list.
- Fixed a problem in the bazaar where if you used mouselook right after right clicking on a trader name in the search window your view would pitch up to look at the ceiling.
- Several speed and stability changes have been made to address issues with proximity loading.
- Leadership AAs should work more reliably with mobs that come from outside of the group's awareness range.
- The client will now load more information upon initial zone-in to make later movement smoother. There will be a performance hit when first zoning in, however.
- Right clicking a player's name in the bazaar window will again face you towards them and generate a path.
- The tracking window can now be sorted alphabetically and reverse-alphabetically. Also, there is now a check box to set whether you want the tracking window to auto-update every six seconds.
- Our UI xml schema has changed. If you are using a custom UI you may need to update this file in your custom UI directory.
- Zone-wide /who commands now use a similar code path to server wide /who all commands. Note that this will impose a similar time limit to how often it can be used.
- Fixed an issue with the "Public if Usable" permission in the guild bank.
- Stacks of two items in the guild bank can now be split.
- The Adventure window now includes the ability to sort entries by the properties of each adventure entry.
- Copy Layout Window: Typing either /copylayout or pressing the Copy Layout button within the General tab of the Options window will bring up a list of all your UI_name_server.ini files with each layout stored in them (along with the ones stored in defaults.ini). Selecting one will copy the layout you selected over the current layout, including any custom skin, viewport and alpha/color/fade settings that might be in use. This can also be done directly (for those with a custom UI that does not contain the new window) by typing "/copylayout resolution INI_filename" where resolution is in the form "1280x1024" or "Windowed" for the windowed layout. INI_filename is optional, and defaults to the currently logged in character’s UI INI file.
- Fixed numerous UI issues related to changing the game resolution.
- The /viewport command has a new optional parameter. The 5th parameter "scale" can be "0" or "1". Not including it or using "0" causes /viewport to behave the way it always has, allowing a fixed size viewport. Using "1" causes the viewport to scale with the windowed mode EQ window as it resizes.
- Fixed several problems with window layouts and custom skins. The changes affect the way the windowed mode window layout is saved. In most cases your windowed mode layout will be converted for you automatically as you log each character into the game. However, in some cases the conversion will be unable to determine the original size of your windowed mode window. If this occurs you can simply use the new copy layout window (which should be displayed automatically for default skin users) or /copylayout command to copy a window layout of your choice to be your windowed mode layout.
- Once you have your windowed mode window sized the way you like it, you may now prevent accidental resizing by clicking off the "Allow window resizing" button in Options->Display.
- Like your EQ window to overlap the Windows task bar? This can be enabled with the new "Overlap Windows Taskbar" button in Options->Display.


Possibly Server-Side-Only Changes:

- Improved linkdead recovery: We've decreased the amount of time linkdead players will have to wait to log back in because of a stuck character.
- If you attempt to login to the world when that account is already logged in, you will now be prompted as to whether you wish to kick off the currently logged in player. The logged in player (if it is truly logged in and not link dead) will be prompted whether they wish to allow themselves to be kicked off.
- When going linkdead in combat, a 30 second delay is enforced before the kick is executed.
- When going linkdead while out of combat a 5 second delay is enforced before the kick is executed.
- Fixed a bug that was causing power sources to only be drained when out of combat. Now they only drain while in combat instead.
- Fixed a problem that caused player traps (e.g., fadelure, fire rune, bonestitch fetish) to trigger on pets/mounts/mercs, causing all kinds of havoc.
- Changed the way charges are deducted from consumable click items. Now, if the spell on the item is beneficial and it does not land, the charge will not be consumed.
- Drakkin should now revert to a walk/run animation after dismounting.
- A dead player's corpse will no longer steal the credit for a kill due to DoT spells of the player in hover mode.
- Corpses will now automatically decay after you receive an experience-granting resurrection while in hover mode.
- Fixed a bug that caused groups to be out of sync when a group member went linkdead.
- Fixed a bug that caused active and suspended pets to be lost when their owner went link dead.
- Things that shouldn't have a con color (corpses, boats, etc.) will no longer display with a white con in the target window.
- Corrected a few behind the scenes issues with items.
- More Firiona Vie Character Slots: We've extended the amount of character slots available on the Firiona Vie server to 3 characters.
-Increased the range of emotes to match the range of say.
-/target will now target the player instead of their familiar, as long as the player is within a reasonable distance of their familiar.
- /target will now choose PCs over NPCs when using a partial name.
- All classes now keep their familiar buffs when the familiar is killed or dismissed, not just wizards.
- Fixed a problem with familiars for pet classes. If you have a pet, then summon a familiar, then zone, it will now keep your pet properly with only the familiar buff.
- Groups are now somewhat persistent. If you log out and log back in you will still be in your group. Offline players should still be able to be kicked out of groups.
- Drakkin rogues will now sneak at the correct speed when over level 50.
- The timer for returning to the game after going linkdead with a character has been reduced from 3 minutes to 1 minute.
- Spells and procs will no longer reset swing timers for any class, PC or NPC.
- The NPCs that were made easier in our previous patch will now have their proper consider message.
- Improvements have been made to load balancing for instance servers that should improve peak-time performance of instances.
- Corpses should once again disappear immediately rather than fading away slowly after looting when using /hidecorpse looted even if all the items have been removed from the corpse.
- We have enabled player proximity again. The proximity algorithms have been improved and tuned. Bandwidth usage has been reduced and both client and server performance have been improved. In addition, the delay upon first zoning in should be largely eliminated as any NPCs in your proximity on zone-in are sent by the server before you are officially in the zone (while the zoning screen is still up).
- Fixed issues where /guildstatus and /guildinvite were not working on players outside of proximity range.
- The corpses of group members who die outside of proximity range should once again be targetable by clicking their name and should show on the map.
- The /who guild command should now return players in the zone who are in /roleplay mode.
- The /who count command will again work for all players in the zone.
- Guild Bank items and deposits now sort after the contents have been changed.
-Loot All has been changed to help resolve some client disconnect/corpse loss issues. This will cause the loot all to be slower than it was previously. When stability is improved, we will take a look at speeding it back up again.


Mercinaries:

- Added a new /merclog command that logs information for the player's mercenary (if they have one) to MercenaryAILog.txt. This command can only be executed once per minute. Also, added a new "mercenaries" bug type to the /bug window. Any bugs submitted with this type also generates the MercenaryAILog.txt file (if the player owns a merc and the merc is not dead/suspended).
- The ability to suspend/un-suspend a mercenaries is now locked when in combat and when the player still has a cool-down timer on PvP servers. For standard rule servers, the cool-down timer still does not factor into this, suspend/un-suspend can be done immediately after the hatelist is cleared.
- Mercenaries now appear with a ':' before their name in the tracking window, similar to pets.
- Fixed a bug that allowed a mercenary to keep the effects of an aura permanently after the aura was no longer present.
- Fixed a problem that caused some players that zoned slowly to not be able to unsuspend their mercenary after they zoned.
- Mercenaries should no longer become bald after various illusions.
- Mercenary "in camp" radius is no longer a sphere. It is now more of a disc to help with problems of mercs healing, etc. when a puller is on a floor above or below.
- Players can now decline a group invite when they own a mercenary.
- Casting a spell on a mercenary will now give a downtime timer. This is based on the difficulty of the most difficult NPC on the mercenary is engaged with. Spells cast on the mercenary when not in combat should not generate a downtime timer.
- Mercenaries: Mercenaries are NPCs for hire that will aid adventurers in their heroic endeavors. Their levels and abilities will scale appropriately and they will think and act for themselves with limited player guidance. They are designed for extra support or extra muscle in PvE encounters.
- Unlike player pets, these NPCs are not directly controllable by players, though the player can give them general orders. They function like a normal party member including taking up a group slot and taking a share of the experience.
- Mercenary Liaisons can be found in the Plane of Knowledge as well as all starting cities and will allow you to hire mercenaries based on their race. The Liaisons within the Plane of Knowledge will allow you to hire mercenaries of any player race. These merchants can be found using the Find ability.
- Before purchasing a mercenary be sure to read the descriptions, cost value, and restrictions. There are different levels and tiers available. Some mercenaries may not available until you have completed certain content but there are some apprentice and journeyman ones available to all.
- Mercenares have a one-time hire cost and an upkeep cost that is charged every 15 minutes. The hire cost is usually much higher than the upkeep cost.
- There are two classes of Mercenaries available - Tank and Healer.
- Healer Mercenary: Healer mercenaries prefer to heal and buff their owner and others in the group rather than engage directly in combat. These mercenaries can also resurrect players upon death.
- Tank Mercenary: Tank mercenaries prefer to melee. They will taunt if it is set to the main tank role. Though it will still attack and behave as a secondary tank if it is not set as main tank.
- If your group has someone with the puller role, mercenaries will only assist them when they and any NPCs chasing them are near camp. Any mercenary owned by the puller will stay back with the group.
- Like pets, mercenaries will not aggro NPCs on their own.
- Mercenaries can be suspended like a pet, though they will remain suspended forever or until you dismiss them. Mercenaries will be suspended automatically when entering most raid zones. They must also be suspended before you join a raid.
- If your mercenary dies, it can be revived after five minutes with an additional upkeep charge.
- Some mercenaries may not think your gold is worth them risking their life. Those with higher confidence in themselves will cost more money.


SOE Voice Chat:

- Using the /voicechat Command -
The /voicechat command offers the following options:
-- on: activate voice chat (ex. /voicechat on)
-- off: deactivate voice chat
-- Moderator Controls:
-Mute <player> - mutes a player for everyone in the current channel
-Unmute <player>- unmutes a player for everyone in the current channel
-Kick <player>- kicks a player form the current channel
-Ban <player> - bans a player from the current channel and kicks them if they are present
-Unban <player> - unbans a player from current channel
- Corrected an issue that caused guilded characters to be forcably placed in the guild voice channel upon zoning.
- Fixed some problems with the muted friends list for voice chat.
- Slash versions of the commands are effective on playername for the channel you are in and only if you are the moderator (raid/guild/group leader)
- Unban only works via slash command since there the banned player is no longer in the channel and therefore no longer available to click on.
- /voicechat unban playername
-Unban only works to unban playername in the channel you are currently in, and only if you are the moderator (raid/guild/group leader)


Misc Update Notes:

- Level Cap Increase: Players can now achieve level 85. New high level item sets, new Alternate Advancement ability lines, new spells, and new skill caps come with this increase.
- Level Cap Increase: Players can now achieve level 80. New high level item sets, new Alternate Advancement ability lines, and new spells will come with this increase, including a new AA that grants a new spell slot.



BTW, hopefully we can get the stretching issue fixed on the forums here at some point. It is pretty annoying.

trevius
03-28-2010, 09:53 PM
Here is a list of packets seen from a collect around Feb 2009 to show the order of packets between the client and the server when logging in. Adding this here for reference in case we want to investigate any of the unknowns.

[OPCode: 0x3594] [Decoded] [Client->Server] [Size: 4] - OP_AckPacket
[OPCode: 0x5a6b] [Decoded] [Client->Server] [Size: 68] - OP_ZoneEntry
[OPCode: 0x1af0] [Decoded] [Server->Client] [Size: 12] - Unknown/New???
[OPCode: 0x3bef] [Decoded] [Server->Client] [Size: 0] - OP_RespondAA
[OPCode: 0x322f] [Decoded] [Server->Client] [Size: 120] - OP_SendAATable

[OPCode: 0x6022] [Decoded] [Server->Client] [Size: 23488] - OP_PlayerProfile
[OPCode: 0x5a6b] [Decoded] [Server->Client] [Size: 334] - OP_ZoneEntry
[OPCode: 0x6015] [Decoded] [Server->Client] [Size: 8] - OP_TimeOfDay
[OPCode: 0x399b] [Decoded] [Server->Client] [Size: 48] - OP_TributeUpdate

[OPCode: 0x4036] [Decoded] [Client->Server] [Size: 4] - Unknown/New???
[OPCode: 0x3594] [Decoded] [Client->Server] [Size: 4] - OP_AckPacket
[OPCode: 0x709d] [Decoded] [Server->Client] [Size: 205802] - OP_CharInventory
[OPCode: 0x5412] [Decoded] [Server->Client] [Size: 4] - OP_CompletedTasks
[OPCode: 0x2641] [Decoded] [Server->Client] [Size: 12] - OP_Weather
[OPCode: 0x4292] [Decoded] [Server->Client] [Size: 4] - OP_DeleteSpawn or Unknown/New???
[OPCode: 0x6c26] [Decoded] [Server->Client] [Size: 4] - Unknown/New???
[OPCode: 0x2c4c] [Decoded] [Server->Client] [Size: 24] - OP_WorldUnknown001

[OPCode: 0x0924] [Decoded] [Client->Server] [Size: 1] - Unknown/New???
[OPCode: 0x43ac] [Decoded] [Client->Server] [Size: 0] - OP_ReqNewZone
[OPCode: 0x466c] [Decoded] [Client->Server] [Size: 0] - OP_UpdateAA
[OPCode: 0x116d] [Decoded] [Server->Client] [Size: 20] - Unknown/New???
[OPCode: 0x5ca5] [Decoded] [Server->Client] [Size: 932] - OP_NewZone
[OPCode: 0x1b26] [Decoded] [Server->Client] [Size: 921] - OP_CustomTitles

[OPCode: 0x7bbb] [Decoded] [Client->Server] [Size: 4] - OP_TargetMouse
[OPCode: 0x3594] [Decoded] [Client->Server] [Size: 4] - OP_AckPacket
[OPCode: 0x1436] [Decoded] [Client->Server] [Size: 0] - OP_ReqClientSpawn
[OPCode: 0x102f] [Decoded] [Server->Client] [Size: 184] - OP_SpawnDoor
[OPCode: 0x5821] [Decoded] [Server->Client] [Size: 484] - OP_SendZonePoints
[OPCode: 0x69cd] [Decoded] [Server->Client] [Size: 0] - New OP_WorldObjectsSent (Replaced OP_SendExpZonein here)

[OPCode: 0x0baa] [Decoded] [Client->Server] [Size: 88] - OP_BlockedSpells
[OPCode: 0x7b73] [Decoded] [Client->Server] [Size: 0] - OP_WorldObjectSent
[OPCode: 0x10b7] [Decoded] [Server->Client] [Size: 8] - OP_SpawnAppearance
[OPCode: 0x3088] [Decoded] [Server->Client] [Size: 12] - OP_AAExpUpdate
[OPCode: 0x0e98] [Decoded] [Server->Client] [Size: 8] - OP_ExpUpdate
[OPCode: 0x50d0] [Decoded] [Server->Client] [Size: 12] - OP_AAAction
[OPCode: 0x7b73] [Decoded] [Server->Client] [Size: 0] - OP_WorldObjectSent

[OPCode: 0x7312] [Decoded] [Client->Server] [Size: 128] - OP_SetServerFilter
[OPCode: 0x4e4e] [Decoded] [Server->Client] [Size: 4704] - OP_VetRewardsAvailable
[OPCode: 0x5448] [Decoded] [Server->Client] [Size: 12] - OP_SimpleMessage
[OPCode: 0x435b] [Decoded] [Server->Client] [Size: 4] - Unknown/New???
[OPCode: 0x0296] [Decoded] [Server->Client] [Size: 4] - Unknown/New???
[OPCode: 0x5a6b] [Decoded] [Server->Client] [Size: 326] - OP_ZoneEntry
[OPCode: 0x3164] [Decoded] [Server->Client] [Size: 5] - OP_DeleteSpawn
[OPCode: 0x5ebc] [Decoded] [Server->Client] [Size: 12] - Unknown/New???

[OPCode: 0x2d17] [Decoded] [Client->Server] [Size: 8] - Unknown/New???
[OPCode: 0x6759] [Decoded] [Client->Server] [Size: 0] - OP_ClientReady
[OPCode: 0x7b6e] [Decoded] [Client->Server] [Size: 8] - OP_WeaponEquip2
[OPCode: 0x231f] [Decoded] [Client->Server] [Size: 19] - OP_WearChange
[OPCode: 0x4675] [Decoded] [Client->Server] [Size: 20] - OP_BazaarSearch
[OPCode: 0x19d2] [Decoded] [Client->Server] [Size: 0] - Unknown/New???
[OPCode: 0x4b49] [Decoded] [Client->Server] [Size: 4] - OP_Barter??? 0x6b0e?
[OPCode: 0x7eac] [Decoded] [Client->Server] [Size: 12] - Unknown/New???
[OPCode: 0x365d] [Decoded] [Client->Server] [Size: 4] - Unknown/New???
[OPCode: 0x266e] [Decoded] [Client->Server] [Size: 4] - Unknown/New???
[OPCode: 0x7eeb] [Decoded] [Client->Server] [Size: 0] - Unknown/New???
[OPCode: 0x27bf] [Decoded] [Client->Server] [Size: 8] - Unknown/New???
[OPCode: 0x7e31] [Decoded] [Client->Server] [Size: 4] - Unknown/New???
[OPCode: 0x2d37] [Decoded] [Client->Server] [Size: 4] - Unknown/New???
[OPCode: 0x32c6] [Decoded] [Server->Client] [Size: 140] - OP_RaidUpdate
[OPCode: 0xd677] [Decoded] [Server->Client] [Size: 648] - OP_GuildMOTD
[OPCode: 0x35d3] [Decoded] [Server->Client] [Size: 8] - Unknown/New???
[OPCode: 0x7b6e] [Decoded] [Server->Client] [Size: 8] - OP_WeaponEquip2

[OPCode: 0x7062] [Decoded] [Client->Server] [Size: 40] - OP_ClientUpdate
[OPCode: 0x7eeb] [Decoded] [Server->Client] [Size: 62] - Unknown/New??? - Looks like the EQPlayers update
[OPCode: 0x538f] [Decoded] [Server->Client] [Size: 10] - OP_HPUpdate
[OPCode: 0x4b61] [Decoded] [Server->Client] [Size: 10] - Unknown/New??? - Maybe new Mana Update
[OPCode: 0x02d6] [Decoded] [Server->Client] [Size: 10] - Unknown/New??? - Maybe new Endurance Update

trevius
03-29-2010, 12:01 AM
Here are what appear to be 3 new server->client updates for spawn position and mana/endurance. Instead of using OP_ManaChange as the only way to update Mana and Endurance, they are not both split into separate packets that update regularly like OP_HPUpdate. It looks like OP_ManaChange is still used as well for reducing mana when a spell is cast.

struct SpawnPositionUpdate_Struct
{
/*0000*/ int16 spawnId;
/*0002*/ int64 ypos:19, zpos:19, xpos:19, u3:7;
/*0010*/ unsigned heading:12;
signed unused2:4;
/*0012*/
};

struct ManaUpdate_Struct
{
/*0000*/ int32 curMana;
/*0004*/ int32 maxMana;
/*0008*/ uint16 spawnId;
/*0010*/
};

struct EnduranceUpdate_Struct
{
/*0000*/ int32 curEnd;
/*0004*/ int32 maxEnd;
/*0008*/ uint16 spawnId;
/*0010*/
};

I see all 3 of those packets from Live collects of SoD, so they are probably going to be needed to get the correct updates. The position update one may not be required, but it may be useful if we want to cut down server traffic and send minimal info on spawns that are out of range or are not moving.

Here are some examples for those 3 structs (note this char is a rogue, so there is no mana):

Feb 14 2009 02:43:42:054 [Decoded] [Server->Client] [Size: 12]
[OPCode: 0x4656]
[Name: OP_MobUpdate][Updated: 01/17/08][Type: spawnPositionUpdate (12) ==]
000 | 12 12 27 10 08 00 c0 51 fb 01 cc 02 | ..'....Q....

Feb 14 2009 02:43:42:054 [Decoded] [Server->Client] [Size: 12]
[OPCode: 0x4656]
[Name: OP_MobUpdate][Updated: 01/17/08][Type: spawnPositionUpdate (12) ==]
000 | 5f 2a ba 03 e0 00 40 4f fc 01 02 00 | _*....@O....

Feb 14 2009 02:43:42:054 [Decoded] [Server->Client] [Size: 12]
[OPCode: 0x4656]
[Name: OP_MobUpdate][Updated: 01/17/08][Type: spawnPositionUpdate (12) ==]
000 | c7 29 df 02 c0 01 40 80 fd 01 fc 01 | .)....@.....


Feb 14 2009 02:43:42:124 [Decoded] [Server->Client] [Size: 10]
[OPCode: 0x538f]
[Name: OP_HPUpdate][Updated: 10/21/08][Type: hpNpcUpdateStruct (10) ==]
000 | 47 12 00 00 79 1c 00 00 0c 12 | G...y.....

Feb 14 2009 02:43:42:124 [Decoded] [Server->Client] [Size: 10]
[OPCode: 0x4b61]
[Name: OP_ManaChange][Updated: 01/17/08]
000 | 00 00 00 00 00 00 00 00 0c 12 | ..........

Feb 14 2009 02:43:42:124 [Decoded] [Server->Client] [Size: 10]
[OPCode: 0x02d6]
[Name: OP_Stamina][Updated: 10/21/08]
000 | b3 1b 00 00 b3 1b 00 00 0c 12 | ..........

Here is another struct I see new to SoD from the ShowEQ structs, but I am not sure what it is for at all, if anything, yet:

struct SpawnUpdate_Struct
{
/*0000*/ uint16 spawnId; // Id of spawn to update
/*0002*/ uint16 subcommand; // some sort of subcommand type
/*0004*/ int16 arg1; // first option
/*0006*/ int16 arg2; // second option
/*0008*/ uint8 arg3; // third option?
/*0009*/ uint8 unknown0009[10];
/*0019*/
};

trevius
03-29-2010, 04:25 AM
Well, I think I know why NPC HPs aren't updating in the target window for SoD. It seems they added new HP/Mana/Endurance packets that give the spawn ID and a percentage value to keep the client current with it's target's health and such.

So, we will need to add in new code to support these new packets. The main priority is the health update, but the others can go in as well.

Feb 18 2009 01:00:21:741 [Decoded] [Server->Client] [Size: 3] - OP_MobHealth
[OPCode: 0x47ea]
000 | da 0f 64 | ..d

Feb 18 2009 01:00:21:742 [Decoded] [Server->Client] [Size: 3] - OP_MobMana?
[OPCode: 0x2ac1]
000 | da 0f 00 | ...

Feb 18 2009 01:00:21:742 [Decoded] [Server->Client] [Size: 3] - OP_MobEndurance?
[OPCode: 0x6c5f]
000 | da 0f 00 | ...


These structures should work for the above packets. We will just need to add in handling for them and set places in the code to know when to send them out. Why they didn't combine these 3 into a single 5 byte packet, I don't know (LOL), but this is how it looks now. At least it is still less than what we previously sent I think.

struct MobHealth_Struct
{
/* 00 */ int16 SpawnID;
/* 02 */ int8 HpPercent;
/* 03 */
};

struct MobMana_Struct
{
/* 00 */ int16 SpawnID;
/* 02 */ int8 ManaPercent;
/* 03 */
};

struct MobEndurance_Struct
{
/* 00 */ int16 SpawnID;
/* 02 */ int8 EndurancePercent;
/* 03 */
};


Other than the addition of these for the target HP/Mana/End updates, there will still need to be some more targeting work done. I am still trying to figure out what else has been changed with targeting.

Noport
03-29-2010, 05:25 AM
you are correct it's called the Targets/Target's Window , example you pull the boss he grabs five other to help him fight they all now appear in your targets/target's window. the bots have hp/mana/end as well as the player. you have to account for six total targets/target's. another example you click on a player it now shows 30+ buffs on player.

ptarp
03-30-2010, 03:05 AM
Noport, are you sure you aren't talking about the extended targets window? That came about after UF and isn't included in starting SoD client. group Target-Of-Target leader AA is in SoD and has the same single target window only showing the single target of the mob or pc you have targeted.
The target window shows buffs on NPCs but I think 'Inspect Buffs' group leader AA was required for that, though you didn't have to have a group for it to work.
The group and target windows do show health, mana, and endurance, and the old ones didn't, though I can't remember them showing endurance and mana for npcs that weren't in your group. PC and mercenary only I thought, which might be a good reason for seperate structs.

trevius
03-30-2010, 05:50 AM
Well, I figured out why NPC HPs weren't updating properly. It was just that the incorrect opcode was set. I corrected it and they work just fine now.

Also, I found out that targeting works just fine as it is. Turned out that I was casting an AE spell, which is why it wasn't hitting my target. I never knew wizards got an AE spell at level 1, or I would have thought to check that *blushes* LOL

So, as far as I know, that mainly leaves grouping as the big thing that needs to be done to get SoD just about fully functional. We still have some minor things to adjust in the spawn struct and there is something wrong with items that make them no drop, but those 2 things shouldn't be too hard to finalize.

Keep an eye out for any other bugs with the client that haven't been documented yet and post them in the SoD bug thread in the bug reports section of the forums.

trevius
03-30-2010, 07:59 AM
I started doing some research to try to figure out the new formula for HP/Mana/Endurance. I think I will start with HP, since that is the most important to have, and figure out the others later.

So far, I have checked a Ranger and tested by equiping an item that adds 100 STA to show how much HP it adds per point of STA. This is what I have for now:

Ranger:

LVL - HP Per STA - Base HP w/ 75 STA
1 - .08 - 33
2 - .15 - 62
3 - .23 - 91
4 - .30 - 120
5 - .39 - 148
6 - .46 - 177
7 - .53 - 206
8 - .62 - 234
9 - .69 - 263
10 - .77 - 292
11 - .84 - 321
20 - 1.54 - 579
30 - 2.30 - 867
40 - 3.06 - 1155
50 - 4.60 - 1729
60 - 6.14 - 2304
65 - 6.90 - 2592
70 - 7.66 - 2880
75 - 8.43 - 3167
80 - 9.20 - 3454
85 - 9.20 - 3594


I am guessing that most archetypes use the same formulas, but only testing will tell for sure. Hopefully we won't need to check each class individually or that would take forever. There definitely seems to be a pattern here with HPs gained per STA point. I am sure this will be a long and tedious process to get all classes figured out as close as possible.

Vampire1212
04-01-2010, 01:00 AM
I just wanted to give thanks to all those who are working hard on this. I love what eqemulator.org is doing for SoD. It seems everyone is getting somewhat caught up to live.

Keep up the good work!

- Steven

blackdragonsdg
04-01-2010, 01:57 AM
I got bored so I started trying to figure out what race number went with what race. It is a bit messy but this is what I found so far

Race 591 - Crystal

Race 594 - Worg Mount

Race 597 - Lizard Mount

Race 598 - Spectral Worg Mount

Race 607 - mph.eqg - a Vekerchiki infiltrator - http://eqbeastiary.allakhazam.com/search.shtml?id=31802

Race 608 - mud.eqg - New Golem

Race 614 - bal.eqg - Overlord Gevalark the Dread - http://eqbeastiary.allakhazam.com/search.shtml?id=31992

Race 615 - a crystalline trichordont - http://eqbeastiary.allakhazam.com/search.shtml?id=31785

Race 616 - cry.eqg - Floating Transparent Globe

Race 617 - Gnoll - http://eqbeastiary.allakhazam.com/search.shtml?id=31951

Race 620 - dvl.eqg - a vitrik towerguard - http://eqbeastiary.allakhazam.com/search.shtml?id=33667

Race 622 - god.eqg - Lord Brekt, Rider of Discord - http://eqbeastiary.allakhazam.com/search.shtml?id=32645

Race 623 - New Feran

Race 624, texture 2, gender 0 - a Rallosian seer - http://eqbeastiary.allakhazam.com/search.shtml?id=31657

Race 625 - Winged Lizard

Race 626 - gra.eqg - Giant -

Process of elimination takes a while so if anyone knows a faster way to get that information I am up for trying it.

cubber
04-02-2010, 04:44 PM
Came across a weird bug with bots and SoD:

I installed SoD, updated my server to svn rev 1340 and logged in. Spawned my cleric and shamy bots then zoneed to hateplaneb on my GM monk character.

Went to attack the first NPC I saw and the bots took off, and all animation stopped. I was able to see the NPC's health bar drop, but was unable to hit any hotkeys (every attempt said you cannot do that right now) or do anything besides toggle auto attack, (which did nothing to my characters animation). The only other thing I could do was use /q to exit the game. When I came back in the NPC's were dead and I was in the spot I was when I /q'd.

The best way to describe it is it was like I was going LD, but I was not LD...

A few notes after duplicating the issue.

- The issue only happens in SoD not SoF

- The issue only happens when I zone into hateplaneb with a group of bots then attack something.

- The issue DOES NOT happen when I log into hateplaneb from scratch, spawn bots, then attack.

I then tested zoning into kurns tower with a group of bots and all was fine. So it may be on a per zone basis. I have not had time to test any further.

trevius
04-02-2010, 06:32 PM
Yeah, I have seen 2 types of client bugs so far that seem to be caused by various things. I am pretty sure that in both cases, they should be possible to resolve by sending the client what it is expecting.

1. The Mouselook Bug - There are a couple of odd scenarios that can cause the mouse to get stuck in mouselook mode for about 2 minutes. I think this is just because the client is expecting something it isn't getting. It is better than just crashing when it doesn't get it, at least. At least it eventually recovers on it's own. I think we just need to identify each thing that can cause this and fix them one by one. One of the things I know can cause it is trying to unmem a spell that is higher than your current level, and I think another might be related to the server removing buffs from your character.

2. The Attack/Cast Bug - This bug reminds me of the bug we used to see a lot on previous clients where the client would sometimes get out of order packets and cause itself to be unable to cast or attack or do most things until using /quit or /camp and logging back in. This bug does not seem to recover on it's own from what I have seen so far. So, I think we will need to find the exact cause of this bug and resolve it. It could be something as simple as a missing or bad opcode, or it may be something new to the client all-together.

TheTrilobyte
04-03-2010, 02:02 AM
I'm excited about SoD personally, it may be time limited (possibly, I mean the SoD DL also gives you an SoF client), but at least it is actually commercially available to buy brand new.

I wonder what Congdar's thoughts on the merc system are hehe.

Congdar
04-03-2010, 12:28 PM
I've never seen the merc system, but Trev said there were some ui windows that might be useful.

cavedude
04-03-2010, 01:06 PM
I've never seen the merc system, but Trev said there were some ui windows that might be useful.

Yes, absolutely. I betcha if you ask nicely, Derision could get you the opcodes and structs you'll need to tie bots into the window. Now that, would be really cool.

Ansley1
04-03-2010, 09:24 PM
I Downloaded it.. how long until I can connect to the LS with it? Just wondering :D

trevius
04-03-2010, 10:36 PM
Only Rogean knows that answer. He mentioned he had started work on it a few days ago, but haven't seen any updates from him yet. I don't think the changes were too involved, but I also haven't seen the old LS source, so I dunno. Maybe he was waiting for KLS to finish working out her re-write of the new open source LS to use it instead of the old one.

Either way, I am hoping it will be any day now. I am excited to start seeing players pop in with the new client :D

cubber
04-05-2010, 11:18 AM
the /hidecorpse all command does not work in the SoD client

trevius
04-05-2010, 04:21 PM
Thanks, cubber, I will try to verify that and add it to the list of things to work on. I kinda suspected that /hidecorpse may need some work considering the numerous patch notes they have on that command since SoF.

Noport
04-06-2010, 05:07 PM
it was fixed in Underfoot

AngelKnight
04-12-2010, 05:03 AM
My main on PEQ just ding'd 58 tonight, and then after xping for a bit, I noticed that my 9th spell slot opened up and was avilable for use. I do NOT have the aa for MR (as a matter of fact, I only have 2 aa's, both put into Run Speed). The slot works, and I was able to cast from it.

I don't know if this was something they added later on live with SoD specifically (didn't see it in the change log summary Trev posted), or if this is a bug server-side?

Unfortnately, this is my only casting character that is that high of level, so cannot verify with another class (my main is a mage).

trevius
04-12-2010, 05:40 AM
I may be wrong, but I think memmed spell slots were upped to 10 max including the AA. I don't know if attaining it at level 58 is normal, or maybe you somehow gained the AA ability for free or something. We can look into it, though. Thanks for the report.

Also, while replying to this thread, I figured I would mention the current state of SoD development. Currently, it is as fully functional as SoF and only has a few small remaining issues to look into to make it the most bug-free EQEmu client so far. Even some of the new features to SoD have been added, which means there are nice benefits to using SoD on any server taht supports it. Being able to see the buffs, mana, and endurance of your group mates is a nice bonus IMO.

dzags
04-12-2010, 06:42 AM
Trev - its working completely? As in the login server lets you in?

trevius
04-12-2010, 06:46 AM
No, the Login Server is the only thing we are waiting on, but the client works great on the Open Source Login Servers, lol.

dzags
04-12-2010, 12:31 PM
Ah okay, you had me excited. I'm assuming you will update SH's home page as well when it gets updated, I check there far more often then here.

AngelKnight
04-12-2010, 01:55 PM
I may be wrong, but I think memmed spell slots were upped to 10 max including the AA. I don't know if attaining it at level 58 is normal, or maybe you somehow gained the AA ability for free or something. We can look into it, though. Thanks for the report.

After logging back in today, I'm back down to 8 slots which is proper. It must have been something to do with dying, zoning to PoK, then running back to PoI. Once I zoned in to PoI while waiting for my body to arrive at the graveyard is when I noticed the 9th slot. But at any rate, I am at 8 slots as I should be. If I die again (err.... when, LOL), I'll see if the 9th slot shows up again.

Andrew80k
04-12-2010, 03:04 PM
I may be wrong, but I think memmed spell slots were upped to 10 max including the AA. I don't know if attaining it at level 58 is normal, or maybe you somehow gained the AA ability for free or something. We can look into it, though. Thanks for the report.

Also, while replying to this thread, I figured I would mention the current state of SoD development. Currently, it is as fully functional as SoF and only has a few small remaining issues to look into to make it the most bug-free EQEmu client so far. Even some of the new features to SoD have been added, which means there are nice benefits to using SoD on any server taht supports it. Being able to see the buffs, mana, and endurance of your group mates is a nice bonus IMO.
Trev,

What's the status of spells in SoD? I noticed on my new set up that there is something funky going on with the spells. I'm using PEQ out of the box right now and using my Ranger (new), I had a level 45 version of Immolate and a level 255 version of it as well. And it seems only up to level 65 of scribespells is working. This could be due to rules on the server though, I guess. I haven't checked what max level is by default on PEQ these days.

Thanks.

trevius
04-12-2010, 05:13 PM
Yes, Dzags, once the LS is working for SoD, I will be posting about it on multiple sites so everyone knows right away. I am excited for it to be working, and hope it happens soon :)

Andrew80k, I am pretty sure PEQ is still set to 65 by default for maxlevel and that is what is causing your spells to only scribe that high. As for the level 255 spell, that just means that the server sent you spells from it's spell table that don't match up with the SoD spell file. Cavedude mentioned that he was going to merge the SoD spell file into the PEQ spell table, but that means that all previous spells from older spell files will still stay in place and only new spells will be added. I am sure there cases where certain spells were removed or changed since Titanium, so SoD will not match the default PEQ spell table 100%.

There may be other options at some point, but currently there are only 2 options for dealing with spell file differences (well, I guess 3 technically). The first option is to use a custom spell file for your SoD client by generating it with the spell exporter tool that AndMetal made. That will export the spell table into a spell file that is compatible with all clients. Another way to do it would be to import your SoD spell file into your server, and that would make SoD spells match up, but then older clients would have inconsistencies. The last option is to just deal with it as-is and ignore the 255 spells or other inconsistencies. Really, none of them are the perfect solution, but IMO the best one is to use a custom spell file by exporting your table into a file.

Maybe at some point we will have some way to differentiate which spells get sent/used by each client. I just can't think of a simple way to do it, and even if so, it might give an unfair advantage to certain clients in certain cases.

Dinggo
04-12-2010, 10:08 PM
Trev have you spoken to Rogean at all on why there is a delay on SOD being able to login under the LS? PEQ and some others had this done in a few days, wondering why its taking Rogean so long?

KLS
04-12-2010, 10:14 PM
Yes he did and it was very awkward, I was there.

Dinggo
04-12-2010, 10:57 PM
Thats unfortunate. I know hes having some serious issues with his own server atm, due to some idiot whiners, but its a shame the other 57 servers on the same system have to suffer from one moron attacking one server.

trevius
04-12-2010, 11:03 PM
I am sure that trying to run both P1999 and EQEmu at the same time would spread anyone thin. And he has higher priorities right now, unfortunately.

In other news, here is a wiki page I put on on my server wiki to show screenshots of each SoD zone. The picks are from Alla's, so they are from Live, not EQEmu, but the zones are the same :P

http://stormhavenserver.com/mediawiki/index.php?title=Seeds_of_Destruction

I am probably going to try to gather more info on SoD pretty soon to fill out what we might want to know.

AngelKnight
04-13-2010, 11:46 AM
Trevius,

Remember I said that my 8 spell slots came back to normal? Well, after further testing, it turns out that the 9th slot is still there, and still has a spell mem'd in it (in my case, gate). For some reason, tho, the UI has switched back to the 8 slot spell bar, and I can not un-mem gate. BUT, I can use it.

I figured this out when I wanted to gate out of a zone I was in, so un-mem'd my 8th slot, went to mem gate, and it told me I couldn't because I already had it mem'd. After some head scratching, I tried hitting ALT-9, and lo-and-behold, I gated. I'm leaving it as-is for now, since I can't actually FIX it, and I'm stuck with gate in the 9th slot until such time as I purchase the MR aa, but figured you'd want to know about this and see if there was something server-side that needs to be looked at.

I still am not sure as to why or how my 9th slot showed up after dying at level 58.

trevius
04-14-2010, 07:18 AM
Thanks, Angelknight. I will look into that further when I get some time.

Thanks to some big help from Maudigan, I was able to collect all of the data we should need for figuring out the new HP/Mana/Endurance formulas. He wrote a nice little script for me that #levels my char 1 level at a time, and then collects what the client shows for Max HP/Mana/End, and records it. Then, it equips a test item I made with +100 to STR/STA/AGI/DEX/INT/WIS, and records the new Max for HP/Mana/End, and does some math on it to give the results I was wanting.

I am posting the results I got so anyone can help try to figure out the pattern/formula for them in case someone can figure it out before I do.

To explain this data a bit, here is an example and some descriptions of what each are:

Classes: Wizard, Magician, Necromancer, Enchanter, Druid
LVL:1 H:38 E:41 M:41 HPer:0.07 EPer:0.05 MPer:0.19 HBase:24 EBase:3 ManaBase:3 ABaseHP:19

So, there, Classes lists all of the classes that had the same exact results from the test. So, the formula for those classes are all the exact same.

LVL: This field just shows the level that the data was collected for.
H/E/M: These are the unmodified HP/Endurance/Mana that were seen.
HPer: This is the HPs gained per 1 Point of STA added.
EPer: This is the Endurance gained per 1 point of STA, AGI, DEX or STR added.
MPer: This is the Mana gained per 1 point of WIS/INT added.
HBase: This is the number of HPs after subtracting 2 times the amount that was added when equiping the Stat item.
EBase: This is the number of Endurance after subtracting 2 times the amount that was added when equiping the Stat item.
MBase: This is the number of Mana after subtracting 2 times the amount that was added when equiping the Stat item.
ABaseHP: This is HBase - 5.

Here are some more details about the testing:

1. All testing was done on characters that started with 100 base to STR/STA/AGI/DEX/WIS/INT/CHA due to a hack I added into the Player Profile to make them all start with the same amount to make this much more simple for testing. So, all of the starting stats were 100 as base.

2. The test Stat Item was created with 100 to all stats as well. This way, by subtracting the number gained in HP/Mana/Endurance by equiping the item, we could then subtract that same amount again and it should equal the actual base HP/Mana/End as if the character had 0 to all stats.

3. As far as I can tell, 5 is always added to the base HP calculations, so I subtracted 5 from what I got as a result for HPs in note# 2 above here.

4. HPs are only affected by STA.

5. Mana is only affected by WIS or INT depending on the class, but it is the same as it always was for EQ (IE Clerics only gain mana from WIS, Wizards only gain mana from INT, etc).

6. Endurance is affected by STR/STA/DEX/AGI in exactly equal parts. We really don't need to figure out the formula for Endurance, as it is exactly the same as the formula for Mana. The only difference is that since Endurance gains from 4 stats, you divide the Mana formula by 4. So, 10 INT/WIS would add the same amount of mana as either 40 STR, or 10 STR/STA/DEX/AGI would add for Endurance.

7. Mana and Endurance formulas are exactly the same for all classes. So, the only formula we need is the Mana formula for Base Mana gain and the one for how much it increases per INT/WIS. Once we have the Mana formulas, we can use them to do Endurance, so don't worry about Endurance at all.

8. HP formulas vary depending on the class, but there are only a total of 6 different HP formulas. Most classes share their HP formula with 1 or more classes.

9. I assume once we know 1 classes' HP formula, we can use it to figure out the rest fairly easily as they seem to increase at a similar rate.

10. The increase in gain per point of STA/STR/DEX/AGI/INT/WIS stops increasing at level 80, but Base HP/Mana/Endurance still increase up to level 85.

11. The values for HP/Mana/End gained per point are rounded numbers, so don't let that throw you off.

12. There appears to be 3 tiers of base stat formulas (levels 1-39 is the first, 40-79 is the second tier, and 80-85 is the third tier.

Just from first glance at the Warrior data, it looks like the base HP formula for Warriors should be something like this:

if (level < 40) { BaseHP = level * 25; }
else if (level < 80) { BaseHP = ((40 * 25) + ((level - 40) * 50)); }
else { BaseHP = ((40 * 25) + (40 * 50) + ((level - 80) * 30)); }

I am not sure what the per point gain for Warrior is yet though.

Ok, now that all of that is out of the way. Here are the actual data collects:

Classes: Wizard, Magician, Necromancer, Enchanter, Druid
LVL:1 H:38 E:41 M:41 HPer:0.07 EPer:0.05 MPer:0.19 HBase:24 EBase:3 ManaBase:3 ABaseHP:19
LVL:2 H:71 E:82 M:82 HPer:0.13 EPer:0.09 MPer:0.38 HBase:45 EBase:6 ManaBase:6 ABaseHP:40
LVL:3 H:105 E:123 M:123 HPer:0.20 EPer:0.14 MPer:0.56 HBase:65 EBase:11 ManaBase:11 ABaseHP:60
LVL:4 H:138 E:164 M:164 HPer:0.27 EPer:0.19 MPer:0.75 HBase:84 EBase:14 ManaBase:14 ABaseHP:79
LVL:5 H:171 E:206 M:206 HPer:0.33 EPer:0.23 MPer:0.94 HBase:105 EBase:18 ManaBase:18 ABaseHP:100
LVL:6 H:205 E:247 M:247 HPer:0.40 EPer:0.28 MPer:1.12 HBase:125 EBase:23 ManaBase:23 ABaseHP:120
LVL:7 H:238 E:288 M:288 HPer:0.47 EPer:0.33 MPer:1.31 HBase:144 EBase:26 ManaBase:26 ABaseHP:139
LVL:8 H:271 E:329 M:329 HPer:0.53 EPer:0.38 MPer:1.50 HBase:165 EBase:29 ManaBase:29 ABaseHP:160
LVL:9 H:304 E:371 M:371 HPer:0.60 EPer:0.42 MPer:1.69 HBase:184 EBase:33 ManaBase:33 ABaseHP:179
LVL:10 H:338 E:412 M:412 HPer:0.67 EPer:0.47 MPer:1.87 HBase:204 EBase:38 ManaBase:38 ABaseHP:199
LVL:11 H:371 E:453 M:453 HPer:0.73 EPer:0.51 MPer:2.06 HBase:225 EBase:41 ManaBase:41 ABaseHP:220
LVL:12 H:405 E:495 M:495 HPer:0.80 EPer:0.56 MPer:2.25 HBase:245 EBase:45 ManaBase:45 ABaseHP:240
LVL:13 H:438 E:536 M:536 HPer:0.87 EPer:0.61 MPer:2.44 HBase:264 EBase:48 ManaBase:48 ABaseHP:259
LVL:14 H:471 E:577 M:577 HPer:0.93 EPer:0.65 MPer:2.62 HBase:285 EBase:53 ManaBase:53 ABaseHP:280
LVL:15 H:505 E:618 M:618 HPer:1.00 EPer:0.70 MPer:2.81 HBase:305 EBase:56 ManaBase:56 ABaseHP:300
LVL:16 H:538 E:659 M:659 HPer:1.07 EPer:0.75 MPer:3.00 HBase:324 EBase:59 ManaBase:59 ABaseHP:319
LVL:17 H:571 E:701 M:701 HPer:1.13 EPer:0.80 MPer:3.19 HBase:345 EBase:63 ManaBase:63 ABaseHP:340
LVL:18 H:604 E:742 M:742 HPer:1.20 EPer:0.84 MPer:3.37 HBase:364 EBase:68 ManaBase:68 ABaseHP:359
LVL:19 H:638 E:783 M:783 HPer:1.27 EPer:0.89 MPer:3.56 HBase:384 EBase:71 ManaBase:71 ABaseHP:379
LVL:20 H:671 E:825 M:825 HPer:1.33 EPer:0.94 MPer:3.75 HBase:405 EBase:75 ManaBase:75 ABaseHP:400
LVL:21 H:704 E:866 M:866 HPer:1.40 EPer:0.98 MPer:3.94 HBase:424 EBase:78 ManaBase:78 ABaseHP:419
LVL:22 H:738 E:907 M:907 HPer:1.47 EPer:1.03 MPer:4.13 HBase:444 EBase:81 ManaBase:81 ABaseHP:439
LVL:23 H:771 E:948 M:948 HPer:1.53 EPer:1.08 MPer:4.31 HBase:465 EBase:86 ManaBase:86 ABaseHP:460
LVL:24 H:805 E:990 M:990 HPer:1.60 EPer:1.13 MPer:4.50 HBase:485 EBase:90 ManaBase:90 ABaseHP:480
LVL:25 H:838 E:1031 M:1031 HPer:1.67 EPer:1.17 MPer:4.69 HBase:504 EBase:93 ManaBase:93 ABaseHP:499
LVL:26 H:871 E:1072 M:1072 HPer:1.73 EPer:1.22 MPer:4.88 HBase:525 EBase:96 ManaBase:96 ABaseHP:520
LVL:27 H:905 E:1113 M:1113 HPer:1.80 EPer:1.26 MPer:5.06 HBase:545 EBase:101 ManaBase:101 ABaseHP:540
LVL:28 H:938 E:1155 M:1155 HPer:1.87 EPer:1.31 MPer:5.25 HBase:564 EBase:105 ManaBase:105 ABaseHP:559
LVL:29 H:971 E:1196 M:1196 HPer:1.93 EPer:1.36 MPer:5.44 HBase:585 EBase:108 ManaBase:108 ABaseHP:580
LVL:30 H:1005 E:1237 M:1237 HPer:2.00 EPer:1.40 MPer:5.62 HBase:605 EBase:113 ManaBase:113 ABaseHP:600
LVL:31 H:1038 E:1278 M:1278 HPer:2.07 EPer:1.45 MPer:5.81 HBase:624 EBase:116 ManaBase:116 ABaseHP:619
LVL:32 H:1071 E:1319 M:1319 HPer:2.13 EPer:1.50 MPer:6.00 HBase:645 EBase:119 ManaBase:119 ABaseHP:640
LVL:33 H:1105 E:1361 M:1361 HPer:2.20 EPer:1.55 MPer:6.19 HBase:665 EBase:123 ManaBase:123 ABaseHP:660
LVL:34 H:1138 E:1402 M:1402 HPer:2.27 EPer:1.59 MPer:6.38 HBase:684 EBase:126 ManaBase:126 ABaseHP:679
LVL:35 H:1171 E:1443 M:1443 HPer:2.33 EPer:1.64 MPer:6.56 HBase:705 EBase:131 ManaBase:131 ABaseHP:700
LVL:36 H:1204 E:1485 M:1485 HPer:2.40 EPer:1.69 MPer:6.75 HBase:724 EBase:135 ManaBase:135 ABaseHP:719
LVL:37 H:1238 E:1526 M:1526 HPer:2.47 EPer:1.73 MPer:6.94 HBase:744 EBase:138 ManaBase:138 ABaseHP:739
LVL:38 H:1271 E:1567 M:1567 HPer:2.53 EPer:1.78 MPer:7.12 HBase:765 EBase:143 ManaBase:143 ABaseHP:760
LVL:39 H:1305 E:1608 M:1608 HPer:2.60 EPer:1.83 MPer:7.31 HBase:785 EBase:146 ManaBase:146 ABaseHP:780
LVL:40 H:1338 E:1650 M:1650 HPer:2.67 EPer:1.88 MPer:7.50 HBase:804 EBase:150 ManaBase:150 ABaseHP:799
LVL:41 H:1404 E:1732 M:1732 HPer:2.80 EPer:1.97 MPer:7.88 HBase:844 EBase:156 ManaBase:156 ABaseHP:839
LVL:42 H:1471 E:1814 M:1814 HPer:2.93 EPer:2.06 MPer:8.25 HBase:885 EBase:164 ManaBase:164 ABaseHP:880
LVL:43 H:1538 E:1897 M:1897 HPer:3.07 EPer:2.15 MPer:8.62 HBase:924 EBase:173 ManaBase:173 ABaseHP:919
LVL:44 H:1605 E:1980 M:1980 HPer:3.20 EPer:2.25 MPer:9.00 HBase:965 EBase:180 ManaBase:180 ABaseHP:960
LVL:45 H:1671 E:2062 M:2062 HPer:3.33 EPer:2.34 MPer:9.37 HBase:1005 EBase:188 ManaBase:188 ABaseHP:1000
LVL:46 H:1738 E:2144 M:2144 HPer:3.47 EPer:2.44 MPer:9.75 HBase:1044 EBase:194 ManaBase:194 ABaseHP:1039
LVL:47 H:1805 E:2227 M:2227 HPer:3.60 EPer:2.53 MPer:10.13 HBase:1085 EBase:201 ManaBase:201 ABaseHP:1080
LVL:48 H:1871 E:2310 M:2310 HPer:3.73 EPer:2.63 MPer:10.50 HBase:1125 EBase:210 ManaBase:210 ABaseHP:1120
LVL:49 H:1938 E:2392 M:2392 HPer:3.87 EPer:2.72 MPer:10.88 HBase:1164 EBase:216 ManaBase:216 ABaseHP:1159
LVL:50 H:2005 E:2475 M:2475 HPer:4.00 EPer:2.81 MPer:11.25 HBase:1205 EBase:225 ManaBase:225 ABaseHP:1200
LVL:51 H:2071 E:2557 M:2557 HPer:4.13 EPer:2.90 MPer:11.62 HBase:1245 EBase:233 ManaBase:233 ABaseHP:1240
LVL:52 H:2138 E:2639 M:2639 HPer:4.27 EPer:3.00 MPer:12.00 HBase:1284 EBase:239 ManaBase:239 ABaseHP:1279
LVL:53 H:2205 E:2722 M:2722 HPer:4.40 EPer:3.09 MPer:12.37 HBase:1325 EBase:248 ManaBase:248 ABaseHP:1320
LVL:54 H:2271 E:2804 M:2804 HPer:4.53 EPer:3.19 MPer:12.75 HBase:1365 EBase:254 ManaBase:254 ABaseHP:1360
LVL:55 H:2338 E:2887 M:2887 HPer:4.67 EPer:3.28 MPer:13.12 HBase:1404 EBase:263 ManaBase:263 ABaseHP:1399
LVL:56 H:2404 E:2970 M:2970 HPer:4.80 EPer:3.38 MPer:13.50 HBase:1444 EBase:270 ManaBase:270 ABaseHP:1439
LVL:57 H:2471 E:3052 M:3052 HPer:4.93 EPer:3.47 MPer:13.88 HBase:1485 EBase:276 ManaBase:276 ABaseHP:1480
LVL:58 H:2538 E:3135 M:3135 HPer:5.07 EPer:3.56 MPer:14.25 HBase:1524 EBase:285 ManaBase:285 ABaseHP:1519
LVL:59 H:2605 E:3217 M:3217 HPer:5.20 EPer:3.66 MPer:14.63 HBase:1565 EBase:291 ManaBase:291 ABaseHP:1560
LVL:60 H:2671 E:3300 M:3300 HPer:5.33 EPer:3.75 MPer:15.00 HBase:1605 EBase:300 ManaBase:300 ABaseHP:1600
LVL:61 H:2738 E:3382 M:3382 HPer:5.47 EPer:3.84 MPer:15.37 HBase:1644 EBase:308 ManaBase:308 ABaseHP:1639
LVL:62 H:2804 E:3464 M:3464 HPer:5.60 EPer:3.94 MPer:15.75 HBase:1684 EBase:314 ManaBase:314 ABaseHP:1679
LVL:63 H:2871 E:3547 M:3547 HPer:5.73 EPer:4.03 MPer:16.12 HBase:1725 EBase:323 ManaBase:323 ABaseHP:1720
LVL:64 H:2938 E:3629 M:3629 HPer:5.87 EPer:4.13 MPer:16.50 HBase:1764 EBase:329 ManaBase:329 ABaseHP:1759
LVL:65 H:3005 E:3712 M:3712 HPer:6.00 EPer:4.22 MPer:16.87 HBase:1805 EBase:338 ManaBase:338 ABaseHP:1800
LVL:66 H:3071 E:3795 M:3795 HPer:6.13 EPer:4.31 MPer:17.25 HBase:1845 EBase:345 ManaBase:345 ABaseHP:1840
LVL:67 H:3138 E:3877 M:3877 HPer:6.27 EPer:4.41 MPer:17.63 HBase:1884 EBase:351 ManaBase:351 ABaseHP:1879
LVL:68 H:3205 E:3960 M:3960 HPer:6.40 EPer:4.50 MPer:18.00 HBase:1925 EBase:360 ManaBase:360 ABaseHP:1920
LVL:69 H:3271 E:4042 M:4042 HPer:6.53 EPer:4.59 MPer:18.38 HBase:1965 EBase:366 ManaBase:366 ABaseHP:1960
LVL:70 H:3338 E:4125 M:4125 HPer:6.67 EPer:4.69 MPer:18.75 HBase:2004 EBase:375 ManaBase:375 ABaseHP:1999
LVL:71 H:3404 E:4207 M:4207 HPer:6.80 EPer:4.78 MPer:19.12 HBase:2044 EBase:383 ManaBase:383 ABaseHP:2039
LVL:72 H:3471 E:4289 M:4289 HPer:6.93 EPer:4.88 MPer:19.50 HBase:2085 EBase:389 ManaBase:389 ABaseHP:2080
LVL:73 H:3538 E:4372 M:4372 HPer:7.07 EPer:4.97 MPer:19.87 HBase:2124 EBase:398 ManaBase:398 ABaseHP:2119
LVL:74 H:3605 E:4454 M:4454 HPer:7.20 EPer:5.06 MPer:20.25 HBase:2165 EBase:404 ManaBase:404 ABaseHP:2160
LVL:75 H:3671 E:4537 M:4537 HPer:7.33 EPer:5.15 MPer:20.62 HBase:2205 EBase:413 ManaBase:413 ABaseHP:2200
LVL:76 H:3738 E:4620 M:4620 HPer:7.47 EPer:5.25 MPer:21.00 HBase:2244 EBase:420 ManaBase:420 ABaseHP:2239
LVL:77 H:3804 E:4702 M:4702 HPer:7.60 EPer:5.34 MPer:21.37 HBase:2284 EBase:428 ManaBase:428 ABaseHP:2279
LVL:78 H:3871 E:4784 M:4784 HPer:7.73 EPer:5.44 MPer:21.75 HBase:2325 EBase:434 ManaBase:434 ABaseHP:2320
LVL:79 H:3938 E:4867 M:4867 HPer:7.87 EPer:5.53 MPer:22.13 HBase:2364 EBase:441 ManaBase:441 ABaseHP:2359
LVL:80 H:4005 E:4950 M:4950 HPer:8.00 EPer:5.63 MPer:22.50 HBase:2405 EBase:450 ManaBase:450 ABaseHP:2400
LVL:81 H:4029 E:4968 M:4968 HPer:8.00 EPer:5.63 MPer:22.50 HBase:2429 EBase:468 ManaBase:468 ABaseHP:2424
LVL:82 H:4053 E:4986 M:4986 HPer:8.00 EPer:5.63 MPer:22.50 HBase:2453 EBase:486 ManaBase:486 ABaseHP:2448
LVL:83 H:4077 E:5004 M:5004 HPer:8.00 EPer:5.63 MPer:22.50 HBase:2477 EBase:504 ManaBase:504 ABaseHP:2472
LVL:84 H:4102 E:5023 M:5023 HPer:8.00 EPer:5.63 MPer:22.50 HBase:2502 EBase:523 ManaBase:523 ABaseHP:2497
LVL:85 H:4127 E:5041 M:5041 HPer:8.00 EPer:5.63 MPer:22.50 HBase:2527 EBase:541 ManaBase:541 ABaseHP:2522


Classes: Bard, Cleric
LVL:1 H:41 E:41 M:41 HPer:0.07 EPer:0.05 MPer:0.19 HBase:27 EBase:3 ManaBase:3 ABaseHP:22
LVL:2 H:78 E:82 M:82 HPer:0.15 EPer:0.09 MPer:0.38 HBase:48 EBase:6 ManaBase:6 ABaseHP:43
LVL:3 H:115 E:123 M:123 HPer:0.22 EPer:0.14 MPer:0.56 HBase:71 EBase:11 ManaBase:11 ABaseHP:66
LVL:4 H:151 E:164 M:164 HPer:0.29 EPer:0.19 MPer:0.75 HBase:93 EBase:14 ManaBase:14 ABaseHP:88
LVL:5 H:188 E:206 M:206 HPer:0.37 EPer:0.23 MPer:0.94 HBase:114 EBase:18 ManaBase:18 ABaseHP:109
LVL:6 H:225 E:247 M:247 HPer:0.44 EPer:0.28 MPer:1.12 HBase:137 EBase:23 ManaBase:23 ABaseHP:132
LVL:7 H:261 E:288 M:288 HPer:0.51 EPer:0.33 MPer:1.31 HBase:159 EBase:26 ManaBase:26 ABaseHP:154
LVL:8 H:298 E:329 M:329 HPer:0.59 EPer:0.38 MPer:1.50 HBase:180 EBase:29 ManaBase:29 ABaseHP:175
LVL:9 H:335 E:371 M:371 HPer:0.66 EPer:0.42 MPer:1.69 HBase:203 EBase:33 ManaBase:33 ABaseHP:198
LVL:10 H:371 E:412 M:412 HPer:0.73 EPer:0.47 MPer:1.87 HBase:225 EBase:38 ManaBase:38 ABaseHP:220
LVL:11 H:408 E:453 M:453 HPer:0.81 EPer:0.51 MPer:2.06 HBase:246 EBase:41 ManaBase:41 ABaseHP:241
LVL:12 H:445 E:495 M:495 HPer:0.88 EPer:0.56 MPer:2.25 HBase:269 EBase:45 ManaBase:45 ABaseHP:264
LVL:13 H:481 E:536 M:536 HPer:0.95 EPer:0.61 MPer:2.44 HBase:291 EBase:48 ManaBase:48 ABaseHP:286
LVL:14 H:518 E:577 M:577 HPer:1.03 EPer:0.65 MPer:2.62 HBase:312 EBase:53 ManaBase:53 ABaseHP:307
LVL:15 H:555 E:618 M:618 HPer:1.10 EPer:0.70 MPer:2.81 HBase:335 EBase:56 ManaBase:56 ABaseHP:330
LVL:16 H:591 E:659 M:659 HPer:1.17 EPer:0.75 MPer:3.00 HBase:357 EBase:59 ManaBase:59 ABaseHP:352
LVL:17 H:628 E:701 M:701 HPer:1.25 EPer:0.80 MPer:3.19 HBase:378 EBase:63 ManaBase:63 ABaseHP:373
LVL:18 H:665 E:742 M:742 HPer:1.32 EPer:0.84 MPer:3.37 HBase:401 EBase:68 ManaBase:68 ABaseHP:396
LVL:19 H:701 E:783 M:783 HPer:1.39 EPer:0.89 MPer:3.56 HBase:423 EBase:71 ManaBase:71 ABaseHP:418
LVL:20 H:738 E:825 M:825 HPer:1.47 EPer:0.94 MPer:3.75 HBase:444 EBase:75 ManaBase:75 ABaseHP:439
LVL:21 H:775 E:866 M:866 HPer:1.54 EPer:0.98 MPer:3.94 HBase:467 EBase:78 ManaBase:78 ABaseHP:462
LVL:22 H:811 E:907 M:907 HPer:1.61 EPer:1.03 MPer:4.13 HBase:489 EBase:81 ManaBase:81 ABaseHP:484
LVL:23 H:848 E:948 M:948 HPer:1.69 EPer:1.08 MPer:4.31 HBase:510 EBase:86 ManaBase:86 ABaseHP:505
LVL:24 H:885 E:990 M:990 HPer:1.76 EPer:1.13 MPer:4.50 HBase:533 EBase:90 ManaBase:90 ABaseHP:528
LVL:25 H:921 E:1031 M:1031 HPer:1.83 EPer:1.17 MPer:4.69 HBase:555 EBase:93 ManaBase:93 ABaseHP:550
LVL:26 H:958 E:1072 M:1072 HPer:1.91 EPer:1.22 MPer:4.88 HBase:576 EBase:96 ManaBase:96 ABaseHP:571
LVL:27 H:994 E:1113 M:1113 HPer:1.98 EPer:1.26 MPer:5.06 HBase:598 EBase:101 ManaBase:101 ABaseHP:593
LVL:28 H:1031 E:1155 M:1155 HPer:2.05 EPer:1.31 MPer:5.25 HBase:621 EBase:105 ManaBase:105 ABaseHP:616
LVL:29 H:1068 E:1196 M:1196 HPer:2.13 EPer:1.36 MPer:5.44 HBase:642 EBase:108 ManaBase:108 ABaseHP:637
LVL:30 H:1105 E:1237 M:1237 HPer:2.20 EPer:1.40 MPer:5.62 HBase:665 EBase:113 ManaBase:113 ABaseHP:660
LVL:31 H:1141 E:1278 M:1278 HPer:2.27 EPer:1.45 MPer:5.81 HBase:687 EBase:116 ManaBase:116 ABaseHP:682
LVL:32 H:1178 E:1319 M:1319 HPer:2.35 EPer:1.50 MPer:6.00 HBase:708 EBase:119 ManaBase:119 ABaseHP:703
LVL:33 H:1214 E:1361 M:1361 HPer:2.42 EPer:1.55 MPer:6.19 HBase:730 EBase:123 ManaBase:123 ABaseHP:725
LVL:34 H:1251 E:1402 M:1402 HPer:2.49 EPer:1.59 MPer:6.38 HBase:753 EBase:126 ManaBase:126 ABaseHP:748
LVL:35 H:1288 E:1443 M:1443 HPer:2.57 EPer:1.64 MPer:6.56 HBase:774 EBase:131 ManaBase:131 ABaseHP:769
LVL:36 H:1325 E:1485 M:1485 HPer:2.64 EPer:1.69 MPer:6.75 HBase:797 EBase:135 ManaBase:135 ABaseHP:792
LVL:37 H:1361 E:1526 M:1526 HPer:2.71 EPer:1.73 MPer:6.94 HBase:819 EBase:138 ManaBase:138 ABaseHP:814
LVL:38 H:1398 E:1567 M:1567 HPer:2.79 EPer:1.78 MPer:7.12 HBase:840 EBase:143 ManaBase:143 ABaseHP:835
LVL:39 H:1434 E:1608 M:1608 HPer:2.86 EPer:1.83 MPer:7.31 HBase:862 EBase:146 ManaBase:146 ABaseHP:857
LVL:40 H:1471 E:1650 M:1650 HPer:2.93 EPer:1.88 MPer:7.50 HBase:885 EBase:150 ManaBase:150 ABaseHP:880
LVL:41 H:1545 E:1732 M:1732 HPer:3.08 EPer:1.97 MPer:7.88 HBase:929 EBase:156 ManaBase:156 ABaseHP:924
LVL:42 H:1618 E:1814 M:1814 HPer:3.23 EPer:2.06 MPer:8.25 HBase:972 EBase:164 ManaBase:164 ABaseHP:967
LVL:43 H:1691 E:1897 M:1897 HPer:3.37 EPer:2.15 MPer:8.62 HBase:1017 EBase:173 ManaBase:173 ABaseHP:1012
LVL:44 H:1765 E:1980 M:1980 HPer:3.52 EPer:2.25 MPer:9.00 HBase:1061 EBase:180 ManaBase:180 ABaseHP:1056
LVL:45 H:1838 E:2062 M:2062 HPer:3.67 EPer:2.34 MPer:9.37 HBase:1104 EBase:188 ManaBase:188 ABaseHP:1099
LVL:46 H:1911 E:2144 M:2144 HPer:3.81 EPer:2.44 MPer:9.75 HBase:1149 EBase:194 ManaBase:194 ABaseHP:1144
LVL:47 H:1984 E:2227 M:2227 HPer:3.96 EPer:2.53 MPer:10.13 HBase:1192 EBase:201 ManaBase:201 ABaseHP:1187
LVL:48 H:2058 E:2310 M:2310 HPer:4.11 EPer:2.63 MPer:10.50 HBase:1236 EBase:210 ManaBase:210 ABaseHP:1231
LVL:49 H:2131 E:2392 M:2392 HPer:4.25 EPer:2.72 MPer:10.88 HBase:1281 EBase:216 ManaBase:216 ABaseHP:1276
LVL:50 H:2205 E:2475 M:2475 HPer:4.40 EPer:2.81 MPer:11.25 HBase:1325 EBase:225 ManaBase:225 ABaseHP:1320
LVL:51 H:2278 E:2557 M:2557 HPer:4.55 EPer:2.90 MPer:11.62 HBase:1368 EBase:233 ManaBase:233 ABaseHP:1363
LVL:52 H:2351 E:2639 M:2639 HPer:4.69 EPer:3.00 MPer:12.00 HBase:1413 EBase:239 ManaBase:239 ABaseHP:1408
LVL:53 H:2424 E:2722 M:2722 HPer:4.84 EPer:3.09 MPer:12.37 HBase:1456 EBase:248 ManaBase:248 ABaseHP:1451
LVL:54 H:2498 E:2804 M:2804 HPer:4.99 EPer:3.19 MPer:12.75 HBase:1500 EBase:254 ManaBase:254 ABaseHP:1495
LVL:55 H:2571 E:2887 M:2887 HPer:5.13 EPer:3.28 MPer:13.12 HBase:1545 EBase:263 ManaBase:263 ABaseHP:1540
LVL:56 H:2645 E:2970 M:2970 HPer:5.28 EPer:3.38 MPer:13.50 HBase:1589 EBase:270 ManaBase:270 ABaseHP:1584
LVL:57 H:2718 E:3052 M:3052 HPer:5.43 EPer:3.47 MPer:13.88 HBase:1632 EBase:276 ManaBase:276 ABaseHP:1627
LVL:58 H:2791 E:3135 M:3135 HPer:5.57 EPer:3.56 MPer:14.25 HBase:1677 EBase:285 ManaBase:285 ABaseHP:1672
LVL:59 H:2864 E:3217 M:3217 HPer:5.72 EPer:3.66 MPer:14.63 HBase:1720 EBase:291 ManaBase:291 ABaseHP:1715
LVL:60 H:2938 E:3300 M:3300 HPer:5.87 EPer:3.75 MPer:15.00 HBase:1764 EBase:300 ManaBase:300 ABaseHP:1759
LVL:61 H:3011 E:3382 M:3382 HPer:6.01 EPer:3.84 MPer:15.37 HBase:1809 EBase:308 ManaBase:308 ABaseHP:1804
LVL:62 H:3085 E:3464 M:3464 HPer:6.16 EPer:3.94 MPer:15.75 HBase:1853 EBase:314 ManaBase:314 ABaseHP:1848
LVL:63 H:3158 E:3547 M:3547 HPer:6.31 EPer:4.03 MPer:16.12 HBase:1896 EBase:323 ManaBase:323 ABaseHP:1891
LVL:64 H:3231 E:3629 M:3629 HPer:6.45 EPer:4.13 MPer:16.50 HBase:1941 EBase:329 ManaBase:329 ABaseHP:1936
LVL:65 H:3304 E:3712 M:3712 HPer:6.60 EPer:4.22 MPer:16.87 HBase:1984 EBase:338 ManaBase:338 ABaseHP:1979
LVL:66 H:3378 E:3795 M:3795 HPer:6.75 EPer:4.31 MPer:17.25 HBase:2028 EBase:345 ManaBase:345 ABaseHP:2023
LVL:67 H:3451 E:3877 M:3877 HPer:6.89 EPer:4.41 MPer:17.63 HBase:2073 EBase:351 ManaBase:351 ABaseHP:2068
LVL:68 H:3525 E:3960 M:3960 HPer:7.04 EPer:4.50 MPer:18.00 HBase:2117 EBase:360 ManaBase:360 ABaseHP:2112
LVL:69 H:3598 E:4042 M:4042 HPer:7.19 EPer:4.59 MPer:18.38 HBase:2160 EBase:366 ManaBase:366 ABaseHP:2155
LVL:70 H:3671 E:4125 M:4125 HPer:7.33 EPer:4.69 MPer:18.75 HBase:2205 EBase:375 ManaBase:375 ABaseHP:2200
LVL:71 H:3745 E:4207 M:4207 HPer:7.48 EPer:4.78 MPer:19.12 HBase:2249 EBase:383 ManaBase:383 ABaseHP:2244
LVL:72 H:3818 E:4289 M:4289 HPer:7.63 EPer:4.88 MPer:19.50 HBase:2292 EBase:389 ManaBase:389 ABaseHP:2287
LVL:73 H:3891 E:4372 M:4372 HPer:7.77 EPer:4.97 MPer:19.87 HBase:2337 EBase:398 ManaBase:398 ABaseHP:2332
LVL:74 H:3964 E:4454 M:4454 HPer:7.92 EPer:5.06 MPer:20.25 HBase:2380 EBase:404 ManaBase:404 ABaseHP:2375
LVL:75 H:4038 E:4537 M:4537 HPer:8.07 EPer:5.15 MPer:20.62 HBase:2424 EBase:413 ManaBase:413 ABaseHP:2419
LVL:76 H:4111 E:4620 M:4620 HPer:8.21 EPer:5.25 MPer:21.00 HBase:2469 EBase:420 ManaBase:420 ABaseHP:2464
LVL:77 H:4184 E:4702 M:4702 HPer:8.36 EPer:5.34 MPer:21.37 HBase:2512 EBase:428 ManaBase:428 ABaseHP:2507
LVL:78 H:4258 E:4784 M:4784 HPer:8.51 EPer:5.44 MPer:21.75 HBase:2556 EBase:434 ManaBase:434 ABaseHP:2551
LVL:79 H:4331 E:4867 M:4867 HPer:8.65 EPer:5.53 MPer:22.13 HBase:2601 EBase:441 ManaBase:441 ABaseHP:2596
LVL:80 H:4405 E:4950 M:4950 HPer:8.80 EPer:5.63 MPer:22.50 HBase:2645 EBase:450 ManaBase:450 ABaseHP:2640
LVL:81 H:4431 E:4968 M:4968 HPer:8.80 EPer:5.63 MPer:22.50 HBase:2671 EBase:468 ManaBase:468 ABaseHP:2666
LVL:82 H:4458 E:4986 M:4986 HPer:8.80 EPer:5.63 MPer:22.50 HBase:2698 EBase:486 ManaBase:486 ABaseHP:2693
LVL:83 H:4484 E:5004 M:5004 HPer:8.80 EPer:5.63 MPer:22.50 HBase:2724 EBase:504 ManaBase:504 ABaseHP:2719
LVL:84 H:4512 E:5023 M:5023 HPer:8.80 EPer:5.63 MPer:22.50 HBase:2752 EBase:523 ManaBase:523 ABaseHP:2747
LVL:85 H:4539 E:5041 M:5041 HPer:8.80 EPer:5.63 MPer:22.50 HBase:2779 EBase:541 ManaBase:541 ABaseHP:2774


Classes: Beastlord, Berserker, Monk, Rogue, Shaman
LVL:1 H:40 E:41 M:41 HPer:0.07 EPer:0.05 MPer:0.19 HBase:26 EBase:3 ManaBase:3 ABaseHP:21
LVL:2 H:75 E:82 M:82 HPer:0.14 EPer:0.09 MPer:0.38 HBase:47 EBase:6 ManaBase:6 ABaseHP:42
LVL:3 H:110 E:123 M:123 HPer:0.21 EPer:0.14 MPer:0.56 HBase:68 EBase:11 ManaBase:11 ABaseHP:63
LVL:4 H:146 E:164 M:164 HPer:0.28 EPer:0.19 MPer:0.75 HBase:90 EBase:14 ManaBase:14 ABaseHP:85
LVL:5 H:181 E:206 M:206 HPer:0.35 EPer:0.23 MPer:0.94 HBase:111 EBase:18 ManaBase:18 ABaseHP:106
LVL:6 H:216 E:247 M:247 HPer:0.42 EPer:0.28 MPer:1.12 HBase:132 EBase:23 ManaBase:23 ABaseHP:127
LVL:7 H:252 E:288 M:288 HPer:0.50 EPer:0.33 MPer:1.31 HBase:152 EBase:26 ManaBase:26 ABaseHP:147
LVL:8 H:288 E:329 M:329 HPer:0.57 EPer:0.38 MPer:1.50 HBase:174 EBase:29 ManaBase:29 ABaseHP:169
LVL:9 H:323 E:371 M:371 HPer:0.64 EPer:0.42 MPer:1.69 HBase:195 EBase:33 ManaBase:33 ABaseHP:190
LVL:10 H:358 E:412 M:412 HPer:0.71 EPer:0.47 MPer:1.87 HBase:216 EBase:38 ManaBase:38 ABaseHP:211
LVL:11 H:393 E:453 M:453 HPer:0.78 EPer:0.51 MPer:2.06 HBase:237 EBase:41 ManaBase:41 ABaseHP:232
LVL:12 H:429 E:495 M:495 HPer:0.85 EPer:0.56 MPer:2.25 HBase:259 EBase:45 ManaBase:45 ABaseHP:254
LVL:13 H:465 E:536 M:536 HPer:0.92 EPer:0.61 MPer:2.44 HBase:281 EBase:48 ManaBase:48 ABaseHP:276
LVL:14 H:500 E:577 M:577 HPer:0.99 EPer:0.65 MPer:2.62 HBase:302 EBase:53 ManaBase:53 ABaseHP:297
LVL:15 H:535 E:618 M:618 HPer:1.06 EPer:0.70 MPer:2.81 HBase:323 EBase:56 ManaBase:56 ABaseHP:318
LVL:16 H:571 E:659 M:659 HPer:1.13 EPer:0.75 MPer:3.00 HBase:345 EBase:59 ManaBase:59 ABaseHP:340
LVL:17 H:606 E:701 M:701 HPer:1.20 EPer:0.80 MPer:3.19 HBase:366 EBase:63 ManaBase:63 ABaseHP:361
LVL:18 H:641 E:742 M:742 HPer:1.27 EPer:0.84 MPer:3.37 HBase:387 EBase:68 ManaBase:68 ABaseHP:382
LVL:19 H:677 E:783 M:783 HPer:1.35 EPer:0.89 MPer:3.56 HBase:407 EBase:71 ManaBase:71 ABaseHP:402
LVL:20 H:713 E:825 M:825 HPer:1.42 EPer:0.94 MPer:3.75 HBase:429 EBase:75 ManaBase:75 ABaseHP:424
LVL:21 H:748 E:866 M:866 HPer:1.49 EPer:0.98 MPer:3.94 HBase:450 EBase:78 ManaBase:78 ABaseHP:445
LVL:22 H:783 E:907 M:907 HPer:1.56 EPer:1.03 MPer:4.13 HBase:471 EBase:81 ManaBase:81 ABaseHP:466
LVL:23 H:818 E:948 M:948 HPer:1.63 EPer:1.08 MPer:4.31 HBase:492 EBase:86 ManaBase:86 ABaseHP:487
LVL:24 H:854 E:990 M:990 HPer:1.70 EPer:1.13 MPer:4.50 HBase:514 EBase:90 ManaBase:90 ABaseHP:509
LVL:25 H:890 E:1031 M:1031 HPer:1.77 EPer:1.17 MPer:4.69 HBase:536 EBase:93 ManaBase:93 ABaseHP:531
LVL:26 H:925 E:1072 M:1072 HPer:1.84 EPer:1.22 MPer:4.88 HBase:557 EBase:96 ManaBase:96 ABaseHP:552
LVL:27 H:960 E:1113 M:1113 HPer:1.91 EPer:1.26 MPer:5.06 HBase:578 EBase:101 ManaBase:101 ABaseHP:573
LVL:28 H:996 E:1155 M:1155 HPer:1.98 EPer:1.31 MPer:5.25 HBase:600 EBase:105 ManaBase:105 ABaseHP:595
LVL:29 H:1031 E:1196 M:1196 HPer:2.05 EPer:1.36 MPer:5.44 HBase:621 EBase:108 ManaBase:108 ABaseHP:616
LVL:30 H:1067 E:1237 M:1237 HPer:2.13 EPer:1.40 MPer:5.62 HBase:641 EBase:113 ManaBase:113 ABaseHP:636
LVL:31 H:1102 E:1278 M:1278 HPer:2.20 EPer:1.45 MPer:5.81 HBase:662 EBase:116 ManaBase:116 ABaseHP:657
LVL:32 H:1138 E:1319 M:1319 HPer:2.27 EPer:1.50 MPer:6.00 HBase:684 EBase:119 ManaBase:119 ABaseHP:679
LVL:33 H:1173 E:1361 M:1361 HPer:2.34 EPer:1.55 MPer:6.19 HBase:705 EBase:123 ManaBase:123 ABaseHP:700
LVL:34 H:1208 E:1402 M:1402 HPer:2.41 EPer:1.59 MPer:6.38 HBase:726 EBase:126 ManaBase:126 ABaseHP:721
LVL:35 H:1243 E:1443 M:1443 HPer:2.48 EPer:1.64 MPer:6.56 HBase:747 EBase:131 ManaBase:131 ABaseHP:742
LVL:36 H:1279 E:1485 M:1485 HPer:2.55 EPer:1.69 MPer:6.75 HBase:769 EBase:135 ManaBase:135 ABaseHP:764
LVL:37 H:1315 E:1526 M:1526 HPer:2.62 EPer:1.73 MPer:6.94 HBase:791 EBase:138 ManaBase:138 ABaseHP:786
LVL:38 H:1350 E:1567 M:1567 HPer:2.69 EPer:1.78 MPer:7.12 HBase:812 EBase:143 ManaBase:143 ABaseHP:807
LVL:39 H:1385 E:1608 M:1608 HPer:2.76 EPer:1.83 MPer:7.31 HBase:833 EBase:146 ManaBase:146 ABaseHP:828
LVL:40 H:1421 E:1650 M:1650 HPer:2.83 EPer:1.88 MPer:7.50 HBase:855 EBase:150 ManaBase:150 ABaseHP:850
LVL:41 H:1492 E:1732 M:1732 HPer:2.98 EPer:1.97 MPer:7.88 HBase:896 EBase:156 ManaBase:156 ABaseHP:891
LVL:42 H:1563 E:1814 M:1814 HPer:3.12 EPer:2.06 MPer:8.25 HBase:939 EBase:164 ManaBase:164 ABaseHP:934
LVL:43 H:1633 E:1897 M:1897 HPer:3.26 EPer:2.15 MPer:8.62 HBase:981 EBase:173 ManaBase:173 ABaseHP:976
LVL:44 H:1704 E:1980 M:1980 HPer:3.40 EPer:2.25 MPer:9.00 HBase:1024 EBase:180 ManaBase:180 ABaseHP:1019
LVL:45 H:1775 E:2062 M:2062 HPer:3.54 EPer:2.34 MPer:9.37 HBase:1067 EBase:188 ManaBase:188 ABaseHP:1062
LVL:46 H:1846 E:2144 M:2144 HPer:3.68 EPer:2.44 MPer:9.75 HBase:1110 EBase:194 ManaBase:194 ABaseHP:1105
LVL:47 H:1917 E:2227 M:2227 HPer:3.83 EPer:2.53 MPer:10.13 HBase:1151 EBase:201 ManaBase:201 ABaseHP:1146
LVL:48 H:1988 E:2310 M:2310 HPer:3.97 EPer:2.63 MPer:10.50 HBase:1194 EBase:210 ManaBase:210 ABaseHP:1189
LVL:49 H:2058 E:2392 M:2392 HPer:4.11 EPer:2.72 MPer:10.88 HBase:1236 EBase:216 ManaBase:216 ABaseHP:1231
LVL:50 H:2130 E:2475 M:2475 HPer:4.25 EPer:2.81 MPer:11.25 HBase:1280 EBase:225 ManaBase:225 ABaseHP:1275
LVL:51 H:2200 E:2557 M:2557 HPer:4.39 EPer:2.90 MPer:11.62 HBase:1322 EBase:233 ManaBase:233 ABaseHP:1317
LVL:52 H:2271 E:2639 M:2639 HPer:4.53 EPer:3.00 MPer:12.00 HBase:1365 EBase:239 ManaBase:239 ABaseHP:1360
LVL:53 H:2341 E:2722 M:2722 HPer:4.67 EPer:3.09 MPer:12.37 HBase:1407 EBase:248 ManaBase:248 ABaseHP:1402
LVL:54 H:2413 E:2804 M:2804 HPer:4.82 EPer:3.19 MPer:12.75 HBase:1449 EBase:254 ManaBase:254 ABaseHP:1444
LVL:55 H:2483 E:2887 M:2887 HPer:4.96 EPer:3.28 MPer:13.12 HBase:1491 EBase:263 ManaBase:263 ABaseHP:1486
LVL:56 H:2554 E:2970 M:2970 HPer:5.10 EPer:3.38 MPer:13.50 HBase:1534 EBase:270 ManaBase:270 ABaseHP:1529
LVL:57 H:2625 E:3052 M:3052 HPer:5.24 EPer:3.47 MPer:13.88 HBase:1577 EBase:276 ManaBase:276 ABaseHP:1572
LVL:58 H:2696 E:3135 M:3135 HPer:5.38 EPer:3.56 MPer:14.25 HBase:1620 EBase:285 ManaBase:285 ABaseHP:1615
LVL:59 H:2767 E:3217 M:3217 HPer:5.53 EPer:3.66 MPer:14.63 HBase:1661 EBase:291 ManaBase:291 ABaseHP:1656
LVL:60 H:2838 E:3300 M:3300 HPer:5.67 EPer:3.75 MPer:15.00 HBase:1704 EBase:300 ManaBase:300 ABaseHP:1699
LVL:61 H:2908 E:3382 M:3382 HPer:5.81 EPer:3.84 MPer:15.37 HBase:1746 EBase:308 ManaBase:308 ABaseHP:1741
LVL:62 H:2980 E:3464 M:3464 HPer:5.95 EPer:3.94 MPer:15.75 HBase:1790 EBase:314 ManaBase:314 ABaseHP:1785
LVL:63 H:3050 E:3547 M:3547 HPer:6.09 EPer:4.03 MPer:16.12 HBase:1832 EBase:323 ManaBase:323 ABaseHP:1827
LVL:64 H:3121 E:3629 M:3629 HPer:6.23 EPer:4.13 MPer:16.50 HBase:1875 EBase:329 ManaBase:329 ABaseHP:1870
LVL:65 H:3192 E:3712 M:3712 HPer:6.38 EPer:4.22 MPer:16.87 HBase:1916 EBase:338 ManaBase:338 ABaseHP:1911
LVL:66 H:3263 E:3795 M:3795 HPer:6.52 EPer:4.31 MPer:17.25 HBase:1959 EBase:345 ManaBase:345 ABaseHP:1954
LVL:67 H:3333 E:3877 M:3877 HPer:6.66 EPer:4.41 MPer:17.63 HBase:2001 EBase:351 ManaBase:351 ABaseHP:1996
LVL:68 H:3404 E:3960 M:3960 HPer:6.80 EPer:4.50 MPer:18.00 HBase:2044 EBase:360 ManaBase:360 ABaseHP:2039
LVL:69 H:3475 E:4042 M:4042 HPer:6.94 EPer:4.59 MPer:18.38 HBase:2087 EBase:366 ManaBase:366 ABaseHP:2082
LVL:70 H:3546 E:4125 M:4125 HPer:7.08 EPer:4.69 MPer:18.75 HBase:2130 EBase:375 ManaBase:375 ABaseHP:2125
LVL:71 H:3616 E:4207 M:4207 HPer:7.22 EPer:4.78 MPer:19.12 HBase:2172 EBase:383 ManaBase:383 ABaseHP:2167
LVL:72 H:3688 E:4289 M:4289 HPer:7.37 EPer:4.88 MPer:19.50 HBase:2214 EBase:389 ManaBase:389 ABaseHP:2209
LVL:73 H:3758 E:4372 M:4372 HPer:7.51 EPer:4.97 MPer:19.87 HBase:2256 EBase:398 ManaBase:398 ABaseHP:2251
LVL:74 H:3830 E:4454 M:4454 HPer:7.65 EPer:5.06 MPer:20.25 HBase:2300 EBase:404 ManaBase:404 ABaseHP:2295
LVL:75 H:3900 E:4537 M:4537 HPer:7.79 EPer:5.15 MPer:20.62 HBase:2342 EBase:413 ManaBase:413 ABaseHP:2337
LVL:76 H:3971 E:4620 M:4620 HPer:7.93 EPer:5.25 MPer:21.00 HBase:2385 EBase:420 ManaBase:420 ABaseHP:2380
LVL:77 H:4041 E:4702 M:4702 HPer:8.07 EPer:5.34 MPer:21.37 HBase:2427 EBase:428 ManaBase:428 ABaseHP:2422
LVL:78 H:4113 E:4784 M:4784 HPer:8.22 EPer:5.44 MPer:21.75 HBase:2469 EBase:434 ManaBase:434 ABaseHP:2464
LVL:79 H:4183 E:4867 M:4867 HPer:8.36 EPer:5.53 MPer:22.13 HBase:2511 EBase:441 ManaBase:441 ABaseHP:2506
LVL:80 H:4255 E:4950 M:4950 HPer:8.50 EPer:5.63 MPer:22.50 HBase:2555 EBase:450 ManaBase:450 ABaseHP:2550
LVL:81 H:4280 E:4968 M:4968 HPer:8.50 EPer:5.63 MPer:22.50 HBase:2580 EBase:468 ManaBase:468 ABaseHP:2575
LVL:82 H:4306 E:4986 M:4986 HPer:8.50 EPer:5.63 MPer:22.50 HBase:2606 EBase:486 ManaBase:486 ABaseHP:2601
LVL:83 H:4332 E:5004 M:5004 HPer:8.50 EPer:5.63 MPer:22.50 HBase:2632 EBase:504 ManaBase:504 ABaseHP:2627
LVL:84 H:4358 E:5023 M:5023 HPer:8.50 EPer:5.63 MPer:22.50 HBase:2658 EBase:523 ManaBase:523 ABaseHP:2653
LVL:85 H:4385 E:5041 M:5041 HPer:8.50 EPer:5.63 MPer:22.50 HBase:2685 EBase:541 ManaBase:541 ABaseHP:2680


Classes: Paladin, Shadow Knight
LVL:1 H:45 E:41 M:41 HPer:0.08 EPer:0.05 MPer:0.19 HBase:29 EBase:3 ManaBase:3 ABaseHP:24
LVL:2 H:85 E:82 M:82 HPer:0.16 EPer:0.09 MPer:0.38 HBase:53 EBase:6 ManaBase:6 ABaseHP:48
LVL:3 H:124 E:123 M:123 HPer:0.24 EPer:0.14 MPer:0.56 HBase:76 EBase:11 ManaBase:11 ABaseHP:71
LVL:4 H:165 E:164 M:164 HPer:0.32 EPer:0.19 MPer:0.75 HBase:101 EBase:14 ManaBase:14 ABaseHP:96
LVL:5 H:205 E:206 M:206 HPer:0.40 EPer:0.23 MPer:0.94 HBase:125 EBase:18 ManaBase:18 ABaseHP:120
LVL:6 H:244 E:247 M:247 HPer:0.48 EPer:0.28 MPer:1.12 HBase:148 EBase:23 ManaBase:23 ABaseHP:143
LVL:7 H:285 E:288 M:288 HPer:0.56 EPer:0.33 MPer:1.31 HBase:173 EBase:26 ManaBase:26 ABaseHP:168
LVL:8 H:325 E:329 M:329 HPer:0.64 EPer:0.38 MPer:1.50 HBase:197 EBase:29 ManaBase:29 ABaseHP:192
LVL:9 H:364 E:371 M:371 HPer:0.72 EPer:0.42 MPer:1.69 HBase:220 EBase:33 ManaBase:33 ABaseHP:215
LVL:10 H:405 E:412 M:412 HPer:0.80 EPer:0.47 MPer:1.87 HBase:245 EBase:38 ManaBase:38 ABaseHP:240
LVL:11 H:445 E:453 M:453 HPer:0.88 EPer:0.51 MPer:2.06 HBase:269 EBase:41 ManaBase:41 ABaseHP:264
LVL:12 H:484 E:495 M:495 HPer:0.96 EPer:0.56 MPer:2.25 HBase:292 EBase:45 ManaBase:45 ABaseHP:287
LVL:13 H:525 E:536 M:536 HPer:1.04 EPer:0.61 MPer:2.44 HBase:317 EBase:48 ManaBase:48 ABaseHP:312
LVL:14 H:565 E:577 M:577 HPer:1.12 EPer:0.65 MPer:2.62 HBase:341 EBase:53 ManaBase:53 ABaseHP:336
LVL:15 H:604 E:618 M:618 HPer:1.20 EPer:0.70 MPer:2.81 HBase:364 EBase:56 ManaBase:56 ABaseHP:359
LVL:16 H:645 E:659 M:659 HPer:1.28 EPer:0.75 MPer:3.00 HBase:389 EBase:59 ManaBase:59 ABaseHP:384
LVL:17 H:685 E:701 M:701 HPer:1.36 EPer:0.80 MPer:3.19 HBase:413 EBase:63 ManaBase:63 ABaseHP:408
LVL:18 H:724 E:742 M:742 HPer:1.44 EPer:0.84 MPer:3.37 HBase:436 EBase:68 ManaBase:68 ABaseHP:431
LVL:19 H:765 E:783 M:783 HPer:1.52 EPer:0.89 MPer:3.56 HBase:461 EBase:71 ManaBase:71 ABaseHP:456
LVL:20 H:805 E:825 M:825 HPer:1.60 EPer:0.94 MPer:3.75 HBase:485 EBase:75 ManaBase:75 ABaseHP:480
LVL:21 H:844 E:866 M:866 HPer:1.68 EPer:0.98 MPer:3.94 HBase:508 EBase:78 ManaBase:78 ABaseHP:503
LVL:22 H:885 E:907 M:907 HPer:1.76 EPer:1.03 MPer:4.13 HBase:533 EBase:81 ManaBase:81 ABaseHP:528
LVL:23 H:925 E:948 M:948 HPer:1.84 EPer:1.08 MPer:4.31 HBase:557 EBase:86 ManaBase:86 ABaseHP:552
LVL:24 H:964 E:990 M:990 HPer:1.92 EPer:1.13 MPer:4.50 HBase:580 EBase:90 ManaBase:90 ABaseHP:575
LVL:25 H:1005 E:1031 M:1031 HPer:2.00 EPer:1.17 MPer:4.69 HBase:605 EBase:93 ManaBase:93 ABaseHP:600
LVL:26 H:1045 E:1072 M:1072 HPer:2.08 EPer:1.22 MPer:4.88 HBase:629 EBase:96 ManaBase:96 ABaseHP:624
LVL:27 H:1085 E:1113 M:1113 HPer:2.16 EPer:1.26 MPer:5.06 HBase:653 EBase:101 ManaBase:101 ABaseHP:648
LVL:28 H:1125 E:1155 M:1155 HPer:2.24 EPer:1.31 MPer:5.25 HBase:677 EBase:105 ManaBase:105 ABaseHP:672
LVL:29 H:1164 E:1196 M:1196 HPer:2.32 EPer:1.36 MPer:5.44 HBase:700 EBase:108 ManaBase:108 ABaseHP:695
LVL:30 H:1204 E:1237 M:1237 HPer:2.40 EPer:1.40 MPer:5.62 HBase:724 EBase:113 ManaBase:113 ABaseHP:719
LVL:31 H:1244 E:1278 M:1278 HPer:2.48 EPer:1.45 MPer:5.81 HBase:748 EBase:116 ManaBase:116 ABaseHP:743
LVL:32 H:1285 E:1319 M:1319 HPer:2.56 EPer:1.50 MPer:6.00 HBase:773 EBase:119 ManaBase:119 ABaseHP:768
LVL:33 H:1325 E:1361 M:1361 HPer:2.64 EPer:1.55 MPer:6.19 HBase:797 EBase:123 ManaBase:123 ABaseHP:792
LVL:34 H:1365 E:1402 M:1402 HPer:2.72 EPer:1.59 MPer:6.38 HBase:821 EBase:126 ManaBase:126 ABaseHP:816
LVL:35 H:1404 E:1443 M:1443 HPer:2.80 EPer:1.64 MPer:6.56 HBase:844 EBase:131 ManaBase:131 ABaseHP:839
LVL:36 H:1444 E:1485 M:1485 HPer:2.88 EPer:1.69 MPer:6.75 HBase:868 EBase:135 ManaBase:135 ABaseHP:863
LVL:37 H:1484 E:1526 M:1526 HPer:2.96 EPer:1.73 MPer:6.94 HBase:892 EBase:138 ManaBase:138 ABaseHP:887
LVL:38 H:1525 E:1567 M:1567 HPer:3.04 EPer:1.78 MPer:7.12 HBase:917 EBase:143 ManaBase:143 ABaseHP:912
LVL:39 H:1565 E:1608 M:1608 HPer:3.12 EPer:1.83 MPer:7.31 HBase:941 EBase:146 ManaBase:146 ABaseHP:936
LVL:40 H:1605 E:1650 M:1650 HPer:3.20 EPer:1.88 MPer:7.50 HBase:965 EBase:150 ManaBase:150 ABaseHP:960
LVL:41 H:1684 E:1732 M:1732 HPer:3.36 EPer:1.97 MPer:7.88 HBase:1012 EBase:156 ManaBase:156 ABaseHP:1007
LVL:42 H:1765 E:1814 M:1814 HPer:3.52 EPer:2.06 MPer:8.25 HBase:1061 EBase:164 ManaBase:164 ABaseHP:1056
LVL:43 H:1845 E:1897 M:1897 HPer:3.68 EPer:2.15 MPer:8.62 HBase:1109 EBase:173 ManaBase:173 ABaseHP:1104
LVL:44 H:1924 E:1980 M:1980 HPer:3.84 EPer:2.25 MPer:9.00 HBase:1156 EBase:180 ManaBase:180 ABaseHP:1151
LVL:45 H:2005 E:2062 M:2062 HPer:4.00 EPer:2.34 MPer:9.37 HBase:1205 EBase:188 ManaBase:188 ABaseHP:1200
LVL:46 H:2085 E:2144 M:2144 HPer:4.16 EPer:2.44 MPer:9.75 HBase:1253 EBase:194 ManaBase:194 ABaseHP:1248
LVL:47 H:2165 E:2227 M:2227 HPer:4.32 EPer:2.53 MPer:10.13 HBase:1301 EBase:201 ManaBase:201 ABaseHP:1296
LVL:48 H:2245 E:2310 M:2310 HPer:4.48 EPer:2.63 MPer:10.50 HBase:1349 EBase:210 ManaBase:210 ABaseHP:1344
LVL:49 H:2324 E:2392 M:2392 HPer:4.64 EPer:2.72 MPer:10.88 HBase:1396 EBase:216 ManaBase:216 ABaseHP:1391
LVL:50 H:2404 E:2475 M:2475 HPer:4.80 EPer:2.81 MPer:11.25 HBase:1444 EBase:225 ManaBase:225 ABaseHP:1439
LVL:51 H:2484 E:2557 M:2557 HPer:4.96 EPer:2.90 MPer:11.62 HBase:1492 EBase:233 ManaBase:233 ABaseHP:1487
LVL:52 H:2565 E:2639 M:2639 HPer:5.12 EPer:3.00 MPer:12.00 HBase:1541 EBase:239 ManaBase:239 ABaseHP:1536
LVL:53 H:2645 E:2722 M:2722 HPer:5.28 EPer:3.09 MPer:12.37 HBase:1589 EBase:248 ManaBase:248 ABaseHP:1584
LVL:54 H:2725 E:2804 M:2804 HPer:5.44 EPer:3.19 MPer:12.75 HBase:1637 EBase:254 ManaBase:254 ABaseHP:1632
LVL:55 H:2804 E:2887 M:2887 HPer:5.60 EPer:3.28 MPer:13.12 HBase:1684 EBase:263 ManaBase:263 ABaseHP:1679
LVL:56 H:2884 E:2970 M:2970 HPer:5.76 EPer:3.38 MPer:13.50 HBase:1732 EBase:270 ManaBase:270 ABaseHP:1727
LVL:57 H:2964 E:3052 M:3052 HPer:5.92 EPer:3.47 MPer:13.88 HBase:1780 EBase:276 ManaBase:276 ABaseHP:1775
LVL:58 H:3045 E:3135 M:3135 HPer:6.08 EPer:3.56 MPer:14.25 HBase:1829 EBase:285 ManaBase:285 ABaseHP:1824
LVL:59 H:3125 E:3217 M:3217 HPer:6.24 EPer:3.66 MPer:14.63 HBase:1877 EBase:291 ManaBase:291 ABaseHP:1872
LVL:60 H:3205 E:3300 M:3300 HPer:6.40 EPer:3.75 MPer:15.00 HBase:1925 EBase:300 ManaBase:300 ABaseHP:1920
LVL:61 H:3284 E:3382 M:3382 HPer:6.56 EPer:3.84 MPer:15.37 HBase:1972 EBase:308 ManaBase:308 ABaseHP:1967
LVL:62 H:3364 E:3464 M:3464 HPer:6.72 EPer:3.94 MPer:15.75 HBase:2020 EBase:314 ManaBase:314 ABaseHP:2015
LVL:63 H:3444 E:3547 M:3547 HPer:6.88 EPer:4.03 MPer:16.12 HBase:2068 EBase:323 ManaBase:323 ABaseHP:2063
LVL:64 H:3525 E:3629 M:3629 HPer:7.04 EPer:4.13 MPer:16.50 HBase:2117 EBase:329 ManaBase:329 ABaseHP:2112
LVL:65 H:3605 E:3712 M:3712 HPer:7.20 EPer:4.22 MPer:16.87 HBase:2165 EBase:338 ManaBase:338 ABaseHP:2160
LVL:66 H:3685 E:3795 M:3795 HPer:7.36 EPer:4.31 MPer:17.25 HBase:2213 EBase:345 ManaBase:345 ABaseHP:2208
LVL:67 H:3764 E:3877 M:3877 HPer:7.52 EPer:4.41 MPer:17.63 HBase:2260 EBase:351 ManaBase:351 ABaseHP:2255
LVL:68 H:3844 E:3960 M:3960 HPer:7.68 EPer:4.50 MPer:18.00 HBase:2308 EBase:360 ManaBase:360 ABaseHP:2303
LVL:69 H:3924 E:4042 M:4042 HPer:7.84 EPer:4.59 MPer:18.38 HBase:2356 EBase:366 ManaBase:366 ABaseHP:2351
LVL:70 H:4005 E:4125 M:4125 HPer:8.00 EPer:4.69 MPer:18.75 HBase:2405 EBase:375 ManaBase:375 ABaseHP:2400
LVL:71 H:4085 E:4207 M:4207 HPer:8.16 EPer:4.78 MPer:19.12 HBase:2453 EBase:383 ManaBase:383 ABaseHP:2448
LVL:72 H:4165 E:4289 M:4289 HPer:8.32 EPer:4.88 MPer:19.50 HBase:2501 EBase:389 ManaBase:389 ABaseHP:2496
LVL:73 H:4245 E:4372 M:4372 HPer:8.48 EPer:4.97 MPer:19.87 HBase:2549 EBase:398 ManaBase:398 ABaseHP:2544
LVL:74 H:4325 E:4454 M:4454 HPer:8.64 EPer:5.06 MPer:20.25 HBase:2597 EBase:404 ManaBase:404 ABaseHP:2592
LVL:75 H:4405 E:4537 M:4537 HPer:8.80 EPer:5.15 MPer:20.62 HBase:2645 EBase:413 ManaBase:413 ABaseHP:2640
LVL:76 H:4485 E:4620 M:4620 HPer:8.96 EPer:5.25 MPer:21.00 HBase:2693 EBase:420 ManaBase:420 ABaseHP:2688
LVL:77 H:4564 E:4702 M:4702 HPer:9.12 EPer:5.34 MPer:21.37 HBase:2740 EBase:428 ManaBase:428 ABaseHP:2735
LVL:78 H:4644 E:4784 M:4784 HPer:9.28 EPer:5.44 MPer:21.75 HBase:2788 EBase:434 ManaBase:434 ABaseHP:2783
LVL:79 H:4724 E:4867 M:4867 HPer:9.44 EPer:5.53 MPer:22.13 HBase:2836 EBase:441 ManaBase:441 ABaseHP:2831
LVL:80 H:4804 E:4950 M:4950 HPer:9.60 EPer:5.63 MPer:22.50 HBase:2884 EBase:450 ManaBase:450 ABaseHP:2879
LVL:81 H:4832 E:4968 M:4968 HPer:9.60 EPer:5.63 MPer:22.50 HBase:2912 EBase:468 ManaBase:468 ABaseHP:2907
LVL:82 H:4861 E:4986 M:4986 HPer:9.60 EPer:5.63 MPer:22.50 HBase:2941 EBase:486 ManaBase:486 ABaseHP:2936
LVL:83 H:4891 E:5004 M:5004 HPer:9.60 EPer:5.63 MPer:22.50 HBase:2971 EBase:504 ManaBase:504 ABaseHP:2966
LVL:84 H:4920 E:5023 M:5023 HPer:9.60 EPer:5.63 MPer:22.50 HBase:3000 EBase:523 ManaBase:523 ABaseHP:2995
LVL:85 H:4950 E:5041 M:5041 HPer:9.60 EPer:5.63 MPer:22.50 HBase:3030 EBase:541 ManaBase:541 ABaseHP:3025


Class: Ranger
LVL:1 H:43 E:41 M:41 HPer:0.08 EPer:0.05 MPer:0.19 HBase:27 EBase:3 ManaBase:3 ABaseHP:22
LVL:2 H:81 E:82 M:82 HPer:0.15 EPer:0.09 MPer:0.38 HBase:51 EBase:6 ManaBase:6 ABaseHP:46
LVL:3 H:120 E:123 M:123 HPer:0.23 EPer:0.14 MPer:0.56 HBase:74 EBase:11 ManaBase:11 ABaseHP:69
LVL:4 H:158 E:164 M:164 HPer:0.31 EPer:0.19 MPer:0.75 HBase:96 EBase:14 ManaBase:14 ABaseHP:91
LVL:5 H:196 E:206 M:206 HPer:0.38 EPer:0.23 MPer:0.94 HBase:120 EBase:18 ManaBase:18 ABaseHP:115
LVL:6 H:235 E:247 M:247 HPer:0.46 EPer:0.28 MPer:1.12 HBase:143 EBase:23 ManaBase:23 ABaseHP:138
LVL:7 H:273 E:288 M:288 HPer:0.54 EPer:0.33 MPer:1.31 HBase:165 EBase:26 ManaBase:26 ABaseHP:160
LVL:8 H:311 E:329 M:329 HPer:0.61 EPer:0.38 MPer:1.50 HBase:189 EBase:29 ManaBase:29 ABaseHP:184
LVL:9 H:349 E:371 M:371 HPer:0.69 EPer:0.42 MPer:1.69 HBase:211 EBase:33 ManaBase:33 ABaseHP:206
LVL:10 H:388 E:412 M:412 HPer:0.77 EPer:0.47 MPer:1.87 HBase:234 EBase:38 ManaBase:38 ABaseHP:229
LVL:11 H:426 E:453 M:453 HPer:0.84 EPer:0.51 MPer:2.06 HBase:258 EBase:41 ManaBase:41 ABaseHP:253
LVL:12 H:465 E:495 M:495 HPer:0.92 EPer:0.56 MPer:2.25 HBase:281 EBase:45 ManaBase:45 ABaseHP:276
LVL:13 H:503 E:536 M:536 HPer:1.00 EPer:0.61 MPer:2.44 HBase:303 EBase:48 ManaBase:48 ABaseHP:298
LVL:14 H:541 E:577 M:577 HPer:1.07 EPer:0.65 MPer:2.62 HBase:327 EBase:53 ManaBase:53 ABaseHP:322
LVL:15 H:579 E:618 M:618 HPer:1.15 EPer:0.70 MPer:2.81 HBase:349 EBase:56 ManaBase:56 ABaseHP:344
LVL:16 H:618 E:659 M:659 HPer:1.23 EPer:0.75 MPer:3.00 HBase:372 EBase:59 ManaBase:59 ABaseHP:367
LVL:17 H:656 E:701 M:701 HPer:1.30 EPer:0.80 MPer:3.19 HBase:396 EBase:63 ManaBase:63 ABaseHP:391
LVL:18 H:694 E:742 M:742 HPer:1.38 EPer:0.84 MPer:3.37 HBase:418 EBase:68 ManaBase:68 ABaseHP:413
LVL:19 H:733 E:783 M:783 HPer:1.46 EPer:0.89 MPer:3.56 HBase:441 EBase:71 ManaBase:71 ABaseHP:436
LVL:20 H:771 E:825 M:825 HPer:1.53 EPer:0.94 MPer:3.75 HBase:465 EBase:75 ManaBase:75 ABaseHP:460
LVL:21 H:810 E:866 M:866 HPer:1.61 EPer:0.98 MPer:3.94 HBase:488 EBase:78 ManaBase:78 ABaseHP:483
LVL:22 H:848 E:907 M:907 HPer:1.69 EPer:1.03 MPer:4.13 HBase:510 EBase:81 ManaBase:81 ABaseHP:505
LVL:23 H:886 E:948 M:948 HPer:1.76 EPer:1.08 MPer:4.31 HBase:534 EBase:86 ManaBase:86 ABaseHP:529
LVL:24 H:925 E:990 M:990 HPer:1.84 EPer:1.13 MPer:4.50 HBase:557 EBase:90 ManaBase:90 ABaseHP:552
LVL:25 H:963 E:1031 M:1031 HPer:1.92 EPer:1.17 MPer:4.69 HBase:579 EBase:93 ManaBase:93 ABaseHP:574
LVL:26 H:1001 E:1072 M:1072 HPer:1.99 EPer:1.22 MPer:4.88 HBase:603 EBase:96 ManaBase:96 ABaseHP:598
LVL:27 H:1039 E:1113 M:1113 HPer:2.07 EPer:1.26 MPer:5.06 HBase:625 EBase:101 ManaBase:101 ABaseHP:620
LVL:28 H:1078 E:1155 M:1155 HPer:2.15 EPer:1.31 MPer:5.25 HBase:648 EBase:105 ManaBase:105 ABaseHP:643
LVL:29 H:1116 E:1196 M:1196 HPer:2.22 EPer:1.36 MPer:5.44 HBase:672 EBase:108 ManaBase:108 ABaseHP:667
LVL:30 H:1154 E:1237 M:1237 HPer:2.30 EPer:1.40 MPer:5.62 HBase:694 EBase:113 ManaBase:113 ABaseHP:689
LVL:31 H:1193 E:1278 M:1278 HPer:2.38 EPer:1.45 MPer:5.81 HBase:717 EBase:116 ManaBase:116 ABaseHP:712
LVL:32 H:1231 E:1319 M:1319 HPer:2.45 EPer:1.50 MPer:6.00 HBase:741 EBase:119 ManaBase:119 ABaseHP:736
LVL:33 H:1269 E:1361 M:1361 HPer:2.53 EPer:1.55 MPer:6.19 HBase:763 EBase:123 ManaBase:123 ABaseHP:758
LVL:34 H:1308 E:1402 M:1402 HPer:2.61 EPer:1.59 MPer:6.38 HBase:786 EBase:126 ManaBase:126 ABaseHP:781
LVL:35 H:1346 E:1443 M:1443 HPer:2.68 EPer:1.64 MPer:6.56 HBase:810 EBase:131 ManaBase:131 ABaseHP:805
LVL:36 H:1384 E:1485 M:1485 HPer:2.76 EPer:1.69 MPer:6.75 HBase:832 EBase:135 ManaBase:135 ABaseHP:827
LVL:37 H:1423 E:1526 M:1526 HPer:2.84 EPer:1.73 MPer:6.94 HBase:855 EBase:138 ManaBase:138 ABaseHP:850
LVL:38 H:1461 E:1567 M:1567 HPer:2.91 EPer:1.78 MPer:7.12 HBase:879 EBase:143 ManaBase:143 ABaseHP:874
LVL:39 H:1500 E:1608 M:1608 HPer:2.99 EPer:1.83 MPer:7.31 HBase:902 EBase:146 ManaBase:146 ABaseHP:897
LVL:40 H:1538 E:1650 M:1650 HPer:3.07 EPer:1.88 MPer:7.50 HBase:924 EBase:150 ManaBase:150 ABaseHP:919
LVL:41 H:1615 E:1732 M:1732 HPer:3.22 EPer:1.97 MPer:7.88 HBase:971 EBase:156 ManaBase:156 ABaseHP:966
LVL:42 H:1691 E:1814 M:1814 HPer:3.37 EPer:2.06 MPer:8.25 HBase:1017 EBase:164 ManaBase:164 ABaseHP:1012
LVL:43 H:1768 E:1897 M:1897 HPer:3.53 EPer:2.15 MPer:8.62 HBase:1062 EBase:173 ManaBase:173 ABaseHP:1057
LVL:44 H:1845 E:1980 M:1980 HPer:3.68 EPer:2.25 MPer:9.00 HBase:1109 EBase:180 ManaBase:180 ABaseHP:1104
LVL:45 H:1921 E:2062 M:2062 HPer:3.83 EPer:2.34 MPer:9.37 HBase:1155 EBase:188 ManaBase:188 ABaseHP:1150
LVL:46 H:1998 E:2144 M:2144 HPer:3.99 EPer:2.44 MPer:9.75 HBase:1200 EBase:194 ManaBase:194 ABaseHP:1195
LVL:47 H:2074 E:2227 M:2227 HPer:4.14 EPer:2.53 MPer:10.13 HBase:1246 EBase:201 ManaBase:201 ABaseHP:1241
LVL:48 H:2151 E:2310 M:2310 HPer:4.29 EPer:2.63 MPer:10.50 HBase:1293 EBase:210 ManaBase:210 ABaseHP:1288
LVL:49 H:2228 E:2392 M:2392 HPer:4.45 EPer:2.72 MPer:10.88 HBase:1338 EBase:216 ManaBase:216 ABaseHP:1333
LVL:50 H:2304 E:2475 M:2475 HPer:4.60 EPer:2.81 MPer:11.25 HBase:1384 EBase:225 ManaBase:225 ABaseHP:1379
LVL:51 H:2381 E:2557 M:2557 HPer:4.75 EPer:2.90 MPer:11.62 HBase:1431 EBase:233 ManaBase:233 ABaseHP:1426
LVL:52 H:2458 E:2639 M:2639 HPer:4.91 EPer:3.00 MPer:12.00 HBase:1476 EBase:239 ManaBase:239 ABaseHP:1471
LVL:53 H:2534 E:2722 M:2722 HPer:5.06 EPer:3.09 MPer:12.37 HBase:1522 EBase:248 ManaBase:248 ABaseHP:1517
LVL:54 H:2611 E:2804 M:2804 HPer:5.21 EPer:3.19 MPer:12.75 HBase:1569 EBase:254 ManaBase:254 ABaseHP:1564
LVL:55 H:2688 E:2887 M:2887 HPer:5.37 EPer:3.28 MPer:13.12 HBase:1614 EBase:263 ManaBase:263 ABaseHP:1609
LVL:56 H:2764 E:2970 M:2970 HPer:5.52 EPer:3.38 MPer:13.50 HBase:1660 EBase:270 ManaBase:270 ABaseHP:1655
LVL:57 H:2841 E:3052 M:3052 HPer:5.67 EPer:3.47 MPer:13.88 HBase:1707 EBase:276 ManaBase:276 ABaseHP:1702
LVL:58 H:2918 E:3135 M:3135 HPer:5.83 EPer:3.56 MPer:14.25 HBase:1752 EBase:285 ManaBase:285 ABaseHP:1747
LVL:59 H:2995 E:3217 M:3217 HPer:5.98 EPer:3.66 MPer:14.63 HBase:1799 EBase:291 ManaBase:291 ABaseHP:1794
LVL:60 H:3071 E:3300 M:3300 HPer:6.13 EPer:3.75 MPer:15.00 HBase:1845 EBase:300 ManaBase:300 ABaseHP:1840
LVL:61 H:3148 E:3382 M:3382 HPer:6.29 EPer:3.84 MPer:15.37 HBase:1890 EBase:308 ManaBase:308 ABaseHP:1885
LVL:62 H:3225 E:3464 M:3464 HPer:6.44 EPer:3.94 MPer:15.75 HBase:1937 EBase:314 ManaBase:314 ABaseHP:1932
LVL:63 H:3301 E:3547 M:3547 HPer:6.59 EPer:4.03 MPer:16.12 HBase:1983 EBase:323 ManaBase:323 ABaseHP:1978
LVL:64 H:3378 E:3629 M:3629 HPer:6.75 EPer:4.13 MPer:16.50 HBase:2028 EBase:329 ManaBase:329 ABaseHP:2023
LVL:65 H:3455 E:3712 M:3712 HPer:6.90 EPer:4.22 MPer:16.87 HBase:2075 EBase:338 ManaBase:338 ABaseHP:2070
LVL:66 H:3531 E:3795 M:3795 HPer:7.05 EPer:4.31 MPer:17.25 HBase:2121 EBase:345 ManaBase:345 ABaseHP:2116
LVL:67 H:3608 E:3877 M:3877 HPer:7.21 EPer:4.41 MPer:17.63 HBase:2166 EBase:351 ManaBase:351 ABaseHP:2161
LVL:68 H:3685 E:3960 M:3960 HPer:7.36 EPer:4.50 MPer:18.00 HBase:2213 EBase:360 ManaBase:360 ABaseHP:2208
LVL:69 H:3761 E:4042 M:4042 HPer:7.51 EPer:4.59 MPer:18.38 HBase:2259 EBase:366 ManaBase:366 ABaseHP:2254
LVL:70 H:3838 E:4125 M:4125 HPer:7.67 EPer:4.69 MPer:18.75 HBase:2304 EBase:375 ManaBase:375 ABaseHP:2299
LVL:71 H:3915 E:4207 M:4207 HPer:7.82 EPer:4.78 MPer:19.12 HBase:2351 EBase:383 ManaBase:383 ABaseHP:2346
LVL:72 H:3991 E:4289 M:4289 HPer:7.97 EPer:4.88 MPer:19.50 HBase:2397 EBase:389 ManaBase:389 ABaseHP:2392
LVL:73 H:4068 E:4372 M:4372 HPer:8.13 EPer:4.97 MPer:19.87 HBase:2442 EBase:398 ManaBase:398 ABaseHP:2437
LVL:74 H:4144 E:4454 M:4454 HPer:8.28 EPer:5.06 MPer:20.25 HBase:2488 EBase:404 ManaBase:404 ABaseHP:2483
LVL:75 H:4221 E:4537 M:4537 HPer:8.43 EPer:5.15 MPer:20.62 HBase:2535 EBase:413 ManaBase:413 ABaseHP:2530
LVL:76 H:4298 E:4620 M:4620 HPer:8.59 EPer:5.25 MPer:21.00 HBase:2580 EBase:420 ManaBase:420 ABaseHP:2575
LVL:77 H:4375 E:4702 M:4702 HPer:8.74 EPer:5.34 MPer:21.37 HBase:2627 EBase:428 ManaBase:428 ABaseHP:2622
LVL:78 H:4451 E:4784 M:4784 HPer:8.89 EPer:5.44 MPer:21.75 HBase:2673 EBase:434 ManaBase:434 ABaseHP:2668
LVL:79 H:4528 E:4867 M:4867 HPer:9.05 EPer:5.53 MPer:22.13 HBase:2718 EBase:441 ManaBase:441 ABaseHP:2713
LVL:80 H:4604 E:4950 M:4950 HPer:9.20 EPer:5.63 MPer:22.50 HBase:2764 EBase:450 ManaBase:450 ABaseHP:2759
LVL:81 H:4631 E:4968 M:4968 HPer:9.20 EPer:5.63 MPer:22.50 HBase:2791 EBase:468 ManaBase:468 ABaseHP:2786
LVL:82 H:4659 E:4986 M:4986 HPer:9.20 EPer:5.63 MPer:22.50 HBase:2819 EBase:486 ManaBase:486 ABaseHP:2814
LVL:83 H:4687 E:5004 M:5004 HPer:9.20 EPer:5.63 MPer:22.50 HBase:2847 EBase:504 ManaBase:504 ABaseHP:2842
LVL:84 H:4716 E:5023 M:5023 HPer:9.20 EPer:5.63 MPer:22.50 HBase:2876 EBase:523 ManaBase:523 ABaseHP:2871
LVL:85 H:4744 E:5041 M:5041 HPer:9.20 EPer:5.63 MPer:22.50 HBase:2904 EBase:541 ManaBase:541 ABaseHP:2899


Class: Warrior
LVL:1 H:46 E:41 M:0 HPer:0.08 EPer:0.05 MPer:0.00 HBase:30 EBase:3 ManaBase:0 ABaseHP:25
LVL:2 H:88 E:82 M:0 HPer:0.17 EPer:0.09 MPer:0.00 HBase:54 EBase:6 ManaBase:0 ABaseHP:49
LVL:3 H:130 E:123 M:0 HPer:0.25 EPer:0.14 MPer:0.00 HBase:80 EBase:11 ManaBase:0 ABaseHP:75
LVL:4 H:171 E:164 M:0 HPer:0.33 EPer:0.19 MPer:0.00 HBase:105 EBase:14 ManaBase:0 ABaseHP:100
LVL:5 H:213 E:206 M:0 HPer:0.42 EPer:0.23 MPer:0.00 HBase:129 EBase:18 ManaBase:0 ABaseHP:124
LVL:6 H:255 E:247 M:0 HPer:0.50 EPer:0.28 MPer:0.00 HBase:155 EBase:23 ManaBase:0 ABaseHP:150
LVL:7 H:296 E:288 M:0 HPer:0.58 EPer:0.33 MPer:0.00 HBase:180 EBase:26 ManaBase:0 ABaseHP:175
LVL:8 H:338 E:329 M:0 HPer:0.67 EPer:0.38 MPer:0.00 HBase:204 EBase:29 ManaBase:0 ABaseHP:199
LVL:9 H:380 E:371 M:0 HPer:0.75 EPer:0.42 MPer:0.00 HBase:230 EBase:33 ManaBase:0 ABaseHP:225
LVL:10 H:421 E:412 M:0 HPer:0.83 EPer:0.47 MPer:0.00 HBase:255 EBase:38 ManaBase:0 ABaseHP:250
LVL:11 H:463 E:453 M:0 HPer:0.92 EPer:0.51 MPer:0.00 HBase:279 EBase:41 ManaBase:0 ABaseHP:274
LVL:12 H:505 E:495 M:0 HPer:1.00 EPer:0.56 MPer:0.00 HBase:305 EBase:45 ManaBase:0 ABaseHP:300
LVL:13 H:546 E:536 M:0 HPer:1.08 EPer:0.61 MPer:0.00 HBase:330 EBase:48 ManaBase:0 ABaseHP:325
LVL:14 H:588 E:577 M:0 HPer:1.17 EPer:0.65 MPer:0.00 HBase:354 EBase:53 ManaBase:0 ABaseHP:349
LVL:15 H:630 E:618 M:0 HPer:1.25 EPer:0.70 MPer:0.00 HBase:380 EBase:56 ManaBase:0 ABaseHP:375
LVL:16 H:671 E:659 M:0 HPer:1.33 EPer:0.75 MPer:0.00 HBase:405 EBase:59 ManaBase:0 ABaseHP:400
LVL:17 H:713 E:701 M:0 HPer:1.42 EPer:0.80 MPer:0.00 HBase:429 EBase:63 ManaBase:0 ABaseHP:424
LVL:18 H:755 E:742 M:0 HPer:1.50 EPer:0.84 MPer:0.00 HBase:455 EBase:68 ManaBase:0 ABaseHP:450
LVL:19 H:796 E:783 M:0 HPer:1.58 EPer:0.89 MPer:0.00 HBase:480 EBase:71 ManaBase:0 ABaseHP:475
LVL:20 H:838 E:825 M:0 HPer:1.67 EPer:0.94 MPer:0.00 HBase:504 EBase:75 ManaBase:0 ABaseHP:499
LVL:21 H:880 E:866 M:0 HPer:1.75 EPer:0.98 MPer:0.00 HBase:530 EBase:78 ManaBase:0 ABaseHP:525
LVL:22 H:921 E:907 M:0 HPer:1.83 EPer:1.03 MPer:0.00 HBase:555 EBase:81 ManaBase:0 ABaseHP:550
LVL:23 H:963 E:948 M:0 HPer:1.92 EPer:1.08 MPer:0.00 HBase:579 EBase:86 ManaBase:0 ABaseHP:574
LVL:24 H:1005 E:990 M:0 HPer:2.00 EPer:1.13 MPer:0.00 HBase:605 EBase:90 ManaBase:0 ABaseHP:600
LVL:25 H:1046 E:1031 M:0 HPer:2.08 EPer:1.17 MPer:0.00 HBase:630 EBase:93 ManaBase:0 ABaseHP:625
LVL:26 H:1088 E:1072 M:0 HPer:2.17 EPer:1.22 MPer:0.00 HBase:654 EBase:96 ManaBase:0 ABaseHP:649
LVL:27 H:1130 E:1113 M:0 HPer:2.25 EPer:1.26 MPer:0.00 HBase:680 EBase:101 ManaBase:0 ABaseHP:675
LVL:28 H:1171 E:1155 M:0 HPer:2.33 EPer:1.31 MPer:0.00 HBase:705 EBase:105 ManaBase:0 ABaseHP:700
LVL:29 H:1213 E:1196 M:0 HPer:2.42 EPer:1.36 MPer:0.00 HBase:729 EBase:108 ManaBase:0 ABaseHP:724
LVL:30 H:1255 E:1237 M:0 HPer:2.50 EPer:1.40 MPer:0.00 HBase:755 EBase:113 ManaBase:0 ABaseHP:750
LVL:31 H:1296 E:1278 M:0 HPer:2.58 EPer:1.45 MPer:0.00 HBase:780 EBase:116 ManaBase:0 ABaseHP:775
LVL:32 H:1338 E:1319 M:0 HPer:2.67 EPer:1.50 MPer:0.00 HBase:804 EBase:119 ManaBase:0 ABaseHP:799
LVL:33 H:1380 E:1361 M:0 HPer:2.75 EPer:1.55 MPer:0.00 HBase:830 EBase:123 ManaBase:0 ABaseHP:825
LVL:34 H:1421 E:1402 M:0 HPer:2.83 EPer:1.59 MPer:0.00 HBase:855 EBase:126 ManaBase:0 ABaseHP:850
LVL:35 H:1463 E:1443 M:0 HPer:2.92 EPer:1.64 MPer:0.00 HBase:879 EBase:131 ManaBase:0 ABaseHP:874
LVL:36 H:1505 E:1485 M:0 HPer:3.00 EPer:1.69 MPer:0.00 HBase:905 EBase:135 ManaBase:0 ABaseHP:900
LVL:37 H:1546 E:1526 M:0 HPer:3.08 EPer:1.73 MPer:0.00 HBase:930 EBase:138 ManaBase:0 ABaseHP:925
LVL:38 H:1588 E:1567 M:0 HPer:3.17 EPer:1.78 MPer:0.00 HBase:954 EBase:143 ManaBase:0 ABaseHP:949
LVL:39 H:1630 E:1608 M:0 HPer:3.25 EPer:1.83 MPer:0.00 HBase:980 EBase:146 ManaBase:0 ABaseHP:975
LVL:40 H:1671 E:1650 M:0 HPer:3.33 EPer:1.88 MPer:0.00 HBase:1005 EBase:150 ManaBase:0 ABaseHP:1000
LVL:41 H:1755 E:1732 M:0 HPer:3.50 EPer:1.97 MPer:0.00 HBase:1055 EBase:156 ManaBase:0 ABaseHP:1050
LVL:42 H:1838 E:1814 M:0 HPer:3.67 EPer:2.06 MPer:0.00 HBase:1104 EBase:164 ManaBase:0 ABaseHP:1099
LVL:43 H:1921 E:1897 M:0 HPer:3.83 EPer:2.15 MPer:0.00 HBase:1155 EBase:173 ManaBase:0 ABaseHP:1150
LVL:44 H:2005 E:1980 M:0 HPer:4.00 EPer:2.25 MPer:0.00 HBase:1205 EBase:180 ManaBase:0 ABaseHP:1200
LVL:45 H:2088 E:2062 M:0 HPer:4.17 EPer:2.34 MPer:0.00 HBase:1254 EBase:188 ManaBase:0 ABaseHP:1249
LVL:46 H:2171 E:2144 M:0 HPer:4.33 EPer:2.44 MPer:0.00 HBase:1305 EBase:194 ManaBase:0 ABaseHP:1300
LVL:47 H:2255 E:2227 M:0 HPer:4.50 EPer:2.53 MPer:0.00 HBase:1355 EBase:201 ManaBase:0 ABaseHP:1350
LVL:48 H:2338 E:2310 M:0 HPer:4.67 EPer:2.63 MPer:0.00 HBase:1404 EBase:210 ManaBase:0 ABaseHP:1399
LVL:49 H:2421 E:2392 M:0 HPer:4.83 EPer:2.72 MPer:0.00 HBase:1455 EBase:216 ManaBase:0 ABaseHP:1450
LVL:50 H:2505 E:2475 M:0 HPer:5.00 EPer:2.81 MPer:0.00 HBase:1505 EBase:225 ManaBase:0 ABaseHP:1500
LVL:51 H:2588 E:2557 M:0 HPer:5.17 EPer:2.90 MPer:0.00 HBase:1554 EBase:233 ManaBase:0 ABaseHP:1549
LVL:52 H:2671 E:2639 M:0 HPer:5.33 EPer:3.00 MPer:0.00 HBase:1605 EBase:239 ManaBase:0 ABaseHP:1600
LVL:53 H:2755 E:2722 M:0 HPer:5.50 EPer:3.09 MPer:0.00 HBase:1655 EBase:248 ManaBase:0 ABaseHP:1650
LVL:54 H:2838 E:2804 M:0 HPer:5.67 EPer:3.19 MPer:0.00 HBase:1704 EBase:254 ManaBase:0 ABaseHP:1699
LVL:55 H:2921 E:2887 M:0 HPer:5.83 EPer:3.28 MPer:0.00 HBase:1755 EBase:263 ManaBase:0 ABaseHP:1750
LVL:56 H:3005 E:2970 M:0 HPer:6.00 EPer:3.38 MPer:0.00 HBase:1805 EBase:270 ManaBase:0 ABaseHP:1800
LVL:57 H:3088 E:3052 M:0 HPer:6.17 EPer:3.47 MPer:0.00 HBase:1854 EBase:276 ManaBase:0 ABaseHP:1849
LVL:58 H:3171 E:3135 M:0 HPer:6.33 EPer:3.56 MPer:0.00 HBase:1905 EBase:285 ManaBase:0 ABaseHP:1900
LVL:59 H:3255 E:3217 M:0 HPer:6.50 EPer:3.66 MPer:0.00 HBase:1955 EBase:291 ManaBase:0 ABaseHP:1950
LVL:60 H:3338 E:3300 M:0 HPer:6.67 EPer:3.75 MPer:0.00 HBase:2004 EBase:300 ManaBase:0 ABaseHP:1999
LVL:61 H:3421 E:3382 M:0 HPer:6.83 EPer:3.84 MPer:0.00 HBase:2055 EBase:308 ManaBase:0 ABaseHP:2050
LVL:62 H:3505 E:3464 M:0 HPer:7.00 EPer:3.94 MPer:0.00 HBase:2105 EBase:314 ManaBase:0 ABaseHP:2100
LVL:63 H:3588 E:3547 M:0 HPer:7.17 EPer:4.03 MPer:0.00 HBase:2154 EBase:323 ManaBase:0 ABaseHP:2149
LVL:64 H:3671 E:3629 M:0 HPer:7.33 EPer:4.13 MPer:0.00 HBase:2205 EBase:329 ManaBase:0 ABaseHP:2200
LVL:65 H:3755 E:3712 M:0 HPer:7.50 EPer:4.22 MPer:0.00 HBase:2255 EBase:338 ManaBase:0 ABaseHP:2250
LVL:66 H:3838 E:3795 M:0 HPer:7.67 EPer:4.31 MPer:0.00 HBase:2304 EBase:345 ManaBase:0 ABaseHP:2299
LVL:67 H:3921 E:3877 M:0 HPer:7.83 EPer:4.41 MPer:0.00 HBase:2355 EBase:351 ManaBase:0 ABaseHP:2350
LVL:68 H:4005 E:3960 M:0 HPer:8.00 EPer:4.50 MPer:0.00 HBase:2405 EBase:360 ManaBase:0 ABaseHP:2400
LVL:69 H:4088 E:4042 M:0 HPer:8.17 EPer:4.59 MPer:0.00 HBase:2454 EBase:366 ManaBase:0 ABaseHP:2449
LVL:70 H:4171 E:4125 M:0 HPer:8.33 EPer:4.69 MPer:0.00 HBase:2505 EBase:375 ManaBase:0 ABaseHP:2500
LVL:71 H:4255 E:4207 M:0 HPer:8.50 EPer:4.78 MPer:0.00 HBase:2555 EBase:383 ManaBase:0 ABaseHP:2550
LVL:72 H:4338 E:4289 M:0 HPer:8.67 EPer:4.88 MPer:0.00 HBase:2604 EBase:389 ManaBase:0 ABaseHP:2599
LVL:73 H:4421 E:4372 M:0 HPer:8.83 EPer:4.97 MPer:0.00 HBase:2655 EBase:398 ManaBase:0 ABaseHP:2650
LVL:74 H:4505 E:4454 M:0 HPer:9.00 EPer:5.06 MPer:0.00 HBase:2705 EBase:404 ManaBase:0 ABaseHP:2700
LVL:75 H:4588 E:4537 M:0 HPer:9.17 EPer:5.15 MPer:0.00 HBase:2754 EBase:413 ManaBase:0 ABaseHP:2749
LVL:76 H:4671 E:4620 M:0 HPer:9.33 EPer:5.25 MPer:0.00 HBase:2805 EBase:420 ManaBase:0 ABaseHP:2800
LVL:77 H:4755 E:4702 M:0 HPer:9.50 EPer:5.34 MPer:0.00 HBase:2855 EBase:428 ManaBase:0 ABaseHP:2850
LVL:78 H:4838 E:4784 M:0 HPer:9.67 EPer:5.44 MPer:0.00 HBase:2904 EBase:434 ManaBase:0 ABaseHP:2899
LVL:79 H:4921 E:4867 M:0 HPer:9.83 EPer:5.53 MPer:0.00 HBase:2955 EBase:441 ManaBase:0 ABaseHP:2950
LVL:80 H:5005 E:4950 M:0 HPer:10.00 EPer:5.63 MPer:0.00 HBase:3005 EBase:450 ManaBase:0 ABaseHP:3000
LVL:81 H:5035 E:4968 M:0 HPer:10.00 EPer:5.63 MPer:0.00 HBase:3035 EBase:468 ManaBase:0 ABaseHP:3030
LVL:82 H:5065 E:4986 M:0 HPer:10.00 EPer:5.63 MPer:0.00 HBase:3065 EBase:486 ManaBase:0 ABaseHP:3060
LVL:83 H:5095 E:5004 M:0 HPer:10.00 EPer:5.63 MPer:0.00 HBase:3095 EBase:504 ManaBase:0 ABaseHP:3090
LVL:84 H:5126 E:5023 M:0 HPer:10.00 EPer:5.63 MPer:0.00 HBase:3126 EBase:523 ManaBase:0 ABaseHP:3121
LVL:85 H:5158 E:5041 M:0 HPer:10.00 EPer:5.63 MPer:0.00 HBase:3158 EBase:541 ManaBase:0 ABaseHP:3153

Again, a HUGE thanks for Maudigan for helping me in this. Also Gaeorn helped me get everything situated so I could make it fully functional, so thanks to him as well :D

If anyone has ideas on the formulas to recreate these accurately, please reply with them here if you want. I am hoping that once we have them all locked down, we can add stuff to the source so the SoD clients will show their current HP/Mana/Endurance accurately. We may even add a rule to let server admins decide if they want to bump all clients up to these new formulas, or to trick the SoD clients to use the old formulas. Either way, we need the new formulas to fix the HP/Mana/Endurance displays in SoD. This is one step closer to finalizing the client :D

bad_captain
04-14-2010, 11:30 AM
Trevius, a couple questions.. Did the observed HP, END, and MANA listed as H, E, and M include the item with 100 stats? If so, was it just STR, STA, etc., or did it also add 100HP, Mana? Or was it just used to calculate the per stat gains?

I have the Warrior done, but want to make sure I'm doing it right. I just need to make the formulas look a little better.

bad_captain
04-14-2010, 12:39 PM
Also, do you have random data points to test these formulas with? I've figured out Mana and End (well, every third level is 1 off, but I'm sure that can be eliminated if you want to since it seems to be a rounding error), and am working on HPs.

bad_captain
04-14-2010, 04:55 PM
Okay, I think I have them all ready to test values with. IE a 67 mage with 140 STA, 250 INT, +900 HP, +1100 Mana = 2700 HP and 4000 Mana and see if I get the same values. I still need to clean up the formulas a bit, but want to make sure they work for real data before finishing and posting, anyway.

I don't have SoD set up yet to test these values out myself or I would do that.

trevius
04-14-2010, 05:12 PM
Yeah, the item did not add to HP/Mana/End directly it only had STR/STA/DEX/AGI/WIS/INT and no other stat. None of the fields in the data actually show the totals with the stat item equipped. The H E M fields are what stats were seen as a fully naked character with 100 to STR/STA/DEX/AGI/WIS/INT.

And yes, the numbers are rounded for base, so don't let that throw you. As long as it still matches up every other level, you should be on the right track :)

KLS
04-14-2010, 08:22 PM
You should test with a character with more stats. The formula on the lower clients has diminishing returns on some stats that you'd want to find they still exist.

trevius
04-14-2010, 11:27 PM
Ok, that may very well be the case. I will see if I can test with 0 stats first lol. I don't know if the client will allow that, but would be cool for making sure we have base stats 100% accurate. I will can probably just use the same script I have for testing higher stats and instead of just equipping 1 item, I can equip 2 or 3 of them, and then have the script compare the gain rates between 1 2 or 3 of the stat items and see if they are any different. If so, then it is probably diminishing returns.

You are probably right as when I was testing before I had this script, I noticed some odd inconsistencies.

bad_captain
04-15-2010, 05:48 PM
Here are the base End/Mana formulas that I came up with.

Base Endurance / Mana

if (level < 40) { BaseEnd = floor(15 * level / 4); }
else if (level < 80) { BaseEnd = floor(15 * level / 4 + (15 * (level-40) / 4) ); }
else { BaseEnd = floor(15 * level / 4 + (15 * (level-40) / 4) + 11 * (level - 80) ); }



I feel pretty confident the formulas for END/Mana, so I'll post those as soon as I can have 1 or 2 datapoints to plug into my formulas. The HP formulas just need some datapoints and to clean up a little more.

Base HPs


Warrior

if (level < 40) { BaseHP = level * 25; }
else if (level < 80) { BaseHP = ((40 * 25) + ((level - 40) * 50)); }
else { BaseHP = ((40 * 25) + (40 * 50) + ((level - 80) * 30)); }



Ranger

if (level < 40) { BaseHP = level * 23; }
else if (level < 80) { BaseHP = ((40 * 23) + ((level - 40) * 46)); }
else { BaseHP = floor((40 * 23) + (40 * 46) + (55 * (level - 80) / 2)); }


Paladin, Shadow Knight

if (level < 40) { BaseHP = level * 24; }
else if (level < 80) { BaseHP = ((40 * 24) + ((level - 40) * 48)); }
else { BaseHP = ((40 * 24) + (40 * 48) + ((level - 80) * 29)); }


Beastlord, Berserker, Monk, Rogue, Shaman

if (level < 40) { BaseHP = floor((level * 21) + (3 * level) / 13); }
else if (level < 80) { BaseHP = floor((40 * 21) + ((level - 40) * 42) + (level / 4) + (level - 40) / 5 ); }
else { BaseHP = ((40 * 21) + (40 * 42) + ((level - 80) * 26) + 30); }

or
if (level < 40) { BaseHP = ((level * 21) + (3 * level) / 13); }
else if (level < 80) { BaseHP = floor((40 * 21.25) + ((level - 40) * 42.5)); }
else { BaseHP = floor((40 * 37.75) + ( level - 40) * 26); }



Bard, Cleric

if (level < 40) { BaseHP = level * 22; }
else if (level < 80) { BaseHP = ((40 * 22) + ((level - 40) * 44)); }
else { BaseHP = floor((40 * 22) + (40 * 44) + ( 53 * (level - 80) / 2)); }


Wizard, Magician, Necromancer, Enchanter, Druid

if (level < 40) { BaseHP = level * 20; }
else if (level < 80) { BaseHP = ((40 * 20) + ((level - 40) * 40)); }
else { BaseHP = ((40 * 20) + (40 * 40) + ((level - 80) * 24)); }

trevius
04-16-2010, 05:57 AM
Looks like base Mana and Endurance was actually much more simple than I had thought lol. KLS suggested checking diminishing returns, so I did some testing on them for HP/Mana/Endurance. Here is what I came up with:

1. HPs increase at the same rate per STA point until you reach 255 STA. After 255, they increase at the same rate / 2 (so 50% as much increase as before).

2. Mana and Endurance increase at a separate rate up to 100 in their related stats. From 100 to 200, they increase at the rate as shown from my previous test results. Then, for 200+, they increase at that same rate / 2 (so 50% as much increase as 100 to 200 did).

3. Base Mana and Endurance increase rate per level is a flat increase with 3 tiers just like Base HPs are. Since all classes use the same base Mana/Endurance per level, here is the formula for Base Mana/Endurance for all classes:

if (level < 40) { BaseManaEnd = level * 15; }
else if (level < 80) { BaseManaEnd = ((40 * 15) + ((level - 40) * 30)); }
else { BaseManaEnd = ((40 * 15) + (40 * 30) + ((level - 80) * 18)); }

And here is the result Maudigan's script that I altered to find the actual base of Mana/Endurance:

Class: Wizard
LVL:1 E:22 M:22 EPer:0.07 MPer:0.07 EBase:15 ManaBase:15
LVL:2 E:44 M:44 EPer:0.14 MPer:0.14 EBase:30 ManaBase:30
LVL:3 E:67 M:67 EPer:0.22 MPer:0.22 EBase:45 ManaBase:45
LVL:4 E:89 M:89 EPer:0.29 MPer:0.29 EBase:60 ManaBase:60
LVL:5 E:112 M:112 EPer:0.37 MPer:0.37 EBase:75 ManaBase:75
LVL:6 E:135 M:135 EPer:0.45 MPer:0.45 EBase:90 ManaBase:90
LVL:7 E:157 M:157 EPer:0.53 MPer:0.53 EBase:104 ManaBase:104 105
LVL:8 E:179 M:179 EPer:0.60 MPer:0.60 EBase:119 ManaBase:119 120
LVL:9 E:202 M:202 EPer:0.68 MPer:0.68 EBase:134 ManaBase:134 135
LVL:10 E:225 M:225 EPer:0.76 MPer:0.76 EBase:149 ManaBase:149 150
LVL:11 E:247 M:247 EPer:0.83 MPer:0.83 EBase:164 ManaBase:164 165
LVL:12 E:270 M:270 EPer:0.91 MPer:0.91 EBase:179 ManaBase:179 180
LVL:13 E:292 M:292 EPer:0.98 MPer:0.98 EBase:194 ManaBase:194 195
LVL:14 E:315 M:315 EPer:1.05 MPer:1.05 EBase:210 ManaBase:210
LVL:15 E:337 M:337 EPer:1.12 MPer:1.12 EBase:225 ManaBase:225
LVL:16 E:359 M:359 EPer:1.19 MPer:1.19 EBase:240 ManaBase:240
LVL:17 E:382 M:382 EPer:1.27 MPer:1.27 EBase:255 ManaBase:255
LVL:18 E:405 M:405 EPer:1.35 MPer:1.35 EBase:270 ManaBase:270
LVL:19 E:427 M:427 EPer:1.42 MPer:1.42 EBase:285 ManaBase:285
LVL:20 E:450 M:450 EPer:1.51 MPer:1.51 EBase:299 ManaBase:299 300
LVL:21 E:472 M:472 EPer:1.58 MPer:1.58 EBase:314 ManaBase:314 315
LVL:22 E:494 M:494 EPer:1.65 MPer:1.65 EBase:329 ManaBase:329 330
LVL:23 E:517 M:517 EPer:1.73 MPer:1.73 EBase:344 ManaBase:344 345
LVL:24 E:540 M:540 EPer:1.81 MPer:1.81 EBase:359 ManaBase:359 360
LVL:25 E:562 M:562 EPer:1.88 MPer:1.88 EBase:374 ManaBase:374 375
LVL:26 E:584 M:584 EPer:1.95 MPer:1.95 EBase:389 ManaBase:389 390
LVL:27 E:607 M:607 EPer:2.02 MPer:2.02 EBase:405 ManaBase:405
LVL:28 E:630 M:630 EPer:2.10 MPer:2.10 EBase:420 ManaBase:420
LVL:29 E:652 M:652 EPer:2.17 MPer:2.17 EBase:435 ManaBase:435
LVL:30 E:675 M:675 EPer:2.25 MPer:2.25 EBase:450 ManaBase:450
LVL:31 E:697 M:697 EPer:2.32 MPer:2.32 EBase:465 ManaBase:465
LVL:32 E:719 M:719 EPer:2.39 MPer:2.39 EBase:480 ManaBase:480
LVL:33 E:742 M:742 EPer:2.47 MPer:2.47 EBase:495 ManaBase:495
LVL:34 E:764 M:764 EPer:2.55 MPer:2.55 EBase:509 ManaBase:509 510
LVL:35 E:787 M:787 EPer:2.63 MPer:2.63 EBase:524 ManaBase:524 525
LVL:36 E:810 M:810 EPer:2.71 MPer:2.71 EBase:539 ManaBase:539 540
LVL:37 E:832 M:832 EPer:2.78 MPer:2.78 EBase:554 ManaBase:554 555
LVL:38 E:855 M:855 EPer:2.86 MPer:2.86 EBase:569 ManaBase:569 570
LVL:39 E:877 M:877 EPer:2.93 MPer:2.93 EBase:584 ManaBase:584 585
LVL:40 E:900 M:900 EPer:3.00 MPer:3.00 EBase:600 ManaBase:600 - Changes
LVL:41 E:944 M:944 EPer:3.14 MPer:3.14 EBase:630 ManaBase:630
LVL:42 E:989 M:989 EPer:3.29 MPer:3.29 EBase:660 ManaBase:660
LVL:43 E:1035 M:1035 EPer:3.45 MPer:3.45 EBase:690 ManaBase:690
LVL:44 E:1080 M:1080 EPer:3.61 MPer:3.61 EBase:719 ManaBase:719 720
LVL:45 E:1125 M:1125 EPer:3.76 MPer:3.76 EBase:749 ManaBase:749 750
LVL:46 E:1169 M:1169 EPer:3.90 MPer:3.90 EBase:779 ManaBase:779 780
LVL:47 E:1214 M:1214 EPer:4.04 MPer:4.04 EBase:810 ManaBase:810
LVL:48 E:1260 M:1260 EPer:4.20 MPer:4.20 EBase:840 ManaBase:840
LVL:49 E:1304 M:1304 EPer:4.34 MPer:4.34 EBase:870 ManaBase:870
LVL:50 E:1350 M:1350 EPer:4.51 MPer:4.51 EBase:899 ManaBase:899 900
LVL:51 E:1395 M:1395 EPer:4.66 MPer:4.66 EBase:929 ManaBase:929 930
LVL:52 E:1439 M:1439 EPer:4.80 MPer:4.80 EBase:959 ManaBase:959 960
LVL:53 E:1485 M:1485 EPer:4.96 MPer:4.96 EBase:989 ManaBase:989 990
LVL:54 E:1529 M:1529 EPer:5.09 MPer:5.09 EBase:1020 ManaBase:1020
LVL:55 E:1575 M:1575 EPer:5.25 MPer:5.25 EBase:1050 ManaBase:1050
LVL:56 E:1620 M:1620 EPer:5.40 MPer:5.40 EBase:1080 ManaBase:1080
LVL:57 E:1664 M:1664 EPer:5.55 MPer:5.55 EBase:1109 ManaBase:1109 1110
LVL:58 E:1710 M:1710 EPer:5.71 MPer:5.71 EBase:1139 ManaBase:1139 1140
LVL:59 E:1754 M:1754 EPer:5.85 MPer:5.85 EBase:1169 ManaBase:1169 1170
LVL:60 E:1800 M:1800 EPer:6.00 MPer:6.00 EBase:1200 ManaBase:1200
LVL:61 E:1845 M:1845 EPer:6.15 MPer:6.15 EBase:1230 ManaBase:1230
LVL:62 E:1889 M:1889 EPer:6.29 MPer:6.29 EBase:1260 ManaBase:1260
LVL:63 E:1935 M:1935 EPer:6.45 MPer:6.45 EBase:1290 ManaBase:1290
LVL:64 E:1979 M:1979 EPer:6.60 MPer:6.60 EBase:1319 ManaBase:1319 1320
LVL:65 E:2025 M:2025 EPer:6.76 MPer:6.76 EBase:1349 ManaBase:1349 1350
LVL:66 E:2070 M:2070 EPer:6.91 MPer:6.91 EBase:1379 ManaBase:1379 1380
LVL:67 E:2114 M:2114 EPer:7.04 MPer:7.04 EBase:1410 ManaBase:1410
LVL:68 E:2160 M:2160 EPer:7.20 MPer:7.20 EBase:1440 ManaBase:1440
LVL:69 E:2204 M:2204 EPer:7.34 MPer:7.34 EBase:1470 ManaBase:1470
LVL:70 E:2250 M:2250 EPer:7.51 MPer:7.51 EBase:1499 ManaBase:1499 1500
LVL:71 E:2295 M:2295 EPer:7.66 MPer:7.66 EBase:1529 ManaBase:1529 1530
LVL:72 E:2339 M:2339 EPer:7.80 MPer:7.80 EBase:1559 ManaBase:1559 1560
LVL:73 E:2385 M:2385 EPer:7.96 MPer:7.96 EBase:1589 ManaBase:1589 1590
LVL:74 E:2429 M:2429 EPer:8.09 MPer:8.09 EBase:1620 ManaBase:1620
LVL:75 E:2475 M:2475 EPer:8.25 MPer:8.25 EBase:1650 ManaBase:1650
LVL:76 E:2520 M:2520 EPer:8.40 MPer:8.40 EBase:1680 ManaBase:1680
LVL:77 E:2565 M:2565 EPer:8.56 MPer:8.56 EBase:1709 ManaBase:1709 1710
LVL:78 E:2609 M:2609 EPer:8.70 MPer:8.70 EBase:1739 ManaBase:1739 1740
LVL:79 E:2654 M:2654 EPer:8.85 MPer:8.85 EBase:1769 ManaBase:1769 1770
LVL:80 E:2700 M:2700 EPer:9.00 MPer:9.00 EBase:1800 ManaBase:1800
LVL:81 E:2718 M:2718 EPer:9.00 MPer:9.00 EBase:1818 ManaBase:1818
LVL:82 E:2736 M:2736 EPer:9.00 MPer:9.00 EBase:1836 ManaBase:1836
LVL:83 E:2754 M:2754 EPer:9.00 MPer:9.00 EBase:1854 ManaBase:1854
LVL:84 E:2773 M:2773 EPer:9.00 MPer:9.00 EBase:1873 ManaBase:1873
LVL:85 E:2791 M:2791 EPer:9.00 MPer:9.00 EBase:1891 ManaBase:1891

For the levels shown that have an extra unnamed field at the end, that is just where I corrected the base value to be the in line with what it should actually be. I am sure the rounding of the float is what caused it to be slightly off for some.

Also, for these tests, I added a hack to set all new characters to start with 0 to all stats. The client actually forces them all to a minimum of 1 to each stat. So, to get the actual base, I just took the difference from what was originally seen as the base (with 1 stat added to it), and then what was seen after adding an item with 100 to all stats (which showed total as 100, not 101!), and then divided that by 99. I then multiplied that value by 100 to get the total amount that should have been added from the item and subtracted that amount from the current Mana/Endurance as shown with the item equipped. This should leave us with the actual base values, and it looks like it all matches up and makes sense to me :)

So, now that I think we have the base values for HP/Mana/Endurance for all classes, it is just a matter of figuring out the formula for the increase from each stat per level.

As mentioned before, it looks like Mana and Endurance use an unrelated formula for the first 100 in their related stats, so that is one formula to figure out. The next is just the formula from 100 to 200 as shown in my previous testing results. From there, we can figure out the diminishing returns, as they seem to just be the same formula divided by 2.

Then, the 3rd and final formula left is the one for HP gained per stat point per level.

cavedude
04-16-2010, 09:50 AM
Wizard, Magician, Necromancer, Enchanter, Druid


Wouldn't Druid be lumped with Bard and Cleric? On Live My Druid always had more base health than my Necro. Then again, I guess it's possible Sony has gimped Druids over time. Haha

KLS
04-16-2010, 03:18 PM
To be fair cleric, shaman and druid were previously lumped together.

cavedude
04-16-2010, 03:28 PM
To be fair cleric, shaman and druid were previously lumped together.

Aye, that's right on.

trevius
04-16-2010, 04:30 PM
Yeah, it would have made more sense to group them that way, but I have given up on questioning how SOE makes their decisions lol. I was surprised to see that druid got lumped in with the pure casters, but I checked it multiple times to make sure that was correct. At least it is only a fairly small difference.

trevius
04-17-2010, 12:04 AM
I adjusted the previous Mana/Endurance output to be what I think it is supposed to be and then added a column to the right that shows the increase for the MPer colum beween each level over the previous level.

LVL:1 M:22 MPer:0.07 ManaBase:15 .07
LVL:2 M:44 MPer:0.14 ManaBase:30 .07
LVL:3 M:67 MPer:0.22 ManaBase:45 .08
LVL:4 M:89 MPer:0.29 ManaBase:60 .07
LVL:5 M:112 MPer:0.37 ManaBase:75 .08
LVL:6 M:135 MPer:0.45 ManaBase:90 .08
LVL:7 M:157 MPer:0.52 ManaBase:105 .07
LVL:8 M:179 MPer:0.59 ManaBase:120 .07
LVL:9 M:202 MPer:0.67 ManaBase:135 .08
LVL:10 M:225 MPer:0.75 ManaBase:150 .08
LVL:11 M:247 MPer:0.82 ManaBase:165 .07
LVL:12 M:270 MPer:0.90 ManaBase:180 .08
LVL:13 M:292 MPer:0.97 ManaBase:195 .07
LVL:14 M:315 MPer:1.05 ManaBase:210 .08
LVL:15 M:337 MPer:1.12 ManaBase:225 .07
LVL:16 M:359 MPer:1.19 ManaBase:240 .07
LVL:17 M:382 MPer:1.27 ManaBase:255 .08
LVL:18 M:405 MPer:1.35 ManaBase:270 .08
LVL:19 M:427 MPer:1.42 ManaBase:285 .07
LVL:20 M:450 MPer:1.50 ManaBase:300 .08
LVL:21 M:472 MPer:1.57 ManaBase:315 .07
LVL:22 M:494 MPer:1.64 ManaBase:330 .07
LVL:23 M:517 MPer:1.72 ManaBase:345 .08
LVL:24 M:540 MPer:1.80 ManaBase:360 .08
LVL:25 M:562 MPer:1.87 ManaBase:375 .07
LVL:26 M:584 MPer:1.94 ManaBase:390 .07
LVL:27 M:607 MPer:2.02 ManaBase:405 .08
LVL:28 M:630 MPer:2.10 ManaBase:420 .08
LVL:29 M:652 MPer:2.17 ManaBase:435 .07
LVL:30 M:675 MPer:2.25 ManaBase:450 .08
LVL:31 M:697 MPer:2.32 ManaBase:465 .07
LVL:32 M:719 MPer:2.39 ManaBase:480 .07
LVL:33 M:742 MPer:2.47 ManaBase:495 .08
LVL:34 M:764 MPer:2.54 ManaBase:510 .07
LVL:35 M:787 MPer:2.62 ManaBase:525 .08
LVL:36 M:810 MPer:2.70 ManaBase:540 .08
LVL:37 M:832 MPer:2.77 ManaBase:555 .07
LVL:38 M:855 MPer:2.85 ManaBase:570 .08
LVL:39 M:877 MPer:2.92 ManaBase:585 .07
LVL:40 M:900 MPer:3.00 ManaBase:600 .08
LVL:41 M:944 MPer:3.14 ManaBase:630 .14 - Changes
LVL:42 M:989 MPer:3.29 ManaBase:660 .15
LVL:43 M:1035 MPer:3.45 ManaBase:690 .16
LVL:44 M:1080 MPer:3.60 ManaBase:720 .15
LVL:45 M:1125 MPer:3.75 ManaBase:750 .15
LVL:46 M:1169 MPer:3.89 ManaBase:780 .14
LVL:47 M:1214 MPer:4.04 ManaBase:810 .15
LVL:48 M:1260 MPer:4.20 ManaBase:840 .16
LVL:49 M:1304 MPer:4.34 ManaBase:870 .14
LVL:50 M:1350 MPer:4.50 ManaBase:900 .16
LVL:51 M:1395 MPer:4.65 ManaBase:930 .15
LVL:52 M:1439 MPer:4.79 ManaBase:960 .14
LVL:53 M:1485 MPer:4.95 ManaBase:990 .16
LVL:54 M:1529 MPer:5.09 ManaBase:1020 .14
LVL:55 M:1575 MPer:5.25 ManaBase:1050 .16
LVL:56 M:1620 MPer:5.40 ManaBase:1080 .15
LVL:57 M:1664 MPer:5.54 ManaBase:1110 .14
LVL:58 M:1710 MPer:5.70 ManaBase:1140 .16
LVL:59 M:1754 MPer:5.84 ManaBase:1170 .14
LVL:60 M:1800 MPer:6.00 ManaBase:1200 .16
LVL:61 M:1845 MPer:6.15 ManaBase:1230 .15
LVL:62 M:1889 MPer:6.29 ManaBase:1260 .14
LVL:63 M:1935 MPer:6.45 ManaBase:1290 .16
LVL:64 M:1979 MPer:6.59 ManaBase:1320 .14
LVL:65 M:2025 MPer:6.75 ManaBase:1350 .16
LVL:66 M:2070 MPer:6.90 ManaBase:1380 .15
LVL:67 M:2114 MPer:7.04 ManaBase:1410 .14
LVL:68 M:2160 MPer:7.20 ManaBase:1440 .16
LVL:69 M:2204 MPer:7.34 ManaBase:1470 .14
LVL:70 M:2250 MPer:7.50 ManaBase:1500 .16
LVL:71 M:2295 MPer:7.65 ManaBase:1530 .15
LVL:72 M:2339 MPer:7.79 ManaBase:1560 .14
LVL:73 M:2385 MPer:7.95 ManaBase:1590 .16
LVL:74 M:2429 MPer:8.09 ManaBase:1620 .14
LVL:75 M:2475 MPer:8.25 ManaBase:1650 .16
LVL:76 M:2520 MPer:8.40 ManaBase:1680 .15
LVL:77 M:2565 MPer:8.55 ManaBase:1710 .15
LVL:78 M:2609 MPer:8.69 ManaBase:1740 .14
LVL:79 M:2654 MPer:8.84 ManaBase:1770 .15
LVL:80 M:2700 MPer:9.00 ManaBase:1800 .16
LVL:81 M:2718 MPer:9.00 ManaBase:1818 0 - Changes
LVL:82 M:2736 MPer:9.00 ManaBase:1836 0
LVL:83 M:2754 MPer:9.00 ManaBase:1854 0
LVL:84 M:2773 MPer:9.00 ManaBase:1872 0
LVL:85 M:2791 MPer:9.00 ManaBase:1890 0

I think from this, it means that Mana Per Int/Wis is just a flat increase of 7.5 until level 40 and then it increases to 15 for levels 40 to 80, and then down to a 0 increase from 80 to 85. I will have to do some more testing, but if this is true, we should be able to set the complete Mana and Endurance formulas for all classes on SoD. That will just leave the HP increase per stat formula to figure out to have these all done.

I think we are nearly there :)

trevius
04-17-2010, 06:48 AM
Ok, this isn't exactly a pretty function yet, but it should use the math properly at least, which is the important part for now:

int32 Client::ManaFromIntWis(int8 level, int16 totalintorwis) {
float mana_per = 0.0;
int totalmana = 0;

// Do calculations for Mana Per INT/WIS for the first 100 INT/WIS points
if (level < 40) {
mana_per = level * 0.075;
}
else if (level < 80) {
mana_per = (3 + ((level - 40) * 0.15)); // ((40 * 0.075) + ((level - 40) * 0.15))
}
else {
mana_per = 9; // ((40 * 0.075) + (40 * 0.15))
}

// Calculate how much mana is added from the first 100 INT/WIS points
if (totalintorwis > 100) {
totalmana += mana_per * 100;
totalintorwis -= 100;
}
else {
totalmana += mana_per * totalintorwis;
totalintorwis = 0;
}

// If there was over 100 INT/WIS, do the rest of the Mana Calculations
if (totalintorwis) {
// Do calculations for Mana Per INT/WIS for INT/WIS over 100 points
if (level < 40) {
mana_per = level * 0.1875;
}
else if (level < 80) {
mana_per = ((40 * 0.1875) + ((level - 40) * 0.375));
}
else {
mana_per = 22.5; // ((40 * 0.1875) + (40 * 0.375))
}

// Calculate how much mana is added for points over 100 INT/WIS
if (totalintorwis > 100) {
totalmana += mana_per * 100;
totalintorwis -= 100;
totalmana += ((mana_per * totalintorwis) / 2);
}
else {
totalmana += mana_per * totalintorwis;
}
}

return totalmana;
}

That will all be rewritten once I look at how the current HP/Mana/Endurance code is all written currently in the source. But, that should be the formula for nearly exact mana per INT or WIS point. It may add 1 extra mana point for some levels, but that is the most it should ever be off.

That formula should also be able to be used to calculate Endurance with just a few adjustments to account for Endurance gaining stats from all 4 STR/STA/AGI/DEX stats.

So, this should just leave the HP per STA formulas to figure out for the 6 types between all classes. I suspect that will be a flat rate gain just like the Mana/Endurance ones are, so it should be fairly simple to figure it out.

trevius
04-17-2010, 08:30 AM
Ok, this should be the final formula we needed, which is for calculating HP per Stamina point.

float Client::HPPerStamina(int8 level, int8 class) {

float hpunder40;
float hpover40;
float hpover80;

// Note: hpunder40 is equal to hpover80 / 120, and hpover40 is just hpunder40 * 2

switch(class){
case DRUID:
case ENCHANTER:
case NECROMANCER:
case MAGICIAN:
case WIZARD:
hpunder40 = 0.06666666;
hpover40 = 0.13333333;
hpover80 = 8;
break;
case BEASTLORD:
case BERSERKER:
case MONK:
case ROGUE:
case SHAMAN:
hpunder40 = 0.07083333;
hpover40 = 0.14166666;
hpover80 = 8.5;
break;
case BARD:
case CLERIC:
hpunder40 = 0.07333333;
hpover40 = 0.14666666;
hpover80 = 8.8;
break;
case SHADOWKNIGHT:
case PALADIN:
hpunder40 = 0.08;
hpover40 = 0.16;
hpover80 = 9.6;
break;
case RANGER:
hpunder40 = 0.07666666;
hpover40 = 0.15333333;
hpover80 = 9.2;
break;
case WARRIOR:
hpunder40 = 0.08333333;
hpover40 = 0.16666666;
hpover80 = 10;
break;
default:
hpunder40 = 0.06666666;
hpover40 = 0.13333333;
hpover80 = 8;
break;
}

float hp_per_sta = 0.0;

// Do calculations for HP Per Stamina point
if (level < 40) {
hp_per_sta = level * hpunder40;
}
else if (level < 80) {
hp_per_sta = ((40 * hpunder40) + ((level - 40) * hpover40));
}
else {
hp_per_sta = hpover80; // ((40 * hpunder40) + (40 * hpover40))
}

return hp_per_sta;
}

Now, I just need to look through the source and figure out where to add these in and how best to format them and junk, so they work like the current ones for Titanium.

Dinggo
04-17-2010, 05:09 PM
Trev can you talk to Rogean about SOD support on the Login Server again now that he has his personal server up and running again?

It would be nice to be able to bring our new server up online and everyone else who has been waiting on this simple change also.

trevius
04-18-2010, 04:13 AM
I don't think me talking to him about it would be of much use right now. I am sure he has plenty on his plate atm. But, the good news is that we should have some alternatives to announce in the very near future for the time being until the EQEmu LS is ready for SoD. I will make sure to keep you guys informed when I have more solid info :)

Dinggo
04-18-2010, 09:17 AM
This is what I was affraid of though. All the servers are now considering alternate login servers since Rogean is dragging his feet on this. The reason this project is really stable is that it was always centralized arond one login, a place where Devlopers and Users alike congregated. This showed the project was alive and growing at all times.

Once everyone moves to its own login servers, there will really be a big void opened up. Imo it would do alot more harm then good to not keep things centralized arond one common denominator.

I just dont understand why this isnt done yet, it took the other servers a few moments to adjust their own logins to accept SOD. Rogean is risking alot more servers moving to offsite logins which would in the end be bad for the overall project.

ChaosSlayerZ
04-18-2010, 03:10 PM
Trev, I am curious, so what happens now with the formula- will all players playing on different clients use the same new formula, or dos each player will run on hp/mana based on what his client is?
thats gonna be a mess =)

another question... or more of a wish, would that be possible at SOME POINT to put these values into DB instead?
So each server admin could adjust how much each class gains from sta/int/wis without the need to go into the source?
Wouldn't that be awesome? =)
I mean you just replace the the formula in the source code with X, Y and Z, and add a tiny table to the DB with what like 50 rows for all the values per class? =)
Please consider this =)

gaeorn
04-18-2010, 04:56 PM
This is what I was affraid of though. All the servers are now considering alternate login servers since Rogean is dragging his feet on this. The reason this project is really stable is that it was always centralized arond one login, a place where Devlopers and Users alike congregated. This showed the project was alive and growing at all times.

Once everyone moves to its own login servers, there will really be a big void opened up. Imo it would do alot more harm then good to not keep things centralized arond one common denominator.

I just dont understand why this isnt done yet, it took the other servers a few moments to adjust their own logins to accept SOD. Rogean is risking alot more servers moving to offsite logins which would in the end be bad for the overall project.
This is why the new multi-login code I wrote requires one to login to a trusted game server via the main eqemulator.org login server to update the login info on alternate login servers. I did not want to cause division in the project, but I did want those who use SoD to have a way to log into their preferred game servers.

trevius
04-18-2010, 05:59 PM
Yeah, I think the private/secondary Login Servers are actually a great addition to EQEmu and something that has been needed for a very long time. I am definitely against dividing this project, as it does not need to be spread thinner than it is. But, I think the multiplle LS stuff will only strengthen EQEmu. Having to use other Login Servers to access servers from the SoD client is only temporary I am sure. At least until the official EQEmu LS is updated for it. And once it is, the extra Login Servers will make nice backups for when the official one is down, which is awesome. We are no longer 100% reliant on a single point of failure, which is good. Not that the official LS fails very often (because it is very stable), but just that it is good to have a backup when one is needed!

This thread isn't really meant for this particular discussion though.

In news related to this thread, I have added the HP formulas for SoD to the SVN :) They aren't 100% perfect yet, but they are much closer than before and probably only need minor tweaking to be perfect. I still have to add the Mana and Endurance formulas, but plan to try to get those added tonight.

Zandig
04-19-2010, 04:52 PM
In news related to this thread, I have added the HP formulas for SoD to the SVN :) They aren't 100% perfect yet, but they are much closer than before and probably only need minor tweaking to be perfect. I still have to add the Mana and Endurance formulas, but plan to try to get those added tonight.

Very nice Trev!
I had a look at rev 1395 with the SOD client and my Iksar monk's hitpoints now reach 100% (instead of hovering between 80 and 81). Looking forward to the endurance and mana.

Work on SOD is coming along excellent.
New PEQ database released!
Today is a good day :D

trevius
04-20-2010, 07:33 PM
I have the Mana and Endurance formulas on my test server and they are almost finished. I think they just need a bit more tweaking to get them to align properly all of the time. They should most likely be on the SVN by tomorrow :)

AngelKnight
04-21-2010, 03:43 AM
Using SoD on PEQ server, hit points are now showing properly (go up to 100%). Mana/End still doing same as they did, which, of course, is to be expected. :) VERY well done everyone involved on the formulas!

Trev, in relation to the 9th spell slot issue I ran into at level 58, I have yet to have this problem re-appear. I have ding'd 62 recently, died a BUNCH of times in between (6 times today alone, lol), and not once did the extra slot show up again. So, I am going to have to conclude that it was a fluke and is un-reproducable, so feel free to take it off of your list of things to look at. :)

I shall keep my eye on the spell casting bar jic it happens again, but I have a feeling it's not going to, LOL.

Thanks to everyone for the great (and quick!!) work getting SoD client working.

trevius
04-21-2010, 05:24 PM
Ok, the HP/Mana/Endurance formulas are now all as good as I can get them and they are all on the SVN. The HP formula is accurate and at most it will only be off by 1 for certain levels/stats combos. It is always 1 over, so HPs should always show 100% on the client. The Mana and Endurance formulas were more complicated for certain Level/Stats combinations. I was able to get them accurate up to level 60 for any stat value, and up to level 80 for stats under 200. But, if you are 60+ and have over 200+ stats, some combos will have 7 to 15ish more mana on the server-side than what the client shows. I am sure it is just missing some minor detail or needing to round something that it isn't, but I tried and tried and couldn't get them 100% accurate for every combo. At least they are very close and by the time it starts being off at all, the number of mana/endurance added won't even be barely noticeable. When the Mana/End formulas are off, it is always higher on the server-side, so players will always still be able to have 100% showing on their UI, which was my main goal.

Maybe at some point, I will try to look into the Mana/End formulas again and get them fixed, but it probably wouldn't happen any time soon. Since they are on the SVN now, if anyone wants to test them out and play with the formulas to see if they can figure it out, please do! I will be happy to answer any questions I can if someone else wants to give a shot at making them closer to 100% accurate. Though, for now, I think they are definitely good enough, even if they never got messed with again.

I also set the default size of NPCs to 6, so if they are set to 0 in the DB, they will now be set to 6. This is because SOE added in default sizes for many races, when in the past, their default size was 6. So, without this fix, you would see some NPCs that are not the size you may have seen them as in previous clients.

Now, to figure out what I am going to work on next. I am probably going to look into a few more of the bug reports and see if I can get those resolved. There isn't really a ton of work left to do to complete SoD, and that rocks :D

robinreg
04-21-2010, 05:33 PM
lol, I just compiled the source this morning and log on my ogre sk and I noticed he's smaller than previously which is fine with me. He ducked alot when trying to move around and about and small tight quarters. but when I got my bots out my gnome enchanter bot is about as big as my orge sk which looks funny. all the bots and my character is about the same height.

trevius
04-21-2010, 05:35 PM
LMAO, I didn't think about that. I will have to set it so it doesn't do that for player races. Will do that later if someone else doesn't beat me to it. Thanks for reporting that.

Lylyth
04-24-2010, 10:10 PM
If you DL SoD from Steam do you have to run it through steam? Husband/wife team want to play but only one account on steam, so don't want to have to make another account and buy it again.

Vampire1212
04-24-2010, 10:54 PM
Everquest SoD is in no way tied to Steam, simply move the Everquest folder from C:\Program Files\Steam\steamapps\common\everquest to something like C:\everquest

Steam only downloads and installs for you. The rest is as if you installed EQ off the disc.

Rykeau
05-11-2010, 05:14 PM
I'm sorry if this is posted elsewhere or covered in multiple posts - I simply can't find it.

Is there a consolidated guide to getting SoD working from Titanium or SoF?

Here is my situation:

I have a working EQEMU server using newly compiled source and SoF clients. I utilize EQEmuLoginServer for my login server. All clients can login and play without issue at this time.

My challenge has been getting my SoD client to log into my server. I've copied the SoD client to my current EQ directory, validated the eqhost.txt file and triple checked the EQ launch shortcut for the "patchme" switch. I have even tried updating the opcodes.conf with SoD info on the server with no success.

When using the SoD client with my current server configuration, the client stalls in a "Logging in to the server. Please wait..." state almost indefinately. I'm guessing I am missing something in my complilation or in my config but I simply can't narrow it down. Any help anybody can provide would be appreciated.

trevius
05-11-2010, 05:32 PM
Your eqhost.txt needs to be set to port 5999 for SoD, not 5998 like Titanium/SoF are. Assuming you have everything else setup correctly, that should work fine. Being unable to log in like you mentioned is exactly the symptom caused by not having the port set to 5999 in your eqhost.txt file.

There isn't currently a full wiki on getting SoD setup, but other than changing the port to 5999, and only being able to use the non-official Login Servers that support SoD, the setup is almost exactly the same as previous clients. I have been waiting until the official EQEmu Login Server supports SoD before I go through and update the play guide wiki's to include SoD instructions in them.

pfyon
05-11-2010, 07:14 PM
Btw, why have the SoD stream on a different port? Titanium and SoF already share one, requiring the login server to check what client is connecting, why not put SoD on the same port and just have it check between 3 clients instead of the original 2?

trevius
05-11-2010, 07:24 PM
Because it handles login stuff a bit differently and uses some different opcodes. Unfortunately, at the time that you submit the login, all clients appear to be the same, so the server has no way to know to reply to SoD in a special way as is needed. So, we just have it use a different port, so the Login Server knows right away how to treat it.

pfyon
05-11-2010, 07:27 PM
Ah, okay then.

Rykeau
05-13-2010, 05:53 PM
Your eqhost.txt needs to be set to port 5999 for SoD, not 5998 like Titanium/SoF are. Assuming you have everything else setup correctly, that should work fine. Being unable to log in like you mentioned is exactly the symptom caused by not having the port set to 5999 in your eqhost.txt file.

There isn't currently a full wiki on getting SoD setup, but other than changing the port to 5999, and only being able to use the non-official Login Servers that support SoD, the setup is almost exactly the same as previous clients. I have been waiting until the official EQEmu Login Server supports SoD before I go through and update the play guide wiki's to include SoD instructions in them.

Thank you! Changing the login port info in all appropriate files did the trick.

WkimWes
05-14-2010, 03:30 PM
Hey all great work on the progress of SoD liking that we can use it now. :) I was curious though, is the new Mercenary system working or is that something that is going to be worked on later or not at all? I was curious to see if the healing mercs and tanks worked better than the current bots.

KLS
05-14-2010, 04:37 PM
Later we plan to replace the bot system completely and make it part of core server functionality. With those we'll implement mercs. It is a rather large process and so it's only a todo atm.

trevius
05-14-2010, 04:56 PM
No, none of the mercenary stuff works yet. There is probably quite a bit of packet handling, structures, and opcodes that are needed in order to make the system functional at all. And even then, we would still have to create AI stuff for them similar to the bots system, if we decide not to use bots for them.

I don't know what the plans are for mercs currently. We need to get some collects that include the info we need first of all. Once we have that, someone will have to take the time to actually figure it all out and get the systems coded. I am sure it is a decent chunk of work. They definitely aren't a high priority atm, but maybe they will be added at some point.

EDIT: KLS beat me to it!

Kuldiin
05-18-2010, 01:13 PM
My SoD worked fine first time, but when I went to change resolution my system locked up.

When I tried to reload SoD I get the below error

http://img99.imageshack.us/img99/7092/crashp.jpg

Is there a config file or something I can delete so it goes back to its original resolution? My screen flickers like crazy when I first run SoD before it crashes(before login) so guessing its the reso causing these issues.

KLS
05-18-2010, 01:30 PM
eqclient.ini

Kuldiin
05-18-2010, 01:40 PM
eqclient.ini

Worked thanks :) Now back to normal

WkimWes
05-18-2010, 02:51 PM
Later we plan to replace the bot system completely and make it part of core server functionality. With those we'll implement mercs. It is a rather large process and so it's only a todo atm.

Sweet, thanks for the response KLS and Trevius. I look forward to seeing that happen.

wolfwalkereci
07-06-2010, 11:11 PM
Noticed something in regards to items with Health regen or Mana regen.
With seeds client while in combat you get reduced regen until you are out of combat. With titanium client you have full regen in or out of combat.

Basically with titanium client and a item with +100 health regen I could fight something that hits for 70s and stay full health for most of the fight.

With seeds client that +100 health regen in combat is reduced. Not sure much it is effected but I did notice a big difference between the two clients while testing.

Derision
07-08-2010, 03:46 PM
I noticed that Steam has updated my copy of SoD today (the copy in my C:\Program Files (x86)\Steam\steamapps\common\everquest directory, obviously not the copy I had made elsewhere).

It appears to have updated the client to:

[Thu Jul 08 20:38:13 2010]00000:Starting EverQuest (Built Jun 8 2010 16:44:32)


which is the current Live client, and is presumably what anyone purchasing SoD from Steam from this point forward will get. Has anyone else noticed the same thing ?

robinreg
07-08-2010, 05:00 PM
I haven't noticed anything of it, of course I don't log on steam at all since I purchased the copy earlier this year on my computer. I'm currently downloading the copy of it on my laptop so I'm waiting for it to be complete. Where do you find the updated information?

Derision
07-08-2010, 05:12 PM
I haven't noticed anything of it, of course I don't log on steam at all since I purchased the copy earlier this year on my computer. I'm currently downloading the copy of it on my laptop so I'm waiting for it to be complete. Where do you find the updated information?

When it's finished downloading, start a command prompt and:


C:\>cd C:\Program Files (x86)\Steam\steamapps\common\everquest

C:\Program Files (x86)\Steam\steamapps\common\everquest>eqgame patchme


As soon as the EULA screen appears, select DECLINE, and then:


C:\Program Files (x86)\Steam\steamapps\common\everquest>notepad logs\dbg.txt


Will open up notepad with the client version build date on the first line.

robinreg
07-08-2010, 05:25 PM
ah yeah I see it. it's using the June 8th built as stated.

[Thu Jul 08 14:26:23 2010]00000:Starting EverQuest (Built Jun 8 2010 16:44:32)

the one on my computer is still using the dec 19 2008 built. as long as I don't log on steam I assumed it won't change it.

That does not look good. =/

trevius
07-08-2010, 05:32 PM
My guess is that SOE is maybe having them update to remove our SoD client. As long as they don't update with every patch, we can probably just get that client all worked out and use it instead. If they do keep patching it to match Live, it would mean a way to patch to Live without needing an active Live account though. At least we got the Live client working for the most part, though there are plenty of things that need to be fixed for it still.

KLS
07-08-2010, 05:57 PM
Ah well we're fairly good at keeping up with live esp with the packet collector working as well as it does. Just more work for us to keep supporting versions as they update them but no big deal.

gibroni
07-09-2010, 09:15 PM
doesnt seem to have broken anything. i went ahead and patched it up on steam and made another copy of it. and started it up and went on peq server and worked fine, even went and got a brand newly updated recent ui and worked perfect with no errors. am able to play on the server and use new ui just fine. so maybe its a good thing.

wolfwalkereci
09-11-2010, 05:58 PM
Has any work been done to the client recently?
One thing I recently noticed was using /hidecorpse looted, while looting a corpse right after it died before it could poof (since it had no loot) would lock my character into the ducking [I am currently looting a mob] animation and I would have to /q to get out of it.

Derision
09-11-2010, 06:15 PM
Has any work been done to the client recently?
One thing I recently noticed was using /hidecorpse looted, while looting a corpse right after it died before it could poof (since it had no loot) would lock my character into the ducking [I am currently looting a mob] animation and I would have to /q to get out of it.

I wrote the SoD /hidecorpse code and I didn't implement the /hidecorpse looted aspect of it. All the other options should work, just don't use /hidecorpse looted ;-)

Derision
09-11-2010, 06:23 PM
Actually, if I remember, I will get a packet collect from Live tomorrow of the situation you describe and see if I can prevent you getting bugged.

Derision
09-12-2010, 05:50 AM
It appears /hidecorpse looted is handled client-side, however I was unable to reproduce the problem in my testing.

lerxst2112
09-12-2010, 06:04 AM
I use /hidecorpse looted all the time and haven't had any issues.

trevius
09-13-2010, 03:35 PM
Has any work been done to the client recently?
One thing I recently noticed was using /hidecorpse looted, while looting a corpse right after it died before it could poof (since it had no loot) would lock my character into the ducking [I am currently looting a mob] animation and I would have to /q to get out of it.

What server did this happen on? This bug isn't an issue with hidden corpses, it was an issue with empty corpses on servers that use the rule to poof empty corpses. They would be in the process of poofing when a player with high latency was looting them, and the server wouldn't send the end loot packet because it thought the corpse was already gone. Titanium handles the end loot response differently, so this problem wasn't happening on that client. I am pretty sure that I resolved this issue for SoD a while back by changing the handling to respond with the packet that SoD wants when an end loot packet is sent. Maybe the server you are playing on hasn't updated in quite a while. Like if you are playing on THF, I don't know if they are current enough to have that particular fix. Since I added it, I haven't heard any more reports about this issue on my server at least. If the problem does still exist in the current revisions, we will probably need to take another look at it, but as far as I know, it is now resolved.

Here is the revision that I put in the fix for this:

http://code.google.com/p/projecteqemu/source/detail?r=1546

SoD - Possible fix for empty corpse looting bugging clients.

werebat
01-01-2011, 07:58 PM
Just installed SoD a couple of days ago and I see an issue where my Iksar beastlord bot is healing their pet instead of me even when pet is 100% health. This happens when I am below 80% so I think it is trying to heal me but casting the wrong healing spell (Sharik's Replenishing).

trevius
01-02-2011, 03:55 AM
Sounds like a like a bot related issue, which should have nothing to do with the SoD client itself.

werebat
01-02-2011, 08:25 PM
Delete or move my previous post. I looked at the code and it appears to be a bug unrelated to SoD, sorry about that.

Thanks