PDA

View Full Version : Ground Spawn



vlucas
01-04-2007, 09:47 PM
Does the current version show ground spawn? New to this and I'm not sure I'm using all the features. Ground spawn was one of the main reasons I decided to risk using Myseq, I hope it is a feature.

Thanks

Seaxouri
01-05-2007, 07:32 AM
It depends on the type of spawn. If you are talking about small items like mushrooms, acorns, leafs, etc. Then no, they no longer appear. I spent another 3 days looking at this in December and still could not find them.

Part of the problem is that the ground spawn itself contains very little information about what it is until you actually pick it up, so it is hard to lock onto where these items are in memory.

If you are talking about things like chests or barrels (things since LDON) then yes those appear.

The ground spawns that do not show up account for about 1/10000 of all the spawns that can show up.

Seaxouri
01-05-2007, 07:35 AM
It would be interesting to know if the commercial version of MySEQ has ground spawns working or not. Does anyone have it and know?

purple
01-05-2007, 07:53 AM
The ground spawns that do not show up account for about 1/10000 of all the spawns that can show up.

That's a pretty skewed view of things...

Actually no ground spawns show up, but all mobs show up. It just so happens that some things that don't move are actually implemented in game as mobs. This doesn't make them ground spawns.

Have you tried downloading MQ2 and cheating off them? You don't even need to run it if you don't feel comfortable with it. Just see if by looking at their offsets and structs you can gleam anything that turns your lightbulb on. I mean their structs should match exactly what you're looking for in memory since they properly show ground spawns in MQ2Map and they are reading from the same place you would be.

They are GPL. You're GPL. If you do find this resource useful and can afford it, toss them some donation bucks to thank them.

vlucas
01-05-2007, 11:00 AM
Thanks very much for the reply. After spending 4 hours in the Wakening Lands and not finding or foraging a single yew leaf, I decided to try this. I'm kind of disappointed, but I guess I can find another tradeskill path.

I kind of have a feeling that there may be someone using MQ2 to clean up all the ground spawn already. Thanks again for the response.

MacQ
01-09-2007, 08:08 PM
Vlucas just a quick FYI, I'm not sure if you're new to EQ but foraging "summons" an item so I'm pretty sure foraged items would never show up as a ground spawn in MQ2 or SEQ. So if yew leafs are only foraged, then you would not see them as a ground spawn. If yew leaves, however, are both ground spawn and foraged, that's different and you might see them in MQ2 or SEQ.

vlucas
01-11-2007, 06:28 PM
Yep, they are both foraged and ground spawn in the Wakening land. Since I first posted this I've managed to forage 15, and still haven't found a single ground spawn.

Ubermage
01-12-2007, 06:12 AM
It would be interesting to know if the commercial version of MySEQ has ground spawns working or not. Does anyone have it and know?
No they are not atm "They are looking into it" as always

MacQ
01-12-2007, 11:01 AM
Yes they are always "looking into" stuff like that but rarely deliver except to make the program more bloated and charge us money for it after they stole the source code from a GPL project. Hopefully more folks will realize they are paying money to software thieves and return here to the home/birthplace of SEQ and the "always free" version. /salute Seaxouri and all the folks who work hard to keep SEQ and MySEQ free of bad programming and fees.

Carpathian
01-19-2007, 02:42 PM
Here is the information you'd need to implement the ground items...

myseqserver.ini:

[File Info]
PatchDate=12/12/2006

[Port]
port=5555

[Memory Offsets]
SpawnHeaderAddr=0x9070B4
#CharInfo is the pointer to Character SpawnInfo, not PlayerProfile
CharInfo=0x887684
TargetAddr=0x887688
#This is ZoneInfo + 0x40...
ZoneAddr=0x8A5618
ItemsAddr=0x887644

[SpawnInfo Offsets]
NameOffset=0x74
LastnameOffset=0x10
XOffset=0x3c
YOffset=0x40
ZOffset=0x44
SpeedOffset=0x54
HeadingOffset=0x58
PrevOffset=0x4
NextOffset=0x8
TypeOffset=0x140
LevelOffset=0x44a
HideOffset=0x29c
ClassOffset=0xe24
SpawnIDOffset=0x6C
RaceOffset=0xe20

[GroundItem Offsets]
PrevOffset=0x00
NextOffset=0x04
IdOffset=0x08
DropIdOffset=0x0c
XOffset=0x30
YOffset=0x34
ZOffset=0x2c
NameOffset=0x38


GroundItem Struct:


struct _GROUNDITEM {
DWORD ID;
DWORD DropID;
float X;
float Y;
float Z;
char Name[24];
};


Then, you can use the GroundItems.ini file included with the client to present a more "readable" name for the items. The name will be stored in memory as IT#_ACTORDEF, or very close to that.

Carpathian
01-19-2007, 05:11 PM
Started some work on the class you would add into the server...

Items.cpp:


/*================================================= =============================

Copyright (C) 2006 All developers at http://sourceforge.net/projects/seq

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

================================================== ============================*/

#include "StdAfx.h"
#include "Items.h"

Items::Items(void)
{
// Initialize member data
m_ItemsList.reserve(300);
m_LargestOffset = 0;
}

Items::~Items(void)
{
}

void Items::Init(IniReaderInterface* ir_intf)
{
SetOffset(OT_PREV, ir_intf->readIntegerEntry("GroundItem Offsets", "PrevOffset"), "Previous");
SetOffset(OT_NEXT, ir_intf->readIntegerEntry("GroundItem Offsets", "NextOffset"), "Next");
SetOffset(OT_ID, ir_intf->readIntegerEntry("GroundItem Offsets", "IdOffset"), "ID");
SetOffset(OT_DROPID, ir_intf->readIntegerEntry("GroundItem Offsets", "DropIdOffset"), "Drop ID");
SetOffset(OT_X, ir_intf->readIntegerEntry("GroundItem Offsets", "XOffset"), "X");
SetOffset(OT_Y, ir_intf->readIntegerEntry("GroundItem Offsets", "YOffset"), "Y");
SetOffset(OT_Z, ir_intf->readIntegerEntry("GroundItem Offsets", "ZOffset"), "Z");
SetOffset(OT_NAME, ir_intf->readIntegerEntry("GroundItem Offsets", "NameOffset"), "Model Name");

// Determine how many bytes we should read at item in memory
for (int i = 0; i < OT_MAX; i++)
{
if (m_Offsets[i] > m_LargestOffset)
m_LargestOffset = m_Offsets[i];
}
m_LargestOffset += 30;

// Allocate memory for our temporary buffer
// We use this to store the raw data from the EQ process
m_pRawBuffer = newchar[m_LargestOffset];

cout << "Spawn::Init(): GroundItem Offsets loaded." << endl;
}

void Items::SetOffset(eOffsetTypes ot, int value, string name)
{
m_Offsets[ot] = value;
m_OffsetNames[ot] = name;
}


Items.h:


/*================================================= =============================

Copyright (C) 2006 All developers at http://sourceforge.net/projects/seq

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

================================================== ============================*/

#pragma once
#include "Common.h"
#include "IniReader.h"

#pragma pack(push, 1)
struct _GROUNDITEM {
DWORD ID;
DWORD DropID;
float X;
float Y;
float Z;
char Name[24];
};

#pragma pack(pop)
class Items
{
private:
enum eOffsetTypes { OT_PREV, OT_NEXT, OT_ID, OT_DROPID, OT_X, OT_Y, OT_Z, OT_NAME, OT_MAX };

public:
Items(void);
~Items(void);

void Init(IniReaderInterface* ir_intf);
void SetOffset(eOffsetTypes ot, int value, string name);

private:
int m_LargestOffset;
int m_Offsets[OT_MAX];
string m_OffsetNames[OT_MAX];

// Buffers
char *m_pRawBuffer;
_GROUNDITEM m_GroundItem;

// List of items
vector<_GROUNDITEM> m_ItemsList;
};

Seaxouri
01-24-2007, 04:45 PM
Thanks, I'll look into it.

How did you determine the base address? What was your search methodology, in as much detail as you are willing to provide.

I would like to add a method to the server debug mode to do this, if possible.

Seaxouri
01-26-2007, 09:42 AM
Ive added it to the server, however I need to tweak some things in the old client.

I just saw that you had the ground items offsets in the window. I will try those. I was getting invalid data.

Seaxouri
01-26-2007, 10:04 AM
Data looks good now on the server side. I will need to update the old client still.

Carpathian
01-26-2007, 06:23 PM
The method I use to find the offsets in memory isn't exactly easy to automate. But I'll give a shot at explaining it.

First, you'll go into your real-time memory editor (I use winhack personally), and search for the ASCII string "_ACTORDEF". With that search string you will find A LOT of matches but there are a few ways you can identify if their even item models, or could even be possibly in that struct.

1. The Name field is always in a certain format: IT#_ACTORDEF. Examples:
IT1_ACTORDEF, IT23090_ACTORDEF, IT304_ACTORDEF

I've never seen a grounditem with one of the different prefixes, but even if it did, you'll still find the majority of the list has the IT prefix.

2. You can eliminate any of them which have _ACTORDEFS close to other _ACTORDEFS. For example:

006B81E0: RED_BLOB_ACTORDE
006B71F0: F\0\0\0IT63_ACTORDE

The second one couldn't be part of a grounditem, because of the actordef before it. It's too close.

After I've found one that appears to be a grounditem, I try to find the pPrev and pNext fields. Same method as you would use for the spawnlist basically... find addresses nearby which have a common address block, so if I'm at 0C6b3d22, I'll look for XX XX XX 0C and follow those and see if they lead me to other blocks which look the same.

After you've found those... follow pPrev until you find the head, take its address and search for it in memory. The base address should be in the same address block as the other base addresses.

Carpathian
01-26-2007, 06:36 PM
As a second thought, typically the base addresses will stay the same distances apart, unless they add a new base address between them, or move them around. So an easy way could be to always try CharInfo's base address and subtract 0x40 and see thats the base address for ground items. Not the best solution, but another idea none the less.

Seaxouri
01-27-2007, 08:15 PM
Thanks a million Carpathian. The only problem I saw was your X and Y was flipped around, other than that, the offsets were perfect.

I have a beta available. Read the News section for details.

I will probably not release 1.19.2 officially, since 1.20 will be a superset of it, but I wanted to get something out there in the interim.

I also want those actordef strings, so if you get the beta, you will be expected to help feedback data to the project.

vlucas
02-05-2007, 06:42 AM
I wouldn't qualify for a beta, since I am not all that familiar with the program. I'm hoping this will make an official release soon, though. Thanks Carpathian for your help.

vlucas
02-12-2007, 06:52 PM
Any idea when this will be gold? Or at least open beta?

Seaxouri
02-12-2007, 11:38 PM
No. I have put a lot of time into 1.20 so far. I will admit I have gone further than I thought I was going to.

Ive got new map rendering working. Smart zoom, skittles, ground items, some other cool stuff. I am working on popups now where I have some neat ideas.

I have a lot more to do with animating skittles, theres some things I want play with.

I want to add some new functions like raiding tools, although I will see how that pans out.

I also need to work on some auto panning features.

There are some bugs with Timers I need to work out. Not looking forward to that.

I need to rewrite the entire Settings code. I don't like it. Thats one of the few places I have not changed yet.

As soon as I get something to the point where I use it and I feel like its a usable beta, I will open it up.

Everyone has a functional version now, so its not like I'm holding anything out.

I don't want to put 19.2 on sourceforge, only to have 2500 people download it and then a month later release 20, to have another 2500 people download it, then find theres bugs and go thru tons of downloading cycles.

I also feel like if I give out 19.2, its possible noone will want to check out 1.20. And actually I have given out 19.2 to everyone whose asked for it, but I don't want to put it on SF.