diff --git a/common/patches/rof.cpp b/common/patches/rof.cpp index b4a6e73d3..da9ed18f9 100644 --- a/common/patches/rof.cpp +++ b/common/patches/rof.cpp @@ -975,8 +975,8 @@ namespace RoF VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); // Same for all objects in the zone VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->heading); VARSTRUCT_ENCODE_TYPE(float, OutBuffer, 0); // Normally 0, but seen (float)255.0 as well - VARSTRUCT_ENCODE_TYPE(float, OutBuffer, 0); // Unknown - VARSTRUCT_ENCODE_TYPE(float, OutBuffer, 1); // Need to add emu->size to struct + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->solidtype); // Unknown + VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->size != 0 && (float)emu->size < 5000.f ? (float)((float)emu->size / 100.0f) : 1.f ); // This appears to be the size field. Hackish logic because some PEQ DB items were corrupt. VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->y); VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->x); VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->z); diff --git a/common/patches/rof2.cpp b/common/patches/rof2.cpp index e8b98e7af..2041a3c3a 100644 --- a/common/patches/rof2.cpp +++ b/common/patches/rof2.cpp @@ -1046,8 +1046,8 @@ namespace RoF2 VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); // Same for all objects in the zone VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->heading); VARSTRUCT_ENCODE_TYPE(float, OutBuffer, 0); // Normally 0, but seen (float)255.0 as well - VARSTRUCT_ENCODE_TYPE(float, OutBuffer, 0); // Unknown - VARSTRUCT_ENCODE_TYPE(float, OutBuffer, 1); // Need to add emu->size to struct + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->solidtype); // Unknown + VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->size != 0 && (float)emu->size < 5000.f ? (float)((float)emu->size / 100.0f) : 1.f ); // This appears to be the size field. Hackish logic because some PEQ DB items were corrupt. VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->y); VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->x); VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->z); diff --git a/common/patches/uf.cpp b/common/patches/uf.cpp index c2b3dba4a..4fbc7b6b8 100644 --- a/common/patches/uf.cpp +++ b/common/patches/uf.cpp @@ -857,8 +857,8 @@ namespace UF // field to be set to (float)255.0 to appear at all, and also the size field below to be 5, to be the correct size. I think SoD has the same // issue. VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); // Unknown, observed 0 - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); // This appears to be the size field. + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->solidtype); // Unknown, observed 0 + VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->size != 0 && (float)emu->size < 5000.f ? (float)((float)emu->size / 100.0f) : 1.f ); // This appears to be the size field. Hackish logic because some PEQ DB items were corrupt. VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->y); VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->x); VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->z); diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 12b16610e..e2c63c232 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -4126,7 +4126,7 @@ void Client::Handle_OP_ClickObject(const EQApplicationPacket *app) char buf[10]; snprintf(buf, 9, "%u", click_object->drop_id); buf[9] = '\0'; - parse->EventPlayer(EVENT_CLICK_OBJECT, this, buf, 0, &args); + parse->EventPlayer(EVENT_CLICK_OBJECT, this, buf, GetID(), &args); } // Observed in RoF after OP_ClickObjectAction: diff --git a/zone/command.cpp b/zone/command.cpp index b383e09b3..3f3d4b6c1 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -8549,20 +8549,20 @@ void command_object(Client *c, const Seperator *sep) od.object_type = atoi(row[7]); icon = atoi(row[8]); - od.unknown008 = atoi(row[9]); - od.unknown010 = atoi(row[10]); + od.size = atoi(row[9]); + od.solidtype = atoi(row[10]); od.unknown020 = atoi(row[11]); switch (od.object_type) { case 0: // Static Object case staticType: // Static Object unlocked for changes - if (od.unknown008 == 0) // Unknown08 field is optional Size parameter for static objects - od.unknown008 = 100; // Static object default Size is 100% + if (od.size == 0) // Unknown08 field is optional Size parameter for static objects + od.size = 100; // Static object default Size is 100% c->Message(0, "- STATIC Object (%s): id %u, x %.1f, y %.1f, z %.1f, h %.1f, model %s, " "size %u, solidtype %u, incline %u", (od.object_type == 0) ? "locked" : "unlocked", id, od.x, od.y, od.z, - od.heading, od.object_name, od.unknown008, od.unknown010, od.unknown020); + od.heading, od.object_name, od.size, od.solidtype, od.unknown020); break; case OT_DROPPEDITEM: // Ground Spawn @@ -8620,10 +8620,10 @@ void command_object(Client *c, const Seperator *sep) switch (od.object_type) { case 0: // Static Object if ((sep->argnum - col) > 3) { - od.unknown008 = atoi(sep->arg[4 + col]); // Size specified + od.size = atoi(sep->arg[4 + col]); // Size specified if ((sep->argnum - col) > 4) { - od.unknown010 = atoi(sep->arg[5 + col]); // SolidType specified + od.solidtype = atoi(sep->arg[5 + col]); // SolidType specified if ((sep->argnum - col) > 5) od.unknown020 = atoi(sep->arg[6 + col]); // Incline specified @@ -8922,16 +8922,16 @@ void command_object(Client *c, const Seperator *sep) return; } - od.unknown008 = atoi(sep->arg[4]); + od.size = atoi(sep->arg[4]); o->SetObjectData(&od); - if (od.unknown008 == 0) // 0 == unspecified == 100% - od.unknown008 = 100; + if (od.size == 0) // 0 == unspecified == 100% + od.size = 100; c->Message(0, "Static Object %u set to %u%% size. Size will take effect when you commit to the " "database with '#object Save', after which the object will be unchangeable until " "you unlock it again with '#object Edit' and zone out and back in.", - id, od.unknown008); + id, od.size); } else if (strcmp(sep->arg[3], "solidtype") == 0) { if (od.object_type != staticType) { @@ -8946,13 +8946,13 @@ void command_object(Client *c, const Seperator *sep) return; } - od.unknown010 = atoi(sep->arg[4]); + od.solidtype = atoi(sep->arg[4]); o->SetObjectData(&od); c->Message(0, "Static Object %u set to SolidType %u. Change will take effect when you commit " "to the database with '#object Save'. Support for this property is on a " "per-model basis, mostly seen in smaller objects such as chests and tables.", - id, od.unknown010); + id, od.solidtype); } else if (strcmp(sep->arg[3], "icon") == 0) { if ((od.object_type < 2) || (od.object_type == staticType)) { @@ -9239,24 +9239,24 @@ void command_object(Client *c, const Seperator *sep) "unknown08 = %u, unknown10 = %u, unknown20 = %u " "WHERE ID = %u", zone->GetZoneID(), zone->GetInstanceVersion(), od.x, od.y, od.z, - od.heading, od.object_name, od.object_type, icon, od.unknown008, - od.unknown010, od.unknown020, id); + od.heading, od.object_name, od.object_type, icon, od.size, + od.solidtype, od.unknown020, id); else if (id == 0) query = StringFormat("INSERT INTO object " "(zoneid, version, xpos, ypos, zpos, heading, objectname, " "type, icon, unknown08, unknown10, unknown20) " "VALUES (%u, %u, %.1f, %.1f, %.1f, %.1f, '%s', %u, %u, %u, %u, %u)", zone->GetZoneID(), zone->GetInstanceVersion(), od.x, od.y, od.z, - od.heading, od.object_name, od.object_type, icon, od.unknown008, - od.unknown010, od.unknown020); + od.heading, od.object_name, od.object_type, icon, od.size, + od.solidtype, od.unknown020); else query = StringFormat("INSERT INTO object " "(id, zoneid, version, xpos, ypos, zpos, heading, objectname, " "type, icon, unknown08, unknown10, unknown20) " "VALUES (%u, %u, %u, %.1f, %.1f, %.1f, %.1f, '%s', %u, %u, %u, %u, %u)", id, zone->GetZoneID(), zone->GetInstanceVersion(), od.x, od.y, od.z, - od.heading, od.object_name, od.object_type, icon, od.unknown008, - od.unknown010, od.unknown020); + od.heading, od.object_name, od.object_type, icon, od.size, + od.solidtype, od.unknown020); results = database.QueryDatabase(query); if (!results.Success()) { @@ -9314,12 +9314,12 @@ void command_object(Client *c, const Seperator *sep) memcpy(door.dest_zone, "NONE", 5); - if ((door.size = od.unknown008) == 0) // unknown08 = optional size percentage + if ((door.size = od.size) == 0) // unknown08 = optional size percentage door.size = 100; switch ( door.opentype = - od.unknown010) // unknown10 = optional request_nonsolid (0 or 1 or experimental number) + od.solidtype) // unknown10 = optional request_nonsolid (0 or 1 or experimental number) { case 0: door.opentype = 31; @@ -9576,8 +9576,8 @@ void command_object(Client *c, const Seperator *sep) strn0cpy(od.object_name, row[4], sizeof(od.object_name)); od.object_type = atoi(row[5]); icon = atoi(row[6]); - od.unknown008 = atoi(row[7]); - od.unknown010 = atoi(row[8]); + od.size = atoi(row[7]); + od.solidtype = atoi(row[8]); od.unknown020 = atoi(row[9]); if (od.object_type == 0) diff --git a/zone/embparser.cpp b/zone/embparser.cpp index 3bfb2e90a..db017750a 100644 --- a/zone/embparser.cpp +++ b/zone/embparser.cpp @@ -1277,6 +1277,7 @@ void PerlembParser::ExportEventVariables(std::string &package_name, QuestEventID case EVENT_PLAYER_PICKUP:{ ExportVar(package_name.c_str(), "picked_up_id", data); + ExportVar(package_name.c_str(), "picked_up_entity_id", extradata); break; } @@ -1367,6 +1368,7 @@ void PerlembParser::ExportEventVariables(std::string &package_name, QuestEventID case EVENT_CLICK_OBJECT: { ExportVar(package_name.c_str(), "objectid", data); + ExportVar(package_name.c_str(), "clicker_id", extradata); break; } diff --git a/zone/object.cpp b/zone/object.cpp index 7dd97d355..7255cd9e9 100644 --- a/zone/object.cpp +++ b/zone/object.cpp @@ -485,7 +485,22 @@ bool Object::HandleClick(Client* sender, const ClickObject_Struct* click_object) buf[9] = '\0'; std::vector args; args.push_back(m_inst); - parse->EventPlayer(EVENT_PLAYER_PICKUP, sender, buf, 0, &args); + if(parse->EventPlayer(EVENT_PLAYER_PICKUP, sender, buf, this->GetID(), &args)) + { + EQApplicationPacket* outapp = new EQApplicationPacket(OP_ClickObject, sizeof(ClickObject_Struct)); + memcpy(outapp->pBuffer, click_object, sizeof(ClickObject_Struct)); + ClickObject_Struct* co = (ClickObject_Struct*)outapp->pBuffer; + co->drop_id = 0; + entity_list.QueueClients(nullptr, outapp, false); + safe_delete(outapp); + + // No longer using a tradeskill object + sender->SetTradeskillObject(nullptr); + user = nullptr; + + return true; + } + // Transfer item to client sender->PutItemInInventory(MainCursor, *m_inst, false); @@ -809,7 +824,7 @@ void Object::SetModelName(const char* modelname) void Object::SetSize(uint16 size) { - m_data.unknown008 = size; + m_data.size = size; EQApplicationPacket* app = new EQApplicationPacket(); EQApplicationPacket* app2 = new EQApplicationPacket(); this->CreateDeSpawnPacket(app); @@ -822,7 +837,7 @@ void Object::SetSize(uint16 size) void Object::SetSolidType(uint16 solidtype) { - m_data.unknown010 = solidtype; + m_data.solidtype = solidtype; EQApplicationPacket* app = new EQApplicationPacket(); EQApplicationPacket* app2 = new EQApplicationPacket(); this->CreateDeSpawnPacket(app); @@ -835,12 +850,12 @@ void Object::SetSolidType(uint16 solidtype) uint16 Object::GetSize() { - return m_data.unknown008; + return m_data.size; } uint16 Object::GetSolidType() { - return m_data.unknown010; + return m_data.solidtype; } const char* Object::GetModelName() diff --git a/zone/zone.cpp b/zone/zone.cpp index eb22b0a6e..56181695d 100644 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -241,8 +241,8 @@ bool Zone::LoadZoneObjects() { data.object_type = type; data.linked_list_addr[0] = 0; data.linked_list_addr[1] = 0; - data.unknown008 = (uint32)atoi(row[11]); - data.unknown010 = (uint32)atoi(row[12]); + data.size = (uint32)atoi(row[11]); + data.solidtype = (uint32)atoi(row[12]); data.unknown020 = (uint32)atoi(row[13]); data.unknown024 = (uint32)atoi(row[14]); data.unknown076 = (uint32)atoi(row[15]);