Fix - added language support for player chat. Additional log cleanup of unnecessary messages.

This commit is contained in:
Emagi 2022-07-17 16:17:59 -04:00
parent f52276b263
commit 966ada0771
17 changed files with 60 additions and 42 deletions

View file

@ -146,7 +146,7 @@ bool Bot::CanEquipItem(Item* item) {
void Bot::MessageGroup(string msg) {
GroupMemberInfo* gmi = GetGroupMemberInfo();
if (gmi)
world.GetGroupManager()->GroupChatMessage(gmi->group_id, this, msg.c_str());
world.GetGroupManager()->GroupChatMessage(gmi->group_id, this, 0, msg.c_str());
}
void Bot::GetNewSpells() {

View file

@ -143,7 +143,7 @@ bool ChatChannel::TellChannel(Client *client, const char *message, const char* n
packet_struct->setDataByName("to", to_client->GetPlayer()->GetName());
packet_struct->setDataByName("channel", to_client->GetMessageChannelColor(CHANNEL_CUSTOM_CHANNEL));
packet_struct->setDataByName("language", 0);
packet_struct->setDataByName("language", client->GetPlayer()->GetCurrentLanguage());
packet_struct->setDataByName("message", message);
packet_struct->setDataByName("channel_name", name);
packet_struct->setDataByName("show_bubble", 1);

View file

@ -2437,7 +2437,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
if (spawn->IsNPC())
show_bubble = false;
client->GetCurrentZone()->HandleChatMessage(client->GetPlayer(), 0, CHANNEL_SAY, tmp, HEAR_SPAWN_DISTANCE, 0, show_bubble);
client->GetCurrentZone()->HandleChatMessage(client->GetPlayer(), 0, CHANNEL_SAY, tmp, HEAR_SPAWN_DISTANCE, 0, show_bubble, client->GetPlayer()->GetCurrentLanguage());
if(spawn->IsPlayer() == false && spawn->Alive() && spawn->GetDistance(client->GetPlayer()) < rule_manager.GetGlobalRule(R_Spawn, HailDistance)->GetInt32()){
if(spawn->IsNPC() && ((NPC*)spawn)->EngagedInCombat())
spawn->GetZone()->CallSpawnScript(spawn, SPAWN_SCRIPT_HAILED_BUSY, client->GetPlayer());
@ -2460,13 +2460,13 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
}
else {
string tmp = "Hail";
client->GetCurrentZone()->HandleChatMessage(client->GetPlayer(), 0, CHANNEL_SAY, tmp.c_str(), HEAR_SPAWN_DISTANCE, 0, true);
client->GetCurrentZone()->HandleChatMessage(client->GetPlayer(), 0, CHANNEL_SAY, tmp.c_str(), HEAR_SPAWN_DISTANCE, 0, true, client->GetPlayer()->GetCurrentLanguage());
}
break;
}
case COMMAND_SAY:{
if (sep && sep->arg[0][0]) {
client->GetCurrentZone()->HandleChatMessage(client->GetPlayer(), 0, CHANNEL_SAY, sep->argplus[0], HEAR_SPAWN_DISTANCE);
client->GetCurrentZone()->HandleChatMessage(client->GetPlayer(), 0, CHANNEL_SAY, sep->argplus[0], HEAR_SPAWN_DISTANCE, 0, true, client->GetPlayer()->GetCurrentLanguage());
if (cmdTarget && !(cmdTarget->IsPlayer()))
client->GetCurrentZone()->CallSpawnScript(cmdTarget, SPAWN_SCRIPT_HEAR_SAY, client->GetPlayer(), sep->argplus[0]);
}
@ -2476,7 +2476,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
}
case COMMAND_TELL:{
if(sep && sep->arg[0] && sep->argplus[1]){
if(!zone_list.HandleGlobalChatMessage(client, sep->arg[0], CHANNEL_PRIVATE_TELL, sep->argplus[1]))
if(!zone_list.HandleGlobalChatMessage(client, sep->arg[0], CHANNEL_PRIVATE_TELL, sep->argplus[1], 0, client->GetPlayer()->GetCurrentLanguage()))
client->Message(CHANNEL_COLOR_RED,"Unable to find client %s",sep->arg[0]);
}else
client->SimpleMessage(CHANNEL_COLOR_YELLOW,"Usage: /tell {character_name} {message}");
@ -2484,14 +2484,14 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
}
case COMMAND_SHOUT:{
if(sep && sep->arg[0][0])
client->GetCurrentZone()->HandleChatMessage(client->GetPlayer(), 0, CHANNEL_SHOUT, sep->argplus[0]);
client->GetCurrentZone()->HandleChatMessage(client->GetPlayer(), 0, CHANNEL_SHOUT, sep->argplus[0], 0, 0, true, client->GetPlayer()->GetCurrentLanguage());
else
client->SimpleMessage(CHANNEL_COLOR_YELLOW,"Usage: /shout {message}");
break;
}
case COMMAND_AUCTION:{
if(sep && sep->arg[0][0])
client->GetCurrentZone()->HandleChatMessage(client->GetPlayer(), 0, CHANNEL_AUCTION, sep->argplus[0]);
client->GetCurrentZone()->HandleChatMessage(client->GetPlayer(), 0, CHANNEL_AUCTION, sep->argplus[0], 0, 0, true, client->GetPlayer()->GetCurrentLanguage());
else
client->SimpleMessage(CHANNEL_COLOR_YELLOW,"Usage: /auction {message}");
break;
@ -2499,7 +2499,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
case COMMAND_OOC:{
//For now ooc will be the global chat channel, eventually when we create more channels we will create a global chat channel
if(sep && sep->arg[0][0])
zone_list.HandleGlobalChatMessage(client, 0, CHANNEL_OUT_OF_CHARACTER, sep->argplus[0]);
zone_list.HandleGlobalChatMessage(client, 0, CHANNEL_OUT_OF_CHARACTER, sep->argplus[0], 0, client->GetPlayer()->GetCurrentLanguage());
else
client->SimpleMessage(CHANNEL_COLOR_YELLOW,"Usage: /ooc {message}");
break;
@ -3056,7 +3056,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
case COMMAND_GROUPSAY:{
GroupMemberInfo* gmi = client->GetPlayer()->GetGroupMemberInfo();
if(sep && sep->arg[0] && gmi)
world.GetGroupManager()->GroupChatMessage(gmi->group_id, client->GetPlayer(), sep->argplus[0]);
world.GetGroupManager()->GroupChatMessage(gmi->group_id, client->GetPlayer(), client->GetPlayer()->GetCurrentLanguage(), sep->argplus[0]);
break;
}
case COMMAND_GROUPINVITE: {

View file

@ -1236,7 +1236,6 @@ void Entity::CalculateBonuses(){
info->set_block(info->get_block_base());
info->set_cur_attack(info->get_attack_base());
info->set_cur_mitigation(info->get_mitigation_base());
info->set_base_avoidance_pct(info->get_avoidance_base());
info->set_disease(info->get_disease_base());
@ -1288,6 +1287,8 @@ void Entity::CalculateBonuses(){
ItemStatsValues* values = equipment_list.CalculateEquipmentBonuses(this);
CalculateSpellBonuses(values);
info->set_cur_mitigation(info->get_mitigation_base());
info->add_sta((float)values->sta);
info->add_str((float)values->str);
info->add_agi((float)values->agi);

View file

@ -2211,7 +2211,7 @@ void Guild::HandleGuildSay(Client* sender, const char* message) {
continue;
if (permissions.Get(itr->second->rank)->Get(GUILD_PERMISSIONS_SEE_GUILD_CHAT))
client->GetCurrentZone()->HandleChatMessage(client, sender->GetPlayer(), client->GetPlayer()->GetName(), CHANNEL_GUILD_SAY, message, 0, 0, false);
client->GetCurrentZone()->HandleChatMessage(client, sender->GetPlayer(), client->GetPlayer()->GetName(), CHANNEL_GUILD_SAY, message, 0, 0, false, sender->GetPlayer()->GetCurrentLanguage());
}
mMembers.releasereadlock(__FUNCTION__, __LINE__);
LogWrite(GUILD__DEBUG, 0, "Guilds", "Guild Say");
@ -2240,7 +2240,7 @@ void Guild::HandleOfficerSay(Client* sender, const char* message) {
continue;
if (permissions.Get(itr->second->rank)->Get(GUILD_PERMISSIONS_SEE_OFFICER_CHAT))
client->GetCurrentZone()->HandleChatMessage(client, sender->GetPlayer(), client->GetPlayer()->GetName(), CHANNEL_OFFICER_SAY, message, 0, 0, false);
client->GetCurrentZone()->HandleChatMessage(client, sender->GetPlayer(), client->GetPlayer()->GetName(), CHANNEL_OFFICER_SAY, message, 0, 0, false, sender->GetPlayer()->GetCurrentLanguage());
}
mMembers.releasereadlock(__FUNCTION__, __LINE__);
LogWrite(GUILD__DEBUG, 0, "Guilds", "Officer Say");

View file

@ -1240,15 +1240,16 @@ int EQ2Emu_lua_Say(lua_State* state) {
Spawn* spawn = lua_interface->GetSpawn(state);
string message = lua_interface->GetStringValue(state, 2);
Spawn* player = lua_interface->GetSpawn(state, 3);
int32 language = lua_interface->GetInt32Value(state, 4);
float dist = lua_interface->GetFloatValue(state, 4);
int32 language = lua_interface->GetInt32Value(state, 5);
if (spawn && message.length() > 0) {
Client* client = 0;
if (player && player->IsPlayer())
client = spawn->GetZone()->GetClientBySpawn(player);
if (client)
spawn->GetZone()->HandleChatMessage(client, spawn, 0, CHANNEL_SAY, message.c_str(), 30, 0, true, language);
spawn->GetZone()->HandleChatMessage(client, spawn, 0, CHANNEL_SAY, message.c_str(), (dist > 0.0f) ? dist : 30.0f, 0, true, language);
else
spawn->GetZone()->HandleChatMessage(spawn, 0, CHANNEL_SAY, message.c_str(), 30, 0, true, language);
spawn->GetZone()->HandleChatMessage(spawn, 0, CHANNEL_SAY, message.c_str(), (dist > 0.0f) ? dist : 30.0f, 0, true, language);
}
lua_interface->ResetFunctionStack(state);
return 0;
@ -1261,14 +1262,15 @@ int EQ2Emu_lua_Shout(lua_State* state) {
string message = lua_interface->GetStringValue(state, 2);
Spawn* player = lua_interface->GetSpawn(state, 3);
float dist = lua_interface->GetFloatValue(state, 4);
int32 language = lua_interface->GetInt32Value(state, 5);
if (spawn && message.length() > 0) {
Client* client = 0;
if (player && player->IsPlayer())
client = spawn->GetZone()->GetClientBySpawn(player);
if (client)
spawn->GetZone()->HandleChatMessage(client, spawn, 0, CHANNEL_SHOUT, message.c_str(), (dist > 0.0f) ? dist : 30.0f);
spawn->GetZone()->HandleChatMessage(client, spawn, 0, CHANNEL_SHOUT, message.c_str(), (dist > 0.0f) ? dist : 30.0f, 0, true, language);
else
spawn->GetZone()->HandleChatMessage(spawn, 0, CHANNEL_SHOUT, message.c_str(), (dist > 0.0f) ? dist : 30.0f);
spawn->GetZone()->HandleChatMessage(spawn, 0, CHANNEL_SHOUT, message.c_str(), (dist > 0.0f) ? dist : 30.0f, 0, true, language);
}
lua_interface->ResetFunctionStack(state);
return 0;
@ -1280,14 +1282,16 @@ int EQ2Emu_lua_SayOOC(lua_State* state) {
Spawn* spawn = lua_interface->GetSpawn(state);
string message = lua_interface->GetStringValue(state, 2);
Spawn* player = lua_interface->GetSpawn(state, 3);
float dist = lua_interface->GetFloatValue(state, 4);
int32 language = lua_interface->GetInt32Value(state, 5);
if (spawn && message.length() > 0) {
Client* client = 0;
if (player && player->IsPlayer())
client = spawn->GetZone()->GetClientBySpawn(player);
if (client)
spawn->GetZone()->HandleChatMessage(client, spawn, 0, CHANNEL_OUT_OF_CHARACTER, message.c_str(), 30);
spawn->GetZone()->HandleChatMessage(client, spawn, 0, CHANNEL_OUT_OF_CHARACTER, message.c_str(), (dist > 0.0f) ? dist : 30.0f, 0, true, language);
else
spawn->GetZone()->HandleChatMessage(spawn, 0, CHANNEL_OUT_OF_CHARACTER, message.c_str(), 30);
spawn->GetZone()->HandleChatMessage(spawn, 0, CHANNEL_OUT_OF_CHARACTER, message.c_str(), (dist > 0.0f) ? dist : 30.0f, 0, true, language);
}
lua_interface->ResetFunctionStack(state);
return 0;

View file

@ -123,6 +123,7 @@ Player::Player(){
SetSaveSpellEffects(true);
reset_mentorship = false;
all_spells_locked = false;
current_language_id = 0;
}
Player::~Player(){
SetSaveSpellEffects(true);

View file

@ -1047,6 +1047,10 @@ public:
int16 MatchGMVisualFilter(int32 filter_type, int32 filter_value, char* filter_search_str, bool in_vismutex_lock = false);
void ClearGMVisualFilters();
int GetPVPAlignment();
int32 GetCurrentLanguage() { return current_language_id; }
void SetCurrentLanguage(int32 language_id) { current_language_id = language_id; }
Mutex MPlayerQuests;
float pos_packet_speed;
private:
@ -1179,6 +1183,8 @@ private:
Timer lift_cooldown;
vector<GMTagFilter> gm_visual_filters;
int32 current_language_id;
};
#pragma pack()
#endif

View file

@ -163,13 +163,13 @@ void PlayerGroup::SimpleGroupMessage(const char* message) {
MGroupMembers.releasereadlock(__FUNCTION__, __LINE__);
}
void PlayerGroup::GroupChatMessage(Spawn* from, const char* message) {
void PlayerGroup::GroupChatMessage(Spawn* from, int32 language, const char* message) {
deque<GroupMemberInfo*>::iterator itr;
MGroupMembers.readlock(__FUNCTION__, __LINE__);
for(itr = m_members.begin(); itr != m_members.end(); itr++) {
GroupMemberInfo* info = *itr;
if(info && info->client && info->client->GetCurrentZone())
info->client->GetCurrentZone()->HandleChatMessage(info->client, from, 0, CHANNEL_GROUP_SAY, message, 0);
info->client->GetCurrentZone()->HandleChatMessage(info->client, from, 0, CHANNEL_GROUP_SAY, message, 0, 0, true, language);
}
MGroupMembers.releasereadlock(__FUNCTION__, __LINE__);
}
@ -595,11 +595,11 @@ void PlayerGroupManager::GroupMessage(int32 group_id, const char* message, ...)
SimpleGroupMessage(group_id, buffer);
}
void PlayerGroupManager::GroupChatMessage(int32 group_id, Spawn* from, const char* message) {
void PlayerGroupManager::GroupChatMessage(int32 group_id, Spawn* from, int32 language, const char* message) {
MGroups.readlock(__FUNCTION__, __LINE__);
if (m_groups.count(group_id) > 0)
m_groups[group_id]->GroupChatMessage(from, message);
m_groups[group_id]->GroupChatMessage(from, language, message);
MGroups.releasereadlock(__FUNCTION__, __LINE__);
}

View file

@ -81,7 +81,7 @@ public:
void SimpleGroupMessage(const char* message);
void GroupChatMessage(Spawn* from, const char* message);
void GroupChatMessage(Spawn* from, int32 language, const char* message);
void MakeLeader(Entity* new_leader);
void RemoveClientReference(Client* remove);
@ -170,7 +170,7 @@ public:
void SimpleGroupMessage(int32 group_id, const char* message);
void GroupMessage(int32 group_id, const char* message, ...);
void GroupChatMessage(int32 group_id, Spawn* from, const char* message);
void GroupChatMessage(int32 group_id, Spawn* from, int32 language, const char* message);
void MakeLeader(int32 group_id, Entity* new_leader);
void UpdateGroupBuffs();

View file

@ -437,7 +437,7 @@ void ZoneList::CheckFriendZoned(Client* client){
MClientList.unlock();
}
bool ZoneList::HandleGlobalChatMessage(Client* from, char* to, int16 channel, const char* message, const char* channel_name){
bool ZoneList::HandleGlobalChatMessage(Client* from, char* to, int16 channel, const char* message, const char* channel_name, int32 current_language_id){
if (!from) {
LogWrite(WORLD__ERROR, 0, "World", "HandleGlobalChatMessage() called with an invalid client");
return false;
@ -453,11 +453,11 @@ bool ZoneList::HandleGlobalChatMessage(Client* from, char* to, int16 channel, co
else
{
const char* whoto = find_client->GetPlayer()->GetName();
find_client->HandleTellMessage(from, message, whoto);
from->HandleTellMessage(from, message, whoto);
find_client->HandleTellMessage(from, message, whoto, from->GetPlayer()->GetCurrentLanguage());
from->HandleTellMessage(from, message, whoto, from->GetPlayer()->GetCurrentLanguage());
if (find_client->GetPlayer()->get_character_flag(CF_AFK)) {
find_client->HandleTellMessage(find_client, find_client->GetPlayer()->GetAwayMessage().c_str(),whoto);
from->HandleTellMessage(find_client, find_client->GetPlayer()->GetAwayMessage().c_str(),whoto);
find_client->HandleTellMessage(find_client, find_client->GetPlayer()->GetAwayMessage().c_str(),whoto, from->GetPlayer()->GetCurrentLanguage());
from->HandleTellMessage(find_client, find_client->GetPlayer()->GetAwayMessage().c_str(),whoto, from->GetPlayer()->GetCurrentLanguage());
}
}
}
@ -474,7 +474,7 @@ bool ZoneList::HandleGlobalChatMessage(Client* from, char* to, int16 channel, co
for(zone_iter=zlist.begin(); zone_iter!=zlist.end();zone_iter++){
zs = *zone_iter;
if(zs)
zs->HandleChatMessage(from->GetPlayer(), to, channel, message, 0, channel_name);
zs->HandleChatMessage(from->GetPlayer(), to, channel, message, 0, channel_name, true, current_language_id);
}
MZoneList.releasereadlock(__FUNCTION__, __LINE__);
}

View file

@ -424,7 +424,7 @@ class ZoneList {
void CheckFriendZoned(Client* client);
// move to Chat/Chat.h?
bool HandleGlobalChatMessage(Client* from, char* to, int16 channel, const char* message, const char* channel_name = 0);
bool HandleGlobalChatMessage(Client* from, char* to, int16 channel, const char* message, const char* channel_name = 0, int32 current_language_id = 0);
void HandleGlobalBroadcast(const char* message);
void HandleGlobalAnnouncement(const char* message);
//

View file

@ -1709,6 +1709,8 @@ bool WorldDatabase::LoadCharacterStats(int32 id, int32 account_id, Client* clien
client->GetPlayer()->SetDissonance(result.GetSInt16Str("dissonance"));
client->GetPlayer()->SetTotalSavageryBase(client->GetPlayer()->GetTotalSavagery());
client->GetPlayer()->SetTotalDissonanceBase(client->GetPlayer()->GetTotalDissonance());
client->GetPlayer()->SetCurrentLanguage(result.GetInt32Str("current_language"));
}
return true;

View file

@ -3682,7 +3682,7 @@ int8 Client::GetMessageChannelColor(int8 channel_type) {
return channel_type;
}
void Client::HandleTellMessage(Client* from, const char* message, const char* to=NULL) {
void Client::HandleTellMessage(Client* from, const char* message, const char* to, int32 current_language_id) {
if (!from || GetPlayer()->IsIgnored(from->GetPlayer()->GetName()))
return;
PacketStruct* packet = configReader.getStruct("WS_HearChat", GetVersion());
@ -3694,8 +3694,13 @@ void Client::HandleTellMessage(Client* from, const char* message, const char* to
packet->setDataByName("to_spawn_id", 0xFFFFFFFF);
packet->setDataByName("unknown2", 1, 1);
packet->setDataByName("show_bubble", 1);
packet->setDataByName("understood", 1);
if (current_language_id == 0 || GetPlayer()->HasLanguage(current_language_id)) {
packet->setDataByName("understood", 1);
}
packet->setDataByName("time", 2);
packet->setDataByName("language", current_language_id);
packet->setMediumStringByName("message", message);
EQ2Packet* outpacket = packet->serialize();
QueuePacket(outpacket);
@ -9732,6 +9737,7 @@ void Client::SendLanguagesUpdate(int32 id) {
list<Language*>::iterator itr;
Language* language;
int32 i = 0;
GetPlayer()->SetCurrentLanguage(id);
PacketStruct* packet = configReader.getStruct("WS_Languages", GetVersion());
if (packet) {
packet->setArrayLengthByName("num_languages", languages->size());

View file

@ -159,7 +159,7 @@ public:
void QueuePacket(EQ2Packet* app, bool attemptedCombine=false);
void SendLoginInfo();
int8 GetMessageChannelColor(int8 channel_type);
void HandleTellMessage(Client* from, const char* message, const char* to);
void HandleTellMessage(Client* from, const char* message, const char* to, int32 current_language_id);
void SimpleMessage(int8 color, const char* message);
void Message(int8 type, const char* message, ...);
void SendSpellUpdate(Spell* spell, bool add_silently = false, bool add_to_hotbar = true);

View file

@ -999,8 +999,6 @@ void ZoneServer::RemoveDeadEnemyList(Spawn *spawn)
vector<int32> *spawns;
vector<int32>::iterator itr;
LogWrite(ZONE__DEBUG, 7, "Zone", "Processing RemoveDeadEnemyList...");
m_npc_faction_list.writelock(__FUNCTION__, __LINE__);
if (npc_faction_list.count(faction_id) > 0) {
spawns = npc_faction_list[faction_id];
@ -3391,7 +3389,9 @@ void ZoneServer::HandleChatMessage(Client* client, Spawn* from, const char* to,
packet->setMediumStringByName("message", message);
packet->setDataByName("language", language);
if (language > 0 && !client->GetPlayer()->HasLanguage(language))
bool hasLanguage = client->GetPlayer()->HasLanguage(language);
printf("Client: %s has %u language: %u\n", client->GetPlayer()->GetName(), language, hasLanguage);
if (language > 0 && !hasLanguage)
packet->setDataByName("understood", 0);
else
packet->setDataByName("understood", 1);
@ -6018,8 +6018,7 @@ void ZoneServer::ProcessEntityCommand(EntityCommand* entity_command, Entity* cas
void ZoneServer::RemoveSpawnSupportFunctions(Spawn* spawn, bool lock_spell_process) {
if(!spawn)
return;
LogWrite(ZONE__DEBUG, 7, "Zone", "Processing RemoveSpawnSupportFunctions...");
if(spawn->IsPlayer() && spawn->GetZone())
spawn->GetZone()->RemovePlayerPassenger(((Player*)spawn)->GetCharacterID());
if(spawn->IsEntity())

View file

@ -2401,7 +2401,6 @@ void PacketStruct::PrintPacket() {
break;
}
case DATA_STRUCT_ITEM: {
printf("EQ2_Item %s\tIsSet: %u", ds->GetName(), ds->IsSet());
if (ds->GetItemSize() > 0) {
DumpPacket((uchar*)GetStructPointer(ds), ds->GetItemSize());
}