|
@@ -159,6 +159,8 @@ Client::Client(EQStream* ieqs) : underworld_cooldown_timer(5000), pos_update(125
|
|
zoning_z = 0;
|
|
zoning_z = 0;
|
|
zoning_instance_id = 0;
|
|
zoning_instance_id = 0;
|
|
player_pos_changed = false;
|
|
player_pos_changed = false;
|
|
|
|
+ player_pos_timer = Timer::GetCurrentTime2()+1000;
|
|
|
|
+ enabled_player_pos_timer = true;
|
|
++numclients;
|
|
++numclients;
|
|
if (world.GetServerStatisticValue(STAT_SERVER_MOST_CONNECTIONS) < numclients)
|
|
if (world.GetServerStatisticValue(STAT_SERVER_MOST_CONNECTIONS) < numclients)
|
|
world.UpdateServerStatistic(STAT_SERVER_MOST_CONNECTIONS, numclients, true);
|
|
world.UpdateServerStatistic(STAT_SERVER_MOST_CONNECTIONS, numclients, true);
|
|
@@ -408,7 +410,7 @@ void Client::SendLoginInfo() {
|
|
if (version > 561) // right version? possibly not!
|
|
if (version > 561) // right version? possibly not!
|
|
master_aa_list.DisplayAA(this, 0, 3);
|
|
master_aa_list.DisplayAA(this, 0, 3);
|
|
|
|
|
|
- if (version > 283)
|
|
|
|
|
|
+ if (version > 373)
|
|
SendCollectionList();
|
|
SendCollectionList();
|
|
SendBiography();
|
|
SendBiography();
|
|
|
|
|
|
@@ -440,7 +442,7 @@ void Client::SendLoginInfo() {
|
|
guild->SendAllGuildEvents(this);
|
|
guild->SendAllGuildEvents(this);
|
|
guild->SendGuildMemberList(this);
|
|
guild->SendGuildMemberList(this);
|
|
}*/
|
|
}*/
|
|
- if (version > 283) {
|
|
|
|
|
|
+ if (version > 373) {
|
|
LogWrite(CCLIENT__DEBUG, 0, "Client", "Loading Faction Updates...");
|
|
LogWrite(CCLIENT__DEBUG, 0, "Client", "Loading Faction Updates...");
|
|
EQ2Packet* outapp = player->GetFactions()->FactionUpdate(GetVersion());
|
|
EQ2Packet* outapp = player->GetFactions()->FactionUpdate(GetVersion());
|
|
if (outapp) {
|
|
if (outapp) {
|
|
@@ -653,7 +655,7 @@ void Client::HandlePlayerRevive(int32 point_id)
|
|
zone_desc = GetCurrentZone()->GetZoneDescription();
|
|
zone_desc = GetCurrentZone()->GetZoneDescription();
|
|
Message(CHANNEL_NARRATIVE, "Reviving in %s at %s.", zone_desc.c_str(), location_name);
|
|
Message(CHANNEL_NARRATIVE, "Reviving in %s at %s.", zone_desc.c_str(), location_name);
|
|
player->SetSpawnType(4);
|
|
player->SetSpawnType(4);
|
|
- if (version > 283) {
|
|
|
|
|
|
+ if (version > 373) {
|
|
packet = configReader.getStruct("WS_CancelMoveObjectMode", GetVersion());
|
|
packet = configReader.getStruct("WS_CancelMoveObjectMode", GetVersion());
|
|
if (packet)
|
|
if (packet)
|
|
{
|
|
{
|
|
@@ -798,7 +800,7 @@ void Client::SendCharInfo() {
|
|
QueuePacket(items->at(i)->serialize(GetVersion(), false, GetPlayer()));
|
|
QueuePacket(items->at(i)->serialize(GetVersion(), false, GetPlayer()));
|
|
}
|
|
}
|
|
safe_delete(items);
|
|
safe_delete(items);
|
|
- if (version > 283) {
|
|
|
|
|
|
+ if (version >= 373) {
|
|
SendTitleUpdate();
|
|
SendTitleUpdate();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -904,7 +906,7 @@ void Client::SendCharInfo() {
|
|
|
|
|
|
void Client::SendZoneSpawns() {
|
|
void Client::SendZoneSpawns() {
|
|
//Allows us to place spawns almost anywhere
|
|
//Allows us to place spawns almost anywhere
|
|
- if (version > 283) {
|
|
|
|
|
|
+ if (version > 373) {
|
|
uchar blah[] = { 0x00,0x3C,0x1C,0x46,0x00,0x3C,0x1C,0x46,0x00,0x3C,0x1C,0x46 };
|
|
uchar blah[] = { 0x00,0x3C,0x1C,0x46,0x00,0x3C,0x1C,0x46,0x00,0x3C,0x1C,0x46 };
|
|
EQ2Packet* app = new EQ2Packet(OP_MoveableObjectPlacementCriteri, blah, sizeof(blah));
|
|
EQ2Packet* app = new EQ2Packet(OP_MoveableObjectPlacementCriteri, blah, sizeof(blah));
|
|
QueuePacket(app);
|
|
QueuePacket(app);
|
|
@@ -1362,7 +1364,7 @@ bool Client::HandlePacket(EQApplicationPacket* app) {
|
|
string name = macro_update->getType_EQ2_8BitString_ByName("name").data;
|
|
string name = macro_update->getType_EQ2_8BitString_ByName("name").data;
|
|
int8 count = macro_update->getType_int8_ByName("macro_count");
|
|
int8 count = macro_update->getType_int8_ByName("macro_count");
|
|
|
|
|
|
- if (GetVersion() <= 283) {
|
|
|
|
|
|
+ if (GetVersion() <= 373) {
|
|
update->push_back(macro_update->getType_EQ2_8BitString_ByName("command").data);
|
|
update->push_back(macro_update->getType_EQ2_8BitString_ByName("command").data);
|
|
}
|
|
}
|
|
else {
|
|
else {
|
|
@@ -2020,7 +2022,7 @@ bool Client::HandlePacket(EQApplicationPacket* app) {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
case OP_PredictionUpdateMsg: {
|
|
case OP_PredictionUpdateMsg: {
|
|
- LogWrite(OPCODE__DEBUG, 1, "Opcode", "Opcode 0x%X (%i): OP_PredictionUpdateMsg", opcode, opcode);
|
|
|
|
|
|
+ LogWrite(OPCODE__DEBUG, 7, "Opcode", "Opcode 0x%X (%i): OP_PredictionUpdateMsg from %s", opcode, opcode, GetPlayer()->GetName());
|
|
if (version <= 561) {
|
|
if (version <= 561) {
|
|
int8 offset = 9;
|
|
int8 offset = 9;
|
|
if (app->pBuffer[0] == 0xFF)
|
|
if (app->pBuffer[0] == 0xFF)
|
|
@@ -2039,6 +2041,11 @@ bool Client::HandlePacket(EQApplicationPacket* app) {
|
|
else
|
|
else
|
|
player->PrepareIncomingMovementPacket(app->size - offset, app->pBuffer + offset, version);
|
|
player->PrepareIncomingMovementPacket(app->size - offset, app->pBuffer + offset, version);
|
|
player_pos_changed = true;
|
|
player_pos_changed = true;
|
|
|
|
+
|
|
|
|
+ GetPlayer()->changed = true;
|
|
|
|
+ GetPlayer()->info_changed = true;
|
|
|
|
+ GetPlayer()->vis_changed = true;
|
|
|
|
+ GetPlayer()->AddChangedZoneSpawn();
|
|
//DumpPacket(app);
|
|
//DumpPacket(app);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -2071,7 +2078,7 @@ bool Client::HandlePacket(EQApplicationPacket* app) {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
case OP_UpdatePositionMsg: {
|
|
case OP_UpdatePositionMsg: {
|
|
- LogWrite(OPCODE__DEBUG, 7, "Opcode", "Opcode 0x%X (%i): OP_UpdatePositionMsg", opcode, opcode);
|
|
|
|
|
|
+ LogWrite(OPCODE__DEBUG, 7, "Opcode", "Opcode 0x%X (%i): OP_UpdatePositionMsg from %s", opcode, opcode, GetPlayer()->GetName());
|
|
int8 offset = 13;
|
|
int8 offset = 13;
|
|
if (app->pBuffer[0] == 0xFF)
|
|
if (app->pBuffer[0] == 0xFF)
|
|
offset += 2;
|
|
offset += 2;
|
|
@@ -2089,6 +2096,11 @@ bool Client::HandlePacket(EQApplicationPacket* app) {
|
|
else
|
|
else
|
|
player->PrepareIncomingMovementPacket(app->size - offset, app->pBuffer + offset, version);
|
|
player->PrepareIncomingMovementPacket(app->size - offset, app->pBuffer + offset, version);
|
|
player_pos_changed = true;
|
|
player_pos_changed = true;
|
|
|
|
+
|
|
|
|
+ GetPlayer()->changed = true;
|
|
|
|
+ GetPlayer()->info_changed = true;
|
|
|
|
+ GetPlayer()->vis_changed = true;
|
|
|
|
+ GetPlayer()->AddChangedZoneSpawn();
|
|
LogWrite(CCLIENT__PACKET, 0, "Client", "Dump/Print Packet in func: %s, line: %i", __FUNCTION__, __LINE__);
|
|
LogWrite(CCLIENT__PACKET, 0, "Client", "Dump/Print Packet in func: %s, line: %i", __FUNCTION__, __LINE__);
|
|
//DumpPacket(app);
|
|
//DumpPacket(app);
|
|
}
|
|
}
|
|
@@ -2542,28 +2554,43 @@ bool Client::HandlePacket(EQApplicationPacket* app) {
|
|
PacketStruct* packet = configReader.getStruct("WS_QuestJournalWaypoint", GetVersion());
|
|
PacketStruct* packet = configReader.getStruct("WS_QuestJournalWaypoint", GetVersion());
|
|
if (packet) {
|
|
if (packet) {
|
|
if(packet->LoadPacketData(app->pBuffer, app->size)) {
|
|
if(packet->LoadPacketData(app->pBuffer, app->size)) {
|
|
- int32 quests = packet->getType_int32_ByName("num_quests");
|
|
|
|
-
|
|
|
|
- if (quests > 100) // just picking a number higher than max allowed
|
|
|
|
- {
|
|
|
|
- LogWrite(CCLIENT__ERROR, 0, "Client", "num_quests = %u - quantity too high, aborting load.", quests);
|
|
|
|
- break;
|
|
|
|
|
|
+ if(GetVersion() <= 561) {
|
|
|
|
+ int32 quest_id = packet->getType_int32_ByName("quest_id");
|
|
|
|
+ GetPlayer()->MPlayerQuests.writelock(__FUNCTION__, __LINE__);
|
|
|
|
+ if (player->player_quests.count(quest_id) > 0 && player->player_quests[quest_id]) {
|
|
|
|
+ if(player->player_quests[quest_id]->GetTracked())
|
|
|
|
+ player->player_quests[quest_id]->SetTracked(false);
|
|
|
|
+ else
|
|
|
|
+ player->player_quests[quest_id]->SetTracked(true);
|
|
|
|
+
|
|
|
|
+ player->player_quests[quest_id]->SetSaveNeeded(true);
|
|
|
|
+ }
|
|
|
|
+ GetPlayer()->MPlayerQuests.releasewritelock(__FUNCTION__, __LINE__);
|
|
}
|
|
}
|
|
|
|
+ else {
|
|
|
|
+ int32 quests = packet->getType_int32_ByName("num_quests");
|
|
|
|
|
|
- LogWrite(CCLIENT__DEBUG, 0, "Client", "num_quests = %u", quests);
|
|
|
|
|
|
+ if (quests > 100) // just picking a number higher than max allowed
|
|
|
|
+ {
|
|
|
|
+ LogWrite(CCLIENT__ERROR, 0, "Client", "num_quests = %u - quantity too high, aborting load.", quests);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
|
|
- for (int32 i = 0; i < quests; i++) {
|
|
|
|
- int32 id = packet->getType_int32_ByName("quest_id_0", i);
|
|
|
|
- if (id == 0)
|
|
|
|
- continue;
|
|
|
|
- LogWrite(CCLIENT__DEBUG, 5, "Client", "quest_id = %u", id);
|
|
|
|
- bool tracked = packet->getType_int8_ByName("quest_tracked_0", i) == 1 ? true : false;
|
|
|
|
- GetPlayer()->MPlayerQuests.writelock(__FUNCTION__, __LINE__);
|
|
|
|
- if (player->player_quests.count(id) > 0 && player->player_quests[id]) {
|
|
|
|
- player->player_quests[id]->SetTracked(tracked);
|
|
|
|
- player->player_quests[id]->SetSaveNeeded(true);
|
|
|
|
|
|
+ LogWrite(CCLIENT__DEBUG, 0, "Client", "num_quests = %u", quests);
|
|
|
|
+
|
|
|
|
+ for (int32 i = 0; i < quests; i++) {
|
|
|
|
+ int32 id = packet->getType_int32_ByName("quest_id_0", i);
|
|
|
|
+ if (id == 0)
|
|
|
|
+ continue;
|
|
|
|
+ LogWrite(CCLIENT__DEBUG, 5, "Client", "quest_id = %u", id);
|
|
|
|
+ bool tracked = packet->getType_int8_ByName("quest_tracked_0", i) == 1 ? true : false;
|
|
|
|
+ GetPlayer()->MPlayerQuests.writelock(__FUNCTION__, __LINE__);
|
|
|
|
+ if (player->player_quests.count(id) > 0 && player->player_quests[id]) {
|
|
|
|
+ player->player_quests[id]->SetTracked(tracked);
|
|
|
|
+ player->player_quests[id]->SetSaveNeeded(true);
|
|
|
|
+ }
|
|
|
|
+ GetPlayer()->MPlayerQuests.releasewritelock(__FUNCTION__, __LINE__);
|
|
}
|
|
}
|
|
- GetPlayer()->MPlayerQuests.releasewritelock(__FUNCTION__, __LINE__);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
safe_delete(packet);
|
|
safe_delete(packet);
|
|
@@ -3146,11 +3173,11 @@ void Client::HandleExamineInfoRequest(EQApplicationPacket* app) {
|
|
if (!app || app->size == 0)
|
|
if (!app || app->size == 0)
|
|
return;
|
|
return;
|
|
//LogWrite(CCLIENT__DEBUG, 0, "Client", "Request2:");
|
|
//LogWrite(CCLIENT__DEBUG, 0, "Client", "Request2:");
|
|
- //DumpPacket(app);
|
|
|
|
|
|
|
|
int8 type = app->pBuffer[0];
|
|
int8 type = app->pBuffer[0];
|
|
|
|
+ DumpPacket(app->pBuffer,app->size);
|
|
//283: item: 0, effect: 1, recipe: 2, spell: 3
|
|
//283: item: 0, effect: 1, recipe: 2, spell: 3
|
|
- if (version <= 283) {
|
|
|
|
|
|
+ if (version <= 373) {
|
|
if (type == 1)
|
|
if (type == 1)
|
|
type = 4;
|
|
type = 4;
|
|
else if (type == 2)
|
|
else if (type == 2)
|
|
@@ -3160,7 +3187,7 @@ void Client::HandleExamineInfoRequest(EQApplicationPacket* app) {
|
|
Spell* spell = 0;
|
|
Spell* spell = 0;
|
|
bool trait_display;
|
|
bool trait_display;
|
|
|
|
|
|
- request = configReader.getStruct((GetVersion() <= 283) ? "WS_ExamineInfoRequest" : "WS_ExamineInfoRequestMsg", GetVersion());
|
|
|
|
|
|
+ request = configReader.getStruct((GetVersion() <= 373) ? "WS_ExamineInfoRequest" : "WS_ExamineInfoRequestMsg", GetVersion());
|
|
if (!request) {
|
|
if (!request) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
@@ -3173,14 +3200,14 @@ void Client::HandleExamineInfoRequest(EQApplicationPacket* app) {
|
|
int32 tier = request->getType_int32_ByName("tier");
|
|
int32 tier = request->getType_int32_ByName("tier");
|
|
int32 trait_tier = request->getType_int32_ByName("unknown_id");
|
|
int32 trait_tier = request->getType_int32_ByName("unknown_id");
|
|
bool display = true;
|
|
bool display = true;
|
|
- if (version <= 283 && request->getType_int8_ByName("display") == 1) // this is really requesting a partial packet
|
|
|
|
|
|
+ if (version <= 373 && request->getType_int8_ByName("display") == 1) // this is really requesting a partial packet
|
|
display = false;
|
|
display = false;
|
|
else if (version <= 561)
|
|
else if (version <= 561)
|
|
display = request->getType_int8_ByName("display");
|
|
display = request->getType_int8_ByName("display");
|
|
else if (version > 561)
|
|
else if (version > 561)
|
|
display = false; // clients default is false otherwise it pops up a window when hovering over the knowledge book abilities
|
|
display = false; // clients default is false otherwise it pops up a window when hovering over the knowledge book abilities
|
|
-
|
|
|
|
- //printf("Type: (%i) Tier: (%u) Unknown ID: (%u) Item ID: (%u)\n",type,tier,trait_tier,id);
|
|
|
|
|
|
+
|
|
|
|
+ LogWrite(CCLIENT__DEBUG, 5, "Client", "Client::HandleExamineInfoRequest from %s: Type: (%i) Tier: (%u) Unknown ID: (%u) Item ID: (%u)",GetPlayer()->GetName(),type,tier,trait_tier,id);
|
|
|
|
|
|
if (trait_tier != 0xFFFFFFFF) {
|
|
if (trait_tier != 0xFFFFFFFF) {
|
|
spell = master_spell_list.GetSpell(id, trait_tier);
|
|
spell = master_spell_list.GetSpell(id, trait_tier);
|
|
@@ -3204,6 +3231,12 @@ void Client::HandleExamineInfoRequest(EQApplicationPacket* app) {
|
|
lua_interface->FindCustomSpellUnlock();
|
|
lua_interface->FindCustomSpellUnlock();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if(!spell) { // fix ui timeout for classic, isle of refuge, dof, kos clients
|
|
|
|
+ int8 playerTier = GetPlayer()->GetSpellTier(id);
|
|
|
|
+ spell = master_spell_list.GetSpell(id, playerTier);
|
|
|
|
+ LogWrite(CCLIENT__WARNING, 0, "Client", "Client::HandleExamineInfoRequest from %s: Failed to find tier 1 spell. Last resort try to get the spell from the player book, spell %u, tier %u", GetPlayer()->GetName(),id,playerTier);
|
|
|
|
+ }
|
|
|
|
+
|
|
if (spell && !CountSentSpell(spell->GetSpellID(), spell->GetSpellTier())) {
|
|
if (spell && !CountSentSpell(spell->GetSpellID(), spell->GetSpellTier())) {
|
|
if (!spell->IsCopiedSpell())
|
|
if (!spell->IsCopiedSpell())
|
|
SetSentSpell(spell->GetSpellID(), spell->GetSpellTier());
|
|
SetSentSpell(spell->GetSpellID(), spell->GetSpellTier());
|
|
@@ -3217,6 +3250,9 @@ void Client::HandleExamineInfoRequest(EQApplicationPacket* app) {
|
|
//DumpPacket(app);
|
|
//DumpPacket(app);
|
|
QueuePacket(app);
|
|
QueuePacket(app);
|
|
}
|
|
}
|
|
|
|
+ else {
|
|
|
|
+ LogWrite(CCLIENT__ERROR, 0, "Client", "Client::HandleExamineInfoRequest from %s: Failed to successfully send Type: (%i) Tier: (%u) Unknown ID: (%u) Item ID: (%u)",GetPlayer()->GetName(),type,tier,trait_tier,id);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
else if (type == 0) {
|
|
else if (type == 0) {
|
|
request = configReader.getStruct("WS_ExamineInfoItemRequest", GetVersion());
|
|
request = configReader.getStruct("WS_ExamineInfoItemRequest", GetVersion());
|
|
@@ -3312,6 +3348,8 @@ void Client::HandleExamineInfoRequest(EQApplicationPacket* app) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
int32 id = request->getType_int32_ByName("item_id");
|
|
int32 id = request->getType_int32_ByName("item_id");
|
|
|
|
+
|
|
|
|
+ LogWrite(CCLIENT__DEBUG, 5, "Client", "Client::HandleExamineInfoRequest from %s: Found Type: (%i) Item ID: (%u)",GetPlayer()->GetName(),type,id);
|
|
//int32 unknown_0 = request->getType_int32_ByName("unknown",0);
|
|
//int32 unknown_0 = request->getType_int32_ByName("unknown",0);
|
|
//int32 unknown_1 = request->getType_int32_ByName("unknown",1);
|
|
//int32 unknown_1 = request->getType_int32_ByName("unknown",1);
|
|
//int8 unknown2 = request->getType_int8_ByName("unknown2");
|
|
//int8 unknown2 = request->getType_int8_ByName("unknown2");
|
|
@@ -3344,6 +3382,7 @@ void Client::HandleExamineInfoRequest(EQApplicationPacket* app) {
|
|
SpellEffects* effect = player->GetSpellEffect(id);
|
|
SpellEffects* effect = player->GetSpellEffect(id);
|
|
//printf("Type: (%i) Unknown5: (%i) Item ID: (%u)\n",type,unknown5,id);
|
|
//printf("Type: (%i) Unknown5: (%i) Item ID: (%u)\n",type,unknown5,id);
|
|
if (effect) {
|
|
if (effect) {
|
|
|
|
+ LogWrite(CCLIENT__DEBUG, 5, "Client", "Client::HandleExamineInfoRequest from %s: Found Type: (%i) Item ID: (%u)",GetPlayer()->GetName(),type,id);
|
|
int8 tier = effect->tier;
|
|
int8 tier = effect->tier;
|
|
Spell* spell = master_spell_list.GetSpell(id, tier);
|
|
Spell* spell = master_spell_list.GetSpell(id, tier);
|
|
|
|
|
|
@@ -3358,20 +3397,23 @@ void Client::HandleExamineInfoRequest(EQApplicationPacket* app) {
|
|
lua_interface->FindCustomSpellUnlock();
|
|
lua_interface->FindCustomSpellUnlock();
|
|
}
|
|
}
|
|
|
|
|
|
- if (spell && !CountSentSpell(id, tier)) {
|
|
|
|
|
|
+ if (spell && (version <= 561 || !CountSentSpell(id, tier))) { // fix DoF and KoS clients UI Timeout
|
|
if (!spell->IsCopiedSpell())
|
|
if (!spell->IsCopiedSpell())
|
|
SetSentSpell(spell->GetSpellID(), spell->GetSpellTier());
|
|
SetSentSpell(spell->GetSpellID(), spell->GetSpellTier());
|
|
int8 type = 0;
|
|
int8 type = 0;
|
|
- if (version <= 283)
|
|
|
|
|
|
+ if (version <= 373)
|
|
type = 1;
|
|
type = 1;
|
|
EQ2Packet* app = spell->SerializeSpecialSpell(this, false, type, 0x81);
|
|
EQ2Packet* app = spell->SerializeSpecialSpell(this, false, type, 0x81);
|
|
//DumpPacket(app);
|
|
//DumpPacket(app);
|
|
QueuePacket(app);
|
|
QueuePacket(app);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ else {
|
|
|
|
+ LogWrite(CCLIENT__ERROR, 0, "Client", "Client::HandleExamineInfoRequest from %s: Cannot Find Type: (%i) Item ID: (%u)",GetPlayer()->GetName(),type,id);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
else if (type == 5) { // recipe info
|
|
else if (type == 5) { // recipe info
|
|
- request = configReader.getStruct((GetVersion() <= 283) ? "WS_ExamineInfoRequest" : "WS_ExamineInfoRequestMsg", GetVersion());
|
|
|
|
|
|
+ request = configReader.getStruct((GetVersion() <= 373) ? "WS_ExamineInfoRequest" : "WS_ExamineInfoRequestMsg", GetVersion());
|
|
if (!request)
|
|
if (!request)
|
|
return;
|
|
return;
|
|
if(!request->LoadPacketData(app->pBuffer, app->size)) {
|
|
if(!request->LoadPacketData(app->pBuffer, app->size)) {
|
|
@@ -3401,7 +3443,7 @@ void Client::HandleExamineInfoRequest(EQApplicationPacket* app) {
|
|
Spell* spell = 0;
|
|
Spell* spell = 0;
|
|
//Spell* spell2 = 0;
|
|
//Spell* spell2 = 0;
|
|
//AltAdvanceData* data = 0;
|
|
//AltAdvanceData* data = 0;
|
|
- request = configReader.getStruct((GetVersion() <= 283) ? "WS_ExamineInfoRequest" : "WS_ExamineInfoRequestMsg", GetVersion());
|
|
|
|
|
|
+ request = configReader.getStruct((GetVersion() <= 373) ? "WS_ExamineInfoRequest" : "WS_ExamineInfoRequestMsg", GetVersion());
|
|
if (!request)
|
|
if (!request)
|
|
return;
|
|
return;
|
|
if(!request->LoadPacketData(app->pBuffer, app->size)) {
|
|
if(!request->LoadPacketData(app->pBuffer, app->size)) {
|
|
@@ -3430,7 +3472,7 @@ void Client::HandleExamineInfoRequest(EQApplicationPacket* app) {
|
|
|
|
|
|
if (!spell)
|
|
if (!spell)
|
|
{
|
|
{
|
|
- LogWrite(WORLD__ERROR, 0, "WORLD", "FAILED Examine Info Request-> Spell ID: %u, tier: %i", id, tier);
|
|
|
|
|
|
+ LogWrite(CCLIENT__ERROR, 0, "Client", "WORLD", "Client::HandleExamineInfoRequest from %s: FAILED Examine Info Request-> Spell ID: %u, tier: %i", GetPlayer()->GetName(), id, tier);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3448,7 +3490,7 @@ void Client::HandleExamineInfoRequest(EQApplicationPacket* app) {
|
|
//}
|
|
//}
|
|
}
|
|
}
|
|
else {
|
|
else {
|
|
- LogWrite(WORLD__ERROR, 0, "World", "Unknown examine request: %i", (int)type);
|
|
|
|
|
|
+ LogWrite(CCLIENT__ERROR, 0, "World", "Client::HandleExamineInfoRequest from %s: Unknown examine request: %i", GetPlayer()->GetName(), (int)type);
|
|
DumpPacket(app);
|
|
DumpPacket(app);
|
|
}
|
|
}
|
|
safe_delete(request);
|
|
safe_delete(request);
|
|
@@ -3658,7 +3700,20 @@ bool Client::Process(bool zone_process) {
|
|
if(GetPlayer()->GetRegionMap())
|
|
if(GetPlayer()->GetRegionMap())
|
|
GetPlayer()->GetRegionMap()->TicRegionsNearSpawn(this->GetPlayer(), regionDebugMessaging ? this : nullptr);
|
|
GetPlayer()->GetRegionMap()->TicRegionsNearSpawn(this->GetPlayer(), regionDebugMessaging ? this : nullptr);
|
|
|
|
|
|
|
|
+ if(!player_pos_changed && IsReadyForUpdates() && player_pos_timer < Timer::GetCurrentTime2() && enabled_player_pos_timer) {
|
|
|
|
+ if(version > 373) {
|
|
|
|
+ GetPlayer()->info_changed = true;
|
|
|
|
+ GetPlayer()->vis_changed = true;
|
|
|
|
+ GetPlayer()->position_changed = true;
|
|
|
|
+ GetPlayer()->changed = true;
|
|
|
|
+ GetPlayer()->AddChangedZoneSpawn();
|
|
|
|
+ }
|
|
|
|
+ player_pos_timer = Timer::GetCurrentTime2()+5000;
|
|
|
|
+ enabled_player_pos_timer = false;
|
|
|
|
+ }
|
|
if(player_pos_changed && IsReadyForUpdates()) {
|
|
if(player_pos_changed && IsReadyForUpdates()) {
|
|
|
|
+ player_pos_timer = Timer::GetCurrentTime2()+500;
|
|
|
|
+ enabled_player_pos_timer = true;
|
|
if(!underworld_cooldown_timer.Enabled() || (underworld_cooldown_timer.Enabled() && underworld_cooldown_timer.Check())) {
|
|
if(!underworld_cooldown_timer.Enabled() || (underworld_cooldown_timer.Enabled() && underworld_cooldown_timer.Check())) {
|
|
bool underworld = false;
|
|
bool underworld = false;
|
|
if(rule_manager.GetGlobalRule(R_Zone, UseMapUnderworldCoords)->GetBool()) {
|
|
if(rule_manager.GetGlobalRule(R_Zone, UseMapUnderworldCoords)->GetBool()) {
|
|
@@ -3688,7 +3743,6 @@ bool Client::Process(bool zone_process) {
|
|
}
|
|
}
|
|
//GetPlayer()->CalculateLocation();
|
|
//GetPlayer()->CalculateLocation();
|
|
client_list.CheckPlayersInvisStatus(this);
|
|
client_list.CheckPlayersInvisStatus(this);
|
|
- GetCurrentZone()->SendPlayerPositionChanges(GetPlayer());
|
|
|
|
|
|
|
|
player_pos_changed = false;
|
|
player_pos_changed = false;
|
|
|
|
|
|
@@ -4094,6 +4148,79 @@ int8 Client::GetMessageChannelColor(int8 channel_type) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ else if (GetVersion() <= 373) {
|
|
|
|
+ if (channel_type <=18)
|
|
|
|
+ return channel_type;
|
|
|
|
+ switch (channel_type) {
|
|
|
|
+ case CHANNEL_PRIVATE_CHAT:
|
|
|
|
+ case CHANNEL_NONPLAYER_TELL:
|
|
|
|
+ return 22;
|
|
|
|
+ case CHANNEL_PRIVATE_TELL:
|
|
|
|
+ case CHANNEL_TELL_FROM_CS:
|
|
|
|
+ return 23;
|
|
|
|
+ case CHANNEL_CHAT_CHANNEL_TEXT:
|
|
|
|
+ case CHANNEL_OUT_OF_CHARACTER:
|
|
|
|
+ case CHANNEL_CUSTOM_CHANNEL:
|
|
|
|
+ case CHANNEL_CHARACTER_TEXT:
|
|
|
|
+ case CHANNEL_REWARD:
|
|
|
|
+ case CHANNEL_DEATH:
|
|
|
|
+ case CHANNEL_PET_CHAT:
|
|
|
|
+ case CHANNEL_SKILL:
|
|
|
|
+ return 26;
|
|
|
|
+ case CHANNEL_AUCTION:
|
|
|
|
+ return 27;
|
|
|
|
+ case CHANNEL_SPELLS:
|
|
|
|
+ case CHANNEL_YOU_CAST:
|
|
|
|
+ case CHANNEL_YOU_FAIL:
|
|
|
|
+ return channel_type - 8;
|
|
|
|
+ case CHANNEL_FRIENDLY_CAST:
|
|
|
|
+ case CHANNEL_FRIENDLY_FAIL:
|
|
|
|
+ case CHANNEL_OTHER_CAST:
|
|
|
|
+ case CHANNEL_OTHER_FAIL:
|
|
|
|
+ case CHANNEL_HOSTILE_CAST:
|
|
|
|
+ case CHANNEL_HOSTILE_FAIL:
|
|
|
|
+ case CHANNEL_WORN_OFF:
|
|
|
|
+ case CHANNEL_SPELLS_OTHER:
|
|
|
|
+ return channel_type - 9;
|
|
|
|
+ case CHANNEL_COMBAT:
|
|
|
|
+ return channel_type - 15;
|
|
|
|
+ case CHANNEL_HEROIC_OPPORTUNITY:
|
|
|
|
+ case CHANNEL_NON_MELEE_DAMAGE:
|
|
|
|
+ case CHANNEL_DAMAGE_SHIELD:
|
|
|
|
+ return channel_type - 16;
|
|
|
|
+ case CHANNEL_MELEE_COMBAT:
|
|
|
|
+ case CHANNEL_WARNINGS:
|
|
|
|
+ case CHANNEL_YOU_HIT:
|
|
|
|
+ case CHANNEL_YOU_MISS:
|
|
|
|
+ case CHANNEL_ATTACKER_HITS:
|
|
|
|
+ case CHANNEL_ATTACKER_MISSES:
|
|
|
|
+ return channel_type - 18;
|
|
|
|
+ case CHANNEL_OTHER_HIT:
|
|
|
|
+ case CHANNEL_OTHER_MISSES:
|
|
|
|
+ case CHANNEL_CRITICAL_HIT:
|
|
|
|
+ return channel_type - 22;
|
|
|
|
+ case CHANNEL_OTHER:
|
|
|
|
+ case CHANNEL_MONEY_SPLIT:
|
|
|
|
+ case CHANNEL_LOOT:
|
|
|
|
+ return channel_type - 30;
|
|
|
|
+ case CHANNEL_COMMAND_TEXT:
|
|
|
|
+ case CHANNEL_BROADCAST:
|
|
|
|
+ case CHANNEL_WHO:
|
|
|
|
+ case CHANNEL_COMMANDS:
|
|
|
|
+ case CHANNEL_MERCHANT:
|
|
|
|
+ case CHANNEL_MERCHANT_BUY_SELL:
|
|
|
|
+ case CHANNEL_CONSIDER_MESSAGE:
|
|
|
|
+ case CHANNEL_CON_MINUS_2:
|
|
|
|
+ case CHANNEL_CON_MINUS_1:
|
|
|
|
+ case CHANNEL_CON_0:
|
|
|
|
+ case CHANNEL_CON_1:
|
|
|
|
+ case CHANNEL_CON_2:
|
|
|
|
+ return 68;
|
|
|
|
+ default: {
|
|
|
|
+ return CHANNEL_DEFAULT;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
else if (GetVersion() <= 561) {
|
|
else if (GetVersion() <= 561) {
|
|
if (channel_type < 20)
|
|
if (channel_type < 20)
|
|
return channel_type;
|
|
return channel_type;
|
|
@@ -4674,6 +4801,13 @@ void Client::Zone(ZoneServer* new_zone, bool set_coords, bool is_spell) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if(GetVersion() == 373 && GetAdminStatus() == 0) {
|
|
|
|
+ if(strncasecmp(new_zone->GetZoneFile(),"boat_06p_tutorial02",19) && strncasecmp(new_zone->GetZoneFile(),"tutorial_island02",17)) {
|
|
|
|
+ SimpleMessage(CHANNEL_COLOR_RED, "This client does not currently support beyond the boat tutorial (farjourneyfreeport) or island of refuge (islerefuge1)");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
client_zoning = true;
|
|
client_zoning = true;
|
|
zoning_id = new_zone->GetZoneID();
|
|
zoning_id = new_zone->GetZoneID();
|
|
zoning_instance_id = new_zone->GetInstanceID();
|
|
zoning_instance_id = new_zone->GetInstanceID();
|
|
@@ -4748,7 +4882,7 @@ void Client::Zone(ZoneServer* new_zone, bool set_coords, bool is_spell) {
|
|
|
|
|
|
LogWrite(CCLIENT__DEBUG, 0, "Client", "%s: Sending to zone_auth.AddAuth...", __FUNCTION__);
|
|
LogWrite(CCLIENT__DEBUG, 0, "Client", "%s: Sending to zone_auth.AddAuth...", __FUNCTION__);
|
|
zone_auth.AddAuth(new ZoneAuthRequest(GetAccountID(), player->GetName(), key));
|
|
zone_auth.AddAuth(new ZoneAuthRequest(GetAccountID(), player->GetName(), key));
|
|
- if (version > 283) {
|
|
|
|
|
|
+ if (version > 373) {
|
|
PacketStruct* packet = configReader.getStruct("WS_CancelMoveObjectMode", version);
|
|
PacketStruct* packet = configReader.getStruct("WS_CancelMoveObjectMode", version);
|
|
if (packet)
|
|
if (packet)
|
|
{
|
|
{
|
|
@@ -5074,9 +5208,9 @@ void Client::ChangeLevel(int16 old_level, int16 new_level) {
|
|
LogWrite(MISC__TODO, 1, "TODO", "Get new HP/POWER/stat based on default values from DB\n\t(%s, function: %s, line #: %i)", __FILE__, __FUNCTION__, __LINE__);
|
|
LogWrite(MISC__TODO, 1, "TODO", "Get new HP/POWER/stat based on default values from DB\n\t(%s, function: %s, line #: %i)", __FILE__, __FUNCTION__, __LINE__);
|
|
|
|
|
|
GetPlayer()->SetTotalHPBase(new_level * new_level * 2 + 40);
|
|
GetPlayer()->SetTotalHPBase(new_level * new_level * 2 + 40);
|
|
- GetPlayer()->SetTotalHPBaseInstance(GetPlayer()->GetTotalHPBaseInstance());
|
|
|
|
|
|
+ GetPlayer()->SetTotalHPBaseInstance(GetPlayer()->GetTotalHPBase()); // we need the hp base to override the instance as the new default
|
|
GetPlayer()->SetTotalPowerBase((sint32)(new_level * new_level * 2.1 + 45));
|
|
GetPlayer()->SetTotalPowerBase((sint32)(new_level * new_level * 2.1 + 45));
|
|
- GetPlayer()->SetTotalPowerBaseInstance(GetPlayer()->GetTotalPowerBaseInstance());
|
|
|
|
|
|
+ GetPlayer()->SetTotalPowerBaseInstance(GetPlayer()->GetTotalPowerBase()); // we need the hp base to override the instance as the new default
|
|
GetPlayer()->CalculateBonuses();
|
|
GetPlayer()->CalculateBonuses();
|
|
GetPlayer()->SetHP(GetPlayer()->GetTotalHP());
|
|
GetPlayer()->SetHP(GetPlayer()->GetTotalHP());
|
|
GetPlayer()->SetPower(GetPlayer()->GetTotalPower());
|
|
GetPlayer()->SetPower(GetPlayer()->GetTotalPower());
|
|
@@ -5518,7 +5652,7 @@ void Client::SendLootResponsePacket(int32 total_coins, vector<Item*>* items, Spa
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if (GetVersion() >= 284) {
|
|
|
|
|
|
+ if (GetVersion() >= 374) {
|
|
if (GetVersion() > 561) {
|
|
if (GetVersion() > 561) {
|
|
if (send_items.size() > 0) {
|
|
if (send_items.size() > 0) {
|
|
packet->setDataByName("loot_count", send_items.size());
|
|
packet->setDataByName("loot_count", send_items.size());
|
|
@@ -5617,10 +5751,10 @@ void Client::SendLootResponsePacket(int32 total_coins, vector<Item*>* items, Spa
|
|
packet->setArrayDataByName("ability_id", 0xFFFFFFFF, i);
|
|
packet->setArrayDataByName("ability_id", 0xFFFFFFFF, i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ packet->setDataByName("display", 1);
|
|
|
|
+ packet->setDataByName("loot_type", entity->GetLootMethod()); // normal
|
|
|
|
+ packet->setDataByName("lotto_timeout", entity->GetLootTimeRemaining() / 1000); // 60 seconds
|
|
packet->setDataByName("object_id", entity->GetID());
|
|
packet->setDataByName("object_id", entity->GetID());
|
|
- packet->setDataByName("unknown3", 1);
|
|
|
|
- packet->setDataByName("unknown4", 1);
|
|
|
|
- packet->setDataByName("unknown5", 60);
|
|
|
|
outapp = packet->serialize();
|
|
outapp = packet->serialize();
|
|
}
|
|
}
|
|
if (outapp) {
|
|
if (outapp) {
|
|
@@ -6525,7 +6659,7 @@ void Client::CheckPlayerQuestsSpellUpdate(Spell* spell) {
|
|
}
|
|
}
|
|
|
|
|
|
void Client::AddPendingQuest(Quest* quest, bool forced) {
|
|
void Client::AddPendingQuest(Quest* quest, bool forced) {
|
|
- if (version <= 283 || forced) { //this client doesn't ask if you want the quest, so auto accept
|
|
|
|
|
|
+ if (version <= 372 || forced) { //this client doesn't ask if you want the quest, so auto accept
|
|
MPendingQuestAccept.lock();
|
|
MPendingQuestAccept.lock();
|
|
player->pending_quests[quest->GetQuestID()] = quest;
|
|
player->pending_quests[quest->GetQuestID()] = quest;
|
|
MPendingQuestAccept.unlock();
|
|
MPendingQuestAccept.unlock();
|
|
@@ -6972,7 +7106,7 @@ void Client::DisplayQuestRewards(Quest* quest, int64 coin, vector<Item*>* reward
|
|
Item* item = rewards->at(i);
|
|
Item* item = rewards->at(i);
|
|
if (item) {
|
|
if (item) {
|
|
packet2->setArrayDataByName("reward_id", item->details.item_id, i);
|
|
packet2->setArrayDataByName("reward_id", item->details.item_id, i);
|
|
- packet2->setItemArrayDataByName("item", item, player, i, 0, -1);
|
|
|
|
|
|
+ packet2->setItemArrayDataByName("item", item, player, i, 0, GetClientItemPacketOffset());
|
|
}
|
|
}
|
|
if(!quest) //this entire function is either for version <=561 or for quest rewards in middle of quest, so quest should be 0, otherwise quest will handle the rewards
|
|
if(!quest) //this entire function is either for version <=561 or for quest rewards in middle of quest, so quest should be 0, otherwise quest will handle the rewards
|
|
player->AddPendingItemReward(item); //item reference will be deleted after the player accepts it
|
|
player->AddPendingItemReward(item); //item reference will be deleted after the player accepts it
|
|
@@ -6983,7 +7117,7 @@ void Client::DisplayQuestRewards(Quest* quest, int64 coin, vector<Item*>* reward
|
|
Item* item = items.at(j);
|
|
Item* item = items.at(j);
|
|
if (item) {
|
|
if (item) {
|
|
packet2->setArrayDataByName("reward_id", item->details.item_id, i);
|
|
packet2->setArrayDataByName("reward_id", item->details.item_id, i);
|
|
- packet2->setItemArrayDataByName("item", item, player, i, 0, -1);
|
|
|
|
|
|
+ packet2->setItemArrayDataByName("item", item, player, i, 0, GetClientItemPacketOffset());
|
|
}
|
|
}
|
|
if(!quest) //this entire function is either for version <=561 or for quest rewards in middle of quest, so quest should be 0, otherwise quest will handle the rewards
|
|
if(!quest) //this entire function is either for version <=561 or for quest rewards in middle of quest, so quest should be 0, otherwise quest will handle the rewards
|
|
player->AddPendingItemReward(item); //item reference will be deleted after the player accepts it
|
|
player->AddPendingItemReward(item); //item reference will be deleted after the player accepts it
|
|
@@ -6997,7 +7131,7 @@ void Client::DisplayQuestRewards(Quest* quest, int64 coin, vector<Item*>* reward
|
|
Item* item = selectable_rewards->at(i);
|
|
Item* item = selectable_rewards->at(i);
|
|
if (item) {
|
|
if (item) {
|
|
packet2->setArrayDataByName("select_reward_id", item->details.item_id, i);
|
|
packet2->setArrayDataByName("select_reward_id", item->details.item_id, i);
|
|
- packet2->setItemArrayDataByName("select_item", item, player, i, 0, -1);
|
|
|
|
|
|
+ packet2->setItemArrayDataByName("select_item", item, player, i, 0, GetClientItemPacketOffset());
|
|
if (!quest) //this entire function is either for version <=561 or for quest rewards in middle of quest, so quest should be 0, otherwise quest will handle the rewards
|
|
if (!quest) //this entire function is either for version <=561 or for quest rewards in middle of quest, so quest should be 0, otherwise quest will handle the rewards
|
|
player->AddPendingSelectableItemReward(source_id, item); //item reference will be deleted after the player selects one
|
|
player->AddPendingSelectableItemReward(source_id, item); //item reference will be deleted after the player selects one
|
|
}
|
|
}
|
|
@@ -7056,7 +7190,7 @@ void Client::PopulateQuestRewardItems(vector <Item*>* items, PacketStruct* packe
|
|
for (int32 i = 0; i < items->size();) {
|
|
for (int32 i = 0; i < items->size();) {
|
|
packet->setArrayDataByName(reward_id_str.c_str(), items->at(i)->details.item_id, pos);
|
|
packet->setArrayDataByName(reward_id_str.c_str(), items->at(i)->details.item_id, pos);
|
|
if (version < 860)
|
|
if (version < 860)
|
|
- packet->setItemArrayDataByName(item_str.c_str(), items->at(i), player, pos, 0, -1);
|
|
|
|
|
|
+ packet->setItemArrayDataByName(item_str.c_str(), items->at(i), player, pos, 0, GetClientItemPacketOffset());
|
|
else if (version < 1193)
|
|
else if (version < 1193)
|
|
packet->setItemArrayDataByName(item_str.c_str(), items->at(i), player, pos);
|
|
packet->setItemArrayDataByName(item_str.c_str(), items->at(i), player, pos);
|
|
else
|
|
else
|
|
@@ -8361,11 +8495,14 @@ void Client::SendBuyMerchantList(bool sell) {
|
|
packet->setArrayDataByName("station_cash", ItemInfo.price_stationcash, i);
|
|
packet->setArrayDataByName("station_cash", ItemInfo.price_stationcash, i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if (GetVersion() <= 561) {
|
|
|
|
|
|
+ if (GetVersion() < 561) {
|
|
//buy is 0 so dont need to set it
|
|
//buy is 0 so dont need to set it
|
|
if (sell)
|
|
if (sell)
|
|
packet->setDataByName("type", 1);
|
|
packet->setDataByName("type", 1);
|
|
}
|
|
}
|
|
|
|
+ else if (GetVersion() == 561) {
|
|
|
|
+ packet->setDataByName("type", 2);
|
|
|
|
+ }
|
|
else {
|
|
else {
|
|
if (sell)
|
|
if (sell)
|
|
packet->setDataByName("type", 130);
|
|
packet->setDataByName("type", 130);
|
|
@@ -8508,9 +8645,12 @@ void Client::SendSellMerchantList(bool sell) {
|
|
if (GetVersion() <= 1096)
|
|
if (GetVersion() <= 1096)
|
|
packet->setArrayDataByName("description", item->description.c_str(), i);
|
|
packet->setArrayDataByName("description", item->description.c_str(), i);
|
|
}
|
|
}
|
|
- if (GetVersion() <= 561) {
|
|
|
|
|
|
+ if (GetVersion() < 561) {
|
|
packet->setDataByName("type", 1);
|
|
packet->setDataByName("type", 1);
|
|
}
|
|
}
|
|
|
|
+ else if(GetVersion() == 561) {
|
|
|
|
+ packet->setDataByName("type", 1);
|
|
|
|
+ }
|
|
else {
|
|
else {
|
|
if (sell)
|
|
if (sell)
|
|
packet->setDataByName("type", 129);
|
|
packet->setDataByName("type", 129);
|
|
@@ -8974,7 +9114,7 @@ void Client::SendMailList() {
|
|
{
|
|
{
|
|
item->stack_count = mail->stack > 1 ? mail->stack : 0;
|
|
item->stack_count = mail->stack > 1 ? mail->stack : 0;
|
|
if (version < 860)
|
|
if (version < 860)
|
|
- p->setItemArrayDataByName("item", item, player, i, 0, -1);
|
|
|
|
|
|
+ p->setItemArrayDataByName("item", item, player, i, 0, GetClientItemPacketOffset());
|
|
else if (version < 1193)
|
|
else if (version < 1193)
|
|
p->setItemArrayDataByName("item", item, player, i);
|
|
p->setItemArrayDataByName("item", item, player, i);
|
|
else
|
|
else
|
|
@@ -9055,7 +9195,7 @@ void Client::DisplayMailMessage(int32 mail_id) {
|
|
Item* item = master_item_list.GetItem(mail->char_item_id);
|
|
Item* item = master_item_list.GetItem(mail->char_item_id);
|
|
item->stack_count = mail->stack > 1 ? mail->stack : 0;
|
|
item->stack_count = mail->stack > 1 ? mail->stack : 0;
|
|
if (version < 860)
|
|
if (version < 860)
|
|
- packet->setItemByName("item", item, player, 0, -1);
|
|
|
|
|
|
+ packet->setItemByName("item", item, player, 0, version <= 373 ? -2 : -1);
|
|
else if (version < 1193)
|
|
else if (version < 1193)
|
|
packet->setItemByName("item", item, player, 0, 0);
|
|
packet->setItemByName("item", item, player, 0, 0);
|
|
else
|
|
else
|
|
@@ -9217,7 +9357,7 @@ bool Client::AddMailItem(Item* item)
|
|
packet->setDataByName("stack", mail_window.stack);
|
|
packet->setDataByName("stack", mail_window.stack);
|
|
item->stack_count = mail_window.stack;
|
|
item->stack_count = mail_window.stack;
|
|
if (version < 860)
|
|
if (version < 860)
|
|
- packet->setItemByName("item", item, player, 0, -1);
|
|
|
|
|
|
+ packet->setItemByName("item", item, player, 0, version <= 373 ? -2 : -1);
|
|
else if (version < 1193)
|
|
else if (version < 1193)
|
|
packet->setItemByName("item", item, player, 0, 0);
|
|
packet->setItemByName("item", item, player, 0, 0);
|
|
else
|
|
else
|
|
@@ -9280,7 +9420,7 @@ bool Client::AddMailCoin(int32 copper, int32 silver, int32 gold, int32 plat) {
|
|
packet->setDataByName("stack", mail_window.stack);
|
|
packet->setDataByName("stack", mail_window.stack);
|
|
item->stack_count = mail_window.stack;
|
|
item->stack_count = mail_window.stack;
|
|
if (version < 860)
|
|
if (version < 860)
|
|
- packet->setItemByName("item", item, player, 0, -1);
|
|
|
|
|
|
+ packet->setItemByName("item", item, player, 0, version <= 373 ? -2 : -1);
|
|
else if (version < 1193)
|
|
else if (version < 1193)
|
|
packet->setItemByName("item", item, player, 0, 0);
|
|
packet->setItemByName("item", item, player, 0, 0);
|
|
else
|
|
else
|
|
@@ -10114,7 +10254,17 @@ void Client::InspectPlayer(Player* player_to_inspect) {
|
|
for (size_t i = 0; i < biography.length(); i++)
|
|
for (size_t i = 0; i < biography.length(); i++)
|
|
packet->setArrayDataByName("biography_char", biography[i], i);
|
|
packet->setArrayDataByName("biography_char", biography[i], i);
|
|
|
|
|
|
- if(GetVersion() <= 561) {
|
|
|
|
|
|
+ if(GetVersion() <= 373) {
|
|
|
|
+ for(int32 s=0;s<20;s++) {
|
|
|
|
+ int32 slot = s;
|
|
|
|
+
|
|
|
|
+ char item_slot_name[64], item_slot_name_appearance[64];
|
|
|
|
+ _snprintf(item_slot_name,64,"slot_%u",slot);
|
|
|
|
+ Item* pw = player_to_inspect->GetEquipmentList()->GetItem(GetPlayer()->ConvertSlotFromClient(s, GetVersion()));
|
|
|
|
+ packet->setItemByName(item_slot_name, pw, this->GetPlayer(), 0, 7, true, true, true);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if(GetVersion() <= 561) {
|
|
for(int32 s=0;s<22;s++) {
|
|
for(int32 s=0;s<22;s++) {
|
|
int32 slot = s;
|
|
int32 slot = s;
|
|
|
|
|
|
@@ -10546,7 +10696,7 @@ void Client::DisplayCollectionComplete(Collection* collection) {
|
|
Item* item = reward_items->at(i)->item;
|
|
Item* item = reward_items->at(i)->item;
|
|
if (item) {
|
|
if (item) {
|
|
packet2->setArrayDataByName("reward_id", item->details.item_id, i);
|
|
packet2->setArrayDataByName("reward_id", item->details.item_id, i);
|
|
- packet2->setItemArrayDataByName("item", item, player, i, 0, -1);
|
|
|
|
|
|
+ packet2->setItemArrayDataByName("item", item, player, i, 0, GetClientItemPacketOffset());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -10557,7 +10707,7 @@ void Client::DisplayCollectionComplete(Collection* collection) {
|
|
Item* item = selectable_reward_items->at(i)->item;
|
|
Item* item = selectable_reward_items->at(i)->item;
|
|
if (item) {
|
|
if (item) {
|
|
packet2->setArrayDataByName("select_reward_id", item->details.item_id, i);
|
|
packet2->setArrayDataByName("select_reward_id", item->details.item_id, i);
|
|
- packet2->setItemArrayDataByName("select_item", item, player, i, 0, -1);
|
|
|
|
|
|
+ packet2->setItemArrayDataByName("select_item", item, player, i, 0, GetClientItemPacketOffset());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -10592,7 +10742,7 @@ void Client::DisplayCollectionComplete(Collection* collection) {
|
|
|
|
|
|
packet->setArrayDataByName("reward_id", reward_item->item->details.item_id, i);
|
|
packet->setArrayDataByName("reward_id", reward_item->item->details.item_id, i);
|
|
if (version < 860)
|
|
if (version < 860)
|
|
- packet->setItemArrayDataByName("item", reward_item->item, player, i, 0, -1);
|
|
|
|
|
|
+ packet->setItemArrayDataByName("item", reward_item->item, player, i, 0, GetClientItemPacketOffset());
|
|
else if (version < 1193)
|
|
else if (version < 1193)
|
|
packet->setItemArrayDataByName("item", reward_item->item, player, i);
|
|
packet->setItemArrayDataByName("item", reward_item->item, player, i);
|
|
else
|
|
else
|
|
@@ -10610,7 +10760,7 @@ void Client::DisplayCollectionComplete(Collection* collection) {
|
|
|
|
|
|
packet->setArrayDataByName("select_reward_id", reward_item->item->details.item_id, i);
|
|
packet->setArrayDataByName("select_reward_id", reward_item->item->details.item_id, i);
|
|
if (version < 860)
|
|
if (version < 860)
|
|
- packet->setItemArrayDataByName("select_item", reward_item->item, player, i, 0, -1);
|
|
|
|
|
|
+ packet->setItemArrayDataByName("select_item", reward_item->item, player, i, 0, GetClientItemPacketOffset());
|
|
else if (version < 1193)
|
|
else if (version < 1193)
|
|
packet->setItemArrayDataByName("select_item", reward_item->item, player, i);
|
|
packet->setItemArrayDataByName("select_item", reward_item->item, player, i);
|
|
else
|
|
else
|
|
@@ -11344,6 +11494,10 @@ void Client::SendSpawnChanges(set<Spawn*>& spawns) {
|
|
if (index == 0 || !GetPlayer()->WasSentSpawn(spawn->GetID()))
|
|
if (index == 0 || !GetPlayer()->WasSentSpawn(spawn->GetID()))
|
|
continue;
|
|
continue;
|
|
|
|
|
|
|
|
+ if(GetPlayer() == spawn && GetVersion() <= 284) { // stopped self client/player warping in the EQ2 release disc (Beta), don't send yourself in bulk spawn updates
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
int16 tmp_info_size = 0;
|
|
int16 tmp_info_size = 0;
|
|
int16 tmp_pos_size = 0;
|
|
int16 tmp_pos_size = 0;
|
|
int16 tmp_vis_size = 0;
|
|
int16 tmp_vis_size = 0;
|
|
@@ -11476,19 +11630,19 @@ void Client::MakeSpawnChangePacket(map<int32, SpawnData> info_changes, map<int32
|
|
opcode_val = EQOpcodeManager[GetOpcodeVersion(version)]->EmuToEQ(OP_EqUpdateGhostCmd);
|
|
opcode_val = EQOpcodeManager[GetOpcodeVersion(version)]->EmuToEQ(OP_EqUpdateGhostCmd);
|
|
}
|
|
}
|
|
int32 size = info_size + pos_size + vis_size + 8;
|
|
int32 size = info_size + pos_size + vis_size + 8;
|
|
- if (version > 283) //version 283 and below uses an overload for size, not always 4 bytes
|
|
|
|
- size += 3;
|
|
|
|
size += CheckOverLoadSize(info_size);
|
|
size += CheckOverLoadSize(info_size);
|
|
size += CheckOverLoadSize(pos_size);
|
|
size += CheckOverLoadSize(pos_size);
|
|
size += CheckOverLoadSize(vis_size);
|
|
size += CheckOverLoadSize(vis_size);
|
|
- if (version <= 283 && size >= 255) {//1 byte to 3 for overloaded val
|
|
|
|
|
|
+ if (version <= 373 && size >= 255) {//1 byte to 3 for overloaded val
|
|
size += 2;
|
|
size += 2;
|
|
}
|
|
}
|
|
|
|
+ else if (version >= 374)
|
|
|
|
+ size += 3;
|
|
uchar* tmp = new uchar[size];
|
|
uchar* tmp = new uchar[size];
|
|
uchar* ptr = tmp;
|
|
uchar* ptr = tmp;
|
|
|
|
|
|
memset(tmp, 0, size);
|
|
memset(tmp, 0, size);
|
|
- if (version <= 283) {
|
|
|
|
|
|
+ if (version <= 373) {
|
|
if (size >= 255) {
|
|
if (size >= 255) {
|
|
size -= 3;
|
|
size -= 3;
|
|
memcpy(ptr, &oversized, sizeof(int8));
|
|
memcpy(ptr, &oversized, sizeof(int8));
|
|
@@ -11779,6 +11933,7 @@ void Client::SendShowBook(Spawn* sender, string title, int8 language, int8 num_p
|
|
{
|
|
{
|
|
// release client
|
|
// release client
|
|
case 283:
|
|
case 283:
|
|
|
|
+ case 373: // trial isle client
|
|
{
|
|
{
|
|
endString.append(page);
|
|
endString.append(page);
|
|
break;
|
|
break;
|
|
@@ -11802,7 +11957,7 @@ void Client::SendShowBook(Spawn* sender, string title, int8 language, int8 num_p
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (GetVersion() == 283)
|
|
|
|
|
|
+ if (GetVersion() <= 373)
|
|
{
|
|
{
|
|
packet->setDataByName("page_text", endString.c_str());
|
|
packet->setDataByName("page_text", endString.c_str());
|
|
}
|
|
}
|
|
@@ -11848,6 +12003,7 @@ void Client::SendShowBook(Spawn* sender, string title, int8 language, vector<Ite
|
|
{
|
|
{
|
|
// release client
|
|
// release client
|
|
case 283:
|
|
case 283:
|
|
|
|
+ case 373: // trial isle client
|
|
{
|
|
{
|
|
endString.append(pageText);
|
|
endString.append(pageText);
|
|
break;
|
|
break;
|
|
@@ -12065,6 +12221,10 @@ void Client::ConsumeFoodDrink(Item* item, int32 slot)
|
|
else
|
|
else
|
|
Message(CHANNEL_NARRATIVE, "You drink a %s.", item->name.c_str());
|
|
Message(CHANNEL_NARRATIVE, "You drink a %s.", item->name.c_str());
|
|
}
|
|
}
|
|
|
|
+ else {
|
|
|
|
+ Message(CHANNEL_NARRATIVE, "SERVER BUG! Item Script not assigned for consuming '%s'.", item->name.c_str());
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
|
|
if (item->details.count > 1) {
|
|
if (item->details.count > 1) {
|
|
item->details.count -= 1;
|
|
item->details.count -= 1;
|
|
@@ -12077,6 +12237,10 @@ void Client::ConsumeFoodDrink(Item* item, int32 slot)
|
|
}
|
|
}
|
|
GetPlayer()->SetCharSheetChanged(true);
|
|
GetPlayer()->SetCharSheetChanged(true);
|
|
QueuePacket(player->GetEquipmentList()->serialize(GetVersion(), player));
|
|
QueuePacket(player->GetEquipmentList()->serialize(GetVersion(), player));
|
|
|
|
+ if(GetVersion() <= 373) {
|
|
|
|
+ EQ2Packet* outapp = GetPlayer()->SendInventoryUpdate(GetVersion());
|
|
|
|
+ QueuePacket(outapp);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -12466,6 +12630,30 @@ bool Client::CheckConsumptionAllowed(int16 slot, bool send_message) {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
default: {
|
|
default: {
|
|
|
|
+ if (GetVersion() <= 373) {
|
|
|
|
+ Item* item = GetPlayer()->item_list.GetItemFromIndex(slot);
|
|
|
|
+ if(item->IsFood()) {
|
|
|
|
+ if(item->IsFoodFood()) {
|
|
|
|
+ if(GetPlayer()->GetSpellEffectBySpellType(SPELL_TYPE_FOOD)) {
|
|
|
|
+ if(send_message) {
|
|
|
|
+ Message(CHANNEL_NARRATIVE, "If you ate anymore you would explode!");
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ else if(item->IsFoodDrink()) {
|
|
|
|
+ if (GetPlayer()->GetSpellEffectBySpellType(SPELL_TYPE_DRINK))
|
|
|
|
+ {
|
|
|
|
+ if(send_message) {
|
|
|
|
+ Message(CHANNEL_NARRATIVE, "If you drank anymore you would explode!");
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
return false;
|
|
return false;
|
|
break;
|
|
break;
|
|
}
|
|
}
|