PDA

View Full Version : Error: No Target


laxative
08-18-2009, 04:21 PM
Greets,

DB Version 922

Executables 944

Lots of GM Commands, including Summon, Kill, NpcLootShow all appear to have a range component built in now.

Unless the mob is close by I'm getting Error:No target on these commands. I'd be willing to bet other gm commands are doing the same thing.

Anyone else got that going on?

Laxa

So_1337
08-18-2009, 04:23 PM
My guess would be that it's due to a change made with revision 933 (http://code.google.com/p/projecteqemu/source/detail?r=933) to combat MQ. We'll have to see what KLS says.

trevius
08-18-2009, 05:43 PM
You can't use /target to target anything out of range anymore. Though, I don't think it would hurt for us to add in a status check to allow it for GMs. Maybe even a rule that lets you set what status is required to be able to target stuff that is out of range would be a good way to do it. That way, if people want to allow their players to /target for zone-wide group invites, you could just set the rule to require status 0 or greater.

For now, there is a simple way to handle out of range stuff and that is just to use /goto (not #goto) along with part of the name of the NPC or player you are wanting to target and manipulate. By using /goto <npcname>, you can go to any NPC in the zone fairly easily. You can also use /goto <playername> to go to any player on the server, no matter what zone they are in.

ChaosSlayerZ
08-18-2009, 06:52 PM
yes GMs absolutely need zone wide #target command - otherwise I will have to run all over across zones just to check on a single mob instead of just /target and #goto like I use to

trevius
08-18-2009, 07:12 PM
Or, you can use /goto <npcname>, just like I just said in the last post here :P I know for sure it works perfectly on SoF, and I know it was working at least at some point on Titanium. If it isn't working on Titanium anymore, it should be something really simple like a missing opcode for it, that is a really easy one to get. No need to /target <name> then #goto, when you can just /goto <name> all in one simple command.

ChaosSlayerZ
08-18-2009, 07:40 PM
Or, you can use /goto <npcname>, just like I just said in the last post here :P I know for sure it works perfectly on SoF, and I know it was working at least at some point on Titanium. If it isn't working on Titanium anymore, it should be something really simple like a missing opcode for it, that is a really easy one to get. No need to /target <name> then #goto, when you can just /goto <name> all in one simple command.


ahh but does /goto npc requires EXACT npc name?

cuase with /target you can get by doign just /target warl

rather than typing in full "warlord_scarloton_megadermaticus_the_death_brignge r_of_thousand_dooms000" =)

trevius
08-19-2009, 02:53 AM
You can type the exact name or just the first part of it. Works pretty much just like /target does in that aspect.

laxative
08-19-2009, 07:51 AM
Greetings,

Ok I understand what everyone is saying, but do we have an official answer as if this was implemented to stop MQ2?

I use MQ, in fact It's super handy, is there a rules_value that could be turned off, or disabled to allow the out of range stuff?

Thanks

laxative
08-19-2009, 08:27 AM
Just wanted to add another note,

I do a lot of work with adjusting loot drops, primarily for those stupidly rare quest drops that always caused bottle necks.

So one thing I do A LOT is pop into several zones and do the following:

/tar X-Mob
#npcloot show

This command also doesnt work now. (unless I #goto /goto whatever, but.. see next line:)

I also do not like to go in GM mode all the time either.

For example I'll do a #zone GukBottom then check loots or other factors that I've modified or updated (making Raster spawn more frequently) then start my dungeon crawling with my bot team.

Whatever code that is now in place really has put a damper on this.

Laxa.

So_1337
08-19-2009, 08:42 AM
That way, if people want to allow their players to /target for zone-wide group invites, you could just set the rule to require status 0 or greater.
I'm not sure if this was fixed in recent times for the emulator, but on Live you could use "/invite Name" and it would work without a target. This applied whether the recipient was in the same zone with you or not. I believe that this was not the case on the emulator the last time I checked. /target should not be a requisite for inviting group members.

trevius
08-19-2009, 04:59 PM
Yes, the change was done to prevent MQ usage completely. Though, I do agree that it would be good to put in a rule as I mentioned before where you can set the min status required to be able to target across a zone. Then, you could just set the new rule to status 0 if you wanted any player to be able to do it, or you could set it higher if you wanted only GMs to be able to use it for development.

Really, there will be no need for players to have access to target across a zone like that once the /invite <playername> option actually works. It isn't implemented yet, but I am sure it is on the list of to-dos.

ChaosSlayerZ
11-18-2009, 05:38 PM
You can type the exact name or just the first part of it. Works pretty much just like /target does in that aspect.

Trev, returning to this issue, there is something I can't do anymore, what I use been able before.

To target and SUMMON mob to myself, instead to going to the mob.

So before i could do:

/target king
#summon

this is useful when I want to say spawnfix a bunch of mobs who maybe on the other end of the zone, but I need to be able to target them from where I am

So consider putting zone wide /target back in for GMs please =)

trevius
11-27-2009, 07:47 PM
Yeah, for #spawnfix, it would be nice to have /target working for GMs. I already mentioned that I think it is a good idea to at least have a rule that lets the admin set the minstatus for that command.

I haven't messed with it in a while, but maybe /summon <name> will let you summon them. For doing stuff like that, I currently just use MQ2 for it, since it will let you see what is where on the map and let you target anything even though I think it still makes a hacker log entry for it. I am not a big fan of using MQ2, but it can definitely be helpful when populating a zone. It is nice to have one quick view on the map to be able to see if any areas have too few or too many NPCs in them.

ChaosSlayerZ
02-24-2010, 06:16 PM
BUMP!!!

You awaiting for gm /target to come back

It targets players across zone, but NOT mobs

trevius
02-24-2010, 06:54 PM
Here is the function that handles the targeting stuff:

client_packet.cpp
void Client::Handle_OP_TargetCommand(const EQApplicationPacket *app)
{
if (app->size != sizeof(ClientTarget_Struct)) {
LogFile->write(EQEMuLog::Error, "OP size error: OP_TargetMouse expected:%i got:%i", sizeof(ClientTarget_Struct), app->size);
return;
}

if(GetTarget())
{
GetTarget()->IsTargeted(-1);
}

// Locate and cache new target
ClientTarget_Struct* ct=(ClientTarget_Struct*)app->pBuffer;
pClientSideTarget = ct->new_target;
if(!IsAIControlled())
{
Mob *new_target = entity_list.GetMob(ct->new_target);
if(new_target)
{
SetTarget(new_target);
}
else
{
SetTarget(NULL);
SetHoTT(0);
return;
}
}
else
{
SetTarget(NULL);
SetHoTT(0);
return;
}

// <Rogean> HoTT
if (GetTarget() && GetTarget()->GetTarget())
SetHoTT(GetTarget()->GetTarget()->GetID());
else
SetHoTT(0);

Group *g = GetGroup();

if(g && g->IsMainAssist(this))
g->SetGroupTarget(ct->new_target);

// For /target, send reject or success packet
if (app->GetOpcode() == OP_TargetCommand) {
if (GetTarget() && !GetTarget()->CastToMob()->IsInvisible(this) && DistNoRoot(*GetTarget()) <= TARGETING_RANGE*TARGETING_RANGE) {
if(GetTarget()->GetBodyType() == BT_NoTarget2 || GetTarget()->GetBodyType() == BT_Special
|| GetTarget()->GetBodyType() == BT_NoTarget)
{
//Targeting something we shouldn't with /target
//but the client allows this without MQ so you don't flag it
EQApplicationPacket* outapp = new EQApplicationPacket(OP_TargetReject, sizeof(TargetReject_Struct));
outapp->pBuffer[0] = 0x2f;
outapp->pBuffer[1] = 0x01;
outapp->pBuffer[4] = 0x0d;
if(GetTarget())
{
SetTarget(NULL);
}
QueuePacket(outapp);
safe_delete(outapp);
return;
}

QueuePacket(app);
EQApplicationPacket hp_app;
GetTarget()->IsTargeted(1);
GetTarget()->CreateHPPacket(&hp_app);
QueuePacket(&hp_app, false);
}
else
{
EQApplicationPacket* outapp = new EQApplicationPacket(OP_TargetReject, sizeof(TargetReject_Struct));
outapp->pBuffer[0] = 0x2f;
outapp->pBuffer[1] = 0x01;
outapp->pBuffer[4] = 0x0d;
if(GetTarget())
{
SetTarget(NULL);
}
QueuePacket(outapp);
safe_delete(outapp);
}
}
else
{
if(GetTarget())
{
if(GetGM())
{
GetTarget()->IsTargeted(1);
return;
}
else if(GetTarget()->IsClient())
{
//make sure this client is in our raid/group
GetTarget()->IsTargeted(1);
return;
}
else if(GetTarget()->GetBodyType() == BT_NoTarget2 || GetTarget()->GetBodyType() == BT_Special
|| GetTarget()->GetBodyType() == BT_NoTarget)
{
char *hacker_str = NULL;
MakeAnyLenString(&hacker_str, "%s attempting to target something untargetable, %s bodytype: %i\n",
GetName(), GetTarget()->GetName(), (int)GetTarget()->GetBodyType());
database.SetMQDetectionFlag(AccountName(), GetName(), hacker_str, zone->GetShortName());
safe_delete_array(hacker_str);
SetTarget((Mob*)NULL);
return;
}
else if(IsPortExempted())
{
GetTarget()->IsTargeted(1);
return;
}
else if(IsSenseExempted())
{
GetTarget()->IsTargeted(1);
SetSenseExemption(false);
return;
}
else if(GetBindSightTarget())
{
if(GetBindSightTarget()->DistNoRoot(*GetTarget()) > (zone->newzone_data.maxclip*zone->newzone_data.maxclip))
{
if(DistNoRoot(*GetTarget()) > (zone->newzone_data.maxclip*zone->newzone_data.maxclip))
{
char *hacker_str = NULL;
MakeAnyLenString(&hacker_str, "%s attempting to target something beyond the clip plane of %.2f units,"
" from (%.2f, %.2f, %.2f) to %s (%.2f, %.2f, %.2f)", GetName(),
(zone->newzone_data.maxclip*zone->newzone_data.maxclip),
GetX(), GetY(), GetZ(), GetTarget()->GetName(), GetTarget()->GetX(), GetTarget()->GetY(), GetTarget()->GetZ());
database.SetMQDetectionFlag(AccountName(), GetName(), hacker_str, zone->GetShortName());
safe_delete_array(hacker_str);
SetTarget(NULL);
return;
}
}
}
else if(DistNoRoot(*GetTarget()) > (zone->newzone_data.maxclip*zone->newzone_data.maxclip))
{
char *hacker_str = NULL;
MakeAnyLenString(&hacker_str, "%s attempting to target something beyond the clip plane of %.2f units,"
" from (%.2f, %.2f, %.2f) to %s (%.2f, %.2f, %.2f)", GetName(),
(zone->newzone_data.maxclip*zone->newzone_data.maxclip),
GetX(), GetY(), GetZ(), GetTarget()->GetName(), GetTarget()->GetX(), GetTarget()->GetY(), GetTarget()->GetZ());
database.SetMQDetectionFlag(AccountName(), GetName(), hacker_str, zone->GetShortName());
safe_delete_array(hacker_str);
SetTarget(NULL);
return;
}

GetTarget()->IsTargeted(1);
}
}
return;
}

I will try to look through this later and maybe add in a "if(Admin() < 80)" type of check to allow GMs to use /target from any range. Just need to figure out the best place to put that, but it shouldn't be too hard.

ChaosSlayerZ
02-24-2010, 07:08 PM
if(Admin() < 80) ?
you sure its not
if(Admin() > 80) ? =)

i assume 80 is Gm status value

trevius
02-24-2010, 09:53 PM
Either or :P It all depends on how and where it is added. Could be put either way.

trevius
02-25-2010, 12:26 AM
Hmm, after looking at the target code there, it makes me wonder if other things could be tweaked for targetting. Anyway, I think the change that should allow GMs to use /target no matter what distance should be to change this:
// For /target, send reject or success packet
if (app->GetOpcode() == OP_TargetCommand) {
if (GetTarget() && !GetTarget()->CastToMob()->IsInvisible(this) && DistNoRoot(*GetTarget()) <= TARGETING_RANGE*TARGETING_RANGE) {

To this:
// For /target, send reject or success packet
if (app->GetOpcode() == OP_TargetCommand) {
if (GetTarget() && !GetTarget()->CastToMob()->IsInvisible(this) && (DistNoRoot(*GetTarget()) <= TARGETING_RANGE*TARGETING_RANGE || GetGM())) {

I will test it out later, but that should work.

ChaosSlayerZ
08-11-2010, 10:43 AM
BUMP!

Trev, was there any progress on getting zone wide /target back to GM power?