diff --git a/changelog.txt b/changelog.txt index 54c7478a2..fe471b367 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,10 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 01/13/2015 == +Uleat: Placed an upper limit on the cursor queue save loop. +Trevius: (RoF2) Guild invites now add new members as members instead of recruits, and /guild chat works properly. +Trevius: (RoF2) Guild Promote is now functional. + == 01/12/2015 == Uleat: Fix for OP_FormattedMessage text link server crashes Uleat: Added text link translators for OP_TaskDescription (RoF+ -- all clients current) diff --git a/common/shareddb.cpp b/common/shareddb.cpp index 42aeebfea..b97d5a984 100644 --- a/common/shareddb.cpp +++ b/common/shareddb.cpp @@ -108,6 +108,7 @@ bool SharedDatabase::SaveCursor(uint32 char_id, std::list::const_iter int i = 8000; for(auto it = start; it != end; ++it, i++) { + if (i > 8999) { break; } // shouldn't be anything in the queue that indexes this high ItemInst *inst = *it; if (!SaveInventory(char_id,inst,(i == 8000) ? MainCursor : i)) return false; diff --git a/utils/patches/patch_RoF2.conf b/utils/patches/patch_RoF2.conf index 23bec152e..7159dcce5 100644 --- a/utils/patches/patch_RoF2.conf +++ b/utils/patches/patch_RoF2.conf @@ -126,7 +126,7 @@ OP_GuildLeader=0x7e09 OP_GuildDelete=0x3708 OP_GuildInviteAccept=0x7053 OP_GuildDemote=0x2d4e -OP_GuildPromote=0x0000 +OP_GuildPromote=0x6a98 OP_GuildPublicNote=0x5053 OP_GuildManageBanker=0x748f OP_GuildBank=0x5134 diff --git a/zone/client.cpp b/zone/client.cpp index adaa7ce2f..52bced4f4 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -2852,7 +2852,8 @@ void Client::Message_StringID(uint32 type, uint32 string_id, const char* message bufptr += strlen(message_arg[i]) + 1; } - bufptr = '\0'; + // since we're moving the pointer the 0 offset is correct + bufptr[0] = '\0'; if(distance>0) entity_list.QueueCloseClients(this,outapp,false,distance); @@ -2964,7 +2965,8 @@ void Client::FilteredMessage_StringID(Mob *sender, uint32 type, eqFilterType fil bufptr += strlen(message_arg[i]) + 1; } - bufptr = '\0'; + // since we're moving the pointer the 0 offset is correct + bufptr[0] = '\0'; QueuePacket(outapp); safe_delete(outapp); diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 8b82d84db..734d82de5 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -7489,7 +7489,7 @@ void Client::Handle_OP_GuildInviteAccept(const EQApplicationPacket *app) uint32 guildrank = gj->response; - if (GetClientVersion() == EQClientRoF) + if (GetClientVersion() >= EQClientRoF) { if (gj->response == 8) { @@ -7668,7 +7668,10 @@ void Client::Handle_OP_GuildPromote(const EQApplicationPacket *app) uint8 rank = gci.rank + 1; if (rank > GUILD_OFFICER) + { + Message(0, "You cannot promote someone to be guild leader. You must use /guildleader."); return; + } mlog(GUILDS__ACTIONS, "Promoting %s (%d) from rank %s (%d) to %s (%d) in %s (%d)", diff --git a/zone/command.cpp b/zone/command.cpp index 1a190cc28..dd4618c87 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -6654,7 +6654,7 @@ void command_npcedit(Client *c, const Seperator *sep) "SET luclin_haircolor = %i, luclin_beardcolor = %i, " "luclin_hairstyle = %i, luclin_beard = %i, " "face = %i, drakkin_heritage = %i, " - "drakkin_tattoo = %i, drakkin_details = %i, " + "drakkin_tattoo = %i, drakkin_details = %i " "WHERE id = %i", target->GetHairColor(), target->GetBeardColor(), target->GetHairStyle(), target->GetBeard(), diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 1f7083118..cb21073ca 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -3471,14 +3471,16 @@ void Mob::DoBuffTic(uint16 spell_id, int slot, uint32 ticsremaining, uint8 caste { effect_value = CalcSpellEffectValue(spell_id, i, caster_level, caster, ticsremaining); //Handle client cast DOTs here. - if (caster && effect_value < 0 && IsDetrimentalSpell(spell_id)){ + if (caster && effect_value < 0){ - if (caster->IsClient()){ - if (!caster->CastToClient()->GetFeigned()) + if (IsDetrimentalSpell(spell_id)){ + if (caster->IsClient()){ + if (!caster->CastToClient()->GetFeigned()) + AddToHateList(caster, -effect_value); + } + else if (!IsClient()) //Allow NPC's to generate hate if casted on other NPC's. AddToHateList(caster, -effect_value); } - else if (!IsClient()) //Allow NPC's to generate hate if casted on other NPC's. - AddToHateList(caster, -effect_value); effect_value = caster->GetActDoTDamage(spell_id, effect_value, this);