diff --git a/changelog.txt b/changelog.txt index 1bcc628f1..09cd52d88 100644 --- a/changelog.txt +++ b/changelog.txt @@ -18,6 +18,13 @@ Notes: - Wearable equipment types still register as valid light sources when in general slots (needs exemption criteria) == 02/23/2015 == +Noudess: Allow for a rule to set starting swimming && SenseHeading value. +I moved the swimming override to char create instead of setting it +every time a char enters a zone. + +Also added rules to not ignore, but rather forrce sense heading packets to be +used to train it instead of maxing it out like before. + Uleat: Fix for RoF+ clients showing active 'Return Home' button when action is not available (swapped 'GoHome' and 'Enabled' fields in RoF-era CharacterSelectEntry structs) == 02/21/2015 == diff --git a/common/ruletypes.h b/common/ruletypes.h index 12a8a0737..7894c5ebd 100644 --- a/common/ruletypes.h +++ b/common/ruletypes.h @@ -133,6 +133,9 @@ RULE_INT ( Skills, MaxTrainTradeskills, 21 ) RULE_BOOL ( Skills, UseLimitTradeskillSearchSkillDiff, true ) RULE_INT ( Skills, MaxTradeskillSearchSkillDiff, 50 ) RULE_INT ( Skills, MaxTrainSpecializations, 50 ) // Max level a GM trainer will train casting specializations +RULE_INT ( Skills, SwimmingStartValue, 100 ) +RULE_BOOL ( Skills, TrainSenseHeading, false ) +RULE_INT ( Skills, SenseHeadingStartValue, 200 ) RULE_CATEGORY_END() RULE_CATEGORY( Pets ) diff --git a/world/client.cpp b/world/client.cpp index 34a404673..26a69222b 100644 --- a/world/client.cpp +++ b/world/client.cpp @@ -1430,7 +1430,10 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) SetRaceStartingSkills(&pp); SetClassStartingSkills(&pp); SetClassLanguages(&pp); - pp.skills[SkillSenseHeading] = 200; + + pp.skills[SkillSwimming] = RuleI(Skills, SwimmingStartValue); + pp.skills[SkillSenseHeading] = RuleI(Skills, SenseHeadingStartValue); + // strcpy(pp.servername, WorldConfig::get()->ShortName.c_str()); diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 84d34d4c3..1bf44e3ee 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -332,7 +332,13 @@ void MapOpcodes() ConnectedOpcodes[OP_Save] = &Client::Handle_OP_Save; ConnectedOpcodes[OP_SaveOnZoneReq] = &Client::Handle_OP_SaveOnZoneReq; ConnectedOpcodes[OP_SelectTribute] = &Client::Handle_OP_SelectTribute; - ConnectedOpcodes[OP_SenseHeading] = &Client::Handle_OP_Ignore; + + // Use or Ignore sense heading based on rule. + bool train=RuleB(Skills, TrainSenseHeading); + + ConnectedOpcodes[OP_SenseHeading] = + (train) ? &Client::Handle_OP_SenseHeading : &Client::Handle_OP_Ignore; + ConnectedOpcodes[OP_SenseTraps] = &Client::Handle_OP_SenseTraps; ConnectedOpcodes[OP_SetGuildMOTD] = &Client::Handle_OP_SetGuildMOTD; ConnectedOpcodes[OP_SetRunMode] = &Client::Handle_OP_SetRunMode; @@ -1431,10 +1437,6 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) if (m_pp.ldon_points_tak < 0 || m_pp.ldon_points_tak > 2000000000){ m_pp.ldon_points_tak = 0; } if (m_pp.ldon_points_available < 0 || m_pp.ldon_points_available > 2000000000){ m_pp.ldon_points_available = 0; } - /* Set Swimming Skill 100 by default if under 100 */ - if (GetSkill(SkillSwimming) < 100) - SetSkill(SkillSwimming, 100); - /* Initialize AA's : Move to function eventually */ for (uint32 a = 0; a < MAX_PP_AA_ARRAY; a++){ aa[a] = &m_pp.aa_array[a]; } query = StringFormat( @@ -11653,6 +11655,27 @@ void Client::Handle_OP_SelectTribute(const EQApplicationPacket *app) return; } +void Client::Handle_OP_SenseHeading(const EQApplicationPacket *app) +{ + if (!HasSkill(SkillSenseHeading)) + return; + + int chancemod=0; + + // The client seems to limit sense heading packets based on skill + // level. So if we're really low, we don't hit this routine very often. + // I think it's the GUI deciding when to skill you up. + // So, I'm adding a mod here which is larger at lower levels so + // very low levels get a much better chance to skill up when the GUI + // eventually sends a message. + if (GetLevel() <= 8) + chancemod += (9-level) * 10; + + CheckIncreaseSkill(SkillSenseHeading, nullptr, chancemod); + + return; +} + void Client::Handle_OP_SenseTraps(const EQApplicationPacket *app) { if (!HasSkill(SkillSenseTraps)) diff --git a/zone/command.cpp b/zone/command.cpp index 612228fde..b383e09b3 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -28,7 +28,7 @@ set to nullptr and 0 respectively since they aren't used when adding an alias. The function pointers being equal is makes it an alias. The access level you set with command_add is only a default if - the command isn't listed in the addon.ini file. + the command isn't listed in the commands db table. */